patch-2.4.22 linux-2.4.22/arch/i386/kernel/dmi_scan.c
Next file: linux-2.4.22/arch/i386/kernel/i387.c
Previous file: linux-2.4.22/arch/i386/kernel/apm.c
Back to the patch index
Back to the overall index
- Lines: 515
- Date:
2003-08-25 04:44:39.000000000 -0700
- Orig file:
linux-2.4.21/arch/i386/kernel/dmi_scan.c
- Orig date:
2003-06-13 07:51:29.000000000 -0700
diff -urN linux-2.4.21/arch/i386/kernel/dmi_scan.c linux-2.4.22/arch/i386/kernel/dmi_scan.c
@@ -23,8 +23,11 @@
u16 handle;
};
+#ifdef DMI_DEBUG
+#define dmi_printk(x) printk x
+#else
#define dmi_printk(x)
-//#define dmi_printk(x) printk x
+#endif
static char * __init dmi_string(struct dmi_header *dm, u8 s)
{
@@ -297,6 +300,32 @@
return 0;
}
+static __init int apm_is_horked_d850md(struct dmi_blacklist *d)
+{
+ if (apm_info.disabled == 0)
+ {
+ apm_info.disabled = 1;
+ printk(KERN_ERR "%s machine detected. Disabling APM.\n", d->ident);
+ printk(KERN_ERR "This bug is fixed in bios P15 which is available for \n");
+ printk(KERN_ERR "download from support.intel.com \n");
+ }
+ return 0;
+}
+
+/*
+ * Some APM bioses hang on APM idle calls
+ */
+
+static __init int apm_likes_to_melt(struct dmi_blacklist *d)
+{
+ if (apm_info.forbid_idle == 0)
+ {
+ apm_info.forbid_idle = 1;
+ printk(KERN_INFO "%s machine detected. Disabling APM idle calls.\n", d->ident);
+ }
+ return 0;
+}
+
/*
* Some machines, usually laptops, can't handle an enabled local APIC.
* The symptoms include hangs or reboots when suspending or resuming,
@@ -414,9 +443,10 @@
* The MP1.4 table is right however and so SMP kernels tend to work.
*/
-extern int skip_ioapic_setup;
+#ifdef CONFIG_PCI
extern int broken_440gx_bios;
extern unsigned int pci_probe;
+#endif
static __init int broken_pirq(struct dmi_blacklist *d)
{
printk(KERN_INFO " *** Possibly defective BIOS detected (irqtable)\n");
@@ -425,13 +455,26 @@
printk(KERN_INFO " *** contact your hardware vendor and ask about updates.\n");
printk(KERN_INFO " *** Building an SMP kernel may evade the bug some of the time.\n");
#ifdef CONFIG_X86_IO_APIC
- skip_ioapic_setup = 0;
+ {
+ extern int skip_ioapic_setup;
+ skip_ioapic_setup = 0;
+ }
#endif
#ifdef CONFIG_PCI
broken_440gx_bios = 1;
pci_probe |= PCI_BIOS_IRQ_SCAN;
#endif
-
+ return 0;
+}
+
+/*
+ * ASUS K7V-RM has broken ACPI table defining sleep modes
+ */
+
+static __init int broken_acpi_Sx(struct dmi_blacklist *d)
+{
+ printk(KERN_WARNING "Detected ASUS mainboard with broken ACPI sleep table\n");
+ dmi_broken |= BROKEN_ACPI_Sx;
return 0;
}
@@ -483,6 +526,18 @@
}
/*
+ * Exploding PnPBIOS. Don't yet know if its the BIOS or us for
+ * some entries
+ */
+
+static __init int exploding_pnp_bios(struct dmi_blacklist *d)
+{
+ printk(KERN_WARNING "%s detected. Disabling PnPBIOS\n", d->ident);
+ dmi_broken |= BROKEN_PNP_BIOS;
+ return 0;
+}
+
+/*
* Simple "print if true" callback
*/
@@ -492,6 +547,47 @@
return 0;
}
+
+#ifdef CONFIG_ACPI_BOOT
+extern int acpi_disabled, use_acpi_pci, acpi_force, acpi_ht;
+
+static __init __attribute__((unused)) int acpi_disable(struct dmi_blacklist *d)
+{
+ if (!acpi_force) {
+ printk(KERN_NOTICE "%s detected: acpi off\n",d->ident);
+ acpi_disabled = 1;
+ } else {
+ printk(KERN_NOTICE
+ "Warning: DMI blacklist says broken, but acpi forced\n");
+ }
+ return 0;
+}
+
+
+/*
+ * Limit ACPI to CPU enumeration for HT
+ */
+static __init __attribute__((unused)) int force_acpi_ht(struct dmi_blacklist *d)
+{
+ if (!acpi_force) {
+ printk(KERN_NOTICE "%s detected: force use of acpi=ht\n", d->ident);
+ acpi_disabled = 1;
+ acpi_ht = 1;
+ } else {
+ printk(KERN_NOTICE
+ "Warning: acpi=force overrules DMI blacklist: acpi=ht\n");
+ }
+ return 0;
+}
+
+static __init int disable_acpi_pci(struct dmi_blacklist *d)
+{
+ printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n", d->ident);
+ use_acpi_pci = 0;
+ return 0;
+}
+#endif
+
/*
* Process the DMI blacklists
*/
@@ -508,17 +604,47 @@
MATCH(DMI_PRODUCT_NAME, "KT7-RAID"),
NO_MATCH, NO_MATCH, NO_MATCH
} },
+ { disable_ide_dma, "Dell Inspiron 8100", { /* Kill DMA on Dell Inspiron 8100 laptops */
+ MATCH(DMI_PRODUCT_NAME, "Inspiron 8100"),
+ MATCH(DMI_SYS_VENDOR,"Dell Computer Corporation"), NO_MATCH, NO_MATCH
+ } },
+
#endif
+ /* Dell Laptop hall of shame */
{ broken_ps2_resume, "Dell Latitude C600", { /* Handle problems with APM on the C600 */
MATCH(DMI_SYS_VENDOR, "Dell"),
MATCH(DMI_PRODUCT_NAME, "Latitude C600"),
NO_MATCH, NO_MATCH
} },
+ { apm_is_horked, "Dell Inspiron 2500", { /* APM crashes */
+ MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
+ MATCH(DMI_PRODUCT_NAME, "Inspiron 2500"),
+ MATCH(DMI_BIOS_VENDOR,"Phoenix Technologies LTD"),
+ MATCH(DMI_BIOS_VERSION,"A11")
+ } },
+ { apm_is_horked, "Dell Dimension 4100", { /* APM crashes */
+ MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
+ MATCH(DMI_PRODUCT_NAME, "XPS-Z"),
+ MATCH(DMI_BIOS_VENDOR,"Intel Corp."),
+ MATCH(DMI_BIOS_VERSION,"A11")
+ } },
+ { set_apm_ints, "Dell Inspiron", { /* Allow interrupts during suspend on Dell Inspiron laptops*/
+ MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
+ MATCH(DMI_PRODUCT_NAME, "Inspiron 4000"),
+ NO_MATCH, NO_MATCH
+ } },
+ { set_apm_ints, "Dell Latitude", { /* Allow interrupts during suspend on Dell Latitude laptops*/
+ MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
+ MATCH(DMI_PRODUCT_NAME, "Latitude C510"),
+ NO_MATCH, NO_MATCH
+ } },
{ broken_apm_power, "Dell Inspiron 5000e", { /* Handle problems with APM on Inspiron 5000e */
MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
MATCH(DMI_BIOS_VERSION, "A04"),
MATCH(DMI_BIOS_DATE, "08/24/2000"), NO_MATCH
} },
+
+ /* other items */
{ broken_apm_power, "Dell Inspiron 2500", { /* Handle problems with APM on Inspiron 2500 */
MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
MATCH(DMI_BIOS_VERSION, "A12"),
@@ -539,16 +665,11 @@
MATCH(DMI_PRODUCT_NAME, "PowerEdge 300/"),
NO_MATCH, NO_MATCH
} },
- { set_bios_reboot, "Dell PowerEdge 2400", { /* Handle problems with rebooting on Dell 300/800's */
+ { set_bios_reboot, "Dell PowerEdge 2400", { /* Handle problems with rebooting on Dell 2400's */
MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
MATCH(DMI_PRODUCT_NAME, "PowerEdge 2400"),
NO_MATCH, NO_MATCH
} },
- { set_apm_ints, "Dell Inspiron", { /* Allow interrupts during suspend on Dell Inspiron laptops*/
- MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
- MATCH(DMI_PRODUCT_NAME, "Inspiron 4000"),
- NO_MATCH, NO_MATCH
- } },
{ set_apm_ints, "Compaq 12XL125", { /* Allow interrupts during suspend on Compaq Laptops*/
MATCH(DMI_SYS_VENDOR, "Compaq"),
MATCH(DMI_PRODUCT_NAME, "Compaq PC"),
@@ -560,6 +681,11 @@
MATCH(DMI_PRODUCT_NAME, "L8400K series Notebook PC"),
NO_MATCH, NO_MATCH
} },
+ { apm_is_horked, "ABIT KX7-333[R]", { /* APM blows on shutdown */
+ MATCH(DMI_BOARD_VENDOR, "ABIT"),
+ MATCH(DMI_BOARD_NAME, "VT8367-8233A (KX7-333[R])"),
+ NO_MATCH, NO_MATCH,
+ } },
{ apm_is_horked, "Trigem Delhi3", { /* APM crashes */
MATCH(DMI_SYS_VENDOR, "TriGem Computer, Inc"),
MATCH(DMI_PRODUCT_NAME, "Delhi3"),
@@ -570,7 +696,7 @@
MATCH(DMI_BIOS_VERSION, "Version1.01"),
NO_MATCH, NO_MATCH,
} },
- { apm_is_horked, "Intel D850MD", { /* APM crashes */
+ { apm_is_horked_d850md, "Intel D850MD", { /* APM crashes */
MATCH(DMI_BIOS_VENDOR, "Intel Corp."),
MATCH(DMI_BIOS_VERSION, "MV85010A.86A.0016.P07.0201251536"),
NO_MATCH, NO_MATCH,
@@ -598,6 +724,22 @@
MATCH(DMI_BIOS_VENDOR,"Phoenix Technologies LTD"),
MATCH(DMI_BIOS_VERSION,"A11")
} },
+ { apm_likes_to_melt, "Jabil AMD", { /* APM idle hangs */
+ MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
+ MATCH(DMI_BIOS_VERSION, "0AASNP06"),
+ NO_MATCH, NO_MATCH,
+ } },
+ { apm_likes_to_melt, "AMI Bios", { /* APM idle hangs */
+ MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
+ MATCH(DMI_BIOS_VERSION, "0AASNP05"),
+ NO_MATCH, NO_MATCH,
+ } },
+ { apm_likes_to_melt, "Dell Inspiron 7500", { /* APM idle hangs */
+ MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
+ MATCH(DMI_PRODUCT_NAME, "Inspiron 7500"),
+ NO_MATCH, NO_MATCH,
+ } },
+
{ sony_vaio_laptop, "Sony Vaio", { /* This is a Sony Vaio laptop */
MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
MATCH(DMI_PRODUCT_NAME, "PCG-"),
@@ -692,6 +834,13 @@
NO_MATCH, NO_MATCH
} },
+ { exploding_pnp_bios, "Higraded P14H", { /* BIOSPnP problem */
+ MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
+ MATCH(DMI_BIOS_VERSION, "07.00T"),
+ MATCH(DMI_SYS_VENDOR, "Higraded"),
+ MATCH(DMI_PRODUCT_NAME, "P14H")
+ } },
+
/* Machines which have problems handling enabled local APICs */
{ local_apic_kills_bios, "Dell Inspiron", {
@@ -731,11 +880,26 @@
} },
{ broken_pirq, "l44GX Bios", { /* Bad $PIR */
MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
+ MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0066.P07"),
+ NO_MATCH, NO_MATCH
+ } },
+ { broken_pirq, "IBM xseries 370", { /* Bad $PIR */
+ MATCH(DMI_BIOS_VENDOR, "IBM"),
+ MATCH(DMI_BIOS_VERSION,"MMKT33AUS"),
+ NO_MATCH, NO_MATCH
+ } },
+ { broken_pirq, "l44GX Bios", { /* Bad $PIR */
+ MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0094.P10"),
NO_MATCH, NO_MATCH
} },
{ broken_pirq, "l44GX Bios", { /* Bad $PIR */
MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
+ MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0115.P12"),
+ NO_MATCH, NO_MATCH
+ } },
+ { broken_pirq, "l44GX Bios", { /* Bad $PIR */
+ MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0120.P12"),
NO_MATCH, NO_MATCH
} },
@@ -746,7 +910,17 @@
} },
{ broken_pirq, "l44GX Bios", { /* Bad $PIR */
MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
- MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0066.P07.9906041405"),
+ MATCH(DMI_BIOS_VERSION,"C440GX0.86B"),
+ NO_MATCH, NO_MATCH
+ } },
+ { broken_pirq, "l44GX Bios", { /* Bad $PIR */
+ MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
+ MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0133.P14"),
+ NO_MATCH, NO_MATCH
+ } },
+ { broken_pirq, "l44GX Bios", { /* Bad $PIR */
+ MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
+ MATCH(DMI_BIOS_VERSION,"L440GX0"),
NO_MATCH, NO_MATCH
} },
@@ -757,6 +931,12 @@
NO_MATCH, NO_MATCH, NO_MATCH
} },
+ { broken_acpi_Sx, "ASUS K7V-RM", { /* Bad ACPI Sx table */
+ MATCH(DMI_BIOS_VERSION,"ASUS K7V-RM ACPI BIOS Revision 1003A"),
+ MATCH(DMI_BOARD_NAME, "<K7V-RM>"),
+ NO_MATCH, NO_MATCH
+ } },
+
{ init_ints_after_s1, "Toshiba Satellite 4030cdt", { /* Reinitialization of 8259 is needed after S1 resume */
MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),
NO_MATCH, NO_MATCH, NO_MATCH
@@ -774,7 +954,6 @@
MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook Model GE"),
MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736")
} },
-
/*
* Generic per vendor APM settings
@@ -785,6 +964,115 @@
NO_MATCH, NO_MATCH, NO_MATCH
} },
+#ifdef CONFIG_ACPI_BOOT
+ /*
+ * If your system is blacklisted here, but you find that acpi=force
+ * works for you, please contact acpi-devel@sourceforge.net
+ */
+
+ /*
+ * Boxes that need ACPI disabled
+ */
+
+ { acpi_disable, "IBM Thinkpad", {
+ MATCH(DMI_BOARD_VENDOR, "IBM"),
+ MATCH(DMI_BOARD_NAME, "2629H1G"),
+ NO_MATCH, NO_MATCH }},
+
+ /*
+ * Boxes that need acpi=ht
+ */
+
+ { force_acpi_ht, "FSC Primergy T850", {
+ MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
+ MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "DELL GX240", {
+ MATCH(DMI_BOARD_VENDOR, "Dell Computer Corporation"),
+ MATCH(DMI_BOARD_NAME, "OptiPlex GX240"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "HP VISUALIZE NT Workstation", {
+ MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
+ MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "Compaq ProLiant DL380 G2", {
+ MATCH(DMI_SYS_VENDOR, "Compaq"),
+ MATCH(DMI_PRODUCT_NAME, "ProLiant DL380 G2"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "Compaq ProLiant ML530 G2", {
+ MATCH(DMI_SYS_VENDOR, "Compaq"),
+ MATCH(DMI_PRODUCT_NAME, "ProLiant ML530 G2"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "Compaq ProLiant ML350 G3", {
+ MATCH(DMI_SYS_VENDOR, "Compaq"),
+ MATCH(DMI_PRODUCT_NAME, "ProLiant ML350 G3"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "Compaq Workstation W8000", {
+ MATCH(DMI_SYS_VENDOR, "Compaq"),
+ MATCH(DMI_PRODUCT_NAME, "Workstation W8000"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "ASUS P4B266", {
+ MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
+ MATCH(DMI_BOARD_NAME, "P4B266"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "ASUS P2B-DS", {
+ MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
+ MATCH(DMI_BOARD_NAME, "P2B-DS"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "ASUS CUR-DLS", {
+ MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
+ MATCH(DMI_BOARD_NAME, "CUR-DLS"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "ASUS A7V", {
+ MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),
+ MATCH(DMI_BOARD_NAME, "<A7V>"),
+ MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1011"), NO_MATCH }},
+
+ { force_acpi_ht, "ABIT i440BX-W83977", {
+ MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"),
+ MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "IBM Bladecenter", {
+ MATCH(DMI_BOARD_VENDOR, "IBM"),
+ MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "IBM eServer xSeries 360", {
+ MATCH(DMI_BOARD_VENDOR, "IBM"),
+ MATCH(DMI_BOARD_NAME, "eServer xSeries 360"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "IBM eserver xSeries 330", {
+ MATCH(DMI_BOARD_VENDOR, "IBM"),
+ MATCH(DMI_BOARD_NAME, "eserver xSeries 330"),
+ NO_MATCH, NO_MATCH }},
+
+ { force_acpi_ht, "IBM eserver xSeries 440", {
+ MATCH(DMI_BOARD_VENDOR, "IBM"),
+ MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"),
+ NO_MATCH, NO_MATCH }},
+
+ /*
+ * Boxes that need ACPI PCI IRQ routing disabled
+ */
+
+ { disable_acpi_pci, "ASUS A7V", {
+ MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),
+ MATCH(DMI_BOARD_NAME, "<A7V>"),
+ MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"), NO_MATCH }},
+#endif // CONFIG_ACPI_BOOT
+
{ NULL, }
};
@@ -794,11 +1082,34 @@
* returns 1 or we hit the end.
*/
+
static __init void dmi_check_blacklist(void)
{
struct dmi_blacklist *d;
int i;
+#ifdef CONFIG_ACPI_BOOT
+#define ACPI_BLACKLIST_CUTOFF_YEAR 2001
+
+ if (dmi_ident[DMI_BIOS_DATE]) {
+ char *s = strrchr(dmi_ident[DMI_BIOS_DATE], '/');
+ if (s) {
+ int year, disable = 0;
+ s++;
+ year = simple_strtoul(s,NULL,0);
+ if (year >= 1000)
+ disable = year < ACPI_BLACKLIST_CUTOFF_YEAR;
+ else if (year < 1 || (year > 90 && year <= 99))
+ disable = 1;
+ if (disable && !acpi_force) {
+ printk(KERN_NOTICE "ACPI disabled because your bios is from %s and too old\n", s);
+ printk(KERN_NOTICE "You can enable it with acpi=force\n");
+ acpi_disabled = 1;
+ }
+ }
+ }
+#endif
+
d=&dmi_blacklist[0];
while(d->callback)
{
@@ -829,8 +1140,9 @@
static void __init dmi_decode(struct dmi_header *dm)
{
+#ifdef DMI_DEBUG
u8 *data = (u8 *)dm;
-
+#endif
switch(dm->type)
{
case 0:
@@ -876,4 +1188,7 @@
int err = dmi_iterate(dmi_decode);
if(err == 0)
dmi_check_blacklist();
+ else
+ printk(KERN_INFO "DMI not present.\n");
}
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)