diff options
Diffstat (limited to 'drivers/pci/controller/dwc/pcie-designware-ep.c')
| -rw-r--r-- | drivers/pci/controller/dwc/pcie-designware-ep.c | 48 | 
1 files changed, 23 insertions, 25 deletions
| diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c index 83ddb190292e..d06654895eba 100644 --- a/drivers/pci/controller/dwc/pcie-designware-ep.c +++ b/drivers/pci/controller/dwc/pcie-designware-ep.c @@ -13,8 +13,6 @@  #include <linux/pci-epc.h>  #include <linux/pci-epf.h> -#include "../../pci.h" -  void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)  {  	struct pci_epc *epc = ep->epc; @@ -171,8 +169,8 @@ static int dw_pcie_ep_inbound_atu(struct dw_pcie_ep *ep, u8 func_no, int type,  		return -EINVAL;  	} -	ret = dw_pcie_prog_inbound_atu(pci, func_no, free_win, type, -				       cpu_addr, bar); +	ret = dw_pcie_prog_ep_inbound_atu(pci, func_no, free_win, type, +					  cpu_addr, bar);  	if (ret < 0) {  		dev_err(pci->dev, "Failed to program IB window\n");  		return ret; @@ -643,7 +641,7 @@ static unsigned int dw_pcie_ep_find_ext_capability(struct dw_pcie *pci, int cap)  int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep)  {  	struct dw_pcie *pci = to_dw_pcie_from_ep(ep); -	unsigned int offset; +	unsigned int offset, ptm_cap_base;  	unsigned int nbars;  	u8 hdr_type;  	u32 reg; @@ -659,6 +657,7 @@ int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep)  	}  	offset = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_REBAR); +	ptm_cap_base = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_PTM);  	dw_pcie_dbi_ro_wr_en(pci); @@ -671,6 +670,22 @@ int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep)  			dw_pcie_writel_dbi(pci, offset + PCI_REBAR_CAP, 0x0);  	} +	/* +	 * PTM responder capability can be disabled only after disabling +	 * PTM root capability. +	 */ +	if (ptm_cap_base) { +		dw_pcie_dbi_ro_wr_en(pci); +		reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP); +		reg &= ~PCI_PTM_CAP_ROOT; +		dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg); + +		reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP); +		reg &= ~(PCI_PTM_CAP_RES | PCI_PTM_GRANULARITY_MASK); +		dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg); +		dw_pcie_dbi_ro_wr_dis(pci); +	} +  	dw_pcie_setup(pci);  	dw_pcie_dbi_ro_wr_dis(pci); @@ -694,23 +709,9 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)  	INIT_LIST_HEAD(&ep->func_list); -	if (!pci->dbi_base) { -		res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi"); -		pci->dbi_base = devm_pci_remap_cfg_resource(dev, res); -		if (IS_ERR(pci->dbi_base)) -			return PTR_ERR(pci->dbi_base); -	} - -	if (!pci->dbi_base2) { -		res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi2"); -		if (!res) { -			pci->dbi_base2 = pci->dbi_base + SZ_4K; -		} else { -			pci->dbi_base2 = devm_pci_remap_cfg_resource(dev, res); -			if (IS_ERR(pci->dbi_base2)) -				return PTR_ERR(pci->dbi_base2); -		} -	} +	ret = dw_pcie_get_resources(pci); +	if (ret) +		return ret;  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "addr_space");  	if (!res) @@ -739,9 +740,6 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)  		return -ENOMEM;  	ep->outbound_addr = addr; -	if (pci->link_gen < 1) -		pci->link_gen = of_pci_get_max_link_speed(np); -  	epc = devm_pci_epc_create(dev, &epc_ops);  	if (IS_ERR(epc)) {  		dev_err(dev, "Failed to create epc device\n"); |