Blame src/libpfm-3.y/include/perfmon/pfmlib_intel_nhm.h

Packit 577717
/*
Packit 577717
 * Intel Nehalem PMU
Packit 577717
 *
Packit 577717
 * Copyright (c) 2008 Google, Inc
Packit 577717
 * Contributed by Stephane Eranian <eranian@gmail.com>
Packit 577717
 *
Packit 577717
 * Permission is hereby granted, free of charge, to any person obtaining a copy
Packit 577717
 * of this software and associated documentation files (the "Software"), to deal
Packit 577717
 * in the Software without restriction, including without limitation the rights
Packit 577717
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
Packit 577717
 * of the Software, and to permit persons to whom the Software is furnished to do so,
Packit 577717
 * subject to the following conditions:
Packit 577717
 *
Packit 577717
 * The above copyright notice and this permission notice shall be included in all
Packit 577717
 * copies or substantial portions of the Software.
Packit 577717
 *
Packit 577717
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
Packit 577717
 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
Packit 577717
 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
Packit 577717
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Packit 577717
 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
Packit 577717
 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit 577717
 */
Packit 577717
#ifndef __PFMLIB_NHM_H__
Packit 577717
#define __PFMLIB_NHM_H__
Packit 577717
Packit 577717
#include <perfmon/pfmlib.h>
Packit 577717
/*
Packit 577717
 * privilege level mask usage for Intel Core
Packit 577717
 *
Packit 577717
 * PFM_PLM0 = OS (kernel, hypervisor, ..)
Packit 577717
 * PFM_PLM1 = unused (ignored)
Packit 577717
 * PFM_PLM2 = unused (ignored)
Packit 577717
 * PFM_PLM3 = USR (user level)
Packit 577717
 */
Packit 577717
Packit 577717
#ifdef __cplusplus
Packit 577717
extern "C" {
Packit 577717
#endif
Packit 577717
Packit 577717
/*
Packit 577717
 * total number of counters:
Packit 577717
 * 	- 4 generic core
Packit 577717
 * 	- 3 fixed core
Packit 577717
 * 	- 1 uncore fixed
Packit 577717
 * 	- 8 uncore generic
Packit 577717
 */
Packit 577717
#define PMU_NHM_NUM_COUNTERS 16
Packit 577717
Packit 577717
typedef union {
Packit 577717
	unsigned long long val;			/* complete register value */
Packit 577717
	struct {
Packit 577717
		unsigned long sel_event:8;	/* event mask */
Packit 577717
		unsigned long sel_umask:8;	/* unit mask */
Packit 577717
		unsigned long sel_usr:1;	/* user level */
Packit 577717
		unsigned long sel_os:1;		/* system level */
Packit 577717
		unsigned long sel_edge:1;	/* edge detec */
Packit 577717
		unsigned long sel_pc:1;		/* pin control */
Packit 577717
		unsigned long sel_int:1;	/* enable APIC intr */
Packit 577717
		unsigned long sel_anythr:1;	/* measure any thread */
Packit 577717
		unsigned long sel_en:1;		/* enable */
Packit 577717
		unsigned long sel_inv:1;	/* invert counter mask */
Packit 577717
		unsigned long sel_cnt_mask:8;	/* counter mask */
Packit 577717
		unsigned long sel_res2:32;
Packit 577717
	} perfevtsel;
Packit 577717
	struct {
Packit 577717
		unsigned long usel_event:8;	/* event select */
Packit 577717
		unsigned long usel_umask:8;	/* event unit mask */
Packit 577717
		unsigned long usel_res1:1;	/* reserved */
Packit 577717
		unsigned long usel_occ:1;	/* occupancy reset */
Packit 577717
		unsigned long usel_edge:1;	/* edge detection */
Packit 577717
		unsigned long usel_res2:1;	/* reserved */
Packit 577717
		unsigned long usel_int:1;	/* PMI enable */
Packit 577717
		unsigned long usel_res3:1;	/* reserved */
Packit 577717
		unsigned long usel_en:1;		/* enable */
Packit 577717
		unsigned long usel_inv:1;	/* invert */
Packit 577717
		unsigned long usel_cnt_mask:8;	/* counter mask */
Packit 577717
		unsigned long usel_res4:32;	/* reserved */
Packit 577717
	} unc_perfevtsel;
Packit 577717
	struct {
Packit 577717
		unsigned long cpl_eq0:1;	/* filter out branches at pl0 */
Packit 577717
		unsigned long cpl_neq0:1;	/* filter out branches at pl1-pl3 */
Packit 577717
		unsigned long jcc:1;		/* filter out condition branches */
Packit 577717
		unsigned long near_rel_call:1;	/* filter out near relative calls */
Packit 577717
		unsigned long near_ind_call:1;	/* filter out near indirect calls */
Packit 577717
		unsigned long near_ret:1;	/* filter out near returns */
Packit 577717
		unsigned long near_ind_jmp:1;	/* filter out near unconditional jmp/calls */
Packit 577717
		unsigned long near_rel_jmp:1;	/* filter out near uncoditional relative jmp */
Packit 577717
		unsigned long far_branch:1;	/* filter out far branches */ 
Packit 577717
		unsigned long reserved1:23;	/* reserved */
Packit 577717
		unsigned long reserved2:32;	/* reserved */
Packit 577717
	} lbr_select;
Packit 577717
} pfm_nhm_sel_reg_t;
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	unsigned long		cnt_mask;	/* counter mask (occurences) */
Packit 577717
	unsigned int		flags;		/* counter specific flag */
Packit 577717
} pfmlib_nhm_counter_t;
Packit 577717
Packit 577717
/*
Packit 577717
 * flags for pfmlib_nhm_counter_t
Packit 577717
 */
