|
@@ -614,34 +614,22 @@ wakeup_secondary_cpu_via_init(int phys_apicid, unsigned long start_eip)
|
|
apic_icr_write(APIC_INT_LEVELTRIG | APIC_INT_ASSERT | APIC_DM_INIT,
|
|
apic_icr_write(APIC_INT_LEVELTRIG | APIC_INT_ASSERT | APIC_DM_INIT,
|
|
phys_apicid);
|
|
phys_apicid);
|
|
|
|
|
|
- if (!cpu_has_x2apic) {
|
|
|
|
- pr_debug("Waiting for send to finish...\n");
|
|
|
|
- send_status = safe_apic_wait_icr_idle();
|
|
|
|
|
|
+ pr_debug("Waiting for send to finish...\n");
|
|
|
|
+ send_status = safe_apic_wait_icr_idle();
|
|
|
|
|
|
- mdelay(init_udelay);
|
|
|
|
|
|
+ mdelay(init_udelay);
|
|
|
|
|
|
- pr_debug("Deasserting INIT\n");
|
|
|
|
|
|
+ pr_debug("Deasserting INIT\n");
|
|
|
|
|
|
- /* Target chip */
|
|
|
|
- /* Send IPI */
|
|
|
|
- apic_icr_write(APIC_INT_LEVELTRIG | APIC_DM_INIT, phys_apicid);
|
|
|
|
|
|
+ /* Target chip */
|
|
|
|
+ /* Send IPI */
|
|
|
|
+ apic_icr_write(APIC_INT_LEVELTRIG | APIC_DM_INIT, phys_apicid);
|
|
|
|
|
|
- pr_debug("Waiting for send to finish...\n");
|
|
|
|
- send_status = safe_apic_wait_icr_idle();
|
|
|
|
|
|
+ pr_debug("Waiting for send to finish...\n");
|
|
|
|
+ send_status = safe_apic_wait_icr_idle();
|
|
|
|
|
|
- mb();
|
|
|
|
- atomic_set(&init_deasserted, 1);
|
|
|
|
- } else if (tboot_enabled()) {
|
|
|
|
- /*
|
|
|
|
- * With tboot AP is actually spinning in a mini-guest before
|
|
|
|
- * receiving INIT. Upon receiving INIT ipi, AP need time to
|
|
|
|
- * VMExit, update VMCS to tracking SIPIs and VMResume.
|
|
|
|
- *
|
|
|
|
- * While AP is in root mode handling the INIT the CPU will drop
|
|
|
|
- * any SIPIs
|
|
|
|
- */
|
|
|
|
- udelay(10);
|
|
|
|
- }
|
|
|
|
|
|
+ mb();
|
|
|
|
+ atomic_set(&init_deasserted, 1);
|
|
|
|
|
|
/*
|
|
/*
|
|
* Should we send STARTUP IPIs ?
|
|
* Should we send STARTUP IPIs ?
|
|
@@ -683,22 +671,20 @@ wakeup_secondary_cpu_via_init(int phys_apicid, unsigned long start_eip)
|
|
apic_icr_write(APIC_DM_STARTUP | (start_eip >> 12),
|
|
apic_icr_write(APIC_DM_STARTUP | (start_eip >> 12),
|
|
phys_apicid);
|
|
phys_apicid);
|
|
|
|
|
|
- if (!cpu_has_x2apic) {
|
|
|
|
- /*
|
|
|
|
- * Give the other CPU some time to accept the IPI.
|
|
|
|
- */
|
|
|
|
- udelay(300);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Give the other CPU some time to accept the IPI.
|
|
|
|
+ */
|
|
|
|
+ udelay(300);
|
|
|
|
|
|
- pr_debug("Startup point 1\n");
|
|
|
|
|
|
+ pr_debug("Startup point 1\n");
|
|
|
|
|
|
- pr_debug("Waiting for send to finish...\n");
|
|
|
|
- send_status = safe_apic_wait_icr_idle();
|
|
|
|
|
|
+ pr_debug("Waiting for send to finish...\n");
|
|
|
|
+ send_status = safe_apic_wait_icr_idle();
|
|
|
|
|
|
- /*
|
|
|
|
- * Give the other CPU some time to accept the IPI.
|
|
|
|
- */
|
|
|
|
- udelay(200);
|
|
|
|
- }
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Give the other CPU some time to accept the IPI.
|
|
|
|
+ */
|
|
|
|
+ udelay(200);
|
|
|
|
|
|
if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */
|
|
if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */
|
|
apic_write(APIC_ESR, 0);
|
|
apic_write(APIC_ESR, 0);
|