[PATCH] x86_64: Always use CPUID 80000008 to figure out MTRR address space size

It doesn't make sense to only do this only for AMD K8.

This would support future CPUs with extended address spaces properly.

For i386 and x86-64

Cc: <davej@redhat.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Andi Kleen 2005-04-16 15:25:10 -07:00 committed by Linus Torvalds
parent f0de53bbc2
commit 1f2c958ad5
1 changed files with 15 additions and 34 deletions

View File

@ -615,40 +615,21 @@ static int __init mtrr_init(void)
size_or_mask = 0xff000000; /* 36 bits */ size_or_mask = 0xff000000; /* 36 bits */
size_and_mask = 0x00f00000; size_and_mask = 0x00f00000;
switch (boot_cpu_data.x86_vendor) { /* This is an AMD specific MSR, but we assume(hope?) that
case X86_VENDOR_AMD: Intel will implement it to when they extend the address
/* The original Athlon docs said that bus of the Xeon. */
total addressable memory is 44 bits wide. if (cpuid_eax(0x80000000) >= 0x80000008) {
It was not really clear whether its MTRRs
follow this or not. (Read: 44 or 36 bits).
However, "x86-64_overview.pdf" explicitly
states that "previous implementations support
36 bit MTRRs" and also provides a way to
query the width (in bits) of the physical
addressable memory on the Hammer family.
*/
if (boot_cpu_data.x86 == 15
&& (cpuid_eax(0x80000000) >= 0x80000008)) {
u32 phys_addr; u32 phys_addr;
phys_addr = cpuid_eax(0x80000008) & 0xff; phys_addr = cpuid_eax(0x80000008) & 0xff;
size_or_mask = size_or_mask = ~((1 << (phys_addr - PAGE_SHIFT)) - 1);
~((1 << (phys_addr - PAGE_SHIFT)) - 1);
size_and_mask = ~size_or_mask & 0xfff00000; size_and_mask = ~size_or_mask & 0xfff00000;
} } else if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR &&
/* Athlon MTRRs use an Intel-compatible interface for boot_cpu_data.x86 == 6) {
* getting and setting */ /* VIA C* family have Intel style MTRRs, but
break; don't support PAE */
case X86_VENDOR_CENTAUR:
if (boot_cpu_data.x86 == 6) {
/* VIA Cyrix family have Intel style MTRRs, but don't support PAE */
size_or_mask = 0xfff00000; /* 32 bits */ size_or_mask = 0xfff00000; /* 32 bits */
size_and_mask = 0; size_and_mask = 0;
} }
break;
default:
break;
}
} else { } else {
switch (boot_cpu_data.x86_vendor) { switch (boot_cpu_data.x86_vendor) {
case X86_VENDOR_AMD: case X86_VENDOR_AMD: