|
@@ -285,16 +285,26 @@ static __initconst const u64 westmere_hw_cache_event_ids
|
|
|
},
|
|
|
[ C(LL ) ] = {
|
|
|
[ C(OP_READ) ] = {
|
|
|
- [ C(RESULT_ACCESS) ] = 0x0324, /* L2_RQSTS.LOADS */
|
|
|
- [ C(RESULT_MISS) ] = 0x0224, /* L2_RQSTS.LD_MISS */
|
|
|
+ /* OFFCORE_RESPONSE_0.ANY_DATA.LOCAL_CACHE */
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x01b7,
|
|
|
+ /* OFFCORE_RESPONSE_1.ANY_DATA.ANY_LLC_MISS */
|
|
|
+ [ C(RESULT_MISS) ] = 0x01bb,
|
|
|
},
|
|
|
+ /*
|
|
|
+ * Use RFO, not WRITEBACK, because a write miss would typically occur
|
|
|
+ * on RFO.
|
|
|
+ */
|
|
|
[ C(OP_WRITE) ] = {
|
|
|
- [ C(RESULT_ACCESS) ] = 0x0c24, /* L2_RQSTS.RFOS */
|
|
|
- [ C(RESULT_MISS) ] = 0x0824, /* L2_RQSTS.RFO_MISS */
|
|
|
+ /* OFFCORE_RESPONSE_1.ANY_RFO.LOCAL_CACHE */
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x01bb,
|
|
|
+ /* OFFCORE_RESPONSE_0.ANY_RFO.ANY_LLC_MISS */
|
|
|
+ [ C(RESULT_MISS) ] = 0x01b7,
|
|
|
},
|
|
|
[ C(OP_PREFETCH) ] = {
|
|
|
- [ C(RESULT_ACCESS) ] = 0x4f2e, /* LLC Reference */
|
|
|
- [ C(RESULT_MISS) ] = 0x412e, /* LLC Misses */
|
|
|
+ /* OFFCORE_RESPONSE_0.PREFETCH.LOCAL_CACHE */
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x01b7,
|
|
|
+ /* OFFCORE_RESPONSE_1.PREFETCH.ANY_LLC_MISS */
|
|
|
+ [ C(RESULT_MISS) ] = 0x01bb,
|
|
|
},
|
|
|
},
|
|
|
[ C(DTLB) ] = {
|
|
@@ -341,6 +351,39 @@ static __initconst const u64 westmere_hw_cache_event_ids
|
|
|
},
|
|
|
};
|
|
|
|
|
|
+/*
|
|
|
+ * OFFCORE_RESPONSE MSR bits (subset), See IA32 SDM Vol 3 30.6.1.3
|
|
|
+ */
|
|
|
+
|
|
|
+#define DMND_DATA_RD (1 << 0)
|
|
|
+#define DMND_RFO (1 << 1)
|
|
|
+#define DMND_WB (1 << 3)
|
|
|
+#define PF_DATA_RD (1 << 4)
|
|
|
+#define PF_DATA_RFO (1 << 5)
|
|
|
+#define RESP_UNCORE_HIT (1 << 8)
|
|
|
+#define RESP_MISS (0xf600) /* non uncore hit */
|
|
|
+
|
|
|
+static __initconst const u64 nehalem_hw_cache_extra_regs
|
|
|
+ [PERF_COUNT_HW_CACHE_MAX]
|
|
|
+ [PERF_COUNT_HW_CACHE_OP_MAX]
|
|
|
+ [PERF_COUNT_HW_CACHE_RESULT_MAX] =
|
|
|
+{
|
|
|
+ [ C(LL ) ] = {
|
|
|
+ [ C(OP_READ) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = DMND_DATA_RD|RESP_UNCORE_HIT,
|
|
|
+ [ C(RESULT_MISS) ] = DMND_DATA_RD|RESP_MISS,
|
|
|
+ },
|
|
|
+ [ C(OP_WRITE) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = DMND_RFO|DMND_WB|RESP_UNCORE_HIT,
|
|
|
+ [ C(RESULT_MISS) ] = DMND_RFO|DMND_WB|RESP_MISS,
|
|
|
+ },
|
|
|
+ [ C(OP_PREFETCH) ] = {
|
|
|
+ [ C(RESULT_ACCESS) ] = PF_DATA_RD|PF_DATA_RFO|RESP_UNCORE_HIT,
|
|
|
+ [ C(RESULT_MISS) ] = PF_DATA_RD|PF_DATA_RFO|RESP_MISS,
|
|
|
+ },
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
static __initconst const u64 nehalem_hw_cache_event_ids
|
|
|
[PERF_COUNT_HW_CACHE_MAX]
|
|
|
[PERF_COUNT_HW_CACHE_OP_MAX]
|
|
@@ -376,16 +419,26 @@ static __initconst const u64 nehalem_hw_cache_event_ids
|
|
|
},
|
|
|
[ C(LL ) ] = {
|
|
|
[ C(OP_READ) ] = {
|
|
|
- [ C(RESULT_ACCESS) ] = 0x0324, /* L2_RQSTS.LOADS */
|
|
|
- [ C(RESULT_MISS) ] = 0x0224, /* L2_RQSTS.LD_MISS */
|
|
|
+ /* OFFCORE_RESPONSE.ANY_DATA.LOCAL_CACHE */
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x01b7,
|
|
|
+ /* OFFCORE_RESPONSE.ANY_DATA.ANY_LLC_MISS */
|
|
|
+ [ C(RESULT_MISS) ] = 0x01b7,
|
|
|
},
|
|
|
+ /*
|
|
|
+ * Use RFO, not WRITEBACK, because a write miss would typically occur
|
|
|
+ * on RFO.
|
|
|
+ */
|
|
|
[ C(OP_WRITE) ] = {
|
|
|
- [ C(RESULT_ACCESS) ] = 0x0c24, /* L2_RQSTS.RFOS */
|
|
|
- [ C(RESULT_MISS) ] = 0x0824, /* L2_RQSTS.RFO_MISS */
|
|
|
+ /* OFFCORE_RESPONSE.ANY_RFO.LOCAL_CACHE */
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x01b7,
|
|
|
+ /* OFFCORE_RESPONSE.ANY_RFO.ANY_LLC_MISS */
|
|
|
+ [ C(RESULT_MISS) ] = 0x01b7,
|
|
|
},
|
|
|
[ C(OP_PREFETCH) ] = {
|
|
|
- [ C(RESULT_ACCESS) ] = 0x4f2e, /* LLC Reference */
|
|
|
- [ C(RESULT_MISS) ] = 0x412e, /* LLC Misses */
|
|
|
+ /* OFFCORE_RESPONSE.PREFETCH.LOCAL_CACHE */
|
|
|
+ [ C(RESULT_ACCESS) ] = 0x01b7,
|
|
|
+ /* OFFCORE_RESPONSE.PREFETCH.ANY_LLC_MISS */
|
|
|
+ [ C(RESULT_MISS) ] = 0x01b7,
|
|
|
},
|
|
|
},
|
|
|
[ C(DTLB) ] = {
|
|
@@ -1340,6 +1393,8 @@ static __init int intel_pmu_init(void)
|
|
|
case 46: /* 45 nm nehalem-ex, "Beckton" */
|
|
|
memcpy(hw_cache_event_ids, nehalem_hw_cache_event_ids,
|
|
|
sizeof(hw_cache_event_ids));
|
|
|
+ memcpy(hw_cache_extra_regs, nehalem_hw_cache_extra_regs,
|
|
|
+ sizeof(hw_cache_extra_regs));
|
|
|
|
|
|
intel_pmu_lbr_init_nhm();
|
|
|
|
|
@@ -1366,6 +1421,8 @@ static __init int intel_pmu_init(void)
|
|
|
case 44: /* 32 nm nehalem, "Gulftown" */
|
|
|
memcpy(hw_cache_event_ids, westmere_hw_cache_event_ids,
|
|
|
sizeof(hw_cache_event_ids));
|
|
|
+ memcpy(hw_cache_extra_regs, nehalem_hw_cache_extra_regs,
|
|
|
+ sizeof(hw_cache_extra_regs));
|
|
|
|
|
|
intel_pmu_lbr_init_nhm();
|
|
|
|