[PATCH v9 08/26] powerpc/powernv: Simplify pnv_ioda_setup_pe_seg()

Alistair Popple alistair at popple.id.au
Wed May 4 13:45:16 AEST 2016


On Tue, 3 May 2016 15:41:27 Gavin Shan wrote:
> pnv_ioda_setup_pe_seg() associates the IO and M32 segments with the
> owner PE. The code mapping segments should be fixed and immune from
> logic changes introduced to pnv_ioda_setup_pe_seg().
> 
> This moves the code mapping segments to helper pnv_ioda_setup_pe_res().
> The data type for @rc is changed to "int64_t". Also, argument @hose is
> removed from pnv_ioda_setup_pe() as it can be got from @pe. No functional
> changes introduced.
> 
> Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>

Reviewed-By: Alistair Popple <alistair at popple.id.au>

> ---
>  arch/powerpc/platforms/powernv/pci-ioda.c | 121 +++++++++++++++---------------
>  1 file changed, 62 insertions(+), 59 deletions(-)
> 
> diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
> index 59b20e5..b954fbc 100644
> --- a/arch/powerpc/platforms/powernv/pci-ioda.c
> +++ b/arch/powerpc/platforms/powernv/pci-ioda.c
> @@ -2929,19 +2929,72 @@ truncate_iov:
>  }
>  #endif /* CONFIG_PCI_IOV */
>  
> +static void pnv_ioda_setup_pe_res(struct pnv_ioda_pe *pe,
> +				  struct resource *res)
> +{
> +	struct pnv_phb *phb = pe->phb;
> +	struct pci_bus_region region;
> +	int index;
> +	int64_t rc;
> +
> +	if (!res || !res->flags || res->start > res->end)
> +		return;
> +
> +	if (res->flags & IORESOURCE_IO) {
> +		region.start = res->start - phb->ioda.io_pci_base;
> +		region.end   = res->end - phb->ioda.io_pci_base;
> +		index = region.start / phb->ioda.io_segsize;
> +
> +		while (index < phb->ioda.total_pe_num &&
> +		       region.start <= region.end) {
> +			phb->ioda.io_segmap[index] = pe->pe_number;
> +			rc = opal_pci_map_pe_mmio_window(phb->opal_id,
> +				pe->pe_number, OPAL_IO_WINDOW_TYPE, 0, index);
> +			if (rc != OPAL_SUCCESS) {
> +				pr_err("%s: Error %lld mappin
> g IO segment#%d to PE#%d\n",
> +				       __func__, rc, index, pe->pe_number);
> +				break;
> +			}
> +
> +			region.start += phb->ioda.io_segsize;
> +			index++;
> +		}
> +	} else if ((res->flags & IORESOURCE_MEM) &&
> +		   !pnv_pci_is_mem_pref_64(res->flags)) {
> +		region.start = res->start -
> +			       phb->hose->mem_offset[0] -
> +			       phb->ioda.m32_pci_base;
> +		region.end   = res->end -
> +			       phb->hose->mem_offset[0] -
> +			       phb->ioda.m32_pci_base;
> +		index = region.start / phb->ioda.m32_segsize;
> +
> +		while (index < phb->ioda.total_pe_num &&
> +		       region.start <= region.end) {
> +			phb->ioda.m32_segmap[index] = pe->pe_number;
> +			rc = opal_pci_map_pe_mmio_window(phb->opal_id,
> +				pe->pe_number, OPAL_M32_WINDOW_TYPE, 0, index);
> +			if (rc != OPAL_SUCCESS) {
> +				pr_err("%s: Error %lld mapping M32 segment#%d to PE#%d",
> +				       __func__, rc, index, pe->pe_number);
> +				break;
> +			}
> +
> +			region.start += phb->ioda.m32_segsize;
> +			index++;
> +		}
> +	}
> +}
> +
>  /*
>   * This function is supposed to be called on basis of PE from top
>   * to bottom style. So the the I/O or MMIO segment assigned to
>   * parent PE could be overrided by its child PEs if necessary.
>   */
> -static void pnv_ioda_setup_pe_seg(struct pci_controller *hose,
> -				  struct pnv_ioda_pe *pe)
> +static void pnv_ioda_setup_pe_seg(struct pnv_ioda_pe *pe)
>  {
> -	struct pnv_phb *phb = hose->private_data;
> -	struct pci_bus_region region;
>  	struct resource *res;
> -	int i, index;
> -	int rc;
> +	int i;
>  
>  	/*
>  	 * NOTE: We only care PCI bus based PE for now. For PCI
> @@ -2950,58 +3003,8 @@ static void pnv_ioda_setup_pe_seg(struct pci_controller *hose,
>  	 */
>  	BUG_ON(!(pe->flags & (PNV_IODA_PE_BUS | PNV_IODA_PE_BUS_ALL)));
>  
> -	pci_bus_for_each_resource(pe->pbus, res, i) {
> -		if (!res || !res->flags ||
> -		    res->start > res->end)
> -			continue;
> -
> -		if (res->flags & IORESOURCE_IO) {
> -			region.start = res->start - phb->ioda.io_pci_base;
> -			region.end   = res->end - phb->ioda.io_pci_base;
> -			index = region.start / phb->ioda.io_segsize;
> -
> -			while (index < phb->ioda.total_pe_num &&
> -			       region.start <= region.end) {
> -				phb->ioda.io_segmap[index] = pe->pe_number;
> -				rc = opal_pci_map_pe_mmio_window(phb->opal_id,
> -					pe->pe_number, OPAL_IO_WINDOW_TYPE, 0, index);
> -				if (rc != OPAL_SUCCESS) {
> -					pr_err("%s: OPAL error %d when mapping IO "
> -					       "segment #%d to PE#%d\n",
> -					       __func__, rc, index, pe->pe_number);
> -					break;
> -				}
> -
> -				region.start += phb->ioda.io_segsize;
> -				index++;
> -			}
> -		} else if ((res->flags & IORESOURCE_MEM) &&
> -			   !pnv_pci_is_mem_pref_64(res->flags)) {
> -			region.start = res->start -
> -				       hose->mem_offset[0] -
> -				       phb->ioda.m32_pci_base;
> -			region.end   = res->end -
> -				       hose->mem_offset[0] -
> -				       phb->ioda.m32_pci_base;
> -			index = region.start / phb->ioda.m32_segsize;
> -
> -			while (index < phb->ioda.total_pe_num &&
> -			       region.start <= region.end) {
> -				phb->ioda.m32_segmap[index] = pe->pe_number;
> -				rc = opal_pci_map_pe_mmio_window(phb->opal_id,
> -					pe->pe_number, OPAL_M32_WINDOW_TYPE, 0, index);
> -				if (rc != OPAL_SUCCESS) {
> -					pr_err("%s: OPAL error %d when mapping M32 "
> -					       "segment#%d to PE#%d",
> -					       __func__, rc, index, pe->pe_number);
> -					break;
> -				}
> -
> -				region.start += phb->ioda.m32_segsize;
> -				index++;
> -			}
> -		}
> -	}
> +	pci_bus_for_each_resource(pe->pbus, res, i)
> +		pnv_ioda_setup_pe_res(pe, res);
>  }
>  
>  static void pnv_pci_ioda_setup_seg(void)
> @@ -3018,7 +3021,7 @@ static void pnv_pci_ioda_setup_seg(void)
>  			continue;
>  
>  		list_for_each_entry(pe, &phb->ioda.pe_list, list) {
> -			pnv_ioda_setup_pe_seg(hose, pe);
> +			pnv_ioda_setup_pe_seg(pe);
>  		}
>  	}
>  }
> 



More information about the Linuxppc-dev mailing list