From patchwork Sat Apr 3 18:08:13 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Clemens Ladisch X-Patchwork-Id: 90601 Received: from lists.sourceforge.net (lists.sourceforge.net [216.34.181.88]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o356XcoP019629 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 5 Apr 2010 06:34:15 GMT Received: from localhost ([127.0.0.1] helo=sfs-ml-1.v29.ch3.sourceforge.com) by sfs-ml-1.v29.ch3.sourceforge.com with esmtp (Exim 4.69) (envelope-from ) id 1Nyfr9-00084M-2I; Mon, 05 Apr 2010 06:32:19 +0000 Received: from sfi-mx-3.v28.ch3.sourceforge.com ([172.29.28.123] helo=mx.sourceforge.net) by sfs-ml-3.v29.ch3.sourceforge.com with esmtp (Exim 4.69) (envelope-from ) id 1Ny7lc-0002Ub-K0 for dri-devel@lists.sourceforge.net; Sat, 03 Apr 2010 18:08:20 +0000 X-ACL-Warn: Received: from out3.smtp.messagingengine.com ([66.111.4.27]) by sfi-mx-3.v28.ch3.sourceforge.com with esmtps (TLSv1:AES256-SHA:256) (Exim 4.69) id 1Ny7lb-0005Yy-Bs for dri-devel@lists.sourceforge.net; Sat, 03 Apr 2010 18:08:20 +0000 Received: from compute1.internal (compute1.internal [10.202.2.41]) by gateway1.messagingengine.com (Postfix) with ESMTP id E733DE9EE2; Sat, 3 Apr 2010 14:08:13 -0400 (EDT) Received: from web5.messagingengine.com ([10.202.2.214]) by compute1.internal (MEProxy); Sat, 03 Apr 2010 14:08:14 -0400 Received: by web5.messagingengine.com (Postfix, from userid 99) id C1B9DD629B; Sat, 3 Apr 2010 14:08:13 -0400 (EDT) Message-Id: <1270318093.15869.1368145605@webmail.messagingengine.com> X-Sasl-Enc: eIcEux8tdeBE5XFRy8/AsbRQ6EBT+hpqFP8IZjBd3LMm 1270318093 From: "Clemens Ladisch" To: "Rafael J. Wysocki" , "Linus Torvalds" MIME-Version: 1.0 X-Mailer: MessagingEngine.com Webmail Interface References: <201004020120.50398.rjw@sisk.pl> <201004021846.06522.rjw@sisk.pl> Subject: Re: [Regression, post-rc2] Commit a5ee4eb7541 breaks OpenGL on RS780 (was: Re: Linux 2.6.34-rc3) In-Reply-To: <201004021846.06522.rjw@sisk.pl> Date: Sat, 03 Apr 2010 20:08:13 +0200 X-Spam-Score: 0.0 (/) X-Spam-Report: Spam Filtering performed by mx.sourceforge.net. See http://spamassassin.org/tag/ for more details. -0.0 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.0 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Headers-End: 1Ny7lb-0005Yy-Bs X-Mailman-Approved-At: Mon, 05 Apr 2010 06:32:17 +0000 Cc: Linux PCI , Greg KH , Linux Kernel Mailing List , Jesse Barnes , Alex Deucher , dri-devel@lists.sourceforge.net, stable@kernel.org X-BeenThere: dri-devel@lists.sourceforge.net X-Mailman-Version: 2.1.9 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.sourceforge.net X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Mon, 05 Apr 2010 06:34:15 +0000 (UTC) ========== Subject: PCI quirk: RS780/RS880: work around wrong vendor IDs of RS780 bridge On many RS780 systems, the vendor ID of the PCI/PCI bridge for the internal graphics is set to that of the mainboard vendor, so the quirk would not match and failed to notice the disabled MSI. Since we do not know in advance all possible vendor IDs, we have to declare the quirk on another device with an ID that is known to be correct, and use that as a stepping stone to find the PCI/PCI bridge, if present. Signed-off-by: Clemens Ladisch Cc: --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -2483,34 +2483,38 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AT * 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) +static void __init rs780_int_gfx_disable_msi(struct pci_dev *host_bridge) { + struct pci_dev *int_gfx_bridge; u32 nb_cntl; - if (!int_gfx_bridge->subordinate) + /* + * Many OEMs change the vendor ID of the internal graphics PCI/PCI + * bridge, so we use the possible vendor/device IDs of the host bridge + * for the declared quirk, and search for the PCI/PCI bridge by slot + * number. + */ + int_gfx_bridge = pci_get_slot(host_bridge->bus, PCI_DEVFN(1, 0)); + if (!int_gfx_bridge) return; + if (int_gfx_bridge->device != 0x9602 || !int_gfx_bridge->subordinate) + goto out; - 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); + pci_write_config_dword(host_bridge, 0x60, 0); + pci_read_config_dword(host_bridge, 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 +out: + pci_dev_put(int_gfx_bridge); +} -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); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x9600, rs780_int_gfx_disable_msi); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x9601, rs780_int_gfx_disable_msi); #endif /* CONFIG_PCI_MSI */