Commit f8bdcc51 authored by Len Brown's avatar Len Brown Committed by Len Brown

[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
parent 381b26f0
......@@ -123,6 +123,10 @@ running once the system is up.
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: <io>,<irq>,<dma>,<dma2>
See also Documentation/sound/oss/AD1816.
......
......@@ -68,6 +68,7 @@ int acpi_strict;
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;
......@@ -335,6 +336,12 @@ acpi_parse_int_src_ovr (
return 0;
}
if (acpi_skip_timer_override &&
intsrc->bus_irq == 0 && intsrc->global_irq == 2) {
printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
return 0;
}
mp_override_legacy_irq (
intsrc->bus_irq,
intsrc->flags.polarity,
......
......@@ -545,6 +545,19 @@ static __init int disable_acpi_pci(struct dmi_blacklist *d)
}
#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
*/
......@@ -950,6 +963,49 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
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
......
......@@ -618,6 +618,9 @@ static void __init parse_cmdline_early (char ** cmdline_p)
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))
......
......@@ -125,6 +125,7 @@ extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq);
#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)
{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment