aboutsummaryrefslogtreecommitdiff
path: root/sys/i386
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2015-03-30 20:13:22 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2015-03-30 20:13:22 +0000
commit2f22c84c3112bef2abaf3416118f09684ffc396d (patch)
treea25fa00d1240bf59f5e6e18e0c9c2bf8e1e18115 /sys/i386
parente93a7dab19a16de9df7cfdbb83a4381984360247 (diff)
downloadsrc-2f22c84c3112bef2abaf3416118f09684ffc396d.tar.gz
src-2f22c84c3112bef2abaf3416118f09684ffc396d.zip
Wait 100 microseconds for a local APIC to dispatch each startup-related IPI
rather than 20. The MP 1.4 specification states in Appendix B.2: "A period of 20 microseconds should be sufficient for IPI dispatch to complete under normal operating conditions". (Note that this appears to be separate from the 10 millisecond (INIT) and 200 microsecond (STARTUP) waits after the IPIs are dispatched.) The Intel SDM is silent on this issue as far as I can tell. At least some hardware requires 60 microseconds as noted in the PR, so bump this to 100 to be on the safe side. PR: 197756 Reported by: zaphod@berentweb.com MFC after: 1 week
Notes
Notes: svn path=/head/; revision=280866
Diffstat (limited to 'sys/i386')
-rw-r--r--sys/i386/i386/mp_machdep.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/sys/i386/i386/mp_machdep.c b/sys/i386/i386/mp_machdep.c
index cb230de0c1d1..083b28381005 100644
--- a/sys/i386/i386/mp_machdep.c
+++ b/sys/i386/i386/mp_machdep.c
@@ -1157,7 +1157,7 @@ ipi_startup(int apic_id, int vector)
*/
lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_LEVEL |
APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_INIT, apic_id);
- lapic_ipi_wait(20);
+ lapic_ipi_wait(100);
/* Explicitly deassert the INIT IPI. */
lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_LEVEL |
@@ -1177,7 +1177,7 @@ ipi_startup(int apic_id, int vector)
lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_EDGE |
APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_STARTUP |
vector, apic_id);
- if (!lapic_ipi_wait(20))
+ if (!lapic_ipi_wait(100))
panic("Failed to deliver first STARTUP IPI to APIC %d",
apic_id);
DELAY(200); /* wait ~200uS */
@@ -1191,7 +1191,7 @@ ipi_startup(int apic_id, int vector)
lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_EDGE |
APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_STARTUP |
vector, apic_id);
- if (!lapic_ipi_wait(20))
+ if (!lapic_ipi_wait(100))
panic("Failed to deliver second STARTUP IPI to APIC %d",
apic_id);