diff options
Diffstat (limited to 'arch/x86/kernel/early-quirks.c')
| -rw-r--r-- | arch/x86/kernel/early-quirks.c | 20 | 
1 files changed, 20 insertions, 0 deletions
diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index 3755ef49439..94ab6b90dd3 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 },  	{}  };  |