There are 2 code paths leading to mce_amd_feature_init() as below.
1) S5 -> S0: (boot)
secondary_startup_64 -> start_kernel -> identify_boot_cpu ->
identify_cpu ->
mcheck_cpu_init (calls  __mcheck_cpu_apply_quirks before) ->
mce_amd_feature_init

2) S3 -> S0: (resume)
syscore_resume -> mce_syscore_resume -> mce_amd_feature_init

Its clear that the quirks are not applied in S3 -> S0 path, hence apply
the same.

Signed-off-by: Shirish S <[email protected]>
---
 arch/x86/kernel/cpu/mce/amd.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/arch/x86/kernel/cpu/mce/amd.c b/arch/x86/kernel/cpu/mce/amd.c
index 89298c8..ab1b12a 100644
--- a/arch/x86/kernel/cpu/mce/amd.c
+++ b/arch/x86/kernel/cpu/mce/amd.c
@@ -552,6 +552,12 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c)
        unsigned int bank, block, cpu = smp_processor_id();
        int offset = -1;
 
+       /*
+        * mcheck_cpu_init() is not called when called by mce_syscore_resume(),
+        * hence re-apply quirks, to be on safer side.
+        */
+       quirk_fam15_mc4_misc_thresholding();
+
        for (bank = 0; bank < mca_cfg.banks; ++bank) {
                if (mce_flags.smca)
                        smca_configure(bank, cpu);
-- 
2.7.4

Reply via email to