From patchwork Wed Jul 12 04:43:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Axtens X-Patchwork-Id: 9835879 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B592A60363 for ; Wed, 12 Jul 2017 04:43:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A9C262845C for ; Wed, 12 Jul 2017 04:43:44 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9D3D9285A1; Wed, 12 Jul 2017 04:43:44 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0A66B2845C for ; Wed, 12 Jul 2017 04:43:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933039AbdGLEnn (ORCPT ); Wed, 12 Jul 2017 00:43:43 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:35104 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933021AbdGLEnm (ORCPT ); Wed, 12 Jul 2017 00:43:42 -0400 Received: by mail-pf0-f194.google.com with SMTP id q85so1639386pfq.2 for ; Tue, 11 Jul 2017 21:43:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axtens.net; s=google; h=from:to:cc:subject:date:message-id; bh=O56RFn//5MCfqiD1jTQXm8Enqdkb3cuJfx65qWgsolg=; b=LHYlIxdHBCtdFUR95w61knQO29AtYuKikRzH0uJXPxivP3j/1TeCXQliuykGMrGVoW sWTq30CsAhPnY8r1rLtT1cu9V5Y0fgRK/jWOhRU9qmM1VrnH5AIs+uB4bMFR6e+KsAt/ V9OmGH/vWb46Syj9gUGxCoOF/zCbBEqwAvfjc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=O56RFn//5MCfqiD1jTQXm8Enqdkb3cuJfx65qWgsolg=; b=pY64eTbORN3+6JLcNfvwwY51V/ZiFtyDCBSkF2GYX3yQjzot+XhqcJia61QkRLgACs ohPZ6iZ8bXvu2ddlYCAcAv1eIuRy0jL/JOh/v2stioCUC2Xoxt1dwUy8wLdslRTutiBn 6ev7dOiFwMNMXFB1+tMG6LcIORbg1rvEhFgQNf4cwOxOoi7Z4yLYse+CCMKsDVJMlwzd nYjmP2mux2RkM97TMFAlFbJOoDR9bKg51b7cgXYxijr0Cn8sQecKRV2zWrRwbRBlyQGH AI8syh10y2UMrlELrI8QkrpAufaz80RjfAfULdG8WfPgGahytsjqagD+1zfx35wIPwbQ 1gbQ== X-Gm-Message-State: AIVw1126KnC+smtTpcvUsPiVfzuN8Q5aZDTgkc3+GbkOXl9jfuaP6fkX /sWgDpvXCpa8DtqZapynDw== X-Received: by 10.101.90.3 with SMTP id y3mr1923296pgs.185.1499834621316; Tue, 11 Jul 2017 21:43:41 -0700 (PDT) Received: from localhost.localdomain (203-59-51-51.dyn.iinet.net.au. [203.59.51.51]) by smtp.gmail.com with ESMTPSA id c19sm1761421pfj.15.2017.07.11.21.43.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Jul 2017 21:43:40 -0700 (PDT) From: Daniel Axtens To: linux-pci@vger.kernel.org Cc: Daniel Axtens , Xinliang Liu , Rongrong Zou Subject: [PATCH v3] PCI: Support hibmc VGA cards behind a misbehaving HiSilicon bridge Date: Wed, 12 Jul 2017 14:43:22 +1000 Message-Id: <20170712044322.1530-1-dja@axtens.net> X-Mailer: git-send-email 2.11.0 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The HiSilicon D05 board has some PCI bridges (PCI ID 19e5:1610) that are not spec-compliant: the VGA Enable bit is hardwired to 0 and writes do not change it. The HiSilicon engineers report that the bridge does not forward the 0xa0000-0xbffff mem range and the 0x3b0-0x3bb and 0x3c0-0x3df I/O ranges. Because the VGA Enable bit is hardwired to 0, the VGA arbiter refuses to mark any card behind it as the boot device. This breaks Xorg auto-detection. However, the hibmc VGA card (PCI ID 19e5:1711) has been tested and is known to work when behind these bridges. (It does not require the legacy resources to operate.) Provide a quirk so that this combination of bridge and card is eligible to be the default VGA card. This fixes Xorg auto-detection on the D05. Cc: Xinliang Liu Cc: Rongrong Zou Signed-off-by: Daniel Axtens --- v3: update commit message and comment with information from HW engineers --- drivers/pci/quirks.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 16e6cd86ad71..86d7c848f3e2 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -25,6 +25,7 @@ #include #include #include +#include #include /* isa_dma_bridge_buggy */ #include "pci.h" @@ -4664,3 +4665,48 @@ static void quirk_intel_no_flr(struct pci_dev *dev) } DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x1502, quirk_intel_no_flr); DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x1503, quirk_intel_no_flr); + +/* + * The hibmc card on a HiSilicon D05 board sits behind a non-compliant + * bridge. The bridge has the PCI_BRIDGE_CTL_VGA config bit fixed at 0 + * in hardware. This prevents the vgaarb from marking a card behind it + * as boot VGA device. + * + * However, the hibmc card is known to still work, so if we have that + * card behind that particular bridge (19e5:1610), mark it as the + * default device if none has been detected. + */ +static void hibmc_fixup_vgaarb(struct pci_dev *pdev) +{ + struct pci_dev *bridge; + struct pci_bus *bus; + u16 config; + + bus = pdev->bus; + bridge = bus->self; + if (!bridge) + return; + + if (!pci_is_bridge(bridge)) + return; + + if (bridge->vendor != PCI_VENDOR_ID_HUAWEI || + bridge->device != 0x1610) + return; + + pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, + &config); + if (config & PCI_BRIDGE_CTL_VGA) { + /* + * Weirdly, this bridge *is* spec compliant, so bail + * and let vgaarb do its job + */ + return; + } + + if (vga_default_device()) + return; + + vga_set_default_device(pdev); +} +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_HUAWEI, 0x1711, hibmc_fixup_vgaarb);