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 14/17] ppc/pci: create/release dev-tree node for VFs Date: Tue, 10 Jun 2014 09:56:36 +0800 [thread overview] Message-ID: <1402365399-5121-15-git-send-email-weiyang@linux.vnet.ibm.com> (raw) In-Reply-To: <1402365399-5121-1-git-send-email-weiyang@linux.vnet.ibm.com> Currently, powernv platform is not aware of VFs. This means no dev-node represents a VF. Also, VF PCI device is created when PF driver want to enable it. This leads to the pdn->pdev and pdn->pe_number an invalid value. This patch create/release dev-node for VF and fixs this when a VF's pci_dev is created. Signed-off-by: Wei Yang <weiyang@linux.vnet.ibm.com> --- arch/powerpc/platforms/powernv/Kconfig | 1 + arch/powerpc/platforms/powernv/pci-ioda.c | 103 +++++++++++++++++++++++++++++ arch/powerpc/platforms/powernv/pci.c | 20 ++++++ 3 files changed, 124 insertions(+) diff --git a/arch/powerpc/platforms/powernv/Kconfig b/arch/powerpc/platforms/powernv/Kconfig index 895e8a2..0dd331b 100644 --- a/arch/powerpc/platforms/powernv/Kconfig +++ b/arch/powerpc/platforms/powernv/Kconfig @@ -11,6 +11,7 @@ config PPC_POWERNV select PPC_UDBG_16550 select PPC_SCOM select ARCH_RANDOM + select OF_DYNAMIC default y config PPC_POWERNV_RTAS diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index e46c5bf..9ace027 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -23,6 +23,7 @@ #include <linux/io.h> #include <linux/msi.h> #include <linux/memblock.h> +#include <linux/of_pci.h> #include <asm/sections.h> #include <asm/io.h> @@ -771,6 +772,108 @@ static void pnv_pci_ioda_setup_PEs(void) } } +#ifdef CONFIG_PCI_IOV +static void pnv_pci_create_vf_node(struct pci_dev *dev, u16 vf_num) +{ + struct device_node *dn, *p_dn; + struct pci_dn *pdn; + struct pci_controller *hose; + struct property *pp; + void* value; + u16 id; + + hose = pci_bus_to_host(dev->bus); + + /* Create dev-tree node for VFs if this is a PF */ + p_dn = pci_bus_to_OF_node(dev->bus); + if (p_dn == NULL) { + dev_err(&dev->dev, "SRIOV: VF bus NULL device node\n"); + return; + } + + for (id = 0; id < vf_num; id++) { + dn = kzalloc(sizeof(*dn), GFP_KERNEL); + pdn = kzalloc(sizeof(*pdn), GFP_KERNEL); + pp = kzalloc(sizeof(*pp), GFP_KERNEL); + value = kzalloc(sizeof(u32), GFP_KERNEL); + + if (!dn || !pdn || !pp || !value) { + kfree(dn); + kfree(pdn); + kfree(pp); + kfree(value); + dev_warn(&dev->dev, "%s: failed to create" + "dev-tree node for idx(%d)\n", + __func__, id); + + break; + } + + pp->value = value; + pdn->node = dn; + pdn->devfn = pci_iov_virtfn_devfn(dev, id); + pdn->busno = dev->bus->number; + pdn->pe_number = IODA_INVALID_PE; + pdn->phb = hose; + + dn->data = pdn; + kref_init(&dn->kref); + dn->full_name = dn->name = + kasprintf(GFP_KERNEL, "%s/vf%d", + p_dn->full_name, pdn->devfn); + dn->parent = p_dn; + + pp->name = kasprintf(GFP_KERNEL, "reg"); + pp->length = 5 * sizeof(__be32); + *(u32*)pp->value = cpu_to_be32(pdn->devfn) << 8; + dn->properties = pp; + + of_attach_node(dn); + } +} + +static void pnv_pci_release_vf_node(struct pci_dev *dev, u16 vf_num) +{ + struct device_node *dn; + struct property *pp; + u16 id; + + for (id = 0; id < vf_num; id++) { + dn = of_pci_find_child_device(dev->bus->dev.of_node, + pci_iov_virtfn_devfn(dev, id)); + if (!dn) + continue; + + of_detach_node(dn); + pp = dn->properties; + kfree(pp->name); + kfree(pp->value); + kfree(pp); + kfree(dn->data); + kfree(dn); + } +} + +int pcibios_sriov_disable(struct pci_dev *pdev) +{ + struct pci_sriov *iov; + u16 vf_num; + + iov = pdev->sriov; + vf_num = iov->num_VFs; + pnv_pci_release_vf_node(pdev, vf_num); + + return 0; +} + +int pcibios_sriov_enable(struct pci_dev *pdev, u16 vf_num) +{ + pnv_pci_create_vf_node(pdev, vf_num); + + return 0; +} +#endif /* CONFIG_PCI_IOV */ + static void pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, struct pci_dev *pdev) { struct pci_dn *pdn = pci_get_pdn(pdev); diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index 687a068..43fcc73 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c @@ -654,6 +654,26 @@ static void pnv_pci_dma_dev_setup(struct pci_dev *pdev) { struct pci_controller *hose = pci_bus_to_host(pdev->bus); struct pnv_phb *phb = hose->private_data; +#ifdef CONFIG_PCI_IOV + struct pnv_ioda_pe *pe; + struct pci_dn *pdn; + + /* Fix the VF pdn PE number */ + if (pdev->is_virtfn) { + pdn = pci_get_pdn(pdev); + if (pdn->pcidev == NULL || pdn->pe_number == IODA_INVALID_PE) { + list_for_each_entry(pe, &phb->ioda.pe_list, list) { + if (pe->rid == + ((pdev->bus->number << 8) | (pdev->devfn & 0xff))) { + pdn->pcidev = pdev; + pdn->pe_number = pe->pe_number; + pe->pdev = pdev; + break; + } + } + } + } +#endif /* CONFIG_PCI_IOV */ /* If we have no phb structure, try to setup a fallback based on * the device-tree (RTAS PCI for example) -- 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 14/17] ppc/pci: create/release dev-tree node for VFs Date: Tue, 10 Jun 2014 09:56:36 +0800 [thread overview] Message-ID: <1402365399-5121-15-git-send-email-weiyang@linux.vnet.ibm.com> (raw) In-Reply-To: <1402365399-5121-1-git-send-email-weiyang@linux.vnet.ibm.com> Currently, powernv platform is not aware of VFs. This means no dev-node represents a VF. Also, VF PCI device is created when PF driver want to enable it. This leads to the pdn->pdev and pdn->pe_number an invalid value. This patch create/release dev-node for VF and fixs this when a VF's pci_dev is created. Signed-off-by: Wei Yang <weiyang@linux.vnet.ibm.com> --- arch/powerpc/platforms/powernv/Kconfig | 1 + arch/powerpc/platforms/powernv/pci-ioda.c | 103 +++++++++++++++++++++++++++++ arch/powerpc/platforms/powernv/pci.c | 20 ++++++ 3 files changed, 124 insertions(+) diff --git a/arch/powerpc/platforms/powernv/Kconfig b/arch/powerpc/platforms/powernv/Kconfig index 895e8a2..0dd331b 100644 --- a/arch/powerpc/platforms/powernv/Kconfig +++ b/arch/powerpc/platforms/powernv/Kconfig @@ -11,6 +11,7 @@ config PPC_POWERNV select PPC_UDBG_16550 select PPC_SCOM select ARCH_RANDOM + select OF_DYNAMIC default y config PPC_POWERNV_RTAS diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index e46c5bf..9ace027 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -23,6 +23,7 @@ #include <linux/io.h> #include <linux/msi.h> #include <linux/memblock.h> +#include <linux/of_pci.h> #include <asm/sections.h> #include <asm/io.h> @@ -771,6 +772,108 @@ static void pnv_pci_ioda_setup_PEs(void) } } +#ifdef CONFIG_PCI_IOV +static void pnv_pci_create_vf_node(struct pci_dev *dev, u16 vf_num) +{ + struct device_node *dn, *p_dn; + struct pci_dn *pdn; + struct pci_controller *hose; + struct property *pp; + void* value; + u16 id; + + hose = pci_bus_to_host(dev->bus); + + /* Create dev-tree node for VFs if this is a PF */ + p_dn = pci_bus_to_OF_node(dev->bus); + if (p_dn == NULL) { + dev_err(&dev->dev, "SRIOV: VF bus NULL device node\n"); + return; + } + + for (id = 0; id < vf_num; id++) { + dn = kzalloc(sizeof(*dn), GFP_KERNEL); + pdn = kzalloc(sizeof(*pdn), GFP_KERNEL); + pp = kzalloc(sizeof(*pp), GFP_KERNEL); + value = kzalloc(sizeof(u32), GFP_KERNEL); + + if (!dn || !pdn || !pp || !value) { + kfree(dn); + kfree(pdn); + kfree(pp); + kfree(value); + dev_warn(&dev->dev, "%s: failed to create" + "dev-tree node for idx(%d)\n", + __func__, id); + + break; + } + + pp->value = value; + pdn->node = dn; + pdn->devfn = pci_iov_virtfn_devfn(dev, id); + pdn->busno = dev->bus->number; + pdn->pe_number = IODA_INVALID_PE; + pdn->phb = hose; + + dn->data = pdn; + kref_init(&dn->kref); + dn->full_name = dn->name = + kasprintf(GFP_KERNEL, "%s/vf%d", + p_dn->full_name, pdn->devfn); + dn->parent = p_dn; + + pp->name = kasprintf(GFP_KERNEL, "reg"); + pp->length = 5 * sizeof(__be32); + *(u32*)pp->value = cpu_to_be32(pdn->devfn) << 8; + dn->properties = pp; + + of_attach_node(dn); + } +} + +static void pnv_pci_release_vf_node(struct pci_dev *dev, u16 vf_num) +{ + struct device_node *dn; + struct property *pp; + u16 id; + + for (id = 0; id < vf_num; id++) { + dn = of_pci_find_child_device(dev->bus->dev.of_node, + pci_iov_virtfn_devfn(dev, id)); + if (!dn) + continue; + + of_detach_node(dn); + pp = dn->properties; + kfree(pp->name); + kfree(pp->value); + kfree(pp); + kfree(dn->data); + kfree(dn); + } +} + +int pcibios_sriov_disable(struct pci_dev *pdev) +{ + struct pci_sriov *iov; + u16 vf_num; + + iov = pdev->sriov; + vf_num = iov->num_VFs; + pnv_pci_release_vf_node(pdev, vf_num); + + return 0; +} + +int pcibios_sriov_enable(struct pci_dev *pdev, u16 vf_num) +{ + pnv_pci_create_vf_node(pdev, vf_num); + + return 0; +} +#endif /* CONFIG_PCI_IOV */ + static void pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, struct pci_dev *pdev) { struct pci_dn *pdn = pci_get_pdn(pdev); diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index 687a068..43fcc73 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c @@ -654,6 +654,26 @@ static void pnv_pci_dma_dev_setup(struct pci_dev *pdev) { struct pci_controller *hose = pci_bus_to_host(pdev->bus); struct pnv_phb *phb = hose->private_data; +#ifdef CONFIG_PCI_IOV + struct pnv_ioda_pe *pe; + struct pci_dn *pdn; + + /* Fix the VF pdn PE number */ + if (pdev->is_virtfn) { + pdn = pci_get_pdn(pdev); + if (pdn->pcidev == NULL || pdn->pe_number == IODA_INVALID_PE) { + list_for_each_entry(pe, &phb->ioda.pe_list, list) { + if (pe->rid == + ((pdev->bus->number << 8) | (pdev->devfn & 0xff))) { + pdn->pcidev = pdev; + pdn->pe_number = pe->pe_number; + pe->pdev = pdev; + break; + } + } + } + } +#endif /* CONFIG_PCI_IOV */ /* If we have no phb structure, try to setup a fallback based on * the device-tree (RTAS PCI for example) -- 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 ` [RFC PATCH V3 08/17] PCI: Add weak pcibios_sriov_resource_size() interface Wei Yang 2014-06-10 1:56 ` 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 ` Wei Yang [this message] 2014-06-10 1:56 ` [RFC PATCH V3 14/17] ppc/pci: create/release dev-tree node for VFs 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-15-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.