extern void setup_irq_remapping_ops(void);
 extern int irq_remapping_supported(void);
+extern void set_irq_remapping_broken(void);
 extern int irq_remapping_prepare(void);
 extern int irq_remapping_enable(void);
 extern void irq_remapping_disable(void);
 
 static inline void setup_irq_remapping_ops(void) { }
 static inline int irq_remapping_supported(void) { return 0; }
+static inline void set_irq_remapping_broken(void) { }
 static inline int irq_remapping_prepare(void) { return -ENODEV; }
 static inline int irq_remapping_enable(void) { return -ENODEV; }
 static inline void irq_remapping_disable(void) { }
 
 #include <asm/apic.h>
 #include <asm/iommu.h>
 #include <asm/gart.h>
+#include <asm/irq_remapping.h>
 
 static void __init fix_hypertransport_config(int num, int slot, int func)
 {
 }
 #endif
 
+static void __init intel_remapping_check(int num, int slot, int func)
+{
+       u8 revision;
+
+       revision = read_pci_config_byte(num, slot, func, PCI_REVISION_ID);
+
+       /*
+        * Revision 0x13 of this chipset supports irq remapping
+        * but has an erratum that breaks its behavior, flag it as such
+        */
+       if (revision == 0x13)
+               set_irq_remapping_broken();
+
+}
+
 #define QFLAG_APPLY_ONCE       0x1
 #define QFLAG_APPLIED          0x2
 #define QFLAG_DONE             (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
          PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs },
        { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
          PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd },
+       { PCI_VENDOR_ID_INTEL, 0x3403, PCI_CLASS_BRIDGE_HOST,
+         PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check },
+       { PCI_VENDOR_ID_INTEL, 0x3406, PCI_CLASS_BRIDGE_HOST,
+         PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check },
        {}
 };
 
 
 
        if (disable_irq_remap)
                return 0;
+       if (irq_remap_broken) {
+               WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND,
+                          "This system BIOS has enabled interrupt remapping\n"
+                          "on a chipset that contains an erratum making that\n"
+                          "feature unstable.  To maintain system stability\n"
+                          "interrupt remapping is being disabled.  Please\n"
+                          "contact your BIOS vendor for an update\n");
+               disable_irq_remap = 1;
+               return 0;
+       }
 
        if (!dmar_ir_support())
                return 0;
 
 struct msi_msg;
 
 extern int disable_irq_remap;
+extern int irq_remap_broken;
 extern int disable_sourceid_checking;
 extern int no_x2apic_optout;
 extern int irq_remapping_enabled;
 
 #define irq_remapping_enabled 0
 #define disable_irq_remap     1
+#define irq_remap_broken      0
 
 #endif /* CONFIG_IRQ_REMAP */