[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