34#define CRAYX2_NO_REDUNDANT 0
46 DPRINT (
"return: count %d exceeded #counters\n", cnt);
49 DPRINT (
"return: event index %d exceeded #events\n",
i);
53 DPRINT (
"return: event code is %#x\n", *code);
62 DPRINT (
"return: event index %d exceeded #events\n",
i);
75 memset (counters, 0,
sizeof (*counters));
92 DPRINT (
"number of counters used on chip %d\n", u);
102 if (*used & (1 << ctr)) {
103 if (event == PFM_EVENT_GET (*evmsk, ctr)) {
109 *evmsk |= PFM_EVENT_SET (ctr, event);
118 unsigned int i, npmcs = 0, npmds = 0, base_pmc = 0;
122 uint64_t Pevents = 0, Cevents = 0, Mevents = 0;
124 DPRINT (
"dispatching event info to the PMCs and PMDs\n");
146 DPRINT (
"return: event count is 0\n");
153 memset (Pused, 0,
sizeof(Pused));
154 memset (Cused, 0,
sizeof(Cused));
155 memset (Mused, 0,
sizeof(Mused));
160 unsigned int code, chip, ctr, ev, chipno;
174 DPRINT (
"%3d: code %3d chip %1d ctr %2d ev %1d chipno %2d\n", code,
i, chip, ctr, ev, chipno);
186 DPRINT (
"too many masks for event\n");
201 DPRINT (
"return: invalid chip\n");
208 DPRINT (
"return: ctr conflict\n");
211#if (CRAYX2_NO_REDUNDANT != 0)
212 DPRINT (
"return: ctr redundant\n");
215 DPRINT (
"warning: ctr redundant\n");
230 DPRINT (
"P event mask %#16lx\n", Pevents);
231 DPRINT (
"C event mask %#16lx\n", Cevents);
232 DPRINT (
"M event mask %#16lx\n", Mevents);
243 uint64_t Pctrl = PFM_CPU_START;
244 uint64_t Pen = PFM_ENABLE_RW;
247 Pen |= PFM_ENABLE_KERNEL;
250 Pen |= PFM_ENABLE_EXL;
253 Pen |= PFM_ENABLE_USER;
279 uint64_t Cctrl = PFM_CACHE_START;
280 uint64_t Cen = PFM_ENABLE_RW;
305 uint64_t Mctrl = PFM_MEM_START;
306 uint64_t Men = PFM_ENABLE_RW;
347 DPRINT (
"detect the PMU attributes\n");
351 if (ret != 0 || strcasecmp (buffer,
"Cray") != 0) {
352 DPRINT (
"return: no 'Cray' vendor_id\n");
358 if (ret != 0 || strcasecmp (buffer,
"craynv2") != 0) {
359 DPRINT (
"return: no 'craynv2' type\n");
363 DPRINT (
"Cray X2 nv2 found\n");
411 DPRINT (
"return: width set to %d\n", *width);
421 *str = (
s == NULL ? NULL : strdup (
s));
422 DPRINT (
"return: event description is '%s'\n", (
s == NULL ?
"" :
s));
437 DPRINT (
"return: event mask name is '%s'\n",
crayx2_pe[ev].pme_umasks[midx].pme_uname);
445 DPRINT (
"return: event mask code is %#x\n", *code);
455 *str = (
s == NULL ? NULL : strdup (
s));
456 DPRINT (
"return: event mask description is '%s'\n", (
s == NULL ?
"" :
s));
465 DPRINT (
"return: event code for cycles %#x\n", e->
event);
474 DPRINT (
"return: event code for retired instr %#x\n", e->
event);
#define PME_CRAYX2_INSTR_GRADUATED
#define PME_CRAYX2_CYCLES
#define PME_CRAYX2_EVENT_COUNT
static pme_crayx2_entry_t crayx2_pe[]
static int pfm_regmask_set(pfmlib_regmask_t *h, unsigned int b)
#define PFMLIB_ERR_EVTINCOMP
#define PFMLIB_ERR_TOOMANY
#define PFMLIB_CRAYX2_PMU
#define PFMLIB_ERR_NOTSUPP
#define PFMLIB_ERR_EVTMANY
static counter_use_t pfm_crayx2_counter_use(unsigned int ctr, unsigned int event, uint32_t *used, uint64_t *evmsk)
static void pfm_crayx2_get_event_counters(unsigned int j, pfmlib_regmask_t *counters)
static void pfm_crayx2_get_hw_counter_width(unsigned int *width)
static int pfm_crayx2_get_event_desc(unsigned int ev, char **str)
static int pfm_crayx2_pmu_detect(void)
static int pfm_crayx2_get_cycle_event(pfmlib_event_t *e)
static char * pfm_crayx2_get_event_name(unsigned int i)
static int pfm_crayx2_get_event_mask_code(unsigned int ev, unsigned int midx, unsigned int *code)
static int pfm_crayx2_get_event_code(unsigned int i, unsigned int cnt, int *code)
static int pfm_crayx2_get_event_mask_desc(unsigned int ev, unsigned int midx, char **str)
pfm_pmu_support_t crayx2_support
static unsigned int pfm_crayx2_get_num_event_masks(unsigned int ev)
static int pfm_crayx2_get_inst_retired(pfmlib_event_t *e)
static int pfm_crayx2_chip_use(uint32_t used[], unsigned int n)
static void pfm_crayx2_get_impl_pmds(pfmlib_regmask_t *impl_pmds)
static void pfm_crayx2_get_impl_counters(pfmlib_regmask_t *impl_counters)
static void pfm_crayx2_get_impl_pmcs(pfmlib_regmask_t *impl_pmcs)
static int pfm_crayx2_dispatch_events(pfmlib_input_param_t *inp, void *model_in, pfmlib_output_param_t *outp, void *model_out)
static char * pfm_crayx2_get_event_mask_name(unsigned int ev, unsigned int midx)
#define PMU_CRAYX2_NUM_COUNTERS
#define PMU_CRAYX2_PMC_COUNT
#define PMU_CRAYX2_COUNTER_WIDTH
#define PMU_CRAYX2_CPU_PMC_BASE
#define PMU_CRAYX2_PMD_COUNT
#define PMU_CRAYX2_CACHE_PMC_BASE
#define PMU_CRAYX2_MEMORY_PMC_BASE
#define PME_CRAYX2_CHIP_MEMORY
#define PME_CRAYX2_CACHE_CHIPS
#define PME_CRAYX2_CPU_CHIPS
#define PME_CRAYX2_MEMORY_CHIPS
#define PME_CRAYX2_CHIP_CPU
#define PME_CRAYX2_CHIP_CACHE
int __pfm_getcpuinfo_attr(const char *attr, char *ret_buf, size_t maxlen)
#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_crayx2_umask_t pme_umasks[PFMLIB_CRAYX2_MAX_UMASK]