Packit 577717
#define PFM_NHM_SEL_INV		0x1	/* inverse */
Packit 577717
#define PFM_NHM_SEL_EDGE	0x2	/* edge detect */
Packit 577717
#define PFM_NHM_SEL_ANYTHR	0x4	/* any thread (core only) */
Packit 577717
#define PFM_NHM_SEL_OCC_RST	0x8	/* reset occupancy (uncore only) */
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	unsigned int lbr_used;	/* set to 1 if LBR is used */
Packit 577717
	unsigned int lbr_plm;	/* priv level PLM0 or PLM3 */
Packit 577717
	unsigned int lbr_filter;/* filters */
Packit 577717
} pfmlib_nhm_lbr_t;
Packit 577717
Packit 577717
/*
Packit 577717
 * lbr_filter: filter out branches
Packit 577717
 * refer to IA32 SDM vol3b section 18.6.2
Packit 577717
 */
Packit 577717
#define PFM_NHM_LBR_JCC			0x4  /* do not capture conditional branches */
Packit 577717
#define PFM_NHM_LBR_NEAR_REL_CALL	0x8  /* do not capture near calls */
Packit 577717
#define PFM_NHM_LBR_NEAR_IND_CALL	0x10 /* do not capture indirect calls */
Packit 577717
#define PFM_NHM_LBR_NEAR_RET		0x20 /* do not capture near returns */
Packit 577717
#define PFM_NHM_LBR_NEAR_IND_JMP	0x40 /* do not capture indirect jumps */
Packit 577717
#define PFM_NHM_LBR_NEAR_REL_JMP	0x80 /* do not capture near relative jumps */
Packit 577717
#define PFM_NHM_LBR_FAR_BRANCH		0x100/* do not capture far branches */
Packit 577717
#define PFM_NHM_LBR_ALL			0x1fc /* filter out all branches */
Packit 577717
Packit 577717
/*
Packit 577717
 * PEBS input parameters
Packit 577717
 */
Packit 577717
typedef struct {
Packit 577717
	unsigned int pebs_used;		/* set to 1 if PEBS is used */
Packit 577717
	unsigned int ld_lat_thres;	/* load latency threshold (cycles) */
Packit 577717
} pfmlib_nhm_pebs_t;
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 * model-specific input parameter to pfm_dispatch_events()
Packit 577717
 */
Packit 577717
typedef struct {
Packit 577717
	pfmlib_nhm_counter_t	pfp_nhm_counters[PMU_NHM_NUM_COUNTERS];
Packit 577717
	pfmlib_nhm_pebs_t	pfp_nhm_pebs;	/* PEBS settings */
Packit 577717
	pfmlib_nhm_lbr_t	pfp_nhm_lbr;	/* LBR settings */
Packit 577717
	uint64_t		reserved[4];	/* for future use */
Packit 577717
} pfmlib_nhm_input_param_t;
Packit 577717
Packit 577717
/*
Packit 577717
 * no pfmlib_nhm_output_param_t defined
Packit 577717
 */
Packit 577717
Packit 577717
/*
Packit 577717
 * Model-specific interface
Packit 577717
 * can be called directly
Packit 577717
 */
Packit 577717
extern int pfm_nhm_is_pebs(pfmlib_event_t *e);
Packit 577717
extern int pfm_nhm_is_uncore(pfmlib_event_t *e);
Packit 577717
extern int pfm_nhm_data_src_desc(unsigned int val, char **desc);
Packit 577717
Packit 577717
#ifdef __cplusplus /* extern C */
Packit 577717
}
Packit 577717
#endif
Packit 577717
Packit 577717
#endif /* __PFMLIB_NHM_H__ */