|
@@ -76,6 +76,19 @@ static struct event_constraint intel_westmere_event_constraints[] =
|
|
|
EVENT_CONSTRAINT_END
|
|
|
};
|
|
|
|
|
|
+static struct event_constraint intel_snb_event_constraints[] =
|
|
|
+{
|
|
|
+ FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */
|
|
|
+ FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */
|
|
|
+ /* FIXED_EVENT_CONSTRAINT(0x013c, 2), CPU_CLK_UNHALTED.REF */
|
|
|
+ INTEL_EVENT_CONSTRAINT(0x48, 0x4), /* L1D_PEND_MISS.PENDING */
|
|
|
+ INTEL_EVENT_CONSTRAINT(0xb7, 0x1), /* OFF_CORE_RESPONSE_0 */
|
|
|
+ INTEL_EVENT_CONSTRAINT(0xbb, 0x8), /* OFF_CORE_RESPONSE_1 */
|
|
|
+ INTEL_UEVENT_CONSTRAINT(0x01c0, 0x2), /* INST_RETIRED.PREC_DIST */
|
|
|
+ INTEL_EVENT_CONSTRAINT(0xcd, 0x8), /* MEM_TRANS_RETIRED.LOAD_LATENCY */
|
|
|
+ EVENT_CONSTRAINT_END
|
|
|
+};
|
|
|
+
|
|
|
static struct event_constraint intel_gen_event_constraints[] =
|
|
|
{
|
|
|
FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */
|
|
@@ -89,6 +102,106 @@ static u64 intel_pmu_event_map(int hw_event)
|
|
|
return intel_perfmon_event_map[hw_event];
|
|
|
}
|
|
|
|
|
|
+static __initconst const u64 snb_hw_cache_event_ids
|
|
|
+ [PERF_COUNT_HW_CACHE_MAX]
|
|
|
+ [PERF_COUNT_HW_CACHE_OP_MAX]
|
|
|
+ [PERF_COUNT_HW_CACHE_RESULT_MAX] =
|
|
|
+{
|
|
|
+ [ C(L1D) ] = {
|
|
|
+ [ C(OP_READ) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = 0xf1d0, /* MEM_UOP_RETIRED.LOADS */
|
|
|
+ [ C(RESULT_MISS) ] = 0x0151, /* L1D.REPLACEMENT */
|
|
|
+ },
|
|
|
+ [ C(OP_WRITE) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = 0xf2d0, /* MEM_UOP_RETIRED.STORES */
|
|
|
+ [ C(RESULT_MISS) ] = 0x0851, /* L1D.ALL_M_REPLACEMENT */
|
|
|
+ },
|
|
|
+ [ C(OP_PREFETCH) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x0,
|
|
|
+ [ C(RESULT_MISS) ] = 0x024e, /* HW_PRE_REQ.DL1_MISS */
|
|
|
+ },
|
|
|
+ },
|
|
|
+ [ C(L1I ) ] = {
|
|
|
+ [ C(OP_READ) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x0,
|
|
|
+ [ C(RESULT_MISS) ] = 0x0280, /* ICACHE.MISSES */
|
|
|
+ },
|
|
|
+ [ C(OP_WRITE) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = -1,
|
|
|
+ [ C(RESULT_MISS) ] = -1,
|
|
|
+ },
|
|
|
+ [ C(OP_PREFETCH) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x0,
|
|
|
+ [ C(RESULT_MISS) ] = 0x0,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ [ C(LL ) ] = {
|
|
|
+ /*
|
|
|
+ * TBD: Need Off-core Response Performance Monitoring support
|
|
|
+ */
|
|
|
+ [ C(OP_READ) ] = {
|
|
|
+ /* OFFCORE_RESPONSE_0.ANY_DATA.LOCAL_CACHE */
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x01b7,
|
|
|
+ /* OFFCORE_RESPONSE_1.ANY_DATA.ANY_LLC_MISS */
|
|
|
+ [ C(RESULT_MISS) ] = 0x01bb,
|
|
|
+ },
|
|
|
+ [ C(OP_WRITE) ] = {
|
|
|
+ /* OFFCORE_RESPONSE_0.ANY_RFO.LOCAL_CACHE */
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x01b7,
|
|
|
+ /* OFFCORE_RESPONSE_1.ANY_RFO.ANY_LLC_MISS */
|
|
|
+ [ C(RESULT_MISS) ] = 0x01bb,
|
|
|
+ },
|
|
|
+ [ C(OP_PREFETCH) ] = {
|
|
|
+ /* OFFCORE_RESPONSE_0.PREFETCH.LOCAL_CACHE */
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x01b7,
|
|
|
+ /* OFFCORE_RESPONSE_1.PREFETCH.ANY_LLC_MISS */
|
|
|
+ [ C(RESULT_MISS) ] = 0x01bb,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ [ C(DTLB) ] = {
|
|
|
+ [ C(OP_READ) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x81d0, /* MEM_UOP_RETIRED.ALL_LOADS */
|
|
|
+ [ C(RESULT_MISS) ] = 0x0108, /* DTLB_LOAD_MISSES.CAUSES_A_WALK */
|
|
|
+ },
|
|
|
+ [ C(OP_WRITE) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x82d0, /* MEM_UOP_RETIRED.ALL_STORES */
|
|
|
+ [ C(RESULT_MISS) ] = 0x0149, /* DTLB_STORE_MISSES.MISS_CAUSES_A_WALK */
|
|
|
+ },
|
|
|
+ [ C(OP_PREFETCH) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x0,
|
|
|
+ [ C(RESULT_MISS) ] = 0x0,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ [ C(ITLB) ] = {
|
|
|
+ [ C(OP_READ) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x1085, /* ITLB_MISSES.STLB_HIT */
|
|
|
+ [ C(RESULT_MISS) ] = 0x0185, /* ITLB_MISSES.CAUSES_A_WALK */
|
|
|
+ },
|
|
|
+ [ C(OP_WRITE) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = -1,
|
|
|
+ [ C(RESULT_MISS) ] = -1,
|
|
|
+ },
|
|
|
+ [ C(OP_PREFETCH) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = -1,
|
|
|
+ [ C(RESULT_MISS) ] = -1,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ [ C(BPU ) ] = {
|
|
|
+ [ C(OP_READ) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x00c4, /* BR_INST_RETIRED.ALL_BRANCHES */
|
|
|
+ [ C(RESULT_MISS) ] = 0x00c5, /* BR_MISP_RETIRED.ALL_BRANCHES */
|
|
|
+ },
|
|
|
+ [ C(OP_WRITE) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = -1,
|
|
|
+ [ C(RESULT_MISS) ] = -1,
|
|
|
+ },
|
|
|
+ [ C(OP_PREFETCH) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = -1,
|
|
|
+ [ C(RESULT_MISS) ] = -1,
|
|
|
+ },
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
static __initconst const u64 westmere_hw_cache_event_ids
|
|
|
[PERF_COUNT_HW_CACHE_MAX]
|
|
|
[PERF_COUNT_HW_CACHE_OP_MAX]
|
|
@@ -1062,6 +1175,17 @@ static __init int intel_pmu_init(void)
|
|
|
pr_cont("Westmere events, ");
|
|
|
break;
|
|
|
|
|
|
+ case 42: /* SandyBridge */
|
|
|
+ memcpy(hw_cache_event_ids, snb_hw_cache_event_ids,
|
|
|
+ sizeof(hw_cache_event_ids));
|
|
|
+
|
|
|
+ intel_pmu_lbr_init_nhm();
|
|
|
+
|
|
|
+ x86_pmu.event_constraints = intel_snb_event_constraints;
|
|
|
+ x86_pmu.pebs_constraints = intel_snb_pebs_events;
|
|
|
+ pr_cont("SandyBridge events, ");
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
/*
|
|
|
* default constraints for v2 and up
|