diff options
Diffstat (limited to 'drivers/pci/controller/dwc')
-rw-r--r-- | drivers/pci/controller/dwc/pcie-designware-ep.c | 4 | ||||
-rw-r--r-- | drivers/pci/controller/dwc/pcie-designware-host.c | 3 | ||||
-rw-r--r-- | drivers/pci/controller/dwc/pcie-designware.c | 8 | ||||
-rw-r--r-- | drivers/pci/controller/dwc/pcie-designware.h | 28 |
4 files changed, 35 insertions, 8 deletions
diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c index 1e7b02221eac..880210366e71 100644 --- a/drivers/pci/controller/dwc/pcie-designware-ep.c +++ b/drivers/pci/controller/dwc/pcie-designware-ep.c | |||
@@ -504,6 +504,10 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep) | |||
504 | dev_err(dev, "dbi_base/dbi_base2 is not populated\n"); | 504 | dev_err(dev, "dbi_base/dbi_base2 is not populated\n"); |
505 | return -EINVAL; | 505 | return -EINVAL; |
506 | } | 506 | } |
507 | if (pci->iatu_unroll_enabled && !pci->atu_base) { | ||
508 | dev_err(dev, "atu_base is not populated\n"); | ||
509 | return -EINVAL; | ||
510 | } | ||
507 | 511 | ||
508 | ret = of_property_read_u32(np, "num-ib-windows", &ep->num_ib_windows); | 512 | ret = of_property_read_u32(np, "num-ib-windows", &ep->num_ib_windows); |
509 | if (ret < 0) { | 513 | if (ret < 0) { |
diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c index 29a05759a294..692dd1b264fb 100644 --- a/drivers/pci/controller/dwc/pcie-designware-host.c +++ b/drivers/pci/controller/dwc/pcie-designware-host.c | |||
@@ -699,6 +699,9 @@ void dw_pcie_setup_rc(struct pcie_port *pp) | |||
699 | dev_dbg(pci->dev, "iATU unroll: %s\n", | 699 | dev_dbg(pci->dev, "iATU unroll: %s\n", |
700 | pci->iatu_unroll_enabled ? "enabled" : "disabled"); | 700 | pci->iatu_unroll_enabled ? "enabled" : "disabled"); |
701 | 701 | ||
702 | if (pci->iatu_unroll_enabled && !pci->atu_base) | ||
703 | pci->atu_base = pci->dbi_base + DEFAULT_DBI_ATU_OFFSET; | ||
704 | |||
702 | dw_pcie_prog_outbound_atu(pci, PCIE_ATU_REGION_INDEX0, | 705 | dw_pcie_prog_outbound_atu(pci, PCIE_ATU_REGION_INDEX0, |
703 | PCIE_ATU_TYPE_MEM, pp->mem_base, | 706 | PCIE_ATU_TYPE_MEM, pp->mem_base, |
704 | pp->mem_bus_addr, pp->mem_size); | 707 | pp->mem_bus_addr, pp->mem_size); |
diff --git a/drivers/pci/controller/dwc/pcie-designware.c b/drivers/pci/controller/dwc/pcie-designware.c index 2153956a0b20..93ef8c31fb39 100644 --- a/drivers/pci/controller/dwc/pcie-designware.c +++ b/drivers/pci/controller/dwc/pcie-designware.c | |||
@@ -93,7 +93,7 @@ static u32 dw_pcie_readl_ob_unroll(struct dw_pcie *pci, u32 index, u32 reg) | |||
93 | { | 93 | { |
94 | u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index); | 94 | u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index); |
95 | 95 | ||
96 | return dw_pcie_readl_dbi(pci, offset + reg); | 96 | return dw_pcie_readl_atu(pci, offset + reg); |
97 | } | 97 | } |
98 | 98 | ||
99 | static void dw_pcie_writel_ob_unroll(struct dw_pcie *pci, u32 index, u32 reg, | 99 | static void dw_pcie_writel_ob_unroll(struct dw_pcie *pci, u32 index, u32 reg, |
@@ -101,7 +101,7 @@ static void dw_pcie_writel_ob_unroll(struct dw_pcie *pci, u32 index, u32 reg, | |||
101 | { | 101 | { |
102 | u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index); | 102 | u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index); |
103 | 103 | ||
104 | dw_pcie_writel_dbi(pci, offset + reg, val); | 104 | dw_pcie_writel_atu(pci, offset + reg, val); |
105 | } | 105 | } |
106 | 106 | ||
107 | static void dw_pcie_prog_outbound_atu_unroll(struct dw_pcie *pci, int index, | 107 | static void dw_pcie_prog_outbound_atu_unroll(struct dw_pcie *pci, int index, |
@@ -187,7 +187,7 @@ static u32 dw_pcie_readl_ib_unroll(struct dw_pcie *pci, u32 index, u32 reg) | |||
187 | { | 187 | { |
188 | u32 offset = PCIE_GET_ATU_INB_UNR_REG_OFFSET(index); | 188 | u32 offset = PCIE_GET_ATU_INB_UNR_REG_OFFSET(index); |
189 | 189 | ||
190 | return dw_pcie_readl_dbi(pci, offset + reg); | 190 | return dw_pcie_readl_atu(pci, offset + reg); |
191 | } | 191 | } |
192 | 192 | ||
193 | static void dw_pcie_writel_ib_unroll(struct dw_pcie *pci, u32 index, u32 reg, | 193 | static void dw_pcie_writel_ib_unroll(struct dw_pcie *pci, u32 index, u32 reg, |
@@ -195,7 +195,7 @@ static void dw_pcie_writel_ib_unroll(struct dw_pcie *pci, u32 index, u32 reg, | |||
195 | { | 195 | { |
196 | u32 offset = PCIE_GET_ATU_INB_UNR_REG_OFFSET(index); | 196 | u32 offset = PCIE_GET_ATU_INB_UNR_REG_OFFSET(index); |
197 | 197 | ||
198 | dw_pcie_writel_dbi(pci, offset + reg, val); | 198 | dw_pcie_writel_atu(pci, offset + reg, val); |
199 | } | 199 | } |
200 | 200 | ||
201 | static int dw_pcie_prog_inbound_atu_unroll(struct dw_pcie *pci, int index, | 201 | static int dw_pcie_prog_inbound_atu_unroll(struct dw_pcie *pci, int index, |
diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h index 0989d880ac46..9943d8c68335 100644 --- a/drivers/pci/controller/dwc/pcie-designware.h +++ b/drivers/pci/controller/dwc/pcie-designware.h | |||
@@ -92,12 +92,20 @@ | |||
92 | #define PCIE_ATU_UNR_LOWER_TARGET 0x14 | 92 | #define PCIE_ATU_UNR_LOWER_TARGET 0x14 |
93 | #define PCIE_ATU_UNR_UPPER_TARGET 0x18 | 93 | #define PCIE_ATU_UNR_UPPER_TARGET 0x18 |
94 | 94 | ||
95 | /* | ||
96 | * The default address offset between dbi_base and atu_base. Root controller | ||
97 | * drivers are not required to initialize atu_base if the offset matches this | ||
98 | * default; the driver core automatically derives atu_base from dbi_base using | ||
99 | * this offset, if atu_base not set. | ||
100 | */ | ||
101 | #define DEFAULT_DBI_ATU_OFFSET (0x3 << 20) | ||
102 | |||
95 | /* Register address builder */ | 103 | /* Register address builder */ |
96 | #define PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(region) \ | 104 | #define PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(region) \ |
97 | ((0x3 << 20) | ((region) << 9)) | 105 | ((region) << 9) |
98 | 106 | ||
99 | #define PCIE_GET_ATU_INB_UNR_REG_OFFSET(region) \ | 107 | #define PCIE_GET_ATU_INB_UNR_REG_OFFSET(region) \ |
100 | ((0x3 << 20) | ((region) << 9) | (0x1 << 8)) | 108 | (((region) << 9) | (0x1 << 8)) |
101 | 109 | ||
102 | #define MAX_MSI_IRQS 256 | 110 | #define MAX_MSI_IRQS 256 |
103 | #define MAX_MSI_IRQS_PER_CTRL 32 | 111 | #define MAX_MSI_IRQS_PER_CTRL 32 |
@@ -219,6 +227,8 @@ struct dw_pcie { | |||
219 | struct device *dev; | 227 | struct device *dev; |
220 | void __iomem *dbi_base; | 228 | void __iomem *dbi_base; |
221 | void __iomem *dbi_base2; | 229 | void __iomem *dbi_base2; |
230 | /* Used when iatu_unroll_enabled is true */ | ||
231 | void __iomem *atu_base; | ||
222 | u32 num_viewport; | 232 | u32 num_viewport; |
223 | u8 iatu_unroll_enabled; | 233 | u8 iatu_unroll_enabled; |
224 | struct pcie_port pp; | 234 | struct pcie_port pp; |
@@ -289,6 +299,16 @@ static inline u32 dw_pcie_readl_dbi2(struct dw_pcie *pci, u32 reg) | |||
289 | return __dw_pcie_read_dbi(pci, pci->dbi_base2, reg, 0x4); | 299 | return __dw_pcie_read_dbi(pci, pci->dbi_base2, reg, 0x4); |
290 | } | 300 | } |
291 | 301 | ||
302 | static inline void dw_pcie_writel_atu(struct dw_pcie *pci, u32 reg, u32 val) | ||
303 | { | ||
304 | __dw_pcie_write_dbi(pci, pci->atu_base, reg, 0x4, val); | ||
305 | } | ||
306 | |||
307 | static inline u32 dw_pcie_readl_atu(struct dw_pcie *pci, u32 reg) | ||
308 | { | ||
309 | return __dw_pcie_read_dbi(pci, pci->atu_base, reg, 0x4); | ||
310 | } | ||
311 | |||
292 | static inline void dw_pcie_dbi_ro_wr_en(struct dw_pcie *pci) | 312 | static inline void dw_pcie_dbi_ro_wr_en(struct dw_pcie *pci) |
293 | { | 313 | { |
294 | u32 reg; | 314 | u32 reg; |