aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYinghai Lu <yinghai@kernel.org>2008-11-19 23:50:53 -0500
committerIngo Molnar <mingo@elte.hu>2008-11-20 04:45:17 -0500
commit87f7606591aea6a8a38ea4c8911b5eeeee2740b8 (patch)
treee61b641203b0e408871ecb5fc7ba5a03ff881e39
parentb5fe363b7d89577fcfda9b6cf0efc32760bbccc6 (diff)
x86: fix wakeup_cpu with numaq/es7000 v2 - call ->update_genapic()
Impact: fix boot crash on 32-bit Hiroshi Shimamoto reported a boot failure on 32-bit x86. The setting of x86_quirks.wakeup_cpu is missing (when not passing in an explicit apic= boot parameter). Reported-by: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--arch/x86/mach-generic/probe.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/x86/mach-generic/probe.c b/arch/x86/mach-generic/probe.c
index 90b134f3cd74..c346d9d0226f 100644
--- a/arch/x86/mach-generic/probe.c
+++ b/arch/x86/mach-generic/probe.c
@@ -76,12 +76,15 @@ void __init generic_bigsmp_probe(void)
76 * - we find more than 8 CPUs in acpi LAPIC listing with xAPIC support 76 * - we find more than 8 CPUs in acpi LAPIC listing with xAPIC support
77 */ 77 */
78 78
79 if (!cmdline_apic && genapic == &apic_default) 79 if (!cmdline_apic && genapic == &apic_default) {
80 if (apic_bigsmp.probe()) { 80 if (apic_bigsmp.probe()) {
81 genapic = &apic_bigsmp; 81 genapic = &apic_bigsmp;
82 if (x86_quirks->update_genapic)
83 x86_quirks->update_genapic();
82 printk(KERN_INFO "Overriding APIC driver with %s\n", 84 printk(KERN_INFO "Overriding APIC driver with %s\n",
83 genapic->name); 85 genapic->name);
84 } 86 }
87 }
85#endif 88#endif
86} 89}
87 90
@@ -98,6 +101,9 @@ void __init generic_apic_probe(void)
98 /* Not visible without early console */ 101 /* Not visible without early console */
99 if (!apic_probe[i]) 102 if (!apic_probe[i])
100 panic("Didn't find an APIC driver"); 103 panic("Didn't find an APIC driver");
104
105 if (x86_quirks->update_genapic)
106 x86_quirks->update_genapic();
101 } 107 }
102 printk(KERN_INFO "Using APIC driver %s\n", genapic->name); 108 printk(KERN_INFO "Using APIC driver %s\n", genapic->name);
103} 109}
@@ -112,6 +118,8 @@ int __init mps_oem_check(struct mp_config_table *mpc, char *oem,
112 if (apic_probe[i]->mps_oem_check(mpc, oem, productid)) { 118 if (apic_probe[i]->mps_oem_check(mpc, oem, productid)) {
113 if (!cmdline_apic) { 119 if (!cmdline_apic) {
114 genapic = apic_probe[i]; 120 genapic = apic_probe[i];
121 if (x86_quirks->update_genapic)
122 x86_quirks->update_genapic();
115 printk(KERN_INFO "Switched to APIC driver `%s'.\n", 123 printk(KERN_INFO "Switched to APIC driver `%s'.\n",
116 genapic->name); 124 genapic->name);
117 } 125 }
@@ -128,6 +136,8 @@ int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
128 if (apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) { 136 if (apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) {
129 if (!cmdline_apic) { 137 if (!cmdline_apic) {
130 genapic = apic_probe[i]; 138 genapic = apic_probe[i];
139 if (x86_quirks->update_genapic)
140 x86_quirks->update_genapic();
131 printk(KERN_INFO "Switched to APIC driver `%s'.\n", 141 printk(KERN_INFO "Switched to APIC driver `%s'.\n",
132 genapic->name); 142 genapic->name);
133 } 143 }