diff options
author | rpaulo <rpaulo@FreeBSD.org> | 2007-12-12 20:24:06 +0000 |
---|---|---|
committer | rpaulo <rpaulo@FreeBSD.org> | 2007-12-12 20:24:06 +0000 |
commit | 59ef90c02df1fbdd88915fef02d7b0fcc73ecf41 (patch) | |
tree | eb005d916961173ecc3365e9a4e1890ae59f6a31 /sys/amd64 | |
parent | 95a448c7cbf19f26d0ed071ced5ce83aeeb2c4b2 (diff) | |
download | FreeBSD-src-59ef90c02df1fbdd88915fef02d7b0fcc73ecf41.zip FreeBSD-src-59ef90c02df1fbdd88915fef02d7b0fcc73ecf41.tar.gz |
Disallow the legacy USB circuit to generate an SMI# via an ICH
register (MacBooks only).
This allows MacBooks to boot in SMP mode without any trick and solves
the timer problems with HZ=1000.
MFC after: 1 week
Reviewed by: njl (mentor), jhb
Approved by: njl (mentor), jhb
Diffstat (limited to 'sys/amd64')
-rw-r--r-- | sys/amd64/amd64/machdep.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index 1928518..24226f7 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -155,6 +155,10 @@ SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL) extern vm_offset_t ksym_start, ksym_end; #endif +/* Intel ICH registers */ +#define ICH_PMBASE 0x400 +#define ICH_SMI_EN ICH_PMBASE + 0x30 + int _udatasel, _ucodesel, _ucode32sel; int cold = 1; @@ -192,6 +196,27 @@ static void cpu_startup(dummy) void *dummy; { + char *sysenv; + + /* + * On MacBooks, we need to disallow the legacy USB circuit to + * generate an SMI# because this can cause several problems, + * namely: incorrect CPU frequency detection and failure to + * start the APs. + * We do this by disabling a bit in the SMI_EN (SMI Control and + * Enable register) of the Intel ICH LPC Interface Bridge. + */ + sysenv = getenv("smbios.system.product"); + if (sysenv != NULL) { + if (strncmp(sysenv, "MacBook", 7) == 0) { + if (bootverbose) + printf("Disabling LEGACY_USB_EN bit on " + "Intel ICH.\n"); + outl(ICH_SMI_EN, inl(ICH_SMI_EN) & ~0x8); + } + freeenv(sysenv); + } + /* * Good {morning,afternoon,evening,night}. */ |