|
@@ -577,8 +577,6 @@ static void __init quirk_ioapic_rmw(struct pci_dev *dev)
|
|
}
|
|
}
|
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI, PCI_ANY_ID, quirk_ioapic_rmw );
|
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SI, PCI_ANY_ID, quirk_ioapic_rmw );
|
|
|
|
|
|
-int pci_msi_quirk;
|
|
|
|
-
|
|
|
|
#define AMD8131_revA0 0x01
|
|
#define AMD8131_revA0 0x01
|
|
#define AMD8131_revB0 0x11
|
|
#define AMD8131_revB0 0x11
|
|
#define AMD8131_MISC 0x40
|
|
#define AMD8131_MISC 0x40
|
|
@@ -587,12 +585,6 @@ static void __init quirk_amd_8131_ioapic(struct pci_dev *dev)
|
|
{
|
|
{
|
|
unsigned char revid, tmp;
|
|
unsigned char revid, tmp;
|
|
|
|
|
|
- if (dev->subordinate) {
|
|
|
|
- printk(KERN_WARNING "PCI: MSI quirk detected. "
|
|
|
|
- "PCI_BUS_FLAGS_NO_MSI set for subordinate bus.\n");
|
|
|
|
- dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if (nr_ioapics == 0)
|
|
if (nr_ioapics == 0)
|
|
return;
|
|
return;
|
|
|
|
|
|
@@ -605,13 +597,6 @@ static void __init quirk_amd_8131_ioapic(struct pci_dev *dev)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic);
|
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic);
|
|
-
|
|
|
|
-static void __init quirk_svw_msi(struct pci_dev *dev)
|
|
|
|
-{
|
|
|
|
- pci_msi_quirk = 1;
|
|
|
|
- printk(KERN_WARNING "PCI: MSI quirk detected. pci_msi_quirk set.\n");
|
|
|
|
-}
|
|
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_svw_msi );
|
|
|
|
#endif /* CONFIG_X86_IO_APIC */
|
|
#endif /* CONFIG_X86_IO_APIC */
|
|
|
|
|
|
|
|
|
|
@@ -1690,6 +1675,36 @@ static void __devinit quirk_nvidia_ck804_pcie_aer_ext_cap(struct pci_dev *dev)
|
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE,
|
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE,
|
|
quirk_nvidia_ck804_pcie_aer_ext_cap);
|
|
quirk_nvidia_ck804_pcie_aer_ext_cap);
|
|
|
|
|
|
|
|
+#ifdef CONFIG_PCI_MSI
|
|
|
|
+/* To disable MSI globally */
|
|
|
|
+int pci_msi_quirk;
|
|
|
|
+
|
|
|
|
+/* The Serverworks PCI-X chipset does not support MSI. We cannot easily rely
|
|
|
|
+ * on setting PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually
|
|
|
|
+ * some other busses controlled by the chipset even if Linux is not aware of it.
|
|
|
|
+ * Instead of setting the flag on all busses in the machine, simply disable MSI
|
|
|
|
+ * globally.
|
|
|
|
+ */
|
|
|
|
+static void __init quirk_svw_msi(struct pci_dev *dev)
|
|
|
|
+{
|
|
|
|
+ pci_msi_quirk = 1;
|
|
|
|
+ printk(KERN_WARNING "PCI: MSI quirk detected. pci_msi_quirk set.\n");
|
|
|
|
+}
|
|
|
|
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_svw_msi);
|
|
|
|
+
|
|
|
|
+/* Disable MSI on chipsets that are known to not support it */
|
|
|
|
+static void __devinit quirk_disable_msi(struct pci_dev *dev)
|
|
|
|
+{
|
|
|
|
+ if (dev->subordinate) {
|
|
|
|
+ printk(KERN_WARNING "PCI: MSI quirk detected. "
|
|
|
|
+ "PCI_BUS_FLAGS_NO_MSI set for %s subordinate bus.\n",
|
|
|
|
+ pci_name(dev));
|
|
|
|
+ dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_disable_msi);
|
|
|
|
+#endif /* CONFIG_PCI_MSI */
|
|
|
|
+
|
|
EXPORT_SYMBOL(pcie_mch_quirk);
|
|
EXPORT_SYMBOL(pcie_mch_quirk);
|
|
#ifdef CONFIG_HOTPLUG
|
|
#ifdef CONFIG_HOTPLUG
|
|
EXPORT_SYMBOL(pci_fixup_device);
|
|
EXPORT_SYMBOL(pci_fixup_device);
|