1 // SPDX-License-Identifier: GPL-2.0
3 * PCIe host controller driver for Intel Gateway SoCs
5 * Copyright (c) 2019 Intel Corporation.
8 #include <linux/bitfield.h>
10 #include <linux/gpio/consumer.h>
11 #include <linux/iopoll.h>
12 #include <linux/mod_devicetable.h>
13 #include <linux/pci_regs.h>
14 #include <linux/phy/phy.h>
15 #include <linux/platform_device.h>
16 #include <linux/property.h>
17 #include <linux/reset.h>
19 #include "../../pci.h"
20 #include "pcie-designware.h"
22 #define PORT_AFR_N_FTS_GEN12_DFT (SZ_128 - 1)
23 #define PORT_AFR_N_FTS_GEN3 180
24 #define PORT_AFR_N_FTS_GEN4 196
26 /* PCIe Application logic Registers */
27 #define PCIE_APP_CCR 0x10
28 #define PCIE_APP_CCR_LTSSM_ENABLE BIT(0)
30 #define PCIE_APP_MSG_CR 0x30
31 #define PCIE_APP_MSG_XMT_PM_TURNOFF BIT(0)
33 #define PCIE_APP_PMC 0x44
34 #define PCIE_APP_PMC_IN_L2 BIT(20)
36 #define PCIE_APP_IRNEN 0xF4
37 #define PCIE_APP_IRNCR 0xF8
38 #define PCIE_APP_IRN_AER_REPORT BIT(0)
39 #define PCIE_APP_IRN_PME BIT(2)
40 #define PCIE_APP_IRN_RX_VDM_MSG BIT(4)
41 #define PCIE_APP_IRN_PM_TO_ACK BIT(9)
42 #define PCIE_APP_IRN_LINK_AUTO_BW_STAT BIT(11)
43 #define PCIE_APP_IRN_BW_MGT BIT(12)
44 #define PCIE_APP_IRN_INTA BIT(13)
45 #define PCIE_APP_IRN_INTB BIT(14)
46 #define PCIE_APP_IRN_INTC BIT(15)
47 #define PCIE_APP_IRN_INTD BIT(16)
48 #define PCIE_APP_IRN_MSG_LTR BIT(18)
49 #define PCIE_APP_IRN_SYS_ERR_RC BIT(29)
50 #define PCIE_APP_INTX_OFST 12
52 #define PCIE_APP_IRN_INT \
53 (PCIE_APP_IRN_AER_REPORT | PCIE_APP_IRN_PME | \
54 PCIE_APP_IRN_RX_VDM_MSG | PCIE_APP_IRN_SYS_ERR_RC | \
55 PCIE_APP_IRN_PM_TO_ACK | PCIE_APP_IRN_MSG_LTR | \
56 PCIE_APP_IRN_BW_MGT | PCIE_APP_IRN_LINK_AUTO_BW_STAT | \
57 PCIE_APP_IRN_INTA | PCIE_APP_IRN_INTB | \
58 PCIE_APP_IRN_INTC | PCIE_APP_IRN_INTD)
60 #define BUS_IATU_OFFSET SZ_256M
61 #define RESET_INTERVAL_MS 100
65 void __iomem
*app_base
;
66 struct gpio_desc
*reset_gpio
;
69 struct reset_control
*core_rst
;
73 static void pcie_update_bits(void __iomem
*base
, u32 ofs
, u32 mask
, u32 val
)
77 old
= readl(base
+ ofs
);
78 val
= (old
& ~mask
) | (val
& mask
);
81 writel(val
, base
+ ofs
);
84 static inline void pcie_app_wr(struct intel_pcie
*pcie
, u32 ofs
, u32 val
)
86 writel(val
, pcie
->app_base
+ ofs
);
89 static void pcie_app_wr_mask(struct intel_pcie
*pcie
, u32 ofs
,
92 pcie_update_bits(pcie
->app_base
, ofs
, mask
, val
);
95 static inline u32
pcie_rc_cfg_rd(struct intel_pcie
*pcie
, u32 ofs
)
97 return dw_pcie_readl_dbi(&pcie
->pci
, ofs
);
100 static inline void pcie_rc_cfg_wr(struct intel_pcie
*pcie
, u32 ofs
, u32 val
)
102 dw_pcie_writel_dbi(&pcie
->pci
, ofs
, val
);
105 static void pcie_rc_cfg_wr_mask(struct intel_pcie
*pcie
, u32 ofs
,
108 pcie_update_bits(pcie
->pci
.dbi_base
, ofs
, mask
, val
);
111 static void intel_pcie_ltssm_enable(struct intel_pcie
*pcie
)
113 pcie_app_wr_mask(pcie
, PCIE_APP_CCR
, PCIE_APP_CCR_LTSSM_ENABLE
,
114 PCIE_APP_CCR_LTSSM_ENABLE
);
117 static void intel_pcie_ltssm_disable(struct intel_pcie
*pcie
)
119 pcie_app_wr_mask(pcie
, PCIE_APP_CCR
, PCIE_APP_CCR_LTSSM_ENABLE
, 0);
122 static void intel_pcie_link_setup(struct intel_pcie
*pcie
)
125 u8 offset
= dw_pcie_find_capability(&pcie
->pci
, PCI_CAP_ID_EXP
);
127 val
= pcie_rc_cfg_rd(pcie
, offset
+ PCI_EXP_LNKCTL
);
129 val
&= ~(PCI_EXP_LNKCTL_LD
| PCI_EXP_LNKCTL_ASPMC
);
130 pcie_rc_cfg_wr(pcie
, offset
+ PCI_EXP_LNKCTL
, val
);
133 static void intel_pcie_init_n_fts(struct dw_pcie
*pci
)
135 switch (pci
->max_link_speed
) {
137 pci
->n_fts
[1] = PORT_AFR_N_FTS_GEN3
;
140 pci
->n_fts
[1] = PORT_AFR_N_FTS_GEN4
;
143 pci
->n_fts
[1] = PORT_AFR_N_FTS_GEN12_DFT
;
146 pci
->n_fts
[0] = PORT_AFR_N_FTS_GEN12_DFT
;
149 static int intel_pcie_ep_rst_init(struct intel_pcie
*pcie
)
151 struct device
*dev
= pcie
->pci
.dev
;
154 pcie
->reset_gpio
= devm_gpiod_get(dev
, "reset", GPIOD_OUT_LOW
);
155 if (IS_ERR(pcie
->reset_gpio
)) {
156 ret
= PTR_ERR(pcie
->reset_gpio
);
157 if (ret
!= -EPROBE_DEFER
)
158 dev_err(dev
, "Failed to request PCIe GPIO: %d\n", ret
);
162 /* Make initial reset last for 100us */
163 usleep_range(100, 200);
168 static void intel_pcie_core_rst_assert(struct intel_pcie
*pcie
)
170 reset_control_assert(pcie
->core_rst
);
173 static void intel_pcie_core_rst_deassert(struct intel_pcie
*pcie
)
176 * One micro-second delay to make sure the reset pulse
177 * wide enough so that core reset is clean.
180 reset_control_deassert(pcie
->core_rst
);
183 * Some SoC core reset also reset PHY, more delay needed
184 * to make sure the reset process is done.
186 usleep_range(1000, 2000);
189 static void intel_pcie_device_rst_assert(struct intel_pcie
*pcie
)
191 gpiod_set_value_cansleep(pcie
->reset_gpio
, 1);
194 static void intel_pcie_device_rst_deassert(struct intel_pcie
*pcie
)
196 msleep(pcie
->rst_intrvl
);
197 gpiod_set_value_cansleep(pcie
->reset_gpio
, 0);
200 static void intel_pcie_core_irq_disable(struct intel_pcie
*pcie
)
202 pcie_app_wr(pcie
, PCIE_APP_IRNEN
, 0);
203 pcie_app_wr(pcie
, PCIE_APP_IRNCR
, PCIE_APP_IRN_INT
);
206 static int intel_pcie_get_resources(struct platform_device
*pdev
)
208 struct intel_pcie
*pcie
= platform_get_drvdata(pdev
);
209 struct dw_pcie
*pci
= &pcie
->pci
;
210 struct device
*dev
= pci
->dev
;
213 pcie
->core_clk
= devm_clk_get(dev
, NULL
);
214 if (IS_ERR(pcie
->core_clk
)) {
215 ret
= PTR_ERR(pcie
->core_clk
);
216 if (ret
!= -EPROBE_DEFER
)
217 dev_err(dev
, "Failed to get clks: %d\n", ret
);
221 pcie
->core_rst
= devm_reset_control_get(dev
, NULL
);
222 if (IS_ERR(pcie
->core_rst
)) {
223 ret
= PTR_ERR(pcie
->core_rst
);
224 if (ret
!= -EPROBE_DEFER
)
225 dev_err(dev
, "Failed to get resets: %d\n", ret
);
229 ret
= device_property_read_u32(dev
, "reset-assert-ms",
232 pcie
->rst_intrvl
= RESET_INTERVAL_MS
;
234 pcie
->app_base
= devm_platform_ioremap_resource_byname(pdev
, "app");
235 if (IS_ERR(pcie
->app_base
))
236 return PTR_ERR(pcie
->app_base
);
238 pcie
->phy
= devm_phy_get(dev
, "pcie");
239 if (IS_ERR(pcie
->phy
)) {
240 ret
= PTR_ERR(pcie
->phy
);
241 if (ret
!= -EPROBE_DEFER
)
242 dev_err(dev
, "Couldn't get pcie-phy: %d\n", ret
);
249 static int intel_pcie_wait_l2(struct intel_pcie
*pcie
)
253 struct dw_pcie
*pci
= &pcie
->pci
;
255 if (pci
->max_link_speed
< 3)
258 /* Send PME_TURN_OFF message */
259 pcie_app_wr_mask(pcie
, PCIE_APP_MSG_CR
, PCIE_APP_MSG_XMT_PM_TURNOFF
,
260 PCIE_APP_MSG_XMT_PM_TURNOFF
);
262 /* Read PMC status and wait for falling into L2 link state */
263 ret
= readl_poll_timeout(pcie
->app_base
+ PCIE_APP_PMC
, value
,
264 value
& PCIE_APP_PMC_IN_L2
, 20,
265 jiffies_to_usecs(5 * HZ
));
267 dev_err(pcie
->pci
.dev
, "PCIe link enter L2 timeout!\n");
272 static void intel_pcie_turn_off(struct intel_pcie
*pcie
)
274 if (dw_pcie_link_up(&pcie
->pci
))
275 intel_pcie_wait_l2(pcie
);
277 /* Put endpoint device in reset state */
278 intel_pcie_device_rst_assert(pcie
);
279 pcie_rc_cfg_wr_mask(pcie
, PCI_COMMAND
, PCI_COMMAND_MEMORY
, 0);
282 static int intel_pcie_host_setup(struct intel_pcie
*pcie
)
285 struct dw_pcie
*pci
= &pcie
->pci
;
287 intel_pcie_core_rst_assert(pcie
);
288 intel_pcie_device_rst_assert(pcie
);
290 ret
= phy_init(pcie
->phy
);
294 intel_pcie_core_rst_deassert(pcie
);
296 ret
= clk_prepare_enable(pcie
->core_clk
);
298 dev_err(pcie
->pci
.dev
, "Core clock enable failed: %d\n", ret
);
302 pci
->atu_base
= pci
->dbi_base
+ 0xC0000;
304 intel_pcie_ltssm_disable(pcie
);
305 intel_pcie_link_setup(pcie
);
306 intel_pcie_init_n_fts(pci
);
308 ret
= dw_pcie_setup_rc(&pci
->pp
);
312 dw_pcie_upconfig_setup(pci
);
314 intel_pcie_device_rst_deassert(pcie
);
315 intel_pcie_ltssm_enable(pcie
);
317 ret
= dw_pcie_wait_for_link(pci
);
321 /* Enable integrated interrupts */
322 pcie_app_wr_mask(pcie
, PCIE_APP_IRNEN
, PCIE_APP_IRN_INT
,
328 clk_disable_unprepare(pcie
->core_clk
);
330 intel_pcie_core_rst_assert(pcie
);
336 static void __intel_pcie_remove(struct intel_pcie
*pcie
)
338 intel_pcie_core_irq_disable(pcie
);
339 intel_pcie_turn_off(pcie
);
340 clk_disable_unprepare(pcie
->core_clk
);
341 intel_pcie_core_rst_assert(pcie
);
345 static void intel_pcie_remove(struct platform_device
*pdev
)
347 struct intel_pcie
*pcie
= platform_get_drvdata(pdev
);
348 struct dw_pcie_rp
*pp
= &pcie
->pci
.pp
;
350 dw_pcie_host_deinit(pp
);
351 __intel_pcie_remove(pcie
);
354 static int intel_pcie_suspend_noirq(struct device
*dev
)
356 struct intel_pcie
*pcie
= dev_get_drvdata(dev
);
359 intel_pcie_core_irq_disable(pcie
);
360 ret
= intel_pcie_wait_l2(pcie
);
365 clk_disable_unprepare(pcie
->core_clk
);
369 static int intel_pcie_resume_noirq(struct device
*dev
)
371 struct intel_pcie
*pcie
= dev_get_drvdata(dev
);
373 return intel_pcie_host_setup(pcie
);
376 static int intel_pcie_rc_init(struct dw_pcie_rp
*pp
)
378 struct dw_pcie
*pci
= to_dw_pcie_from_pp(pp
);
379 struct intel_pcie
*pcie
= dev_get_drvdata(pci
->dev
);
381 return intel_pcie_host_setup(pcie
);
384 static u64
intel_pcie_cpu_addr(struct dw_pcie
*pcie
, u64 cpu_addr
)
386 return cpu_addr
+ BUS_IATU_OFFSET
;
389 static const struct dw_pcie_ops intel_pcie_ops
= {
390 .cpu_addr_fixup
= intel_pcie_cpu_addr
,
393 static const struct dw_pcie_host_ops intel_pcie_dw_ops
= {
394 .init
= intel_pcie_rc_init
,
397 static int intel_pcie_probe(struct platform_device
*pdev
)
399 struct device
*dev
= &pdev
->dev
;
400 struct intel_pcie
*pcie
;
401 struct dw_pcie_rp
*pp
;
405 pcie
= devm_kzalloc(dev
, sizeof(*pcie
), GFP_KERNEL
);
409 platform_set_drvdata(pdev
, pcie
);
414 ret
= intel_pcie_get_resources(pdev
);
418 ret
= intel_pcie_ep_rst_init(pcie
);
422 pci
->ops
= &intel_pcie_ops
;
423 pp
->ops
= &intel_pcie_dw_ops
;
425 ret
= dw_pcie_host_init(pp
);
427 dev_err(dev
, "Cannot initialize host\n");
434 static const struct dev_pm_ops intel_pcie_pm_ops
= {
435 NOIRQ_SYSTEM_SLEEP_PM_OPS(intel_pcie_suspend_noirq
,
436 intel_pcie_resume_noirq
)
439 static const struct of_device_id of_intel_pcie_match
[] = {
440 { .compatible
= "intel,lgm-pcie" },
444 static struct platform_driver intel_pcie_driver
= {
445 .probe
= intel_pcie_probe
,
446 .remove
= intel_pcie_remove
,
448 .name
= "intel-gw-pcie",
449 .of_match_table
= of_intel_pcie_match
,
450 .pm
= &intel_pcie_pm_ops
,
453 builtin_platform_driver(intel_pcie_driver
);