blob: 5469207fa863030a87a0ab09aa94b7375320d0fd [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * x86 SMP booting functions
3 *
4 * (c) 1995 Alan Cox, Building #3 <alan@redhat.com>
5 * (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com>
6 *
7 * Much of the core SMP work is based on previous work by Thomas Radke, to
8 * whom a great many thanks are extended.
9 *
10 * Thanks to Intel for making available several different Pentium,
11 * Pentium Pro and Pentium-II/Xeon MP machines.
12 * Original development of Linux SMP code supported by Caldera.
13 *
14 * This code is released under the GNU General Public License version 2 or
15 * later.
16 *
17 * Fixes
18 * Felix Koop : NR_CPUS used properly
19 * Jose Renau : Handle single CPU case.
20 * Alan Cox : By repeated request 8) - Total BogoMIPS report.
21 * Greg Wright : Fix for kernel stacks panic.
22 * Erich Boleyn : MP v1.4 and additional changes.
23 * Matthias Sattler : Changes for 2.1 kernel map.
24 * Michel Lespinasse : Changes for 2.1 kernel map.
25 * Michael Chastain : Change trampoline.S to gnu as.
26 * Alan Cox : Dumb bug: 'B' step PPro's are fine
27 * Ingo Molnar : Added APIC timers, based on code
28 * from Jose Renau
29 * Ingo Molnar : various cleanups and rewrites
30 * Tigran Aivazian : fixed "0.00 in /proc/uptime on SMP" bug.
31 * Maciej W. Rozycki : Bits for genuine 82489DX APICs
32 * Martin J. Bligh : Added support for multi-quad systems
33 * Dave Jones : Report invalid combinations of Athlon CPUs.
34* Rusty Russell : Hacked into shape for new "hotplug" boot process. */
35
36#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070037#include <linux/init.h>
38#include <linux/kernel.h>
39
40#include <linux/mm.h>
41#include <linux/sched.h>
42#include <linux/kernel_stat.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070043#include <linux/bootmem.h>
Zwane Mwaikambof3705132005-06-25 14:54:50 -070044#include <linux/notifier.h>
45#include <linux/cpu.h>
46#include <linux/percpu.h>
Ingo Molnard04f41e2007-03-07 18:12:31 +010047#include <linux/nmi.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070048
49#include <linux/delay.h>
50#include <linux/mc146818rtc.h>
51#include <asm/tlbflush.h>
52#include <asm/desc.h>
53#include <asm/arch_hooks.h>
Don Zickus3e4ff112006-06-26 13:57:01 +020054#include <asm/nmi.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070055
56#include <mach_apic.h>
57#include <mach_wakecpu.h>
58#include <smpboot_hooks.h>
Zachary Amsden7ce0bcf2007-02-13 13:26:21 +010059#include <asm/vmi.h>
Bernhard Kaindl2b1f6272007-05-02 19:27:17 +020060#include <asm/mtrr.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070061
travis@sgi.com3b419082008-01-30 13:33:11 +010062/* which logical CPU number maps to which CPU (physical APIC ID) */
Glauber Costa5382e892008-03-03 14:12:57 -030063u16 x86_cpu_to_apicid_init[NR_CPUS] __initdata =
Mike Travis71fff5e2007-10-19 20:35:03 +020064 { [0 ... NR_CPUS-1] = BAD_APICID };
travis@sgi.com3b419082008-01-30 13:33:11 +010065void *x86_cpu_to_apicid_early_ptr;
Glauber Costa5382e892008-03-03 14:12:57 -030066DEFINE_PER_CPU(u16, x86_cpu_to_apicid) = BAD_APICID;
Mike Travis71fff5e2007-10-19 20:35:03 +020067EXPORT_PER_CPU_SYMBOL(x86_cpu_to_apicid);
Linus Torvalds1da177e2005-04-16 15:20:36 -070068
Glauber de Oliveira Costacbe879f2008-03-19 14:25:19 -030069u16 x86_bios_cpu_apicid_init[NR_CPUS] __initdata
70 = { [0 ... NR_CPUS-1] = BAD_APICID };
71void *x86_bios_cpu_apicid_early_ptr;
72DEFINE_PER_CPU(u16, x86_bios_cpu_apicid) = BAD_APICID;
73EXPORT_PER_CPU_SYMBOL(x86_bios_cpu_apicid);
74
keith mannthey3b086062006-09-29 01:58:46 -070075u8 apicid_2_node[MAX_APICID];
76
Linus Torvalds1da177e2005-04-16 15:20:36 -070077/* Where the IO area was mapped on multiquad, always 0 otherwise */
78void *xquad_portio;
Alexey Dobriyan129f6942005-06-23 00:08:33 -070079#ifdef CONFIG_X86_NUMAQ
80EXPORT_SYMBOL(xquad_portio);
81#endif