aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndi Kleen <ak@linux.intel.com>2015-02-17 21:18:05 -0500
committerIngo Molnar <mingo@kernel.org>2015-03-27 04:14:02 -0400
commit91f1b70582c62576f429cf78d53751c66677553d (patch)
tree0bd60ffd5bf6c787cdc97aaeffb2e65defe57ff8
parent0f1b5ca240c65ed9533f193720f337bf24fb2f2f (diff)
perf/x86/intel: Add Broadwell core support
Add Broadwell support for Broadwell to perf. The basic support is very similar to Haswell. We use the new cache event list added for Haswell earlier. The only differences are a few bits related to remote nodes. To avoid an extra, mostly identical, table these are patched up in the initialization code. The constraint list has one new event that needs to be handled over Haswell. Includes code and testing from Kan Liang. Signed-off-by: Andi Kleen <ak@linux.intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: http://lkml.kernel.org/r/1424225886-18652-2-git-send-email-andi@firstfloor.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--arch/x86/kernel/cpu/perf_event_intel.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c
index 5ef64bf88ecd..28838536a9f7 100644
--- a/arch/x86/kernel/cpu/perf_event_intel.c
+++ b/arch/x86/kernel/cpu/perf_event_intel.c
@@ -220,6 +220,15 @@ static struct event_constraint intel_hsw_event_constraints[] = {
220 EVENT_CONSTRAINT_END 220 EVENT_CONSTRAINT_END
221}; 221};
222 222
223struct event_constraint intel_bdw_event_constraints[] = {
224 FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */
225 FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */
226 FIXED_EVENT_CONSTRAINT(0x0300, 2), /* CPU_CLK_UNHALTED.REF */
227 INTEL_UEVENT_CONSTRAINT(0x148, 0x4), /* L1D_PEND_MISS.PENDING */
228 INTEL_EVENT_CONSTRAINT(0xa3, 0x4), /* CYCLE_ACTIVITY.* */
229 EVENT_CONSTRAINT_END
230};
231
223static u64 intel_pmu_event_map(int hw_event) 232static u64 intel_pmu_event_map(int hw_event)
224{ 233{
225 return intel_perfmon_event_map[hw_event]; 234 return intel_perfmon_event_map[hw_event];
@@ -453,6 +462,12 @@ static __initconst const u64 snb_hw_cache_event_ids
453 HSW_L3_MISS_REMOTE_HOP1|HSW_L3_MISS_REMOTE_HOP2P) 462 HSW_L3_MISS_REMOTE_HOP1|HSW_L3_MISS_REMOTE_HOP2P)
454#define HSW_LLC_ACCESS HSW_ANY_RESPONSE 463#define HSW_LLC_ACCESS HSW_ANY_RESPONSE
455 464
465#define BDW_L3_MISS_LOCAL BIT(26)
466#define BDW_L3_MISS (BDW_L3_MISS_LOCAL| \
467 HSW_L3_MISS_REMOTE_HOP0|HSW_L3_MISS_REMOTE_HOP1| \
468 HSW_L3_MISS_REMOTE_HOP2P)
469
470
456static __initconst const u64 hsw_hw_cache_event_ids 471static __initconst const u64 hsw_hw_cache_event_ids
457 [PERF_COUNT_HW_CACHE_MAX] 472 [PERF_COUNT_HW_CACHE_MAX]
458 [PERF_COUNT_HW_CACHE_OP_MAX] 473 [PERF_COUNT_HW_CACHE_OP_MAX]
@@ -2730,6 +2745,38 @@ __init int intel_pmu_init(void)
2730 pr_cont("Haswell events, "); 2745 pr_cont("Haswell events, ");
2731 break; 2746 break;
2732 2747
2748 case 61: /* 14nm Broadwell Core-M */
2749 case 86: /* 14nm Broadwell Xeon D */
2750 x86_pmu.late_ack = true;
2751 memcpy(hw_cache_event_ids, hsw_hw_cache_event_ids, sizeof(hw_cache_event_ids));
2752 memcpy(hw_cache_extra_regs, hsw_hw_cache_extra_regs, sizeof(hw_cache_extra_regs));
2753
2754 /* L3_MISS_LOCAL_DRAM is BIT(26) in Broadwell */
2755 hw_cache_extra_regs[C(LL)][C(OP_READ)][C(RESULT_MISS)] = HSW_DEMAND_READ |
2756 BDW_L3_MISS|HSW_SNOOP_DRAM;
2757 hw_cache_extra_regs[C(LL)][C(OP_WRITE)][C(RESULT_MISS)] = HSW_DEMAND_WRITE|BDW_L3_MISS|
2758 HSW_SNOOP_DRAM;
2759 hw_cache_extra_regs[C(NODE)][C(OP_READ)][C(RESULT_ACCESS)] = HSW_DEMAND_READ|
2760 BDW_L3_MISS_LOCAL|HSW_SNOOP_DRAM;
2761 hw_cache_extra_regs[C(NODE)][C(OP_WRITE)][C(RESULT_ACCESS)] = HSW_DEMAND_WRITE|
2762 BDW_L3_MISS_LOCAL|HSW_SNOOP_DRAM;
2763
2764 intel_pmu_lbr_init_snb();
2765
2766 x86_pmu.event_constraints = intel_bdw_event_constraints;
2767 x86_pmu.pebs_constraints = intel_hsw_pebs_event_constraints;
2768 x86_pmu.extra_regs = intel_snbep_extra_regs;
2769 x86_pmu.pebs_aliases = intel_pebs_aliases_snb;
2770 /* all extra regs are per-cpu when HT is on */
2771 x86_pmu.er_flags |= ERF_HAS_RSP_1;
2772 x86_pmu.er_flags |= ERF_NO_HT_SHARING;
2773
2774 x86_pmu.hw_config = hsw_hw_config;
2775 x86_pmu.get_event_constraints = hsw_get_event_constraints;
2776 x86_pmu.cpu_events = hsw_events_attrs;
2777 pr_cont("Broadwell events, ");
2778 break;
2779
2733 default: 2780 default:
2734 switch (x86_pmu.version) { 2781 switch (x86_pmu.version) {
2735 case 1: 2782 case 1: