--- /dev/null
+From stable-bounces@linux.kernel.org Sat Oct 29 23:50:10 2005
+Date: Sun, 30 Oct 2005 01:49:38 -0500
+From: Dave Jones <davej@redhat.com>
+To: Marcel Holtmann <marcel@holtmann.org>
+Cc: discuss@x86-64.org, linux-kernel@vger.kernel.org,
+ Lukas Hejtmanek <xhejtman@mail.muni.cz>, torvalds@osdl.org,
+ Shaohua Li <shaohua.li@intel.com>, stable@kernel.org, ak@suse.de
+Subject: [PATCH] x86_64/i386: Compute correct MTRR mask on early Noconas
+
+From: Andi Kleen <ak@suse.de>
+
+Force correct address space size for MTRR on some 64bit Intel Xeons
+
+They report 40bit, but only have 36bits of physical address space.
+This caused problems with setting up the correct masks for MTRR,
+resulting in incorrect MTRRs.
+
+CPUID workaround for steppings 0F33h(supporting x86) and 0F34h(supporting x86
+and EM64T). Detail info can be found at:
+http://download.intel.com/design/Xeon/specupdt/30240216.pdf
+http://download.intel.com/design/Pentium4/specupdt/30235221.pdf
+
+Signed-off-by: Shaohua Li<shaohua.li@intel.com>
+Signed-off-by: Andi Kleen <ak@suse.de>
+Signed-off-by: Chris Wright <chrisw@osdl.org>
+---
+
+ arch/i386/kernel/cpu/mtrr/main.c | 8 ++++++++
+ arch/x86_64/kernel/setup.c | 5 +++++
+ 2 files changed, 13 insertions(+)
+
+Index: linux-2.6.14.y/arch/i386/kernel/cpu/mtrr/main.c
+===================================================================
+--- linux-2.6.14.y.orig/arch/i386/kernel/cpu/mtrr/main.c
++++ linux-2.6.14.y/arch/i386/kernel/cpu/mtrr/main.c
+@@ -626,6 +626,14 @@ void __init mtrr_bp_init(void)
+ if (cpuid_eax(0x80000000) >= 0x80000008) {
+ u32 phys_addr;
+ phys_addr = cpuid_eax(0x80000008) & 0xff;
++ /* CPUID workaround for Intel 0F33/0F34 CPU */
++ if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
++ boot_cpu_data.x86 == 0xF &&
++ boot_cpu_data.x86_model == 0x3 &&
++ (boot_cpu_data.x86_mask == 0x3 ||
++ boot_cpu_data.x86_mask == 0x4))
++ phys_addr = 36;
++
+ size_or_mask = ~((1 << (phys_addr - PAGE_SHIFT)) - 1);
+ size_and_mask = ~size_or_mask & 0xfff00000;
+ } else if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR &&
+Index: linux-2.6.14.y/arch/x86_64/kernel/setup.c
+===================================================================
+--- linux-2.6.14.y.orig/arch/x86_64/kernel/setup.c
++++ linux-2.6.14.y/arch/x86_64/kernel/setup.c
+@@ -993,6 +993,11 @@ static void __cpuinit init_intel(struct
+ unsigned eax = cpuid_eax(0x80000008);
+ c->x86_virt_bits = (eax >> 8) & 0xff;
+ c->x86_phys_bits = eax & 0xff;
++ /* CPUID workaround for Intel 0F34 CPU */
++ if (c->x86_vendor == X86_VENDOR_INTEL &&
++ c->x86 == 0xF && c->x86_model == 0x3 &&
++ c->x86_mask == 0x4)
++ c->x86_phys_bits = 36;
+ }
+
+ if (c->x86 == 15)