|
@@ -62,6 +62,7 @@
|
|
|
#include <asm/mtrr.h>
|
|
|
#include <asm/vmi.h>
|
|
|
#include <asm/genapic.h>
|
|
|
+#include <asm/setup.h>
|
|
|
#include <linux/mc146818rtc.h>
|
|
|
|
|
|
#include <mach_apic.h>
|
|
@@ -536,7 +537,7 @@ static void impress_friends(void)
|
|
|
pr_debug("Before bogocount - setting activated=1.\n");
|
|
|
}
|
|
|
|
|
|
-static inline void __inquire_remote_apic(int apicid)
|
|
|
+void __inquire_remote_apic(int apicid)
|
|
|
{
|
|
|
unsigned i, regs[] = { APIC_ID >> 4, APIC_LVR >> 4, APIC_SPIV >> 4 };
|
|
|
char *names[] = { "ID", "VERSION", "SPIV" };
|
|
@@ -575,14 +576,13 @@ static inline void __inquire_remote_apic(int apicid)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#ifdef WAKE_SECONDARY_VIA_NMI
|
|
|
/*
|
|
|
* Poke the other CPU in the eye via NMI to wake it up. Remember that the normal
|
|
|
* INIT, INIT, STARTUP sequence will reset the chip hard for us, and this
|
|
|
* won't ... remember to clear down the APIC, etc later.
|
|
|
*/
|
|
|
-static int __devinit
|
|
|
-wakeup_secondary_cpu(int logical_apicid, unsigned long start_eip)
|
|
|
+int __devinit
|
|
|
+wakeup_secondary_cpu_via_nmi(int logical_apicid, unsigned long start_eip)
|
|
|
{
|
|
|
unsigned long send_status, accept_status = 0;
|
|
|
int maxlvt;
|
|
@@ -599,7 +599,7 @@ wakeup_secondary_cpu(int logical_apicid, unsigned long start_eip)
|
|
|
* Give the other CPU some time to accept the IPI.
|
|
|
*/
|
|
|
udelay(200);
|
|
|
- if (APIC_INTEGRATED(apic_version[phys_apicid])) {
|
|
|
+ if (APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) {
|
|
|
maxlvt = lapic_get_maxlvt();
|
|
|
if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */
|
|
|
apic_write(APIC_ESR, 0);
|
|
@@ -614,11 +614,9 @@ wakeup_secondary_cpu(int logical_apicid, unsigned long start_eip)
|
|
|
|
|
|
return (send_status | accept_status);
|
|
|
}
|
|
|
-#endif /* WAKE_SECONDARY_VIA_NMI */
|
|
|
|
|
|
-#ifdef WAKE_SECONDARY_VIA_INIT
|
|
|
static int __devinit
|
|
|
-wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
|
|
|
+wakeup_secondary_cpu_via_init(int phys_apicid, unsigned long start_eip)
|
|
|
{
|
|
|
unsigned long send_status, accept_status = 0;
|
|
|
int maxlvt, num_starts, j;
|
|
@@ -737,7 +735,15 @@ wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
|
|
|
|
|
|
return (send_status | accept_status);
|
|
|
}
|
|
|
-#endif /* WAKE_SECONDARY_VIA_INIT */
|
|
|
+
|
|
|
+static int __devinit
|
|
|
+wakeup_secondary_cpu(int apicid, unsigned long start_eip)
|
|
|
+{
|
|
|
+ if (x86_quirks->wakeup_secondary_cpu)
|
|
|
+ return x86_quirks->wakeup_secondary_cpu(apicid, start_eip);
|
|
|
+
|
|
|
+ return wakeup_secondary_cpu_via_init(apicid, start_eip);
|
|
|
+}
|
|
|
|
|
|
struct create_idle {
|
|
|
struct work_struct work;
|