aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2012-03-07 09:25:34 +0000
committerJan Beulich <jbeulich@novell.com>2012-03-07 09:25:34 +0000
commitb1aff7cfd4ad96ee868dfeb392b41aab2e65e136 (patch)
tree7304f1c67178661915884c740e7c1d769ce748c0
parentf75220f94be838f0f65dff68ffc2426ccc88ad9a (diff)
downloadxen-b1aff7cfd4ad96ee868dfeb392b41aab2e65e136.tar.gz
xen-b1aff7cfd4ad96ee868dfeb392b41aab2e65e136.tar.bz2
xen-b1aff7cfd4ad96ee868dfeb392b41aab2e65e136.zip
x86: work around certain Intel BIOSes causing (transient) hangs during
boot They apparently leave the USB legacy emulation bits set in ICH10's SMI Control and Enable register, but fail to handle the resulting SMIs gracefully. The hangs can apparently extend indefinitely, but are commonly observed to last between a few seconds and a minute. This assumes that only ICH10-based systems on Intel main boards with Intel BIOS may be affected. Until Intel comes up with a more precise identification of affected BIOSes, all Intel ones on Intel boards will get this workaround applied. Signed-off-by: Jan Beulich <jbeulich@novell.com> xen-unstable changeset: 23795:e17f70940d1f xen-unstable date: Sat Aug 27 12:14:38 2011 +0100
-rw-r--r--xen/arch/x86/dmi_scan.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/xen/arch/x86/dmi_scan.c b/xen/arch/x86/dmi_scan.c
index 5193f2ccfa..41df72a129 100644
--- a/xen/arch/x86/dmi_scan.c
+++ b/xen/arch/x86/dmi_scan.c
@@ -9,6 +9,8 @@
#include <asm/io.h>
#include <asm/system.h>
#include <xen/dmi.h>
+#include <xen/pci.h>
+#include <xen/pci_regs.h>
#define bt_ioremap(b,l) ((u8 *)__acpi_map_table(b,l))
#define bt_iounmap(b,l) ((void)0)
@@ -188,6 +190,28 @@ static __init int broken_toshiba_keyboard(struct dmi_blacklist *d)
return 0;
}
+static int __init ich10_bios_quirk(struct dmi_system_id *d)
+{
+ u32 port, smictl;
+
+ if ( pci_conf_read16(0, 0x1f, 0, PCI_VENDOR_ID) != 0x8086 )
+ return 0;
+
+ switch ( pci_conf_read16(0, 0x1f, 0, PCI_DEVICE_ID) ) {
+ case 0x3a14:
+ case 0x3a16:
+ case 0x3a18:
+ case 0x3a1a:
+ port = (pci_conf_read16(0, 0x1f, 0, 0x40) & 0xff80) + 0x30;
+ smictl = inl(port);
+ /* turn off LEGACY_USB{,2}_EN if enabled */
+ if ( smictl & 0x20008 )
+ outl(smictl & ~0x20008, port);
+ break;
+ }
+
+ return 0;
+}
#ifdef CONFIG_ACPI_SLEEP
static __init int reset_videomode_after_s3(struct dmi_blacklist *d)
@@ -273,6 +297,18 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
} },
#endif
+ { ich10_bios_quirk, "Intel board & BIOS",
+ /*
+ * BIOS leaves legacy USB emulation enabled while
+ * SMM can't properly handle it.
+ */
+ {
+ MATCH(DMI_BOARD_VENDOR, "Intel Corp"),
+ MATCH(DMI_BIOS_VENDOR, "Intel Corp"),
+ NO_MATCH, NO_MATCH
+ }
+ },
+
#ifdef CONFIG_ACPI_BOOT
/*
* If your system is blacklisted here, but you find that acpi=force