83 lines
2.4 KiB
Diff
83 lines
2.4 KiB
Diff
|
References: bnc#683580
|
||
|
|
||
|
# HG changeset patch
|
||
|
# User Jan Beulich <jbeulich@novell.com>
|
||
|
# Date 1314443678 -3600
|
||
|
# Node ID e17f70940d1f57fe04dde3bf4e243f75c89f0d0e
|
||
|
# Parent 4705eca37c9fac9d13867a856bdcfa8b7bad56c6
|
||
|
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>
|
||
|
|
||
|
Index: xen-4.1.2-testing/xen/arch/x86/dmi_scan.c
|
||
|
===================================================================
|
||
|
--- xen-4.1.2-testing.orig/xen/arch/x86/dmi_scan.c
|
||
|
+++ xen-4.1.2-testing/xen/arch/x86/dmi_scan.c
|
||
|
@@ -10,6 +10,8 @@
|
||
|
#include <asm/system.h>
|
||
|
#include <xen/dmi.h>
|
||
|
#include <xen/efi.h>
|
||
|
+#include <xen/pci.h>
|
||
|
+#include <xen/pci_regs.h>
|
||
|
|
||
|
#define bt_ioremap(b,l) ((void *)__acpi_map_table(b,l))
|
||
|
#define bt_iounmap(b,l) ((void)0)
|
||
|
@@ -278,6 +280,28 @@ static __init int broken_toshiba_keyboar
|
||
|
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)
|
||
|
@@ -363,6 +387,18 @@ static __initdata struct dmi_blacklist d
|
||
|
} },
|
||
|
#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
|