diff options
author | Andi Kleen <ak@suse.de> | 2005-04-16 15:25:16 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 15:25:16 -0700 |
commit | 635186447d0e6f3b35895fda993a266a1315d2a7 (patch) | |
tree | 7d92e2b57c66f076908a5739056d823a4bde0121 /arch/i386/kernel/cpu | |
parent | 3dd9d514846cdca1dcef2e4fce666d85e199e844 (diff) |
[PATCH] x86_64: Final support for AMD dual core
Clean up the code greatly. Now uses the infrastructure from the Intel dual
core patch Should fix a final bug noticed by Tyan of not detecting the nodes
correctly in some corner cases.
Patch for x86-64 and i386
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/i386/kernel/cpu')
-rw-r--r-- | arch/i386/kernel/cpu/amd.c | 24 | ||||
-rw-r--r-- | arch/i386/kernel/cpu/common.c | 2 |
2 files changed, 15 insertions, 11 deletions
diff --git a/arch/i386/kernel/cpu/amd.c b/arch/i386/kernel/cpu/amd.c index fa10d0a509c..8d182e875cd 100644 --- a/arch/i386/kernel/cpu/amd.c +++ b/arch/i386/kernel/cpu/amd.c @@ -24,6 +24,9 @@ __asm__(".align 4\nvide: ret"); static void __init init_amd(struct cpuinfo_x86 *c) { +#ifdef CONFIG_SMP + int cpu = c == &boot_cpu_data ? 0 : c - cpu_data; +#endif u32 l, h; int mbytes = num_physpages >> (20-PAGE_SHIFT); int r; @@ -195,16 +198,17 @@ static void __init init_amd(struct cpuinfo_x86 *c) c->x86_num_cores = 1; } - detect_ht(c); - -#ifdef CONFIG_X86_HT - /* AMD dual core looks like HT but isn't really. Hide it from the - scheduler. This works around problems with the domain scheduler. - Also probably gives slightly better scheduling and disables - SMT nice which is harmful on dual core. - TBD tune the domain scheduler for dual core. */ - if (cpu_has(c, X86_FEATURE_CMP_LEGACY)) - smp_num_siblings = 1; +#ifdef CONFIG_SMP + /* + * On a AMD dual core setup the lower bits of the APIC id + * distingush the cores. Assumes number of cores is a power + * of two. + */ + if (c->x86_num_cores > 1) { + cpu_core_id[cpu] = cpu >> hweight32(c->x86_num_cores - 1); + printk(KERN_INFO "CPU %d(%d) -> Core %d\n", + cpu, c->x86_num_cores, cpu_core_id[cpu]); + } #endif } diff --git a/arch/i386/kernel/cpu/common.c b/arch/i386/kernel/cpu/common.c index ed4c9c3fe66..6be0310e3cd 100644 --- a/arch/i386/kernel/cpu/common.c +++ b/arch/i386/kernel/cpu/common.c @@ -437,7 +437,7 @@ void __init detect_ht(struct cpuinfo_x86 *c) int index_msb, tmp; int cpu = smp_processor_id(); - if (!cpu_has(c, X86_FEATURE_HT)) + if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY)) return; cpuid(1, &eax, &ebx, &ecx, &edx); |