Message ID | 1446642770-4681-26-git-send-email-gwshan@linux.vnet.ibm.com |
---|---|
State | Not Applicable |
Headers | show |
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 <gwshan@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; >
On Tue, Nov 17, 2015 at 05:04:42PM +1100, Alexey Kardashevskiy wrote: >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. > Please confirm if it's fine to add the descrption in this patch's chagelog. > >> >>Signed-off-by: Gavin Shan <gwshan@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; >> Thanks, Gavin -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 11/17/2015 08:06 PM, Gavin Shan wrote: > On Tue, Nov 17, 2015 at 05:04:42PM +1100, Alexey Kardashevskiy wrote: >> 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. >> > > Please confirm if it's fine to add the descrption in this patch's chagelog. Yes, it is fine. Thanks!
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;
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. Signed-off-by: Gavin Shan <gwshan@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(-)