http://linux-acpi.bkbits.net/linux-acpi-test-2.6.6
len.brown@intel.com|ChangeSet|20040421011953|64619 len.brown

# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/04/21 00:27:16-07:00 akpm@bix.(none) 
#   Merge http://linux-acpi.bkbits.net/linux-acpi-test-2.6.6
#   into bix.(none):/usr/src/bk-acpi
# 
# arch/x86_64/kernel/mpparse.c
#   2004/04/21 00:27:13-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/04/20 21:04:53-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/mpparse.c
#   2004/04/20 21:04:48-04:00 len.brown@intel.com +0 -0
#   Auto merged
# 
# 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 20:13:39-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-acpi
# 
# MAINTAINERS
#   2004/04/16 20:13:37-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/04/16 22:07:00-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/i386/pci/irq.c
#   2004/04/16 22:06:57-04:00 len.brown@intel.com +0 -0
#   Auto merged
# 
# arch/i386/kernel/dmi_scan.c
#   2004/04/16 22:06:57-04:00 len.brown@intel.com +0 -0
#   Auto merged
# 
# 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
# 
# ChangeSet
#   2004/04/13 23:21:22-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-acpi
# 
# arch/x86_64/kernel/setup.c
#   2004/04/13 23:21:20-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/04/13 17:01:02-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-acpi
# 
# MAINTAINERS
#   2004/04/13 17:00:59-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/04/12 16:55:52-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-acpi
# 
# arch/x86_64/kernel/setup.c
#   2004/04/12 16:55:49-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# arch/x86_64/kernel/mpparse.c
#   2004/04/12 16:55:49-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# arch/i386/kernel/setup.c
#   2004/04/12 16:55:49-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# MAINTAINERS
#   2004/04/12 16:55:49-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/04/02 11:16:37-08:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-acpi
# 
# arch/i386/kernel/setup.c
#   2004/04/02 11:16:34-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/03/29 17:50:22-08:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-acpi
# 
# MAINTAINERS
#   2004/03/29 17:50:19-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/03/23 02:57:13-08:00 akpm@bix.(none) 
#   Merge http://linux-acpi.bkbits.net/linux-acpi-test-2.6.5
#   into bix.(none):/usr/src/bk-acpi
# 
# arch/x86_64/kernel/setup.c
#   2004/03/23 02:57:10-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# arch/x86_64/kernel/mpparse.c
#   2004/03/23 02:57:10-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# arch/i386/kernel/setup.c
#   2004/03/23 02:57:10-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/03/20 23:31:09-08:00 akpm@bix.(none) 
#   Merge http://linux-acpi.bkbits.net/linux-acpi-test-2.6.5
#   into bix.(none):/usr/src/bk-acpi
# 
# arch/x86_64/kernel/setup.c
#   2004/03/20 23:31:06-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# arch/x86_64/kernel/mpparse.c
#   2004/03/20 23:31:06-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# arch/i386/kernel/setup.c
#   2004/03/20 23:31:06-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/03/20 13:11:13-08:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-acpi
# 
# arch/x86_64/kernel/setup.c
#   2004/03/20 13:11:10-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# arch/x86_64/kernel/mpparse.c
#   2004/03/20 13:11:10-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/03/19 09:57:54-08:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-acpi
# 
# arch/i386/kernel/setup.c
#   2004/03/19 09:57:51-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/03/17 10:56:26-08:00 akpm@bix.(none) 
#   Merge http://linux-acpi.bkbits.net/linux-acpi-test-2.6.5
#   into bix.(none):/usr/src/bk-acpi
# 
# arch/x86_64/kernel/setup.c
#   2004/03/17 10:56:23-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/03/16 20:07:13-08:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-acpi
# 
# MAINTAINERS
#   2004/03/16 20:07:06-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/03/14 02:35:58-08:00 akpm@bix.(none) 
#   Merge http://linux-acpi.bkbits.net/linux-acpi-test-2.6.5
#   into bix.(none):/usr/src/bk-acpi
# 
# MAINTAINERS
#   2004/03/14 02:35:43-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/03/12 10:33:53-08:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-acpi
# 
# MAINTAINERS
#   2004/03/12 10:33:46-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/03/12 00:33:17-08:00 akpm@bix.(none) 
#   Merge http://linux-acpi.bkbits.net/linux-acpi-test-2.6.4
#   into bix.(none):/usr/src/bk-acpi
# 
# MAINTAINERS
#   2004/03/12 00:33:04-08:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/03/06 12:42:53-08:00 akpm@mnm.(none) 
#   Merge mnm.(none):/usr/src/bk25 into mnm.(none):/usr/src/bk-acpi
# 
# MAINTAINERS
#   2004/03/06 12:42:46-08:00 akpm@mnm.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/03/05 15:03:13-08:00 akpm@mnm.(none) 
#   Merge http://linux-acpi.bkbits.net/linux-acpi-test-2.6.4
#   into mnm.(none):/usr/src/bk-acpi
# 
# MAINTAINERS
#   2004/03/05 15:03:06-08:00 akpm@mnm.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/03/02 12:01:50-08:00 akpm@mnm.(none) 
#   Merge mnm.(none):/usr/src/bk25 into mnm.(none):/usr/src/bk-acpi
# 
# MAINTAINERS
#   2004/03/02 12:01:43-08:00 akpm@mnm.(none) +0 -0
#   Auto merged
# 
diff -Nru a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c
--- a/arch/i386/kernel/acpi/boot.c	Wed Apr 21 00:28:02 2004
+++ b/arch/i386/kernel/acpi/boot.c	Wed Apr 21 00:28:02 2004
@@ -653,9 +653,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 +666,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	Wed Apr 21 00:28:02 2004
+++ b/arch/i386/kernel/dmi_scan.c	Wed Apr 21 00:28:02 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
  */
 
