1 // SPDX-License-Identifier: GPL-2.0
3 * Synopsys DesignWare PCIe host controller driver
5 * Copyright (C) 2013 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com
11 #include <linux/delay.h>
13 #include <linux/types.h>
15 #include "pcie-designware.h"
17 int dw_pcie_read(void __iomem *addr, int size, u32 *val)
19 if (!IS_ALIGNED((uintptr_t)addr, size)) {
21 return PCIBIOS_BAD_REGISTER_NUMBER;
26 } else if (size == 2) {
28 } else if (size == 1) {
32 return PCIBIOS_BAD_REGISTER_NUMBER;
35 return PCIBIOS_SUCCESSFUL;
38 int dw_pcie_write(void __iomem *addr, int size, u32 val)
40 if (!IS_ALIGNED((uintptr_t)addr, size))
41 return PCIBIOS_BAD_REGISTER_NUMBER;
50 return PCIBIOS_BAD_REGISTER_NUMBER;
52 return PCIBIOS_SUCCESSFUL;
55 u32 __dw_pcie_read_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg,
61 if (pci->ops->read_dbi)
62 return pci->ops->read_dbi(pci, base, reg, size);
64 ret = dw_pcie_read(base + reg, size, &val);
66 dev_err(pci->dev, "Read DBI address failed\n");
71 void __dw_pcie_write_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg,
76 if (pci->ops->write_dbi) {
77 pci->ops->write_dbi(pci, base, reg, size, val);
81 ret = dw_pcie_write(base + reg, size, val);
83 dev_err(pci->dev, "Write DBI address failed\n");
86 u32 __dw_pcie_read_dbi2(struct dw_pcie *pci, void __iomem *base, u32 reg,
92 if (pci->ops->read_dbi2)
93 return pci->ops->read_dbi2(pci, base, reg, size);
95 ret = dw_pcie_read(base + reg, size, &val);
97 dev_err(pci->dev, "read DBI address failed\n");
102 void __dw_pcie_write_dbi2(struct dw_pcie *pci, void __iomem *base, u32 reg,
103 size_t size, u32 val)
107 if (pci->ops->write_dbi2) {
108 pci->ops->write_dbi2(pci, base, reg, size, val);
112 ret = dw_pcie_write(base + reg, size, val);
114 dev_err(pci->dev, "write DBI address failed\n");
117 static u32 dw_pcie_readl_ob_unroll(struct dw_pcie *pci, u32 index, u32 reg)
119 u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index);
121 return dw_pcie_readl_atu(pci, offset + reg);
124 static void dw_pcie_writel_ob_unroll(struct dw_pcie *pci, u32 index, u32 reg,
127 u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index);
129 dw_pcie_writel_atu(pci, offset + reg, val);
132 static void dw_pcie_prog_outbound_atu_unroll(struct dw_pcie *pci, int index,
133 int type, u64 cpu_addr,
134 u64 pci_addr, u32 size)
138 dw_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_LOWER_BASE,
139 lower_32_bits(cpu_addr));
140 dw_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_UPPER_BASE,
141 upper_32_bits(cpu_addr));
142 dw_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_LIMIT,
143 lower_32_bits(cpu_addr + size - 1));
144 dw_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_LOWER_TARGET,
145 lower_32_bits(pci_addr));
146 dw_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_UPPER_TARGET,
147 upper_32_bits(pci_addr));
148 dw_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_REGION_CTRL1,
150 dw_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_REGION_CTRL2,
154 * Make sure ATU enable takes effect before any subsequent config
157 for (retries = 0; retries < LINK_WAIT_MAX_IATU_RETRIES; retries++) {
158 val = dw_pcie_readl_ob_unroll(pci, index,
159 PCIE_ATU_UNR_REGION_CTRL2);
160 if (val & PCIE_ATU_ENABLE)
163 mdelay(LINK_WAIT_IATU);
165 dev_err(pci->dev, "Outbound iATU is not being enabled\n");
168 void dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index, int type,
169 u64 cpu_addr, u64 pci_addr, u32 size)
173 if (pci->ops->cpu_addr_fixup)
174 cpu_addr = pci->ops->cpu_addr_fixup(pci, cpu_addr);
176 if (pci->iatu_unroll_enabled) {
177 dw_pcie_prog_outbound_atu_unroll(pci, index, type, cpu_addr,
182 dw_pcie_writel_dbi(pci, PCIE_ATU_VIEWPORT,
183 PCIE_ATU_REGION_OUTBOUND | index);
184 dw_pcie_writel_dbi(pci, PCIE_ATU_LOWER_BASE,
185 lower_32_bits(cpu_addr));
186 dw_pcie_writel_dbi(pci, PCIE_ATU_UPPER_BASE,
187 upper_32_bits(cpu_addr));
188 dw_pcie_writel_dbi(pci, PCIE_ATU_LIMIT,
189 lower_32_bits(cpu_addr + size - 1));
190 dw_pcie_writel_dbi(pci, PCIE_ATU_LOWER_TARGET,
191 lower_32_bits(pci_addr));
192 dw_pcie_writel_dbi(pci, PCIE_ATU_UPPER_TARGET,
193 upper_32_bits(pci_addr));
194 dw_pcie_writel_dbi(pci, PCIE_ATU_CR1, type);
195 dw_pcie_writel_dbi(pci, PCIE_ATU_CR2, PCIE_ATU_ENABLE);
198 * Make sure ATU enable takes effect before any subsequent config
201 for (retries = 0; retries < LINK_WAIT_MAX_IATU_RETRIES; retries++) {
202 val = dw_pcie_readl_dbi(pci, PCIE_ATU_CR2);
203 if (val & PCIE_ATU_ENABLE)
206 mdelay(LINK_WAIT_IATU);
208 dev_err(pci->dev, "Outbound iATU is not being enabled\n");
211 static u32 dw_pcie_readl_ib_unroll(struct dw_pcie *pci, u32 index, u32 reg)
213 u32 offset = PCIE_GET_ATU_INB_UNR_REG_OFFSET(index);
215 return dw_pcie_readl_atu(pci, offset + reg);
218 static void dw_pcie_writel_ib_unroll(struct dw_pcie *pci, u32 index, u32 reg,
221 u32 offset = PCIE_GET_ATU_INB_UNR_REG_OFFSET(index);
223 dw_pcie_writel_atu(pci, offset + reg, val);
226 static int dw_pcie_prog_inbound_atu_unroll(struct dw_pcie *pci, int index,
227 int bar, u64 cpu_addr,
228 enum dw_pcie_as_type as_type)
233 dw_pcie_writel_ib_unroll(pci, index, PCIE_ATU_UNR_LOWER_TARGET,
234 lower_32_bits(cpu_addr));
235 dw_pcie_writel_ib_unroll(pci, index, PCIE_ATU_UNR_UPPER_TARGET,
236 upper_32_bits(cpu_addr));
240 type = PCIE_ATU_TYPE_MEM;
243 type = PCIE_ATU_TYPE_IO;
249 dw_pcie_writel_ib_unroll(pci, index, PCIE_ATU_UNR_REGION_CTRL1, type);
250 dw_pcie_writel_ib_unroll(pci, index, PCIE_ATU_UNR_REGION_CTRL2,
252 PCIE_ATU_BAR_MODE_ENABLE | (bar << 8));
255 * Make sure ATU enable takes effect before any subsequent config
258 for (retries = 0; retries < LINK_WAIT_MAX_IATU_RETRIES; retries++) {
259 val = dw_pcie_readl_ib_unroll(pci, index,
260 PCIE_ATU_UNR_REGION_CTRL2);
261 if (val & PCIE_ATU_ENABLE)
264 mdelay(LINK_WAIT_IATU);
266 dev_err(pci->dev, "Inbound iATU is not being enabled\n");
271 int dw_pcie_prog_inbound_atu(struct dw_pcie *pci, int index, int bar,
272 u64 cpu_addr, enum dw_pcie_as_type as_type)
277 if (pci->iatu_unroll_enabled)
278 return dw_pcie_prog_inbound_atu_unroll(pci, index, bar,
281 dw_pcie_writel_dbi(pci, PCIE_ATU_VIEWPORT, PCIE_ATU_REGION_INBOUND |
283 dw_pcie_writel_dbi(pci, PCIE_ATU_LOWER_TARGET, lower_32_bits(cpu_addr));
284 dw_pcie_writel_dbi(pci, PCIE_ATU_UPPER_TARGET, upper_32_bits(cpu_addr));
288 type = PCIE_ATU_TYPE_MEM;
291 type = PCIE_ATU_TYPE_IO;
297 dw_pcie_writel_dbi(pci, PCIE_ATU_CR1, type);
298 dw_pcie_writel_dbi(pci, PCIE_ATU_CR2, PCIE_ATU_ENABLE
299 | PCIE_ATU_BAR_MODE_ENABLE | (bar << 8));
302 * Make sure ATU enable takes effect before any subsequent config
305 for (retries = 0; retries < LINK_WAIT_MAX_IATU_RETRIES; retries++) {
306 val = dw_pcie_readl_dbi(pci, PCIE_ATU_CR2);
307 if (val & PCIE_ATU_ENABLE)
310 mdelay(LINK_WAIT_IATU);
312 dev_err(pci->dev, "Inbound iATU is not being enabled\n");
317 void dw_pcie_disable_atu(struct dw_pcie *pci, int index,
318 enum dw_pcie_region_type type)
323 case DW_PCIE_REGION_INBOUND:
324 region = PCIE_ATU_REGION_INBOUND;
326 case DW_PCIE_REGION_OUTBOUND:
327 region = PCIE_ATU_REGION_OUTBOUND;
333 dw_pcie_writel_dbi(pci, PCIE_ATU_VIEWPORT, region | index);
334 dw_pcie_writel_dbi(pci, PCIE_ATU_CR2, (u32)~PCIE_ATU_ENABLE);
337 int dw_pcie_wait_for_link(struct dw_pcie *pci)
341 /* Check if the link is up or not */
342 for (retries = 0; retries < LINK_WAIT_MAX_RETRIES; retries++) {
343 if (dw_pcie_link_up(pci)) {
344 dev_info(pci->dev, "Link up\n");
347 usleep_range(LINK_WAIT_USLEEP_MIN, LINK_WAIT_USLEEP_MAX);
350 dev_err(pci->dev, "Phy link never came up\n");
355 int dw_pcie_link_up(struct dw_pcie *pci)
359 if (pci->ops->link_up)
360 return pci->ops->link_up(pci);
362 val = readl(pci->dbi_base + PCIE_PORT_DEBUG1);
363 return ((val & PCIE_PORT_DEBUG1_LINK_UP) &&
364 (!(val & PCIE_PORT_DEBUG1_LINK_IN_TRAINING)));
367 static u8 dw_pcie_iatu_unroll_enabled(struct dw_pcie *pci)
371 val = dw_pcie_readl_dbi(pci, PCIE_ATU_VIEWPORT);
372 if (val == 0xffffffff)
378 void dw_pcie_setup(struct dw_pcie *pci)
383 struct device *dev = pci->dev;
384 struct device_node *np = dev->of_node;
386 if (pci->version >= 0x480A || (!pci->version &&
387 dw_pcie_iatu_unroll_enabled(pci))) {
388 pci->iatu_unroll_enabled = true;
390 pci->atu_base = pci->dbi_base + DEFAULT_DBI_ATU_OFFSET;
392 dev_dbg(pci->dev, "iATU unroll: %s\n", pci->iatu_unroll_enabled ?
393 "enabled" : "disabled");
396 ret = of_property_read_u32(np, "num-lanes", &lanes);
400 /* Set the number of lanes */
401 val = dw_pcie_readl_dbi(pci, PCIE_PORT_LINK_CONTROL);
402 val &= ~PORT_LINK_MODE_MASK;
405 val |= PORT_LINK_MODE_1_LANES;
408 val |= PORT_LINK_MODE_2_LANES;
411 val |= PORT_LINK_MODE_4_LANES;
414 val |= PORT_LINK_MODE_8_LANES;
417 dev_err(pci->dev, "num-lanes %u: invalid value\n", lanes);
420 dw_pcie_writel_dbi(pci, PCIE_PORT_LINK_CONTROL, val);
422 /* Set link width speed control register */
423 val = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL);
424 val &= ~PORT_LOGIC_LINK_WIDTH_MASK;
427 val |= PORT_LOGIC_LINK_WIDTH_1_LANES;
430 val |= PORT_LOGIC_LINK_WIDTH_2_LANES;
433 val |= PORT_LOGIC_LINK_WIDTH_4_LANES;
436 val |= PORT_LOGIC_LINK_WIDTH_8_LANES;
439 dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val);