[PATCH v9 09/26] powerpc/powernv: IO and M32 mapping based on PCI device resources
Alexey Kardashevskiy
aik at ozlabs.ru
Thu May 5 12:57:55 AEST 2016
On 05/03/2016 03:41 PM, Gavin Shan wrote:
> Currently, the IO and M32 segments are mapped to the corresponding
> PE based on the windows of the parent bridge of PE's primary bus.
> It's not going to work when the windows of root port or upstream
> port of the PCIe switch behind root port are extended to PHB's
> apertures in order to support hotplug in subsequent patch.
>
> This fixes the issue by mapping IO and M32 segments based on the
> resources of the PCI devices included in the PE, instead of the
> windows of the parent bridge of the PE's primary bus.
>
> Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>
Reviewed-by: Alexey Kardashevskiy <aik at ozlabs.ru>
> ---
> arch/powerpc/platforms/powernv/pci-ioda.c | 19 ++++++++++++++++---
> 1 file changed, 16 insertions(+), 3 deletions(-)
>
> diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
> index b954fbc..904790b 100644
> --- a/arch/powerpc/platforms/powernv/pci-ioda.c
> +++ b/arch/powerpc/platforms/powernv/pci-ioda.c
> @@ -2993,7 +2993,7 @@ static void pnv_ioda_setup_pe_res(struct pnv_ioda_pe *pe,
> */
> static void pnv_ioda_setup_pe_seg(struct pnv_ioda_pe *pe)
> {
> - struct resource *res;
> + struct pci_dev *pdev;
> int i;
>
> /*
> @@ -3003,8 +3003,21 @@ static void pnv_ioda_setup_pe_seg(struct pnv_ioda_pe *pe)
> */
> BUG_ON(!(pe->flags & (PNV_IODA_PE_BUS | PNV_IODA_PE_BUS_ALL)));
>
> - pci_bus_for_each_resource(pe->pbus, res, i)
> - pnv_ioda_setup_pe_res(pe, res);
> + list_for_each_entry(pdev, &pe->pbus->devices, bus_list) {
> + for (i = 0; i <= PCI_ROM_RESOURCE; i++)
> + pnv_ioda_setup_pe_res(pe, &pdev->resource[i]);
> +
> + /*
> + * If the PE contains all subordinate PCI buses, the
> + * windows of the child bridges should be mapped to
> + * the PE as well.
> + */
> + if (!(pe->flags & PNV_IODA_PE_BUS_ALL) || !pci_is_bridge(pdev))
> + continue;
> + for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++)
> + pnv_ioda_setup_pe_res(pe,
> + &pdev->resource[PCI_BRIDGE_RESOURCES + i]);
> + }
> }
>
> static void pnv_pci_ioda_setup_seg(void)
>
--
Alexey
More information about the Linuxppc-dev
mailing list