When VF BAR size is larger than 64MB, we group VFs in terms of M64 BAR,
which means those VFs in a group should form a compound PE.

This patch links those VF PEs into compound PE in this case.

Signed-off-by: Wei Yang <weiy...@linux.vnet.ibm.com>
---
 arch/powerpc/platforms/powernv/pci-ioda.c |   27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c 
b/arch/powerpc/platforms/powernv/pci-ioda.c
index 843457b..157305f 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -1345,6 +1345,7 @@ static void pnv_ioda_release_vf_PE(struct pci_dev *pdev, 
u16 num_vfs)
                                vf_index < (vf_group + 1) * vf_per_group &&
                                vf_index < num_vfs;
                                vf_index++)
+
                                for (vf_index1 = vf_group * vf_per_group;
                                        vf_index1 < (vf_group + 1) * 
vf_per_group &&
                                        vf_index1 < num_vfs;
@@ -1360,6 +1361,11 @@ static void pnv_ioda_release_vf_PE(struct pci_dev *pdev, 
u16 num_vfs)
                                                __func__,
                                                pdn->offset + vf_index1, rc);
                                }
+
+                               /* Remove a Slave PE from Master PE */
+                               pe = &phb->ioda.pe_array[pdn->offset + 
vf_index];
+                               if (pe->flags & PNV_IODA_PE_SLAVE)
+                                       list_del(&pe->compound);
        }
 
        list_for_each_entry_safe(pe, pe_n, &phb->ioda.pe_list, list) {
@@ -1418,7 +1424,7 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, 
u16 num_vfs)
        struct pci_bus        *bus;
        struct pci_controller *hose;
        struct pnv_phb        *phb;
-       struct pnv_ioda_pe    *pe;
+       struct pnv_ioda_pe    *pe, *master_pe;
        int                    pe_num;
        u16                    vf_index;
        struct pci_dn         *pdn;
@@ -1480,10 +1486,29 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, 
u16 num_vfs)
                vf_per_group = roundup_pow_of_two(num_vfs) / pdn->m64_per_iov;
 
                for (vf_group = 0; vf_group < M64_PER_IOV; vf_group++) {
+                       master_pe = NULL;
+
                        for (vf_index = vf_group * vf_per_group;
                             vf_index < (vf_group + 1) * vf_per_group &&
                             vf_index < num_vfs;
                             vf_index++) {
+
+                               /*
+                                * Figure out the master PE and put all slave
+                                * PEs to master PE's list.
+                                */
+                               pe = &phb->ioda.pe_array[pdn->offset + 
vf_index];
+                               if (!master_pe) {
+                                       pe->flags |= PNV_IODA_PE_MASTER;
+                                       INIT_LIST_HEAD(&pe->slaves);
+                                       master_pe = pe;
+                               } else {
+                                       pe->flags |= PNV_IODA_PE_SLAVE;
+                                       pe->master = master_pe;
+                                       list_add_tail(&pe->compound,
+                                               &master_pe->slaves);
+                               }
+
                                for (vf_index1 = vf_group * vf_per_group;
                                     vf_index1 < (vf_group + 1) * vf_per_group 
&&
                                     vf_index1 < num_vfs;
-- 
1.7.9.5

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to