diff options
| author | Andi Kleen <ak@muc.de> | 2002-12-27 19:54:22 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-12-27 19:54:22 -0800 |
| commit | 8b3c4cbfc0e727c76b53e55f22610d814e44dc97 (patch) | |
| tree | 5c6a529bba4f0e4b3ac8bda8e993a056722ae9b2 /arch | |
| parent | 1e1144fdf0e2d624e641e8017737f230480289c1 (diff) | |
[PATCH] Add AMD K8 support to 2.5.53.
Add support for the AMD Opteron/Athlon64/Hammer/K8 line to the 32bit
kernel.
Mostly just reusing Athlon code with some changed CPU model checks.
The Hammer has model number 15.
I also fixed rmb()/mb() to use the SSE2 mfence/lfence instructions
on P4 and Hammer. They are somewhat cheaper than the locked cycle.
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/i386/Kconfig | 20 | ||||
| -rw-r--r-- | arch/i386/Makefile | 1 | ||||
| -rw-r--r-- | arch/i386/kernel/apic.c | 3 | ||||
| -rw-r--r-- | arch/i386/kernel/cpu/mcheck/k7.c | 5 | ||||
| -rw-r--r-- | arch/i386/kernel/cpu/mtrr/main.c | 2 | ||||
| -rw-r--r-- | arch/i386/kernel/nmi.c | 4 |
6 files changed, 26 insertions, 9 deletions
diff --git a/arch/i386/Kconfig b/arch/i386/Kconfig index 514b8ce72a5d..68a522c910b8 100644 --- a/arch/i386/Kconfig +++ b/arch/i386/Kconfig @@ -140,6 +140,13 @@ config MK7 some extended instructions, and passes appropriate optimization flags to GCC. +config MK8 + bool "Opteron/Athlon64/Hammer/K8" + help + Select this for an AMD Opteron or Athlon64 Hammer-family processor. Enables + use of some extended instructions, and passes appropriate optimization + flags to GCC. + config MELAN bool "Elan" @@ -200,7 +207,7 @@ config X86_L1_CACHE_SHIFT int default "5" if MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCRUSOE || MCYRIXIII || MK6 || MPENTIUMIII || M686 || M586MMX || M586TSC || M586 default "4" if MELAN || M486 || M386 - default "6" if MK7 + default "6" if MK7 || MK8 default "7" if MPENTIUM4 config RWSEM_GENERIC_SPINLOCK @@ -255,12 +262,12 @@ config X86_ALIGNMENT_16 config X86_TSC bool - depends on MWINCHIP3D || MWINCHIP2 || MCRUSOE || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMIII || M686 || M586MMX || M586TSC + depends on MWINCHIP3D || MWINCHIP2 || MCRUSOE || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMIII || M686 || M586MMX || M586TSC || MK8 default y config X86_GOOD_APIC bool - depends on MK7 || MPENTIUM4 || MPENTIUMIII || M686 || M586MMX + depends on MK7 || MPENTIUM4 || MPENTIUMIII || M686 || M586MMX || MK8 default y config X86_INTEL_USERCOPY @@ -270,7 +277,7 @@ config X86_INTEL_USERCOPY config X86_USE_PPRO_CHECKSUM bool - depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMIII || M686 + depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMIII || M686 || MK8 default y config X86_USE_3DNOW @@ -288,6 +295,11 @@ config X86_PREFETCH depends on MPENTIUMIII || MP4 default y +config X86_SSE2 + bool + depends on MK8 || MPENTIUM4 + default y + config HUGETLB_PAGE bool "Huge TLB Page Support" help diff --git a/arch/i386/Makefile b/arch/i386/Makefile index 383bc1dfec29..889ceb717e3a 100644 --- a/arch/i386/Makefile +++ b/arch/i386/Makefile @@ -38,6 +38,7 @@ cflags-$(CONFIG_MPENTIUMIII) += $(call check_gcc,-march=pentium3,-march=i686) cflags-$(CONFIG_MPENTIUM4) += $(call check_gcc,-march=pentium4,-march=i686) cflags-$(CONFIG_MK6) += $(call check_gcc,-march=k6,-march=i586) cflags-$(CONFIG_MK7) += $(call check_gcc,-march=athlon,-march=i686 -malign-functions=4) +cflags-$(CONFIG_MK8) += $(call check_gcc,-march=k8,$(call check_gcc,-march=athlon,-march=i686 -malign-functions=4)) cflags-$(CONFIG_MCRUSOE) += -march=i686 -malign-functions=0 -malign-jumps=0 -malign-loops=0 cflags-$(CONFIG_MWINCHIPC6) += $(call check_gcc,-march=winchip-c6,-march=i586) cflags-$(CONFIG_MWINCHIP2) += $(call check_gcc,-march=winchip2,-march=i586) diff --git a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c index 98936e86c9b8..73d1bbdbf43c 100644 --- a/arch/i386/kernel/apic.c +++ b/arch/i386/kernel/apic.c @@ -614,7 +614,8 @@ static int __init detect_init_APIC (void) switch (boot_cpu_data.x86_vendor) { case X86_VENDOR_AMD: - if (boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model > 1) + if ((boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model > 1) || + (boot_cpu_data.x86 == 15)) break; goto no_apic; case X86_VENDOR_INTEL: diff --git a/arch/i386/kernel/cpu/mcheck/k7.c b/arch/i386/kernel/cpu/mcheck/k7.c index 294c78c9b534..1df54f5a7087 100644 --- a/arch/i386/kernel/cpu/mcheck/k7.c +++ b/arch/i386/kernel/cpu/mcheck/k7.c @@ -1,5 +1,5 @@ /* - * Athlon specific Machine Check Exception Reporting + * Athlon/Hammer specific Machine Check Exception Reporting */ #include <linux/init.h> @@ -82,6 +82,9 @@ void __init amd_mcheck_init(struct cpuinfo_x86 *c) nr_mce_banks = l & 0xff; for (i=0; i<nr_mce_banks; i++) { + /* Don't enable northbridge MCE by default on Hammer */ + if (boot_cpu_data.x86_model == 15 && i == 4) + continue; wrmsr (MSR_IA32_MC0_CTL+4*i, 0xffffffff, 0xffffffff); wrmsr (MSR_IA32_MC0_STATUS+4*i, 0x0, 0x0); } diff --git a/arch/i386/kernel/cpu/mtrr/main.c b/arch/i386/kernel/cpu/mtrr/main.c index 46caa93519aa..5b82d52983db 100644 --- a/arch/i386/kernel/cpu/mtrr/main.c +++ b/arch/i386/kernel/cpu/mtrr/main.c @@ -574,7 +574,7 @@ static int __init mtrr_init(void) query the width (in bits) of the physical addressable memory on the Hammer family. */ - if (boot_cpu_data.x86 >= 7 + if (boot_cpu_data.x86 == 15 && (cpuid_eax(0x80000000) >= 0x80000008)) { u32 phys_addr; phys_addr = cpuid_eax(0x80000008) & 0xff; diff --git a/arch/i386/kernel/nmi.c b/arch/i386/kernel/nmi.c index fbae2c8deeaf..9eeaca1be2a1 100644 --- a/arch/i386/kernel/nmi.c +++ b/arch/i386/kernel/nmi.c @@ -123,7 +123,7 @@ static int __init setup_nmi_watchdog(char *str) nmi_watchdog = nmi; if ((nmi == NMI_LOCAL_APIC) && (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) && - (boot_cpu_data.x86 == 6)) + (boot_cpu_data.x86 == 6 || boot_cpu_data.x86 == 15)) nmi_watchdog = nmi; /* * We can enable the IO-APIC watchdog @@ -294,7 +294,7 @@ void __pminit setup_apic_nmi_watchdog (void) { switch (boot_cpu_data.x86_vendor) { case X86_VENDOR_AMD: - if (boot_cpu_data.x86 != 6) + if (boot_cpu_data.x86 != 6 && boot_cpu_data.x86 != 15) return; setup_k7_watchdog(); break; |
