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
8 * Author: Jingoo Han <jg1.han@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
;
37 EXPORT_SYMBOL_GPL(dw_pcie_read
);
39 int dw_pcie_write(void __iomem
*addr
, int size
, u32 val
)
41 if (!IS_ALIGNED((uintptr_t)addr
, size
))
42 return PCIBIOS_BAD_REGISTER_NUMBER
;
51 return PCIBIOS_BAD_REGISTER_NUMBER
;
53 return PCIBIOS_SUCCESSFUL
;
55 EXPORT_SYMBOL_GPL(dw_pcie_write
);
57 u32
dw_pcie_read_dbi(struct dw_pcie
*pci
, u32 reg
, size_t size
)
62 if (pci
->ops
->read_dbi
)
63 return pci
->ops
->read_dbi(pci
, pci
->dbi_base
, reg
, size
);
65 ret
= dw_pcie_read(pci
->dbi_base
+ reg
, size
, &val
);
67 dev_err(pci
->dev
, "Read DBI address failed\n");
71 EXPORT_SYMBOL_GPL(dw_pcie_read_dbi
);
73 void dw_pcie_write_dbi(struct dw_pcie
*pci
, u32 reg
, size_t size
, u32 val
)
77 if (pci
->ops
->write_dbi
) {
78 pci
->ops
->write_dbi(pci
, pci
->dbi_base
, reg
, size
, val
);
82 ret
= dw_pcie_write(pci
->dbi_base
+ reg
, size
, val
);
84 dev_err(pci
->dev
, "Write DBI address failed\n");
86 EXPORT_SYMBOL_GPL(dw_pcie_write_dbi
);
88 u32
dw_pcie_read_dbi2(struct dw_pcie
*pci
, u32 reg
, size_t size
)
93 if (pci
->ops
->read_dbi2
)
94 return pci
->ops
->read_dbi2(pci
, pci
->dbi_base2
, reg
, size
);
96 ret
= dw_pcie_read(pci
->dbi_base2
+ reg
, size
, &val
);
98 dev_err(pci
->dev
, "read DBI address failed\n");
103 void dw_pcie_write_dbi2(struct dw_pcie
*pci
, u32 reg
, size_t size
, u32 val
)
107 if (pci
->ops
->write_dbi2
) {
108 pci
->ops
->write_dbi2(pci
, pci
->dbi_base2
, reg
, size
, val
);
112 ret
= dw_pcie_write(pci
->dbi_base2
+ reg
, size
, val
);
114 dev_err(pci
->dev
, "write DBI address failed\n");
117 u32
dw_pcie_read_atu(struct dw_pcie
*pci
, u32 reg
, size_t size
)
122 if (pci
->ops
->read_dbi
)
123 return pci
->ops
->read_dbi(pci
, pci
->atu_base
, reg
, size
);
125 ret
= dw_pcie_read(pci
->atu_base
+ reg
, size
, &val
);
127 dev_err(pci
->dev
, "Read ATU address failed\n");
132 void dw_pcie_write_atu(struct dw_pcie
*pci
, u32 reg
, size_t size
, u32 val
)
136 if (pci
->ops
->write_dbi
) {
137 pci
->ops
->write_dbi(pci
, pci
->atu_base
, reg
, size
, val
);
141 ret
= dw_pcie_write(pci
->atu_base
+ reg
, size
, val
);
143 dev_err(pci
->dev
, "Write ATU address failed\n");
146 static u32
dw_pcie_readl_ob_unroll(struct dw_pcie
*pci
, u32 index
, u32 reg
)
148 u32 offset
= PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index
);
150 return dw_pcie_readl_atu(pci
, offset
+ reg
);
153 static void dw_pcie_writel_ob_unroll(struct dw_pcie
*pci
, u32 index
, u32 reg
,
156 u32 offset
= PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index
);
158 dw_pcie_writel_atu(pci
, offset
+ reg
, val
);
161 static void dw_pcie_prog_outbound_atu_unroll(struct dw_pcie
*pci
, int index
,
162 int type
, u64 cpu_addr
,
163 u64 pci_addr
, u32 size
)
167 dw_pcie_writel_ob_unroll(pci
, index
, PCIE_ATU_UNR_LOWER_BASE
,
168 lower_32_bits(cpu_addr
));
169 dw_pcie_writel_ob_unroll(pci
, index
, PCIE_ATU_UNR_UPPER_BASE
,
170 upper_32_bits(cpu_addr
));
171 dw_pcie_writel_ob_unroll(pci
, index
, PCIE_ATU_UNR_LIMIT
,
172 lower_32_bits(cpu_addr
+ size
- 1));
173 dw_pcie_writel_ob_unroll(pci
, index
, PCIE_ATU_UNR_LOWER_TARGET
,
174 lower_32_bits(pci_addr
));
175 dw_pcie_writel_ob_unroll(pci
, index
, PCIE_ATU_UNR_UPPER_TARGET
,
176 upper_32_bits(pci_addr
));
177 dw_pcie_writel_ob_unroll(pci
, index
, PCIE_ATU_UNR_REGION_CTRL1
,
179 dw_pcie_writel_ob_unroll(pci
, index
, PCIE_ATU_UNR_REGION_CTRL2
,
183 * Make sure ATU enable takes effect before any subsequent config
186 for (retries
= 0; retries
< LINK_WAIT_MAX_IATU_RETRIES
; retries
++) {
187 val
= dw_pcie_readl_ob_unroll(pci
, index
,
188 PCIE_ATU_UNR_REGION_CTRL2
);
189 if (val
& PCIE_ATU_ENABLE
)
192 mdelay(LINK_WAIT_IATU
);
194 dev_err(pci
->dev
, "Outbound iATU is not being enabled\n");
197 void dw_pcie_prog_outbound_atu(struct dw_pcie
*pci
, int index
, int type
,
198 u64 cpu_addr
, u64 pci_addr
, u32 size
)
202 if (pci
->ops
->cpu_addr_fixup
)
203 cpu_addr
= pci
->ops
->cpu_addr_fixup(pci
, cpu_addr
);
205 if (pci
->iatu_unroll_enabled
) {
206 dw_pcie_prog_outbound_atu_unroll(pci
, index
, type
, cpu_addr
,
211 dw_pcie_writel_dbi(pci
, PCIE_ATU_VIEWPORT
,
212 PCIE_ATU_REGION_OUTBOUND
| index
);
213 dw_pcie_writel_dbi(pci
, PCIE_ATU_LOWER_BASE
,
214 lower_32_bits(cpu_addr
));
215 dw_pcie_writel_dbi(pci
, PCIE_ATU_UPPER_BASE
,
216 upper_32_bits(cpu_addr
));
217 dw_pcie_writel_dbi(pci
, PCIE_ATU_LIMIT
,
218 lower_32_bits(cpu_addr
+ size
- 1));
219 dw_pcie_writel_dbi(pci
, PCIE_ATU_LOWER_TARGET
,
220 lower_32_bits(pci_addr
));
221 dw_pcie_writel_dbi(pci
, PCIE_ATU_UPPER_TARGET
,
222 upper_32_bits(pci_addr
));
223 dw_pcie_writel_dbi(pci
, PCIE_ATU_CR1
, type
);
224 dw_pcie_writel_dbi(pci
, PCIE_ATU_CR2
, PCIE_ATU_ENABLE
);
227 * Make sure ATU enable takes effect before any subsequent config
230 for (retries
= 0; retries
< LINK_WAIT_MAX_IATU_RETRIES
; retries
++) {
231 val
= dw_pcie_readl_dbi(pci
, PCIE_ATU_CR2
);
232 if (val
& PCIE_ATU_ENABLE
)
235 mdelay(LINK_WAIT_IATU
);
237 dev_err(pci
->dev
, "Outbound iATU is not being enabled\n");
240 static u32
dw_pcie_readl_ib_unroll(struct dw_pcie
*pci
, u32 index
, u32 reg
)
242 u32 offset
= PCIE_GET_ATU_INB_UNR_REG_OFFSET(index
);
244 return dw_pcie_readl_atu(pci
, offset
+ reg
);
247 static void dw_pcie_writel_ib_unroll(struct dw_pcie
*pci
, u32 index
, u32 reg
,
250 u32 offset
= PCIE_GET_ATU_INB_UNR_REG_OFFSET(index
);
252 dw_pcie_writel_atu(pci
, offset
+ reg
, val
);
255 static int dw_pcie_prog_inbound_atu_unroll(struct dw_pcie
*pci
, int index
,
256 int bar
, u64 cpu_addr
,
257 enum dw_pcie_as_type as_type
)
262 dw_pcie_writel_ib_unroll(pci
, index
, PCIE_ATU_UNR_LOWER_TARGET
,
263 lower_32_bits(cpu_addr
));
264 dw_pcie_writel_ib_unroll(pci
, index
, PCIE_ATU_UNR_UPPER_TARGET
,
265 upper_32_bits(cpu_addr
));
269 type
= PCIE_ATU_TYPE_MEM
;
272 type
= PCIE_ATU_TYPE_IO
;
278 dw_pcie_writel_ib_unroll(pci
, index
, PCIE_ATU_UNR_REGION_CTRL1
, type
);
279 dw_pcie_writel_ib_unroll(pci
, index
, PCIE_ATU_UNR_REGION_CTRL2
,
281 PCIE_ATU_BAR_MODE_ENABLE
| (bar
<< 8));
284 * Make sure ATU enable takes effect before any subsequent config
287 for (retries
= 0; retries
< LINK_WAIT_MAX_IATU_RETRIES
; retries
++) {
288 val
= dw_pcie_readl_ib_unroll(pci
, index
,
289 PCIE_ATU_UNR_REGION_CTRL2
);
290 if (val
& PCIE_ATU_ENABLE
)
293 mdelay(LINK_WAIT_IATU
);
295 dev_err(pci
->dev
, "Inbound iATU is not being enabled\n");
300 int dw_pcie_prog_inbound_atu(struct dw_pcie
*pci
, int index
, int bar
,
301 u64 cpu_addr
, enum dw_pcie_as_type as_type
)
306 if (pci
->iatu_unroll_enabled
)
307 return dw_pcie_prog_inbound_atu_unroll(pci
, index
, bar
,
310 dw_pcie_writel_dbi(pci
, PCIE_ATU_VIEWPORT
, PCIE_ATU_REGION_INBOUND
|
312 dw_pcie_writel_dbi(pci
, PCIE_ATU_LOWER_TARGET
, lower_32_bits(cpu_addr
));
313 dw_pcie_writel_dbi(pci
, PCIE_ATU_UPPER_TARGET
, upper_32_bits(cpu_addr
));
317 type
= PCIE_ATU_TYPE_MEM
;
320 type
= PCIE_ATU_TYPE_IO
;
326 dw_pcie_writel_dbi(pci
, PCIE_ATU_CR1
, type
);
327 dw_pcie_writel_dbi(pci
, PCIE_ATU_CR2
, PCIE_ATU_ENABLE
328 | PCIE_ATU_BAR_MODE_ENABLE
| (bar
<< 8));
331 * Make sure ATU enable takes effect before any subsequent config
334 for (retries
= 0; retries
< LINK_WAIT_MAX_IATU_RETRIES
; retries
++) {
335 val
= dw_pcie_readl_dbi(pci
, PCIE_ATU_CR2
);
336 if (val
& PCIE_ATU_ENABLE
)
339 mdelay(LINK_WAIT_IATU
);
341 dev_err(pci
->dev
, "Inbound iATU is not being enabled\n");
346 void dw_pcie_disable_atu(struct dw_pcie
*pci
, int index
,
347 enum dw_pcie_region_type type
)
352 case DW_PCIE_REGION_INBOUND
:
353 region
= PCIE_ATU_REGION_INBOUND
;
355 case DW_PCIE_REGION_OUTBOUND
:
356 region
= PCIE_ATU_REGION_OUTBOUND
;
362 dw_pcie_writel_dbi(pci
, PCIE_ATU_VIEWPORT
, region
| index
);
363 dw_pcie_writel_dbi(pci
, PCIE_ATU_CR2
, (u32
)~PCIE_ATU_ENABLE
);
366 int dw_pcie_wait_for_link(struct dw_pcie
*pci
)
370 /* Check if the link is up or not */
371 for (retries
= 0; retries
< LINK_WAIT_MAX_RETRIES
; retries
++) {
372 if (dw_pcie_link_up(pci
)) {
373 dev_info(pci
->dev
, "Link up\n");
376 usleep_range(LINK_WAIT_USLEEP_MIN
, LINK_WAIT_USLEEP_MAX
);
379 dev_err(pci
->dev
, "Phy link never came up\n");
384 int dw_pcie_link_up(struct dw_pcie
*pci
)
388 if (pci
->ops
->link_up
)
389 return pci
->ops
->link_up(pci
);
391 val
= readl(pci
->dbi_base
+ PCIE_PORT_DEBUG1
);
392 return ((val
& PCIE_PORT_DEBUG1_LINK_UP
) &&
393 (!(val
& PCIE_PORT_DEBUG1_LINK_IN_TRAINING
)));
396 static u8
dw_pcie_iatu_unroll_enabled(struct dw_pcie
*pci
)
400 val
= dw_pcie_readl_dbi(pci
, PCIE_ATU_VIEWPORT
);
401 if (val
== 0xffffffff)
407 void dw_pcie_setup(struct dw_pcie
*pci
)
412 struct device
*dev
= pci
->dev
;
413 struct device_node
*np
= dev
->of_node
;
415 if (pci
->version
>= 0x480A || (!pci
->version
&&
416 dw_pcie_iatu_unroll_enabled(pci
))) {
417 pci
->iatu_unroll_enabled
= true;
419 pci
->atu_base
= pci
->dbi_base
+ DEFAULT_DBI_ATU_OFFSET
;
421 dev_dbg(pci
->dev
, "iATU unroll: %s\n", pci
->iatu_unroll_enabled
?
422 "enabled" : "disabled");
425 ret
= of_property_read_u32(np
, "num-lanes", &lanes
);
429 /* Set the number of lanes */
430 val
= dw_pcie_readl_dbi(pci
, PCIE_PORT_LINK_CONTROL
);
431 val
&= ~PORT_LINK_MODE_MASK
;
434 val
|= PORT_LINK_MODE_1_LANES
;
437 val
|= PORT_LINK_MODE_2_LANES
;
440 val
|= PORT_LINK_MODE_4_LANES
;
443 val
|= PORT_LINK_MODE_8_LANES
;
446 dev_err(pci
->dev
, "num-lanes %u: invalid value\n", lanes
);
449 dw_pcie_writel_dbi(pci
, PCIE_PORT_LINK_CONTROL
, val
);
451 /* Set link width speed control register */
452 val
= dw_pcie_readl_dbi(pci
, PCIE_LINK_WIDTH_SPEED_CONTROL
);
453 val
&= ~PORT_LOGIC_LINK_WIDTH_MASK
;
456 val
|= PORT_LOGIC_LINK_WIDTH_1_LANES
;
459 val
|= PORT_LOGIC_LINK_WIDTH_2_LANES
;
462 val
|= PORT_LOGIC_LINK_WIDTH_4_LANES
;
465 val
|= PORT_LOGIC_LINK_WIDTH_8_LANES
;
468 dw_pcie_writel_dbi(pci
, PCIE_LINK_WIDTH_SPEED_CONTROL
, val
);