]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/x86/kernel/early-quirks.c
iommu/vt-d: add quirk for broken interrupt remapping on 55XX chipsets
[karo-tx-linux.git] / arch / x86 / kernel / early-quirks.c
index 3755ef49439059ea51a8483a9455003440fc1212..94ab6b90dd3fabdaf2856a5d7fc2abfd4ed2af88 100644 (file)
@@ -18,6 +18,7 @@
 #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)
 {
@@ -192,6 +193,21 @@ static void __init ati_bugs_contd(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)
@@ -221,6 +237,10 @@ static struct chipset early_qrk[] __initdata = {
          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 },
        {}
 };