http://linux-acpi.bkbits.net/linux-acpi-test-2.6.6 len.brown@intel.com[lenb]|ChangeSet|20040425032027|29218 len.brown # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/04/24 23:20:27-04:00 len.brown@intel.com # ACPI irq->gsi naming (Bjorn Helgaas) # # include/linux/acpi.h # 2004/04/02 08:48:53-05:00 len.brown@intel.com +1 -0 # irq -> gsi naming # # include/acpi/acpiosxf.h # 2004/04/02 08:52:13-05:00 len.brown@intel.com +3 -3 # irq -> gsi naming # # drivers/acpi/osl.c # 2004/04/02 08:56:24-05:00 len.brown@intel.com +10 -14 # irq -> gsi naming # # ChangeSet # 2004/04/24 02:18:14-04:00 len.brown@intel.com # [ACPI] No IRQ known... - using IRQ 255 (Bjarni Rúnar Einarsson) # http://bugzilla.kernel.org/show_bug.cgi?id=2148 # # drivers/acpi/pci_irq.c # 2004/04/24 02:17:22-04:00 len.brown@intel.com +1 -1 # ACPI: No IRQ known ... - using IRQ 255 (Bjarni Rúnar Einarsson) # http://bugzilla.kernel.org/show_bug.cgi?id=2148 # # ChangeSet # 2004/04/23 15:43:23-04:00 len.brown@intel.com # Merge intel.com:/home/lenb/src/linux-acpi-test-2.6.5 # into intel.com:/home/lenb/src/linux-acpi-test-2.6.6 # # arch/x86_64/kernel/setup.c # 2004/04/23 15:43:21-04:00 len.brown@intel.com +0 -0 # Auto merged # # arch/x86_64/kernel/mpparse.c # 2004/04/23 15:43:21-04:00 len.brown@intel.com +0 -0 # Auto merged # # arch/x86_64/kernel/io_apic.c # 2004/04/23 15:43:20-04:00 len.brown@intel.com +0 -0 # Auto merged # # arch/i386/pci/irq.c # 2004/04/23 15:43:20-04:00 len.brown@intel.com +0 -0 # Auto merged # # arch/i386/kernel/setup.c # 2004/04/23 15:43:20-04:00 len.brown@intel.com +0 -0 # Auto merged # # arch/i386/kernel/io_apic.c # 2004/04/23 15:43:20-04:00 len.brown@intel.com +0 -0 # Auto merged # # arch/i386/kernel/dmi_scan.c # 2004/04/23 15:43:20-04:00 len.brown@intel.com +0 -0 # Auto merged # # ChangeSet # 2004/04/23 13:15:31-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/23 08:39:18-04:00 len.brown@intel.com +1 -0 # add acpi_skip_timer_override # # arch/i386/kernel/setup.c # 2004/04/23 08:39:18-04:00 len.brown@intel.com +3 -0 # add acpi_skip_timer_override # # arch/i386/kernel/dmi_scan.c # 2004/04/23 08:39:18-04:00 len.brown@intel.com +56 -0 # add acpi_skip_timer_override # # arch/i386/kernel/acpi/boot.c # 2004/04/23 08:39:18-04:00 len.brown@intel.com +7 -0 # add acpi_skip_timer_override # # Documentation/kernel-parameters.txt # 2004/04/23 08:39:18-04:00 len.brown@intel.com +4 -0 # add acpi_skip_timer_override # # ChangeSet # 2004/04/23 13:14:36-04:00 len.brown@intel.com # [ACPI] Workaround "_BBN 0" BIOS bug # enhance "pci=noacpi" to skip ACPI PCI configuration and interrupt config # add "acpi=noirq" to skip just ACPI interrupt config (David Shaohua Li) # http://bugzilla.kernel.org/show_bug.cgi?id=1662 # # include/asm-x86_64/acpi.h # 2004/04/23 08:37:58-04:00 len.brown@intel.com +15 -1 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # include/asm-ia64/acpi.h # 2004/04/23 08:37:58-04:00 len.brown@intel.com +1 -0 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # include/asm-i386/acpi.h # 2004/04/23 08:37:58-04:00 len.brown@intel.com +14 -1 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # drivers/acpi/pci_root.c # 2004/04/23 08:37:58-04:00 len.brown@intel.com +9 -1 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # drivers/acpi/pci_link.c # 2004/04/23 08:37:58-04:00 len.brown@intel.com +1 -1 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # arch/x86_64/kernel/setup.c # 2004/04/23 08:37:58-04:00 len.brown@intel.com +6 -4 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # arch/i386/kernel/setup.c # 2004/04/23 08:37:58-04:00 len.brown@intel.com +6 -2 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # arch/i386/kernel/dmi_scan.c # 2004/04/23 08:37:58-04:00 len.brown@intel.com +17 -3 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # arch/i386/kernel/acpi/boot.c # 2004/04/23 08:37:58-04:00 len.brown@intel.com +6 -0 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # Documentation/kernel-parameters.txt # 2004/04/23 08:37:58-04:00 len.brown@intel.com +6 -4 # enhance pci=noacpi to skip ACPI PCI configuration and interrupt config # add acpi=noirq to skip just ACPI interrupt config # # ChangeSet # 2004/04/22 15:15:17-04:00 len.brown@intel.com # [ACPI] allow IRQ2 to be used in ACPI/IOAPIC mode # http://bugzilla.kernel.org/show_bug.cgi?id=2564 # # ChangeSet # 2004/04/22 15:13:43-04:00 len.brown@intel.com # [ACPI] if acpi_os_name= is used, print what it finds # # arch/x86_64/kernel/io_apic.c # 2004/04/22 15:12:30-04:00 len.brown@intel.com +6 -10 # allow IRQ2 to be used in ACPI/IOAPIC mode # # arch/i386/kernel/io_apic.c # 2004/04/22 15:12:30-04:00 len.brown@intel.com +6 -10 # allow IRQ2 to be used in ACPI/IOAPIC mode # # drivers/acpi/osl.c # 2004/04/22 00:32:47-04:00 len.brown@intel.com +2 -1 # if acpi_os_name= is used, print what it finds # # ChangeSet # 2004/04/20 20:55:53-04:00 len.brown@intel.com # ACPI] Delete IRQ2 "cascade" in ACPI IOAPIC mode # no such concept exists in ACPI, frees IRQ2 for use. # # arch/x86_64/kernel/i8259.c # 2004/04/20 20:55:12-04:00 len.brown@intel.com +3 -1 # [ACPI] Delete IRQ2 "cascade" in ACPI IOAPIC mode # # arch/i386/mach-voyager/setup.c # 2004/04/20 20:55:12-04:00 len.brown@intel.com +3 -1 # [ACPI] Delete IRQ2 "cascade" in ACPI IOAPIC mode # # arch/i386/mach-es7000/setup.c # 2004/04/20 20:55:12-04:00 len.brown@intel.com +4 -3 # [ACPI] Delete IRQ2 "cascade" in ACPI IOAPIC mode # # arch/i386/mach-default/setup.c # 2004/04/20 20:55:12-04:00 len.brown@intel.com +3 -1 # [ACPI] Delete IRQ2 "cascade" in ACPI IOAPIC mode # # ChangeSet # 2004/04/20 20:54:14-04:00 len.brown@intel.com # [ACPI] enhance intr-src-override parsing to handle ES7000 # http://bugme.osdl.org/show_bug.cgi?id=2520 # # arch/x86_64/kernel/mpparse.c # 2004/04/20 20:54:03-04:00 len.brown@intel.com +15 -22 # [ACPI] process interrupt source over-rides before legacy identity mappings # # arch/i386/kernel/mpparse.c # 2004/04/20 20:54:03-04:00 len.brown@intel.com +13 -22 # [ACPI] process interrupt source over-rides before legacy identity mappings # # arch/i386/kernel/acpi/boot.c # 2004/04/20 20:54:03-04:00 len.brown@intel.com +3 -3 # [ACPI] process interrupt source over-rides before legacy identity mappings # # ChangeSet # 2004/04/16 22:03:45-04:00 len.brown@intel.com # [ACPI] enable 440GX PIRQ router workaround # # arch/i386/pci/irq.c # 2004/04/16 22:03:06-04:00 len.brown@intel.com +1 -4 # enable 440GX PIRQ workaround # # arch/i386/kernel/dmi_scan.c # 2004/04/16 22:03:06-04:00 len.brown@intel.com +0 -70 # delete broken_pirq() -- it is now handled in pirq router code. # # ChangeSet # 2004/04/14 13:15:03-04:00 len.brown@intel.com # [ACPI] fix x86_64 mis-merge # # arch/x86_64/kernel/Makefile # 2004/04/14 13:08:40-04:00 len.brown@intel.com +1 -1 # fix mis-merge # diff -Nru a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt --- a/Documentation/kernel-parameters.txt Sun Apr 25 22:40:43 2004 +++ b/Documentation/kernel-parameters.txt Sun Apr 25 22:40:43 2004 @@ -91,13 +91,14 @@ acpi= [HW,ACPI] Advanced Configuration and Power Interface Format: { force | off | ht | strict } - force -- enables ACPI for systems with default off - off -- disabled ACPI for systems with default on + force -- enable ACPI if default was off + off -- disable ACPI if default was on + noirq -- do not use ACPI for IRQ routing ht -- run only enough ACPI to enable Hyper Threading strict -- Be less tolerant of platforms that are not strictly ACPI specification compliant. - See also Documentation/pm.txt. + See also Documentation/pm.txt, pci=noacpi acpi_sleep= [HW,ACPI] Sleep options Format: { s3_bios, s3_mode } @@ -122,6 +123,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. @@ -831,7 +836,8 @@ and Omnibook XE3 notebooks. This will have no effect if ACPI IRQ routing is enabled. - noacpi [IA-32] Do not use ACPI for IRQ routing. + noacpi [IA-32] Do not use ACPI for IRQ routing + or for PCI scanning. pcmv= [HW,PCMCIA] BadgePAD 4 diff -Nru a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c --- a/arch/i386/kernel/acpi/boot.c Sun Apr 25 22:40:43 2004 +++ b/arch/i386/kernel/acpi/boot.c Sun Apr 25 22:40:43 2004 @@ -53,7 +53,13 @@ #define PREFIX "ACPI: " +#ifdef CONFIG_ACPI_PCI int acpi_noirq __initdata; /* skip ACPI IRQ initialization */ +int acpi_pci_disabled __initdata; /* skip ACPI PCI scan and IRQ initialization */ +#else +int acpi_noirq __initdata = 1; +int acpi_pci_disabled __initdata = 1; +#endif int acpi_ht __initdata = 1; /* enable HT */ int acpi_lapic; @@ -62,6 +68,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; @@ -329,6 +336,12 @@ 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, @@ -653,9 +666,6 @@ return count; } - /* Build a default routing table for legacy (ISA) interrupts. */ - mp_config_acpi_legacy_irqs(); - count = acpi_table_parse_madt(ACPI_MADT_INT_SRC_OVR, acpi_parse_int_src_ovr, NR_IRQ_VECTORS); if (count < 0) { printk(KERN_ERR PREFIX "Error parsing interrupt source overrides entry\n"); @@ -669,6 +679,9 @@ */ if (!acpi_sci_override_gsi) acpi_sci_ioapic_setup(acpi_fadt.sci_int, 0, 0); + + /* Fill in identity legacy mapings where no override */ + mp_config_acpi_legacy_irqs(); count = acpi_table_parse_madt(ACPI_MADT_NMI_SRC, acpi_parse_nmi_src, NR_IRQ_VECTORS); if (count < 0) { diff -Nru a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c --- a/arch/i386/kernel/dmi_scan.c Sun Apr 25 22:40:43 2004 +++ b/arch/i386/kernel/dmi_scan.c Sun Apr 25 22:40:43 2004 @@ -413,30 +413,6 @@ } /* - * The Intel 440GX hall of shame. - * - * On many (all we have checked) of these boxes the $PIRQ table is wrong. - * The MP1.4 table is right however and so SMP kernels tend to work. - */ - -static __init int broken_pirq(struct dmi_blacklist *d) -{ - - printk(KERN_INFO " *** Possibly defective BIOS detected (irqtable)\n"); - printk(KERN_INFO " *** Many BIOSes matching this signature have incorrect IRQ routing tables.\n"); - printk(KERN_INFO " *** If you see IRQ problems, in particular SCSI resets and hangs at boot\n"); - 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 - { - extern int skip_ioapic_setup; - skip_ioapic_setup = 0; - } -#endif - return 0; -} - -/* * ASUS K7V-RM has broken ACPI table defining sleep modes */ @@ -555,15 +531,34 @@ #endif #ifdef CONFIG_ACPI_PCI +static __init int disable_acpi_irq(struct dmi_blacklist *d) +{ + printk(KERN_NOTICE "%s detected: force use of acpi=noirq\n", d->ident); + acpi_noirq_set(); + 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); - acpi_noirq_set(); + acpi_disable_pci(); return 0; -} +} #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 */ @@ -815,52 +810,6 @@ NO_MATCH, NO_MATCH } }, - /* Problem Intel 440GX bioses */ - - { broken_pirq, "SABR1 Bios", { /* Bad $PIR */ - MATCH(DMI_BIOS_VENDOR, "Intel Corporation"), - MATCH(DMI_BIOS_VERSION,"SABR1"), - 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 - } }, - { broken_pirq, "l44GX Bios", { /* Bad $PIR */ - MATCH(DMI_BIOS_VENDOR, "Intel Corporation"), - MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0125.P13"), - NO_MATCH, NO_MATCH - } }, - { broken_pirq, "l44GX Bios", { /* Bad $PIR */ - MATCH(DMI_BIOS_VENDOR, "Intel Corporation"), - MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0066.P07.9906041405"), - 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 - } }, - - /* Intel in disguise - In this case they can't hide and they don't run - too well either... */ - { broken_pirq, "Dell PowerEdge 8450", { /* Bad $PIR */ - MATCH(DMI_PRODUCT_NAME, "Dell PowerEdge 8450"), - 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, ""), @@ -1018,6 +967,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 @@ -1025,13 +1017,21 @@ * Boxes that need ACPI PCI IRQ routing disabled */ - { disable_acpi_pci, "ASUS A7V", { + { disable_acpi_irq, "ASUS A7V", { MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"), MATCH(DMI_BOARD_NAME, ""), /* newer BIOS, Revision 1011, does work */ MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"), NO_MATCH }}, + /* + * Boxes that need ACPI PCI IRQ routing and PCI scan disabled + */ + { disable_acpi_pci, "ASUS PR-DLS", { /* _BBN 0 bug */ + MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + MATCH(DMI_BOARD_NAME, "PR-DLS"), + MATCH(DMI_BIOS_VERSION, "ASUS PR-DLS ACPI BIOS Revision 1010"), + MATCH(DMI_BIOS_DATE, "03/21/2003") }}, #endif { NULL, } diff -Nru a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c --- a/arch/i386/kernel/io_apic.c Sun Apr 25 22:40:43 2004 +++ b/arch/i386/kernel/io_apic.c Sun Apr 25 22:40:43 2004 @@ -2266,18 +2266,10 @@ /* * - * IRQ's that are handled by the old PIC in all cases: + * IRQ's that are handled by the PIC in the MPS IOAPIC case. * - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ. * Linux doesn't really care, as it's not actually used * for any interrupt handling anyway. - * - There used to be IRQ13 here as well, but all - * MPS-compliant must not use it for FPU coupling and we - * want to use exception 16 anyway. And there are - * systems who connect it to an I/O APIC for other uses. - * Thus we don't mark it special any longer. - * - * Additionally, something is definitely wrong with irq9 - * on PIIX4 boards. */ #define PIC_IRQS (1 << PIC_CASCADE_IR) @@ -2285,7 +2277,11 @@ { enable_IO_APIC(); - io_apic_irqs = ~PIC_IRQS; + if (acpi_ioapic) + io_apic_irqs = ~0; /* all IRQs go through IOAPIC */ + else + io_apic_irqs = ~PIC_IRQS; + printk("ENABLING IO-APIC IRQs\n"); /* diff -Nru a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c --- a/arch/i386/kernel/mpparse.c Sun Apr 25 22:40:43 2004 +++ b/arch/i386/kernel/mpparse.c Sun Apr 25 22:40:43 2004 @@ -929,8 +929,6 @@ u32 gsi) { struct mpc_config_intsrc intsrc; - int i = 0; - int found = 0; int ioapic = -1; int pin = -1; @@ -963,23 +961,9 @@ (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, intsrc.mpc_dstirq); - /* - * If an existing [IOAPIC.PIN -> IRQ] routing entry exists we override it. - * Otherwise create a new entry (e.g. gsi == 2). - */ - for (i = 0; i < mp_irq_entries; i++) { - if ((mp_irqs[i].mpc_srcbus == intsrc.mpc_srcbus) - && (mp_irqs[i].mpc_srcbusirq == intsrc.mpc_srcbusirq)) { - mp_irqs[i] = intsrc; - found = 1; - break; - } - } - if (!found) { - mp_irqs[mp_irq_entries] = intsrc; - if (++mp_irq_entries == MAX_IRQ_SOURCES) - panic("Max # of irq sources exceeded!\n"); - } + mp_irqs[mp_irq_entries] = intsrc; + if (++mp_irq_entries == MAX_IRQ_SOURCES) + panic("Max # of irq sources exceeded!\n"); return; } @@ -1010,13 +994,20 @@ intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid; /* - * Use the default configuration for the IRQs 0-15. These may be + * Use the default configuration for the IRQs 0-15. Unless * overriden by (MADT) interrupt source override entries. */ for (i = 0; i < 16; i++) { + int idx; + + for (idx = 0; idx < mp_irq_entries; idx++) + if (mp_irqs[idx].mpc_srcbus == MP_ISA_BUS && + (mp_irqs[idx].mpc_srcbusirq == i || + mp_irqs[idx].mpc_dstirq == i)) + break; - if (i == 2) - continue; /* Don't connect IRQ2 */ + if (idx != mp_irq_entries) + continue; /* IRQ already used */ intsrc.mpc_irqtype = mp_INT; intsrc.mpc_srcbusirq = i; /* Identity mapped */ diff -Nru a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c --- a/arch/i386/kernel/setup.c Sun Apr 25 22:40:43 2004 +++ b/arch/i386/kernel/setup.c Sun Apr 25 22:40:43 2004 @@ -583,9 +583,13 @@ disable_acpi(); acpi_ht = 1; } - - /* "pci=noacpi" disables ACPI interrupt routing */ + + /* "pci=noacpi" disable ACPI IRQ routing and PCI scan */ else if (!memcmp(from, "pci=noacpi", 10)) { + acpi_disable_pci(); + } + /* "acpi=noirq" disables ACPI interrupt routing */ + else if (!memcmp(from, "acpi=noirq", 10)) { acpi_noirq_set(); } @@ -600,6 +604,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 */ diff -Nru a/arch/i386/mach-default/setup.c b/arch/i386/mach-default/setup.c --- a/arch/i386/mach-default/setup.c Sun Apr 25 22:40:43 2004 +++ b/arch/i386/mach-default/setup.c Sun Apr 25 22:40:43 2004 @@ -7,6 +7,7 @@ #include #include #include +#include #include /** @@ -43,7 +44,8 @@ apic_intr_init(); #endif - setup_irq(2, &irq2); + if (!acpi_ioapic) + setup_irq(2, &irq2); } /** diff -Nru a/arch/i386/mach-es7000/setup.c b/arch/i386/mach-es7000/setup.c --- a/arch/i386/mach-es7000/setup.c Sun Apr 25 22:40:43 2004 +++ b/arch/i386/mach-es7000/setup.c Sun Apr 25 22:40:43 2004 @@ -7,6 +7,7 @@ #include #include #include +#include #include /** @@ -17,8 +18,7 @@ * the "ordinary" interrupt call gates. For legacy reasons, the ISA * interrupts should be initialised here if the machine emulates a PC * in any way. - **/ -void __init pre_intr_init_hook(void) + **/void __init pre_intr_init_hook(void) { init_ISA_irqs(); } @@ -43,7 +43,8 @@ apic_intr_init(); #endif - setup_irq(2, &irq2); + if (!acpi_ioapic) + setup_irq(2, &irq2); } /** diff -Nru a/arch/i386/mach-voyager/setup.c b/arch/i386/mach-voyager/setup.c --- a/arch/i386/mach-voyager/setup.c Sun Apr 25 22:40:43 2004 +++ b/arch/i386/mach-voyager/setup.c Sun Apr 25 22:40:43 2004 @@ -6,6 +6,7 @@ #include #include #include +#include #include void __init pre_intr_init_hook(void) @@ -24,7 +25,8 @@ smp_intr_init(); #endif - setup_irq(2, &irq2); + if (!acpi_ioapic) + setup_irq(2, &irq2); } void __init pre_setup_arch_hook(void) diff -Nru a/arch/i386/pci/irq.c b/arch/i386/pci/irq.c --- a/arch/i386/pci/irq.c Sun Apr 25 22:40:43 2004 +++ b/arch/i386/pci/irq.c Sun Apr 25 22:40:43 2004 @@ -453,15 +453,12 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) { -#if 0 /* Let's see what chip this is supposed to be ... */ - /* We must not touch 440GX even if we have tables. 440GX has - different IRQ routing weirdness */ + /* 440GX has a proprietary PIRQ router -- don't use it */ if ( pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_0, NULL) || pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_2, NULL)) return 0; -#endif switch(device) { diff -Nru a/arch/x86_64/kernel/Makefile b/arch/x86_64/kernel/Makefile --- a/arch/x86_64/kernel/Makefile Sun Apr 25 22:40:43 2004 +++ b/arch/x86_64/kernel/Makefile Sun Apr 25 22:40:43 2004 @@ -8,7 +8,7 @@ ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_x86_64.o \ x8664_ksyms.o i387.o syscall.o vsyscall.o \ setup64.o bootflag.o e820.o reboot.o warmreboot.o -obj-y += mce.o acpi/ +obj-y += mce.o obj-$(CONFIG_MTRR) += ../../i386/kernel/cpu/mtrr/ obj-$(CONFIG_ACPI_BOOT) += acpi/ diff -Nru a/arch/x86_64/kernel/i8259.c b/arch/x86_64/kernel/i8259.c --- a/arch/x86_64/kernel/i8259.c Sun Apr 25 22:40:43 2004 +++ b/arch/x86_64/kernel/i8259.c Sun Apr 25 22:40:43 2004 @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -490,5 +491,6 @@ */ setup_timer(); - setup_irq(2, &irq2); + if (!acpi_ioapic) + setup_irq(2, &irq2); } diff -Nru a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c --- a/arch/x86_64/kernel/io_apic.c Sun Apr 25 22:40:43 2004 +++ b/arch/x86_64/kernel/io_apic.c Sun Apr 25 22:40:43 2004 @@ -1740,18 +1740,10 @@ /* * - * IRQ's that are handled by the old PIC in all cases: + * IRQ's that are handled by the PIC in the MPS IOAPIC case. * - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ. * Linux doesn't really care, as it's not actually used * for any interrupt handling anyway. - * - There used to be IRQ13 here as well, but all - * MPS-compliant must not use it for FPU coupling and we - * want to use exception 16 anyway. And there are - * systems who connect it to an I/O APIC for other uses. - * Thus we don't mark it special any longer. - * - * Additionally, something is definitely wrong with irq9 - * on PIIX4 boards. */ #define PIC_IRQS (1<<2) @@ -1759,7 +1751,11 @@ { enable_IO_APIC(); - io_apic_irqs = ~PIC_IRQS; + if (acpi_ioapic) + io_apic_irqs = ~0; /* all IRQs go through IOAPIC */ + else + io_apic_irqs = ~PIC_IRQS; + printk("ENABLING IO-APIC IRQs\n"); /* diff -Nru a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c --- a/arch/x86_64/kernel/mpparse.c Sun Apr 25 22:40:43 2004 +++ b/arch/x86_64/kernel/mpparse.c Sun Apr 25 22:40:43 2004 @@ -784,8 +784,6 @@ u32 gsi) { struct mpc_config_intsrc intsrc; - int i = 0; - int found = 0; int ioapic = -1; int pin = -1; @@ -818,23 +816,9 @@ (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, intsrc.mpc_dstirq); - /* - * If an existing [IOAPIC.PIN -> IRQ] routing entry exists we override it. - * Otherwise create a new entry (e.g. gsi == 2). - */ - for (i = 0; i < mp_irq_entries; i++) { - if ((mp_irqs[i].mpc_srcbus == intsrc.mpc_srcbus) - && (mp_irqs[i].mpc_srcbusirq == intsrc.mpc_srcbusirq)) { - mp_irqs[i] = intsrc; - found = 1; - break; - } - } - if (!found) { - mp_irqs[mp_irq_entries] = intsrc; - if (++mp_irq_entries == MAX_IRQ_SOURCES) - panic("Max # of irq sources exceeded!\n"); - } + mp_irqs[mp_irq_entries] = intsrc; + if (++mp_irq_entries == MAX_IRQ_SOURCES) + panic("Max # of irq sources exceeded!\n"); return; } @@ -865,13 +849,22 @@ intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid; /* - * Use the default configuration for the IRQs 0-15. These may be + * Use the default configuration for the IRQs 0-15. Unless * overridden by (MADT) interrupt source override entries. */ for (i = 0; i < 16; i++) { + int idx; - if (i == 2) - continue; /* Don't connect IRQ2 */ + for (idx = 0; idx < mp_irq_entries; idx++) + if (mp_irqs[idx].mpc_srcbus == MP_ISA_BUS && + (mp_irqs[idx].mpc_srcbusirq == i || + mp_irqs[idx].mpc_dstirq == i)) + break; + + if (idx != mp_irq_entries) { + printk(KERN_DEBUG "ACPI: IRQ%d used by override.\n", i); + continue; /* IRQ already used */ + } intsrc.mpc_irqtype = mp_INT; intsrc.mpc_srcbusirq = i; /* Identity mapped */ diff -Nru a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c --- a/arch/x86_64/kernel/setup.c Sun Apr 25 22:40:43 2004 +++ b/arch/x86_64/kernel/setup.c Sun Apr 25 22:40:43 2004 @@ -65,8 +65,8 @@ unsigned long mmu_cr4_features; EXPORT_SYMBOL_GPL(mmu_cr4_features); -int acpi_disabled = 0; - +int acpi_disabled; +EXPORT_SYMBOL(acpi_disabled); #ifdef CONFIG_ACPI_BOOT extern int __initdata acpi_ht; extern acpi_interrupt_flags acpi_sci_flags; @@ -242,7 +242,7 @@ #ifdef CONFIG_ACPI_BOOT /* "acpi=off" disables both ACPI table parsing and interpreter init */ if (!memcmp(from, "acpi=off", 8)) - acpi_disabled = 1; + disable_acpi(); if (!memcmp(from, "acpi=force", 10)) { /* add later when we do DMI horrors: */ @@ -256,7 +256,9 @@ acpi_ht = 1; } else if (!memcmp(from, "pci=noacpi", 10)) - acpi_noirq_set(); + acpi_disable_pci(); + else if (!memcmp(from, "acpi=noirq", 10)) + acpi_noirq_set(); else if (!memcmp(from, "acpi_sci=edge", 13)) acpi_sci_flags.trigger = 1; diff -Nru a/drivers/acpi/osl.c b/drivers/acpi/osl.c --- a/drivers/acpi/osl.c Sun Apr 25 22:40:43 2004 +++ b/drivers/acpi/osl.c Sun Apr 25 22:40:43 2004 @@ -63,7 +63,7 @@ extern char line_buf[80]; #endif /*ENABLE_DEBUGGER*/ -static int acpi_irq_irq; +static unsigned int acpi_irq_irq; static OSD_HANDLER acpi_irq_handler; static void *acpi_irq_context; @@ -215,7 +215,8 @@ *new_val = NULL; if (!memcmp (init_val->name, "_OS_", 4) && strlen(acpi_os_name)) { - printk(KERN_INFO PREFIX "Overriding _OS definition\n"); + printk(KERN_INFO PREFIX "Overriding _OS definition %s\n", + acpi_os_name); *new_val = acpi_os_name; } @@ -240,23 +241,22 @@ } acpi_status -acpi_os_install_interrupt_handler(u32 irq, OSD_HANDLER handler, void *context) +acpi_os_install_interrupt_handler(u32 gsi, OSD_HANDLER handler, void *context) { + unsigned int irq; + /* - * Ignore the irq from the core, and use the value in our copy of the + * Ignore the GSI from the core, and use the value in our copy of the * FADT. It may not be the same if an interrupt source override exists * for the SCI. */ - irq = acpi_fadt.sci_int; - -#if defined(CONFIG_IA64) || defined(CONFIG_PCI_USE_VECTOR) - irq = acpi_irq_to_vector(irq); - if (irq < 0) { - printk(KERN_ERR PREFIX "SCI (ACPI interrupt %d) not registered\n", - acpi_fadt.sci_int); + gsi = acpi_fadt.sci_int; + if (acpi_gsi_to_irq(gsi, &irq) < 0) { + printk(KERN_ERR PREFIX "SCI (ACPI GSI %d) not registered\n", + gsi); return AE_OK; } -#endif + acpi_irq_handler = handler; acpi_irq_context = context; if (request_irq(irq, acpi_irq, SA_SHIRQ, "acpi", acpi_irq)) { @@ -272,9 +272,6 @@ acpi_os_remove_interrupt_handler(u32 irq, OSD_HANDLER handler) { if (irq) { -#if defined(CONFIG_IA64) || defined(CONFIG_PCI_USE_VECTOR) - irq = acpi_irq_to_vector(irq); -#endif free_irq(irq, acpi_irq); acpi_irq_handler = NULL; acpi_irq_irq = 0; diff -Nru a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c --- a/drivers/acpi/pci_irq.c Sun Apr 25 22:40:43 2004 +++ b/drivers/acpi/pci_irq.c Sun Apr 25 22:40:43 2004 @@ -368,7 +368,7 @@ if (!irq) { printk(KERN_WARNING PREFIX "No IRQ known for interrupt pin %c of device %s", ('A' + pin), pci_name(dev)); /* Interrupt Line values above 0xF are forbidden */ - if (dev->irq && dev->irq >= 0xF) { + if (dev->irq && (dev->irq <= 0xF)) { printk(" - using IRQ %d\n", dev->irq); return_VALUE(dev->irq); } diff -Nru a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c --- a/drivers/acpi/pci_link.c Sun Apr 25 22:40:43 2004 +++ b/drivers/acpi/pci_link.c Sun Apr 25 22:40:43 2004 @@ -793,7 +793,7 @@ { ACPI_FUNCTION_TRACE("acpi_pci_link_init"); - if (acpi_disabled) + if (acpi_pci_disabled) return_VALUE(0); acpi_link.count = 0; diff -Nru a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c --- a/drivers/acpi/pci_root.c Sun Apr 25 22:40:43 2004 +++ b/drivers/acpi/pci_root.c Sun Apr 25 22:40:43 2004 @@ -119,6 +119,7 @@ { int result = 0; struct acpi_pci_root *root = NULL; + struct acpi_pci_root *tmp; acpi_status status = AE_OK; unsigned long value = 0; acpi_handle handle = NULL; @@ -186,6 +187,13 @@ goto end; } + /* Some systems have wrong _BBN */ + list_for_each_entry(tmp, &acpi_pci_roots, node) { + if ((tmp->id.segment == root->id.segment) + && (tmp->id.bus == root->id.bus)) + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, + "Wrong _BBN value, please reboot and using option 'pci=noacpi'\n")); + } /* * Device & Function * ----------------- @@ -272,7 +280,7 @@ { ACPI_FUNCTION_TRACE("acpi_pci_root_init"); - if (acpi_disabled) + if (acpi_pci_disabled) return_VALUE(0); /* DEBUG: diff -Nru a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h --- a/include/acpi/acpiosxf.h Sun Apr 25 22:40:43 2004 +++ b/include/acpi/acpiosxf.h Sun Apr 25 22:40:43 2004 @@ -188,14 +188,14 @@ acpi_status acpi_os_install_interrupt_handler ( - u32 interrupt_number, - OSD_HANDLER service_routine, + u32 gsi, + OSD_HANDLER service_routine, void *context); acpi_status acpi_os_remove_interrupt_handler ( u32 interrupt_number, - OSD_HANDLER service_routine); + OSD_HANDLER service_routine); /* diff -Nru a/include/asm-i386/acpi.h b/include/asm-i386/acpi.h --- a/include/asm-i386/acpi.h Sun Apr 25 22:40:43 2004 +++ b/include/asm-i386/acpi.h Sun Apr 25 22:40:43 2004 @@ -109,7 +109,14 @@ extern int acpi_strict; extern int acpi_disabled; extern int acpi_ht; -static inline void disable_acpi(void) { acpi_disabled = 1; acpi_ht = 0; } +extern int acpi_pci_disabled; +static inline void disable_acpi(void) +{ + acpi_disabled = 1; + acpi_ht = 0; + acpi_pci_disabled = 1; + acpi_noirq = 1; +} /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ #define FIX_ACPI_PAGES 4 @@ -118,6 +125,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) { @@ -143,9 +151,15 @@ #ifdef CONFIG_ACPI_PCI static inline void acpi_noirq_set(void) { acpi_noirq = 1; } +static inline void acpi_disable_pci(void) +{ + acpi_pci_disabled = 1; + acpi_noirq_set(); +} extern int acpi_irq_balance_set(char *str); #else static inline void acpi_noirq_set(void) { } +static inline void acpi_disable_pci(void) { } static inline int acpi_irq_balance_set(char *str) { return 0; } #endif diff -Nru a/include/asm-ia64/acpi.h b/include/asm-ia64/acpi.h --- a/include/asm-ia64/acpi.h Sun Apr 25 22:40:43 2004 +++ b/include/asm-ia64/acpi.h Sun Apr 25 22:40:43 2004 @@ -89,6 +89,7 @@ ((Acq) = ia64_acpi_release_global_lock((unsigned int *) GLptr)) #define acpi_disabled 0 /* ACPI always enabled on IA64 */ +#define acpi_pci_disabled 0 /* ACPI PCI always enabled on IA64 */ #define acpi_strict 1 /* no ACPI spec workarounds on IA64 */ static inline void disable_acpi(void) { } diff -Nru a/include/asm-x86_64/acpi.h b/include/asm-x86_64/acpi.h --- a/include/asm-x86_64/acpi.h Sun Apr 25 22:40:43 2004 +++ b/include/asm-x86_64/acpi.h Sun Apr 25 22:40:43 2004 @@ -106,8 +106,15 @@ extern int acpi_noirq; extern int acpi_strict; extern int acpi_disabled; +extern int acpi_pci_disabled; extern int acpi_ht; -static inline void disable_acpi(void) { acpi_disabled = 1; acpi_ht = 0; } +static inline void disable_acpi(void) +{ + acpi_disabled = 1; + acpi_ht = 0; + acpi_pci_disabled = 1; + acpi_noirq = 1; +} /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ #define FIX_ACPI_PAGES 4 @@ -121,9 +128,15 @@ #ifdef CONFIG_ACPI_PCI static inline void acpi_noirq_set(void) { acpi_noirq = 1; } +static inline void acpi_disable_pci(void) +{ + acpi_pci_disabled = 1; + acpi_noirq_set(); +} extern int acpi_irq_balance_set(char *str); #else static inline void acpi_noirq_set(void) { } +static inline void acpi_disable_pci(void) { } static inline int acpi_irq_balance_set(char *str) { return 0; } #endif @@ -144,6 +157,7 @@ #define boot_cpu_physical_apicid boot_cpu_id extern int acpi_disabled; +extern int acpi_pci_disabled; #define dmi_broken (0) #define BROKEN_ACPI_Sx 0x0001 diff -Nru a/include/linux/acpi.h b/include/linux/acpi.h --- a/include/linux/acpi.h Sun Apr 25 22:40:43 2004 +++ b/include/linux/acpi.h Sun Apr 25 22:40:43 2004 @@ -438,6 +438,7 @@ int acpi_pci_irq_enable (struct pci_dev *dev); int acpi_pci_irq_init (void); +int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); struct acpi_pci_driver { struct acpi_pci_driver *next;