2/2 add the Intel Alder IO-APIC PCI device to quirks
PATCH 1/1 2/2 add the Intel Alder IO-APIC PCI device to quirks
The alder has an intel Extended Express System Support Controller which presents apparently spurious BARs. When the pci resource code tries to reassign these BARs, the second IO-APIC gets disabled (with disastrous consequences).
The first BAR is the actual IO-APIC, the remaining five bars seem to be spurious resources, so we forcibly insert the first one into the resource tree and clear all the others.
James
===== drivers/pci/quirks.c 1.40 vs edited =====
drivers/pci/quirks.c +24 -0
@@ -789,6 +789,29 @@ sis_96x_compatible =1 ; } +#ifdef CONFIG_X86_IO_APIC +static void __init quirk_alder_ioapic (struct pci_dev *pdev) +{ +int i; + +if ((pdev->class >>8 ) !=0xff00 ) +return ; + +/* the first BAR is the location of the IO APIC...we must +* not touch this (and it's already covered by the fixmap), so +* forcibly insert it into the resource tree */ +if (pci_resource_start (pdev,0 ) &&pci_resource_len (pdev,0 )) +insert_resource (&iomem_resource, &pdev->resource[0 ]); + +/* The next five BARs all seem to be rubbish, so just clean +* them out */ +for (i=1 ; i <6 ; i++) { +memset (&pdev->resource[i],0 ,sizeof (pdev->resource[i])); + } + +} +#endif +#ifdef CONFIG_SCSI_SATA static void __init quirk_intel_ide_combined (struct pci_dev *pdev) {
@@ -914,6 +937,7 @@ { PCI_FIXUP_FINAL, PCI_VENDOR_ID_SI, PCI_ANY_ID, quirk_ioapic_rmw }, { PCI_FIXUP_FINAL, PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_APIC, quirk_amd_8131_ioapic }, + { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EESSC, quirk_alder_ioapic }, #endif { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_acpi }, { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_acpi },
===== include/linux/pci_ids.h 1.139 vs edited =====
include/linux/pci_ids.h +1 -0
@@ -1928,6 +1928,7 @@#define PCI_DEVICE_ID_GENROCO_HFP832 0x0003#define PCI_VENDOR_ID_INTEL 0x8086 +#define PCI_DEVICE_ID_INTEL_EESSC 0x0008#define PCI_DEVICE_ID_INTEL_21145 0x0039#define PCI_DEVICE_ID_INTEL_82375 0x0482#define PCI_DEVICE_ID_INTEL_82424 0x0483
Quoted 8 lines · James Bottomley
The alder has an intel Extended Express System Support Controller which presents apparently spurious BARs. When the pci resource code tries to reassign these BARs, the second IO-APIC gets disabled (with disastrous consequences).
The first BAR is the actual IO-APIC, the remaining five bars seem to be spurious resources, so we forcibly insert the first one into the resource tree and clear all the others.
Nice i have one of these, i currently have to boot with noapic unfortunately due to aic7xxx exploding. I'll apply your patch and try it out anyway.
00:0f.0 Class ff00: Intel Corp.: Unknown device 0008
Subsystem: Unknown device f808:ffe7
Flags: fast devsel
Memory at ffe7f800 (32-bit, prefetchable) [size=1K]
Memory at 10000000 (32-bit, prefetchable) [size=1K]
Memory at 10000400 (32-bit, prefetchable) [size=1K]
Memory at 10000800 (32-bit, prefetchable) [size=1K]
Memory at 10000c00 (32-bit, prefetchable) [size=1K]
Memory at 10001000 (32-bit, prefetchable) [size=1K]
Expansion ROM at fffff800 [disabled] [size=2K]00: 86 80 08 00 43 01 80 00 00 00 00 ff 00 00 00 00 10: 08 f8 e7 ff 08 f8 e7 ff 08 f8 e7 ff 08 f8 e7 ff 20: 08 f8 e7 ff 08 f8 e7 ff 08 f8 e7 ff 08 f8 e7 ff 30: 08 f8 e7 ff 08 f8 e7 ff 08 f8 e7 ff ff 00 00 00
01:00.0 Host bridge: Intel Corp. 82452KX/GX [Orion] (rev 02)
Flags: bus master, medium devsel, latency 6
00: 86 80 25 12 07 00 00 22 02 00 00 06 00 06 00 00 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00
Quoted 60 lines
=====
drivers/pci/quirks.c1.40 vs edited =====drivers/pci/quirks.c +24
-0@@ -789,6 +789,29 @@ sis_96x_compatible =1 ; } +#ifdef CONFIG_X86_IO_APIC +static void __init quirk_alder_ioapic (struct pci_dev *pdev) +{ +int i; + +if ((pdev->class >>8 ) !=0xff00 ) +return ; + +/* the first BAR is the location of the IO APIC...we must +* not touch this (and it's already covered by the fixmap), so +* forcibly insert it into the resource tree */ +if (pci_resource_start (pdev,0 ) &&pci_resource_len (pdev,0 )) +insert_resource (&iomem_resource, &pdev->resource[0 ]); + +/* The next five BARs all seem to be rubbish, so just clean +* them out */ +for (i=1 ; i <6 ; i++) { +memset (&pdev->resource[i],0 ,sizeof (pdev->resource[i])); + } + +} +#endif +#ifdef CONFIG_SCSI_SATA static void __init quirk_intel_ide_combined (struct pci_dev *pdev) {@@ -914,6 +937,7 @@ { PCI_FIXUP_FINAL, PCI_VENDOR_ID_SI, PCI_ANY_ID, quirk_ioapic_rmw }, { PCI_FIXUP_FINAL, PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_APIC, quirk_amd_8131_ioapic }, + { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EESSC, quirk_alder_ioapic }, #endif { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_acpi }, { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_acpi },=====
include/linux/pci_ids.h1.139 vs edited =====include/linux/pci_ids.h +1
-1@@ -1928,6 +1928,7 @@#define PCI_DEVICE_ID_GENROCO_HFP832 0x0003#define PCI_VENDOR_ID_INTEL 0x8086 +#define PCI_DEVICE_ID_INTEL_EESSC 0x0008#define PCI_DEVICE_ID_INTEL_21145 0x0039#define PCI_DEVICE_ID_INTEL_82375 0x0482#define PCI_DEVICE_ID_INTEL_82424 0x0483 -To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/