aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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,