diff options
author | Kan Liang <kan.liang@intel.com> | 2016-04-15 03:53:45 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-04-23 08:12:31 -0400 |
commit | f21d5adceb7f2660e5227569faed278f6fb2072e (patch) | |
tree | 3a69b653bffe6100bbb5a1063f6fa779d61dbf8f | |
parent | 8b92c3a78d40fb220dc5ab122e3274d1b126bfbb (diff) |
perf/x86/intel: Add LBR filter support for Silvermont and Airmont CPUs
LBR filtering is also supported on the Silvermont and Airmont
microarchitectures. The layout of MSR_LBR_SELECT is the same as Nehalem.
Signed-off-by: Kan Liang <kan.liang@intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Link: http://lkml.kernel.org/r/1460706825-46163-1-git-send-email-kan.liang@intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/x86/events/intel/core.c | 2 | ||||
-rw-r--r-- | arch/x86/events/intel/lbr.c | 18 | ||||
-rw-r--r-- | arch/x86/events/perf_event.h | 2 |
3 files changed, 21 insertions, 1 deletions
diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 92fda6bb779e..79b59437f5ee 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c | |||
@@ -3581,7 +3581,7 @@ __init int intel_pmu_init(void) | |||
3581 | memcpy(hw_cache_extra_regs, slm_hw_cache_extra_regs, | 3581 | memcpy(hw_cache_extra_regs, slm_hw_cache_extra_regs, |
3582 | sizeof(hw_cache_extra_regs)); | 3582 | sizeof(hw_cache_extra_regs)); |
3583 | 3583 | ||
3584 | intel_pmu_lbr_init_atom(); | 3584 | intel_pmu_lbr_init_slm(); |
3585 | 3585 | ||
3586 | x86_pmu.event_constraints = intel_slm_event_constraints; | 3586 | x86_pmu.event_constraints = intel_slm_event_constraints; |
3587 | x86_pmu.pebs_constraints = intel_slm_pebs_event_constraints; | 3587 | x86_pmu.pebs_constraints = intel_slm_pebs_event_constraints; |
diff --git a/arch/x86/events/intel/lbr.c b/arch/x86/events/intel/lbr.c index ad26ca770c98..317e29e3869e 100644 --- a/arch/x86/events/intel/lbr.c +++ b/arch/x86/events/intel/lbr.c | |||
@@ -1058,6 +1058,24 @@ void __init intel_pmu_lbr_init_atom(void) | |||
1058 | pr_cont("8-deep LBR, "); | 1058 | pr_cont("8-deep LBR, "); |
1059 | } | 1059 | } |
1060 | 1060 | ||
1061 | /* slm */ | ||
1062 | void __init intel_pmu_lbr_init_slm(void) | ||
1063 | { | ||
1064 | x86_pmu.lbr_nr = 8; | ||
1065 | x86_pmu.lbr_tos = MSR_LBR_TOS; | ||
1066 | x86_pmu.lbr_from = MSR_LBR_CORE_FROM; | ||
1067 | x86_pmu.lbr_to = MSR_LBR_CORE_TO; | ||
1068 | |||
1069 | x86_pmu.lbr_sel_mask = LBR_SEL_MASK; | ||
1070 | x86_pmu.lbr_sel_map = nhm_lbr_sel_map; | ||
1071 | |||
1072 | /* | ||
1073 | * SW branch filter usage: | ||
1074 | * - compensate for lack of HW filter | ||
1075 | */ | ||
1076 | pr_cont("8-deep LBR, "); | ||
1077 | } | ||
1078 | |||
1061 | /* Knights Landing */ | 1079 | /* Knights Landing */ |
1062 | void intel_pmu_lbr_init_knl(void) | 1080 | void intel_pmu_lbr_init_knl(void) |
1063 | { | 1081 | { |
diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h index 8b78481d1e64..7d62a02f49a4 100644 --- a/arch/x86/events/perf_event.h +++ b/arch/x86/events/perf_event.h | |||
@@ -909,6 +909,8 @@ void intel_pmu_lbr_init_nhm(void); | |||
909 | 909 | ||
910 | void intel_pmu_lbr_init_atom(void); | 910 | void intel_pmu_lbr_init_atom(void); |
911 | 911 | ||
912 | void intel_pmu_lbr_init_slm(void); | ||
913 | |||
912 | void intel_pmu_lbr_init_snb(void); | 914 | void intel_pmu_lbr_init_snb(void); |
913 | 915 | ||
914 | void intel_pmu_lbr_init_hsw(void); | 916 | void intel_pmu_lbr_init_hsw(void); |