/*
 * @file libop/op_netburst.h
 * Definitions of structures and methods for handling Intel Netburst events.
 *
 * @remark Copyright 2013 OProfile authors
 * @remark Read the file COPYING
 *
 * Created on: May 14, 2013
 * @author Maynard Johnson
 * (C) Copyright IBM Corp. 2013
 *
 * NOTE:  The code in this file was largely borrowed from a libpfm file,
 * so we include below the Copyright and licensing information from that file.
 */
/*
 * Copyright (c) 2006 IBM Corp.
 * Contributed by Kevin Corry <kevcorry@us.ibm.com>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 *
 * pfmlib_netburst_priv.h
 *
 * Structures and definitions for use in the Pentium4/Xeon/EM64T libpfm code.
 */

#ifndef OP_NETBURST_H_
#define OP_NETBURST_H_

#ifdef __cplusplus
extern "C" {
#endif

/* ESCR: Event Selection Control Register
 *
 * These registers are used to select which event to count along with options
 * for that event. There are (up to) 45 ESCRs, but each data counter is
 * restricted to a specific set of ESCRs.
 */

/**
 * netburst_escr_value_t
 *
 * Bit-wise breakdown of the ESCR registers.
 *
 *    Bits     Description
 *   -------   -----------
 *   63 - 31   Reserved
 *   30 - 25   Event Select
 *   24 - 9    Event Mask
 *    8 - 5    Tag Value
 *      4      Tag Enable
 *      3      T0 OS - Enable counting in kernel mode (thread 0)
 *      2      T0 USR - Enable counting in user mode (thread 0)
 *      1      T1 OS - Enable counting in kernel mode (thread 1)
 *      0      T1 USR - Enable counting in user mode (thread 1)
 **/

#define EVENT_MASK_BITS 16
#define EVENT_SELECT_BITS 6

typedef union {
	unsigned long long val;
	struct {
		unsigned long t1_usr:1;
		unsigned long t1_os:1;
		unsigned long t0_usr:1;
		unsigned long t0_os:1;
		unsigned long tag_enable:1;
		unsigned long tag_value:4;
		unsigned long event_mask:EVENT_MASK_BITS;
		unsigned long event_select:EVENT_SELECT_BITS;
		unsigned long reserved:1;
	} bits;
} netburst_escr_value_t;

/* CCCR: Counter Configuration Control Register
 *
 * These registers are used to configure the data counters. There are 18
 * CCCRs, one for each data counter.
 */

/**
 * netburst_cccr_value_t
 *
 * Bit-wise breakdown of the CCCR registers.
 *
 *    Bits     Description
 *   -------   -----------
 *   63 - 32   Reserved
 *     31      OVF - The data counter overflowed.
 *     30      Cascade - Enable cascading of data counter when alternate
 *             counter overflows.
 *   29 - 28   Reserved
 *     27      OVF_PMI_T1 - Generate interrupt for LP1 on counter overflow
 *     26      OVF_PMI_T0 - Generate interrupt for LP0 on counter overflow
 *     25      FORCE_OVF - Force interrupt on every counter increment
 *     24      Edge - Enable rising edge detection of the threshold comparison
 *             output for filtering event counts.
 *   23 - 20   Threshold Value - Select the threshold value for comparing to
 *             incoming event counts.
 *     19      Complement - Select how incoming event count is compared with
 *             the threshold value.
 *     18      Compare - Enable filtering of event counts.
 *   17 - 16   Active Thread - Only used with HT enabled.
 *             00 - None: Count when neither LP is active.
 *             01 - Single: Count when only one LP is active.
 *             10 - Both: Count when both LPs are active.
 *             11 - Any: Count when either LP is active.
 *   15 - 13   ESCR Select - Select which ESCR to use for selecting the
 *             event to count.
 *     12      Enable - Turns the data counter on or off.
 *   11 - 0    Reserved
 **/
typedef union {
	unsigned long long val;
	struct {
		unsigned long reserved1:12;
		unsigned long enable:1;
		unsigned long escr_select:3;
		unsigned long active_thread:2;
		unsigned long compare:1;
		unsigned long complement:1;
		unsigned long threshold:4;
		unsigned long edge:1;
		unsigned long force_ovf:1;
		unsigned long ovf_pmi_t0:1;
		unsigned long ovf_pmi_t1:1;
		unsigned long reserved2:2;
		unsigned long cascade:1;
		unsigned long overflow:1;
	} bits;
} netburst_cccr_value_t;

/**
 * netburst_event_mask_t
 *
 * Defines one bit of the event-mask for one Pentium4 event.
 *
 * @name: Event mask name
 * @desc: Event mask description
 * @bit: The bit position within the event_mask field.
 **/
typedef struct {
	char *name;
	char *desc;
	unsigned int bit;
	unsigned int flags;
} netburst_event_mask_t;
/*
 * netburst_event_mask_t->flags
 */
#define NETBURST_FL_DFL	0x1 /* event mask is default */

#define MAX_ESCRS_PER_EVENT 2

/*
 * These are the unique event codes used by perf_events.
 * They need to be encoded in the ESCR.event_select field when
 * programming for perf_events.
 * NOTE: Only 36 of the events specified below have counterparts
 * in oprofile's p4 event list
 */
enum netburst_event_code {
	P4_EVENT_TC_DELIVER_MODE,
	P4_EVENT_BPU_FETCH_REQUEST,
	P4_EVENT_ITLB_REFERENCE,
	P4_EVENT_MEMORY_CANCEL,
	P4_EVENT_MEMORY_COMPLETE,
	P4_EVENT_LOAD_PORT_REPLAY,
	P4_EVENT_STORE_PORT_REPLAY,
	P4_EVENT_MOB_LOAD_REPLAY,
	P4_EVENT_PAGE_WALK_TYPE,
	P4_EVENT_BSQ_CACHE_REFERENCE,
	P4_EVENT_IOQ_ALLOCATION,
	P4_EVENT_IOQ_ACTIVE_ENTRIES,
	P4_EVENT_FSB_DATA_ACTIVITY,
	P4_EVENT_BSQ_ALLOCATION,
	P4_EVENT_BSQ_ACTIVE_ENTRIES,
	P4_EVENT_SSE_INPUT_ASSIST,
	P4_EVENT_PACKED_SP_UOP,
	P4_EVENT_PACKED_DP_UOP,
	P4_EVENT_SCALAR_SP_UOP,
	P4_EVENT_SCALAR_DP_UOP,
	P4_EVENT_64BIT_MMX_UOP,
	P4_EVENT_128BIT_MMX_UOP,
	P4_EVENT_X87_FP_UOP,
	P4_EVENT_TC_MISC,
	P4_EVENT_GLOBAL_POWER_EVENTS,
	P4_EVENT_TC_MS_XFER,
	P4_EVENT_UOP_QUEUE_WRITES,
	P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE,
	P4_EVENT_RETIRED_BRANCH_TYPE,
	P4_EVENT_RESOURCE_STALL,
	P4_EVENT_WC_BUFFER,
	P4_EVENT_B2B_CYCLES,
	P4_EVENT_BNR,
	P4_EVENT_SNOOP,
	P4_EVENT_RESPONSE,
	P4_EVENT_FRONT_END_EVENT,
	P4_EVENT_EXECUTION_EVENT,
	P4_EVENT_REPLAY_EVENT,
	P4_EVENT_INSTR_RETIRED,
	P4_EVENT_UOPS_RETIRED,
	P4_EVENT_UOP_TYPE,
	P4_EVENT_BRANCH_RETIRED,
	P4_EVENT_MISPRED_BRANCH_RETIRED,
	P4_EVENT_X87_ASSIST,
	P4_EVENT_MACHINE_CLEAR,
	P4_EVENT_INSTR_COMPLETED,
};

typedef struct {
	char *name;
	char *desc;
	unsigned int event_select;
	unsigned int escr_select;
	enum netburst_event_code perf_code;	/* perf_event event code, enum P4_EVENTS */
	int allowed_escrs[MAX_ESCRS_PER_EVENT];
	netburst_event_mask_t event_masks[EVENT_MASK_BITS];
} netburst_entry_t;

#define NETBURST_ATTR_U	0
#define NETBURST_ATTR_K	1
#define NETBURST_ATTR_C	2
#define NETBURST_ATTR_E	3
#define NETBURST_ATTR_T	4

#define _NETBURST_ATTR_U (1 << NETBURST_ATTR_U)
#define _NETBURST_ATTR_K (1 << NETBURST_ATTR_K)

#define P4_REPLAY_REAL_MASK 0x00000003

int op_netburst_get_perf_encoding(const char * evt_name, unsigned long evt_um, int do_kernel,
                                  int do_user, u64 * config);

#ifdef __cplusplus
}
#endif

#endif // OP_NETBURST_H_
