51#define sel_event_select perfevtsel.sel_event_select
52#define sel_unit_mask perfevtsel.sel_unit_mask
53#define sel_usr perfevtsel.sel_usr
54#define sel_os perfevtsel.sel_os
55#define sel_edge perfevtsel.sel_edge
56#define sel_pc perfevtsel.sel_pc
57#define sel_int perfevtsel.sel_int
58#define sel_en perfevtsel.sel_en
59#define sel_inv perfevtsel.sel_inv
60#define sel_cnt_mask perfevtsel.sel_cnt_mask
61#define sel_any perfevtsel.sel_any
63#define has_pebs(i) (intel_atom_pe[i].pme_flags & PFMLIB_INTEL_ATOM_PEBS)
82#define INTEL_ATOM_SEL_BASE 0x186
83#define INTEL_ATOM_CTR_BASE 0xc1
84#define FIXED_CTR_BASE 0x309
86#define PFMLIB_INTEL_ATOM_ALL_FLAGS \
87 (PFM_INTEL_ATOM_SEL_INV|PFM_INTEL_ATOM_SEL_EDGE|PFM_INTEL_ATOM_SEL_ANYTHR)
102 if (strcmp(buffer,
"GenuineIntel"))
115 model = atoi(buffer);
144 for(
i=0;
i < 16;
i++)
158 unsigned int fl, flc,
i;
159 unsigned int mask = 0;
193 return flc > 0 && flc == e->
num_masks ? 1 : 0;
203#define HAS_OPTIONS(x) (cntrs && (cntrs[x].flags || cntrs[x].cnt_mask))
204#define is_fixed_pmc(a) (a == 16 || a == 17 || a == 18)
213 unsigned long long fixed_ctr;
214 unsigned int npc, npmc0, npmc1, nf2;
215 unsigned int i, j, n, k, ucode, use_pebs = 0, done_pebs;
217 unsigned int next_gen, last_gen;
219 npc = npmc0 = npmc1 = nf2 = 0;
241 for(
i=0;
i < n;
i++) {
255 && e[
i].num_masks > 1) {
256 DPRINT(
"events does not support unit mask combination\n");
266 DPRINT(
"two events compete for a PMC0\n");
275 DPRINT(
"two events compete for a PMC1\n");
284 DPRINT(
"two events compete for FIXED_CTR2\n");
288 DPRINT(
"UNHALTED_REFERENCE_CYCLES only accepts anythr filter\n");
302 DPRINT(
"two events compete for FIXED_CTR2\n");
306 DPRINT(
"fixed counters do not support inversion/counter-mask\n");
324 for(
i=0;
i < n;
i++) {
355 for(
i=0;
i < n;
i++) {
380 for(
i=0;
i < n;
i++) {
381 if (assign_pc[
i] == -1) {
382 for(; next_gen <= last_gen; next_gen++) {
386 if (next_gen <= last_gen)
387 assign_pc[
i] = next_gen++;
389 DPRINT(
"cannot assign generic counters\n");
399 for (
i=0;
i < n ;
i++ ) {
413 reg.
val |= val << ((assign_pc[
i]-16)<<2);
422 __pfm_vbprintf(
"[FIXED_CTRL(pmc%u)=0x%"PRIx64
" pmi0=1 en0=0x%"PRIx64
" any0=%d pmi1=1 en1=0x%"PRIx64
" any1=%d pmi2=1 en2=0x%"PRIx64
" any2=%d] ",
426 !!(reg.
val & 0x4ULL),
427 (reg.
val>>4) & 0x3ULL,
428 !!((reg.
val>>4) & 0x4ULL),
429 (reg.
val>>8) & 0x3ULL,
430 !!((reg.
val>>8) & 0x4ULL));
432 if ((fixed_ctr & 0x1) == 0)
434 if ((fixed_ctr & 0x2) == 0)
436 if ((fixed_ctr & 0x4) == 0)
442 if ((fixed_ctr & 0x1) == 0)
444 if ((fixed_ctr & 0x2) == 0)
446 if ((fixed_ctr & 0x4) == 0)
450 for (
i=0;
i < n ;
i++ ) {
464 ucode = (val >> 8) & 0xff;
467 ucode |=
intel_atom_pe[e[
i].event].pme_umasks[e[
i].unit_masks[k]].pme_ucode;
488 if (cntrs[
i].cnt_mask > 255)
506 __pfm_vbprintf(
"[PERFEVTSEL%u(pmc%u)=0x%"PRIx64
" event_sel=0x%x umask=0x%x os=%d usr=%d en=%d int=%d inv=%d edge=%d cnt_mask=%d anythr=%d] %s\n",
531 for (
i=0;
i < n ;
i++) {
549 if (use_pebs && done_pebs) {
563 pc[npc].reg_value & 0x1ull);
602 unsigned int has_f0, has_f1, has_f2;
604 memset(counters, 0,
sizeof(*counters));
607 has_f0 = has_f1 = has_f2 = 0;
609 for (
i=0;
i < n;
i++) {
672#define PMU_INTEL_ATOM_COUNTER_WIDTH 32
#define PME_INTEL_ATOM_EVENT_COUNT
#define PME_INTEL_ATOM_UNHALTED_CORE_CYCLES
#define PME_INTEL_ATOM_INSTRUCTIONS_RETIRED
static pme_intel_atom_entry_t intel_atom_pe[]
static int pfm_regmask_set(pfmlib_regmask_t *h, unsigned int b)
static int pfm_regmask_clr(pfmlib_regmask_t *h, unsigned int b)
#define PFMLIB_ERR_TOOMANY
#define PFMLIB_INTEL_ATOM_PMU
static int pfm_regmask_isset(pfmlib_regmask_t *h, unsigned int b)
#define PFMLIB_ERR_NOASSIGN
#define PFMLIB_ERR_NOTSUPP
static pfmlib_regmask_t intel_atom_impl_pmds
static int pfm_intel_atom_get_cycle_event(pfmlib_event_t *e)
static void pfm_intel_atom_get_event_counters(unsigned int j, pfmlib_regmask_t *counters)
static pfmlib_regmask_t intel_atom_impl_pmcs
static int pfm_intel_atom_detect(void)
#define INTEL_ATOM_SEL_BASE
static int pfm_intel_atom_dispatch_counters(pfmlib_input_param_t *inp, pfmlib_intel_atom_input_param_t *param, pfmlib_output_param_t *outp)
static int pfm_intel_atom_get_event_description(unsigned int ev, char **str)
static void pfm_intel_atom_get_hw_counter_width(unsigned int *width)
static char * pfm_intel_atom_get_event_name(unsigned int i)
#define INTEL_ATOM_CTR_BASE
static int highest_counter
static void pfm_intel_atom_get_impl_pmcs(pfmlib_regmask_t *impl_pmcs)
static unsigned int pfm_intel_atom_get_num_event_masks(unsigned int ev)
int pfm_intel_atom_has_pebs(pfmlib_event_t *e)
pfm_pmu_support_t intel_atom_support
#define PMU_INTEL_ATOM_COUNTER_WIDTH
static int pfm_intel_atom_get_inst_retired(pfmlib_event_t *e)
static char * pfm_intel_atom_get_event_mask_name(unsigned int ev, unsigned int midx)
static int pfm_intel_atom_init(void)
static int pfm_intel_atom_get_event_code(unsigned int i, unsigned int cnt, int *code)
static int pfm_intel_atom_get_event_mask_desc(unsigned int ev, unsigned int midx, char **str)
static int pfm_intel_atom_is_fixed(pfmlib_event_t *e, unsigned int f)
static int pfm_intel_atom_dispatch_events(pfmlib_input_param_t *inp, void *model_in, pfmlib_output_param_t *outp, void *model_out)
static void pfm_intel_atom_get_impl_counters(pfmlib_regmask_t *impl_counters)
#define PFMLIB_INTEL_ATOM_ALL_FLAGS
static void pfm_intel_atom_get_impl_pmds(pfmlib_regmask_t *impl_pmds)
static int pfm_intel_atom_get_event_mask_code(unsigned int ev, unsigned int midx, unsigned int *code)
#define PMU_INTEL_ATOM_NUM_COUNTERS
#define PFM_INTEL_ATOM_SEL_ANYTHR
#define PFM_INTEL_ATOM_SEL_EDGE
#define PFM_INTEL_ATOM_SEL_INV
#define PFMLIB_INTEL_ATOM_FIXED0
#define PFMLIB_INTEL_ATOM_PMC0
#define PFMLIB_INTEL_ATOM_UMASK_NCOMBO
#define PFMLIB_INTEL_ATOM_PEBS
#define PFMLIB_INTEL_ATOM_FIXED2_ONLY
#define PFMLIB_INTEL_ATOM_FIXED1
#define PFMLIB_INTEL_ATOM_PMC1
int __pfm_getcpuinfo_attr(const char *attr, char *ret_buf, size_t maxlen)
void __pfm_vbprintf(const char *fmt,...)
#define DPRINT(fmt, a...)
unsigned int unit_masks[PFMLIB_MAX_MASKS_PER_EVENT]
pfmlib_reg_t pfp_pmds[PFMLIB_MAX_PMDS]
pfmlib_reg_t pfp_pmcs[PFMLIB_MAX_PMCS]
unsigned int pfp_pmc_count
unsigned int pfp_pmd_count
unsigned long long reg_value
unsigned long reg_alt_addr
unsigned long long reg_addr
pme_intel_atom_umask_t pme_umasks[PFMLIB_INTEL_ATOM_MAX_UMASK]
unsigned long sel_event_select
unsigned long sel_cnt_mask
unsigned long sel_unit_mask