1 // SPDX-License-Identifier: GPL-2.0+
3 * Rockchip AXI PCIe host controller driver
5 * Copyright (c) 2016 Rockchip, Inc.
7 * Author: Shawn Lin <shawn.lin@rock-chips.com>
8 * Wenrui Li <wenrui.li@rock-chips.com>
10 * Bits taken from Synopsys DesignWare Host controller driver and
11 * ARM PCI Host generic driver.
14 #include <linux/clk.h>
15 #include <linux/delay.h>
16 #include <linux/gpio/consumer.h>
17 #include <linux/iopoll.h>
19 #include <linux/of_pci.h>
20 #include <linux/phy/phy.h>
21 #include <linux/platform_device.h>
22 #include <linux/reset.h>
25 #include "pcie-rockchip.h"
27 int rockchip_pcie_parse_dt(struct rockchip_pcie
*rockchip
)
29 struct device
*dev
= rockchip
->dev
;
30 struct platform_device
*pdev
= to_platform_device(dev
);
31 struct device_node
*node
= dev
->of_node
;
32 struct resource
*regs
;
35 if (rockchip
->is_rc
) {
36 regs
= platform_get_resource_byname(pdev
,
39 rockchip
->reg_base
= devm_pci_remap_cfg_resource(dev
, regs
);
40 if (IS_ERR(rockchip
->reg_base
))
41 return PTR_ERR(rockchip
->reg_base
);
44 platform_get_resource_byname(pdev
, IORESOURCE_MEM
,
46 if (!rockchip
->mem_res
)
51 devm_platform_ioremap_resource_byname(pdev
, "apb-base");
52 if (IS_ERR(rockchip
->apb_base
))
53 return PTR_ERR(rockchip
->apb_base
);
55 err
= rockchip_pcie_get_phys(rockchip
);
60 err
= of_property_read_u32(node
, "num-lanes", &rockchip
->lanes
);
61 if (!err
&& (rockchip
->lanes
== 0 ||
62 rockchip
->lanes
== 3 ||
63 rockchip
->lanes
> 4)) {
64 dev_warn(dev
, "invalid num-lanes, default to use one lane\n");
68 rockchip
->link_gen
= of_pci_get_max_link_speed(node
);
69 if (rockchip
->link_gen
< 0 || rockchip
->link_gen
> 2)
70 rockchip
->link_gen
= 2;
72 rockchip
->core_rst
= devm_reset_control_get_exclusive(dev
, "core");
73 if (IS_ERR(rockchip
->core_rst
)) {
74 if (PTR_ERR(rockchip
->core_rst
) != -EPROBE_DEFER
)
75 dev_err(dev
, "missing core reset property in node\n");
76 return PTR_ERR(rockchip
->core_rst
);
79 rockchip
->mgmt_rst
= devm_reset_control_get_exclusive(dev
, "mgmt");
80 if (IS_ERR(rockchip
->mgmt_rst
)) {
81 if (PTR_ERR(rockchip
->mgmt_rst
) != -EPROBE_DEFER
)
82 dev_err(dev
, "missing mgmt reset property in node\n");
83 return PTR_ERR(rockchip
->mgmt_rst
);
86 rockchip
->mgmt_sticky_rst
= devm_reset_control_get_exclusive(dev
,
88 if (IS_ERR(rockchip
->mgmt_sticky_rst
)) {
89 if (PTR_ERR(rockchip
->mgmt_sticky_rst
) != -EPROBE_DEFER
)
90 dev_err(dev
, "missing mgmt-sticky reset property in node\n");
91 return PTR_ERR(rockchip
->mgmt_sticky_rst
);
94 rockchip
->pipe_rst
= devm_reset_control_get_exclusive(dev
, "pipe");
95 if (IS_ERR(rockchip
->pipe_rst
)) {
96 if (PTR_ERR(rockchip
->pipe_rst
) != -EPROBE_DEFER
)
97 dev_err(dev
, "missing pipe reset property in node\n");
98 return PTR_ERR(rockchip
->pipe_rst
);
101 rockchip
->pm_rst
= devm_reset_control_get_exclusive(dev
, "pm");
102 if (IS_ERR(rockchip
->pm_rst
)) {
103 if (PTR_ERR(rockchip
->pm_rst
) != -EPROBE_DEFER
)
104 dev_err(dev
, "missing pm reset property in node\n");
105 return PTR_ERR(rockchip
->pm_rst
);
108 rockchip
->pclk_rst
= devm_reset_control_get_exclusive(dev
, "pclk");
109 if (IS_ERR(rockchip
->pclk_rst
)) {
110 if (PTR_ERR(rockchip
->pclk_rst
) != -EPROBE_DEFER
)
111 dev_err(dev
, "missing pclk reset property in node\n");
112 return PTR_ERR(rockchip
->pclk_rst
);
115 rockchip
->aclk_rst
= devm_reset_control_get_exclusive(dev
, "aclk");
116 if (IS_ERR(rockchip
->aclk_rst
)) {
117 if (PTR_ERR(rockchip
->aclk_rst
) != -EPROBE_DEFER
)
118 dev_err(dev
, "missing aclk reset property in node\n");
119 return PTR_ERR(rockchip
->aclk_rst
);
123 rockchip
->perst_gpio
= devm_gpiod_get_optional(dev
, "ep",
126 rockchip
->perst_gpio
= devm_gpiod_get_optional(dev
, "reset",
128 if (IS_ERR(rockchip
->perst_gpio
))
129 return dev_err_probe(dev
, PTR_ERR(rockchip
->perst_gpio
),
130 "failed to get PERST# GPIO\n");
132 rockchip
->aclk_pcie
= devm_clk_get(dev
, "aclk");
133 if (IS_ERR(rockchip
->aclk_pcie
)) {
134 dev_err(dev
, "aclk clock not found\n");
135 return PTR_ERR(rockchip
->aclk_pcie
);
138 rockchip
->aclk_perf_pcie
= devm_clk_get(dev
, "aclk-perf");
139 if (IS_ERR(rockchip
->aclk_perf_pcie
)) {
140 dev_err(dev
, "aclk_perf clock not found\n");
141 return PTR_ERR(rockchip
->aclk_perf_pcie
);
144 rockchip
->hclk_pcie
= devm_clk_get(dev
, "hclk");
145 if (IS_ERR(rockchip
->hclk_pcie
)) {
146 dev_err(dev
, "hclk clock not found\n");
147 return PTR_ERR(rockchip
->hclk_pcie
);
150 rockchip
->clk_pcie_pm
= devm_clk_get(dev
, "pm");
151 if (IS_ERR(rockchip
->clk_pcie_pm
)) {
152 dev_err(dev
, "pm clock not found\n");
153 return PTR_ERR(rockchip
->clk_pcie_pm
);
158 EXPORT_SYMBOL_GPL(rockchip_pcie_parse_dt
);
160 #define rockchip_pcie_read_addr(addr) rockchip_pcie_read(rockchip, addr)
161 /* 100 ms max wait time for PHY PLLs to lock */
162 #define RK_PHY_PLL_LOCK_TIMEOUT_US 100000
163 /* Sleep should be less than 20ms */
164 #define RK_PHY_PLL_LOCK_SLEEP_US 1000
166 int rockchip_pcie_init_port(struct rockchip_pcie
*rockchip
)
168 struct device
*dev
= rockchip
->dev
;
172 err
= reset_control_assert(rockchip
->aclk_rst
);
174 dev_err(dev
, "assert aclk_rst err %d\n", err
);
178 err
= reset_control_assert(rockchip
->pclk_rst
);
180 dev_err(dev
, "assert pclk_rst err %d\n", err
);
184 err
= reset_control_assert(rockchip
->pm_rst
);
186 dev_err(dev
, "assert pm_rst err %d\n", err
);
190 for (i
= 0; i
< MAX_LANE_NUM
; i
++) {
191 err
= phy_init(rockchip
->phys
[i
]);
193 dev_err(dev
, "init phy%d err %d\n", i
, err
);
198 err
= reset_control_assert(rockchip
->core_rst
);
200 dev_err(dev
, "assert core_rst err %d\n", err
);
204 err
= reset_control_assert(rockchip
->mgmt_rst
);
206 dev_err(dev
, "assert mgmt_rst err %d\n", err
);
210 err
= reset_control_assert(rockchip
->mgmt_sticky_rst
);
212 dev_err(dev
, "assert mgmt_sticky_rst err %d\n", err
);
216 err
= reset_control_assert(rockchip
->pipe_rst
);
218 dev_err(dev
, "assert pipe_rst err %d\n", err
);
224 err
= reset_control_deassert(rockchip
->pm_rst
);
226 dev_err(dev
, "deassert pm_rst err %d\n", err
);
230 err
= reset_control_deassert(rockchip
->aclk_rst
);
232 dev_err(dev
, "deassert aclk_rst err %d\n", err
);
236 err
= reset_control_deassert(rockchip
->pclk_rst
);
238 dev_err(dev
, "deassert pclk_rst err %d\n", err
);
242 if (rockchip
->link_gen
== 2)
243 rockchip_pcie_write(rockchip
, PCIE_CLIENT_GEN_SEL_2
,
246 rockchip_pcie_write(rockchip
, PCIE_CLIENT_GEN_SEL_1
,
249 regs
= PCIE_CLIENT_ARI_ENABLE
|
250 PCIE_CLIENT_CONF_LANE_NUM(rockchip
->lanes
);
253 regs
|= PCIE_CLIENT_LINK_TRAIN_ENABLE
|
254 PCIE_CLIENT_CONF_ENABLE
| PCIE_CLIENT_MODE_RC
;
256 regs
|= PCIE_CLIENT_CONF_DISABLE
| PCIE_CLIENT_MODE_EP
;
258 rockchip_pcie_write(rockchip
, regs
, PCIE_CLIENT_CONFIG
);
260 for (i
= 0; i
< MAX_LANE_NUM
; i
++) {
261 err
= phy_power_on(rockchip
->phys
[i
]);
263 dev_err(dev
, "power on phy%d err %d\n", i
, err
);
264 goto err_power_off_phy
;
268 err
= readx_poll_timeout(rockchip_pcie_read_addr
,
269 PCIE_CLIENT_SIDE_BAND_STATUS
,
270 regs
, !(regs
& PCIE_CLIENT_PHY_ST
),
271 RK_PHY_PLL_LOCK_SLEEP_US
,
272 RK_PHY_PLL_LOCK_TIMEOUT_US
);
274 dev_err(dev
, "PHY PLLs could not lock, %d\n", err
);
275 goto err_power_off_phy
;
279 * Please don't reorder the deassert sequence of the following
282 err
= reset_control_deassert(rockchip
->mgmt_sticky_rst
);
284 dev_err(dev
, "deassert mgmt_sticky_rst err %d\n", err
);
285 goto err_power_off_phy
;
288 err
= reset_control_deassert(rockchip
->core_rst
);
290 dev_err(dev
, "deassert core_rst err %d\n", err
);
291 goto err_power_off_phy
;
294 err
= reset_control_deassert(rockchip
->mgmt_rst
);
296 dev_err(dev
, "deassert mgmt_rst err %d\n", err
);
297 goto err_power_off_phy
;
300 err
= reset_control_deassert(rockchip
->pipe_rst
);
302 dev_err(dev
, "deassert pipe_rst err %d\n", err
);
303 goto err_power_off_phy
;
309 phy_power_off(rockchip
->phys
[i
]);
313 phy_exit(rockchip
->phys
[i
]);
316 EXPORT_SYMBOL_GPL(rockchip_pcie_init_port
);
318 int rockchip_pcie_get_phys(struct rockchip_pcie
*rockchip
)
320 struct device
*dev
= rockchip
->dev
;
325 phy
= devm_phy_get(dev
, "pcie-phy");
327 rockchip
->legacy_phy
= true;
328 rockchip
->phys
[0] = phy
;
329 dev_warn(dev
, "legacy phy model is deprecated!\n");
333 if (PTR_ERR(phy
) == -EPROBE_DEFER
)
336 dev_dbg(dev
, "missing legacy phy; search for per-lane PHY\n");
338 for (i
= 0; i
< MAX_LANE_NUM
; i
++) {
339 name
= kasprintf(GFP_KERNEL
, "pcie-phy-%u", i
);
343 phy
= devm_of_phy_get(dev
, dev
->of_node
, name
);
347 if (PTR_ERR(phy
) != -EPROBE_DEFER
)
348 dev_err(dev
, "missing phy for lane %d: %ld\n",
353 rockchip
->phys
[i
] = phy
;
358 EXPORT_SYMBOL_GPL(rockchip_pcie_get_phys
);
360 void rockchip_pcie_deinit_phys(struct rockchip_pcie
*rockchip
)
364 for (i
= 0; i
< MAX_LANE_NUM
; i
++) {
365 /* inactive lanes are already powered off */
366 if (rockchip
->lanes_map
& BIT(i
))
367 phy_power_off(rockchip
->phys
[i
]);
368 phy_exit(rockchip
->phys
[i
]);
371 EXPORT_SYMBOL_GPL(rockchip_pcie_deinit_phys
);
373 int rockchip_pcie_enable_clocks(struct rockchip_pcie
*rockchip
)
375 struct device
*dev
= rockchip
->dev
;
378 err
= clk_prepare_enable(rockchip
->aclk_pcie
);
380 dev_err(dev
, "unable to enable aclk_pcie clock\n");
384 err
= clk_prepare_enable(rockchip
->aclk_perf_pcie
);
386 dev_err(dev
, "unable to enable aclk_perf_pcie clock\n");
387 goto err_aclk_perf_pcie
;
390 err
= clk_prepare_enable(rockchip
->hclk_pcie
);
392 dev_err(dev
, "unable to enable hclk_pcie clock\n");
396 err
= clk_prepare_enable(rockchip
->clk_pcie_pm
);
398 dev_err(dev
, "unable to enable clk_pcie_pm clock\n");
399 goto err_clk_pcie_pm
;
405 clk_disable_unprepare(rockchip
->hclk_pcie
);
407 clk_disable_unprepare(rockchip
->aclk_perf_pcie
);
409 clk_disable_unprepare(rockchip
->aclk_pcie
);
412 EXPORT_SYMBOL_GPL(rockchip_pcie_enable_clocks
);
414 void rockchip_pcie_disable_clocks(void *data
)
416 struct rockchip_pcie
*rockchip
= data
;
418 clk_disable_unprepare(rockchip
->clk_pcie_pm
);
419 clk_disable_unprepare(rockchip
->hclk_pcie
);
420 clk_disable_unprepare(rockchip
->aclk_perf_pcie
);
421 clk_disable_unprepare(rockchip
->aclk_pcie
);
423 EXPORT_SYMBOL_GPL(rockchip_pcie_disable_clocks
);
425 void rockchip_pcie_cfg_configuration_accesses(
426 struct rockchip_pcie
*rockchip
, u32 type
)
430 /* Configuration Accesses for region 0 */
431 rockchip_pcie_write(rockchip
, 0x0, PCIE_RC_BAR_CONF
);
433 rockchip_pcie_write(rockchip
,
434 (RC_REGION_0_ADDR_TRANS_L
+ RC_REGION_0_PASS_BITS
),
435 PCIE_CORE_OB_REGION_ADDR0
);
436 rockchip_pcie_write(rockchip
, RC_REGION_0_ADDR_TRANS_H
,
437 PCIE_CORE_OB_REGION_ADDR1
);
438 ob_desc_0
= rockchip_pcie_read(rockchip
, PCIE_CORE_OB_REGION_DESC0
);
439 ob_desc_0
&= ~(RC_REGION_0_TYPE_MASK
);
440 ob_desc_0
|= (type
| (0x1 << 23));
441 rockchip_pcie_write(rockchip
, ob_desc_0
, PCIE_CORE_OB_REGION_DESC0
);
442 rockchip_pcie_write(rockchip
, 0x0, PCIE_CORE_OB_REGION_DESC1
);
444 EXPORT_SYMBOL_GPL(rockchip_pcie_cfg_configuration_accesses
);