aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKan Liang <kan.liang@linux.intel.com>2018-08-08 03:12:08 -0400
committerIngo Molnar <mingo@kernel.org>2018-10-02 04:14:33 -0400
commit7c5314b88da6d5af98239786772a1c44cc5eb67d (patch)
tree05d2b10abde07b393ea7be360fbb565efd9fadde
parentf2c4db1bd80720cd8cb2a5aa220d9bc9f374f04e (diff)
perf/x86/intel: Add quirk for Goldmont Plus
A ucode patch is needed for Goldmont Plus while counter freezing feature is enabled. Otherwise, there will be some issues, e.g. PMI flood with some events. Add a quirk to check microcode version. If the system starts with the wrong ucode, leave the counter-freezing feature permanently disabled. Signed-off-by: Kan Liang <kan.liang@linux.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> Cc: acme@kernel.org Link: http://lkml.kernel.org/r/1533712328-2834-3-git-send-email-kan.liang@linux.intel.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--arch/x86/events/intel/core.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index f17cf6c3ec6f..ab01ef9ddd77 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -3839,6 +3839,40 @@ static __init void intel_nehalem_quirk(void)
3839 } 3839 }
3840} 3840}
3841 3841
3842static bool intel_glp_counter_freezing_broken(int cpu)
3843{
3844 u32 rev = UINT_MAX; /* default to broken for unknown stepping */
3845
3846 switch (cpu_data(cpu).x86_stepping) {
3847 case 1:
3848 rev = 0x28;
3849 break;
3850 case 8:
3851 rev = 0x6;
3852 break;
3853 }
3854
3855 return (cpu_data(cpu).microcode < rev);
3856}
3857
3858static __init void intel_glp_counter_freezing_quirk(void)
3859{
3860 /* Check if it's already disabled */
3861 if (disable_counter_freezing)
3862 return;
3863
3864 /*
3865 * If the system starts with the wrong ucode, leave the
3866 * counter-freezing feature permanently disabled.
3867 */
3868 if (intel_glp_counter_freezing_broken(raw_smp_processor_id())) {
3869 pr_info("PMU counter freezing disabled due to CPU errata,"
3870 "please upgrade microcode\n");
3871 x86_pmu.counter_freezing = false;
3872 x86_pmu.handle_irq = intel_pmu_handle_irq;
3873 }
3874}
3875
3842/* 3876/*
3843 * enable software workaround for errata: 3877 * enable software workaround for errata:
3844 * SNB: BJ122 3878 * SNB: BJ122
@@ -4188,6 +4222,7 @@ __init int intel_pmu_init(void)
4188 break; 4222 break;
4189 4223
4190 case INTEL_FAM6_ATOM_GOLDMONT_PLUS: 4224 case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
4225 x86_add_quirk(intel_glp_counter_freezing_quirk);
4191 memcpy(hw_cache_event_ids, glp_hw_cache_event_ids, 4226 memcpy(hw_cache_event_ids, glp_hw_cache_event_ids,
4192 sizeof(hw_cache_event_ids)); 4227 sizeof(hw_cache_event_ids));
4193 memcpy(hw_cache_extra_regs, glp_hw_cache_extra_regs, 4228 memcpy(hw_cache_extra_regs, glp_hw_cache_extra_regs,