diff options
-rw-r--r-- | Documentation/kernel-parameters.txt | 7 | ||||
-rw-r--r-- | arch/x86/pci/common.c | 9 | ||||
-rw-r--r-- | drivers/acpi/pci_irq.c | 56 | ||||
-rw-r--r-- | drivers/pci/quirks.c | 170 | ||||
-rw-r--r-- | include/asm-x86/io_apic.h | 10 | ||||
-rw-r--r-- | include/asm-x86/pci.h | 2 | ||||
-rw-r--r-- | include/linux/pci.h | 6 | ||||
-rw-r--r-- | include/linux/pci_ids.h | 5 |
8 files changed, 244 insertions, 21 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 09ad7450647b..f5662b7a34d1 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -1529,6 +1529,13 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1529 | nomsi [MSI] If the PCI_MSI kernel config parameter is | 1529 | nomsi [MSI] If the PCI_MSI kernel config parameter is |
1530 | enabled, this kernel boot option can be used to | 1530 | enabled, this kernel boot option can be used to |
1531 | disable the use of MSI interrupts system-wide. | 1531 | disable the use of MSI interrupts system-wide. |
1532 | noioapicquirk [APIC] Disable all boot interrupt quirks. | ||
1533 | Safety option to keep boot IRQs enabled. This | ||
1534 | should never be necessary. | ||
1535 | ioapicreroute [APIC] Enable rerouting of boot IRQs to the | ||
1536 | primary IO-APIC for bridges that cannot disable | ||
1537 | boot IRQs. This fixes a source of spurious IRQs | ||
1538 | when the system masks IRQs. | ||
1532 | biosirq [X86-32] Use PCI BIOS calls to get the interrupt | 1539 | biosirq [X86-32] Use PCI BIOS calls to get the interrupt |
1533 | routing table. These calls are known to be buggy | 1540 | routing table. These calls are known to be buggy |
1534 | on several machines and they hang the machine | 1541 | on several machines and they hang the machine |
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index b67732bbb85a..1485a26ddcef 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
@@ -23,6 +23,8 @@ unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2 | | |||
23 | unsigned int pci_early_dump_regs; | 23 | unsigned int pci_early_dump_regs; |
24 | static int pci_bf_sort; | 24 | static int pci_bf_sort; |
25 | int pci_routeirq; | 25 | int pci_routeirq; |
26 | int noioapicquirk; | ||
27 | int noioapicreroute = 1; | ||
26 | int pcibios_last_bus = -1; | 28 | int pcibios_last_bus = -1; |
27 | unsigned long pirq_table_addr; | 29 | unsigned long pirq_table_addr; |
28 | struct pci_bus *pci_root_bus; | 30 | struct pci_bus *pci_root_bus; |
@@ -519,6 +521,13 @@ char * __devinit pcibios_setup(char *str) | |||
519 | } else if (!strcmp(str, "skip_isa_align")) { | 521 | } else if (!strcmp(str, "skip_isa_align")) { |
520 | pci_probe |= PCI_CAN_SKIP_ISA_ALIGN; | 522 | pci_probe |= PCI_CAN_SKIP_ISA_ALIGN; |
521 | return NULL; | 523 | return NULL; |
524 | } else if (!strcmp(str, "noioapicquirk")) { | ||
525 | noioapicquirk = 1; | ||
526 | return NULL; | ||
527 | } else if (!strcmp(str, "ioapicreroute")) { | ||
528 | if (noioapicreroute != -1) | ||
529 | noioapicreroute = 0; | ||
530 | return NULL; | ||
522 | } | 531 | } |
523 | return str; | 532 | return str; |
524 | } | 533 | } |
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index 11acaee14d66..bf79d83bdfbb 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c | |||
@@ -384,6 +384,27 @@ acpi_pci_free_irq(struct acpi_prt_entry *entry, | |||
384 | return irq; | 384 | return irq; |
385 | } | 385 | } |
386 | 386 | ||
387 | #ifdef CONFIG_X86_IO_APIC | ||
388 | extern int noioapicquirk; | ||
389 | |||
390 | static int bridge_has_boot_interrupt_variant(struct pci_bus *bus) | ||
391 | { | ||
392 | struct pci_bus *bus_it; | ||
393 | |||
394 | for (bus_it = bus ; bus_it ; bus_it = bus_it->parent) { | ||
395 | if (!bus_it->self) | ||
396 | return 0; | ||
397 | |||
398 | printk(KERN_INFO "vendor=%04x device=%04x\n", bus_it->self->vendor, | ||
399 | bus_it->self->device); | ||
400 | |||
401 | if (bus_it->self->irq_reroute_variant) | ||
402 | return bus_it->self->irq_reroute_variant; | ||
403 | } | ||
404 | return 0; | ||
405 | } | ||
406 | #endif /* CONFIG_X86_IO_APIC */ | ||
407 | |||
387 | /* | 408 | /* |
388 | * acpi_pci_irq_lookup | 409 | * acpi_pci_irq_lookup |
389 | * success: return IRQ >= 0 | 410 | * success: return IRQ >= 0 |
@@ -413,6 +434,41 @@ acpi_pci_irq_lookup(struct pci_bus *bus, | |||
413 | } | 434 | } |
414 | 435 | ||
415 | ret = func(entry, triggering, polarity, link); | 436 | ret = func(entry, triggering, polarity, link); |
437 | |||
438 | #ifdef CONFIG_X86_IO_APIC | ||
439 | /* | ||
440 | * Some chipsets (e.g. intel 6700PXH) generate a legacy INTx when the | ||
441 | * IRQ entry in the chipset's IO-APIC is masked (as, e.g. the RT kernel | ||
442 | * does during interrupt handling). When this INTx generation cannot be | ||
443 | * disabled, we reroute these interrupts to their legacy equivalent to | ||
444 | * get rid of spurious interrupts. | ||
445 | */ | ||
446 | if (!noioapicquirk) { | ||
447 | switch (bridge_has_boot_interrupt_variant(bus)) { | ||
448 | case 0: | ||
449 | /* no rerouting necessary */ | ||
450 | break; | ||
451 | |||
452 | case INTEL_IRQ_REROUTE_VARIANT: | ||
453 | /* | ||
454 | * Remap according to INTx routing table in 6700PXH | ||
455 | * specs, intel order number 302628-002, section | ||
456 | * 2.15.2. Other chipsets (80332, ...) have the same | ||
457 | * mapping and are handled here as well. | ||
458 | */ | ||
459 | printk(KERN_INFO "pci irq %d -> rerouted to legacy " | ||
460 | "irq %d\n", ret, (ret % 4) + 16); | ||
461 | ret = (ret % 4) + 16; | ||
462 | break; | ||
463 | |||
464 | default: | ||
465 | printk(KERN_INFO "not rerouting irq %d to legacy irq: " | ||
466 | "unknown mapping\n", ret); | ||
467 | break; | ||
468 | } | ||
469 | } | ||
470 | #endif /* CONFIG_X86_IO_APIC */ | ||
471 | |||
416 | return ret; | 472 | return ret; |
417 | } | 473 | } |
418 | 474 | ||
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 12d489395fad..0911b0c60b64 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -602,27 +602,6 @@ static void __init quirk_ioapic_rmw(struct pci_dev *dev) | |||
602 | sis_apic_bug = 1; | 602 | sis_apic_bug = 1; |
603 | } | 603 | } |
604 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI, PCI_ANY_ID, quirk_ioapic_rmw); | 604 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI, PCI_ANY_ID, quirk_ioapic_rmw); |
605 | |||
606 | #define AMD8131_revA0 0x01 | ||
607 | #define AMD8131_revB0 0x11 | ||
608 | #define AMD8131_MISC 0x40 | ||
609 | #define AMD8131_NIOAMODE_BIT 0 | ||
610 | static void quirk_amd_8131_ioapic(struct pci_dev *dev) | ||
611 | { | ||
612 | unsigned char tmp; | ||
613 | |||
614 | if (nr_ioapics == 0) | ||
615 | return; | ||
616 | |||
617 | if (dev->revision == AMD8131_revA0 || dev->revision == AMD8131_revB0) { | ||
618 | dev_info(&dev->dev, "Fixing up AMD8131 IOAPIC mode\n"); | ||
619 | pci_read_config_byte( dev, AMD8131_MISC, &tmp); | ||
620 | tmp &= ~(1 << AMD8131_NIOAMODE_BIT); | ||
621 | pci_write_config_byte( dev, AMD8131_MISC, tmp); | ||
622 | } | ||
623 | } | ||
624 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic); | ||
625 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic); | ||
626 | #endif /* CONFIG_X86_IO_APIC */ | 605 | #endif /* CONFIG_X86_IO_APIC */ |
627 | 606 | ||
628 | /* | 607 | /* |
@@ -1409,6 +1388,155 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2609, quirk_intel_pcie_pm); | |||
1409 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260a, quirk_intel_pcie_pm); | 1388 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260a, quirk_intel_pcie_pm); |
1410 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260b, quirk_intel_pcie_pm); | 1389 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260b, quirk_intel_pcie_pm); |
1411 | 1390 | ||
1391 | #ifdef CONFIG_X86_IO_APIC | ||
1392 | /* | ||
1393 | * Boot interrupts on some chipsets cannot be turned off. For these chipsets, | ||
1394 | * remap the original interrupt in the linux kernel to the boot interrupt, so | ||
1395 | * that a PCI device's interrupt handler is installed on the boot interrupt | ||
1396 | * line instead. | ||
1397 | */ | ||
1398 | static void quirk_reroute_to_boot_interrupts_intel(struct pci_dev *dev) | ||
1399 | { | ||
1400 | if (noioapicquirk) | ||
1401 | return; | ||
1402 | |||
1403 | dev->irq_reroute_variant = INTEL_IRQ_REROUTE_VARIANT; | ||
1404 | |||
1405 | printk(KERN_INFO "PCI quirk: reroute interrupts for 0x%04x:0x%04x\n", | ||
1406 | dev->vendor, dev->device); | ||
1407 | return; | ||
1408 | } | ||
1409 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80333_0, quirk_reroute_to_boot_interrupts_intel); | ||
1410 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80333_1, quirk_reroute_to_boot_interrupts_intel); | ||
1411 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_0, quirk_reroute_to_boot_interrupts_intel); | ||
1412 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_0, quirk_reroute_to_boot_interrupts_intel); | ||
1413 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1, quirk_reroute_to_boot_interrupts_intel); | ||
1414 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXHV, quirk_reroute_to_boot_interrupts_intel); | ||
1415 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80332_0, quirk_reroute_to_boot_interrupts_intel); | ||
1416 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80332_1, quirk_reroute_to_boot_interrupts_intel); | ||
1417 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80333_0, quirk_reroute_to_boot_interrupts_intel); | ||
1418 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80333_1, quirk_reroute_to_boot_interrupts_intel); | ||
1419 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_0, quirk_reroute_to_boot_interrupts_intel); | ||
1420 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_0, quirk_reroute_to_boot_interrupts_intel); | ||
1421 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1, quirk_reroute_to_boot_interrupts_intel); | ||
1422 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXHV, quirk_reroute_to_boot_interrupts_intel); | ||
1423 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80332_0, quirk_reroute_to_boot_interrupts_intel); | ||
1424 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80332_1, quirk_reroute_to_boot_interrupts_intel); | ||
1425 | |||
1426 | /* | ||
1427 | * On some chipsets we can disable the generation of legacy INTx boot | ||
1428 | * interrupts. | ||
1429 | */ | ||
1430 | |||
1431 | /* | ||
1432 | * IO-APIC1 on 6300ESB generates boot interrupts, see intel order no | ||
1433 | * 300641-004US, section 5.7.3. | ||
1434 | */ | ||
1435 | #define INTEL_6300_IOAPIC_ABAR 0x40 | ||
1436 | #define INTEL_6300_DISABLE_BOOT_IRQ (1<<14) | ||
1437 | |||
1438 | static void quirk_disable_intel_boot_interrupt(struct pci_dev *dev) | ||
1439 | { | ||
1440 | u16 pci_config_word; | ||
1441 | |||
1442 | if (noioapicquirk) | ||
1443 | return; | ||
1444 | |||
1445 | pci_read_config_word(dev, INTEL_6300_IOAPIC_ABAR, &pci_config_word); | ||
1446 | pci_config_word |= INTEL_6300_DISABLE_BOOT_IRQ; | ||
1447 | pci_write_config_word(dev, INTEL_6300_IOAPIC_ABAR, pci_config_word); | ||
1448 | |||
1449 | printk(KERN_INFO "disabled boot interrupt on device 0x%04x:0x%04x\n", | ||
1450 | dev->vendor, dev->device); | ||
1451 | } | ||
1452 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_10, quirk_disable_intel_boot_interrupt); | ||
1453 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_10, quirk_disable_intel_boot_interrupt); | ||
1454 | |||
1455 | /* | ||
1456 | * disable boot interrupts on HT-1000 | ||
1457 | */ | ||
1458 | #define BC_HT1000_FEATURE_REG 0x64 | ||
1459 | #define BC_HT1000_PIC_REGS_ENABLE (1<<0) | ||
1460 | #define BC_HT1000_MAP_IDX 0xC00 | ||
1461 | #define BC_HT1000_MAP_DATA 0xC01 | ||
1462 | |||
1463 | static void quirk_disable_broadcom_boot_interrupt(struct pci_dev *dev) | ||
1464 | { | ||
1465 | u32 pci_config_dword; | ||
1466 | u8 irq; | ||
1467 | |||
1468 | if (noioapicquirk) | ||
1469 | return; | ||
1470 | |||
1471 | pci_read_config_dword(dev, BC_HT1000_FEATURE_REG, &pci_config_dword); | ||
1472 | pci_write_config_dword(dev, BC_HT1000_FEATURE_REG, pci_config_dword | | ||
1473 | BC_HT1000_PIC_REGS_ENABLE); | ||
1474 | |||
1475 | for (irq = 0x10; irq < 0x10 + 32; irq++) { | ||
1476 | outb(irq, BC_HT1000_MAP_IDX); | ||
1477 | outb(0x00, BC_HT1000_MAP_DATA); | ||
1478 | } | ||
1479 | |||
1480 | pci_write_config_dword(dev, BC_HT1000_FEATURE_REG, pci_config_dword); | ||
1481 | |||
1482 | printk(KERN_INFO "disabled boot interrupts on PCI device" | ||
1483 | "0x%04x:0x%04x\n", dev->vendor, dev->device); | ||
1484 | } | ||
1485 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000SB, quirk_disable_broadcom_boot_interrupt); | ||
1486 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000SB, quirk_disable_broadcom_boot_interrupt); | ||
1487 | |||
1488 | /* | ||
1489 | * disable boot interrupts on AMD and ATI chipsets | ||
1490 | */ | ||
1491 | /* | ||
1492 | * NOIOAMODE needs to be disabled to disable "boot interrupts". For AMD 8131 | ||
1493 | * rev. A0 and B0, NOIOAMODE needs to be disabled anyway to fix IO-APIC mode | ||
1494 | * (due to an erratum). | ||
1495 | */ | ||
1496 | #define AMD_813X_MISC 0x40 | ||
1497 | #define AMD_813X_NOIOAMODE (1<<0) | ||
1498 | |||
1499 | static void quirk_disable_amd_813x_boot_interrupt(struct pci_dev *dev) | ||
1500 | { | ||
1501 | u32 pci_config_dword; | ||
1502 | |||
1503 | if (noioapicquirk) | ||
1504 | return; | ||
1505 | |||
1506 | pci_read_config_dword(dev, AMD_813X_MISC, &pci_config_dword); | ||
1507 | pci_config_dword &= ~AMD_813X_NOIOAMODE; | ||
1508 | pci_write_config_dword(dev, AMD_813X_MISC, pci_config_dword); | ||
1509 | |||
1510 | printk(KERN_INFO "disabled boot interrupts on PCI device " | ||
1511 | "0x%04x:0x%04x\n", dev->vendor, dev->device); | ||
1512 | } | ||
1513 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_disable_amd_813x_boot_interrupt); | ||
1514 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8132_BRIDGE, quirk_disable_amd_813x_boot_interrupt); | ||
1515 | |||
1516 | #define AMD_8111_PCI_IRQ_ROUTING 0x56 | ||
1517 | |||
1518 | static void quirk_disable_amd_8111_boot_interrupt(struct pci_dev *dev) | ||
1519 | { | ||
1520 | u16 pci_config_word; | ||
1521 | |||
1522 | if (noioapicquirk) | ||
1523 | return; | ||
1524 | |||
1525 | pci_read_config_word(dev, AMD_8111_PCI_IRQ_ROUTING, &pci_config_word); | ||
1526 | if (!pci_config_word) { | ||
1527 | printk(KERN_INFO "boot interrupts on PCI device 0x%04x:0x%04x " | ||
1528 | "already disabled\n", | ||
1529 | dev->vendor, dev->device); | ||
1530 | return; | ||
1531 | } | ||
1532 | pci_write_config_word(dev, AMD_8111_PCI_IRQ_ROUTING, 0); | ||
1533 | printk(KERN_INFO "disabled boot interrupts on PCI device " | ||
1534 | "0x%04x:0x%04x\n", dev->vendor, dev->device); | ||
1535 | } | ||
1536 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8111_SMBUS, quirk_disable_amd_8111_boot_interrupt); | ||
1537 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8111_SMBUS, quirk_disable_amd_8111_boot_interrupt); | ||
1538 | #endif /* CONFIG_X86_IO_APIC */ | ||
1539 | |||
1412 | /* | 1540 | /* |
1413 | * Toshiba TC86C001 IDE controller reports the standard 8-byte BAR0 size | 1541 | * Toshiba TC86C001 IDE controller reports the standard 8-byte BAR0 size |
1414 | * but the PIO transfers won't work if BAR0 falls at the odd 8 bytes. | 1542 | * but the PIO transfers won't work if BAR0 falls at the odd 8 bytes. |
diff --git a/include/asm-x86/io_apic.h b/include/asm-x86/io_apic.h index 14f82bbcb5fd..721605d8f116 100644 --- a/include/asm-x86/io_apic.h +++ b/include/asm-x86/io_apic.h | |||
@@ -157,11 +157,21 @@ extern int sis_apic_bug; | |||
157 | /* 1 if "noapic" boot option passed */ | 157 | /* 1 if "noapic" boot option passed */ |
158 | extern int skip_ioapic_setup; | 158 | extern int skip_ioapic_setup; |
159 | 159 | ||
160 | /* 1 if "noapic" boot option passed */ | ||
161 | extern int noioapicquirk; | ||
162 | |||
163 | /* -1 if "noapic" boot option passed */ | ||
164 | extern int noioapicreroute; | ||
165 | |||
160 | /* 1 if the timer IRQ uses the '8259A Virtual Wire' mode */ | 166 | /* 1 if the timer IRQ uses the '8259A Virtual Wire' mode */ |
161 | extern int timer_through_8259; | 167 | extern int timer_through_8259; |
162 | 168 | ||
163 | static inline void disable_ioapic_setup(void) | 169 | static inline void disable_ioapic_setup(void) |
164 | { | 170 | { |
171 | #ifdef CONFIG_PCI | ||
172 | noioapicquirk = 1; | ||
173 | noioapicreroute = -1; | ||
174 | #endif | ||
165 | skip_ioapic_setup = 1; | 175 | skip_ioapic_setup = 1; |
166 | } | 176 | } |
167 | 177 | ||
diff --git a/include/asm-x86/pci.h b/include/asm-x86/pci.h index 2db14cf17db8..52a29f7668ef 100644 --- a/include/asm-x86/pci.h +++ b/include/asm-x86/pci.h | |||
@@ -19,6 +19,8 @@ struct pci_sysdata { | |||
19 | }; | 19 | }; |
20 | 20 | ||
21 | extern int pci_routeirq; | 21 | extern int pci_routeirq; |
22 | extern int noioapicquirk; | ||
23 | extern int ioapicreroute; | ||
22 | 24 | ||
23 | /* scan a bus after allocating a pci_sysdata for it */ | 25 | /* scan a bus after allocating a pci_sysdata for it */ |
24 | extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops, | 26 | extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops, |
diff --git a/include/linux/pci.h b/include/linux/pci.h index a6a088e1a804..cfc2297c3e28 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -126,6 +126,11 @@ enum pci_dev_flags { | |||
126 | PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = (__force pci_dev_flags_t) 1, | 126 | PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = (__force pci_dev_flags_t) 1, |
127 | }; | 127 | }; |
128 | 128 | ||
129 | enum pci_irq_reroute_variant { | ||
130 | INTEL_IRQ_REROUTE_VARIANT = 1, | ||
131 | MAX_IRQ_REROUTE_VARIANTS = 3 | ||
132 | }; | ||
133 | |||
129 | typedef unsigned short __bitwise pci_bus_flags_t; | 134 | typedef unsigned short __bitwise pci_bus_flags_t; |
130 | enum pci_bus_flags { | 135 | enum pci_bus_flags { |
131 | PCI_BUS_FLAGS_NO_MSI = (__force pci_bus_flags_t) 1, | 136 | PCI_BUS_FLAGS_NO_MSI = (__force pci_bus_flags_t) 1, |
@@ -210,6 +215,7 @@ struct pci_dev { | |||
210 | unsigned int no_msi:1; /* device may not use msi */ | 215 | unsigned int no_msi:1; /* device may not use msi */ |
211 | unsigned int block_ucfg_access:1; /* userspace config space access is blocked */ | 216 | unsigned int block_ucfg_access:1; /* userspace config space access is blocked */ |
212 | unsigned int broken_parity_status:1; /* Device generates false positive parity */ | 217 | unsigned int broken_parity_status:1; /* Device generates false positive parity */ |
218 | unsigned int irq_reroute_variant:2; /* device needs IRQ rerouting variant */ | ||
213 | unsigned int msi_enabled:1; | 219 | unsigned int msi_enabled:1; |
214 | unsigned int msix_enabled:1; | 220 | unsigned int msix_enabled:1; |
215 | unsigned int is_managed:1; | 221 | unsigned int is_managed:1; |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 6be6a7943d8b..2b3934c735b2 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
@@ -2238,6 +2238,10 @@ | |||
2238 | #define PCI_DEVICE_ID_INTEL_PXH_0 0x0329 | 2238 | #define PCI_DEVICE_ID_INTEL_PXH_0 0x0329 |
2239 | #define PCI_DEVICE_ID_INTEL_PXH_1 0x032A | 2239 | #define PCI_DEVICE_ID_INTEL_PXH_1 0x032A |
2240 | #define PCI_DEVICE_ID_INTEL_PXHV 0x032C | 2240 | #define PCI_DEVICE_ID_INTEL_PXHV 0x032C |
2241 | #define PCI_DEVICE_ID_INTEL_80332_0 0x0330 | ||
2242 | #define PCI_DEVICE_ID_INTEL_80332_1 0x0332 | ||
2243 | #define PCI_DEVICE_ID_INTEL_80333_0 0x0370 | ||
2244 | #define PCI_DEVICE_ID_INTEL_80333_1 0x0372 | ||
2241 | #define PCI_DEVICE_ID_INTEL_82375 0x0482 | 2245 | #define PCI_DEVICE_ID_INTEL_82375 0x0482 |
2242 | #define PCI_DEVICE_ID_INTEL_82424 0x0483 | 2246 | #define PCI_DEVICE_ID_INTEL_82424 0x0483 |
2243 | #define PCI_DEVICE_ID_INTEL_82378 0x0484 | 2247 | #define PCI_DEVICE_ID_INTEL_82378 0x0484 |
@@ -2310,6 +2314,7 @@ | |||
2310 | #define PCI_DEVICE_ID_INTEL_ESB_4 0x25a4 | 2314 | #define PCI_DEVICE_ID_INTEL_ESB_4 0x25a4 |
2311 | #define PCI_DEVICE_ID_INTEL_ESB_5 0x25a6 | 2315 | #define PCI_DEVICE_ID_INTEL_ESB_5 0x25a6 |
2312 | #define PCI_DEVICE_ID_INTEL_ESB_9 0x25ab | 2316 | #define PCI_DEVICE_ID_INTEL_ESB_9 0x25ab |
2317 | #define PCI_DEVICE_ID_INTEL_ESB_10 0x25ac | ||
2313 | #define PCI_DEVICE_ID_INTEL_82820_HB 0x2500 | 2318 | #define PCI_DEVICE_ID_INTEL_82820_HB 0x2500 |
2314 | #define PCI_DEVICE_ID_INTEL_82820_UP_HB 0x2501 | 2319 | #define PCI_DEVICE_ID_INTEL_82820_UP_HB 0x2501 |
2315 | #define PCI_DEVICE_ID_INTEL_82850_HB 0x2530 | 2320 | #define PCI_DEVICE_ID_INTEL_82850_HB 0x2530 |