From: Andrey Panin Signed-off-by: Andrew Morton --- 25-akpm/arch/i386/kernel/acpi/boot.c | 213 +++++++++++++++++++++++++++++++++++ 25-akpm/arch/i386/kernel/dmi_scan.c | 213 ----------------------------------- 2 files changed, 214 insertions(+), 212 deletions(-) diff -puN arch/i386/kernel/acpi/boot.c~dmi-port-acpi-boot-code-to-new-dmi-probing arch/i386/kernel/acpi/boot.c --- 25/arch/i386/kernel/acpi/boot.c~dmi-port-acpi-boot-code-to-new-dmi-probing Fri May 28 14:28:51 2004 +++ 25-akpm/arch/i386/kernel/acpi/boot.c Fri May 28 14:28:51 2004 @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -768,6 +769,216 @@ acpi_process_madt(void) return; } + +extern int acpi_force; + +static int __init dmi_disable_acpi(struct dmi_system_id *d) +{ + if (!acpi_force) { + printk(KERN_NOTICE "%s detected: acpi off\n", d->ident); + disable_acpi(); + } else + printk(KERN_NOTICE "Warning: DMI blacklist says broken, but acpi forced\n"); + + return 0; +} + +/* Limit ACPI to CPU enumeration for HT */ +static int __init force_acpi_ht(struct dmi_system_id *d) +{ + if (!acpi_force) { + printk(KERN_NOTICE "%s detected: force use of acpi=ht\n", d->ident); + disable_acpi(); + acpi_ht = 1; + } else + printk(KERN_NOTICE "Warning: acpi=force overrules DMI blacklist: acpi=ht\n"); + + return 0; +} + +/* + * early nForce2 reference BIOS shipped with a + * bogus ACPI IRQ0 -> pin2 interrupt override -- ignore it + */ +static int __init ignore_timer_override(struct dmi_system_id *d) +{ + printk(KERN_NOTICE "%s detected: BIOS IRQ0 pin2 override" + " will be ignored\n", d->ident); + + acpi_skip_timer_override = 1; + return 0; +} + +/* + * If your system is blacklisted here, but you find that acpi=force + * works for you, please contact acpi-devel@sourceforge.net + */ +static struct dmi_system_id __initdata acpiboot_dmi_table[] = { + /* Boxes that need ACPI disabled */ + { + dmi_disable_acpi, "IBM Thinkpad", + { DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), + DMI_MATCH(DMI_BOARD_NAME, "2629H1G"), }, + }, + + /* Boxes that need acpi=ht */ + { + force_acpi_ht, "FSC Primergy T850", + { DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"), }, + }, + { + force_acpi_ht, "DELL GX240", + { DMI_MATCH(DMI_BOARD_VENDOR, "Dell Computer Corporation"), + DMI_MATCH(DMI_BOARD_NAME, "OptiPlex GX240"), }, + }, + { + force_acpi_ht, "HP VISUALIZE NT Workstation", + { DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"), }, + }, + { + force_acpi_ht, "Compaq ProLiant DL380 G2", + { DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL380 G2"), }, + }, + { + force_acpi_ht, "Compaq ProLiant ML530 G2", + { DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant ML530 G2"), }, + }, + { + force_acpi_ht, "Compaq ProLiant ML350 G3", + { DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), + DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant ML350 G3"), }, + }, + { + force_acpi_ht, "Compaq Workstation W8000", + { DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), + DMI_MATCH(DMI_PRODUCT_NAME, "Workstation W8000"), }, + }, + { + force_acpi_ht, "ASUS P4B266", + { DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "P4B266"), }, + }, + { + force_acpi_ht, "ASUS P2B-DS", + { DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "P2B-DS"), }, + }, + { + force_acpi_ht, "ASUS CUR-DLS", + { DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "CUR-DLS"), }, + }, + { + force_acpi_ht, "ABIT i440BX-W83977", + { DMI_MATCH(DMI_BOARD_VENDOR, "ABIT "), + DMI_MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"), }, + }, + { + force_acpi_ht, "IBM Bladecenter", + { DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), + DMI_MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"), }, + }, + { + force_acpi_ht, "IBM eServer xSeries 360", + { DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), + DMI_MATCH(DMI_BOARD_NAME, "eServer xSeries 360"), }, + }, + { + force_acpi_ht, "IBM eserver xSeries 330", + { DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), + DMI_MATCH(DMI_BOARD_NAME, "eserver xSeries 330"), }, + }, + { + force_acpi_ht, "IBM eserver xSeries 440", + { DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), + DMI_MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"), }, + }, + + /* + * Systems with nForce2 BIOS timer override bug + * nVidia claims all nForce have timer on pin0, + * and applying this workaround is a NOP on fixed BIOS, + * so prospects are good for replacing these entries + * with something to key of chipset PCI-ID. + */ + { + ignore_timer_override, "Abit NF7-S v2", + { DMI_MATCH(DMI_BOARD_VENDOR, "http://www.abit.com.tw/"), + DMI_MATCH(DMI_BOARD_NAME, "NF7-S/NF7,NF7-V (nVidia-nForce2)"), + DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"), + DMI_MATCH(DMI_BIOS_DATE, "03/24/2004"), }, + }, + { + ignore_timer_override, "Asus A7N8X v2", + { DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "A7N8X2.0"), + DMI_MATCH(DMI_BIOS_VERSION, "ASUS A7N8X2.0 Deluxe ACPI BIOS Rev 1007"), + DMI_MATCH(DMI_BIOS_DATE, "10/06/2003"), }, + }, + + { + ignore_timer_override, "Asus A7N8X-X", + { DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "A7N8X-X"), + DMI_MATCH(DMI_BIOS_VERSION, "ASUS A7N8X-X ACPI BIOS Rev 1009"), + DMI_MATCH(DMI_BIOS_DATE, "2/3/2004"), }, + }, + { + ignore_timer_override, "MSI K7N2-Delta", + { DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), + DMI_MATCH(DMI_BOARD_NAME, "MS-6570"), + DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"), + DMI_MATCH(DMI_BIOS_DATE, "03/29/2004"), }, + }, + { + ignore_timer_override, "Shuttle SN41G2", + { DMI_MATCH(DMI_BOARD_VENDOR, "Shuttle Inc"), + DMI_MATCH(DMI_BOARD_NAME, "FN41"), + DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"), + DMI_MATCH(DMI_BIOS_DATE, "01/14/2004"), }, + }, + { + ignore_timer_override, "Shuttle AN35N", + { DMI_MATCH(DMI_BOARD_VENDOR, "Shuttle Inc"), + DMI_MATCH(DMI_BOARD_NAME, "AN35"), + DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"), + DMI_MATCH(DMI_BIOS_DATE, "12/05/2003"), }, + }, + + { }, +}; + +#define ACPI_BLACKLIST_CUTOFF_YEAR 2001 + +static void __init acpi_boot_dmi_check(void) +{ + char *bios_date = dmi_get_system_info(DMI_BIOS_DATE); + + if (bios_date) { + char *s = strrchr(bios_date, '/'); + + if (s) { + int disable = 0, 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"); + disable_acpi(); + } + } + } + + dmi_check_system(acpiboot_dmi_table); +} + /* * acpi_boot_init() * called from setup_arch(), always. @@ -793,6 +1004,8 @@ acpi_boot_init (void) { int error; + acpi_boot_dmi_check(); + /* * If acpi_disabled, bail out * One exception: acpi=ht continues far enough to enumerate LAPICs diff -puN arch/i386/kernel/dmi_scan.c~dmi-port-acpi-boot-code-to-new-dmi-probing arch/i386/kernel/dmi_scan.c --- 25/arch/i386/kernel/dmi_scan.c~dmi-port-acpi-boot-code-to-new-dmi-probing Fri May 28 14:28:51 2004 +++ 25-akpm/arch/i386/kernel/dmi_scan.c Fri May 28 14:28:51 2004 @@ -290,52 +290,6 @@ static __init int acer_cpufreq_pst(struc } -#ifdef CONFIG_ACPI_BOOT -extern int acpi_force; - -static __init __attribute__((unused)) int dmi_disable_acpi(struct dmi_system_id *d) -{ - if (!acpi_force) { - printk(KERN_NOTICE "%s detected: acpi off\n",d->ident); - disable_acpi(); - } 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_system_id *d) -{ - if (!acpi_force) { - printk(KERN_NOTICE "%s detected: force use of acpi=ht\n", d->ident); - disable_acpi(); - acpi_ht = 1; - } else { - printk(KERN_NOTICE - "Warning: acpi=force overrules DMI blacklist: acpi=ht\n"); - } - return 0; -} - -/* - * early nForce2 reference BIOS shipped with a - * bogus ACPI IRQ0 -> pin2 interrupt override -- ignore it - */ -static __init int ignore_timer_override(struct dmi_system_id *d) -{ - extern int acpi_skip_timer_override; - printk(KERN_NOTICE "%s detected: BIOS IRQ0 pin2 override" - " will be ignored\n", d->ident); - - acpi_skip_timer_override = 1; - return 0; -} -#endif - #ifdef CONFIG_ACPI_PCI static __init int disable_acpi_irq(struct dmi_system_id *d) { @@ -424,55 +378,6 @@ static __initdata struct dmi_system_id d DMI_MATCH(DMI_BIOS_VERSION, "3A71"), } }, -#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 - */ - - { dmi_disable_acpi, "IBM Thinkpad", { - DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), - DMI_MATCH(DMI_BOARD_NAME, "2629H1G"), - } }, - - /* - * Boxes that need acpi=ht - */ - - { force_acpi_ht, "FSC Primergy T850", { - DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), - DMI_MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"), - }}, - - { force_acpi_ht, "DELL GX240", { - DMI_MATCH(DMI_BOARD_VENDOR, "Dell Computer Corporation"), - DMI_MATCH(DMI_BOARD_NAME, "OptiPlex GX240"), - }}, - - { force_acpi_ht, "HP VISUALIZE NT Workstation", { - DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), - DMI_MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"), - }}, - - { force_acpi_ht, "Compaq ProLiant DL380 G2", { - DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), - DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL380 G2"), - }}, - - { force_acpi_ht, "Compaq ProLiant ML530 G2", { - DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), - DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant ML530 G2"), - }}, - - { force_acpi_ht, "Compaq ProLiant ML350 G3", { - DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), - DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant ML350 G3"), - }}, - #ifdef CONFIG_SERIO_I8042 { set_8042_nomux, "Compaq Proliant 8500", { DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), @@ -481,95 +386,6 @@ static __initdata struct dmi_system_id d }}, #endif - { force_acpi_ht, "Compaq Workstation W8000", { - DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), - DMI_MATCH(DMI_PRODUCT_NAME, "Workstation W8000"), - }}, - - { force_acpi_ht, "ASUS P4B266", { - DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), - DMI_MATCH(DMI_BOARD_NAME, "P4B266"), - }}, - - { force_acpi_ht, "ASUS P2B-DS", { - DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), - DMI_MATCH(DMI_BOARD_NAME, "P2B-DS"), - }}, - - { force_acpi_ht, "ASUS CUR-DLS", { - DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), - DMI_MATCH(DMI_BOARD_NAME, "CUR-DLS"), - }}, - - { force_acpi_ht, "ABIT i440BX-W83977", { - DMI_MATCH(DMI_BOARD_VENDOR, "ABIT "), - DMI_MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"), - }}, - - { force_acpi_ht, "IBM Bladecenter", { - DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), - DMI_MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"), - }}, - - { force_acpi_ht, "IBM eServer xSeries 360", { - DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), - DMI_MATCH(DMI_BOARD_NAME, "eServer xSeries 360"), - }}, - - { force_acpi_ht, "IBM eserver xSeries 330", { - DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), - DMI_MATCH(DMI_BOARD_NAME, "eserver xSeries 330"), - }}, - - { force_acpi_ht, "IBM eserver xSeries 440", { - DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), - DMI_MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"), - }}, - - /* - * Systems with nForce2 BIOS timer override bug - * nVidia claims all nForce have timer on pin0, - * and applying this workaround is a NOP on fixed BIOS, - * so prospects are good for replacing these entries - * with something to key of chipset PCI-ID. - */ - { ignore_timer_override, "Abit NF7-S v2", { - DMI_MATCH(DMI_BOARD_VENDOR, "http://www.abit.com.tw/"), - DMI_MATCH(DMI_BOARD_NAME, "NF7-S/NF7,NF7-V (nVidia-nForce2)"), - DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"), - DMI_MATCH(DMI_BIOS_DATE, "03/24/2004") }}, - - { ignore_timer_override, "Asus A7N8X v2", { - DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), - DMI_MATCH(DMI_BOARD_NAME, "A7N8X2.0"), - DMI_MATCH(DMI_BIOS_VERSION, "ASUS A7N8X2.0 Deluxe ACPI BIOS Rev 1007"), - DMI_MATCH(DMI_BIOS_DATE, "10/06/2003") }}, - - { ignore_timer_override, "Asus A7N8X-X", { - DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), - DMI_MATCH(DMI_BOARD_NAME, "A7N8X-X"), - DMI_MATCH(DMI_BIOS_VERSION, "ASUS A7N8X-X ACPI BIOS Rev 1009"), - DMI_MATCH(DMI_BIOS_DATE, "2/3/2004") }}, - - { ignore_timer_override, "MSI K7N2-Delta", { - DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), - DMI_MATCH(DMI_BOARD_NAME, "MS-6570"), - DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"), - DMI_MATCH(DMI_BIOS_DATE, "03/29/2004") }}, - - { ignore_timer_override, "Shuttle SN41G2", { - DMI_MATCH(DMI_BOARD_VENDOR, "Shuttle Inc"), - DMI_MATCH(DMI_BOARD_NAME, "FN41"), - DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"), - DMI_MATCH(DMI_BIOS_DATE, "01/14/2004") }}, - - { ignore_timer_override, "Shuttle AN35N", { - DMI_MATCH(DMI_BOARD_VENDOR, "Shuttle Inc"), - DMI_MATCH(DMI_BOARD_NAME, "AN35"), - DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"), - DMI_MATCH(DMI_BIOS_DATE, "12/05/2003") }}, -#endif // CONFIG_ACPI_BOOT - #ifdef CONFIG_ACPI_PCI /* * Boxes that need ACPI PCI IRQ routing disabled @@ -645,33 +461,6 @@ char * dmi_get_system_info(int field) EXPORT_SYMBOL(dmi_get_system_info); -static __init void dmi_check_blacklist(void) -{ -#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 disable = 0, 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"); - disable_acpi(); - } - } - } -#endif - dmi_check_system(dmi_blacklist); -} - - - /* * Process a DMI table entry. Right now all we care about are the BIOS * and machine entries. For 2.5 we should pull the smbus controller info @@ -727,7 +516,7 @@ static void __init dmi_decode(struct dmi void __init dmi_scan_machine(void) { if (!dmi_iterate(dmi_decode)) - dmi_check_blacklist(); + dmi_check_system(dmi_blacklist); else printk(KERN_INFO "DMI not present.\n"); } _