@@ -815,52 +791,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, "<K7V-RM>"),
diff -Nru a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c
--- a/arch/i386/kernel/mpparse.c	Wed Apr 21 00:28:02 2004
+++ b/arch/i386/kernel/mpparse.c	Wed Apr 21 00:28:02 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/mach-default/setup.c b/arch/i386/mach-default/setup.c
--- a/arch/i386/mach-default/setup.c	Wed Apr 21 00:28:02 2004
+++ b/arch/i386/mach-default/setup.c	Wed Apr 21 00:28:02 2004
@@ -7,6 +7,7 @@
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
+#include <asm/acpi.h>
 #include <asm/arch_hooks.h>
 
 /**
@@ -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	Wed Apr 21 00:28:02 2004
+++ b/arch/i386/mach-es7000/setup.c	Wed Apr 21 00:28:02 2004
@@ -7,6 +7,7 @@
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
+#include <asm/acpi.h>
 #include <asm/arch_hooks.h>
 
 /**
@@ -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	Wed Apr 21 00:28:02 2004
+++ b/arch/i386/mach-voyager/setup.c	Wed Apr 21 00:28:02 2004
@@ -6,6 +6,7 @@
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
+#include <asm/acpi.h>
 #include <asm/arch_hooks.h>
 
 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	Wed Apr 21 00:28:02 2004
+++ b/arch/i386/pci/irq.c	Wed Apr 21 00:28:02 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	Wed Apr 21 00:28:02 2004
+++ b/arch/x86_64/kernel/Makefile	Wed Apr 21 00:28:02 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	Wed Apr 21 00:28:02 2004
+++ b/arch/x86_64/kernel/i8259.c	Wed Apr 21 00:28:02 2004
@@ -13,6 +13,7 @@
 #include <linux/kernel_stat.h>
 #include <linux/sysdev.h>
 
+#include <asm/acpi.h>
 #include <asm/atomic.h>
 #include <asm/system.h>
 #include <asm/io.h>
@@ -490,5 +491,6 @@
 	 */
 	setup_timer();
 
-	setup_irq(2, &irq2);
+	if (!acpi_ioapic)
+		setup_irq(2, &irq2);
 }
diff -Nru a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c
--- a/arch/x86_64/kernel/mpparse.c	Wed Apr 21 00:28:02 2004
+++ b/arch/x86_64/kernel/mpparse.c	Wed Apr 21 00:28:02 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 */
