From: Wei Yang <weiyang@linux.vnet.ibm.com> To: benh@au1.ibm.com Cc: linuxppc-dev@lists.ozlabs.org, bhelgaas@google.com, linux-pci@vger.kernel.org, gwshan@linux.vnet.ibm.com, yan@linux.vnet.ibm.com, qiudayu@linux.vnet.ibm.com, Wei Yang <weiyang@linux.vnet.ibm.com> Subject: [RFC PATCH V3 08/17] PCI: Add weak pcibios_sriov_resource_size() interface Date: Tue, 10 Jun 2014 09:56:30 +0800 [thread overview] Message-ID: <1402365399-5121-9-git-send-email-weiyang@linux.vnet.ibm.com> (raw) In-Reply-To: <1402365399-5121-1-git-send-email-weiyang@linux.vnet.ibm.com> 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 <weiyang@linux.vnet.ibm.com> --- 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; +} + +resource_size_t pci_sriov_resource_size(struct pci_dev *dev, int resno) +{ + u64 size; + 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) -- 1.7.9.5
WARNING: multiple messages have this Message-ID (diff)
From: Wei Yang <weiyang@linux.vnet.ibm.com> To: benh@au1.ibm.com Cc: Wei Yang <weiyang@linux.vnet.ibm.com>, linux-pci@vger.kernel.org, gwshan@linux.vnet.ibm.com, qiudayu@linux.vnet.ibm.com, bhelgaas@google.com, yan@linux.vnet.ibm.com, linuxppc-dev@lists.ozlabs.org Subject: [RFC PATCH V3 08/17] PCI: Add weak pcibios_sriov_resource_size() interface Date: Tue, 10 Jun 2014 09:56:30 +0800 [thread overview] Message-ID: <1402365399-5121-9-git-send-email-weiyang@linux.vnet.ibm.com> (raw) In-Reply-To: <1402365399-5121-1-git-send-email-weiyang@linux.vnet.ibm.com> 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 <weiyang@linux.vnet.ibm.com> --- 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; +} + +resource_size_t pci_sriov_resource_size(struct pci_dev *dev, int resno) +{ + u64 size; + 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) -- 1.7.9.5
next prev parent reply other threads:[~2014-06-10 1:57 UTC|newest] Thread overview: 100+ messages / expand[flat|nested] mbox.gz Atom feed top 2014-06-10 1:56 [RFC PATCH V3 00/17] Enable SRIOV on POWER8 Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 01/17] pci/iov: Export interface for retrieve VF's BDF Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 02/17] pci/of: Match PCI VFs to dev-tree nodes dynamically Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-23 5:07 ` Gavin Shan 2014-06-23 5:07 ` Gavin Shan 2014-06-23 6:29 ` Wei Yang 2014-06-23 6:29 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 03/17] ppc/pci: don't unset pci resources for VFs Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 04/17] PCI: SRIOV: add VF enable/disable hook Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-23 5:03 ` Gavin Shan 2014-06-23 5:03 ` Gavin Shan 2014-06-23 6:29 ` Wei Yang 2014-06-23 6:29 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 05/17] ppc/pnv: user macro to define the TCE size Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-23 5:12 ` Gavin Shan 2014-06-23 5:12 ` Gavin Shan 2014-06-23 6:31 ` Wei Yang 2014-06-23 6:31 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 06/17] ppc/pnv: allocate pe->iommu_table dynamically Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-24 10:06 ` Alexey Kardashevskiy 2014-06-24 10:06 ` Alexey Kardashevskiy 2014-06-25 1:12 ` Wei Yang 2014-06-25 1:12 ` Wei Yang 2014-06-25 4:12 ` Alexey Kardashevskiy 2014-06-25 4:12 ` Alexey Kardashevskiy 2014-06-25 5:27 ` Wei Yang 2014-06-25 5:27 ` Wei Yang 2014-06-25 7:50 ` Alexey Kardashevskiy 2014-06-25 7:50 ` Alexey Kardashevskiy 2014-06-25 7:56 ` Benjamin Herrenschmidt 2014-06-25 7:56 ` Benjamin Herrenschmidt 2014-06-25 9:18 ` Wei Yang 2014-06-25 9:18 ` Wei Yang 2014-06-25 9:13 ` Wei Yang 2014-06-25 9:13 ` Wei Yang 2014-06-25 9:20 ` David Laight 2014-06-25 9:20 ` David Laight 2014-06-25 9:31 ` Wei Yang 2014-06-25 9:31 ` Wei Yang 2014-06-25 10:30 ` Alexey Kardashevskiy 2014-06-25 10:30 ` Alexey Kardashevskiy 2014-07-14 3:12 ` Benjamin Herrenschmidt 2014-06-10 1:56 ` [RFC PATCH V3 07/17] ppc/pnv: Add function to deconfig a PE Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-23 5:27 ` Gavin Shan 2014-06-23 5:27 ` Gavin Shan 2014-06-23 9:07 ` Wei Yang 2014-06-23 9:07 ` Wei Yang 2014-06-10 1:56 ` Wei Yang [this message] 2014-06-10 1:56 ` [RFC PATCH V3 08/17] PCI: Add weak pcibios_sriov_resource_size() interface Wei Yang 2014-06-23 5:41 ` Gavin Shan 2014-06-23 5:41 ` Gavin Shan 2014-06-23 7:56 ` Wei Yang 2014-06-23 7:56 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 09/17] PCI: Add weak pcibios_sriov_resource_alignment() interface Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 10/17] PCI: take additional IOV BAR alignment in sizing and assigning Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 11/17] ppc/pnv: Expand VF resources according to the number of total_pe Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-23 6:07 ` Gavin Shan 2014-06-23 6:07 ` Gavin Shan 2014-06-23 6:56 ` Wei Yang 2014-06-23 6:56 ` Wei Yang 2014-06-23 7:08 ` Gavin Shan 2014-06-23 7:08 ` Gavin Shan 2014-06-10 1:56 ` [RFC PATCH V3 12/17] powerpc/powernv: implement pcibios_sriov_resource_alignment on powernv Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-23 6:09 ` Gavin Shan 2014-06-23 6:09 ` Gavin Shan 2014-06-23 8:21 ` Wei Yang 2014-06-23 8:21 ` Wei Yang 2014-06-23 23:29 ` Gavin Shan 2014-06-23 23:29 ` Gavin Shan 2014-06-24 1:24 ` Wei Yang 2014-06-24 1:24 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 13/17] powerpc/powernv: shift VF resource with an offset Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 14/17] ppc/pci: create/release dev-tree node for VFs Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-18 18:26 ` Grant Likely 2014-06-18 20:51 ` Benjamin Herrenschmidt 2014-06-18 20:51 ` Benjamin Herrenschmidt 2014-06-19 2:46 ` Wei Yang 2014-06-19 8:30 ` Grant Likely 2014-06-19 9:42 ` Wei Yang 2014-06-20 3:46 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 15/17] powerpc/powernv: allocate VF PE Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 16/17] ppc/pci: Expanding IOV BAR, with m64_per_iov supported Wei Yang 2014-06-10 1:56 ` Wei Yang 2014-06-10 1:56 ` [RFC PATCH V3 17/17] ppc/pnv: Group VF PE when IOV BAR is big on PHB3 Wei Yang 2014-06-10 1:56 ` Wei Yang
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1402365399-5121-9-git-send-email-weiyang@linux.vnet.ibm.com \ --to=weiyang@linux.vnet.ibm.com \ --cc=benh@au1.ibm.com \ --cc=bhelgaas@google.com \ --cc=gwshan@linux.vnet.ibm.com \ --cc=linux-pci@vger.kernel.org \ --cc=linuxppc-dev@lists.ozlabs.org \ --cc=qiudayu@linux.vnet.ibm.com \ --cc=yan@linux.vnet.ibm.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.