From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from e28smtp02.in.ibm.com ([122.248.162.2]:58098 "EHLO e28smtp02.in.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751221AbaFWH5F (ORCPT ); Mon, 23 Jun 2014 03:57:05 -0400 Received: from /spool/local by e28smtp02.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 23 Jun 2014 13:27:00 +0530 Received: from d28relay04.in.ibm.com (d28relay04.in.ibm.com [9.184.220.61]) by d28dlp03.in.ibm.com (Postfix) with ESMTP id A1B0A125805A for ; Mon, 23 Jun 2014 13:26:27 +0530 (IST) Received: from d28av04.in.ibm.com (d28av04.in.ibm.com [9.184.220.66]) by d28relay04.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id s5N7v4Fb59179198 for ; Mon, 23 Jun 2014 13:27:04 +0530 Received: from d28av04.in.ibm.com (localhost [127.0.0.1]) by d28av04.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s5N7umsB000694 for ; Mon, 23 Jun 2014 13:26:49 +0530 Date: Mon, 23 Jun 2014 15:56:45 +0800 From: Wei Yang To: Gavin Shan Cc: Wei Yang , benh@au1.ibm.com, linuxppc-dev@lists.ozlabs.org, bhelgaas@google.com, linux-pci@vger.kernel.org, yan@linux.vnet.ibm.com, qiudayu@linux.vnet.ibm.com Subject: Re: [RFC PATCH V3 08/17] PCI: Add weak pcibios_sriov_resource_size() interface Message-ID: <20140623075645.GA4509@richard> Reply-To: Wei Yang References: <1402365399-5121-1-git-send-email-weiyang@linux.vnet.ibm.com> <1402365399-5121-9-git-send-email-weiyang@linux.vnet.ibm.com> <20140623054128.GA9831@shangw> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: <20140623054128.GA9831@shangw> Sender: linux-pci-owner@vger.kernel.org List-ID: On Mon, Jun 23, 2014 at 03:41:28PM +1000, Gavin Shan wrote: >On Tue, Jun 10, 2014 at 09:56:30AM +0800, Wei Yang wrote: >>When retrieving sriov resource size in pci_sriov_resource_size(), it will >>divide the total IOV resource size with the totalVF number. This is true for >>most cases, while may not be correct on some specific platform. >> >>For example on powernv platform, in order to fix the IOV BAR into a hardware >>alignment, the IOV resource size would be expended. This means the original >>method couldn't work. >> >>This patch introduces a weak pcibios_sriov_resource_size() interface, which >>gives platform a chance to implement specific method to calculate the sriov >>resource size. >> >>Signed-off-by: Wei Yang >>--- >> drivers/pci/iov.c | 27 +++++++++++++++++++++++++-- >> include/linux/pci.h | 3 +++ >> 2 files changed, 28 insertions(+), 2 deletions(-) >> >>diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c >>index cc87773..9fd4648 100644 >>--- a/drivers/pci/iov.c >>+++ b/drivers/pci/iov.c >>@@ -45,6 +45,30 @@ static void virtfn_remove_bus(struct pci_bus *physbus, struct pci_bus *virtbus) >> pci_remove_bus(virtbus); >> } >> >>+resource_size_t __weak pcibios_sriov_resource_size(struct pci_dev *dev, int resno) >>+{ >>+ return 0; >>+} >>+ > >Please define the prototype of weak function in header files (e.g. >linux/include/pci.h) :-) Missed, will add it. > >If you missed doing same thing for the weak functions added in the >previous patches, you need fix it as well. Yep. > >>+resource_size_t pci_sriov_resource_size(struct pci_dev *dev, int resno) >>+{ >>+ u64 size; > >I guess it'd better to be "resource_size_t". > >>+ struct pci_sriov *iov; >>+ >>+ if (!dev->is_physfn) >>+ return 0; >>+ >>+ size = pcibios_sriov_resource_size(dev, resno); >>+ if (size != 0) >>+ return size; >>+ >>+ iov = dev->sriov; >>+ size = resource_size(dev->resource + resno); >>+ do_div(size, iov->total_VFs); >>+ >>+ return size; >>+} >>+ >> static int virtfn_add(struct pci_dev *dev, int id, int reset) >> { >> int i; >>@@ -81,8 +105,7 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset) >> continue; >> virtfn->resource[i].name = pci_name(virtfn); >> virtfn->resource[i].flags = res->flags; >>- size = resource_size(res); >>- do_div(size, iov->total_VFs); >>+ size = pci_sriov_resource_size(dev, i + PCI_IOV_RESOURCES); >> virtfn->resource[i].start = res->start + size * id; >> virtfn->resource[i].end = virtfn->resource[i].start + size - 1; >> rc = request_resource(res, &virtfn->resource[i]); >>diff --git a/include/linux/pci.h b/include/linux/pci.h >>index ddb1ca0..315c150 100644 >>--- a/include/linux/pci.h >>+++ b/include/linux/pci.h >>@@ -1637,6 +1637,7 @@ int pci_num_vf(struct pci_dev *dev); >> int pci_vfs_assigned(struct pci_dev *dev); >> int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs); >> int pci_sriov_get_totalvfs(struct pci_dev *dev); >>+resource_size_t pci_sriov_resource_size(struct pci_dev *dev, int resno); >> #else >> static inline int pci_iov_virtfn_bus(struct pci_dev *dev, int id) >> { >>@@ -1658,6 +1659,8 @@ static inline int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs) >> { return 0; } >> static inline int pci_sriov_get_totalvfs(struct pci_dev *dev) >> { return 0; } >>+static inline resource_size_t pci_sriov_resource_size(struct pci_dev *dev, int resno) >>+{ return -1; } >> #endif >> >> #if defined(CONFIG_HOTPLUG_PCI) || defined(CONFIG_HOTPLUG_PCI_MODULE) > >Thanks, >Gavin -- Richard Yang Help you, Help me From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from e28smtp09.in.ibm.com (e28smtp09.in.ibm.com [122.248.162.9]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id BB8A21A0149 for ; Mon, 23 Jun 2014 17:57:00 +1000 (EST) Received: from /spool/local by e28smtp09.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 23 Jun 2014 13:26:56 +0530 Received: from d28relay04.in.ibm.com (d28relay04.in.ibm.com [9.184.220.61]) by d28dlp02.in.ibm.com (Postfix) with ESMTP id 37EDA394005B for ; Mon, 23 Jun 2014 13:26:53 +0530 (IST) Received: from d28av04.in.ibm.com (d28av04.in.ibm.com [9.184.220.66]) by d28relay04.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id s5N7v4pF54132748 for ; Mon, 23 Jun 2014 13:27:04 +0530 Received: from d28av04.in.ibm.com (localhost [127.0.0.1]) by d28av04.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s5N7ums9000694 for ; Mon, 23 Jun 2014 13:26:49 +0530 Date: Mon, 23 Jun 2014 15:56:45 +0800 From: Wei Yang To: Gavin Shan Subject: Re: [RFC PATCH V3 08/17] PCI: Add weak pcibios_sriov_resource_size() interface Message-ID: <20140623075645.GA4509@richard> References: <1402365399-5121-1-git-send-email-weiyang@linux.vnet.ibm.com> <1402365399-5121-9-git-send-email-weiyang@linux.vnet.ibm.com> <20140623054128.GA9831@shangw> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: <20140623054128.GA9831@shangw> Cc: Wei Yang , benh@au1.ibm.com, linux-pci@vger.kernel.org, yan@linux.vnet.ibm.com, bhelgaas@google.com, qiudayu@linux.vnet.ibm.com, linuxppc-dev@lists.ozlabs.org Reply-To: Wei Yang List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , On Mon, Jun 23, 2014 at 03:41:28PM +1000, Gavin Shan wrote: >On Tue, Jun 10, 2014 at 09:56:30AM +0800, Wei Yang wrote: >>When retrieving sriov resource size in pci_sriov_resource_size(), it will >>divide the total IOV resource size with the totalVF number. This is true for >>most cases, while may not be correct on some specific platform. >> >>For example on powernv platform, in order to fix the IOV BAR into a hardware >>alignment, the IOV resource size would be expended. This means the original >>method couldn't work. >> >>This patch introduces a weak pcibios_sriov_resource_size() interface, which >>gives platform a chance to implement specific method to calculate the sriov >>resource size. >> >>Signed-off-by: Wei Yang >>--- >> drivers/pci/iov.c | 27 +++++++++++++++++++++++++-- >> include/linux/pci.h | 3 +++ >> 2 files changed, 28 insertions(+), 2 deletions(-) >> >>diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c >>index cc87773..9fd4648 100644 >>--- a/drivers/pci/iov.c >>+++ b/drivers/pci/iov.c >>@@ -45,6 +45,30 @@ static void virtfn_remove_bus(struct pci_bus *physbus, struct pci_bus *virtbus) >> pci_remove_bus(virtbus); >> } >> >>+resource_size_t __weak pcibios_sriov_resource_size(struct pci_dev *dev, int resno) >>+{ >>+ return 0; >>+} >>+ > >Please define the prototype of weak function in header files (e.g. >linux/include/pci.h) :-) Missed, will add it. > >If you missed doing same thing for the weak functions added in the >previous patches, you need fix it as well. Yep. > >>+resource_size_t pci_sriov_resource_size(struct pci_dev *dev, int resno) >>+{ >>+ u64 size; > >I guess it'd better to be "resource_size_t". > >>+ struct pci_sriov *iov; >>+ >>+ if (!dev->is_physfn) >>+ return 0; >>+ >>+ size = pcibios_sriov_resource_size(dev, resno); >>+ if (size != 0) >>+ return size; >>+ >>+ iov = dev->sriov; >>+ size = resource_size(dev->resource + resno); >>+ do_div(size, iov->total_VFs); >>+ >>+ return size; >>+} >>+ >> static int virtfn_add(struct pci_dev *dev, int id, int reset) >> { >> int i; >>@@ -81,8 +105,7 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset) >> continue; >> virtfn->resource[i].name = pci_name(virtfn); >> virtfn->resource[i].flags = res->flags; >>- size = resource_size(res); >>- do_div(size, iov->total_VFs); >>+ size = pci_sriov_resource_size(dev, i + PCI_IOV_RESOURCES); >> virtfn->resource[i].start = res->start + size * id; >> virtfn->resource[i].end = virtfn->resource[i].start + size - 1; >> rc = request_resource(res, &virtfn->resource[i]); >>diff --git a/include/linux/pci.h b/include/linux/pci.h >>index ddb1ca0..315c150 100644 >>--- a/include/linux/pci.h >>+++ b/include/linux/pci.h >>@@ -1637,6 +1637,7 @@ int pci_num_vf(struct pci_dev *dev); >> int pci_vfs_assigned(struct pci_dev *dev); >> int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs); >> int pci_sriov_get_totalvfs(struct pci_dev *dev); >>+resource_size_t pci_sriov_resource_size(struct pci_dev *dev, int resno); >> #else >> static inline int pci_iov_virtfn_bus(struct pci_dev *dev, int id) >> { >>@@ -1658,6 +1659,8 @@ static inline int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs) >> { return 0; } >> static inline int pci_sriov_get_totalvfs(struct pci_dev *dev) >> { return 0; } >>+static inline resource_size_t pci_sriov_resource_size(struct pci_dev *dev, int resno) >>+{ return -1; } >> #endif >> >> #if defined(CONFIG_HOTPLUG_PCI) || defined(CONFIG_HOTPLUG_PCI_MODULE) > >Thanks, >Gavin -- Richard Yang Help you, Help me