[packages/kernel] - add irq remapping quirk

arekm arekm at pld-linux.org
Sun Jun 2 20:34:31 CEST 2013


commit d51a5c936f4e9cc3623e13fb514ba546ec410099
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Sun Jun 2 20:34:16 2013 +0200

    - add irq remapping quirk

 kernel-small_fixes.patch | 171 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 171 insertions(+)
---
diff --git a/kernel-small_fixes.patch b/kernel-small_fixes.patch
index 392d121..a59aaaf 100644
--- a/kernel-small_fixes.patch
+++ b/kernel-small_fixes.patch
@@ -46,3 +46,174 @@ index 7a0c800..ec5ebbb 100644
  	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
  	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
  
+commit 03bbcb2e7e292838bb0244f5a7816d194c911d62
+Author: Neil Horman <nhorman at tuxdriver.com>
+Date:   Tue Apr 16 16:38:32 2013 -0400
+
+    iommu/vt-d: add quirk for broken interrupt remapping on 55XX chipsets
+    
+    A few years back intel published a spec update:
+    http://www.intel.com/content/dam/doc/specification-update/5520-and-5500-chipset-ioh-specification-update.pdf
+    
+    For the 5520 and 5500 chipsets which contained an errata (specificially errata
+    53), which noted that these chipsets can't properly do interrupt remapping, and
+    as a result the recommend that interrupt remapping be disabled in bios.  While
+    many vendors have a bios update to do exactly that, not all do, and of course
+    not all users update their bios to a level that corrects the problem.  As a
+    result, occasionally interrupts can arrive at a cpu even after affinity for that
+    interrupt has be moved, leading to lost or spurrious interrupts (usually
+    characterized by the message:
+    kernel: do_IRQ: 7.71 No irq handler for vector (irq -1)
+    
+    There have been several incidents recently of people seeing this error, and
+    investigation has shown that they have system for which their BIOS level is such
+    that this feature was not properly turned off.  As such, it would be good to
+    give them a reminder that their systems are vulnurable to this problem.  For
+    details of those that reported the problem, please see:
+    https://bugzilla.redhat.com/show_bug.cgi?id=887006
+    
+    [ Joerg: Removed CONFIG_IRQ_REMAP ifdef from early-quirks.c ]
+    
+    Signed-off-by: Neil Horman <nhorman at tuxdriver.com>
+    CC: Prarit Bhargava <prarit at redhat.com>
+    CC: Don Zickus <dzickus at redhat.com>
+    CC: Don Dutile <ddutile at redhat.com>
+    CC: Bjorn Helgaas <bhelgaas at google.com>
+    CC: Asit Mallick <asit.k.mallick at intel.com>
+    CC: David Woodhouse <dwmw2 at infradead.org>
+    CC: linux-pci at vger.kernel.org
+    CC: Joerg Roedel <joro at 8bytes.org>
+    CC: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
+    CC: Arkadiusz Miśkiewicz <arekm at maven.pl>
+    Signed-off-by: Joerg Roedel <joro at 8bytes.org>
+
+diff --git a/arch/x86/include/asm/irq_remapping.h b/arch/x86/include/asm/irq_remapping.h
+index 95fd352..aca6aa2 100644
+--- a/arch/x86/include/asm/irq_remapping.h
++++ b/arch/x86/include/asm/irq_remapping.h
+@@ -28,6 +28,7 @@
+ 
+ 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);
+@@ -54,6 +55,7 @@ void irq_remap_modify_chip_defaults(struct irq_chip *chip);
+ 
+ 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) { }
+diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c
+index 3755ef4..94ab6b9 100644
+--- a/arch/x86/kernel/early-quirks.c
++++ b/arch/x86/kernel/early-quirks.c
+@@ -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 },
+ 	{}
+ };
+ 
+diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c
+index f3b8f23..5b19b2d 100644
+--- a/drivers/iommu/intel_irq_remapping.c
++++ b/drivers/iommu/intel_irq_remapping.c
+@@ -524,6 +524,16 @@ static int __init intel_irq_remapping_supported(void)
+ 
+ 	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;
+diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c
+index d56f8c1..3c11043 100644
+--- a/drivers/iommu/irq_remapping.c
++++ b/drivers/iommu/irq_remapping.c
+@@ -19,6 +19,7 @@
+ int irq_remapping_enabled;
+ 
+ int disable_irq_remap;
++int irq_remap_broken;
+ int disable_sourceid_checking;
+ int no_x2apic_optout;
+ 
+@@ -211,6 +212,11 @@ void __init setup_irq_remapping_ops(void)
+ #endif
+ }
+ 
++void set_irq_remapping_broken(void)
++{
++	irq_remap_broken = 1;
++}
++
+ int irq_remapping_supported(void)
+ {
+ 	if (disable_irq_remap)
+diff --git a/drivers/iommu/irq_remapping.h b/drivers/iommu/irq_remapping.h
+index ecb6376..90c4dae 100644
+--- a/drivers/iommu/irq_remapping.h
++++ b/drivers/iommu/irq_remapping.h
+@@ -32,6 +32,7 @@ struct pci_dev;
+ 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;
+@@ -89,6 +90,7 @@ extern struct irq_remap_ops amd_iommu_irq_ops;
+ 
+ #define irq_remapping_enabled 0
+ #define disable_irq_remap     1
++#define irq_remap_broken      0
+ 
+ #endif /* CONFIG_IRQ_REMAP */
+ 
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/kernel.git/commitdiff/d51a5c936f4e9cc3623e13fb514ba546ec410099



More information about the pld-cvs-commit mailing list