diff options
Diffstat (limited to 'drivers/pci/quirks.c')
-rw-r--r-- | drivers/pci/quirks.c | 284 |
1 files changed, 265 insertions, 19 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 4364d793f73..08cd86a6dd6 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -15,7 +15,6 @@ | |||
15 | * use the PowerTweak utility (see http://powertweak.sourceforge.net). | 15 | * use the PowerTweak utility (see http://powertweak.sourceforge.net). |
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include <linux/config.h> | ||
19 | #include <linux/types.h> | 18 | #include <linux/types.h> |
20 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
21 | #include <linux/pci.h> | 20 | #include <linux/pci.h> |
@@ -401,6 +400,7 @@ static void __devinit quirk_piix4_acpi(struct pci_dev *dev) | |||
401 | piix4_io_quirk(dev, "PIIX4 devres J", 0x7c, 1 << 20); | 400 | piix4_io_quirk(dev, "PIIX4 devres J", 0x7c, 1 << 20); |
402 | } | 401 | } |
403 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi ); | 402 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi ); |
403 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443MX_3, quirk_piix4_acpi ); | ||
404 | 404 | ||
405 | /* | 405 | /* |
406 | * ICH4, ICH4-M, ICH5, ICH5-M ACPI: Three IO regions pointed to by longwords at | 406 | * ICH4, ICH4-M, ICH5, ICH5-M ACPI: Three IO regions pointed to by longwords at |
@@ -438,6 +438,7 @@ static void __devinit quirk_ich6_lpc_acpi(struct pci_dev *dev) | |||
438 | pci_read_config_dword(dev, 0x48, ®ion); | 438 | pci_read_config_dword(dev, 0x48, ®ion); |
439 | quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES+1, "ICH6 GPIO"); | 439 | quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES+1, "ICH6 GPIO"); |
440 | } | 440 | } |
441 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0, quirk_ich6_lpc_acpi ); | ||
441 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, quirk_ich6_lpc_acpi ); | 442 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, quirk_ich6_lpc_acpi ); |
442 | 443 | ||
443 | /* | 444 | /* |
@@ -576,8 +577,6 @@ static void __init quirk_ioapic_rmw(struct pci_dev *dev) | |||
576 | } | 577 | } |
577 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI, PCI_ANY_ID, quirk_ioapic_rmw ); | 578 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI, PCI_ANY_ID, quirk_ioapic_rmw ); |
578 | 579 | ||
579 | int pci_msi_quirk; | ||
580 | |||
581 | #define AMD8131_revA0 0x01 | 580 | #define AMD8131_revA0 0x01 |
582 | #define AMD8131_revB0 0x11 | 581 | #define AMD8131_revB0 0x11 |
583 | #define AMD8131_MISC 0x40 | 582 | #define AMD8131_MISC 0x40 |
@@ -586,12 +585,6 @@ static void __init quirk_amd_8131_ioapic(struct pci_dev *dev) | |||
586 | { | 585 | { |
587 | unsigned char revid, tmp; | 586 | unsigned char revid, tmp; |
588 | 587 | ||
589 | if (dev->subordinate) { | ||
590 | printk(KERN_WARNING "PCI: MSI quirk detected. " | ||
591 | "PCI_BUS_FLAGS_NO_MSI set for subordinate bus.\n"); | ||
592 | dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI; | ||
593 | } | ||
594 | |||
595 | if (nr_ioapics == 0) | 588 | if (nr_ioapics == 0) |
596 | return; | 589 | return; |
597 | 590 | ||
@@ -604,13 +597,6 @@ static void __init quirk_amd_8131_ioapic(struct pci_dev *dev) | |||
604 | } | 597 | } |
605 | } | 598 | } |
606 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic); | 599 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic); |
607 | |||
608 | static void __init quirk_svw_msi(struct pci_dev *dev) | ||
609 | { | ||
610 | pci_msi_quirk = 1; | ||
611 | printk(KERN_WARNING "PCI: MSI quirk detected. pci_msi_quirk set.\n"); | ||
612 | } | ||
613 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_svw_msi ); | ||
614 | #endif /* CONFIG_X86_IO_APIC */ | 600 | #endif /* CONFIG_X86_IO_APIC */ |
615 | 601 | ||
616 | 602 | ||
@@ -666,6 +652,7 @@ DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0, quirk_vi | |||
666 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, quirk_via_irq); | 652 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, quirk_via_irq); |
667 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2, quirk_via_irq); | 653 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2, quirk_via_irq); |
668 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_irq); | 654 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_irq); |
655 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235_USB_2, quirk_via_irq); | ||
669 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_irq); | 656 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_irq); |
670 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_irq); | 657 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_irq); |
671 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, quirk_via_irq); | 658 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, quirk_via_irq); |
@@ -683,6 +670,33 @@ static void __devinit quirk_vt82c598_id(struct pci_dev *dev) | |||
683 | } | 670 | } |
684 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_vt82c598_id ); | 671 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_vt82c598_id ); |
685 | 672 | ||
673 | #ifdef CONFIG_ACPI_SLEEP | ||
674 | |||
675 | /* | ||
676 | * Some VIA systems boot with the abnormal status flag set. This can cause | ||
677 | * the BIOS to re-POST the system on resume rather than passing control | ||
678 | * back to the OS. Clear the flag on boot | ||
679 | */ | ||
680 | static void __devinit quirk_via_abnormal_poweroff(struct pci_dev *dev) | ||
681 | { | ||
682 | u32 reg; | ||
683 | |||
684 | acpi_hw_register_read(ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_STATUS, | ||
685 | ®); | ||
686 | |||
687 | if (reg & 0x800) { | ||
688 | printk("Clearing abnormal poweroff flag\n"); | ||
689 | acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK, | ||
690 | ACPI_REGISTER_PM1_STATUS, | ||
691 | (u16)0x800); | ||
692 | } | ||
693 | } | ||
694 | |||
695 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_via_abnormal_poweroff); | ||
696 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, quirk_via_abnormal_poweroff); | ||
697 | |||
698 | #endif | ||
699 | |||
686 | /* | 700 | /* |
687 | * CardBus controllers have a legacy base address that enables them | 701 | * CardBus controllers have a legacy base address that enables them |
688 | * to respond as i82365 pcmcia controllers. We don't want them to | 702 | * to respond as i82365 pcmcia controllers. We don't want them to |
@@ -963,6 +977,11 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) | |||
963 | case 0x8070: /* P4G8X Deluxe */ | 977 | case 0x8070: /* P4G8X Deluxe */ |
964 | asus_hides_smbus = 1; | 978 | asus_hides_smbus = 1; |
965 | } | 979 | } |
980 | if (dev->device == PCI_DEVICE_ID_INTEL_E7501_MCH) | ||
981 | switch (dev->subsystem_device) { | ||
982 | case 0x80c9: /* PU-DLS */ | ||
983 | asus_hides_smbus = 1; | ||
984 | } | ||
966 | if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB) | 985 | if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB) |
967 | switch (dev->subsystem_device) { | 986 | switch (dev->subsystem_device) { |
968 | case 0x1751: /* M2N notebook */ | 987 | case 0x1751: /* M2N notebook */ |
@@ -1031,6 +1050,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845G_HB, asu | |||
1031 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82850_HB, asus_hides_smbus_hostbridge ); | 1050 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82850_HB, asus_hides_smbus_hostbridge ); |
1032 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82865_HB, asus_hides_smbus_hostbridge ); | 1051 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82865_HB, asus_hides_smbus_hostbridge ); |
1033 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_7205_0, asus_hides_smbus_hostbridge ); | 1052 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_7205_0, asus_hides_smbus_hostbridge ); |
1053 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7501_MCH, asus_hides_smbus_hostbridge ); | ||
1034 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855PM_HB, asus_hides_smbus_hostbridge ); | 1054 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855PM_HB, asus_hides_smbus_hostbridge ); |
1035 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855GM_HB, asus_hides_smbus_hostbridge ); | 1055 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855GM_HB, asus_hides_smbus_hostbridge ); |
1036 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82915GM_HB, asus_hides_smbus_hostbridge ); | 1056 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82915GM_HB, asus_hides_smbus_hostbridge ); |
@@ -1054,10 +1074,10 @@ static void __init asus_hides_smbus_lpc(struct pci_dev *dev) | |||
1054 | } | 1074 | } |
1055 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc ); | 1075 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc ); |
1056 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc ); | 1076 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc ); |
1077 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, asus_hides_smbus_lpc ); | ||
1057 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc ); | 1078 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc ); |
1058 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc ); | 1079 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc ); |
1059 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc ); | 1080 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc ); |
1060 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, asus_hides_smbus_lpc ); | ||
1061 | 1081 | ||
1062 | static void __init asus_hides_smbus_lpc_ich6(struct pci_dev *dev) | 1082 | static void __init asus_hides_smbus_lpc_ich6(struct pci_dev *dev) |
1063 | { | 1083 | { |
@@ -1175,6 +1195,55 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_962, quirk_sis_96x_ | |||
1175 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus ); | 1195 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus ); |
1176 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus ); | 1196 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus ); |
1177 | 1197 | ||
1198 | #if defined(CONFIG_ATA) || defined(CONFIG_ATA_MODULE) | ||
1199 | |||
1200 | /* | ||
1201 | * If we are using libata we can drive this chip properly but must | ||
1202 | * do this early on to make the additional device appear during | ||
1203 | * the PCI scanning. | ||
1204 | */ | ||
1205 | |||
1206 | static void __devinit quirk_jmicron_dualfn(struct pci_dev *pdev) | ||
1207 | { | ||
1208 | u32 conf; | ||
1209 | u8 hdr; | ||
1210 | |||
1211 | /* Only poke fn 0 */ | ||
1212 | if (PCI_FUNC(pdev->devfn)) | ||
1213 | return; | ||
1214 | |||
1215 | switch(pdev->device) { | ||
1216 | case PCI_DEVICE_ID_JMICRON_JMB365: | ||
1217 | case PCI_DEVICE_ID_JMICRON_JMB366: | ||
1218 | /* Redirect IDE second PATA port to the right spot */ | ||
1219 | pci_read_config_dword(pdev, 0x80, &conf); | ||
1220 | conf |= (1 << 24); | ||
1221 | /* Fall through */ | ||
1222 | pci_write_config_dword(pdev, 0x80, conf); | ||
1223 | case PCI_DEVICE_ID_JMICRON_JMB361: | ||
1224 | case PCI_DEVICE_ID_JMICRON_JMB363: | ||
1225 | pci_read_config_dword(pdev, 0x40, &conf); | ||
1226 | /* Enable dual function mode, AHCI on fn 0, IDE fn1 */ | ||
1227 | /* Set the class codes correctly and then direct IDE 0 */ | ||
1228 | conf &= ~0x000F0200; /* Clear bit 9 and 16-19 */ | ||
1229 | conf |= 0x00C20002; /* Set bit 1, 17, 22, 23 */ | ||
1230 | pci_write_config_dword(pdev, 0x40, conf); | ||
1231 | |||
1232 | /* Reconfigure so that the PCI scanner discovers the | ||
1233 | device is now multifunction */ | ||
1234 | |||
1235 | pci_read_config_byte(pdev, PCI_HEADER_TYPE, &hdr); | ||
1236 | pdev->hdr_type = hdr & 0x7f; | ||
1237 | pdev->multifunction = !!(hdr & 0x80); | ||
1238 | |||
1239 | break; | ||
1240 | } | ||
1241 | } | ||
1242 | |||
1243 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, quirk_jmicron_dualfn); | ||
1244 | |||
1245 | #endif | ||
1246 | |||
1178 | #ifdef CONFIG_X86_IO_APIC | 1247 | #ifdef CONFIG_X86_IO_APIC |
1179 | static void __init quirk_alder_ioapic(struct pci_dev *pdev) | 1248 | static void __init quirk_alder_ioapic(struct pci_dev *pdev) |
1180 | { | 1249 | { |
@@ -1216,7 +1285,7 @@ static int __init combined_setup(char *str) | |||
1216 | } | 1285 | } |
1217 | __setup("combined_mode=", combined_setup); | 1286 | __setup("combined_mode=", combined_setup); |
1218 | 1287 | ||
1219 | #ifdef CONFIG_SCSI_SATA_INTEL_COMBINED | 1288 | #ifdef CONFIG_SATA_INTEL_COMBINED |
1220 | static void __devinit quirk_intel_ide_combined(struct pci_dev *pdev) | 1289 | static void __devinit quirk_intel_ide_combined(struct pci_dev *pdev) |
1221 | { | 1290 | { |
1222 | u8 prog, comb, tmp; | 1291 | u8 prog, comb, tmp; |
@@ -1309,7 +1378,7 @@ static void __devinit quirk_intel_ide_combined(struct pci_dev *pdev) | |||
1309 | request_region(0x170, 8, "libata"); /* port 1 */ | 1378 | request_region(0x170, 8, "libata"); /* port 1 */ |
1310 | } | 1379 | } |
1311 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_intel_ide_combined ); | 1380 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_intel_ide_combined ); |
1312 | #endif /* CONFIG_SCSI_SATA_INTEL_COMBINED */ | 1381 | #endif /* CONFIG_SATA_INTEL_COMBINED */ |
1313 | 1382 | ||
1314 | 1383 | ||
1315 | int pcie_mch_quirk; | 1384 | int pcie_mch_quirk; |
@@ -1342,6 +1411,37 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_0, quirk_pc | |||
1342 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1, quirk_pcie_pxh); | 1411 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1, quirk_pcie_pxh); |
1343 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXHV, quirk_pcie_pxh); | 1412 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXHV, quirk_pcie_pxh); |
1344 | 1413 | ||
1414 | /* | ||
1415 | * Some Intel PCI Express chipsets have trouble with downstream | ||
1416 | * device power management. | ||
1417 | */ | ||
1418 | static void quirk_intel_pcie_pm(struct pci_dev * dev) | ||
1419 | { | ||
1420 | pci_pm_d3_delay = 120; | ||
1421 | dev->no_d1d2 = 1; | ||
1422 | } | ||
1423 | |||
1424 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e2, quirk_intel_pcie_pm); | ||
1425 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e3, quirk_intel_pcie_pm); | ||
1426 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e4, quirk_intel_pcie_pm); | ||
1427 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e5, quirk_intel_pcie_pm); | ||
1428 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e6, quirk_intel_pcie_pm); | ||
1429 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e7, quirk_intel_pcie_pm); | ||
1430 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25f7, quirk_intel_pcie_pm); | ||
1431 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25f8, quirk_intel_pcie_pm); | ||
1432 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25f9, quirk_intel_pcie_pm); | ||
1433 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25fa, quirk_intel_pcie_pm); | ||
1434 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2601, quirk_intel_pcie_pm); | ||
1435 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2602, quirk_intel_pcie_pm); | ||
1436 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2603, quirk_intel_pcie_pm); | ||
1437 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2604, quirk_intel_pcie_pm); | ||
1438 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2605, quirk_intel_pcie_pm); | ||
1439 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2606, quirk_intel_pcie_pm); | ||
1440 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2607, quirk_intel_pcie_pm); | ||
1441 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2608, quirk_intel_pcie_pm); | ||
1442 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2609, quirk_intel_pcie_pm); | ||
1443 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260a, quirk_intel_pcie_pm); | ||
1444 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260b, quirk_intel_pcie_pm); | ||
1345 | 1445 | ||
1346 | /* | 1446 | /* |
1347 | * Fixup the cardbus bridges on the IBM Dock II docking station | 1447 | * Fixup the cardbus bridges on the IBM Dock II docking station |
@@ -1404,6 +1504,63 @@ static void __devinit quirk_netmos(struct pci_dev *dev) | |||
1404 | } | 1504 | } |
1405 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID, quirk_netmos); | 1505 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID, quirk_netmos); |
1406 | 1506 | ||
1507 | static void __devinit quirk_e100_interrupt(struct pci_dev *dev) | ||
1508 | { | ||
1509 | u16 command; | ||
1510 | u32 bar; | ||
1511 | u8 __iomem *csr; | ||
1512 | u8 cmd_hi; | ||
1513 | |||
1514 | switch (dev->device) { | ||
1515 | /* PCI IDs taken from drivers/net/e100.c */ | ||
1516 | case 0x1029: | ||
1517 | case 0x1030 ... 0x1034: | ||
1518 | case 0x1038 ... 0x103E: | ||
1519 | case 0x1050 ... 0x1057: | ||
1520 | case 0x1059: | ||
1521 | case 0x1064 ... 0x106B: | ||
1522 | case 0x1091 ... 0x1095: | ||
1523 | case 0x1209: | ||
1524 | case 0x1229: | ||
1525 | case 0x2449: | ||
1526 | case 0x2459: | ||
1527 | case 0x245D: | ||
1528 | case 0x27DC: | ||
1529 | break; | ||
1530 | default: | ||
1531 | return; | ||
1532 | } | ||
1533 | |||
1534 | /* | ||
1535 | * Some firmware hands off the e100 with interrupts enabled, | ||
1536 | * which can cause a flood of interrupts if packets are | ||
1537 | * received before the driver attaches to the device. So | ||
1538 | * disable all e100 interrupts here. The driver will | ||
1539 | * re-enable them when it's ready. | ||
1540 | */ | ||
1541 | pci_read_config_word(dev, PCI_COMMAND, &command); | ||
1542 | pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar); | ||
1543 | |||
1544 | if (!(command & PCI_COMMAND_MEMORY) || !bar) | ||
1545 | return; | ||
1546 | |||
1547 | csr = ioremap(bar, 8); | ||
1548 | if (!csr) { | ||
1549 | printk(KERN_WARNING "PCI: Can't map %s e100 registers\n", | ||
1550 | pci_name(dev)); | ||
1551 | return; | ||
1552 | } | ||
1553 | |||
1554 | cmd_hi = readb(csr + 3); | ||
1555 | if (cmd_hi == 0) { | ||
1556 | printk(KERN_WARNING "PCI: Firmware left %s e100 interrupts " | ||
1557 | "enabled, disabling\n", pci_name(dev)); | ||
1558 | writeb(1, csr + 3); | ||
1559 | } | ||
1560 | |||
1561 | iounmap(csr); | ||
1562 | } | ||
1563 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_e100_interrupt); | ||
1407 | 1564 | ||
1408 | static void __devinit fixup_rev1_53c810(struct pci_dev* dev) | 1565 | static void __devinit fixup_rev1_53c810(struct pci_dev* dev) |
1409 | { | 1566 | { |
@@ -1518,6 +1675,95 @@ static void __devinit quirk_nvidia_ck804_pcie_aer_ext_cap(struct pci_dev *dev) | |||
1518 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, | 1675 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, |
1519 | quirk_nvidia_ck804_pcie_aer_ext_cap); | 1676 | quirk_nvidia_ck804_pcie_aer_ext_cap); |
1520 | 1677 | ||
1678 | #ifdef CONFIG_PCI_MSI | ||
1679 | /* To disable MSI globally */ | ||
1680 | int pci_msi_quirk; | ||
1681 | |||
1682 | /* The Serverworks PCI-X chipset does not support MSI. We cannot easily rely | ||
1683 | * on setting PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually | ||
1684 | * some other busses controlled by the chipset even if Linux is not aware of it. | ||
1685 | * Instead of setting the flag on all busses in the machine, simply disable MSI | ||
1686 | * globally. | ||
1687 | */ | ||
1688 | static void __init quirk_svw_msi(struct pci_dev *dev) | ||
1689 | { | ||
1690 | pci_msi_quirk = 1; | ||
1691 | printk(KERN_WARNING "PCI: MSI quirk detected. pci_msi_quirk set.\n"); | ||
1692 | } | ||
1693 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_svw_msi); | ||
1694 | |||
1695 | /* Disable MSI on chipsets that are known to not support it */ | ||
1696 | static void __devinit quirk_disable_msi(struct pci_dev *dev) | ||
1697 | { | ||
1698 | if (dev->subordinate) { | ||
1699 | printk(KERN_WARNING "PCI: MSI quirk detected. " | ||
1700 | "PCI_BUS_FLAGS_NO_MSI set for %s subordinate bus.\n", | ||
1701 | pci_name(dev)); | ||
1702 | dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI; | ||
1703 | } | ||
1704 | } | ||
1705 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_disable_msi); | ||
1706 | |||
1707 | /* Go through the list of Hypertransport capabilities and | ||
1708 | * return 1 if a HT MSI capability is found and enabled */ | ||
1709 | static int __devinit msi_ht_cap_enabled(struct pci_dev *dev) | ||
1710 | { | ||
1711 | u8 pos; | ||
1712 | int ttl; | ||
1713 | for (pos = pci_find_capability(dev, PCI_CAP_ID_HT), ttl = 48; | ||
1714 | pos && ttl; | ||
1715 | pos = pci_find_next_capability(dev, pos, PCI_CAP_ID_HT), ttl--) { | ||
1716 | u32 cap_hdr; | ||
1717 | /* MSI mapping section according to Hypertransport spec */ | ||
1718 | if (pci_read_config_dword(dev, pos, &cap_hdr) == 0 | ||
1719 | && (cap_hdr & 0xf8000000) == 0xa8000000 /* MSI mapping */) { | ||
1720 | printk(KERN_INFO "PCI: Found HT MSI mapping on %s with capability %s\n", | ||
1721 | pci_name(dev), cap_hdr & 0x10000 ? "enabled" : "disabled"); | ||
1722 | return (cap_hdr & 0x10000) != 0; /* MSI mapping cap enabled */ | ||
1723 | } | ||
1724 | } | ||
1725 | return 0; | ||
1726 | } | ||
1727 | |||
1728 | /* Check the hypertransport MSI mapping to know whether MSI is enabled or not */ | ||
1729 | static void __devinit quirk_msi_ht_cap(struct pci_dev *dev) | ||
1730 | { | ||
1731 | if (dev->subordinate && !msi_ht_cap_enabled(dev)) { | ||
1732 | printk(KERN_WARNING "PCI: MSI quirk detected. " | ||
1733 | "MSI disabled on chipset %s.\n", | ||
1734 | pci_name(dev)); | ||
1735 | dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI; | ||
1736 | } | ||
1737 | } | ||
1738 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT2000_PCIE, | ||
1739 | quirk_msi_ht_cap); | ||
1740 | |||
1741 | /* The nVidia CK804 chipset may have 2 HT MSI mappings. | ||
1742 | * MSI are supported if the MSI capability set in any of these mappings. | ||
1743 | */ | ||
1744 | static void __devinit quirk_nvidia_ck804_msi_ht_cap(struct pci_dev *dev) | ||
1745 | { | ||
1746 | struct pci_dev *pdev; | ||
1747 | |||
1748 | if (!dev->subordinate) | ||
1749 | return; | ||
1750 | |||
1751 | /* check HT MSI cap on this chipset and the root one. | ||
1752 | * a single one having MSI is enough to be sure that MSI are supported. | ||
1753 | */ | ||
1754 | pdev = pci_find_slot(dev->bus->number, 0); | ||
1755 | if (dev->subordinate && !msi_ht_cap_enabled(dev) | ||
1756 | && !msi_ht_cap_enabled(pdev)) { | ||
1757 | printk(KERN_WARNING "PCI: MSI quirk detected. " | ||
1758 | "MSI disabled on chipset %s.\n", | ||
1759 | pci_name(dev)); | ||
1760 | dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI; | ||
1761 | } | ||
1762 | } | ||
1763 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, | ||
1764 | quirk_nvidia_ck804_msi_ht_cap); | ||
1765 | #endif /* CONFIG_PCI_MSI */ | ||
1766 | |||
1521 | EXPORT_SYMBOL(pcie_mch_quirk); | 1767 | EXPORT_SYMBOL(pcie_mch_quirk); |
1522 | #ifdef CONFIG_HOTPLUG | 1768 | #ifdef CONFIG_HOTPLUG |
1523 | EXPORT_SYMBOL(pci_fixup_device); | 1769 | EXPORT_SYMBOL(pci_fixup_device); |