|  | /* | 
|  | * Copyright (c) 2004-2006 Hewlett-Packard Development Company, L.P. | 
|  | * Contributed by Stephane Eranian <eranian@hpl.hp.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. | 
|  | * | 
|  | * This file is part of libpfm, a performance monitoring support library for | 
|  | * applications on Linux. | 
|  | */ | 
|  | #ifndef __PFMLIB_AMD64_PRIV_H__ | 
|  | #define __PFMLIB_AMD64_PRIV_H__ | 
|  |  | 
|  | #define AMD64_MAX_GRP		4 /* must be < 32 (int) */ | 
|  |  | 
|  | typedef struct { | 
|  | const char		*uname; /* unit mask name */ | 
|  | const char		*udesc; /* event/umask description */ | 
|  | unsigned int		ucode;  /* unit mask code */ | 
|  | unsigned int		uflags; /* unit mask flags */ | 
|  | unsigned int		grpid;	/* unit mask group id */ | 
|  | } amd64_umask_t; | 
|  |  | 
|  | typedef struct { | 
|  | const char		*name;	/* event name */ | 
|  | const char		*desc;	/* event description */ | 
|  | const amd64_umask_t	*umasks;/* list of umasks */ | 
|  | unsigned int		code; 	/* event code */ | 
|  | unsigned int		numasks;/* number of umasks */ | 
|  | unsigned int		flags;	/* flags */ | 
|  | unsigned int		modmsk;	/* modifiers bitmask */ | 
|  | unsigned int		ngrp;	/* number of unit masks groups */ | 
|  | } amd64_entry_t; | 
|  |  | 
|  | /* | 
|  | * we keep an internal revision type to avoid | 
|  | * dealing with arbitrarily large pfm_pmu_t | 
|  | * which would not fit into the 8 bits reserved | 
|  | * in amd64_entry_t.flags or amd64_umask_t.flags | 
|  | */ | 
|  | #define AMD64_FAM10H AMD64_FAM10H_REV_B | 
|  | typedef enum { | 
|  | AMD64_CPU_UN = 0, | 
|  | AMD64_K7, | 
|  | AMD64_K8_REV_B, | 
|  | AMD64_K8_REV_C, | 
|  | AMD64_K8_REV_D, | 
|  | AMD64_K8_REV_E, | 
|  | AMD64_K8_REV_F, | 
|  | AMD64_K8_REV_G, | 
|  | AMD64_FAM10H_REV_B, | 
|  | AMD64_FAM10H_REV_C, | 
|  | AMD64_FAM10H_REV_D, | 
|  |  | 
|  | AMD64_FAM14H_REV_B, | 
|  | } amd64_rev_t; | 
|  |  | 
|  | typedef struct { | 
|  | pfm_pmu_t		revision; | 
|  | int             	family; /* 0 means nothing detected yet */ | 
|  | int             	model; | 
|  | int             	stepping; | 
|  | } pfm_amd64_config_t; | 
|  |  | 
|  | extern pfm_amd64_config_t pfm_amd64_cfg; | 
|  |  | 
|  | /* | 
|  | * flags values (bottom 8 bits only) | 
|  | * bits 00-07: flags | 
|  | * bits 08-15: from revision | 
|  | * bits 16-23: till revision | 
|  | */ | 
|  | #define AMD64_FROM_REV(rev)	((rev)<<8) | 
|  | #define AMD64_TILL_REV(rev)	((rev)<<16) | 
|  | #define AMD64_NOT_SUPP		0x1ff00 | 
|  |  | 
|  | #define AMD64_FL_NCOMBO        		0x01 /* unit mask can be combined */ | 
|  | #define AMD64_FL_IBSFE			0x02 /* IBS fetch */ | 
|  | #define AMD64_FL_IBSOP			0x04 /* IBS op */ | 
|  | #define AMD64_FL_DFL			0x08 /* unit mask is default choice */ | 
|  | #define AMD64_FL_OMIT			0x10 /* umask can be omitted */ | 
|  |  | 
|  | #define AMD64_FL_TILL_K8_REV_C		AMD64_TILL_REV(AMD64_K8_REV_C) | 
|  | #define AMD64_FL_K8_REV_D		AMD64_FROM_REV(AMD64_K8_REV_D) | 
|  | #define AMD64_FL_K8_REV_E		AMD64_FROM_REV(AMD64_K8_REV_E) | 
|  | #define AMD64_FL_TILL_K8_REV_E		AMD64_TILL_REV(AMD64_K8_REV_E) | 
|  | #define AMD64_FL_K8_REV_F		AMD64_FROM_REV(AMD64_K8_REV_F) | 
|  | #define AMD64_FL_TILL_FAM10H_REV_B	AMD64_TILL_REV(AMD64_FAM10H_REV_B) | 
|  | #define AMD64_FL_FAM10H_REV_C		AMD64_FROM_REV(AMD64_FAM10H_REV_C) | 
|  | #define AMD64_FL_TILL_FAM10H_REV_C	AMD64_TILL_REV(AMD64_FAM10H_REV_C) | 
|  | #define AMD64_FL_FAM10H_REV_D		AMD64_FROM_REV(AMD64_FAM10H_REV_D) | 
|  |  | 
|  | #define AMD64_ATTR_K	0 | 
|  | #define AMD64_ATTR_U	1 | 
|  | #define AMD64_ATTR_E	2 | 
|  | #define AMD64_ATTR_I	3 | 
|  | #define AMD64_ATTR_C	4 | 
|  | #define AMD64_ATTR_H	5 | 
|  | #define AMD64_ATTR_G	6 | 
|  |  | 
|  | #define _AMD64_ATTR_U  (1 << AMD64_ATTR_U) | 
|  | #define _AMD64_ATTR_K  (1 << AMD64_ATTR_K) | 
|  | #define _AMD64_ATTR_I  (1 << AMD64_ATTR_I) | 
|  | #define _AMD64_ATTR_E  (1 << AMD64_ATTR_E) | 
|  | #define _AMD64_ATTR_C  (1 << AMD64_ATTR_C) | 
|  | #define _AMD64_ATTR_H  (1 << AMD64_ATTR_H) | 
|  | #define _AMD64_ATTR_G  (1 << AMD64_ATTR_G) | 
|  |  | 
|  | #define AMD64_BASIC_ATTRS \ | 
|  | (_AMD64_ATTR_I|_AMD64_ATTR_E|_AMD64_ATTR_C|_AMD64_ATTR_U|_AMD64_ATTR_K) | 
|  |  | 
|  | #define AMD64_K8_ATTRS			(AMD64_BASIC_ATTRS) | 
|  | #define AMD64_FAM10H_ATTRS		(AMD64_BASIC_ATTRS|_AMD64_ATTR_H|_AMD64_ATTR_G) | 
|  | #define AMD64_FAM12H_ATTRS		(AMD64_BASIC_ATTRS|_AMD64_ATTR_H|_AMD64_ATTR_G) | 
|  | #define AMD64_FAM14H_ATTRS		(AMD64_BASIC_ATTRS|_AMD64_ATTR_H|_AMD64_ATTR_G) | 
|  | #define AMD64_FAM15H_ATTRS		(AMD64_BASIC_ATTRS|_AMD64_ATTR_H|_AMD64_ATTR_G) | 
|  |  | 
|  | #define AMD64_FAM10H_PLM	(PFM_PLM0|PFM_PLM3|PFM_PLMH) | 
|  | #define AMD64_K7_PLM		(PFM_PLM0|PFM_PLM3) | 
|  |  | 
|  | /* | 
|  | * AMD64 MSR definitions | 
|  | */ | 
|  | typedef union { | 
|  | uint64_t val;				/* complete register value */ | 
|  | struct { | 
|  | uint64_t sel_event_mask:8;	/* event mask */ | 
|  | uint64_t sel_unit_mask:8;	/* unit mask */ | 
|  | uint64_t sel_usr:1;		/* user level */ | 
|  | uint64_t sel_os:1;		/* system level */ | 
|  | uint64_t sel_edge:1;		/* edge detec */ | 
|  | uint64_t sel_pc:1;		/* pin control */ | 
|  | uint64_t sel_int:1;		/* enable APIC intr */ | 
|  | uint64_t sel_res1:1;		/* reserved */ | 
|  | uint64_t sel_en:1;		/* enable */ | 
|  | uint64_t sel_inv:1;		/* invert counter mask */ | 
|  | uint64_t sel_cnt_mask:8;	/* counter mask */ | 
|  | uint64_t sel_event_mask2:4;	/* 10h only: event mask [11:8] */ | 
|  | uint64_t sel_res2:4;		/* reserved */ | 
|  | uint64_t sel_guest:1;		/* 10h only: guest only counter */ | 
|  | uint64_t sel_host:1;		/* 10h only: host only counter */ | 
|  | uint64_t sel_res3:22;		/* reserved */ | 
|  | } perfsel; | 
|  |  | 
|  | struct { | 
|  | uint64_t maxcnt:16; | 
|  | uint64_t cnt:16; | 
|  | uint64_t lat:16; | 
|  | uint64_t en:1; | 
|  | uint64_t val:1; | 
|  | uint64_t comp:1; | 
|  | uint64_t icmiss:1; | 
|  | uint64_t phyaddrvalid:1; | 
|  | uint64_t l1tlbpgsz:2; | 
|  | uint64_t l1tlbmiss:1; | 
|  | uint64_t l2tlbmiss:1; | 
|  | uint64_t randen:1; | 
|  | uint64_t reserved:6; | 
|  | } ibsfetch; | 
|  | struct { | 
|  | uint64_t maxcnt:16; | 
|  | uint64_t reserved1:1; | 
|  | uint64_t en:1; | 
|  | uint64_t val:1; | 
|  | uint64_t reserved2:45; | 
|  | } ibsop; | 
|  | } pfm_amd64_reg_t; /* MSR 0xc001000-0xc001003 */ | 
|  |  | 
|  | /* let's define some handy shortcuts! */ | 
|  | #define sel_event_mask	perfsel.sel_event_mask | 
|  | #define sel_unit_mask	perfsel.sel_unit_mask | 
|  | #define sel_usr		perfsel.sel_usr | 
|  | #define sel_os		perfsel.sel_os | 
|  | #define sel_edge	perfsel.sel_edge | 
|  | #define sel_pc		perfsel.sel_pc | 
|  | #define sel_int		perfsel.sel_int | 
|  | #define sel_en		perfsel.sel_en | 
|  | #define sel_inv		perfsel.sel_inv | 
|  | #define sel_cnt_mask	perfsel.sel_cnt_mask | 
|  | #define sel_event_mask2 perfsel.sel_event_mask2 | 
|  | #define sel_guest	perfsel.sel_guest | 
|  | #define sel_host	perfsel.sel_host | 
|  |  | 
|  | #define IS_FAMILY_10H(p) (((pfmlib_pmu_t *)(p))->pmu_rev >= AMD64_FAM10H) | 
|  | #define IS_FAMILY_15H(p) (((pfmlib_pmu_t *)(p))->pmu == PFM_PMU_AMD64_FAM15H_INTERLAGOS) | 
|  |  | 
|  | extern int pfm_amd64_get_encoding(void *this, pfmlib_event_desc_t *e); | 
|  | extern int pfm_amd64_get_event_first(void *this); | 
|  | extern int pfm_amd64_get_event_next(void *this, int idx); | 
|  | extern int pfm_amd64_event_is_valid(void *this, int idx); | 
|  | extern int pfm_amd64_get_event_attr_info(void *this, int idx, int attr_idx, pfm_event_attr_info_t *info); | 
|  | extern int pfm_amd64_get_event_info(void *this, int idx, pfm_event_info_t *info); | 
|  | extern int pfm_amd64_validate_table(void *this, FILE *fp); | 
|  | extern int pfm_amd64_detect(void *this); | 
|  | extern const pfmlib_attr_desc_t amd64_mods[]; | 
|  | extern unsigned int pfm_amd64_get_event_nattrs(void *this, int pidx); | 
|  | extern int pfm_amd64_get_num_events(void *this); | 
|  |  | 
|  | extern int pfm_amd64_get_perf_encoding(void *this, pfmlib_event_desc_t *e); | 
|  | extern void pfm_amd64_perf_validate_pattrs(void *this, pfmlib_event_desc_t *e); | 
|  | extern void pfm_amd64_nb_perf_validate_pattrs(void *this, pfmlib_event_desc_t *e); | 
|  | extern int pfm_amd64_family_detect(void *this); | 
|  | #endif /* __PFMLIB_AMD64_PRIV_H__ */ |