|
@@ -1702,30 +1702,35 @@ static int __mcheck_cpu_ancient_init(struct cpuinfo_x86 *c)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void __mcheck_cpu_init_vendor(struct cpuinfo_x86 *c)
|
|
|
+/*
|
|
|
+ * Init basic CPU features needed for early decoding of MCEs.
|
|
|
+ */
|
|
|
+static void __mcheck_cpu_init_early(struct cpuinfo_x86 *c)
|
|
|
{
|
|
|
- switch (c->x86_vendor) {
|
|
|
- case X86_VENDOR_INTEL:
|
|
|
- mce_intel_feature_init(c);
|
|
|
- mce_adjust_timer = cmci_intel_adjust_timer;
|
|
|
- break;
|
|
|
-
|
|
|
- case X86_VENDOR_AMD: {
|
|
|
+ if (c->x86_vendor == X86_VENDOR_AMD) {
|
|
|
mce_flags.overflow_recov = !!cpu_has(c, X86_FEATURE_OVERFLOW_RECOV);
|
|
|
mce_flags.succor = !!cpu_has(c, X86_FEATURE_SUCCOR);
|
|
|
mce_flags.smca = !!cpu_has(c, X86_FEATURE_SMCA);
|
|
|
|
|
|
- /*
|
|
|
- * Install proper ops for Scalable MCA enabled processors
|
|
|
- */
|
|
|
if (mce_flags.smca) {
|
|
|
msr_ops.ctl = smca_ctl_reg;
|
|
|
msr_ops.status = smca_status_reg;
|
|
|
msr_ops.addr = smca_addr_reg;
|
|
|
msr_ops.misc = smca_misc_reg;
|
|
|
}
|
|
|
- mce_amd_feature_init(c);
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
+static void __mcheck_cpu_init_vendor(struct cpuinfo_x86 *c)
|
|
|
+{
|
|
|
+ switch (c->x86_vendor) {
|
|
|
+ case X86_VENDOR_INTEL:
|
|
|
+ mce_intel_feature_init(c);
|
|
|
+ mce_adjust_timer = cmci_intel_adjust_timer;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case X86_VENDOR_AMD: {
|
|
|
+ mce_amd_feature_init(c);
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -1812,6 +1817,7 @@ void mcheck_cpu_init(struct cpuinfo_x86 *c)
|
|
|
|
|
|
machine_check_vector = do_machine_check;
|
|
|
|
|
|
+ __mcheck_cpu_init_early(c);
|
|
|
__mcheck_cpu_init_generic();
|
|
|
__mcheck_cpu_init_vendor(c);
|
|
|
__mcheck_cpu_init_clear_banks();
|