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: 90539 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o33I8Ggr020116 for ; Sat, 3 Apr 2010 18:08:17 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755848Ab0DCSIP (ORCPT ); Sat, 3 Apr 2010 14:08:15 -0400 Received: from out3.smtp.messagingengine.com ([66.111.4.27]:37013 "EHLO out3.smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755824Ab0DCSIO (ORCPT ); Sat, 3 Apr 2010 14:08:14 -0400 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 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=messagingengine.com; h=message-id:from:to:cc:mime-version:content-transfer-encoding:content-type:references:subject:in-reply-to:date; s=smtpout; bh=nwd+3PBrthWxjg1S+Uw1tS0swlw=; b=t2nLMRpXbk/NvgQcpONq1Zt282RxNOaD/iNvuSko9N6mMO0Bl+dQaOL1AlK/yuT6ReH8vBlLaq37NhKoqAXHZ/NzmW8RW3SS5noqRw8LnP1tm3glZhQ+iC231GlFdx6WFPeMKI5dgNotZQsWI0uSgr0cf9flt/u3BQWlikJv9mg= 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" Cc: "Alex Deucher" , "Linux PCI" , "Greg KH" , "Linux Kernel Mailing List" , "Jesse Barnes" , dri-devel@lists.sourceforge.net, stable@kernel.org, "Dave Airlie" 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 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Sat, 03 Apr 2010 18:08:17 +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 */