# This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/04/22 22:42:49-04:00 len.brown@intel.com # [ACPI] workaround for nForce2 BIOS bug: XT-PIC timer in IOAPIC mode # "acpi_skip_timer_override" boot parameter # dmi_scan for common platforms, may be replaced with PCI-ID in future. # http://bugzilla.kernel.org/show_bug.cgi?id=1203 # # include/asm-i386/acpi.h # 2004/04/22 22:39:01-04:00 len.brown@intel.com +1 -0 # add acpi_skip_timer_override # # arch/i386/kernel/setup.c # 2004/04/22 22:39:01-04:00 len.brown@intel.com +3 -0 # add acpi_skip_timer_override # # arch/i386/kernel/dmi_scan.c # 2004/04/22 22:39:01-04:00 len.brown@intel.com +56 -0 # add acpi_skip_timer_override # # arch/i386/kernel/acpi/boot.c # 2004/04/22 22:39:01-04:00 len.brown@intel.com +6 -0 # add acpi_skip_timer_override # # Documentation/kernel-parameters.txt # 2004/04/22 22:39:01-04:00 len.brown@intel.com +4 -0 # add acpi_skip_timer_override # diff -Nru a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt --- a/Documentation/kernel-parameters.txt Thu Apr 22 22:42:56 2004 +++ b/Documentation/kernel-parameters.txt Thu Apr 22 22:42:56 2004 @@ -122,6 +122,10 @@ acpi_serialize [HW,ACPI] force serialization of AML methods + acpi_skip_timer_override [HW,ACPI] + Recognize and ignore IRQ0/pin2 Interrupt Override. + For broken nForce2 BIOS resulting in XT-PIC timer. + ad1816= [HW,OSS] Format: ,,, See also Documentation/sound/oss/AD1816. diff -Nru a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c --- a/arch/i386/kernel/acpi/boot.c Thu Apr 22 22:42:56 2004 +++ b/arch/i386/kernel/acpi/boot.c Thu Apr 22 22:42:56 2004 @@ -62,6 +62,7 @@ acpi_interrupt_flags acpi_sci_flags __initdata; int acpi_sci_override_gsi __initdata; +int acpi_skip_timer_override __initdata; #ifdef CONFIG_X86_LOCAL_APIC static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; @@ -327,6 +328,11 @@ acpi_sci_ioapic_setup(intsrc->global_irq, intsrc->flags.polarity, intsrc->flags.trigger); return 0; + } + + if (acpi_skip_timer_override && + intsrc->bus_irq == 0 && intsrc->global_irq == 2) { + printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n"); } mp_override_legacy_irq ( diff -Nru a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c --- a/arch/i386/kernel/dmi_scan.c Thu Apr 22 22:42:56 2004 +++ b/arch/i386/kernel/dmi_scan.c Thu Apr 22 22:42:56 2004 @@ -540,6 +540,19 @@ #endif /* + * early nForce2 reference BIOS shipped with a + * bogus ACPI IRQ0 -> pin2 interrupt override -- ignore it + */ +static __init int ignore_timer_override(struct dmi_blacklist *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; +} +/* * Process the DMI blacklists */ @@ -944,6 +957,49 @@ MATCH(DMI_BOARD_VENDOR, "IBM"), MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"), NO_MATCH, NO_MATCH }}, + + /* + * 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", { + MATCH(DMI_BOARD_VENDOR, "http://www.abit.com.tw/"), + MATCH(DMI_BOARD_NAME, "NF7-S/NF7,NF7-V (nVidia-nForce2)"), + MATCH(DMI_BIOS_VERSION, "6.00 PG"), + MATCH(DMI_BIOS_DATE, "03/24/2004") }}, + + { ignore_timer_override, "Asus A7N8X v2", { + MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + MATCH(DMI_BOARD_NAME, "A7N8X2.0"), + MATCH(DMI_BIOS_VERSION, "ASUS A7N8X2.0 Deluxe ACPI BIOS Rev 1007"), + MATCH(DMI_BIOS_DATE, "10/06/2003") }}, + + { ignore_timer_override, "Asus A7N8X-X", { + MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + MATCH(DMI_BOARD_NAME, "A7N8X-X"), + MATCH(DMI_BIOS_VERSION, "ASUS A7N8X-X ACPI BIOS Rev 1009"), + MATCH(DMI_BIOS_DATE, "2/3/2004") }}, + + { ignore_timer_override, "MSI K7N2-Delta", { + MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), + MATCH(DMI_BOARD_NAME, "MS-6570"), + MATCH(DMI_BIOS_VERSION, "6.00 PG"), + MATCH(DMI_BIOS_DATE, "03/29/2004") }}, + + { ignore_timer_override, "Shuttle SN41G2", { + MATCH(DMI_BOARD_VENDOR, "Shuttle Inc"), + MATCH(DMI_BOARD_NAME, "FN41"), + MATCH(DMI_BIOS_VERSION, "6.00 PG"), + MATCH(DMI_BIOS_DATE, "01/14/2004") }}, + + { ignore_timer_override, "Shuttle AN35N", { + MATCH(DMI_BOARD_VENDOR, "Shuttle Inc"), + MATCH(DMI_BOARD_NAME, "AN35"), + MATCH(DMI_BIOS_VERSION, "6.00 PG"), + MATCH(DMI_BIOS_DATE, "12/05/2003") }}, #endif // CONFIG_ACPI_BOOT #ifdef CONFIG_ACPI_PCI diff -Nru a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c --- a/arch/i386/kernel/setup.c Thu Apr 22 22:42:56 2004 +++ b/arch/i386/kernel/setup.c Thu Apr 22 22:42:56 2004 @@ -614,6 +614,9 @@ else if (!memcmp(from, "acpi_sci=low", 12)) acpi_sci_flags.polarity = 3; + else if (!memcmp(from, "acpi_skip_timer_override", 24)) + acpi_skip_timer_override = 1; + #ifdef CONFIG_X86_LOCAL_APIC /* disable IO-APIC */ else if (!memcmp(from, "noapic", 6)) diff -Nru a/include/asm-i386/acpi.h b/include/asm-i386/acpi.h --- a/include/asm-i386/acpi.h Thu Apr 22 22:42:56 2004 +++ b/include/asm-i386/acpi.h Thu Apr 22 22:42:56 2004 @@ -118,6 +118,7 @@ #ifdef CONFIG_X86_IO_APIC extern int skip_ioapic_setup; extern int acpi_irq_to_vector(u32 irq); /* deprecated in favor of acpi_gsi_to_irq */ +extern int acpi_skip_timer_override; static inline void disable_ioapic_setup(void) {