|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* pfmlib_intel_nhm_unc.c : Intel Nehalem/Westmere uncore PMU
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Copyright (c) 2008 Google, Inc
|
|
Packit Service |
a1973e |
* Contributed by Stephane Eranian <eranian@gmail.com>
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
Packit Service |
a1973e |
* of this software and associated documentation files (the "Software"), to deal
|
|
Packit Service |
a1973e |
* in the Software without restriction, including without limitation the rights
|
|
Packit Service |
a1973e |
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
Packit Service |
a1973e |
* of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
Packit Service |
a1973e |
* subject to the following conditions:
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* The above copyright notice and this permission notice shall be included in all
|
|
Packit Service |
a1973e |
* copies or substantial portions of the Software.
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
Packit Service |
a1973e |
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
Packit Service |
a1973e |
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
Packit Service |
a1973e |
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
|
Packit Service |
a1973e |
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
|
Packit Service |
a1973e |
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
#include <sys/types.h>
|
|
Packit Service |
a1973e |
#include <ctype.h>
|
|
Packit Service |
a1973e |
#include <string.h>
|
|
Packit Service |
a1973e |
#include <stdlib.h>
|
|
Packit Service |
a1973e |
#include <stdio.h>
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* private headers */
|
|
Packit Service |
a1973e |
#include "pfmlib_priv.h"
|
|
Packit Service |
a1973e |
#include "pfmlib_intel_x86_priv.h"
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#define NHM_UNC_ATTR_E 0
|
|
Packit Service |
a1973e |
#define NHM_UNC_ATTR_I 1
|
|
Packit Service |
a1973e |
#define NHM_UNC_ATTR_C 2
|
|
Packit Service |
a1973e |
#define NHM_UNC_ATTR_O 3
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#define _NHM_UNC_ATTR_I (1 << NHM_UNC_ATTR_I)
|
|
Packit Service |
a1973e |
#define _NHM_UNC_ATTR_E (1 << NHM_UNC_ATTR_E)
|
|
Packit Service |
a1973e |
#define _NHM_UNC_ATTR_C (1 << NHM_UNC_ATTR_C)
|
|
Packit Service |
a1973e |
#define _NHM_UNC_ATTR_O (1 << NHM_UNC_ATTR_O)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#define NHM_UNC_ATTRS \
|
|
Packit Service |
a1973e |
(_NHM_UNC_ATTR_I|_NHM_UNC_ATTR_E|_NHM_UNC_ATTR_C|_NHM_UNC_ATTR_O)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#define NHM_UNC_MOD_OCC_BIT 17
|
|
Packit Service |
a1973e |
#define NHM_UNC_MOD_EDGE_BIT 18
|
|
Packit Service |
a1973e |
#define NHM_UNC_MOD_INV_BIT 23
|
|
Packit Service |
a1973e |
#define NHM_UNC_MOD_CMASK_BIT 24
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#define NHM_UNC_MOD_OCC (1 << NHM_UNC_MOD_OCC_BIT)
|
|
Packit Service |
a1973e |
#define NHM_UNC_MOD_EDGE (1 << NHM_UNC_MOD_EDGE_BIT)
|
|
Packit Service |
a1973e |
#define NHM_UNC_MOD_INV (1 << NHM_UNC_MOD_INV_BIT)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Intel Nehalem/Westmere uncore event table */
|
|
Packit Service |
a1973e |
#include "events/intel_nhm_unc_events.h"
|
|
Packit Service |
a1973e |
#include "events/intel_wsm_unc_events.h"
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static const pfmlib_attr_desc_t nhm_unc_mods[]={
|
|
Packit Service |
a1973e |
PFM_ATTR_B("e", "edge level"), /* edge */
|
|
Packit Service |
a1973e |
PFM_ATTR_B("i", "invert"), /* invert */
|
|
Packit Service |
a1973e |
PFM_ATTR_I("c", "counter-mask in range [0-255]"), /* counter-mask */
|
|
Packit Service |
a1973e |
PFM_ATTR_B("o", "queue occupancy"), /* queue occupancy */
|
|
Packit Service |
a1973e |
PFM_ATTR_NULL
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static const int nhm_models[] = {
|
|
Packit Service |
a1973e |
26,
|
|
Packit Service |
a1973e |
30,
|
|
Packit Service |
a1973e |
31,
|
|
Packit Service |
a1973e |
0
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static const int wsm_dp_models[] = {
|
|
Packit Service |
a1973e |
44, /* Westmere-EP, Gulftown */
|
|
Packit Service |
a1973e |
47, /* Westmere E7 */
|
|
Packit Service |
a1973e |
0,
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static int
|
|
Packit Service |
a1973e |
pfm_nhm_unc_get_encoding(void *this, pfmlib_event_desc_t *e)
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
pfm_intel_x86_reg_t reg;
|
|
Packit Service |
a1973e |
pfmlib_event_attr_info_t *a;
|
|
Packit Service |
a1973e |
const intel_x86_entry_t *pe = this_pe(this);
|
|
Packit Service |
a1973e |
unsigned int grpmsk, ugrpmsk = 0;
|
|
Packit Service |
a1973e |
int umodmsk = 0, modmsk_r = 0;
|
|
Packit Service |
a1973e |
uint64_t val;
|
|
Packit Service |
a1973e |
uint64_t umask;
|
|
Packit Service |
a1973e |
unsigned int modhw = 0;
|
|
Packit Service |
a1973e |
int k, ret, grpid, last_grpid = -1;
|
|
Packit Service |
a1973e |
int grpcounts[INTEL_X86_NUM_GRP];
|
|
Packit Service |
a1973e |
int ncombo[INTEL_X86_NUM_GRP];
|
|
Packit Service |
a1973e |
char umask_str[PFMLIB_EVT_MAX_NAME_LEN];
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
memset(grpcounts, 0, sizeof(grpcounts));
|
|
Packit Service |
a1973e |
memset(ncombo, 0, sizeof(ncombo));
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
pe = this_pe(this);
|
|
Packit Service |
a1973e |
umask_str[0] = e->fstr[0] = '\0';
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
reg.val = 0;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
val = pe[e->event].code;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
grpmsk = (1 << pe[e->event].ngrp)-1;
|
|
Packit Service |
a1973e |
reg.val |= val; /* preset some filters from code */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* take into account hardcoded umask */
|
|
Packit Service |
a1973e |
umask = (val >> 8) & 0xff;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
modmsk_r = pe[e->event].modmsk_req;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
for(k=0; k < e->nattrs; k++) {
|
|
Packit Service |
a1973e |
a = attr(e, k);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (a->ctrl != PFM_ATTR_CTRL_PMU)
|
|
Packit Service |
a1973e |
continue;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (a->type == PFM_ATTR_UMASK) {
|
|
Packit Service |
a1973e |
grpid = pe[e->event].umasks[a->idx].grpid;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* cfor certain events groups are meant to be
|
|
Packit Service |
a1973e |
* exclusive, i.e., only unit masks of one group
|
|
Packit Service |
a1973e |
* can be used
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
if (last_grpid != -1 && grpid != last_grpid
|
|
Packit Service |
a1973e |
&& intel_x86_eflag(this, e->event, INTEL_X86_GRP_EXCL)) {
|
|
Packit Service |
a1973e |
DPRINT("exclusive unit mask group error\n");
|
|
Packit Service |
a1973e |
return PFM_ERR_FEATCOMB;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* upper layer has removed duplicates
|
|
Packit Service |
a1973e |
* so if we come here more than once, it is for two
|
|
Packit Service |
a1973e |
* disinct umasks
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* NCOMBO=no combination of unit masks within the same
|
|
Packit Service |
a1973e |
* umask group
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
++grpcounts[grpid];
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (intel_x86_uflag(this, e->event, a->idx, INTEL_X86_NCOMBO))
|
|
Packit Service |
a1973e |
ncombo[grpid] = 1;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (grpcounts[grpid] > 1 && ncombo[grpid]) {
|
|
Packit Service |
a1973e |
DPRINT("event does not support unit mask combination within a group\n");
|
|
Packit Service |
a1973e |
return PFM_ERR_FEATCOMB;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
evt_strcat(umask_str, ":%s", pe[e->event].umasks[a->idx].uname);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
last_grpid = grpid;
|
|
Packit Service |
a1973e |
modhw |= pe[e->event].umasks[a->idx].modhw;
|
|
Packit Service |
a1973e |
umask |= pe[e->event].umasks[a->idx].ucode >> 8;
|
|
Packit Service |
a1973e |
ugrpmsk |= 1 << pe[e->event].umasks[a->idx].grpid;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
reg.val |= umask << 8;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
modmsk_r |= pe[e->event].umasks[a->idx].umodmsk_req;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
} else if (a->type == PFM_ATTR_RAW_UMASK) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* there can only be one RAW_UMASK per event */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* sanity check */
|
|
Packit Service |
a1973e |
if (a->idx & ~0xff) {
|
|
Packit Service |
a1973e |
DPRINT("raw umask is 8-bit wide\n");
|
|
Packit Service |
a1973e |
return PFM_ERR_ATTR;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
/* override umask */
|
|
Packit Service |
a1973e |
umask = a->idx & 0xff;
|
|
Packit Service |
a1973e |
ugrpmsk = grpmsk;
|
|
Packit Service |
a1973e |
} else {
|
|
Packit Service |
a1973e |
uint64_t ival = e->attrs[k].ival;
|
|
Packit Service |
a1973e |
switch(a->idx) {
|
|
Packit Service |
a1973e |
case NHM_UNC_ATTR_I: /* invert */
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_inv = !!ival;
|
|
Packit Service |
a1973e |
umodmsk |= _NHM_UNC_ATTR_I;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
case NHM_UNC_ATTR_E: /* edge */
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_edge = !!ival;
|
|
Packit Service |
a1973e |
umodmsk |= _NHM_UNC_ATTR_E;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
case NHM_UNC_ATTR_C: /* counter-mask */
|
|
Packit Service |
a1973e |
/* already forced, cannot overwrite */
|
|
Packit Service |
a1973e |
if (ival > 255)
|
|
Packit Service |
a1973e |
return PFM_ERR_INVAL;
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_cnt_mask = ival;
|
|
Packit Service |
a1973e |
umodmsk |= _NHM_UNC_ATTR_C;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
case NHM_UNC_ATTR_O: /* occupancy */
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_occ = !!ival;
|
|
Packit Service |
a1973e |
umodmsk |= _NHM_UNC_ATTR_O;
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ((modhw & _NHM_UNC_ATTR_I) && reg.nhm_unc.usel_inv)
|
|
Packit Service |
a1973e |
return PFM_ERR_ATTR_SET;
|
|
Packit Service |
a1973e |
if ((modhw & _NHM_UNC_ATTR_E) && reg.nhm_unc.usel_edge)
|
|
Packit Service |
a1973e |
return PFM_ERR_ATTR_SET;
|
|
Packit Service |
a1973e |
if ((modhw & _NHM_UNC_ATTR_C) && reg.nhm_unc.usel_cnt_mask)
|
|
Packit Service |
a1973e |
return PFM_ERR_ATTR_SET;
|
|
Packit Service |
a1973e |
if ((modhw & _NHM_UNC_ATTR_O) && reg.nhm_unc.usel_occ)
|
|
Packit Service |
a1973e |
return PFM_ERR_ATTR_SET;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* check that there is at least of unit mask in each unit
|
|
Packit Service |
a1973e |
* mask group
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
if ((ugrpmsk != grpmsk && !intel_x86_eflag(this, e->event, INTEL_X86_GRP_EXCL)) || ugrpmsk == 0) {
|
|
Packit Service |
a1973e |
ugrpmsk ^= grpmsk;
|
|
Packit Service |
a1973e |
ret = pfm_intel_x86_add_defaults(this, e, ugrpmsk, &umask, -1, -1);
|
|
Packit Service |
a1973e |
if (ret != PFM_SUCCESS)
|
|
Packit Service |
a1973e |
return ret;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (modmsk_r && (umodmsk ^ modmsk_r)) {
|
|
Packit Service |
a1973e |
DPRINT("required modifiers missing: 0x%x\n", modmsk_r);
|
|
Packit Service |
a1973e |
return PFM_ERR_ATTR;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
evt_strcat(e->fstr, "%s", pe[e->event].name);
|
|
Packit Service |
a1973e |
pfmlib_sort_attr(e);
|
|
Packit Service |
a1973e |
for(k=0; k < e->nattrs; k++) {
|
|
Packit Service |
a1973e |
a = attr(e, k);
|
|
Packit Service |
a1973e |
if (a->ctrl != PFM_ATTR_CTRL_PMU)
|
|
Packit Service |
a1973e |
continue;
|
|
Packit Service |
a1973e |
if (a->type == PFM_ATTR_UMASK)
|
|
Packit Service |
a1973e |
evt_strcat(e->fstr, ":%s", pe[e->event].umasks[a->idx].uname);
|
|
Packit Service |
a1973e |
else if (a->type == PFM_ATTR_RAW_UMASK)
|
|
Packit Service |
a1973e |
evt_strcat(e->fstr, ":0x%x", a->idx);
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
reg.val |= umask << 8;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_en = 1; /* force enable bit to 1 */
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_int = 1; /* force APIC int to 1 */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
e->codes[0] = reg.val;
|
|
Packit Service |
a1973e |
e->count = 1;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
for (k = 0; k < e->npattrs; k++) {
|
|
Packit Service |
a1973e |
int idx;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (e->pattrs[k].ctrl != PFM_ATTR_CTRL_PMU)
|
|
Packit Service |
a1973e |
continue;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (e->pattrs[k].type == PFM_ATTR_UMASK)
|
|
Packit Service |
a1973e |
continue;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
idx = e->pattrs[k].idx;
|
|
Packit Service |
a1973e |
switch(idx) {
|
|
Packit Service |
a1973e |
case NHM_UNC_ATTR_E:
|
|
Packit Service |
a1973e |
evt_strcat(e->fstr, ":%s=%lu", nhm_unc_mods[idx].name, reg.nhm_unc.usel_edge);
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
case NHM_UNC_ATTR_I:
|
|
Packit Service |
a1973e |
evt_strcat(e->fstr, ":%s=%lu", nhm_unc_mods[idx].name, reg.nhm_unc.usel_inv);
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
case NHM_UNC_ATTR_C:
|
|
Packit Service |
a1973e |
evt_strcat(e->fstr, ":%s=%lu", nhm_unc_mods[idx].name, reg.nhm_unc.usel_cnt_mask);
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
case NHM_UNC_ATTR_O:
|
|
Packit Service |
a1973e |
evt_strcat(e->fstr, ":%s=%lu", nhm_unc_mods[idx].name, reg.nhm_unc.usel_occ);
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
__pfm_vbprintf("[UNC_PERFEVTSEL=0x%"PRIx64" event=0x%x umask=0x%x en=%d int=%d inv=%d edge=%d occ=%d cnt_msk=%d] %s\n",
|
|
Packit Service |
a1973e |
reg.val,
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_event,
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_umask,
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_en,
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_int,
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_inv,
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_edge,
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_occ,
|
|
Packit Service |
a1973e |
reg.nhm_unc.usel_cnt_mask,
|
|
Packit Service |
a1973e |
pe[e->event].name);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PFM_SUCCESS;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
pfmlib_pmu_t intel_nhm_unc_support={
|
|
Packit Service |
a1973e |
.desc = "Intel Nehalem uncore",
|
|
Packit Service |
a1973e |
.name = "nhm_unc",
|
|
Packit Service |
a1973e |
.perf_name = "uncore",
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
.pmu = PFM_PMU_INTEL_NHM_UNC,
|
|
Packit Service |
a1973e |
.pme_count = LIBPFM_ARRAY_SIZE(intel_nhm_unc_pe),
|
|
Packit Service |
a1973e |
.type = PFM_PMU_TYPE_UNCORE,
|
|
Packit Service |
a1973e |
.num_cntrs = 8,
|
|
Packit Service |
a1973e |
.num_fixed_cntrs = 1,
|
|
Packit Service |
a1973e |
.max_encoding = 1,
|
|
Packit Service |
a1973e |
.pe = intel_nhm_unc_pe,
|
|
Packit Service |
a1973e |
.atdesc = nhm_unc_mods,
|
|
Packit Service |
a1973e |
.flags = PFMLIB_PMU_FL_RAW_UMASK,
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
.cpu_family = 6,
|
|
Packit Service |
a1973e |
.cpu_models = nhm_models,
|
|
Packit Service |
a1973e |
.pmu_detect = pfm_intel_x86_model_detect,
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
.get_event_encoding[PFM_OS_NONE] = pfm_nhm_unc_get_encoding,
|
|
Packit Service |
a1973e |
PFMLIB_ENCODE_PERF(pfm_intel_nhm_unc_get_perf_encoding),
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
.get_event_first = pfm_intel_x86_get_event_first,
|
|
Packit Service |
a1973e |
.get_event_next = pfm_intel_x86_get_event_next,
|
|
Packit Service |
a1973e |
.event_is_valid = pfm_intel_x86_event_is_valid,
|
|
Packit Service |
a1973e |
.validate_table = pfm_intel_x86_validate_table,
|
|
Packit Service |
a1973e |
.get_event_info = pfm_intel_x86_get_event_info,
|
|
Packit Service |
a1973e |
.get_event_attr_info = pfm_intel_x86_get_event_attr_info,
|
|
Packit Service |
a1973e |
PFMLIB_VALID_PERF_PATTRS(pfm_intel_x86_perf_validate_pattrs),
|
|
Packit Service |
a1973e |
.get_event_nattrs = pfm_intel_x86_get_event_nattrs,
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
pfmlib_pmu_t intel_wsm_unc_support={
|
|
Packit Service |
a1973e |
.desc = "Intel Westmere uncore",
|
|
Packit Service |
a1973e |
.name = "wsm_unc",
|
|
Packit Service |
a1973e |
.perf_name = "uncore",
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
.pmu = PFM_PMU_INTEL_WSM_UNC,
|
|
Packit Service |
a1973e |
.pme_count = LIBPFM_ARRAY_SIZE(intel_wsm_unc_pe),
|
|
Packit Service |
a1973e |
.type = PFM_PMU_TYPE_UNCORE,
|
|
Packit Service |
a1973e |
.num_cntrs = 8,
|
|
Packit Service |
a1973e |
.num_fixed_cntrs = 1,
|
|
Packit Service |
a1973e |
.max_encoding = 1,
|
|
Packit Service |
a1973e |
.pe = intel_wsm_unc_pe,
|
|
Packit Service |
a1973e |
.atdesc = nhm_unc_mods,
|
|
Packit Service |
a1973e |
.flags = PFMLIB_PMU_FL_RAW_UMASK,
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
.cpu_family = 6,
|
|
Packit Service |
a1973e |
.cpu_models = wsm_dp_models,
|
|
Packit Service |
a1973e |
.pmu_detect = pfm_intel_x86_model_detect,
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
.get_event_encoding[PFM_OS_NONE] = pfm_nhm_unc_get_encoding,
|
|
Packit Service |
a1973e |
PFMLIB_ENCODE_PERF(pfm_intel_nhm_unc_get_perf_encoding),
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
.get_event_first = pfm_intel_x86_get_event_first,
|
|
Packit Service |
a1973e |
.get_event_next = pfm_intel_x86_get_event_next,
|
|
Packit Service |
a1973e |
.event_is_valid = pfm_intel_x86_event_is_valid,
|
|
Packit Service |
a1973e |
.validate_table = pfm_intel_x86_validate_table,
|
|
Packit Service |
a1973e |
.get_event_info = pfm_intel_x86_get_event_info,
|
|
Packit Service |
a1973e |
.get_event_attr_info = pfm_intel_x86_get_event_attr_info,
|
|
Packit Service |
a1973e |
PFMLIB_VALID_PERF_PATTRS(pfm_intel_x86_perf_validate_pattrs),
|
|
Packit Service |
a1973e |
.get_event_nattrs = pfm_intel_x86_get_event_nattrs,
|
|
Packit Service |
a1973e |
};
|