diff options
Diffstat (limited to 'arch/x86/kernel/cpu/intel.c')
-rw-r--r-- | arch/x86/kernel/cpu/intel.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index f17c1a714779..8d6d92ebeb54 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
@@ -66,6 +66,32 @@ void check_mpx_erratum(struct cpuinfo_x86 *c) | |||
66 | } | 66 | } |
67 | } | 67 | } |
68 | 68 | ||
69 | /* | ||
70 | * Processors which have self-snooping capability can handle conflicting | ||
71 | * memory type across CPUs by snooping its own cache. However, there exists | ||
72 | * CPU models in which having conflicting memory types still leads to | ||
73 | * unpredictable behavior, machine check errors, or hangs. Clear this | ||
74 | * feature to prevent its use on machines with known erratas. | ||
75 | */ | ||
76 | static void check_memory_type_self_snoop_errata(struct cpuinfo_x86 *c) | ||
77 | { | ||
78 | switch (c->x86_model) { | ||
79 | case INTEL_FAM6_CORE_YONAH: | ||
80 | case INTEL_FAM6_CORE2_MEROM: | ||
81 | case INTEL_FAM6_CORE2_MEROM_L: | ||
82 | case INTEL_FAM6_CORE2_PENRYN: | ||
83 | case INTEL_FAM6_CORE2_DUNNINGTON: | ||
84 | case INTEL_FAM6_NEHALEM: | ||
85 | case INTEL_FAM6_NEHALEM_G: | ||
86 | case INTEL_FAM6_NEHALEM_EP: | ||
87 | case INTEL_FAM6_NEHALEM_EX: | ||
88 | case INTEL_FAM6_WESTMERE: | ||
89 | case INTEL_FAM6_WESTMERE_EP: | ||
90 | case INTEL_FAM6_SANDYBRIDGE: | ||
91 | setup_clear_cpu_cap(X86_FEATURE_SELFSNOOP); | ||
92 | } | ||
93 | } | ||
94 | |||
69 | static bool ring3mwait_disabled __read_mostly; | 95 | static bool ring3mwait_disabled __read_mostly; |
70 | 96 | ||
71 | static int __init ring3mwait_disable(char *__unused) | 97 | static int __init ring3mwait_disable(char *__unused) |
@@ -304,6 +330,7 @@ static void early_init_intel(struct cpuinfo_x86 *c) | |||
304 | } | 330 | } |
305 | 331 | ||
306 | check_mpx_erratum(c); | 332 | check_mpx_erratum(c); |
333 | check_memory_type_self_snoop_errata(c); | ||
307 | 334 | ||
308 | /* | 335 | /* |
309 | * Get the number of SMT siblings early from the extended topology | 336 | * Get the number of SMT siblings early from the extended topology |