1 // SPDX-License-Identifier: GPL-2.0+
3 * PCIe host controller driver for Tegra194 SoC
5 * Copyright (C) 2019 NVIDIA Corporation.
7 * Author: Vidya Sagar <vidyas@nvidia.com>
10 #include <linux/clk.h>
11 #include <linux/debugfs.h>
12 #include <linux/delay.h>
13 #include <linux/gpio.h>
14 #include <linux/interrupt.h>
15 #include <linux/iopoll.h>
16 #include <linux/kernel.h>
17 #include <linux/module.h>
19 #include <linux/of_device.h>
20 #include <linux/of_gpio.h>
21 #include <linux/of_irq.h>
22 #include <linux/of_pci.h>
23 #include <linux/pci.h>
24 #include <linux/phy/phy.h>
25 #include <linux/pinctrl/consumer.h>
26 #include <linux/platform_device.h>
27 #include <linux/pm_runtime.h>
28 #include <linux/random.h>
29 #include <linux/reset.h>
30 #include <linux/resource.h>
31 #include <linux/types.h>
32 #include "pcie-designware.h"
33 #include <soc/tegra/bpmp.h>
34 #include <soc/tegra/bpmp-abi.h>
35 #include "../../pci.h"
37 #define APPL_PINMUX 0x0
38 #define APPL_PINMUX_PEX_RST BIT(0)
39 #define APPL_PINMUX_CLKREQ_OVERRIDE_EN BIT(2)
40 #define APPL_PINMUX_CLKREQ_OVERRIDE BIT(3)
41 #define APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE_EN BIT(4)
42 #define APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE BIT(5)
45 #define APPL_CTRL_SYS_PRE_DET_STATE BIT(6)
46 #define APPL_CTRL_LTSSM_EN BIT(7)
47 #define APPL_CTRL_HW_HOT_RST_EN BIT(20)
48 #define APPL_CTRL_HW_HOT_RST_MODE_MASK GENMASK(1, 0)
49 #define APPL_CTRL_HW_HOT_RST_MODE_SHIFT 22
50 #define APPL_CTRL_HW_HOT_RST_MODE_IMDT_RST 0x1
52 #define APPL_INTR_EN_L0_0 0x8
53 #define APPL_INTR_EN_L0_0_LINK_STATE_INT_EN BIT(0)
54 #define APPL_INTR_EN_L0_0_MSI_RCV_INT_EN BIT(4)
55 #define APPL_INTR_EN_L0_0_INT_INT_EN BIT(8)
56 #define APPL_INTR_EN_L0_0_CDM_REG_CHK_INT_EN BIT(19)
57 #define APPL_INTR_EN_L0_0_SYS_INTR_EN BIT(30)
58 #define APPL_INTR_EN_L0_0_SYS_MSI_INTR_EN BIT(31)
60 #define APPL_INTR_STATUS_L0 0xC
61 #define APPL_INTR_STATUS_L0_LINK_STATE_INT BIT(0)
62 #define APPL_INTR_STATUS_L0_INT_INT BIT(8)
63 #define APPL_INTR_STATUS_L0_CDM_REG_CHK_INT BIT(18)
65 #define APPL_INTR_EN_L1_0_0 0x1C
66 #define APPL_INTR_EN_L1_0_0_LINK_REQ_RST_NOT_INT_EN BIT(1)
68 #define APPL_INTR_STATUS_L1_0_0 0x20
69 #define APPL_INTR_STATUS_L1_0_0_LINK_REQ_RST_NOT_CHGED BIT(1)
71 #define APPL_INTR_STATUS_L1_1 0x2C
72 #define APPL_INTR_STATUS_L1_2 0x30
73 #define APPL_INTR_STATUS_L1_3 0x34
74 #define APPL_INTR_STATUS_L1_6 0x3C
75 #define APPL_INTR_STATUS_L1_7 0x40
77 #define APPL_INTR_EN_L1_8_0 0x44
78 #define APPL_INTR_EN_L1_8_BW_MGT_INT_EN BIT(2)
79 #define APPL_INTR_EN_L1_8_AUTO_BW_INT_EN BIT(3)
80 #define APPL_INTR_EN_L1_8_INTX_EN BIT(11)
81 #define APPL_INTR_EN_L1_8_AER_INT_EN BIT(15)
83 #define APPL_INTR_STATUS_L1_8_0 0x4C
84 #define APPL_INTR_STATUS_L1_8_0_EDMA_INT_MASK GENMASK(11, 6)
85 #define APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS BIT(2)
86 #define APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS BIT(3)
88 #define APPL_INTR_STATUS_L1_9 0x54
89 #define APPL_INTR_STATUS_L1_10 0x58
90 #define APPL_INTR_STATUS_L1_11 0x64
91 #define APPL_INTR_STATUS_L1_13 0x74
92 #define APPL_INTR_STATUS_L1_14 0x78
93 #define APPL_INTR_STATUS_L1_15 0x7C
94 #define APPL_INTR_STATUS_L1_17 0x88
96 #define APPL_INTR_EN_L1_18 0x90
97 #define APPL_INTR_EN_L1_18_CDM_REG_CHK_CMPLT BIT(2)
98 #define APPL_INTR_EN_L1_18_CDM_REG_CHK_CMP_ERR BIT(1)
99 #define APPL_INTR_EN_L1_18_CDM_REG_CHK_LOGIC_ERR BIT(0)
101 #define APPL_INTR_STATUS_L1_18 0x94
102 #define APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMPLT BIT(2)
103 #define APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMP_ERR BIT(1)
104 #define APPL_INTR_STATUS_L1_18_CDM_REG_CHK_LOGIC_ERR BIT(0)
106 #define APPL_MSI_CTRL_2 0xB0
108 #define APPL_LTR_MSG_1 0xC4
109 #define LTR_MSG_REQ BIT(15)
110 #define LTR_MST_NO_SNOOP_SHIFT 16
112 #define APPL_LTR_MSG_2 0xC8
113 #define APPL_LTR_MSG_2_LTR_MSG_REQ_STATE BIT(3)
115 #define APPL_LINK_STATUS 0xCC
116 #define APPL_LINK_STATUS_RDLH_LINK_UP BIT(0)
118 #define APPL_DEBUG 0xD0
119 #define APPL_DEBUG_PM_LINKST_IN_L2_LAT BIT(21)
120 #define APPL_DEBUG_PM_LINKST_IN_L0 0x11
121 #define APPL_DEBUG_LTSSM_STATE_MASK GENMASK(8, 3)
122 #define APPL_DEBUG_LTSSM_STATE_SHIFT 3
123 #define LTSSM_STATE_PRE_DETECT 5
125 #define APPL_RADM_STATUS 0xE4
126 #define APPL_PM_XMT_TURNOFF_STATE BIT(0)
128 #define APPL_DM_TYPE 0x100
129 #define APPL_DM_TYPE_MASK GENMASK(3, 0)
130 #define APPL_DM_TYPE_RP 0x4
131 #define APPL_DM_TYPE_EP 0x0
133 #define APPL_CFG_BASE_ADDR 0x104
134 #define APPL_CFG_BASE_ADDR_MASK GENMASK(31, 12)
136 #define APPL_CFG_IATU_DMA_BASE_ADDR 0x108
137 #define APPL_CFG_IATU_DMA_BASE_ADDR_MASK GENMASK(31, 18)
139 #define APPL_CFG_MISC 0x110
140 #define APPL_CFG_MISC_SLV_EP_MODE BIT(14)
141 #define APPL_CFG_MISC_ARCACHE_MASK GENMASK(13, 10)
142 #define APPL_CFG_MISC_ARCACHE_SHIFT 10
143 #define APPL_CFG_MISC_ARCACHE_VAL 3
145 #define APPL_CFG_SLCG_OVERRIDE 0x114
146 #define APPL_CFG_SLCG_OVERRIDE_SLCG_EN_MASTER BIT(0)
148 #define APPL_CAR_RESET_OVRD 0x12C
149 #define APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N BIT(0)
151 #define IO_BASE_IO_DECODE BIT(0)
152 #define IO_BASE_IO_DECODE_BIT8 BIT(8)
154 #define CFG_PREF_MEM_LIMIT_BASE_MEM_DECODE BIT(0)
155 #define CFG_PREF_MEM_LIMIT_BASE_MEM_LIMIT_DECODE BIT(16)
157 #define CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF 0x718
158 #define CFG_TIMER_CTRL_ACK_NAK_SHIFT (19)
160 #define EVENT_COUNTER_ALL_CLEAR 0x3
161 #define EVENT_COUNTER_ENABLE_ALL 0x7
162 #define EVENT_COUNTER_ENABLE_SHIFT 2
163 #define EVENT_COUNTER_EVENT_SEL_MASK GENMASK(7, 0)
164 #define EVENT_COUNTER_EVENT_SEL_SHIFT 16
165 #define EVENT_COUNTER_EVENT_Tx_L0S 0x2
166 #define EVENT_COUNTER_EVENT_Rx_L0S 0x3
167 #define EVENT_COUNTER_EVENT_L1 0x5
168 #define EVENT_COUNTER_EVENT_L1_1 0x7
169 #define EVENT_COUNTER_EVENT_L1_2 0x8
170 #define EVENT_COUNTER_GROUP_SEL_SHIFT 24
171 #define EVENT_COUNTER_GROUP_5 0x5
173 #define PORT_LOGIC_ACK_F_ASPM_CTRL 0x70C
174 #define ENTER_ASPM BIT(30)
175 #define L0S_ENTRANCE_LAT_SHIFT 24
176 #define L0S_ENTRANCE_LAT_MASK GENMASK(26, 24)
177 #define L1_ENTRANCE_LAT_SHIFT 27
178 #define L1_ENTRANCE_LAT_MASK GENMASK(29, 27)
179 #define N_FTS_SHIFT 8
180 #define N_FTS_MASK GENMASK(7, 0)
183 #define PORT_LOGIC_GEN2_CTRL 0x80C
184 #define PORT_LOGIC_GEN2_CTRL_DIRECT_SPEED_CHANGE BIT(17)
185 #define FTS_MASK GENMASK(7, 0)
188 #define PORT_LOGIC_MSI_CTRL_INT_0_EN 0x828
190 #define GEN3_EQ_CONTROL_OFF 0x8a8
191 #define GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_SHIFT 8
192 #define GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_MASK GENMASK(23, 8)
193 #define GEN3_EQ_CONTROL_OFF_FB_MODE_MASK GENMASK(3, 0)
195 #define GEN3_RELATED_OFF 0x890
196 #define GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL BIT(0)
197 #define GEN3_RELATED_OFF_GEN3_EQ_DISABLE BIT(16)
198 #define GEN3_RELATED_OFF_RATE_SHADOW_SEL_SHIFT 24
199 #define GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK GENMASK(25, 24)
201 #define PORT_LOGIC_AMBA_ERROR_RESPONSE_DEFAULT 0x8D0
202 #define AMBA_ERROR_RESPONSE_CRS_SHIFT 3
203 #define AMBA_ERROR_RESPONSE_CRS_MASK GENMASK(1, 0)
204 #define AMBA_ERROR_RESPONSE_CRS_OKAY 0
205 #define AMBA_ERROR_RESPONSE_CRS_OKAY_FFFFFFFF 1
206 #define AMBA_ERROR_RESPONSE_CRS_OKAY_FFFF0001 2
208 #define PORT_LOGIC_MSIX_DOORBELL 0x948
210 #define CAP_SPCIE_CAP_OFF 0x154
211 #define CAP_SPCIE_CAP_OFF_DSP_TX_PRESET0_MASK GENMASK(3, 0)
212 #define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_MASK GENMASK(11, 8)
213 #define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_SHIFT 8
215 #define PME_ACK_TIMEOUT 10000
217 #define LTSSM_TIMEOUT 50000 /* 50ms */
219 #define GEN3_GEN4_EQ_PRESET_INIT 5
221 #define GEN1_CORE_CLK_FREQ 62500000
222 #define GEN2_CORE_CLK_FREQ 125000000
223 #define GEN3_CORE_CLK_FREQ 250000000
224 #define GEN4_CORE_CLK_FREQ 500000000
226 static const unsigned int pcie_gen_freq
[] = {
233 static const u32 event_cntr_ctrl_offset
[] = {
242 static const u32 event_cntr_data_offset
[] = {
251 struct tegra_pcie_dw
{
253 struct resource
*appl_res
;
254 struct resource
*dbi_res
;
255 struct resource
*atu_dma_res
;
256 void __iomem
*appl_base
;
257 struct clk
*core_clk
;
258 struct reset_control
*core_apb_rst
;
259 struct reset_control
*core_rst
;
261 struct tegra_bpmp
*bpmp
;
263 bool supports_clkreq
;
264 bool enable_cdm_check
;
266 bool update_fc_fixup
;
272 u32 cfg_link_cap_l1sub
;
276 u32 aspm_l0s_enter_lat
;
278 struct regulator
*pex_ctl_supply
;
279 struct regulator
*slot_ctl_3v3
;
280 struct regulator
*slot_ctl_12v
;
282 unsigned int phy_count
;
285 struct dentry
*debugfs
;
288 static inline struct tegra_pcie_dw
*to_tegra_pcie(struct dw_pcie
*pci
)
290 return container_of(pci
, struct tegra_pcie_dw
, pci
);
293 static inline void appl_writel(struct tegra_pcie_dw
*pcie
, const u32 value
,
296 writel_relaxed(value
, pcie
->appl_base
+ reg
);
299 static inline u32
appl_readl(struct tegra_pcie_dw
*pcie
, const u32 reg
)
301 return readl_relaxed(pcie
->appl_base
+ reg
);
304 struct tegra_pcie_soc
{
305 enum dw_pcie_device_mode mode
;
308 static void apply_bad_link_workaround(struct pcie_port
*pp
)
310 struct dw_pcie
*pci
= to_dw_pcie_from_pp(pp
);
311 struct tegra_pcie_dw
*pcie
= to_tegra_pcie(pci
);
312 u32 current_link_width
;
316 * NOTE:- Since this scenario is uncommon and link as such is not
317 * stable anyway, not waiting to confirm if link is really
318 * transitioning to Gen-2 speed
320 val
= dw_pcie_readw_dbi(pci
, pcie
->pcie_cap_base
+ PCI_EXP_LNKSTA
);
321 if (val
& PCI_EXP_LNKSTA_LBMS
) {
322 current_link_width
= (val
& PCI_EXP_LNKSTA_NLW
) >>
323 PCI_EXP_LNKSTA_NLW_SHIFT
;
324 if (pcie
->init_link_width
> current_link_width
) {
325 dev_warn(pci
->dev
, "PCIe link is bad, width reduced\n");
326 val
= dw_pcie_readw_dbi(pci
, pcie
->pcie_cap_base
+
328 val
&= ~PCI_EXP_LNKCTL2_TLS
;
329 val
|= PCI_EXP_LNKCTL2_TLS_2_5GT
;
330 dw_pcie_writew_dbi(pci
, pcie
->pcie_cap_base
+
331 PCI_EXP_LNKCTL2
, val
);
333 val
= dw_pcie_readw_dbi(pci
, pcie
->pcie_cap_base
+
335 val
|= PCI_EXP_LNKCTL_RL
;
336 dw_pcie_writew_dbi(pci
, pcie
->pcie_cap_base
+
337 PCI_EXP_LNKCTL
, val
);
342 static irqreturn_t
tegra_pcie_rp_irq_handler(struct tegra_pcie_dw
*pcie
)
344 struct dw_pcie
*pci
= &pcie
->pci
;
345 struct pcie_port
*pp
= &pci
->pp
;
349 val
= appl_readl(pcie
, APPL_INTR_STATUS_L0
);
350 if (val
& APPL_INTR_STATUS_L0_LINK_STATE_INT
) {
351 val
= appl_readl(pcie
, APPL_INTR_STATUS_L1_0_0
);
352 if (val
& APPL_INTR_STATUS_L1_0_0_LINK_REQ_RST_NOT_CHGED
) {
353 appl_writel(pcie
, val
, APPL_INTR_STATUS_L1_0_0
);
355 /* SBR & Surprise Link Down WAR */
356 val
= appl_readl(pcie
, APPL_CAR_RESET_OVRD
);
357 val
&= ~APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N
;
358 appl_writel(pcie
, val
, APPL_CAR_RESET_OVRD
);
360 val
= appl_readl(pcie
, APPL_CAR_RESET_OVRD
);
361 val
|= APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N
;
362 appl_writel(pcie
, val
, APPL_CAR_RESET_OVRD
);
364 val
= dw_pcie_readl_dbi(pci
, PORT_LOGIC_GEN2_CTRL
);
365 val
|= PORT_LOGIC_GEN2_CTRL_DIRECT_SPEED_CHANGE
;
366 dw_pcie_writel_dbi(pci
, PORT_LOGIC_GEN2_CTRL
, val
);
370 if (val
& APPL_INTR_STATUS_L0_INT_INT
) {
371 val
= appl_readl(pcie
, APPL_INTR_STATUS_L1_8_0
);
372 if (val
& APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS
) {
374 APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS
,
375 APPL_INTR_STATUS_L1_8_0
);
376 apply_bad_link_workaround(pp
);
378 if (val
& APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS
) {
380 APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS
,
381 APPL_INTR_STATUS_L1_8_0
);
383 val_w
= dw_pcie_readw_dbi(pci
, pcie
->pcie_cap_base
+
385 dev_dbg(pci
->dev
, "Link Speed : Gen-%u\n", val_w
&
390 val
= appl_readl(pcie
, APPL_INTR_STATUS_L0
);
391 if (val
& APPL_INTR_STATUS_L0_CDM_REG_CHK_INT
) {
392 val
= appl_readl(pcie
, APPL_INTR_STATUS_L1_18
);
393 tmp
= dw_pcie_readl_dbi(pci
, PCIE_PL_CHK_REG_CONTROL_STATUS
);
394 if (val
& APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMPLT
) {
395 dev_info(pci
->dev
, "CDM check complete\n");
396 tmp
|= PCIE_PL_CHK_REG_CHK_REG_COMPLETE
;
398 if (val
& APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMP_ERR
) {
399 dev_err(pci
->dev
, "CDM comparison mismatch\n");
400 tmp
|= PCIE_PL_CHK_REG_CHK_REG_COMPARISON_ERROR
;
402 if (val
& APPL_INTR_STATUS_L1_18_CDM_REG_CHK_LOGIC_ERR
) {
403 dev_err(pci
->dev
, "CDM Logic error\n");
404 tmp
|= PCIE_PL_CHK_REG_CHK_REG_LOGIC_ERROR
;
406 dw_pcie_writel_dbi(pci
, PCIE_PL_CHK_REG_CONTROL_STATUS
, tmp
);
407 tmp
= dw_pcie_readl_dbi(pci
, PCIE_PL_CHK_REG_ERR_ADDR
);
408 dev_err(pci
->dev
, "CDM Error Address Offset = 0x%08X\n", tmp
);
414 static irqreturn_t
tegra_pcie_irq_handler(int irq
, void *arg
)
416 struct tegra_pcie_dw
*pcie
= arg
;
418 return tegra_pcie_rp_irq_handler(pcie
);
421 static int tegra_pcie_dw_rd_own_conf(struct pcie_port
*pp
, int where
, int size
,
424 struct dw_pcie
*pci
= to_dw_pcie_from_pp(pp
);
427 * This is an endpoint mode specific register happen to appear even
428 * when controller is operating in root port mode and system hangs
429 * when it is accessed with link being in ASPM-L1 state.
430 * So skip accessing it altogether
432 if (where
== PORT_LOGIC_MSIX_DOORBELL
) {
434 return PCIBIOS_SUCCESSFUL
;
437 return dw_pcie_read(pci
->dbi_base
+ where
, size
, val
);
440 static int tegra_pcie_dw_wr_own_conf(struct pcie_port
*pp
, int where
, int size
,
443 struct dw_pcie
*pci
= to_dw_pcie_from_pp(pp
);
446 * This is an endpoint mode specific register happen to appear even
447 * when controller is operating in root port mode and system hangs
448 * when it is accessed with link being in ASPM-L1 state.
449 * So skip accessing it altogether
451 if (where
== PORT_LOGIC_MSIX_DOORBELL
)
452 return PCIBIOS_SUCCESSFUL
;
454 return dw_pcie_write(pci
->dbi_base
+ where
, size
, val
);
457 #if defined(CONFIG_PCIEASPM)
458 static void disable_aspm_l11(struct tegra_pcie_dw
*pcie
)
462 val
= dw_pcie_readl_dbi(&pcie
->pci
, pcie
->cfg_link_cap_l1sub
);
463 val
&= ~PCI_L1SS_CAP_ASPM_L1_1
;
464 dw_pcie_writel_dbi(&pcie
->pci
, pcie
->cfg_link_cap_l1sub
, val
);
467 static void disable_aspm_l12(struct tegra_pcie_dw
*pcie
)
471 val
= dw_pcie_readl_dbi(&pcie
->pci
, pcie
->cfg_link_cap_l1sub
);
472 val
&= ~PCI_L1SS_CAP_ASPM_L1_2
;
473 dw_pcie_writel_dbi(&pcie
->pci
, pcie
->cfg_link_cap_l1sub
, val
);
476 static inline u32
event_counter_prog(struct tegra_pcie_dw
*pcie
, u32 event
)
480 val
= dw_pcie_readl_dbi(&pcie
->pci
, event_cntr_ctrl_offset
[pcie
->cid
]);
481 val
&= ~(EVENT_COUNTER_EVENT_SEL_MASK
<< EVENT_COUNTER_EVENT_SEL_SHIFT
);
482 val
|= EVENT_COUNTER_GROUP_5
<< EVENT_COUNTER_GROUP_SEL_SHIFT
;
483 val
|= event
<< EVENT_COUNTER_EVENT_SEL_SHIFT
;
484 val
|= EVENT_COUNTER_ENABLE_ALL
<< EVENT_COUNTER_ENABLE_SHIFT
;
485 dw_pcie_writel_dbi(&pcie
->pci
, event_cntr_ctrl_offset
[pcie
->cid
], val
);
486 val
= dw_pcie_readl_dbi(&pcie
->pci
, event_cntr_data_offset
[pcie
->cid
]);
491 static int aspm_state_cnt(struct seq_file
*s
, void *data
)
493 struct tegra_pcie_dw
*pcie
= (struct tegra_pcie_dw
*)
494 dev_get_drvdata(s
->private);
497 seq_printf(s
, "Tx L0s entry count : %u\n",
498 event_counter_prog(pcie
, EVENT_COUNTER_EVENT_Tx_L0S
));
500 seq_printf(s
, "Rx L0s entry count : %u\n",
501 event_counter_prog(pcie
, EVENT_COUNTER_EVENT_Rx_L0S
));
503 seq_printf(s
, "Link L1 entry count : %u\n",
504 event_counter_prog(pcie
, EVENT_COUNTER_EVENT_L1
));
506 seq_printf(s
, "Link L1.1 entry count : %u\n",
507 event_counter_prog(pcie
, EVENT_COUNTER_EVENT_L1_1
));
509 seq_printf(s
, "Link L1.2 entry count : %u\n",
510 event_counter_prog(pcie
, EVENT_COUNTER_EVENT_L1_2
));
512 /* Clear all counters */
513 dw_pcie_writel_dbi(&pcie
->pci
, event_cntr_ctrl_offset
[pcie
->cid
],
514 EVENT_COUNTER_ALL_CLEAR
);
516 /* Re-enable counting */
517 val
= EVENT_COUNTER_ENABLE_ALL
<< EVENT_COUNTER_ENABLE_SHIFT
;
518 val
|= EVENT_COUNTER_GROUP_5
<< EVENT_COUNTER_GROUP_SEL_SHIFT
;
519 dw_pcie_writel_dbi(&pcie
->pci
, event_cntr_ctrl_offset
[pcie
->cid
], val
);
524 static void init_host_aspm(struct tegra_pcie_dw
*pcie
)
526 struct dw_pcie
*pci
= &pcie
->pci
;
529 val
= dw_pcie_find_ext_capability(pci
, PCI_EXT_CAP_ID_L1SS
);
530 pcie
->cfg_link_cap_l1sub
= val
+ PCI_L1SS_CAP
;
532 /* Enable ASPM counters */
533 val
= EVENT_COUNTER_ENABLE_ALL
<< EVENT_COUNTER_ENABLE_SHIFT
;
534 val
|= EVENT_COUNTER_GROUP_5
<< EVENT_COUNTER_GROUP_SEL_SHIFT
;
535 dw_pcie_writel_dbi(pci
, event_cntr_ctrl_offset
[pcie
->cid
], val
);
537 /* Program T_cmrt and T_pwr_on values */
538 val
= dw_pcie_readl_dbi(pci
, pcie
->cfg_link_cap_l1sub
);
539 val
&= ~(PCI_L1SS_CAP_CM_RESTORE_TIME
| PCI_L1SS_CAP_P_PWR_ON_VALUE
);
540 val
|= (pcie
->aspm_cmrt
<< 8);
541 val
|= (pcie
->aspm_pwr_on_t
<< 19);
542 dw_pcie_writel_dbi(pci
, pcie
->cfg_link_cap_l1sub
, val
);
544 /* Program L0s and L1 entrance latencies */
545 val
= dw_pcie_readl_dbi(pci
, PORT_LOGIC_ACK_F_ASPM_CTRL
);
546 val
&= ~L0S_ENTRANCE_LAT_MASK
;
547 val
|= (pcie
->aspm_l0s_enter_lat
<< L0S_ENTRANCE_LAT_SHIFT
);
549 dw_pcie_writel_dbi(pci
, PORT_LOGIC_ACK_F_ASPM_CTRL
, val
);
552 static int init_debugfs(struct tegra_pcie_dw
*pcie
)
556 d
= debugfs_create_devm_seqfile(pcie
->dev
, "aspm_state_cnt",
557 pcie
->debugfs
, aspm_state_cnt
);
558 if (IS_ERR_OR_NULL(d
))
560 "Failed to create debugfs file \"aspm_state_cnt\"\n");
565 static inline void disable_aspm_l12(struct tegra_pcie_dw
*pcie
) { return; }
566 static inline void disable_aspm_l11(struct tegra_pcie_dw
*pcie
) { return; }
567 static inline void init_host_aspm(struct tegra_pcie_dw
*pcie
) { return; }
568 static inline int init_debugfs(struct tegra_pcie_dw
*pcie
) { return 0; }
571 static void tegra_pcie_enable_system_interrupts(struct pcie_port
*pp
)
573 struct dw_pcie
*pci
= to_dw_pcie_from_pp(pp
);
574 struct tegra_pcie_dw
*pcie
= to_tegra_pcie(pci
);
578 val
= appl_readl(pcie
, APPL_INTR_EN_L0_0
);
579 val
|= APPL_INTR_EN_L0_0_LINK_STATE_INT_EN
;
580 appl_writel(pcie
, val
, APPL_INTR_EN_L0_0
);
582 val
= appl_readl(pcie
, APPL_INTR_EN_L1_0_0
);
583 val
|= APPL_INTR_EN_L1_0_0_LINK_REQ_RST_NOT_INT_EN
;
584 appl_writel(pcie
, val
, APPL_INTR_EN_L1_0_0
);
586 if (pcie
->enable_cdm_check
) {
587 val
= appl_readl(pcie
, APPL_INTR_EN_L0_0
);
588 val
|= APPL_INTR_EN_L0_0_CDM_REG_CHK_INT_EN
;
589 appl_writel(pcie
, val
, APPL_INTR_EN_L0_0
);
591 val
= appl_readl(pcie
, APPL_INTR_EN_L1_18
);
592 val
|= APPL_INTR_EN_L1_18_CDM_REG_CHK_CMP_ERR
;
593 val
|= APPL_INTR_EN_L1_18_CDM_REG_CHK_LOGIC_ERR
;
594 appl_writel(pcie
, val
, APPL_INTR_EN_L1_18
);
597 val_w
= dw_pcie_readw_dbi(&pcie
->pci
, pcie
->pcie_cap_base
+
599 pcie
->init_link_width
= (val_w
& PCI_EXP_LNKSTA_NLW
) >>
600 PCI_EXP_LNKSTA_NLW_SHIFT
;
602 val_w
= dw_pcie_readw_dbi(&pcie
->pci
, pcie
->pcie_cap_base
+
604 val_w
|= PCI_EXP_LNKCTL_LBMIE
;
605 dw_pcie_writew_dbi(&pcie
->pci
, pcie
->pcie_cap_base
+ PCI_EXP_LNKCTL
,
609 static void tegra_pcie_enable_legacy_interrupts(struct pcie_port
*pp
)
611 struct dw_pcie
*pci
= to_dw_pcie_from_pp(pp
);
612 struct tegra_pcie_dw
*pcie
= to_tegra_pcie(pci
);
615 /* Enable legacy interrupt generation */
616 val
= appl_readl(pcie
, APPL_INTR_EN_L0_0
);
617 val
|= APPL_INTR_EN_L0_0_SYS_INTR_EN
;
618 val
|= APPL_INTR_EN_L0_0_INT_INT_EN
;
619 appl_writel(pcie
, val
, APPL_INTR_EN_L0_0
);
621 val
= appl_readl(pcie
, APPL_INTR_EN_L1_8_0
);
622 val
|= APPL_INTR_EN_L1_8_INTX_EN
;
623 val
|= APPL_INTR_EN_L1_8_AUTO_BW_INT_EN
;
624 val
|= APPL_INTR_EN_L1_8_BW_MGT_INT_EN
;
625 if (IS_ENABLED(CONFIG_PCIEAER
))
626 val
|= APPL_INTR_EN_L1_8_AER_INT_EN
;
627 appl_writel(pcie
, val
, APPL_INTR_EN_L1_8_0
);
630 static void tegra_pcie_enable_msi_interrupts(struct pcie_port
*pp
)
632 struct dw_pcie
*pci
= to_dw_pcie_from_pp(pp
);
633 struct tegra_pcie_dw
*pcie
= to_tegra_pcie(pci
);
636 dw_pcie_msi_init(pp
);
638 /* Enable MSI interrupt generation */
639 val
= appl_readl(pcie
, APPL_INTR_EN_L0_0
);
640 val
|= APPL_INTR_EN_L0_0_SYS_MSI_INTR_EN
;
641 val
|= APPL_INTR_EN_L0_0_MSI_RCV_INT_EN
;
642 appl_writel(pcie
, val
, APPL_INTR_EN_L0_0
);
645 static void tegra_pcie_enable_interrupts(struct pcie_port
*pp
)
647 struct dw_pcie
*pci
= to_dw_pcie_from_pp(pp
);
648 struct tegra_pcie_dw
*pcie
= to_tegra_pcie(pci
);
650 /* Clear interrupt statuses before enabling interrupts */
651 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L0
);
652 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0
);
653 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_1
);
654 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_2
);
655 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_3
);
656 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_6
);
657 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_7
);
658 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_8_0
);
659 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_9
);
660 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_10
);
661 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_11
);
662 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_13
);
663 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_14
);
664 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_15
);
665 appl_writel(pcie
, 0xFFFFFFFF, APPL_INTR_STATUS_L1_17
);
667 tegra_pcie_enable_system_interrupts(pp
);
668 tegra_pcie_enable_legacy_interrupts(pp
);
669 if (IS_ENABLED(CONFIG_PCI_MSI
))
670 tegra_pcie_enable_msi_interrupts(pp
);
673 static void config_gen3_gen4_eq_presets(struct tegra_pcie_dw
*pcie
)
675 struct dw_pcie
*pci
= &pcie
->pci
;
678 /* Program init preset */
679 for (i
= 0; i
< pcie
->num_lanes
; i
++) {
680 dw_pcie_read(pci
->dbi_base
+ CAP_SPCIE_CAP_OFF
682 val
&= ~CAP_SPCIE_CAP_OFF_DSP_TX_PRESET0_MASK
;
683 val
|= GEN3_GEN4_EQ_PRESET_INIT
;
684 val
&= ~CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_MASK
;
685 val
|= (GEN3_GEN4_EQ_PRESET_INIT
<<
686 CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_SHIFT
);
687 dw_pcie_write(pci
->dbi_base
+ CAP_SPCIE_CAP_OFF
690 offset
= dw_pcie_find_ext_capability(pci
,
691 PCI_EXT_CAP_ID_PL_16GT
) +
693 dw_pcie_read(pci
->dbi_base
+ offset
+ i
, 1, &val
);
694 val
&= ~PCI_PL_16GT_LE_CTRL_DSP_TX_PRESET_MASK
;
695 val
|= GEN3_GEN4_EQ_PRESET_INIT
;
696 val
&= ~PCI_PL_16GT_LE_CTRL_USP_TX_PRESET_MASK
;
697 val
|= (GEN3_GEN4_EQ_PRESET_INIT
<<
698 PCI_PL_16GT_LE_CTRL_USP_TX_PRESET_SHIFT
);
699 dw_pcie_write(pci
->dbi_base
+ offset
+ i
, 1, val
);
702 val
= dw_pcie_readl_dbi(pci
, GEN3_RELATED_OFF
);
703 val
&= ~GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK
;
704 dw_pcie_writel_dbi(pci
, GEN3_RELATED_OFF
, val
);
706 val
= dw_pcie_readl_dbi(pci
, GEN3_EQ_CONTROL_OFF
);
707 val
&= ~GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_MASK
;
708 val
|= (0x3ff << GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_SHIFT
);
709 val
&= ~GEN3_EQ_CONTROL_OFF_FB_MODE_MASK
;
710 dw_pcie_writel_dbi(pci
, GEN3_EQ_CONTROL_OFF
, val
);
712 val
= dw_pcie_readl_dbi(pci
, GEN3_RELATED_OFF
);
713 val
&= ~GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK
;
714 val
|= (0x1 << GEN3_RELATED_OFF_RATE_SHADOW_SEL_SHIFT
);
715 dw_pcie_writel_dbi(pci
, GEN3_RELATED_OFF
, val
);
717 val
= dw_pcie_readl_dbi(pci
, GEN3_EQ_CONTROL_OFF
);
718 val
&= ~GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_MASK
;
719 val
|= (0x360 << GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_SHIFT
);
720 val
&= ~GEN3_EQ_CONTROL_OFF_FB_MODE_MASK
;
721 dw_pcie_writel_dbi(pci
, GEN3_EQ_CONTROL_OFF
, val
);
723 val
= dw_pcie_readl_dbi(pci
, GEN3_RELATED_OFF
);
724 val
&= ~GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK
;
725 dw_pcie_writel_dbi(pci
, GEN3_RELATED_OFF
, val
);
728 static void tegra_pcie_prepare_host(struct pcie_port
*pp
)
730 struct dw_pcie
*pci
= to_dw_pcie_from_pp(pp
);
731 struct tegra_pcie_dw
*pcie
= to_tegra_pcie(pci
);
734 val
= dw_pcie_readl_dbi(pci
, PCI_IO_BASE
);
735 val
&= ~(IO_BASE_IO_DECODE
| IO_BASE_IO_DECODE_BIT8
);
736 dw_pcie_writel_dbi(pci
, PCI_IO_BASE
, val
);
738 val
= dw_pcie_readl_dbi(pci
, PCI_PREF_MEMORY_BASE
);
739 val
|= CFG_PREF_MEM_LIMIT_BASE_MEM_DECODE
;
740 val
|= CFG_PREF_MEM_LIMIT_BASE_MEM_LIMIT_DECODE
;
741 dw_pcie_writel_dbi(pci
, PCI_PREF_MEMORY_BASE
, val
);
743 dw_pcie_writel_dbi(pci
, PCI_BASE_ADDRESS_0
, 0);
746 val
= dw_pcie_readl_dbi(pci
, PORT_LOGIC_ACK_F_ASPM_CTRL
);
747 val
&= ~(N_FTS_MASK
<< N_FTS_SHIFT
);
748 val
|= N_FTS_VAL
<< N_FTS_SHIFT
;
749 dw_pcie_writel_dbi(pci
, PORT_LOGIC_ACK_F_ASPM_CTRL
, val
);
751 val
= dw_pcie_readl_dbi(pci
, PORT_LOGIC_GEN2_CTRL
);
754 dw_pcie_writel_dbi(pci
, PORT_LOGIC_GEN2_CTRL
, val
);
756 /* Enable as 0xFFFF0001 response for CRS */
757 val
= dw_pcie_readl_dbi(pci
, PORT_LOGIC_AMBA_ERROR_RESPONSE_DEFAULT
);
758 val
&= ~(AMBA_ERROR_RESPONSE_CRS_MASK
<< AMBA_ERROR_RESPONSE_CRS_SHIFT
);
759 val
|= (AMBA_ERROR_RESPONSE_CRS_OKAY_FFFF0001
<<
760 AMBA_ERROR_RESPONSE_CRS_SHIFT
);
761 dw_pcie_writel_dbi(pci
, PORT_LOGIC_AMBA_ERROR_RESPONSE_DEFAULT
, val
);
763 /* Configure Max Speed from DT */
764 if (pcie
->max_speed
&& pcie
->max_speed
!= -EINVAL
) {
765 val
= dw_pcie_readl_dbi(pci
, pcie
->pcie_cap_base
+
767 val
&= ~PCI_EXP_LNKCAP_SLS
;
768 val
|= pcie
->max_speed
;
769 dw_pcie_writel_dbi(pci
, pcie
->pcie_cap_base
+ PCI_EXP_LNKCAP
,
773 /* Configure Max lane width from DT */
774 val
= dw_pcie_readl_dbi(pci
, pcie
->pcie_cap_base
+ PCI_EXP_LNKCAP
);
775 val
&= ~PCI_EXP_LNKCAP_MLW
;
776 val
|= (pcie
->num_lanes
<< PCI_EXP_LNKSTA_NLW_SHIFT
);
777 dw_pcie_writel_dbi(pci
, pcie
->pcie_cap_base
+ PCI_EXP_LNKCAP
, val
);
779 config_gen3_gen4_eq_presets(pcie
);
781 init_host_aspm(pcie
);
783 val
= dw_pcie_readl_dbi(pci
, GEN3_RELATED_OFF
);
784 val
&= ~GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL
;
785 dw_pcie_writel_dbi(pci
, GEN3_RELATED_OFF
, val
);
787 if (pcie
->update_fc_fixup
) {
788 val
= dw_pcie_readl_dbi(pci
, CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF
);
789 val
|= 0x1 << CFG_TIMER_CTRL_ACK_NAK_SHIFT
;
790 dw_pcie_writel_dbi(pci
, CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF
, val
);
793 dw_pcie_setup_rc(pp
);
795 clk_set_rate(pcie
->core_clk
, GEN4_CORE_CLK_FREQ
);
798 val
= appl_readl(pcie
, APPL_PINMUX
);
799 val
&= ~APPL_PINMUX_PEX_RST
;
800 appl_writel(pcie
, val
, APPL_PINMUX
);
802 usleep_range(100, 200);
805 val
= appl_readl(pcie
, APPL_CTRL
);
806 val
|= APPL_CTRL_LTSSM_EN
;
807 appl_writel(pcie
, val
, APPL_CTRL
);
810 val
= appl_readl(pcie
, APPL_PINMUX
);
811 val
|= APPL_PINMUX_PEX_RST
;
812 appl_writel(pcie
, val
, APPL_PINMUX
);
817 static int tegra_pcie_dw_host_init(struct pcie_port
*pp
)
819 struct dw_pcie
*pci
= to_dw_pcie_from_pp(pp
);
820 struct tegra_pcie_dw
*pcie
= to_tegra_pcie(pci
);
821 u32 val
, tmp
, offset
, speed
;
823 tegra_pcie_prepare_host(pp
);
825 if (dw_pcie_wait_for_link(pci
)) {
827 * There are some endpoints which can't get the link up if
828 * root port has Data Link Feature (DLF) enabled.
829 * Refer Spec rev 4.0 ver 1.0 sec 3.4.2 & 7.7.4 for more info
830 * on Scaled Flow Control and DLF.
831 * So, need to confirm that is indeed the case here and attempt
832 * link up once again with DLF disabled.
834 val
= appl_readl(pcie
, APPL_DEBUG
);
835 val
&= APPL_DEBUG_LTSSM_STATE_MASK
;
836 val
>>= APPL_DEBUG_LTSSM_STATE_SHIFT
;
837 tmp
= appl_readl(pcie
, APPL_LINK_STATUS
);
838 tmp
&= APPL_LINK_STATUS_RDLH_LINK_UP
;
839 if (!(val
== 0x11 && !tmp
)) {
840 /* Link is down for all good reasons */
844 dev_info(pci
->dev
, "Link is down in DLL");
845 dev_info(pci
->dev
, "Trying again with DLFE disabled\n");
847 val
= appl_readl(pcie
, APPL_CTRL
);
848 val
&= ~APPL_CTRL_LTSSM_EN
;
849 appl_writel(pcie
, val
, APPL_CTRL
);
851 reset_control_assert(pcie
->core_rst
);
852 reset_control_deassert(pcie
->core_rst
);
854 offset
= dw_pcie_find_ext_capability(pci
, PCI_EXT_CAP_ID_DLF
);
855 val
= dw_pcie_readl_dbi(pci
, offset
+ PCI_DLF_CAP
);
856 val
&= ~PCI_DLF_EXCHANGE_ENABLE
;
857 dw_pcie_writel_dbi(pci
, offset
, val
);
859 tegra_pcie_prepare_host(pp
);
861 if (dw_pcie_wait_for_link(pci
))
865 speed
= dw_pcie_readw_dbi(pci
, pcie
->pcie_cap_base
+ PCI_EXP_LNKSTA
) &
867 clk_set_rate(pcie
->core_clk
, pcie_gen_freq
[speed
- 1]);
869 tegra_pcie_enable_interrupts(pp
);
874 static int tegra_pcie_dw_link_up(struct dw_pcie
*pci
)
876 struct tegra_pcie_dw
*pcie
= to_tegra_pcie(pci
);
877 u32 val
= dw_pcie_readw_dbi(pci
, pcie
->pcie_cap_base
+ PCI_EXP_LNKSTA
);
879 return !!(val
& PCI_EXP_LNKSTA_DLLLA
);
882 static void tegra_pcie_set_msi_vec_num(struct pcie_port
*pp
)
884 pp
->num_vectors
= MAX_MSI_IRQS
;
887 static const struct dw_pcie_ops tegra_dw_pcie_ops
= {
888 .link_up
= tegra_pcie_dw_link_up
,
891 static struct dw_pcie_host_ops tegra_pcie_dw_host_ops
= {
892 .rd_own_conf
= tegra_pcie_dw_rd_own_conf
,
893 .wr_own_conf
= tegra_pcie_dw_wr_own_conf
,
894 .host_init
= tegra_pcie_dw_host_init
,
895 .set_num_vectors
= tegra_pcie_set_msi_vec_num
,
898 static void tegra_pcie_disable_phy(struct tegra_pcie_dw
*pcie
)
900 unsigned int phy_count
= pcie
->phy_count
;
902 while (phy_count
--) {
903 phy_power_off(pcie
->phys
[phy_count
]);
904 phy_exit(pcie
->phys
[phy_count
]);
908 static int tegra_pcie_enable_phy(struct tegra_pcie_dw
*pcie
)
913 for (i
= 0; i
< pcie
->phy_count
; i
++) {
914 ret
= phy_init(pcie
->phys
[i
]);
918 ret
= phy_power_on(pcie
->phys
[i
]);
927 phy_power_off(pcie
->phys
[i
]);
929 phy_exit(pcie
->phys
[i
]);
935 static int tegra_pcie_dw_parse_dt(struct tegra_pcie_dw
*pcie
)
937 struct device_node
*np
= pcie
->dev
->of_node
;
940 ret
= of_property_read_u32(np
, "nvidia,aspm-cmrt-us", &pcie
->aspm_cmrt
);
942 dev_info(pcie
->dev
, "Failed to read ASPM T_cmrt: %d\n", ret
);
946 ret
= of_property_read_u32(np
, "nvidia,aspm-pwr-on-t-us",
947 &pcie
->aspm_pwr_on_t
);
949 dev_info(pcie
->dev
, "Failed to read ASPM Power On time: %d\n",
952 ret
= of_property_read_u32(np
, "nvidia,aspm-l0s-entrance-latency-us",
953 &pcie
->aspm_l0s_enter_lat
);
956 "Failed to read ASPM L0s Entrance latency: %d\n", ret
);
958 ret
= of_property_read_u32(np
, "num-lanes", &pcie
->num_lanes
);
960 dev_err(pcie
->dev
, "Failed to read num-lanes: %d\n", ret
);
964 pcie
->max_speed
= of_pci_get_max_link_speed(np
);
966 ret
= of_property_read_u32_index(np
, "nvidia,bpmp", 1, &pcie
->cid
);
968 dev_err(pcie
->dev
, "Failed to read Controller-ID: %d\n", ret
);
972 ret
= of_property_count_strings(np
, "phy-names");
974 dev_err(pcie
->dev
, "Failed to find PHY entries: %d\n",
978 pcie
->phy_count
= ret
;
980 if (of_property_read_bool(np
, "nvidia,update-fc-fixup"))
981 pcie
->update_fc_fixup
= true;
983 pcie
->supports_clkreq
=
984 of_property_read_bool(pcie
->dev
->of_node
, "supports-clkreq");
986 pcie
->enable_cdm_check
=
987 of_property_read_bool(np
, "snps,enable-cdm-check");
992 static int tegra_pcie_bpmp_set_ctrl_state(struct tegra_pcie_dw
*pcie
,
995 struct mrq_uphy_response resp
;
996 struct tegra_bpmp_message msg
;
997 struct mrq_uphy_request req
;
999 /* Controller-5 doesn't need to have its state set by BPMP-FW */
1003 memset(&req
, 0, sizeof(req
));
1004 memset(&resp
, 0, sizeof(resp
));
1006 req
.cmd
= CMD_UPHY_PCIE_CONTROLLER_STATE
;
1007 req
.controller_state
.pcie_controller
= pcie
->cid
;
1008 req
.controller_state
.enable
= enable
;
1010 memset(&msg
, 0, sizeof(msg
));
1013 msg
.tx
.size
= sizeof(req
);
1014 msg
.rx
.data
= &resp
;
1015 msg
.rx
.size
= sizeof(resp
);
1017 return tegra_bpmp_transfer(pcie
->bpmp
, &msg
);
1020 static void tegra_pcie_downstream_dev_to_D0(struct tegra_pcie_dw
*pcie
)
1022 struct pcie_port
*pp
= &pcie
->pci
.pp
;
1023 struct pci_bus
*child
, *root_bus
= NULL
;
1024 struct pci_dev
*pdev
;
1027 * link doesn't go into L2 state with some of the endpoints with Tegra
1028 * if they are not in D0 state. So, need to make sure that immediate
1029 * downstream devices are in D0 state before sending PME_TurnOff to put
1030 * link into L2 state.
1031 * This is as per PCI Express Base r4.0 v1.0 September 27-2017,
1032 * 5.2 Link State Power Management (Page #428).
1035 list_for_each_entry(child
, &pp
->root_bus
->children
, node
) {
1036 /* Bring downstream devices to D0 if they are not already in */
1037 if (child
->parent
== pp
->root_bus
) {
1044 dev_err(pcie
->dev
, "Failed to find downstream devices\n");
1048 list_for_each_entry(pdev
, &root_bus
->devices
, bus_list
) {
1049 if (PCI_SLOT(pdev
->devfn
) == 0) {
1050 if (pci_set_power_state(pdev
, PCI_D0
))
1052 "Failed to transition %s to D0 state\n",
1053 dev_name(&pdev
->dev
));
1058 static int tegra_pcie_get_slot_regulators(struct tegra_pcie_dw
*pcie
)
1060 pcie
->slot_ctl_3v3
= devm_regulator_get_optional(pcie
->dev
, "vpcie3v3");
1061 if (IS_ERR(pcie
->slot_ctl_3v3
)) {
1062 if (PTR_ERR(pcie
->slot_ctl_3v3
) != -ENODEV
)
1063 return PTR_ERR(pcie
->slot_ctl_3v3
);
1065 pcie
->slot_ctl_3v3
= NULL
;
1068 pcie
->slot_ctl_12v
= devm_regulator_get_optional(pcie
->dev
, "vpcie12v");
1069 if (IS_ERR(pcie
->slot_ctl_12v
)) {
1070 if (PTR_ERR(pcie
->slot_ctl_12v
) != -ENODEV
)
1071 return PTR_ERR(pcie
->slot_ctl_12v
);
1073 pcie
->slot_ctl_12v
= NULL
;
1079 static int tegra_pcie_enable_slot_regulators(struct tegra_pcie_dw
*pcie
)
1083 if (pcie
->slot_ctl_3v3
) {
1084 ret
= regulator_enable(pcie
->slot_ctl_3v3
);
1087 "Failed to enable 3.3V slot supply: %d\n", ret
);
1092 if (pcie
->slot_ctl_12v
) {
1093 ret
= regulator_enable(pcie
->slot_ctl_12v
);
1096 "Failed to enable 12V slot supply: %d\n", ret
);
1097 goto fail_12v_enable
;
1102 * According to PCI Express Card Electromechanical Specification
1103 * Revision 1.1, Table-2.4, T_PVPERL (Power stable to PERST# inactive)
1104 * should be a minimum of 100ms.
1106 if (pcie
->slot_ctl_3v3
|| pcie
->slot_ctl_12v
)
1112 if (pcie
->slot_ctl_3v3
)
1113 regulator_disable(pcie
->slot_ctl_3v3
);
1117 static void tegra_pcie_disable_slot_regulators(struct tegra_pcie_dw
*pcie
)
1119 if (pcie
->slot_ctl_12v
)
1120 regulator_disable(pcie
->slot_ctl_12v
);
1121 if (pcie
->slot_ctl_3v3
)
1122 regulator_disable(pcie
->slot_ctl_3v3
);
1125 static int tegra_pcie_config_controller(struct tegra_pcie_dw
*pcie
,
1131 ret
= tegra_pcie_bpmp_set_ctrl_state(pcie
, true);
1134 "Failed to enable controller %u: %d\n", pcie
->cid
, ret
);
1138 ret
= tegra_pcie_enable_slot_regulators(pcie
);
1140 goto fail_slot_reg_en
;
1142 ret
= regulator_enable(pcie
->pex_ctl_supply
);
1144 dev_err(pcie
->dev
, "Failed to enable regulator: %d\n", ret
);
1148 ret
= clk_prepare_enable(pcie
->core_clk
);
1150 dev_err(pcie
->dev
, "Failed to enable core clock: %d\n", ret
);
1154 ret
= reset_control_deassert(pcie
->core_apb_rst
);
1156 dev_err(pcie
->dev
, "Failed to deassert core APB reset: %d\n",
1158 goto fail_core_apb_rst
;
1161 if (en_hw_hot_rst
) {
1162 /* Enable HW_HOT_RST mode */
1163 val
= appl_readl(pcie
, APPL_CTRL
);
1164 val
&= ~(APPL_CTRL_HW_HOT_RST_MODE_MASK
<<
1165 APPL_CTRL_HW_HOT_RST_MODE_SHIFT
);
1166 val
|= APPL_CTRL_HW_HOT_RST_EN
;
1167 appl_writel(pcie
, val
, APPL_CTRL
);
1170 ret
= tegra_pcie_enable_phy(pcie
);
1172 dev_err(pcie
->dev
, "Failed to enable PHY: %d\n", ret
);
1176 /* Update CFG base address */
1177 appl_writel(pcie
, pcie
->dbi_res
->start
& APPL_CFG_BASE_ADDR_MASK
,
1178 APPL_CFG_BASE_ADDR
);
1180 /* Configure this core for RP mode operation */
1181 appl_writel(pcie
, APPL_DM_TYPE_RP
, APPL_DM_TYPE
);
1183 appl_writel(pcie
, 0x0, APPL_CFG_SLCG_OVERRIDE
);
1185 val
= appl_readl(pcie
, APPL_CTRL
);
1186 appl_writel(pcie
, val
| APPL_CTRL_SYS_PRE_DET_STATE
, APPL_CTRL
);
1188 val
= appl_readl(pcie
, APPL_CFG_MISC
);
1189 val
|= (APPL_CFG_MISC_ARCACHE_VAL
<< APPL_CFG_MISC_ARCACHE_SHIFT
);
1190 appl_writel(pcie
, val
, APPL_CFG_MISC
);
1192 if (!pcie
->supports_clkreq
) {
1193 val
= appl_readl(pcie
, APPL_PINMUX
);
1194 val
|= APPL_PINMUX_CLKREQ_OVERRIDE_EN
;
1195 val
&= ~APPL_PINMUX_CLKREQ_OVERRIDE
;
1196 appl_writel(pcie
, val
, APPL_PINMUX
);
1199 /* Update iATU_DMA base address */
1201 pcie
->atu_dma_res
->start
& APPL_CFG_IATU_DMA_BASE_ADDR_MASK
,
1202 APPL_CFG_IATU_DMA_BASE_ADDR
);
1204 reset_control_deassert(pcie
->core_rst
);
1206 pcie
->pcie_cap_base
= dw_pcie_find_capability(&pcie
->pci
,
1209 /* Disable ASPM-L1SS advertisement as there is no CLKREQ routing */
1210 if (!pcie
->supports_clkreq
) {
1211 disable_aspm_l11(pcie
);
1212 disable_aspm_l12(pcie
);
1218 reset_control_assert(pcie
->core_apb_rst
);
1220 clk_disable_unprepare(pcie
->core_clk
);
1222 regulator_disable(pcie
->pex_ctl_supply
);
1224 tegra_pcie_disable_slot_regulators(pcie
);
1226 tegra_pcie_bpmp_set_ctrl_state(pcie
, false);
1231 static int __deinit_controller(struct tegra_pcie_dw
*pcie
)
1235 ret
= reset_control_assert(pcie
->core_rst
);
1237 dev_err(pcie
->dev
, "Failed to assert \"core\" reset: %d\n",
1242 tegra_pcie_disable_phy(pcie
);
1244 ret
= reset_control_assert(pcie
->core_apb_rst
);
1246 dev_err(pcie
->dev
, "Failed to assert APB reset: %d\n", ret
);
1250 clk_disable_unprepare(pcie
->core_clk
);
1252 ret
= regulator_disable(pcie
->pex_ctl_supply
);
1254 dev_err(pcie
->dev
, "Failed to disable regulator: %d\n", ret
);
1258 tegra_pcie_disable_slot_regulators(pcie
);
1260 ret
= tegra_pcie_bpmp_set_ctrl_state(pcie
, false);
1262 dev_err(pcie
->dev
, "Failed to disable controller %d: %d\n",
1270 static int tegra_pcie_init_controller(struct tegra_pcie_dw
*pcie
)
1272 struct dw_pcie
*pci
= &pcie
->pci
;
1273 struct pcie_port
*pp
= &pci
->pp
;
1276 ret
= tegra_pcie_config_controller(pcie
, false);
1280 pp
->ops
= &tegra_pcie_dw_host_ops
;
1282 ret
= dw_pcie_host_init(pp
);
1284 dev_err(pcie
->dev
, "Failed to add PCIe port: %d\n", ret
);
1285 goto fail_host_init
;
1291 return __deinit_controller(pcie
);
1294 static int tegra_pcie_try_link_l2(struct tegra_pcie_dw
*pcie
)
1298 if (!tegra_pcie_dw_link_up(&pcie
->pci
))
1301 val
= appl_readl(pcie
, APPL_RADM_STATUS
);
1302 val
|= APPL_PM_XMT_TURNOFF_STATE
;
1303 appl_writel(pcie
, val
, APPL_RADM_STATUS
);
1305 return readl_poll_timeout_atomic(pcie
->appl_base
+ APPL_DEBUG
, val
,
1306 val
& APPL_DEBUG_PM_LINKST_IN_L2_LAT
,
1307 1, PME_ACK_TIMEOUT
);
1310 static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw
*pcie
)
1315 if (!tegra_pcie_dw_link_up(&pcie
->pci
)) {
1316 dev_dbg(pcie
->dev
, "PCIe link is not up...!\n");
1320 if (tegra_pcie_try_link_l2(pcie
)) {
1321 dev_info(pcie
->dev
, "Link didn't transition to L2 state\n");
1323 * TX lane clock freq will reset to Gen1 only if link is in L2
1325 * So apply pex_rst to end point to force RP to go into detect
1328 data
= appl_readl(pcie
, APPL_PINMUX
);
1329 data
&= ~APPL_PINMUX_PEX_RST
;
1330 appl_writel(pcie
, data
, APPL_PINMUX
);
1332 err
= readl_poll_timeout_atomic(pcie
->appl_base
+ APPL_DEBUG
,
1335 APPL_DEBUG_LTSSM_STATE_MASK
) >>
1336 APPL_DEBUG_LTSSM_STATE_SHIFT
) ==
1337 LTSSM_STATE_PRE_DETECT
,
1340 dev_info(pcie
->dev
, "Link didn't go to detect state\n");
1342 /* Disable LTSSM after link is in detect state */
1343 data
= appl_readl(pcie
, APPL_CTRL
);
1344 data
&= ~APPL_CTRL_LTSSM_EN
;
1345 appl_writel(pcie
, data
, APPL_CTRL
);
1349 * DBI registers may not be accessible after this as PLL-E would be
1350 * down depending on how CLKREQ is pulled by end point
1352 data
= appl_readl(pcie
, APPL_PINMUX
);
1353 data
|= (APPL_PINMUX_CLKREQ_OVERRIDE_EN
| APPL_PINMUX_CLKREQ_OVERRIDE
);
1354 /* Cut REFCLK to slot */
1355 data
|= APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE_EN
;
1356 data
&= ~APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE
;
1357 appl_writel(pcie
, data
, APPL_PINMUX
);
1360 static int tegra_pcie_deinit_controller(struct tegra_pcie_dw
*pcie
)
1362 tegra_pcie_downstream_dev_to_D0(pcie
);
1363 dw_pcie_host_deinit(&pcie
->pci
.pp
);
1364 tegra_pcie_dw_pme_turnoff(pcie
);
1366 return __deinit_controller(pcie
);
1369 static int tegra_pcie_config_rp(struct tegra_pcie_dw
*pcie
)
1371 struct pcie_port
*pp
= &pcie
->pci
.pp
;
1372 struct device
*dev
= pcie
->dev
;
1376 if (IS_ENABLED(CONFIG_PCI_MSI
)) {
1377 pp
->msi_irq
= of_irq_get_byname(dev
->of_node
, "msi");
1379 dev_err(dev
, "Failed to get MSI interrupt\n");
1384 pm_runtime_enable(dev
);
1386 ret
= pm_runtime_get_sync(dev
);
1388 dev_err(dev
, "Failed to get runtime sync for PCIe dev: %d\n",
1390 goto fail_pm_get_sync
;
1393 ret
= pinctrl_pm_select_default_state(dev
);
1395 dev_err(dev
, "Failed to configure sideband pins: %d\n", ret
);
1399 tegra_pcie_init_controller(pcie
);
1401 pcie
->link_state
= tegra_pcie_dw_link_up(&pcie
->pci
);
1402 if (!pcie
->link_state
) {
1404 goto fail_host_init
;
1407 name
= devm_kasprintf(dev
, GFP_KERNEL
, "%pOFP", dev
->of_node
);
1410 goto fail_host_init
;
1413 pcie
->debugfs
= debugfs_create_dir(name
, NULL
);
1415 dev_err(dev
, "Failed to create debugfs\n");
1422 tegra_pcie_deinit_controller(pcie
);
1424 pm_runtime_put_sync(dev
);
1426 pm_runtime_disable(dev
);
1430 static int tegra_pcie_dw_probe(struct platform_device
*pdev
)
1432 struct device
*dev
= &pdev
->dev
;
1433 struct resource
*atu_dma_res
;
1434 struct tegra_pcie_dw
*pcie
;
1435 struct resource
*dbi_res
;
1436 struct pcie_port
*pp
;
1437 struct dw_pcie
*pci
;
1443 pcie
= devm_kzalloc(dev
, sizeof(*pcie
), GFP_KERNEL
);
1448 pci
->dev
= &pdev
->dev
;
1449 pci
->ops
= &tegra_dw_pcie_ops
;
1451 pcie
->dev
= &pdev
->dev
;
1453 ret
= tegra_pcie_dw_parse_dt(pcie
);
1455 dev_err(dev
, "Failed to parse device tree: %d\n", ret
);
1459 ret
= tegra_pcie_get_slot_regulators(pcie
);
1461 dev_err(dev
, "Failed to get slot regulators: %d\n", ret
);
1465 pcie
->pex_ctl_supply
= devm_regulator_get(dev
, "vddio-pex-ctl");
1466 if (IS_ERR(pcie
->pex_ctl_supply
)) {
1467 ret
= PTR_ERR(pcie
->pex_ctl_supply
);
1468 if (ret
!= -EPROBE_DEFER
)
1469 dev_err(dev
, "Failed to get regulator: %ld\n",
1470 PTR_ERR(pcie
->pex_ctl_supply
));
1474 pcie
->core_clk
= devm_clk_get(dev
, "core");
1475 if (IS_ERR(pcie
->core_clk
)) {
1476 dev_err(dev
, "Failed to get core clock: %ld\n",
1477 PTR_ERR(pcie
->core_clk
));
1478 return PTR_ERR(pcie
->core_clk
);
1481 pcie
->appl_res
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
,
1483 if (!pcie
->appl_res
) {
1484 dev_err(dev
, "Failed to find \"appl\" region\n");
1488 pcie
->appl_base
= devm_ioremap_resource(dev
, pcie
->appl_res
);
1489 if (IS_ERR(pcie
->appl_base
))
1490 return PTR_ERR(pcie
->appl_base
);
1492 pcie
->core_apb_rst
= devm_reset_control_get(dev
, "apb");
1493 if (IS_ERR(pcie
->core_apb_rst
)) {
1494 dev_err(dev
, "Failed to get APB reset: %ld\n",
1495 PTR_ERR(pcie
->core_apb_rst
));
1496 return PTR_ERR(pcie
->core_apb_rst
);
1499 phys
= devm_kcalloc(dev
, pcie
->phy_count
, sizeof(*phys
), GFP_KERNEL
);
1503 for (i
= 0; i
< pcie
->phy_count
; i
++) {
1504 name
= kasprintf(GFP_KERNEL
, "p2u-%u", i
);
1506 dev_err(dev
, "Failed to create P2U string\n");
1509 phys
[i
] = devm_phy_get(dev
, name
);
1511 if (IS_ERR(phys
[i
])) {
1512 ret
= PTR_ERR(phys
[i
]);
1513 if (ret
!= -EPROBE_DEFER
)
1514 dev_err(dev
, "Failed to get PHY: %d\n", ret
);
1521 dbi_res
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "dbi");
1523 dev_err(dev
, "Failed to find \"dbi\" region\n");
1526 pcie
->dbi_res
= dbi_res
;
1528 pci
->dbi_base
= devm_ioremap_resource(dev
, dbi_res
);
1529 if (IS_ERR(pci
->dbi_base
))
1530 return PTR_ERR(pci
->dbi_base
);
1532 /* Tegra HW locates DBI2 at a fixed offset from DBI */
1533 pci
->dbi_base2
= pci
->dbi_base
+ 0x1000;
1535 atu_dma_res
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
,
1538 dev_err(dev
, "Failed to find \"atu_dma\" region\n");
1541 pcie
->atu_dma_res
= atu_dma_res
;
1543 pci
->atu_base
= devm_ioremap_resource(dev
, atu_dma_res
);
1544 if (IS_ERR(pci
->atu_base
))
1545 return PTR_ERR(pci
->atu_base
);
1547 pcie
->core_rst
= devm_reset_control_get(dev
, "core");
1548 if (IS_ERR(pcie
->core_rst
)) {
1549 dev_err(dev
, "Failed to get core reset: %ld\n",
1550 PTR_ERR(pcie
->core_rst
));
1551 return PTR_ERR(pcie
->core_rst
);
1554 pp
->irq
= platform_get_irq_byname(pdev
, "intr");
1556 dev_err(dev
, "Failed to get \"intr\" interrupt\n");
1560 ret
= devm_request_irq(dev
, pp
->irq
, tegra_pcie_irq_handler
,
1561 IRQF_SHARED
, "tegra-pcie-intr", pcie
);
1563 dev_err(dev
, "Failed to request IRQ %d: %d\n", pp
->irq
, ret
);
1567 pcie
->bpmp
= tegra_bpmp_get(dev
);
1568 if (IS_ERR(pcie
->bpmp
))
1569 return PTR_ERR(pcie
->bpmp
);
1571 platform_set_drvdata(pdev
, pcie
);
1573 ret
= tegra_pcie_config_rp(pcie
);
1574 if (ret
&& ret
!= -ENOMEDIUM
)
1580 tegra_bpmp_put(pcie
->bpmp
);
1584 static int tegra_pcie_dw_remove(struct platform_device
*pdev
)
1586 struct tegra_pcie_dw
*pcie
= platform_get_drvdata(pdev
);
1588 if (!pcie
->link_state
)
1591 debugfs_remove_recursive(pcie
->debugfs
);
1592 tegra_pcie_deinit_controller(pcie
);
1593 pm_runtime_put_sync(pcie
->dev
);
1594 pm_runtime_disable(pcie
->dev
);
1595 tegra_bpmp_put(pcie
->bpmp
);
1600 static int tegra_pcie_dw_suspend_late(struct device
*dev
)
1602 struct tegra_pcie_dw
*pcie
= dev_get_drvdata(dev
);
1605 if (!pcie
->link_state
)
1608 /* Enable HW_HOT_RST mode */
1609 val
= appl_readl(pcie
, APPL_CTRL
);
1610 val
&= ~(APPL_CTRL_HW_HOT_RST_MODE_MASK
<<
1611 APPL_CTRL_HW_HOT_RST_MODE_SHIFT
);
1612 val
|= APPL_CTRL_HW_HOT_RST_EN
;
1613 appl_writel(pcie
, val
, APPL_CTRL
);
1618 static int tegra_pcie_dw_suspend_noirq(struct device
*dev
)
1620 struct tegra_pcie_dw
*pcie
= dev_get_drvdata(dev
);
1622 if (!pcie
->link_state
)
1625 /* Save MSI interrupt vector */
1626 pcie
->msi_ctrl_int
= dw_pcie_readl_dbi(&pcie
->pci
,
1627 PORT_LOGIC_MSI_CTRL_INT_0_EN
);
1628 tegra_pcie_downstream_dev_to_D0(pcie
);
1629 tegra_pcie_dw_pme_turnoff(pcie
);
1631 return __deinit_controller(pcie
);
1634 static int tegra_pcie_dw_resume_noirq(struct device
*dev
)
1636 struct tegra_pcie_dw
*pcie
= dev_get_drvdata(dev
);
1639 if (!pcie
->link_state
)
1642 ret
= tegra_pcie_config_controller(pcie
, true);
1646 ret
= tegra_pcie_dw_host_init(&pcie
->pci
.pp
);
1648 dev_err(dev
, "Failed to init host: %d\n", ret
);
1649 goto fail_host_init
;
1652 /* Restore MSI interrupt vector */
1653 dw_pcie_writel_dbi(&pcie
->pci
, PORT_LOGIC_MSI_CTRL_INT_0_EN
,
1654 pcie
->msi_ctrl_int
);
1659 return __deinit_controller(pcie
);
1662 static int tegra_pcie_dw_resume_early(struct device
*dev
)
1664 struct tegra_pcie_dw
*pcie
= dev_get_drvdata(dev
);
1667 if (!pcie
->link_state
)
1670 /* Disable HW_HOT_RST mode */
1671 val
= appl_readl(pcie
, APPL_CTRL
);
1672 val
&= ~(APPL_CTRL_HW_HOT_RST_MODE_MASK
<<
1673 APPL_CTRL_HW_HOT_RST_MODE_SHIFT
);
1674 val
|= APPL_CTRL_HW_HOT_RST_MODE_IMDT_RST
<<
1675 APPL_CTRL_HW_HOT_RST_MODE_SHIFT
;
1676 val
&= ~APPL_CTRL_HW_HOT_RST_EN
;
1677 appl_writel(pcie
, val
, APPL_CTRL
);
1682 static void tegra_pcie_dw_shutdown(struct platform_device
*pdev
)
1684 struct tegra_pcie_dw
*pcie
= platform_get_drvdata(pdev
);
1686 if (!pcie
->link_state
)
1689 debugfs_remove_recursive(pcie
->debugfs
);
1690 tegra_pcie_downstream_dev_to_D0(pcie
);
1692 disable_irq(pcie
->pci
.pp
.irq
);
1693 if (IS_ENABLED(CONFIG_PCI_MSI
))
1694 disable_irq(pcie
->pci
.pp
.msi_irq
);
1696 tegra_pcie_dw_pme_turnoff(pcie
);
1697 __deinit_controller(pcie
);
1700 static const struct of_device_id tegra_pcie_dw_of_match
[] = {
1702 .compatible
= "nvidia,tegra194-pcie",
1707 static const struct dev_pm_ops tegra_pcie_dw_pm_ops
= {
1708 .suspend_late
= tegra_pcie_dw_suspend_late
,
1709 .suspend_noirq
= tegra_pcie_dw_suspend_noirq
,
1710 .resume_noirq
= tegra_pcie_dw_resume_noirq
,
1711 .resume_early
= tegra_pcie_dw_resume_early
,
1714 static struct platform_driver tegra_pcie_dw_driver
= {
1715 .probe
= tegra_pcie_dw_probe
,
1716 .remove
= tegra_pcie_dw_remove
,
1717 .shutdown
= tegra_pcie_dw_shutdown
,
1719 .name
= "tegra194-pcie",
1720 .pm
= &tegra_pcie_dw_pm_ops
,
1721 .of_match_table
= tegra_pcie_dw_of_match
,
1724 module_platform_driver(tegra_pcie_dw_driver
);
1726 MODULE_DEVICE_TABLE(of
, tegra_pcie_dw_of_match
);
1728 MODULE_AUTHOR("Vidya Sagar <vidyas@nvidia.com>");
1729 MODULE_DESCRIPTION("NVIDIA PCIe host controller driver");
1730 MODULE_LICENSE("GPL v2");