diff options
author | Yinghai Lu <yhlu.kernel.send@gmail.com> | 2008-03-25 02:24:34 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-17 11:41:20 -0400 |
commit | 9307cacad0dfe3749f00303125c6f7f0523e5616 (patch) | |
tree | bc28bf08dc18dacbb2654a9a368f4e09c580dfab | |
parent | a7c7d0e91daebd7c5e51f9416d612b6a15e7e79a (diff) |
x86: pat cpu feature bit setting for known cpus
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | arch/x86/kernel/cpu/common.c | 25 | ||||
-rw-r--r-- | arch/x86/kernel/setup_64.c | 7 | ||||
-rw-r--r-- | arch/x86/mm/pat.c | 15 |
3 files changed, 34 insertions, 13 deletions
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 0dd87b8d6707..d999d7833bc2 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -309,6 +309,19 @@ static void __cpuinit early_get_cap(struct cpuinfo_x86 *c) | |||
309 | 309 | ||
310 | } | 310 | } |
311 | 311 | ||
312 | clear_cpu_cap(c, X86_FEATURE_PAT); | ||
313 | |||
314 | switch (c->x86_vendor) { | ||
315 | case X86_VENDOR_AMD: | ||
316 | if (c->x86 >= 0xf && c->x86 <= 0x11) | ||
317 | set_cpu_cap(c, X86_FEATURE_PAT); | ||
318 | break; | ||
319 | case X86_VENDOR_INTEL: | ||
320 | if (c->x86 == 0xF || (c->x86 == 6 && c->x86_model >= 15)) | ||
321 | set_cpu_cap(c, X86_FEATURE_PAT); | ||
322 | break; | ||
323 | } | ||
324 | |||
312 | } | 325 | } |
313 | 326 | ||
314 | /* | 327 | /* |
@@ -397,6 +410,18 @@ static void __cpuinit generic_identify(struct cpuinfo_x86 *c) | |||
397 | init_scattered_cpuid_features(c); | 410 | init_scattered_cpuid_features(c); |
398 | } | 411 | } |
399 | 412 | ||
413 | clear_cpu_cap(c, X86_FEATURE_PAT); | ||
414 | |||
415 | switch (c->x86_vendor) { | ||
416 | case X86_VENDOR_AMD: | ||
417 | if (c->x86 >= 0xf && c->x86 <= 0x11) | ||
418 | set_cpu_cap(c, X86_FEATURE_PAT); | ||
419 | break; | ||
420 | case X86_VENDOR_INTEL: | ||
421 | if (c->x86 == 0xF || (c->x86 == 6 && c->x86_model >= 15)) | ||
422 | set_cpu_cap(c, X86_FEATURE_PAT); | ||
423 | break; | ||
424 | } | ||
400 | } | 425 | } |
401 | 426 | ||
402 | static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c) | 427 | static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c) |
diff --git a/arch/x86/kernel/setup_64.c b/arch/x86/kernel/setup_64.c index 20034493b5ad..c6fe1e4bc7c2 100644 --- a/arch/x86/kernel/setup_64.c +++ b/arch/x86/kernel/setup_64.c | |||
@@ -962,12 +962,19 @@ static void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c) | |||
962 | if (c->extended_cpuid_level >= 0x80000007) | 962 | if (c->extended_cpuid_level >= 0x80000007) |
963 | c->x86_power = cpuid_edx(0x80000007); | 963 | c->x86_power = cpuid_edx(0x80000007); |
964 | 964 | ||
965 | |||
966 | clear_cpu_cap(c, X86_FEATURE_PAT); | ||
967 | |||
965 | switch (c->x86_vendor) { | 968 | switch (c->x86_vendor) { |
966 | case X86_VENDOR_AMD: | 969 | case X86_VENDOR_AMD: |
967 | early_init_amd(c); | 970 | early_init_amd(c); |
971 | if (c->x86 >= 0xf && c->x86 <= 0x11) | ||
972 | set_cpu_cap(c, X86_FEATURE_PAT); | ||
968 | break; | 973 | break; |
969 | case X86_VENDOR_INTEL: | 974 | case X86_VENDOR_INTEL: |
970 | early_init_intel(c); | 975 | early_init_intel(c); |
976 | if (c->x86 == 0xF || (c->x86 == 6 && c->x86_model >= 15)) | ||
977 | set_cpu_cap(c, X86_FEATURE_PAT); | ||
971 | break; | 978 | break; |
972 | } | 979 | } |
973 | 980 | ||
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index 0648a2225b09..72c0f6097402 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
@@ -40,19 +40,8 @@ static int pat_known_cpu(void) | |||
40 | if (!pat_wc_enabled) | 40 | if (!pat_wc_enabled) |
41 | return 0; | 41 | return 0; |
42 | 42 | ||
43 | if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && | 43 | if (cpu_has_pat) |
44 | (boot_cpu_data.x86 == 0xF || | 44 | return 1; |
45 | (boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model >= 15))) { | ||
46 | if (cpu_has_pat) { | ||
47 | return 1; | ||
48 | } | ||
49 | } | ||
50 | if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD && | ||
51 | boot_cpu_data.x86 >= 0xf && boot_cpu_data.x86 <= 0x11) { | ||
52 | if (cpu_has_pat) { | ||
53 | return 1; | ||
54 | } | ||
55 | } | ||
56 | 45 | ||
57 | pat_wc_enabled = 0; | 46 | pat_wc_enabled = 0; |
58 | printk(KERN_INFO "CPU and/or kernel does not support PAT.\n"); | 47 | printk(KERN_INFO "CPU and/or kernel does not support PAT.\n"); |