diff options
author | H. Peter Anvin <hpa@linux.intel.com> | 2009-01-22 19:17:05 -0500 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2009-01-23 21:07:45 -0500 |
commit | 75a048119e76540d73132cfc8e0fa0c0a8bb6c83 (patch) | |
tree | 2a4d88809efae435e6fe8e33e630f92d76742c9d /arch/x86/kernel | |
parent | b1882e68d17a93b523dce09c3a181319aace2f0e (diff) |
x86: handle PAT more like other CPU features
Impact: Cleanup
When PAT was originally introduced, it was handled specially for a few
reasons:
- PAT bugs are hard to track down, so we wanted to maintain a
whitelist of CPUs.
- The i386 and x86-64 CPUID code was not yet unified.
Both of these are now obsolete, so handle PAT like any other features,
including ordinary feature blacklisting due to known bugs.
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/cpu/addon_cpuid_features.c | 34 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/common.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/intel.c | 12 |
3 files changed, 12 insertions, 36 deletions
diff --git a/arch/x86/kernel/cpu/addon_cpuid_features.c b/arch/x86/kernel/cpu/addon_cpuid_features.c index 2cf23634b6d9..4e581fdc0a5a 100644 --- a/arch/x86/kernel/cpu/addon_cpuid_features.c +++ b/arch/x86/kernel/cpu/addon_cpuid_features.c | |||
@@ -143,37 +143,3 @@ void __cpuinit detect_extended_topology(struct cpuinfo_x86 *c) | |||
143 | return; | 143 | return; |
144 | #endif | 144 | #endif |
145 | } | 145 | } |
146 | |||
147 | #ifdef CONFIG_X86_PAT | ||
148 | void __cpuinit validate_pat_support(struct cpuinfo_x86 *c) | ||
149 | { | ||
150 | if (!cpu_has_pat) | ||
151 | pat_disable("PAT not supported by CPU."); | ||
152 | |||
153 | switch (c->x86_vendor) { | ||
154 | case X86_VENDOR_INTEL: | ||
155 | /* | ||
156 | * There is a known erratum on Pentium III and Core Solo | ||
157 | * and Core Duo CPUs. | ||
158 | * " Page with PAT set to WC while associated MTRR is UC | ||
159 | * may consolidate to UC " | ||
160 | * Because of this erratum, it is better to stick with | ||
161 | * setting WC in MTRR rather than using PAT on these CPUs. | ||
162 | * | ||
163 | * Enable PAT WC only on P4, Core 2 or later CPUs. | ||
164 | */ | ||
165 | if (c->x86 > 0x6 || (c->x86 == 6 && c->x86_model >= 15)) | ||
166 | return; | ||
167 | |||
168 | pat_disable("PAT WC disabled due to known CPU erratum."); | ||
169 | return; | ||
170 | |||
171 | case X86_VENDOR_AMD: | ||
172 | case X86_VENDOR_CENTAUR: | ||
173 | case X86_VENDOR_TRANSMETA: | ||
174 | return; | ||
175 | } | ||
176 | |||
177 | pat_disable("PAT disabled. Not yet verified on this CPU type."); | ||
178 | } | ||
179 | #endif | ||
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 83492b1f93b1..0f8656361e04 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -570,8 +570,6 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c) | |||
570 | if (this_cpu->c_early_init) | 570 | if (this_cpu->c_early_init) |
571 | this_cpu->c_early_init(c); | 571 | this_cpu->c_early_init(c); |
572 | 572 | ||
573 | validate_pat_support(c); | ||
574 | |||
575 | #ifdef CONFIG_SMP | 573 | #ifdef CONFIG_SMP |
576 | c->cpu_index = boot_cpu_id; | 574 | c->cpu_index = boot_cpu_id; |
577 | #endif | 575 | #endif |
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 8ea6929e974c..20ce03acf04b 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
@@ -50,6 +50,18 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) | |||
50 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); | 50 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); |
51 | } | 51 | } |
52 | 52 | ||
53 | /* | ||
54 | * There is a known erratum on Pentium III and Core Solo | ||
55 | * and Core Duo CPUs. | ||
56 | * " Page with PAT set to WC while associated MTRR is UC | ||
57 | * may consolidate to UC " | ||
58 | * Because of this erratum, it is better to stick with | ||
59 | * setting WC in MTRR rather than using PAT on these CPUs. | ||
60 | * | ||
61 | * Enable PAT WC only on P4, Core 2 or later CPUs. | ||
62 | */ | ||
63 | if (c->x86 == 6 && c->x86_model < 15) | ||
64 | clear_cpu_cap(c, X86_FEATURE_PAT); | ||
53 | } | 65 | } |
54 | 66 | ||
55 | #ifdef CONFIG_X86_32 | 67 | #ifdef CONFIG_X86_32 |