x86: use APIC_INTEGRATED tests in x86_64
[sfrench/cifs-2.6.git] / arch / x86 / kernel / smpboot_64.c
index cfcfd2c2062b152e2941670d34e4824369d7788a..d7b59d6c6963275baaefe65b59a0f9f5006d7b8f 100644 (file)
@@ -295,6 +295,15 @@ static int __cpuinit wakeup_secondary_via_INIT(int phys_apicid, unsigned int sta
        unsigned long send_status, accept_status = 0;
        int maxlvt, num_starts, j;
 
+       /*
+        * Be paranoid about clearing APIC errors.
+        */
+       if (APIC_INTEGRATED(apic_version[phys_apicid])) {
+               apic_read_around(APIC_SPIV);
+               apic_write(APIC_ESR, 0);
+               apic_read(APIC_ESR);
+       }
+
        Dprintk("Asserting INIT.\n");
 
        /*
@@ -327,7 +336,10 @@ static int __cpuinit wakeup_secondary_via_INIT(int phys_apicid, unsigned int sta
        mb();
        atomic_set(&init_deasserted, 1);
 
-       num_starts = 2;
+       if (APIC_INTEGRATED(apic_version[phys_apicid]))
+               num_starts = 2;
+       else
+               num_starts = 0;
 
        /*
         * Paravirt / VMI wants a startup IPI hook here to set up the