diff options
author | Ingo Molnar <mingo@elte.hu> | 2007-05-02 13:27:04 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2007-05-02 13:27:04 -0400 |
commit | 3c43f03908de98fa8f7a9e8fc9411ebf4c2de298 (patch) | |
tree | 3e2c78fc91f29dfdfd29970e70982f0386863d17 | |
parent | 424df390101f9dfe015f0633aaec696c159b37a8 (diff) |
[PATCH] x86: default to physical mode on hotplug CPU kernels
Default to physical mode on hotplug CPU kernels. Furher simplify and clean up
the APIC initialization code.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andi Kleen <ak@suse.de>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
Cc: Andi Kleen <ak@suse.de>
Cc: "Li, Shaohua" <shaohua.li@intel.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
-rw-r--r-- | arch/i386/kernel/acpi/boot.c | 2 | ||||
-rw-r--r-- | arch/i386/kernel/mpparse.c | 2 | ||||
-rw-r--r-- | arch/x86_64/kernel/genapic.c | 16 | ||||
-rw-r--r-- | arch/x86_64/kernel/mpparse.c | 2 | ||||
-rw-r--r-- | include/asm-i386/genapic.h | 4 | ||||
-rw-r--r-- | include/asm-i386/mach-bigsmp/mach_apic.h | 2 | ||||
-rw-r--r-- | include/asm-i386/mach-default/mach_apic.h | 2 | ||||
-rw-r--r-- | include/asm-i386/mach-es7000/mach_apic.h | 2 | ||||
-rw-r--r-- | include/asm-i386/mach-generic/mach_apic.h | 2 | ||||
-rw-r--r-- | include/asm-i386/mach-numaq/mach_apic.h | 2 | ||||
-rw-r--r-- | include/asm-i386/mach-summit/mach_apic.h | 2 | ||||
-rw-r--r-- | include/asm-i386/mach-visws/mach_apic.h | 2 | ||||
-rw-r--r-- | include/asm-x86_64/apic.h | 2 |
13 files changed, 16 insertions, 26 deletions
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c index 9ea5b8ecc7e1..280898b045b2 100644 --- a/arch/i386/kernel/acpi/boot.c +++ b/arch/i386/kernel/acpi/boot.c | |||
@@ -874,7 +874,7 @@ static void __init acpi_process_madt(void) | |||
874 | acpi_ioapic = 1; | 874 | acpi_ioapic = 1; |
875 | 875 | ||
876 | smp_found_config = 1; | 876 | smp_found_config = 1; |
877 | clustered_apic_check(); | 877 | setup_apic_routing(); |
878 | } | 878 | } |
879 | } | 879 | } |
880 | if (error == -EINVAL) { | 880 | if (error == -EINVAL) { |
diff --git a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c index 4f5983c98669..0952eccd8f28 100644 --- a/arch/i386/kernel/mpparse.c +++ b/arch/i386/kernel/mpparse.c | |||
@@ -477,7 +477,7 @@ static int __init smp_read_mpc(struct mp_config_table *mpc) | |||
477 | } | 477 | } |
478 | ++mpc_record; | 478 | ++mpc_record; |
479 | } | 479 | } |
480 | clustered_apic_check(); | 480 | setup_apic_routing(); |
481 | if (!num_processors) | 481 | if (!num_processors) |
482 | printk(KERN_ERR "SMP mptable: no processors registered!\n"); | 482 | printk(KERN_ERR "SMP mptable: no processors registered!\n"); |
483 | return num_processors; | 483 | return num_processors; |
diff --git a/arch/x86_64/kernel/genapic.c b/arch/x86_64/kernel/genapic.c index 025f26ebb8d7..c08650a427e2 100644 --- a/arch/x86_64/kernel/genapic.c +++ b/arch/x86_64/kernel/genapic.c | |||
@@ -35,11 +35,8 @@ struct genapic __read_mostly *genapic = &apic_flat; | |||
35 | /* | 35 | /* |
36 | * Check the APIC IDs in bios_cpu_apicid and choose the APIC mode. | 36 | * Check the APIC IDs in bios_cpu_apicid and choose the APIC mode. |
37 | */ | 37 | */ |
38 | void __init clustered_apic_check(void) | 38 | void __init setup_apic_routing(void) |
39 | { | 39 | { |
40 | unsigned int i, max_apic = 0; | ||
41 | u8 id; | ||
42 | |||
43 | #ifdef CONFIG_ACPI | 40 | #ifdef CONFIG_ACPI |
44 | /* | 41 | /* |
45 | * Quirk: some x86_64 machines can only use physical APIC mode | 42 | * Quirk: some x86_64 machines can only use physical APIC mode |
@@ -49,17 +46,10 @@ void __init clustered_apic_check(void) | |||
49 | if (acpi_gbl_FADT.header.revision > FADT2_REVISION_ID && | 46 | if (acpi_gbl_FADT.header.revision > FADT2_REVISION_ID && |
50 | (acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL)) | 47 | (acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL)) |
51 | genapic = &apic_physflat; | 48 | genapic = &apic_physflat; |
49 | else | ||
52 | #endif | 50 | #endif |
53 | 51 | ||
54 | for (i = 0; i < NR_CPUS; i++) { | 52 | if (cpus_weight(cpu_possible_map) <= 8) |
55 | id = bios_cpu_apicid[i]; | ||
56 | if (id == BAD_APICID) | ||
57 | continue; | ||
58 | if (id > max_apic) | ||
59 | max_apic = id; | ||
60 | } | ||
61 | |||
62 | if (max_apic < 8) | ||
63 | genapic = &apic_flat; | 53 | genapic = &apic_flat; |
64 | else | 54 | else |
65 | genapic = &apic_physflat; | 55 | genapic = &apic_physflat; |
diff --git a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c index 455aa0b932f0..d0dc4891599b 100644 --- a/arch/x86_64/kernel/mpparse.c +++ b/arch/x86_64/kernel/mpparse.c | |||
@@ -300,7 +300,7 @@ static int __init smp_read_mpc(struct mp_config_table *mpc) | |||
300 | } | 300 | } |
301 | } | 301 | } |
302 | } | 302 | } |
303 | clustered_apic_check(); | 303 | setup_apic_routing(); |
304 | if (!num_processors) | 304 | if (!num_processors) |
305 | printk(KERN_ERR "MPTABLE: no processors registered!\n"); | 305 | printk(KERN_ERR "MPTABLE: no processors registered!\n"); |
306 | return num_processors; | 306 | return num_processors; |
diff --git a/include/asm-i386/genapic.h b/include/asm-i386/genapic.h index 8ffbb0f07457..33e3ffe1766c 100644 --- a/include/asm-i386/genapic.h +++ b/include/asm-i386/genapic.h | |||
@@ -36,7 +36,7 @@ struct genapic { | |||
36 | void (*init_apic_ldr)(void); | 36 | void (*init_apic_ldr)(void); |
37 | physid_mask_t (*ioapic_phys_id_map)(physid_mask_t map); | 37 | physid_mask_t (*ioapic_phys_id_map)(physid_mask_t map); |
38 | 38 | ||
39 | void (*clustered_apic_check)(void); | 39 | void (*setup_apic_routing)(void); |
40 | int (*multi_timer_check)(int apic, int irq); | 40 | int (*multi_timer_check)(int apic, int irq); |
41 | int (*apicid_to_node)(int logical_apicid); | 41 | int (*apicid_to_node)(int logical_apicid); |
42 | int (*cpu_to_logical_apicid)(int cpu); | 42 | int (*cpu_to_logical_apicid)(int cpu); |
@@ -99,7 +99,7 @@ struct genapic { | |||
99 | APICFUNC(check_apicid_present) \ | 99 | APICFUNC(check_apicid_present) \ |
100 | APICFUNC(init_apic_ldr) \ | 100 | APICFUNC(init_apic_ldr) \ |
101 | APICFUNC(ioapic_phys_id_map) \ | 101 | APICFUNC(ioapic_phys_id_map) \ |
102 | APICFUNC(clustered_apic_check) \ | 102 | APICFUNC(setup_apic_routing) \ |
103 | APICFUNC(multi_timer_check) \ | 103 | APICFUNC(multi_timer_check) \ |
104 | APICFUNC(apicid_to_node) \ | 104 | APICFUNC(apicid_to_node) \ |
105 | APICFUNC(cpu_to_logical_apicid) \ | 105 | APICFUNC(cpu_to_logical_apicid) \ |
diff --git a/include/asm-i386/mach-bigsmp/mach_apic.h b/include/asm-i386/mach-bigsmp/mach_apic.h index 18b19a773440..ebd319f838ab 100644 --- a/include/asm-i386/mach-bigsmp/mach_apic.h +++ b/include/asm-i386/mach-bigsmp/mach_apic.h | |||
@@ -71,7 +71,7 @@ static inline void init_apic_ldr(void) | |||
71 | apic_write_around(APIC_LDR, val); | 71 | apic_write_around(APIC_LDR, val); |
72 | } | 72 | } |
73 | 73 | ||
74 | static inline void clustered_apic_check(void) | 74 | static inline void setup_apic_routing(void) |
75 | { | 75 | { |
76 | printk("Enabling APIC mode: %s. Using %d I/O APICs\n", | 76 | printk("Enabling APIC mode: %s. Using %d I/O APICs\n", |
77 | "Physflat", nr_ioapics); | 77 | "Physflat", nr_ioapics); |
diff --git a/include/asm-i386/mach-default/mach_apic.h b/include/asm-i386/mach-default/mach_apic.h index 3ef6292db780..6db1c3babe9a 100644 --- a/include/asm-i386/mach-default/mach_apic.h +++ b/include/asm-i386/mach-default/mach_apic.h | |||
@@ -54,7 +54,7 @@ static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map) | |||
54 | return phys_map; | 54 | return phys_map; |
55 | } | 55 | } |
56 | 56 | ||
57 | static inline void clustered_apic_check(void) | 57 | static inline void setup_apic_routing(void) |
58 | { | 58 | { |
59 | printk("Enabling APIC mode: %s. Using %d I/O APICs\n", | 59 | printk("Enabling APIC mode: %s. Using %d I/O APICs\n", |
60 | "Flat", nr_ioapics); | 60 | "Flat", nr_ioapics); |
diff --git a/include/asm-i386/mach-es7000/mach_apic.h b/include/asm-i386/mach-es7000/mach_apic.h index 26333685a7fb..8e8b3949173a 100644 --- a/include/asm-i386/mach-es7000/mach_apic.h +++ b/include/asm-i386/mach-es7000/mach_apic.h | |||
@@ -81,7 +81,7 @@ static inline void enable_apic_mode(void) | |||
81 | } | 81 | } |
82 | 82 | ||
83 | extern int apic_version [MAX_APICS]; | 83 | extern int apic_version [MAX_APICS]; |
84 | static inline void clustered_apic_check(void) | 84 | static inline void setup_apic_routing(void) |
85 | { | 85 | { |
86 | int apic = bios_cpu_apicid[smp_processor_id()]; | 86 | int apic = bios_cpu_apicid[smp_processor_id()]; |
87 | printk("Enabling APIC mode: %s. Using %d I/O APICs, target cpus %lx\n", | 87 | printk("Enabling APIC mode: %s. Using %d I/O APICs, target cpus %lx\n", |
diff --git a/include/asm-i386/mach-generic/mach_apic.h b/include/asm-i386/mach-generic/mach_apic.h index d9dc039da94a..a236e7021528 100644 --- a/include/asm-i386/mach-generic/mach_apic.h +++ b/include/asm-i386/mach-generic/mach_apic.h | |||
@@ -13,7 +13,7 @@ | |||
13 | #define apic_id_registered (genapic->apic_id_registered) | 13 | #define apic_id_registered (genapic->apic_id_registered) |
14 | #define init_apic_ldr (genapic->init_apic_ldr) | 14 | #define init_apic_ldr (genapic->init_apic_ldr) |
15 | #define ioapic_phys_id_map (genapic->ioapic_phys_id_map) | 15 | #define ioapic_phys_id_map (genapic->ioapic_phys_id_map) |
16 | #define clustered_apic_check (genapic->clustered_apic_check) | 16 | #define setup_apic_routing (genapic->setup_apic_routing) |
17 | #define multi_timer_check (genapic->multi_timer_check) | 17 | #define multi_timer_check (genapic->multi_timer_check) |
18 | #define apicid_to_node (genapic->apicid_to_node) | 18 | #define apicid_to_node (genapic->apicid_to_node) |
19 | #define cpu_to_logical_apicid (genapic->cpu_to_logical_apicid) | 19 | #define cpu_to_logical_apicid (genapic->cpu_to_logical_apicid) |
diff --git a/include/asm-i386/mach-numaq/mach_apic.h b/include/asm-i386/mach-numaq/mach_apic.h index 9d158095da82..5e5e7dd2692e 100644 --- a/include/asm-i386/mach-numaq/mach_apic.h +++ b/include/asm-i386/mach-numaq/mach_apic.h | |||
@@ -34,7 +34,7 @@ static inline void init_apic_ldr(void) | |||
34 | /* Already done in NUMA-Q firmware */ | 34 | /* Already done in NUMA-Q firmware */ |
35 | } | 35 | } |
36 | 36 | ||
37 | static inline void clustered_apic_check(void) | 37 | static inline void setup_apic_routing(void) |
38 | { | 38 | { |
39 | printk("Enabling APIC mode: %s. Using %d I/O APICs\n", | 39 | printk("Enabling APIC mode: %s. Using %d I/O APICs\n", |
40 | "NUMA-Q", nr_ioapics); | 40 | "NUMA-Q", nr_ioapics); |
diff --git a/include/asm-i386/mach-summit/mach_apic.h b/include/asm-i386/mach-summit/mach_apic.h index 43e5bd8f4a19..732f776aab8e 100644 --- a/include/asm-i386/mach-summit/mach_apic.h +++ b/include/asm-i386/mach-summit/mach_apic.h | |||
@@ -80,7 +80,7 @@ static inline int apic_id_registered(void) | |||
80 | return 1; | 80 | return 1; |
81 | } | 81 | } |
82 | 82 | ||
83 | static inline void clustered_apic_check(void) | 83 | static inline void setup_apic_routing(void) |
84 | { | 84 | { |
85 | printk("Enabling APIC mode: Summit. Using %d I/O APICs\n", | 85 | printk("Enabling APIC mode: Summit. Using %d I/O APICs\n", |
86 | nr_ioapics); | 86 | nr_ioapics); |
diff --git a/include/asm-i386/mach-visws/mach_apic.h b/include/asm-i386/mach-visws/mach_apic.h index 18afe6b6fc4d..efac6f0d139f 100644 --- a/include/asm-i386/mach-visws/mach_apic.h +++ b/include/asm-i386/mach-visws/mach_apic.h | |||
@@ -47,7 +47,7 @@ static inline void summit_check(char *oem, char *productid) | |||
47 | { | 47 | { |
48 | } | 48 | } |
49 | 49 | ||
50 | static inline void clustered_apic_check(void) | 50 | static inline void setup_apic_routing(void) |
51 | { | 51 | { |
52 | } | 52 | } |
53 | 53 | ||
diff --git a/include/asm-x86_64/apic.h b/include/asm-x86_64/apic.h index 7cfb39cbd918..2f3b013595ab 100644 --- a/include/asm-x86_64/apic.h +++ b/include/asm-x86_64/apic.h | |||
@@ -83,7 +83,7 @@ extern void setup_secondary_APIC_clock (void); | |||
83 | extern int APIC_init_uniprocessor (void); | 83 | extern int APIC_init_uniprocessor (void); |
84 | extern void disable_APIC_timer(void); | 84 | extern void disable_APIC_timer(void); |
85 | extern void enable_APIC_timer(void); | 85 | extern void enable_APIC_timer(void); |
86 | extern void clustered_apic_check(void); | 86 | extern void setup_apic_routing(void); |
87 | 87 | ||
88 | extern void setup_APIC_extened_lvt(unsigned char lvt_off, unsigned char vector, | 88 | extern void setup_APIC_extened_lvt(unsigned char lvt_off, unsigned char vector, |
89 | unsigned char msg_type, unsigned char mask); | 89 | unsigned char msg_type, unsigned char mask); |