From patchwork Wed Apr 25 23:36:32 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bjorn Helgaas X-Patchwork-Id: 155137 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id EDC5EB6FEF for ; Thu, 26 Apr 2012 09:36:36 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932553Ab2DYXgf (ORCPT ); Wed, 25 Apr 2012 19:36:35 -0400 Received: from mail-yw0-f74.google.com ([209.85.213.74]:43283 "EHLO mail-yw0-f74.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932415Ab2DYXge (ORCPT ); Wed, 25 Apr 2012 19:36:34 -0400 Received: by yhgm50 with SMTP id m50so89427yhg.1 for ; Wed, 25 Apr 2012 16:36:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=subject:to:from:cc:date:message-id:user-agent:mime-version :content-type:content-transfer-encoding; bh=cK9QJtyZ4AmzDtB0X2Zq0OEuHio6HBxDc1F7Bbduob4=; b=ehDBpNQOsn5MXBuTc8y/DUIsU4K10fPf47Bs2Nmulmr6qIw7QwzK6xi0fQsyAPYVbN y8OKRwXuFrb+bA0crxYWtSZvpIc46rpGqPH35UN4DDs3h0iW5vyw0NfJh8BFGShwMV6s LmE17KdjfAZFc9RDB/fIDm9vXWYnizyuA8sUYYsR7ekZZR2UeF6Wc0KI96DCl1XdSY1o tS0ERjvBPbFJfWExGvVAZOJhjY0tZ0TMmzJ/cqWnKzU5wxSLbqV2aGDDPV+nrx8yMgf3 xAdUrkVU7avu0Y0LOaFIJxoaW43ArRRStQiMx//y66rHp8pFtDLaKJxU0tJZ8UK4cY4P RVeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=subject:to:from:cc:date:message-id:user-agent:mime-version :content-type:content-transfer-encoding:x-gm-message-state; bh=cK9QJtyZ4AmzDtB0X2Zq0OEuHio6HBxDc1F7Bbduob4=; b=EFgPjCIKn3/WC2xBpKa7Xvq+5yq8E2MK+dSr5pal/XV4taGRmly5GfYzavZieEAY1y KRD2q/EB+ompUWoDWskNapW9GPV8dviMDdjXvp1iRiySdIq2GzqAn5JY0AMjf3G2vHpw RxnM8dxSFgX0RErFReA2VdDiizMVelkWdB1WiQkee/FxUl0p7sJRlQiSVmZhBqLbsH3r BT3NOOPNWDvp657chuVA/SfLoWUq+XLcs9aejKPzHCUtt5RIHlPoaywcI0s8K6MXOh1F xeMmxvz2dBnjU+ThoX640MREIA2Cigy2aK86MrQnxFVVGYtppx7wDZgGK/gf/BcWd51b Q+Jw== Received: by 10.236.180.33 with SMTP id i21mr5747001yhm.1.1335396993531; Wed, 25 Apr 2012 16:36:33 -0700 (PDT) Received: by 10.236.180.33 with SMTP id i21mr5746974yhm.1.1335396993450; Wed, 25 Apr 2012 16:36:33 -0700 (PDT) Received: from wpzn4.hot.corp.google.com (216-239-44-65.google.com [216.239.44.65]) by gmr-mx.google.com with ESMTPS id d47si1175729yhl.6.2012.04.25.16.36.33 (version=TLSv1/SSLv3 cipher=AES128-SHA); Wed, 25 Apr 2012 16:36:33 -0700 (PDT) Received: from bhelgaas.mtv.corp.google.com (bhelgaas.mtv.corp.google.com [172.18.96.155]) by wpzn4.hot.corp.google.com (Postfix) with ESMTP id 48FA81E0250; Wed, 25 Apr 2012 16:36:33 -0700 (PDT) Received: from bhelgaas.mtv.corp.google.com (unknown [IPv6:::1]) by bhelgaas.mtv.corp.google.com (Postfix) with ESMTP id EFD9D180182; Wed, 25 Apr 2012 16:36:32 -0700 (PDT) Subject: [PATCH v1] PCI: work around Stratus ftServer broken PCIe hierarchy To: linux-pci@vger.kernel.org From: Bjorn Helgaas Cc: Prarit Bhargava , Jesse Barnes , Matthew Wilcox , Don Dutile , Myron Stowe , James Paradis Date: Wed, 25 Apr 2012 17:36:32 -0600 Message-ID: <20120425233632.12292.32916.stgit@bhelgaas.mtv.corp.google.com> User-Agent: StGit/0.15 MIME-Version: 1.0 X-Gm-Message-State: ALoCoQm5w9weGkOUwJFPNDraPuGoJ/kSMa8g98MLnMTXAbqjmwoJwFjfHTSdYXQXRmg73qP/512xrXf54OwaCCRHNkBW3IF5JIjzhWIPEO/CpgcvT5/Mx9Ji5qwesLAlNQNuSDopS3mOFKKq4mCPrlOxvbTs36WFfxuAsKascYT/cileybFuyY0= Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org A PCIe downstream port is a P2P bridge. Its secondary interface is a link that should lead only to device 0 (unless ARI is enabled)[1], so we don't probe for non-zero device numbers. Some Stratus ftServer systems have a PCIe downstream port (02:00.0) that leads to both an upstream port (03:00.0) and a downstream port (03:01.0), and 03:01.0 has important devices below it: [0000:02]-+-00.0-[0000:03]--+-00.0 \-01.0-[0000:xx]--+-[USB] \-[NIC] Previously, we didn't enumerate device 03:01.0, so USB and the network didn't work. This patch adds a DMI quirk to scan all device numbers, not just 0, below a downstream port. Based on a patch by Prarit Bhargava. [1] PCIe spec r3.0, sec 7.3.1 CC: Myron Stowe CC: Don Dutile CC: James Paradis CC: Matthew Wilcox CC: Jesse Barnes CC: Prarit Bhargava Signed-off-by: Bjorn Helgaas --- Documentation/kernel-parameters.txt | 3 +++ arch/x86/pci/common.c | 16 ++++++++++++++++ drivers/pci/pci.c | 3 +++ drivers/pci/probe.c | 8 ++++++-- include/asm-generic/pci-bridge.h | 6 ++++++ 5 files changed, 34 insertions(+), 2 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index c1601e5..57c3870 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -2161,6 +2161,9 @@ bytes respectively. Such letter suffixes can also be entirely omitted. on: Turn realloc on realloc same as realloc=on noari do not use PCIe ARI. + pcie_scan_all Scan all possible PCIE devices. Otherwise we + only look for one device below a PCIE downstream + port. pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power Management. diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 323481e..16c5d78 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -229,6 +230,14 @@ static int __devinit assign_all_busses(const struct dmi_system_id *d) } #endif +static int __devinit set_scan_all(const struct dmi_system_id *d) +{ + printk(KERN_INFO "PCI: %s detected, enabling pci=pcie_scan_all\n", + d->ident); + pci_add_flags(PCI_SCAN_ALL_PCIE_DEVS); + return 0; +} + static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = { #ifdef __i386__ /* @@ -420,6 +429,13 @@ static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL585 G2"), }, }, + { + .callback = set_scan_all, + .ident = "Stratus/NEC ftServer", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ftServer"), + }, + }, {} }; diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 9e31c0a..8f16900 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "pci.h" @@ -3900,6 +3901,8 @@ static int __init pci_setup(char *str) pcie_bus_config = PCIE_BUS_PERFORMANCE; } else if (!strncmp(str, "pcie_bus_peer2peer", 18)) { pcie_bus_config = PCIE_BUS_PEER2PEER; + } else if (!strncmp(str, "pcie_scan_all", 13)) { + pci_add_flags(PCI_SCAN_ALL_PCIE_DEVS); } else { printk(KERN_ERR "PCI: Unknown option `%s'\n", str); diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 5e1ca3c..2dc8675 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -10,6 +10,7 @@ #include #include #include +#include #include "pci.h" #define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */ @@ -1395,10 +1396,13 @@ static unsigned no_next_fn(struct pci_dev *dev, unsigned fn) static int only_one_child(struct pci_bus *bus) { struct pci_dev *parent = bus->self; + if (!parent || !pci_is_pcie(parent)) return 0; - if (parent->pcie_type == PCI_EXP_TYPE_ROOT_PORT || - parent->pcie_type == PCI_EXP_TYPE_DOWNSTREAM) + if (parent->pcie_type == PCI_EXP_TYPE_ROOT_PORT) + return 1; + if (parent->pcie_type == PCI_EXP_TYPE_DOWNSTREAM && + !pci_has_flag(PCI_SCAN_ALL_PCIE_DEVS)) return 1; return 0; } diff --git a/include/asm-generic/pci-bridge.h b/include/asm-generic/pci-bridge.h index a5b5d5a..20db2e5 100644 --- a/include/asm-generic/pci-bridge.h +++ b/include/asm-generic/pci-bridge.h @@ -30,6 +30,12 @@ enum { PCI_ENABLE_PROC_DOMAINS = 0x00000010, /* ... except for domain 0 */ PCI_COMPAT_DOMAIN_0 = 0x00000020, + + /* PCIe downstream ports are bridges that normally lead to only a + * device 0, but if this is set, we scan all possible devices, not + * just device 0. + */ + PCI_SCAN_ALL_PCIE_DEVS = 0x00000040, }; #ifdef CONFIG_PCI