| /* | 
 |  * 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 _PFMLIB_INTEL_NETBURST_PRIV_H_ | 
 | #define _PFMLIB_INTEL_NETBURST_PRIV_H_ | 
 |  | 
 | /* 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 { | 
 | 	const char *name; | 
 | 	const 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. | 
 |  * The need to be encoded in the ESCR.event_select field when | 
 |  * programming for perf_events | 
 |  */ | 
 | enum netburst_events { | 
 | 	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 { | 
 | 	const char *name; | 
 | 	const char *desc; | 
 | 	unsigned int event_select; | 
 | 	unsigned int escr_select; | 
 | 	enum netburst_events 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 | 
 |  | 
 | extern int pfm_netburst_get_encoding(void *this, pfmlib_event_desc_t *e); | 
 | extern int pfm_netburst_get_perf_encoding(void *this, pfmlib_event_desc_t *e); | 
 | extern void pfm_netburst_perf_validate_pattrs(void *this, pfmlib_event_desc_t *e); | 
 |  | 
 | #endif |