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/cpu | |
| 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/cpu')
| -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 2cf23634b6d..4e581fdc0a5 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 83492b1f93b..0f8656361e0 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 8ea6929e974..20ce03acf04 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 |
