From patchwork Fri Jan 20 07:41:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yongji Xie X-Patchwork-Id: 9527977 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 B410960434 for ; Fri, 20 Jan 2017 11:11:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A6D92285E7 for ; Fri, 20 Jan 2017 11:11:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9B60F285FC; Fri, 20 Jan 2017 11:11:12 +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.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI 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 38D30285E7 for ; Fri, 20 Jan 2017 11:11:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751658AbdATLLL (ORCPT ); Fri, 20 Jan 2017 06:11:11 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:47719 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751299AbdATLLK (ORCPT ); Fri, 20 Jan 2017 06:11:10 -0500 Received: from pps.filterd (m0098410.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v0K7e7IW068456 for ; Fri, 20 Jan 2017 02:42:05 -0500 Received: from e36.co.us.ibm.com (e36.co.us.ibm.com [32.97.110.154]) by mx0a-001b2d01.pphosted.com with ESMTP id 283bmewscv-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 20 Jan 2017 02:42:05 -0500 Received: from localhost by e36.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 20 Jan 2017 00:42:05 -0700 Received: from d03dlp01.boulder.ibm.com (9.17.202.177) by e36.co.us.ibm.com (192.168.1.136) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 20 Jan 2017 00:42:00 -0700 Received: from b03cxnp08026.gho.boulder.ibm.com (b03cxnp08026.gho.boulder.ibm.com [9.17.130.18]) by d03dlp01.boulder.ibm.com (Postfix) with ESMTP id 6094D1FF0025; Fri, 20 Jan 2017 00:41:38 -0700 (MST) Received: from b03ledav006.gho.boulder.ibm.com (b03ledav006.gho.boulder.ibm.com [9.17.130.237]) by b03cxnp08026.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v0K7fxrS10223898; Fri, 20 Jan 2017 00:41:59 -0700 Received: from b03ledav006.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C4A2FC6037; Fri, 20 Jan 2017 00:41:59 -0700 (MST) Received: from localhost (unknown [9.123.229.160]) by b03ledav006.gho.boulder.ibm.com (Postfix) with ESMTP id 4CE3AC6042; Fri, 20 Jan 2017 00:41:59 -0700 (MST) From: Yongji Xie To: bhelgaas@google.com Cc: linux-pci@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, alex.williamson@redhat.com, gwshan@linux.vnet.ibm.com, aik@ozlabs.ru, benh@kernel.crashing.org, mpe@ellerman.id.au, paulus@samba.org, zhong@linux.vnet.ibm.com Subject: [PATCH v8 2/3] PCI: Make sure the driver could get correct BAR size from pci_resource_len() Date: Fri, 20 Jan 2017 15:41:52 +0800 X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1484898113-24939-1-git-send-email-xyjxie@linux.vnet.ibm.com> References: <1484898113-24939-1-git-send-email-xyjxie@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 17012007-0020-0000-0000-00000B21EB2D X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00006465; HX=3.00000240; KW=3.00000007; PH=3.00000004; SC=3.00000200; SDB=6.00810172; UDB=6.00394765; IPR=6.00587525; BA=6.00005076; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00013984; XFM=3.00000011; UTC=2017-01-20 07:42:02 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17012007-0021-0000-0000-0000595FA736 Message-Id: <1484898113-24939-3-git-send-email-xyjxie@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-01-20_05:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1612050000 definitions=main-1701200112 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 When using resource_alignment kernel parameter, the current implement reassigns the alignment by expanding resources' size. So there exists two kinds of *size* for one PCI BAR. One is the hardware size, the other is the allocated size. Currently pci_resource_len() used by drivers return the allocated size rather than the hardware size. This may potentially break some drivers when they use the size to locate some registers whose length is related to the hardware size. Some examples as below: - misc\Hpilo.c: off = pci_resource_len(pdev, bar) - 0x2000; - net\ethernet\chelsio\cxgb4\cxgb4_uld.h: (pci_resource_len((pdev), 2) - roundup_pow_of_two((vres)->ocq.size)) - infiniband\hw\nes\Nes_hw.c: num_pds = pci_resource_len(nesdev->pcidev, BAR_1) >> PAGE_SHIFT; This modifies pci_resource_len() to be aware of the increased size. So it could return the hardware size instead. And if we need the allocated size, resource_size()(or we can introuce a new helper function) can be used to get it. Signed-off-by: Yongji Xie --- drivers/pci/pci.c | 1 + include/linux/pci.h | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 220c31e..04f2100 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -5096,6 +5096,7 @@ void pci_reassigndev_resource_alignment(struct pci_dev *dev) size = resource_size(r); if (size < align) { + dev->res_addsize[i] = align - size; size = align; dev_info(&dev->dev, "Rounding up size of resource #%d to %#llx.\n", diff --git a/include/linux/pci.h b/include/linux/pci.h index e2d1a12..e4099fb 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -334,6 +334,7 @@ struct pci_dev { */ unsigned int irq; struct resource resource[DEVICE_COUNT_RESOURCE]; /* I/O and memory regions + expansion ROMs */ + resource_size_t res_addsize[PCI_ROM_RESOURCE + 1]; bool match_driver; /* Skip attaching driver */ /* These fields are used by common fixups */ @@ -1644,7 +1645,10 @@ static inline struct pci_dev *pci_get_bus_and_slot(unsigned int bus, /* these helpers provide future and backwards compatibility * for accessing popular PCI BAR info */ #define pci_resource_start(dev, bar) ((dev)->resource[(bar)].start) -#define pci_resource_end(dev, bar) ((dev)->resource[(bar)].end) +#define pci_resource_end(dev, bar) (((bar) > PCI_ROM_RESOURCE) ? \ + (dev)->resource[(bar)].end : \ + ((dev)->resource[(bar)].end - \ + (dev)->res_addsize[(bar)])) #define pci_resource_flags(dev, bar) ((dev)->resource[(bar)].flags) #define pci_resource_len(dev,bar) \ ((pci_resource_start((dev), (bar)) == 0 && \