Received: by 10.213.65.68 with SMTP id h4csp53662imn; Fri, 30 Mar 2018 14:06:36 -0700 (PDT) X-Google-Smtp-Source: AIpwx4896d4i5T26suXBYfwqonY2+OpNEQJU8rIKXyqDh9TeL8CPCQoorEIWZAFH2U/50JnSXpb7 X-Received: by 10.101.87.136 with SMTP id b8mr353123pgr.282.1522443996652; Fri, 30 Mar 2018 14:06:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522443996; cv=none; d=google.com; s=arc-20160816; b=jjW/RG/OGmgUIJP0g/GNMV9mc6mlMqQJWvZHiSPbElsH7p/6vugunsKgw6WkwSfJKe Q4Ob2ZJBc5ooOBhWF+VYQZsxecpocSaTGWjHwpqh6yXXb09k2MqZmOEjK1EqLhve3V2K csquZPuTtk17z1l9nUNrG0iFI8o9t6lpCkKsFiC1WhH9LEgbc4G/OH6Yh3JVQx5ULmzc 9ObMzyjPn4mSwq+Oxvuku8XgmXmmovXW6AVfv3Ma0itIlpYHhC+ihPXSIZ9XGIs/Aa9A i5UohkqPpx1SaCplVX2Y2U17eY0Tn3e1RXg/nW+sCn1Db3rNTai1Cf1v2va7z+f8OGcg JnQw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:cc:to:from :subject:dmarc-filter:arc-authentication-results; bh=P885G6qfhYB9wWlNHWbXhDBiVrIpgFQun/q1I7d5//c=; b=VTgQt2i3mnhGwCg8Halve0opg+uCC8VcmTd9ovXLSKtaozPSObF6vADRL4y0L7MA2+ V8TsB2BPDXgovDm1ETWEjRLEgZYh0d+08ki0riBJxiwm19dWF3pE4MepAgfJGKFTJpiz DX6xMg9bfPNgT5nomdWnTUJ3gX7kWmF+uRDi7k8VuH6gijEh0vkFquzyInvG9WuoCzJ3 Pjki4xrRGicqSlLgvhx2pDSEAfOqlBdlUm181VkF+7YNXGA4E+teyuEJARGUbftv4CPC ONi+0UeDO+SUF1pKzdPqCcqU1fFaN5+Tmo1vRQh+5nfuwoaccbTeRH892voLcm9RFiCW H2sw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f62-v6si9238007plb.725.2018.03.30.14.06.23; Fri, 30 Mar 2018 14:06:36 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752898AbeC3VFB (ORCPT + 99 others); Fri, 30 Mar 2018 17:05:01 -0400 Received: from mail.kernel.org ([198.145.29.99]:33490 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752869AbeC3VE6 (ORCPT ); Fri, 30 Mar 2018 17:04:58 -0400 Received: from localhost (unknown [69.71.5.252]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9E64521777; Fri, 30 Mar 2018 21:04:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9E64521777 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=helgaas@kernel.org Subject: [PATCH v5 02/14] PCI: Add pcie_get_width_cap() to find max supported link width From: Bjorn Helgaas To: Tal Gilboa Cc: Tariq Toukan , Jacob Keller , Ariel Elior , Ganesh Goudar , Jeff Kirsher , everest-linux-l2@cavium.com, intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org Date: Fri, 30 Mar 2018 16:04:56 -0500 Message-ID: <152244389596.135666.10041465699313744043.stgit@bhelgaas-glaptop.roam.corp.google.com> In-Reply-To: <152244269202.135666.3064353823697623332.stgit@bhelgaas-glaptop.roam.corp.google.com> References: <152244269202.135666.3064353823697623332.stgit@bhelgaas-glaptop.roam.corp.google.com> User-Agent: StGit/0.18 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Tal Gilboa Add pcie_get_width_cap() to find the max link width supported by a device. Change max_link_width_show() to use pcie_get_width_cap(). Signed-off-by: Tal Gilboa [bhelgaas: return width directly instead of error and *width, don't export outside drivers/pci] Signed-off-by: Bjorn Helgaas Reviewed-by: Tariq Toukan --- drivers/pci/pci-sysfs.c | 10 ++-------- drivers/pci/pci.c | 18 ++++++++++++++++++ drivers/pci/pci.h | 1 + 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index c2ea05fbbf1d..63d0952684fb 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -167,15 +167,9 @@ static DEVICE_ATTR_RO(max_link_speed); static ssize_t max_link_width_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct pci_dev *pci_dev = to_pci_dev(dev); - u32 linkcap; - int err; - - err = pcie_capability_read_dword(pci_dev, PCI_EXP_LNKCAP, &linkcap); - if (err) - return -EINVAL; + struct pci_dev *pdev = to_pci_dev(dev); - return sprintf(buf, "%u\n", (linkcap & PCI_EXP_LNKCAP_MLW) >> 4); + return sprintf(buf, "%u\n", pcie_get_width_cap(pdev)); } static DEVICE_ATTR_RO(max_link_width); diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index b29d3436ee9f..43075be79388 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -5190,6 +5190,24 @@ enum pci_bus_speed pcie_get_speed_cap(struct pci_dev *dev) return PCI_SPEED_UNKNOWN; } +/** + * pcie_get_width_cap - query for the PCI device's link width capability + * @dev: PCI device to query + * + * Query the PCI device width capability. Return the maximum link width + * supported by the device. + */ +enum pcie_link_width pcie_get_width_cap(struct pci_dev *dev) +{ + u32 lnkcap; + + pcie_capability_read_dword(dev, PCI_EXP_LNKCAP, &lnkcap); + if (lnkcap) + return (lnkcap & PCI_EXP_LNKCAP_MLW) >> 4; + + return PCIE_LNK_WIDTH_UNKNOWN; +} + /** * pci_select_bars - Make BAR mask from the type of resource * @dev: the PCI device for which BAR mask is made diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 1186d8be6055..66738f1050c0 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -262,6 +262,7 @@ void pci_disable_bridge_window(struct pci_dev *dev); "Unknown speed") enum pci_bus_speed pcie_get_speed_cap(struct pci_dev *dev); +enum pcie_link_width pcie_get_width_cap(struct pci_dev *dev); /* Single Root I/O Virtualization */ struct pci_sriov {