* [PATCH] PCI quirk: AMD 780: work around wrong vendor ID on APC bridge
@ 2010-05-26 10:21 Clemens Ladisch
2010-05-26 11:38 ` Matthew Wilcox
2010-05-28 19:25 ` Jesse Barnes
0 siblings, 2 replies; 3+ messages in thread
From: Clemens Ladisch @ 2010-05-26 10:21 UTC (permalink / raw)
To: Jesse Barnes; +Cc: linux-pci, linux-kernel
In all AMD 780 family northbridges, the vendor ID of the internal
graphics PCI/PCI bridge reads not as AMD but as that of the mainboard
vendor, because the hardware actually returns the value of the subsystem
vendor ID (erratum 18).
We currently have additional quirk entries for Asus and Acer, but it is
likely that we will encounter more systems with other vendor IDs.
Since we do not know in advance all possible vendor IDs, a better way to
find the device is to declare the quirk on the host bridge, whose ID is
always correct, and use that device as a stepping stone to find the PCI/
PCI bridge, if present.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -2123,12 +2123,29 @@ static void __devinit 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_ATI, 0x5a3f, quirk_disable_msi);
+/*
+ * The APC bridge device in AMD 780 family northbridges has some random
+ * OEM subsystem ID in its vendor ID register (erratum 18), so instead
+ * we use the possible vendor/device IDs of the host bridge for the
+ * declared quirk, and search for the APC bridge by slot number.
+ */
+static void __devinit quirk_amd_780_apc_msi(struct pci_dev *host_bridge)
+{
+ struct pci_dev *apc_bridge;
+
+ apc_bridge = pci_get_slot(host_bridge->bus, PCI_DEVFN(1, 0));
+ if (apc_bridge) {
+ if (apc_bridge->device == 0x9602)
+ quirk_disable_msi(apc_bridge);
+ pci_dev_put(apc_bridge);
+ }
+}
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x9600, quirk_amd_780_apc_msi);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x9601, quirk_amd_780_apc_msi);
+
/* Go through the list of Hypertransport capabilities and
* return 1 if a HT MSI capability is found and enabled */
static int __devinit msi_ht_cap_enabled(struct pci_dev *dev)
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] PCI quirk: AMD 780: work around wrong vendor ID on APC bridge
2010-05-26 10:21 [PATCH] PCI quirk: AMD 780: work around wrong vendor ID on APC bridge Clemens Ladisch
@ 2010-05-26 11:38 ` Matthew Wilcox
2010-05-28 19:25 ` Jesse Barnes
1 sibling, 0 replies; 3+ messages in thread
From: Matthew Wilcox @ 2010-05-26 11:38 UTC (permalink / raw)
To: Clemens Ladisch; +Cc: Jesse Barnes, linux-pci, linux-kernel
On Wed, May 26, 2010 at 12:21:10PM +0200, Clemens Ladisch wrote:
> Since we do not know in advance all possible vendor IDs, a better way to
> find the device is to declare the quirk on the host bridge, whose ID is
> always correct, and use that device as a stepping stone to find the PCI/
> PCI bridge, if present.
>
> Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Good idea.
Reviewed-by: Matthew Wilcox <willy@linux.intel.com>
--
Matthew Wilcox Intel Open Source Technology Centre
"Bill, look, we understand that you're interested in selling us this
operating system, but compare it to ours. We can't possibly take such
a retrograde step."
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] PCI quirk: AMD 780: work around wrong vendor ID on APC bridge
2010-05-26 10:21 [PATCH] PCI quirk: AMD 780: work around wrong vendor ID on APC bridge Clemens Ladisch
2010-05-26 11:38 ` Matthew Wilcox
@ 2010-05-28 19:25 ` Jesse Barnes
1 sibling, 0 replies; 3+ messages in thread
From: Jesse Barnes @ 2010-05-28 19:25 UTC (permalink / raw)
To: Clemens Ladisch; +Cc: linux-pci, linux-kernel
On Wed, 26 May 2010 12:21:10 +0200
Clemens Ladisch <clemens@ladisch.de> wrote:
> In all AMD 780 family northbridges, the vendor ID of the internal
> graphics PCI/PCI bridge reads not as AMD but as that of the mainboard
> vendor, because the hardware actually returns the value of the subsystem
> vendor ID (erratum 18).
>
> We currently have additional quirk entries for Asus and Acer, but it is
> likely that we will encounter more systems with other vendor IDs.
>
> Since we do not know in advance all possible vendor IDs, a better way to
> find the device is to declare the quirk on the host bridge, whose ID is
> always correct, and use that device as a stepping stone to find the PCI/
> PCI bridge, if present.
>
> Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Applied to my for-linus branch, thanks.
--
Jesse Barnes, Intel Open Source Technology Center
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-05-28 19:25 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-26 10:21 [PATCH] PCI quirk: AMD 780: work around wrong vendor ID on APC bridge Clemens Ladisch
2010-05-26 11:38 ` Matthew Wilcox
2010-05-28 19:25 ` Jesse Barnes
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox