Commit 5193d7a7 authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Linus Torvalds

PCI quirk: RS780/RS880: disable MSI behind the PCI bridge

The missing initialization of the nb_cntl.strap_msi_enable does not
seem to be the only problem that prevents MSI, so that quirk is not
sufficient to enable MSI on all machines.  To be safe, disable MSI
unconditionally for the internal graphics and HDMI audio on these
chipsets.

[rjw: Added the PCI_VENDOR_ID_AI quirk.]
Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 5e123e5d
...@@ -2123,6 +2123,9 @@ static void __devinit quirk_disable_msi(struct pci_dev *dev) ...@@ -2123,6 +2123,9 @@ static void __devinit quirk_disable_msi(struct pci_dev *dev)
} }
} }
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_disable_msi); DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_disable_msi);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x9602, quirk_disable_msi);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ASUSTEK, 0x9602, quirk_disable_msi);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AI, 0x9602, quirk_disable_msi);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, 0xa238, quirk_disable_msi); DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, 0xa238, quirk_disable_msi);
/* Go through the list of Hypertransport capabilities and /* Go through the list of Hypertransport capabilities and
...@@ -2495,39 +2498,6 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x4374, ...@@ -2495,39 +2498,6 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x4374,
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x4375, DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x4375,
quirk_msi_intx_disable_bug); quirk_msi_intx_disable_bug);
/*
* MSI does not work with the AMD RS780/RS880 internal graphics and HDMI audio
* devices unless the BIOS has initialized the nb_cntl.strap_msi_enable bit.
*/
static void __init rs780_int_gfx_disable_msi(struct pci_dev *int_gfx_bridge)
{
u32 nb_cntl;
if (!int_gfx_bridge->subordinate)
return;
pci_bus_write_config_dword(int_gfx_bridge->bus, PCI_DEVFN(0, 0),
0x60, 0);
pci_bus_read_config_dword(int_gfx_bridge->bus, PCI_DEVFN(0, 0),
0x64, &nb_cntl);
if (!(nb_cntl & BIT(10))) {
dev_warn(&int_gfx_bridge->dev,
FW_WARN "RS780: MSI for internal graphics disabled\n");
int_gfx_bridge->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;
}
}
#define PCI_DEVICE_ID_AMD_RS780_P2P_INT_GFX 0x9602
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
PCI_DEVICE_ID_AMD_RS780_P2P_INT_GFX,
rs780_int_gfx_disable_msi);
/* wrong vendor ID on M4A785TD motherboard: */
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ASUSTEK,
PCI_DEVICE_ID_AMD_RS780_P2P_INT_GFX,
rs780_int_gfx_disable_msi);
#endif /* CONFIG_PCI_MSI */ #endif /* CONFIG_PCI_MSI */
#ifdef CONFIG_PCI_IOV #ifdef CONFIG_PCI_IOV
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment