Move this out of the PHB's dma_dev_setup() callback and into the
ppc_md.pcibios_fixup_iov callback. This ensures that the VF PE's
pdev pointer is always valid for the whole time the device is
added the bus.

This isn't strictly required, but it's slightly a slightly more logical
place to do the fixup and it makes dma_dev_setup a bit simpler.

Signed-off-by: Oliver O'Halloran <ooh...@gmail.com>
---
 arch/powerpc/platforms/powernv/pci-ioda.c | 35 +++++++++++------------
 1 file changed, 17 insertions(+), 18 deletions(-)

diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c 
b/arch/powerpc/platforms/powernv/pci-ioda.c
index 45f974258766..c6ea7a504e04 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -2910,9 +2910,6 @@ static void pnv_pci_ioda_fixup_iov_resources(struct 
pci_dev *pdev)
        struct pci_dn *pdn;
        int mul, total_vfs;
 
-       if (!pdev->is_physfn || pci_dev_is_added(pdev))
-               return;
-
        pdn = pci_get_pdn(pdev);
        pdn->vfs_expanded = 0;
        pdn->m64_single_mode = false;
@@ -2987,6 +2984,22 @@ static void pnv_pci_ioda_fixup_iov_resources(struct 
pci_dev *pdev)
                res->end = res->start - 1;
        }
 }
+
+static void pnv_pci_ioda_fixup_iov(struct pci_dev *pdev)
+{
+       if (WARN_ON(pci_dev_is_added(pdev)))
+               return;
+
+       if (pdev->is_virtfn) {
+               /* Fix the VF PE's pdev pointer */
+               struct pnv_ioda_pe *pe = pnv_ioda_get_pe(pdev);
+               pe->pdev = pdev;
+
+               WARN_ON(!(pe->flags & PNV_IODA_PE_VF));
+       } else if (pdev->is_physfn) {
+               pnv_pci_ioda_fixup_iov_resources(pdev);
+       }
+}
 #endif /* CONFIG_PCI_IOV */
 
 static void pnv_ioda_setup_pe_res(struct pnv_ioda_pe *pe,
@@ -3641,20 +3654,6 @@ 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;
-
-       /* Fix the VF pdn PE number */
-       if (pdev->is_virtfn) {
-               list_for_each_entry(pe, &phb->ioda.pe_list, list) {
-                       if (pe->rid == ((pdev->bus->number << 8) |
-                           (pdev->devfn & 0xff))) {
-                               pe->pdev = pdev;
-                               break;
-                       }
-               }
-       }
-#endif /* CONFIG_PCI_IOV */
 
        pnv_pci_ioda_dma_dev_setup(phb, pdev);
 }
@@ -3945,7 +3944,7 @@ static void __init pnv_pci_init_ioda_phb(struct 
device_node *np,
        ppc_md.pcibios_default_alignment = pnv_pci_default_alignment;
 
 #ifdef CONFIG_PCI_IOV
-       ppc_md.pcibios_fixup_sriov = pnv_pci_ioda_fixup_iov_resources;
+       ppc_md.pcibios_fixup_sriov = pnv_pci_ioda_fixup_iov;
        ppc_md.pcibios_iov_resource_alignment = pnv_pci_iov_resource_alignment;
        ppc_md.pcibios_sriov_enable = pnv_pcibios_sriov_enable;
        ppc_md.pcibios_sriov_disable = pnv_pcibios_sriov_disable;
-- 
2.21.0

Reply via email to