diff options
Diffstat (limited to 'drivers/pci/controller/cadence/pcie-cadence.c')
| -rw-r--r-- | drivers/pci/controller/cadence/pcie-cadence.c | 17 | 
1 files changed, 11 insertions, 6 deletions
| diff --git a/drivers/pci/controller/cadence/pcie-cadence.c b/drivers/pci/controller/cadence/pcie-cadence.c index cd795f6fc1e2..3c3646502d05 100644 --- a/drivers/pci/controller/cadence/pcie-cadence.c +++ b/drivers/pci/controller/cadence/pcie-cadence.c @@ -7,7 +7,7 @@  #include "pcie-cadence.h" -void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 fn, +void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 busnr, u8 fn,  				   u32 r, bool is_io,  				   u64 cpu_addr, u64 pci_addr, size_t size)  { @@ -60,7 +60,7 @@ void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 fn,  		/* The device and function numbers are always 0. */  		desc0 |= CDNS_PCIE_AT_OB_REGION_DESC0_HARDCODED_RID |  			 CDNS_PCIE_AT_OB_REGION_DESC0_DEVFN(0); -		desc1 |= CDNS_PCIE_AT_OB_REGION_DESC1_BUS(pcie->bus); +		desc1 |= CDNS_PCIE_AT_OB_REGION_DESC1_BUS(busnr);  	} else {  		/*  		 * Use captured values for bus and device numbers but still @@ -73,7 +73,9 @@ void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 fn,  	cdns_pcie_writel(pcie, CDNS_PCIE_AT_OB_REGION_DESC1(r), desc1);  	/* Set the CPU address */ -	cpu_addr -= pcie->mem_res->start; +	if (pcie->ops->cpu_addr_fixup) +		cpu_addr = pcie->ops->cpu_addr_fixup(pcie, cpu_addr); +  	addr0 = CDNS_PCIE_AT_OB_REGION_CPU_ADDR0_NBITS(nbits) |  		(lower_32_bits(cpu_addr) & GENMASK(31, 8));  	addr1 = upper_32_bits(cpu_addr); @@ -82,7 +84,8 @@ void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 fn,  	cdns_pcie_writel(pcie, CDNS_PCIE_AT_OB_REGION_CPU_ADDR1(r), addr1);  } -void cdns_pcie_set_outbound_region_for_normal_msg(struct cdns_pcie *pcie, u8 fn, +void cdns_pcie_set_outbound_region_for_normal_msg(struct cdns_pcie *pcie, +						  u8 busnr, u8 fn,  						  u32 r, u64 cpu_addr)  {  	u32 addr0, addr1, desc0, desc1; @@ -94,13 +97,15 @@ void cdns_pcie_set_outbound_region_for_normal_msg(struct cdns_pcie *pcie, u8 fn,  	if (pcie->is_rc) {  		desc0 |= CDNS_PCIE_AT_OB_REGION_DESC0_HARDCODED_RID |  			 CDNS_PCIE_AT_OB_REGION_DESC0_DEVFN(0); -		desc1 |= CDNS_PCIE_AT_OB_REGION_DESC1_BUS(pcie->bus); +		desc1 |= CDNS_PCIE_AT_OB_REGION_DESC1_BUS(busnr);  	} else {  		desc0 |= CDNS_PCIE_AT_OB_REGION_DESC0_DEVFN(fn);  	}  	/* Set the CPU address */ -	cpu_addr -= pcie->mem_res->start; +	if (pcie->ops->cpu_addr_fixup) +		cpu_addr = pcie->ops->cpu_addr_fixup(pcie, cpu_addr); +  	addr0 = CDNS_PCIE_AT_OB_REGION_CPU_ADDR0_NBITS(17) |  		(lower_32_bits(cpu_addr) & GENMASK(31, 8));  	addr1 = upper_32_bits(cpu_addr); |