diff options
Diffstat (limited to 'drivers/pci/controller/dwc/pcie-designware.c')
| -rw-r--r-- | drivers/pci/controller/dwc/pcie-designware.c | 94 | 
1 files changed, 18 insertions, 76 deletions
diff --git a/drivers/pci/controller/dwc/pcie-designware.c b/drivers/pci/controller/dwc/pcie-designware.c index 89aad5a08928..c644216995f6 100644 --- a/drivers/pci/controller/dwc/pcie-designware.c +++ b/drivers/pci/controller/dwc/pcie-designware.c @@ -167,6 +167,14 @@ int dw_pcie_get_resources(struct dw_pcie *pci)  		}  	} +	/* ELBI is an optional resource */ +	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "elbi"); +	if (res) { +		pci->elbi_base = devm_ioremap_resource(pci->dev, res); +		if (IS_ERR(pci->elbi_base)) +			return PTR_ERR(pci->elbi_base); +	} +  	/* LLDD is supposed to manually switch the clocks and resets state */  	if (dw_pcie_cap_is(pci, REQ_RES)) {  		ret = dw_pcie_get_clocks(pci); @@ -213,83 +221,16 @@ void dw_pcie_version_detect(struct dw_pcie *pci)  		pci->type = ver;  } -/* - * These interfaces resemble the pci_find_*capability() interfaces, but these - * are for configuring host controllers, which are bridges *to* PCI devices but - * are not PCI devices themselves. - */ -static u8 __dw_pcie_find_next_cap(struct dw_pcie *pci, u8 cap_ptr, -				  u8 cap) -{ -	u8 cap_id, next_cap_ptr; -	u16 reg; - -	if (!cap_ptr) -		return 0; - -	reg = dw_pcie_readw_dbi(pci, cap_ptr); -	cap_id = (reg & 0x00ff); - -	if (cap_id > PCI_CAP_ID_MAX) -		return 0; - -	if (cap_id == cap) -		return cap_ptr; - -	next_cap_ptr = (reg & 0xff00) >> 8; -	return __dw_pcie_find_next_cap(pci, next_cap_ptr, cap); -} -  u8 dw_pcie_find_capability(struct dw_pcie *pci, u8 cap)  { -	u8 next_cap_ptr; -	u16 reg; - -	reg = dw_pcie_readw_dbi(pci, PCI_CAPABILITY_LIST); -	next_cap_ptr = (reg & 0x00ff); - -	return __dw_pcie_find_next_cap(pci, next_cap_ptr, cap); +	return PCI_FIND_NEXT_CAP(dw_pcie_read_cfg, PCI_CAPABILITY_LIST, cap, +				 pci);  }  EXPORT_SYMBOL_GPL(dw_pcie_find_capability); -static u16 dw_pcie_find_next_ext_capability(struct dw_pcie *pci, u16 start, -					    u8 cap) -{ -	u32 header; -	int ttl; -	int pos = PCI_CFG_SPACE_SIZE; - -	/* minimum 8 bytes per capability */ -	ttl = (PCI_CFG_SPACE_EXP_SIZE - PCI_CFG_SPACE_SIZE) / 8; - -	if (start) -		pos = start; - -	header = dw_pcie_readl_dbi(pci, pos); -	/* -	 * If we have no capabilities, this is indicated by cap ID, -	 * cap version and next pointer all being 0. -	 */ -	if (header == 0) -		return 0; - -	while (ttl-- > 0) { -		if (PCI_EXT_CAP_ID(header) == cap && pos != start) -			return pos; - -		pos = PCI_EXT_CAP_NEXT(header); -		if (pos < PCI_CFG_SPACE_SIZE) -			break; - -		header = dw_pcie_readl_dbi(pci, pos); -	} - -	return 0; -} -  u16 dw_pcie_find_ext_capability(struct dw_pcie *pci, u8 cap)  { -	return dw_pcie_find_next_ext_capability(pci, 0, cap); +	return PCI_FIND_NEXT_EXT_CAP(dw_pcie_read_cfg, 0, cap, pci);  }  EXPORT_SYMBOL_GPL(dw_pcie_find_ext_capability); @@ -302,8 +243,8 @@ static u16 __dw_pcie_find_vsec_capability(struct dw_pcie *pci, u16 vendor_id,  	if (vendor_id != dw_pcie_readw_dbi(pci, PCI_VENDOR_ID))  		return 0; -	while ((vsec = dw_pcie_find_next_ext_capability(pci, vsec, -						       PCI_EXT_CAP_ID_VNDR))) { +	while ((vsec = PCI_FIND_NEXT_EXT_CAP(dw_pcie_read_cfg, vsec, +					     PCI_EXT_CAP_ID_VNDR, pci))) {  		header = dw_pcie_readl_dbi(pci, vsec + PCI_VNDR_HEADER);  		if (PCI_VNDR_HEADER_ID(header) == vsec_id)  			return vsec; @@ -567,7 +508,7 @@ int dw_pcie_prog_outbound_atu(struct dw_pcie *pci,  		val = dw_pcie_enable_ecrc(val);  	dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_REGION_CTRL1, val); -	val = PCIE_ATU_ENABLE; +	val = PCIE_ATU_ENABLE | atu->ctrl2;  	if (atu->type == PCIE_ATU_TYPE_MSG) {  		/* The data-less messages only for now */  		val |= PCIE_ATU_INHIBIT_PAYLOAD | atu->code; @@ -841,6 +782,9 @@ static void dw_pcie_link_set_max_link_width(struct dw_pcie *pci, u32 num_lanes)  	case 8:  		plc |= PORT_LINK_MODE_8_LANES;  		break; +	case 16: +		plc |= PORT_LINK_MODE_16_LANES; +		break;  	default:  		dev_err(pci->dev, "num-lanes %u: invalid value\n", num_lanes);  		return; @@ -1045,9 +989,7 @@ static int dw_pcie_edma_irq_verify(struct dw_pcie *pci)  	char name[15];  	int ret; -	if (pci->edma.nr_irqs == 1) -		return 0; -	else if (pci->edma.nr_irqs > 1) +	if (pci->edma.nr_irqs > 1)  		return pci->edma.nr_irqs != ch_cnt ? -EINVAL : 0;  	ret = platform_get_irq_byname_optional(pdev, "dma");  | 
