On 11/05/2015 12:12 AM, Gavin Shan wrote:
We're going to reserve/assign PEs when pcibios_setup_bridge() is
called. The function won't be called for root bus as it doesn't
have parent bridge. However, the root bus still needs a PE to be
covered.

This reserves PE numbers that are adjacent to the reserved one
for root buses.


Somewhere in the patchset you need to describe why you need a separate PE for a root bus and why reserved_pe_idx is not enough for this.




Signed-off-by: Gavin Shan <gws...@linux.vnet.ibm.com>
---
  arch/powerpc/platforms/powernv/pci-ioda.c | 33 ++++++++++++++++++++++---------
  arch/powerpc/platforms/powernv/pci.h      |  1 +
  2 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c 
b/arch/powerpc/platforms/powernv/pci-ioda.c
index eea1c96..5e6745f 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -207,14 +207,14 @@ static int pnv_ioda2_init_m64(struct pnv_phb *phb)
        set_bit(phb->ioda.m64_bar_idx, &phb->ioda.m64_bar_alloc);

        /*
-        * Strip off the segment used by the reserved PE, which is
-        * expected to be 0 or last one of PE capabicity.
+        * Exclude the segments for reserved and root bus PE, which
+        * are first or last two PEs.
         */
        r = &phb->hose->mem_resources[1];
        if (phb->ioda.reserved_pe_idx == 0)
-               r->start += phb->ioda.m64_segsize;
+               r->start += (2 * phb->ioda.m64_segsize);
        else if (phb->ioda.reserved_pe_idx == (phb->ioda.total_pe_num - 1))
-               r->end -= phb->ioda.m64_segsize;
+               r->end -= (2 * phb->ioda.m64_segsize);
        else
                pr_warn("  Cannot strip M64 segment for reserved PE#%d\n",
                        phb->ioda.reserved_pe_idx);
@@ -294,14 +294,14 @@ static int pnv_ioda1_init_m64(struct pnv_phb *phb)
        }

        /*
-        * Exclude the segment used by the reserved PE, which
-        * is expected to be 0 or last supported PE#.
+        * Exclude the segments for reserved and root bus PE, which
+        * are first or last two PEs.
         */
        r = &phb->hose->mem_resources[1];
        if (phb->ioda.reserved_pe_idx == 0)
-               r->start += phb->ioda.m64_segsize;
+               r->start += (2 * phb->ioda.m64_segsize);
        else if (phb->ioda.reserved_pe_idx == (phb->ioda.total_pe_num - 1))
-               r->end -= phb->ioda.m64_segsize;
+               r->end -= (2 * phb->ioda.m64_segsize);
        else
                pr_warn("  Cannot cut M64 segment for reserved PE#%d\n",
                        phb->ioda.reserved_pe_idx);
@@ -3231,7 +3231,22 @@ static void __init pnv_pci_init_ioda_phb(struct 
device_node *np,
                        phb->ioda.dma32_segmap[i] = IODA_INVALID_PE;
        }
        phb->ioda.pe_array = aux + pemap_off;
-       set_bit(phb->ioda.reserved_pe_idx, phb->ioda.pe_alloc);
+
+       /*
+        * Choose PE number for root bus, which shouldn't have
+        * M64 resources consumed by its child devices. To pick
+        * the PE number adjacent to the reserved one if possible.
+        */
+       pnv_ioda_reserve_pe(phb, phb->ioda.reserved_pe_idx);
+       if (phb->ioda.reserved_pe_idx == 0) {
+               phb->ioda.root_pe_idx = 1;
+               pnv_ioda_reserve_pe(phb, phb->ioda.root_pe_idx);
+       } else if (phb->ioda.reserved_pe_idx == (phb->ioda.total_pe_num - 1)) {
+               phb->ioda.root_pe_idx = phb->ioda.reserved_pe_idx - 1;
+               pnv_ioda_reserve_pe(phb, phb->ioda.root_pe_idx);
+       } else {
+               phb->ioda.root_pe_idx = IODA_INVALID_PE;
+       }

        INIT_LIST_HEAD(&phb->ioda.pe_list);
        mutex_init(&phb->ioda.pe_list_mutex);
diff --git a/arch/powerpc/platforms/powernv/pci.h 
b/arch/powerpc/platforms/powernv/pci.h
index e55ab0e..a8ba97f 100644
--- a/arch/powerpc/platforms/powernv/pci.h
+++ b/arch/powerpc/platforms/powernv/pci.h
@@ -120,6 +120,7 @@ struct pnv_phb {
                        /* Global bridge info */
                        unsigned int            total_pe_num;
                        unsigned int            reserved_pe_idx;
+                       unsigned int            root_pe_idx;

                        /* 32-bit MMIO window */
                        unsigned int            m32_size;



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

Reply via email to