blob: 9049769130819bfd7f4ddd5b7e99e739963f3c31 [file] [log] [blame]
Vidya Sagar56e15a22019-08-13 17:06:27 +05301// SPDX-License-Identifier: GPL-2.0+
2/*
3 * PCIe host controller driver for Tegra194 SoC
4 *
5 * Copyright (C) 2019 NVIDIA Corporation.
6 *
7 * Author: Vidya Sagar <vidyas@nvidia.com>
8 */
9
10#include <linux/clk.h>
11#include <linux/debugfs.h>
12#include <linux/delay.h>
13#include <linux/gpio.h>
Vidya Sagarc57247f2020-03-03 23:40:52 +053014#include <linux/gpio/consumer.h>
Vidya Sagar56e15a22019-08-13 17:06:27 +053015#include <linux/interrupt.h>
16#include <linux/iopoll.h>
17#include <linux/kernel.h>
18#include <linux/module.h>
19#include <linux/of.h>
20#include <linux/of_device.h>
21#include <linux/of_gpio.h>
22#include <linux/of_irq.h>
23#include <linux/of_pci.h>
24#include <linux/pci.h>
25#include <linux/phy/phy.h>
Vidya Sagarf4ff4fa2019-09-05 16:15:50 +053026#include <linux/pinctrl/consumer.h>
Vidya Sagar56e15a22019-08-13 17:06:27 +053027#include <linux/platform_device.h>
28#include <linux/pm_runtime.h>
29#include <linux/random.h>
30#include <linux/reset.h>
31#include <linux/resource.h>
32#include <linux/types.h>
33#include "pcie-designware.h"
34#include <soc/tegra/bpmp.h>
35#include <soc/tegra/bpmp-abi.h>
36#include "../../pci.h"
37
38#define APPL_PINMUX 0x0
39#define APPL_PINMUX_PEX_RST BIT(0)
40#define APPL_PINMUX_CLKREQ_OVERRIDE_EN BIT(2)
41#define APPL_PINMUX_CLKREQ_OVERRIDE BIT(3)
42#define APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE_EN BIT(4)
43#define APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE BIT(5)
Vidya Sagar56e15a22019-08-13 17:06:27 +053044
45#define APPL_CTRL 0x4
46#define APPL_CTRL_SYS_PRE_DET_STATE BIT(6)
47#define APPL_CTRL_LTSSM_EN BIT(7)
48#define APPL_CTRL_HW_HOT_RST_EN BIT(20)
49#define APPL_CTRL_HW_HOT_RST_MODE_MASK GENMASK(1, 0)
50#define APPL_CTRL_HW_HOT_RST_MODE_SHIFT 22
51#define APPL_CTRL_HW_HOT_RST_MODE_IMDT_RST 0x1
52
53#define APPL_INTR_EN_L0_0 0x8
54#define APPL_INTR_EN_L0_0_LINK_STATE_INT_EN BIT(0)
55#define APPL_INTR_EN_L0_0_MSI_RCV_INT_EN BIT(4)
56#define APPL_INTR_EN_L0_0_INT_INT_EN BIT(8)
Vidya Sagarc57247f2020-03-03 23:40:52 +053057#define APPL_INTR_EN_L0_0_PCI_CMD_EN_INT_EN BIT(15)
Vidya Sagar56e15a22019-08-13 17:06:27 +053058#define APPL_INTR_EN_L0_0_CDM_REG_CHK_INT_EN BIT(19)
59#define APPL_INTR_EN_L0_0_SYS_INTR_EN BIT(30)
60#define APPL_INTR_EN_L0_0_SYS_MSI_INTR_EN BIT(31)
61
62#define APPL_INTR_STATUS_L0 0xC
63#define APPL_INTR_STATUS_L0_LINK_STATE_INT BIT(0)
64#define APPL_INTR_STATUS_L0_INT_INT BIT(8)
Vidya Sagarc57247f2020-03-03 23:40:52 +053065#define APPL_INTR_STATUS_L0_PCI_CMD_EN_INT BIT(15)
66#define APPL_INTR_STATUS_L0_PEX_RST_INT BIT(16)
Vidya Sagar56e15a22019-08-13 17:06:27 +053067#define APPL_INTR_STATUS_L0_CDM_REG_CHK_INT BIT(18)
68
69#define APPL_INTR_EN_L1_0_0 0x1C
70#define APPL_INTR_EN_L1_0_0_LINK_REQ_RST_NOT_INT_EN BIT(1)
Vidya Sagarc57247f2020-03-03 23:40:52 +053071#define APPL_INTR_EN_L1_0_0_RDLH_LINK_UP_INT_EN BIT(3)
72#define APPL_INTR_EN_L1_0_0_HOT_RESET_DONE_INT_EN BIT(30)
Vidya Sagar56e15a22019-08-13 17:06:27 +053073
74#define APPL_INTR_STATUS_L1_0_0 0x20
75#define APPL_INTR_STATUS_L1_0_0_LINK_REQ_RST_NOT_CHGED BIT(1)
Vidya Sagarc57247f2020-03-03 23:40:52 +053076#define APPL_INTR_STATUS_L1_0_0_RDLH_LINK_UP_CHGED BIT(3)
77#define APPL_INTR_STATUS_L1_0_0_HOT_RESET_DONE BIT(30)
Vidya Sagar56e15a22019-08-13 17:06:27 +053078
79#define APPL_INTR_STATUS_L1_1 0x2C
80#define APPL_INTR_STATUS_L1_2 0x30
81#define APPL_INTR_STATUS_L1_3 0x34
82#define APPL_INTR_STATUS_L1_6 0x3C
83#define APPL_INTR_STATUS_L1_7 0x40
Vidya Sagarc57247f2020-03-03 23:40:52 +053084#define APPL_INTR_STATUS_L1_15_CFG_BME_CHGED BIT(1)
Vidya Sagar56e15a22019-08-13 17:06:27 +053085
86#define APPL_INTR_EN_L1_8_0 0x44
87#define APPL_INTR_EN_L1_8_BW_MGT_INT_EN BIT(2)
88#define APPL_INTR_EN_L1_8_AUTO_BW_INT_EN BIT(3)
89#define APPL_INTR_EN_L1_8_INTX_EN BIT(11)
90#define APPL_INTR_EN_L1_8_AER_INT_EN BIT(15)
91
92#define APPL_INTR_STATUS_L1_8_0 0x4C
93#define APPL_INTR_STATUS_L1_8_0_EDMA_INT_MASK GENMASK(11, 6)
94#define APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS BIT(2)
95#define APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS BIT(3)
96
97#define APPL_INTR_STATUS_L1_9 0x54
98#define APPL_INTR_STATUS_L1_10 0x58
99#define APPL_INTR_STATUS_L1_11 0x64
100#define APPL_INTR_STATUS_L1_13 0x74
101#define APPL_INTR_STATUS_L1_14 0x78
102#define APPL_INTR_STATUS_L1_15 0x7C
103#define APPL_INTR_STATUS_L1_17 0x88
104
105#define APPL_INTR_EN_L1_18 0x90
106#define APPL_INTR_EN_L1_18_CDM_REG_CHK_CMPLT BIT(2)
107#define APPL_INTR_EN_L1_18_CDM_REG_CHK_CMP_ERR BIT(1)
108#define APPL_INTR_EN_L1_18_CDM_REG_CHK_LOGIC_ERR BIT(0)
109
110#define APPL_INTR_STATUS_L1_18 0x94
111#define APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMPLT BIT(2)
112#define APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMP_ERR BIT(1)
113#define APPL_INTR_STATUS_L1_18_CDM_REG_CHK_LOGIC_ERR BIT(0)
114
Vidya Sagarc57247f2020-03-03 23:40:52 +0530115#define APPL_MSI_CTRL_1 0xAC
116
Vidya Sagar56e15a22019-08-13 17:06:27 +0530117#define APPL_MSI_CTRL_2 0xB0
118
Vidya Sagarc57247f2020-03-03 23:40:52 +0530119#define APPL_LEGACY_INTX 0xB8
120
Vidya Sagar56e15a22019-08-13 17:06:27 +0530121#define APPL_LTR_MSG_1 0xC4
122#define LTR_MSG_REQ BIT(15)
123#define LTR_MST_NO_SNOOP_SHIFT 16
124
125#define APPL_LTR_MSG_2 0xC8
126#define APPL_LTR_MSG_2_LTR_MSG_REQ_STATE BIT(3)
127
128#define APPL_LINK_STATUS 0xCC
129#define APPL_LINK_STATUS_RDLH_LINK_UP BIT(0)
130
131#define APPL_DEBUG 0xD0
132#define APPL_DEBUG_PM_LINKST_IN_L2_LAT BIT(21)
133#define APPL_DEBUG_PM_LINKST_IN_L0 0x11
134#define APPL_DEBUG_LTSSM_STATE_MASK GENMASK(8, 3)
135#define APPL_DEBUG_LTSSM_STATE_SHIFT 3
136#define LTSSM_STATE_PRE_DETECT 5
137
138#define APPL_RADM_STATUS 0xE4
139#define APPL_PM_XMT_TURNOFF_STATE BIT(0)
140
141#define APPL_DM_TYPE 0x100
142#define APPL_DM_TYPE_MASK GENMASK(3, 0)
143#define APPL_DM_TYPE_RP 0x4
144#define APPL_DM_TYPE_EP 0x0
145
146#define APPL_CFG_BASE_ADDR 0x104
147#define APPL_CFG_BASE_ADDR_MASK GENMASK(31, 12)
148
149#define APPL_CFG_IATU_DMA_BASE_ADDR 0x108
150#define APPL_CFG_IATU_DMA_BASE_ADDR_MASK GENMASK(31, 18)
151
152#define APPL_CFG_MISC 0x110
153#define APPL_CFG_MISC_SLV_EP_MODE BIT(14)
154#define APPL_CFG_MISC_ARCACHE_MASK GENMASK(13, 10)
155#define APPL_CFG_MISC_ARCACHE_SHIFT 10
156#define APPL_CFG_MISC_ARCACHE_VAL 3
157
158#define APPL_CFG_SLCG_OVERRIDE 0x114
159#define APPL_CFG_SLCG_OVERRIDE_SLCG_EN_MASTER BIT(0)
160
161#define APPL_CAR_RESET_OVRD 0x12C
162#define APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N BIT(0)
163
164#define IO_BASE_IO_DECODE BIT(0)
165#define IO_BASE_IO_DECODE_BIT8 BIT(8)
166
167#define CFG_PREF_MEM_LIMIT_BASE_MEM_DECODE BIT(0)
168#define CFG_PREF_MEM_LIMIT_BASE_MEM_LIMIT_DECODE BIT(16)
169
170#define CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF 0x718
171#define CFG_TIMER_CTRL_ACK_NAK_SHIFT (19)
172
173#define EVENT_COUNTER_ALL_CLEAR 0x3
174#define EVENT_COUNTER_ENABLE_ALL 0x7
175#define EVENT_COUNTER_ENABLE_SHIFT 2
176#define EVENT_COUNTER_EVENT_SEL_MASK GENMASK(7, 0)
177#define EVENT_COUNTER_EVENT_SEL_SHIFT 16
178#define EVENT_COUNTER_EVENT_Tx_L0S 0x2
179#define EVENT_COUNTER_EVENT_Rx_L0S 0x3
180#define EVENT_COUNTER_EVENT_L1 0x5
181#define EVENT_COUNTER_EVENT_L1_1 0x7
182#define EVENT_COUNTER_EVENT_L1_2 0x8
183#define EVENT_COUNTER_GROUP_SEL_SHIFT 24
184#define EVENT_COUNTER_GROUP_5 0x5
185
Vidya Sagar56e15a22019-08-13 17:06:27 +0530186#define N_FTS_VAL 52
Vidya Sagar56e15a22019-08-13 17:06:27 +0530187#define FTS_VAL 52
188
189#define PORT_LOGIC_MSI_CTRL_INT_0_EN 0x828
190
191#define GEN3_EQ_CONTROL_OFF 0x8a8
192#define GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_SHIFT 8
193#define GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_MASK GENMASK(23, 8)
194#define GEN3_EQ_CONTROL_OFF_FB_MODE_MASK GENMASK(3, 0)
195
196#define GEN3_RELATED_OFF 0x890
197#define GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL BIT(0)
198#define GEN3_RELATED_OFF_GEN3_EQ_DISABLE BIT(16)
199#define GEN3_RELATED_OFF_RATE_SHADOW_SEL_SHIFT 24
200#define GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK GENMASK(25, 24)
201
202#define PORT_LOGIC_AMBA_ERROR_RESPONSE_DEFAULT 0x8D0
203#define AMBA_ERROR_RESPONSE_CRS_SHIFT 3
204#define AMBA_ERROR_RESPONSE_CRS_MASK GENMASK(1, 0)
205#define AMBA_ERROR_RESPONSE_CRS_OKAY 0
206#define AMBA_ERROR_RESPONSE_CRS_OKAY_FFFFFFFF 1
207#define AMBA_ERROR_RESPONSE_CRS_OKAY_FFFF0001 2
208
Vidya Sagarc57247f2020-03-03 23:40:52 +0530209#define MSIX_ADDR_MATCH_LOW_OFF 0x940
210#define MSIX_ADDR_MATCH_LOW_OFF_EN BIT(0)
211#define MSIX_ADDR_MATCH_LOW_OFF_MASK GENMASK(31, 2)
212
213#define MSIX_ADDR_MATCH_HIGH_OFF 0x944
214#define MSIX_ADDR_MATCH_HIGH_OFF_MASK GENMASK(31, 0)
215
Vidya Sagar56e15a22019-08-13 17:06:27 +0530216#define PORT_LOGIC_MSIX_DOORBELL 0x948
217
218#define CAP_SPCIE_CAP_OFF 0x154
219#define CAP_SPCIE_CAP_OFF_DSP_TX_PRESET0_MASK GENMASK(3, 0)
220#define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_MASK GENMASK(11, 8)
221#define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_SHIFT 8
222
223#define PME_ACK_TIMEOUT 10000
224
225#define LTSSM_TIMEOUT 50000 /* 50ms */
226
227#define GEN3_GEN4_EQ_PRESET_INIT 5
228
229#define GEN1_CORE_CLK_FREQ 62500000
230#define GEN2_CORE_CLK_FREQ 125000000
231#define GEN3_CORE_CLK_FREQ 250000000
232#define GEN4_CORE_CLK_FREQ 500000000
233
Vidya Sagarc57247f2020-03-03 23:40:52 +0530234#define LTR_MSG_TIMEOUT (100 * 1000)
235
236#define PERST_DEBOUNCE_TIME (5 * 1000)
237
238#define EP_STATE_DISABLED 0
239#define EP_STATE_ENABLED 1
240
Vidya Sagar56e15a22019-08-13 17:06:27 +0530241static const unsigned int pcie_gen_freq[] = {
242 GEN1_CORE_CLK_FREQ,
243 GEN2_CORE_CLK_FREQ,
244 GEN3_CORE_CLK_FREQ,
245 GEN4_CORE_CLK_FREQ
246};
247
Vidya Sagar56e15a22019-08-13 17:06:27 +0530248struct tegra_pcie_dw {
249 struct device *dev;
250 struct resource *appl_res;
251 struct resource *dbi_res;
252 struct resource *atu_dma_res;
253 void __iomem *appl_base;
254 struct clk *core_clk;
255 struct reset_control *core_apb_rst;
256 struct reset_control *core_rst;
257 struct dw_pcie pci;
258 struct tegra_bpmp *bpmp;
259
Vidya Sagarc57247f2020-03-03 23:40:52 +0530260 enum dw_pcie_device_mode mode;
261
Vidya Sagar56e15a22019-08-13 17:06:27 +0530262 bool supports_clkreq;
263 bool enable_cdm_check;
264 bool link_state;
265 bool update_fc_fixup;
266 u8 init_link_width;
267 u32 msi_ctrl_int;
268 u32 num_lanes;
Vidya Sagar56e15a22019-08-13 17:06:27 +0530269 u32 cid;
270 u32 cfg_link_cap_l1sub;
271 u32 pcie_cap_base;
272 u32 aspm_cmrt;
273 u32 aspm_pwr_on_t;
274 u32 aspm_l0s_enter_lat;
275
276 struct regulator *pex_ctl_supply;
Vidya Sagar0a901f22019-09-05 16:15:51 +0530277 struct regulator *slot_ctl_3v3;
278 struct regulator *slot_ctl_12v;
Vidya Sagar56e15a22019-08-13 17:06:27 +0530279
280 unsigned int phy_count;
281 struct phy **phys;
282
283 struct dentry *debugfs;
Vidya Sagarc57247f2020-03-03 23:40:52 +0530284
285 /* Endpoint mode specific */
286 struct gpio_desc *pex_rst_gpiod;
287 struct gpio_desc *pex_refclk_sel_gpiod;
288 unsigned int pex_rst_irq;
289 int ep_state;
290};
291
292struct tegra_pcie_dw_of_data {
293 enum dw_pcie_device_mode mode;
Vidya Sagar56e15a22019-08-13 17:06:27 +0530294};
295
296static inline struct tegra_pcie_dw *to_tegra_pcie(struct dw_pcie *pci)
297{
298 return container_of(pci, struct tegra_pcie_dw, pci);
299}
300
301static inline void appl_writel(struct tegra_pcie_dw *pcie, const u32 value,
302 const u32 reg)
303{
304 writel_relaxed(value, pcie->appl_base + reg);
305}
306
307static inline u32 appl_readl(struct tegra_pcie_dw *pcie, const u32 reg)
308{
309 return readl_relaxed(pcie->appl_base + reg);
310}
311
312struct tegra_pcie_soc {
313 enum dw_pcie_device_mode mode;
314};
315
316static void apply_bad_link_workaround(struct pcie_port *pp)
317{
318 struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
319 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
320 u32 current_link_width;
321 u16 val;
322
323 /*
324 * NOTE:- Since this scenario is uncommon and link as such is not
325 * stable anyway, not waiting to confirm if link is really
326 * transitioning to Gen-2 speed
327 */
328 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA);
329 if (val & PCI_EXP_LNKSTA_LBMS) {
330 current_link_width = (val & PCI_EXP_LNKSTA_NLW) >>
331 PCI_EXP_LNKSTA_NLW_SHIFT;
332 if (pcie->init_link_width > current_link_width) {
333 dev_warn(pci->dev, "PCIe link is bad, width reduced\n");
334 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base +
335 PCI_EXP_LNKCTL2);
336 val &= ~PCI_EXP_LNKCTL2_TLS;
337 val |= PCI_EXP_LNKCTL2_TLS_2_5GT;
338 dw_pcie_writew_dbi(pci, pcie->pcie_cap_base +
339 PCI_EXP_LNKCTL2, val);
340
341 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base +
342 PCI_EXP_LNKCTL);
343 val |= PCI_EXP_LNKCTL_RL;
344 dw_pcie_writew_dbi(pci, pcie->pcie_cap_base +
345 PCI_EXP_LNKCTL, val);
346 }
347 }
348}
349
Vidya Sagarc57247f2020-03-03 23:40:52 +0530350static irqreturn_t tegra_pcie_rp_irq_handler(int irq, void *arg)
Vidya Sagar56e15a22019-08-13 17:06:27 +0530351{
Vidya Sagarc57247f2020-03-03 23:40:52 +0530352 struct tegra_pcie_dw *pcie = arg;
Vidya Sagar56e15a22019-08-13 17:06:27 +0530353 struct dw_pcie *pci = &pcie->pci;
354 struct pcie_port *pp = &pci->pp;
355 u32 val, tmp;
356 u16 val_w;
357
358 val = appl_readl(pcie, APPL_INTR_STATUS_L0);
359 if (val & APPL_INTR_STATUS_L0_LINK_STATE_INT) {
360 val = appl_readl(pcie, APPL_INTR_STATUS_L1_0_0);
361 if (val & APPL_INTR_STATUS_L1_0_0_LINK_REQ_RST_NOT_CHGED) {
362 appl_writel(pcie, val, APPL_INTR_STATUS_L1_0_0);
363
364 /* SBR & Surprise Link Down WAR */
365 val = appl_readl(pcie, APPL_CAR_RESET_OVRD);
366 val &= ~APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N;
367 appl_writel(pcie, val, APPL_CAR_RESET_OVRD);
368 udelay(1);
369 val = appl_readl(pcie, APPL_CAR_RESET_OVRD);
370 val |= APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N;
371 appl_writel(pcie, val, APPL_CAR_RESET_OVRD);
372
Rob Herring84667a42020-08-20 21:54:11 -0600373 val = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL);
374 val |= PORT_LOGIC_SPEED_CHANGE;
375 dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val);
Vidya Sagar56e15a22019-08-13 17:06:27 +0530376 }
377 }
378
379 if (val & APPL_INTR_STATUS_L0_INT_INT) {
380 val = appl_readl(pcie, APPL_INTR_STATUS_L1_8_0);
381 if (val & APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS) {
382 appl_writel(pcie,
383 APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS,
384 APPL_INTR_STATUS_L1_8_0);
385 apply_bad_link_workaround(pp);
386 }
387 if (val & APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS) {
388 appl_writel(pcie,
389 APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS,
390 APPL_INTR_STATUS_L1_8_0);
391
392 val_w = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base +
393 PCI_EXP_LNKSTA);
394 dev_dbg(pci->dev, "Link Speed : Gen-%u\n", val_w &
395 PCI_EXP_LNKSTA_CLS);
396 }
397 }
398
399 val = appl_readl(pcie, APPL_INTR_STATUS_L0);
400 if (val & APPL_INTR_STATUS_L0_CDM_REG_CHK_INT) {
401 val = appl_readl(pcie, APPL_INTR_STATUS_L1_18);
402 tmp = dw_pcie_readl_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS);
403 if (val & APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMPLT) {
404 dev_info(pci->dev, "CDM check complete\n");
405 tmp |= PCIE_PL_CHK_REG_CHK_REG_COMPLETE;
406 }
407 if (val & APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMP_ERR) {
408 dev_err(pci->dev, "CDM comparison mismatch\n");
409 tmp |= PCIE_PL_CHK_REG_CHK_REG_COMPARISON_ERROR;
410 }
411 if (val & APPL_INTR_STATUS_L1_18_CDM_REG_CHK_LOGIC_ERR) {
412 dev_err(pci->dev, "CDM Logic error\n");
413 tmp |= PCIE_PL_CHK_REG_CHK_REG_LOGIC_ERROR;
414 }
415 dw_pcie_writel_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS, tmp);
416 tmp = dw_pcie_readl_dbi(pci, PCIE_PL_CHK_REG_ERR_ADDR);
417 dev_err(pci->dev, "CDM Error Address Offset = 0x%08X\n", tmp);
418 }
419
420 return IRQ_HANDLED;
421}
422
Vidya Sagarc57247f2020-03-03 23:40:52 +0530423static void pex_ep_event_hot_rst_done(struct tegra_pcie_dw *pcie)
424{
425 u32 val;
426
427 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L0);
428 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0);
429 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_1);
430 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_2);
431 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_3);
432 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_6);
433 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_7);
434 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_8_0);
435 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_9);
436 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_10);
437 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_11);
438 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_13);
439 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_14);
440 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_15);
441 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_17);
442 appl_writel(pcie, 0xFFFFFFFF, APPL_MSI_CTRL_2);
443
444 val = appl_readl(pcie, APPL_CTRL);
445 val |= APPL_CTRL_LTSSM_EN;
446 appl_writel(pcie, val, APPL_CTRL);
447}
448
449static irqreturn_t tegra_pcie_ep_irq_thread(int irq, void *arg)
Vidya Sagar56e15a22019-08-13 17:06:27 +0530450{
451 struct tegra_pcie_dw *pcie = arg;
Vidya Sagarc57247f2020-03-03 23:40:52 +0530452 struct dw_pcie *pci = &pcie->pci;
453 u32 val, speed;
Vidya Sagar56e15a22019-08-13 17:06:27 +0530454
Vidya Sagarc57247f2020-03-03 23:40:52 +0530455 speed = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) &
456 PCI_EXP_LNKSTA_CLS;
457 clk_set_rate(pcie->core_clk, pcie_gen_freq[speed - 1]);
458
459 /* If EP doesn't advertise L1SS, just return */
460 val = dw_pcie_readl_dbi(pci, pcie->cfg_link_cap_l1sub);
461 if (!(val & (PCI_L1SS_CAP_ASPM_L1_1 | PCI_L1SS_CAP_ASPM_L1_2)))
462 return IRQ_HANDLED;
463
464 /* Check if BME is set to '1' */
465 val = dw_pcie_readl_dbi(pci, PCI_COMMAND);
466 if (val & PCI_COMMAND_MASTER) {
467 ktime_t timeout;
468
469 /* 110us for both snoop and no-snoop */
470 val = 110 | (2 << PCI_LTR_SCALE_SHIFT) | LTR_MSG_REQ;
471 val |= (val << LTR_MST_NO_SNOOP_SHIFT);
472 appl_writel(pcie, val, APPL_LTR_MSG_1);
473
474 /* Send LTR upstream */
475 val = appl_readl(pcie, APPL_LTR_MSG_2);
476 val |= APPL_LTR_MSG_2_LTR_MSG_REQ_STATE;
477 appl_writel(pcie, val, APPL_LTR_MSG_2);
478
479 timeout = ktime_add_us(ktime_get(), LTR_MSG_TIMEOUT);
480 for (;;) {
481 val = appl_readl(pcie, APPL_LTR_MSG_2);
482 if (!(val & APPL_LTR_MSG_2_LTR_MSG_REQ_STATE))
483 break;
484 if (ktime_after(ktime_get(), timeout))
485 break;
486 usleep_range(1000, 1100);
487 }
488 if (val & APPL_LTR_MSG_2_LTR_MSG_REQ_STATE)
489 dev_err(pcie->dev, "Failed to send LTR message\n");
490 }
491
492 return IRQ_HANDLED;
493}
494
495static irqreturn_t tegra_pcie_ep_hard_irq(int irq, void *arg)
496{
497 struct tegra_pcie_dw *pcie = arg;
498 struct dw_pcie_ep *ep = &pcie->pci.ep;
499 int spurious = 1;
Om Prakash Singhceb14122021-06-23 15:35:21 +0530500 u32 status_l0, status_l1, link_status;
Vidya Sagarc57247f2020-03-03 23:40:52 +0530501
Om Prakash Singhceb14122021-06-23 15:35:21 +0530502 status_l0 = appl_readl(pcie, APPL_INTR_STATUS_L0);
503 if (status_l0 & APPL_INTR_STATUS_L0_LINK_STATE_INT) {
504 status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_0_0);
505 appl_writel(pcie, status_l1, APPL_INTR_STATUS_L1_0_0);
Vidya Sagarc57247f2020-03-03 23:40:52 +0530506
Om Prakash Singhceb14122021-06-23 15:35:21 +0530507 if (status_l1 & APPL_INTR_STATUS_L1_0_0_HOT_RESET_DONE)
Vidya Sagarc57247f2020-03-03 23:40:52 +0530508 pex_ep_event_hot_rst_done(pcie);
509
Om Prakash Singhceb14122021-06-23 15:35:21 +0530510 if (status_l1 & APPL_INTR_STATUS_L1_0_0_RDLH_LINK_UP_CHGED) {
511 link_status = appl_readl(pcie, APPL_LINK_STATUS);
512 if (link_status & APPL_LINK_STATUS_RDLH_LINK_UP) {
Vidya Sagarc57247f2020-03-03 23:40:52 +0530513 dev_dbg(pcie->dev, "Link is up with Host\n");
514 dw_pcie_ep_linkup(ep);
515 }
516 }
517
518 spurious = 0;
519 }
520
Om Prakash Singhceb14122021-06-23 15:35:21 +0530521 if (status_l0 & APPL_INTR_STATUS_L0_PCI_CMD_EN_INT) {
522 status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_15);
523 appl_writel(pcie, status_l1, APPL_INTR_STATUS_L1_15);
Vidya Sagarc57247f2020-03-03 23:40:52 +0530524
Om Prakash Singhceb14122021-06-23 15:35:21 +0530525 if (status_l1 & APPL_INTR_STATUS_L1_15_CFG_BME_CHGED)
Vidya Sagarc57247f2020-03-03 23:40:52 +0530526 return IRQ_WAKE_THREAD;
527
528 spurious = 0;
529 }
530
531 if (spurious) {
532 dev_warn(pcie->dev, "Random interrupt (STATUS = 0x%08X)\n",
Om Prakash Singhceb14122021-06-23 15:35:21 +0530533 status_l0);
534 appl_writel(pcie, status_l0, APPL_INTR_STATUS_L0);
Vidya Sagarc57247f2020-03-03 23:40:52 +0530535 }
536
537 return IRQ_HANDLED;
Vidya Sagar56e15a22019-08-13 17:06:27 +0530538}
539
Rob Herring692ccce72020-08-20 21:53:47 -0600540static int tegra_pcie_dw_rd_own_conf(struct pci_bus *bus, u32 devfn, int where,
541 int size, u32 *val)
Vidya Sagar56e15a22019-08-13 17:06:27 +0530542{
Vidya Sagar56e15a22019-08-13 17:06:27 +0530543 /*
544 * This is an endpoint mode specific register happen to appear even
545 * when controller is operating in root port mode and system hangs
546 * when it is accessed with link being in ASPM-L1 state.
547 * So skip accessing it altogether
548 */
Rob Herring692ccce72020-08-20 21:53:47 -0600549 if (!PCI_SLOT(devfn) && where == PORT_LOGIC_MSIX_DOORBELL) {
Vidya Sagar56e15a22019-08-13 17:06:27 +0530550 *val = 0x00000000;
551 return PCIBIOS_SUCCESSFUL;
552 }
553
Rob Herring692ccce72020-08-20 21:53:47 -0600554 return pci_generic_config_read(bus, devfn, where, size, val);
Vidya Sagar56e15a22019-08-13 17:06:27 +0530555}
556
Rob Herring692ccce72020-08-20 21:53:47 -0600557static int tegra_pcie_dw_wr_own_conf(struct pci_bus *bus, u32 devfn, int where,
558 int size, u32 val)
Vidya Sagar56e15a22019-08-13 17:06:27 +0530559{
Vidya Sagar56e15a22019-08-13 17:06:27 +0530560 /*
561 * This is an endpoint mode specific register happen to appear even
562 * when controller is operating in root port mode and system hangs
563 * when it is accessed with link being in ASPM-L1 state.
564 * So skip accessing it altogether
565 */
Rob Herring692ccce72020-08-20 21:53:47 -0600566 if (!PCI_SLOT(devfn) && where == PORT_LOGIC_MSIX_DOORBELL)
Vidya Sagar56e15a22019-08-13 17:06:27 +0530567 return PCIBIOS_SUCCESSFUL;
568
Rob Herring692ccce72020-08-20 21:53:47 -0600569 return pci_generic_config_write(bus, devfn, where, size, val);
Vidya Sagar56e15a22019-08-13 17:06:27 +0530570}
571
Rob Herring692ccce72020-08-20 21:53:47 -0600572static struct pci_ops tegra_pci_ops = {
573 .map_bus = dw_pcie_own_conf_map_bus,
574 .read = tegra_pcie_dw_rd_own_conf,
575 .write = tegra_pcie_dw_wr_own_conf,
576};
577
Vidya Sagar56e15a22019-08-13 17:06:27 +0530578#if defined(CONFIG_PCIEASPM)
Jon Huntera5123602021-06-10 07:41:34 +0100579static const u32 event_cntr_ctrl_offset[] = {
580 0x1d8,
581 0x1a8,
582 0x1a8,
583 0x1a8,
584 0x1c4,
585 0x1d8
586};
587
588static const u32 event_cntr_data_offset[] = {
589 0x1dc,
590 0x1ac,
591 0x1ac,
592 0x1ac,
593 0x1c8,
594 0x1dc
595};
596
Vidya Sagar56e15a22019-08-13 17:06:27 +0530597static void disable_aspm_l11(struct tegra_pcie_dw *pcie)
598{
599 u32 val;
600
601 val = dw_pcie_readl_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub);
602 val &= ~PCI_L1SS_CAP_ASPM_L1_1;
603 dw_pcie_writel_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub, val);
604}
605
606static void disable_aspm_l12(struct tegra_pcie_dw *pcie)
607{
608 u32 val;
609
610 val = dw_pcie_readl_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub);
611 val &= ~PCI_L1SS_CAP_ASPM_L1_2;
612 dw_pcie_writel_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub, val);
613}
614
615static inline u32 event_counter_prog(struct tegra_pcie_dw *pcie, u32 event)
616{
617 u32 val;
618
619 val = dw_pcie_readl_dbi(&pcie->pci, event_cntr_ctrl_offset[pcie->cid]);
620 val &= ~(EVENT_COUNTER_EVENT_SEL_MASK << EVENT_COUNTER_EVENT_SEL_SHIFT);
621 val |= EVENT_COUNTER_GROUP_5 << EVENT_COUNTER_GROUP_SEL_SHIFT;
622 val |= event << EVENT_COUNTER_EVENT_SEL_SHIFT;
623 val |= EVENT_COUNTER_ENABLE_ALL << EVENT_COUNTER_ENABLE_SHIFT;
624 dw_pcie_writel_dbi(&pcie->pci, event_cntr_ctrl_offset[pcie->cid], val);
625 val = dw_pcie_readl_dbi(&pcie->pci, event_cntr_data_offset[pcie->cid]);
626
627 return val;
628}
629
630static int aspm_state_cnt(struct seq_file *s, void *data)
631{
632 struct tegra_pcie_dw *pcie = (struct tegra_pcie_dw *)
633 dev_get_drvdata(s->private);
634 u32 val;
635
636 seq_printf(s, "Tx L0s entry count : %u\n",
637 event_counter_prog(pcie, EVENT_COUNTER_EVENT_Tx_L0S));
638
639 seq_printf(s, "Rx L0s entry count : %u\n",
640 event_counter_prog(pcie, EVENT_COUNTER_EVENT_Rx_L0S));
641
642 seq_printf(s, "Link L1 entry count : %u\n",
643 event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1));
644
645 seq_printf(s, "Link L1.1 entry count : %u\n",
646 event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1_1));
647
648 seq_printf(s, "Link L1.2 entry count : %u\n",
649 event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1_2));
650
651 /* Clear all counters */
652 dw_pcie_writel_dbi(&pcie->pci, event_cntr_ctrl_offset[pcie->cid],
653 EVENT_COUNTER_ALL_CLEAR);
654
655 /* Re-enable counting */
656 val = EVENT_COUNTER_ENABLE_ALL << EVENT_COUNTER_ENABLE_SHIFT;
657 val |= EVENT_COUNTER_GROUP_5 << EVENT_COUNTER_GROUP_SEL_SHIFT;
658 dw_pcie_writel_dbi(&pcie->pci, event_cntr_ctrl_offset[pcie->cid], val);
659
660 return 0;
661}
662
663static void init_host_aspm(struct tegra_pcie_dw *pcie)
664{
665 struct dw_pcie *pci = &pcie->pci;
666 u32 val;
667
668 val = dw_pcie_find_ext_capability(pci, PCI_EXT_CAP_ID_L1SS);
669 pcie->cfg_link_cap_l1sub = val + PCI_L1SS_CAP;
670
671 /* Enable ASPM counters */
672 val = EVENT_COUNTER_ENABLE_ALL << EVENT_COUNTER_ENABLE_SHIFT;
673 val |= EVENT_COUNTER_GROUP_5 << EVENT_COUNTER_GROUP_SEL_SHIFT;
674 dw_pcie_writel_dbi(pci, event_cntr_ctrl_offset[pcie->cid], val);
675
676 /* Program T_cmrt and T_pwr_on values */
677 val = dw_pcie_readl_dbi(pci, pcie->cfg_link_cap_l1sub);
678 val &= ~(PCI_L1SS_CAP_CM_RESTORE_TIME | PCI_L1SS_CAP_P_PWR_ON_VALUE);
679 val |= (pcie->aspm_cmrt << 8);
680 val |= (pcie->aspm_pwr_on_t << 19);
681 dw_pcie_writel_dbi(pci, pcie->cfg_link_cap_l1sub, val);
682
683 /* Program L0s and L1 entrance latencies */
Rob Herring84667a42020-08-20 21:54:11 -0600684 val = dw_pcie_readl_dbi(pci, PCIE_PORT_AFR);
685 val &= ~PORT_AFR_L0S_ENTRANCE_LAT_MASK;
686 val |= (pcie->aspm_l0s_enter_lat << PORT_AFR_L0S_ENTRANCE_LAT_SHIFT);
687 val |= PORT_AFR_ENTER_ASPM;
688 dw_pcie_writel_dbi(pci, PCIE_PORT_AFR, val);
Vidya Sagar56e15a22019-08-13 17:06:27 +0530689}
690
Greg Kroah-Hartmand27b1cd2020-08-18 15:37:39 +0200691static void init_debugfs(struct tegra_pcie_dw *pcie)
Vidya Sagar56e15a22019-08-13 17:06:27 +0530692{
Greg Kroah-Hartmand27b1cd2020-08-18 15:37:39 +0200693 debugfs_create_devm_seqfile(pcie->dev, "aspm_state_cnt", pcie->debugfs,
694 aspm_state_cnt);
Vidya Sagar56e15a22019-08-13 17:06:27 +0530695}
696#else
697static inline void disable_aspm_l12(struct tegra_pcie_dw *pcie) { return; }
698static inline void disable_aspm_l11(struct tegra_pcie_dw *pcie) { return; }
699static inline void init_host_aspm(struct tegra_pcie_dw *pcie) { return; }
Greg Kroah-Hartmand27b1cd2020-08-18 15:37:39 +0200700static inline void init_debugfs(struct tegra_pcie_dw *pcie) { return; }
Vidya Sagar56e15a22019-08-13 17:06:27 +0530701#endif
702
703static void tegra_pcie_enable_system_interrupts(struct pcie_port *pp)
704{
705 struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
706 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
707 u32 val;
708 u16 val_w;
709
710 val = appl_readl(pcie, APPL_INTR_EN_L0_0);
711 val |= APPL_INTR_EN_L0_0_LINK_STATE_INT_EN;
712 appl_writel(pcie, val, APPL_INTR_EN_L0_0);
713
714 val = appl_readl(pcie, APPL_INTR_EN_L1_0_0);
715 val |= APPL_INTR_EN_L1_0_0_LINK_REQ_RST_NOT_INT_EN;
716 appl_writel(pcie, val, APPL_INTR_EN_L1_0_0);
717
718 if (pcie->enable_cdm_check) {
719 val = appl_readl(pcie, APPL_INTR_EN_L0_0);
720 val |= APPL_INTR_EN_L0_0_CDM_REG_CHK_INT_EN;
721 appl_writel(pcie, val, APPL_INTR_EN_L0_0);
722
723 val = appl_readl(pcie, APPL_INTR_EN_L1_18);
724 val |= APPL_INTR_EN_L1_18_CDM_REG_CHK_CMP_ERR;
725 val |= APPL_INTR_EN_L1_18_CDM_REG_CHK_LOGIC_ERR;
726 appl_writel(pcie, val, APPL_INTR_EN_L1_18);
727 }
728
729 val_w = dw_pcie_readw_dbi(&pcie->pci, pcie->pcie_cap_base +
730 PCI_EXP_LNKSTA);
731 pcie->init_link_width = (val_w & PCI_EXP_LNKSTA_NLW) >>
732 PCI_EXP_LNKSTA_NLW_SHIFT;
733
734 val_w = dw_pcie_readw_dbi(&pcie->pci, pcie->pcie_cap_base +
735 PCI_EXP_LNKCTL);
736 val_w |= PCI_EXP_LNKCTL_LBMIE;
737 dw_pcie_writew_dbi(&pcie->pci, pcie->pcie_cap_base + PCI_EXP_LNKCTL,
738 val_w);
739}
740
741static void tegra_pcie_enable_legacy_interrupts(struct pcie_port *pp)
742{
743 struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
744 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
745 u32 val;
746
747 /* Enable legacy interrupt generation */
748 val = appl_readl(pcie, APPL_INTR_EN_L0_0);
749 val |= APPL_INTR_EN_L0_0_SYS_INTR_EN;
750 val |= APPL_INTR_EN_L0_0_INT_INT_EN;
751 appl_writel(pcie, val, APPL_INTR_EN_L0_0);
752
753 val = appl_readl(pcie, APPL_INTR_EN_L1_8_0);
754 val |= APPL_INTR_EN_L1_8_INTX_EN;
755 val |= APPL_INTR_EN_L1_8_AUTO_BW_INT_EN;
756 val |= APPL_INTR_EN_L1_8_BW_MGT_INT_EN;
757 if (IS_ENABLED(CONFIG_PCIEAER))
758 val |= APPL_INTR_EN_L1_8_AER_INT_EN;
759 appl_writel(pcie, val, APPL_INTR_EN_L1_8_0);
760}
761
762static void tegra_pcie_enable_msi_interrupts(struct pcie_port *pp)
763{
764 struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
765 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
766 u32 val;
767
Vidya Sagar56e15a22019-08-13 17:06:27 +0530768 /* Enable MSI interrupt generation */
769 val = appl_readl(pcie, APPL_INTR_EN_L0_0);
770 val |= APPL_INTR_EN_L0_0_SYS_MSI_INTR_EN;
771 val |= APPL_INTR_EN_L0_0_MSI_RCV_INT_EN;
772 appl_writel(pcie, val, APPL_INTR_EN_L0_0);
773}
774
775static void tegra_pcie_enable_interrupts(struct pcie_port *pp)
776{
777 struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
778 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
779
780 /* Clear interrupt statuses before enabling interrupts */
781 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L0);
782 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0);
783 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_1);
784 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_2);
785 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_3);
786 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_6);
787 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_7);
788 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_8_0);
789 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_9);
790 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_10);
791 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_11);
792 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_13);
793 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_14);
794 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_15);
795 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_17);
796
797 tegra_pcie_enable_system_interrupts(pp);
798 tegra_pcie_enable_legacy_interrupts(pp);
799 if (IS_ENABLED(CONFIG_PCI_MSI))
800 tegra_pcie_enable_msi_interrupts(pp);
801}
802
803static void config_gen3_gen4_eq_presets(struct tegra_pcie_dw *pcie)
804{
805 struct dw_pcie *pci = &pcie->pci;
806 u32 val, offset, i;
807
808 /* Program init preset */
809 for (i = 0; i < pcie->num_lanes; i++) {
Rob Herringfdd056f2020-08-20 21:54:20 -0600810 val = dw_pcie_readw_dbi(pci, CAP_SPCIE_CAP_OFF + (i * 2));
Vidya Sagar56e15a22019-08-13 17:06:27 +0530811 val &= ~CAP_SPCIE_CAP_OFF_DSP_TX_PRESET0_MASK;
812 val |= GEN3_GEN4_EQ_PRESET_INIT;
813 val &= ~CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_MASK;
814 val |= (GEN3_GEN4_EQ_PRESET_INIT <<
815 CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_SHIFT);
Rob Herringfdd056f2020-08-20 21:54:20 -0600816 dw_pcie_writew_dbi(pci, CAP_SPCIE_CAP_OFF + (i * 2), val);
Vidya Sagar56e15a22019-08-13 17:06:27 +0530817
818 offset = dw_pcie_find_ext_capability(pci,
819 PCI_EXT_CAP_ID_PL_16GT) +
820 PCI_PL_16GT_LE_CTRL;
Rob Herringfdd056f2020-08-20 21:54:20 -0600821 val = dw_pcie_readb_dbi(pci, offset + i);
Vidya Sagar56e15a22019-08-13 17:06:27 +0530822 val &= ~PCI_PL_16GT_LE_CTRL_DSP_TX_PRESET_MASK;
823 val |= GEN3_GEN4_EQ_PRESET_INIT;
824 val &= ~PCI_PL_16GT_LE_CTRL_USP_TX_PRESET_MASK;
825 val |= (GEN3_GEN4_EQ_PRESET_INIT <<
826 PCI_PL_16GT_LE_CTRL_USP_TX_PRESET_SHIFT);
Rob Herringfdd056f2020-08-20 21:54:20 -0600827 dw_pcie_writeb_dbi(pci, offset + i, val);
Vidya Sagar56e15a22019-08-13 17:06:27 +0530828 }
829
830 val = dw_pcie_readl_dbi(pci, GEN3_RELATED_OFF);
831 val &= ~GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK;
832 dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
833
834 val = dw_pcie_readl_dbi(pci, GEN3_EQ_CONTROL_OFF);
835 val &= ~GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_MASK;
836 val |= (0x3ff << GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_SHIFT);
837 val &= ~GEN3_EQ_CONTROL_OFF_FB_MODE_MASK;
838 dw_pcie_writel_dbi(pci, GEN3_EQ_CONTROL_OFF, val);
839
840 val = dw_pcie_readl_dbi(pci, GEN3_RELATED_OFF);
841 val &= ~GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK;
842 val |= (0x1 << GEN3_RELATED_OFF_RATE_SHADOW_SEL_SHIFT);
843 dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
844
845 val = dw_pcie_readl_dbi(pci, GEN3_EQ_CONTROL_OFF);
846 val &= ~GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_MASK;
847 val |= (0x360 << GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_SHIFT);
848 val &= ~GEN3_EQ_CONTROL_OFF_FB_MODE_MASK;
849 dw_pcie_writel_dbi(pci, GEN3_EQ_CONTROL_OFF, val);
850
851 val = dw_pcie_readl_dbi(pci, GEN3_RELATED_OFF);
852 val &= ~GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK;
853 dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
854}
855
Rob Herring275e88b2020-12-18 08:39:05 -0600856static int tegra_pcie_dw_host_init(struct pcie_port *pp)
Vidya Sagar56e15a22019-08-13 17:06:27 +0530857{
858 struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
859 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
860 u32 val;
861
Rob Herring275e88b2020-12-18 08:39:05 -0600862 pp->bridge->ops = &tegra_pci_ops;
863
Vidya Sagar369b8682020-11-26 00:52:34 +0530864 if (!pcie->pcie_cap_base)
865 pcie->pcie_cap_base = dw_pcie_find_capability(&pcie->pci,
866 PCI_CAP_ID_EXP);
867
Vidya Sagar56e15a22019-08-13 17:06:27 +0530868 val = dw_pcie_readl_dbi(pci, PCI_IO_BASE);
869 val &= ~(IO_BASE_IO_DECODE | IO_BASE_IO_DECODE_BIT8);
870 dw_pcie_writel_dbi(pci, PCI_IO_BASE, val);
871
872 val = dw_pcie_readl_dbi(pci, PCI_PREF_MEMORY_BASE);
873 val |= CFG_PREF_MEM_LIMIT_BASE_MEM_DECODE;
874 val |= CFG_PREF_MEM_LIMIT_BASE_MEM_LIMIT_DECODE;
875 dw_pcie_writel_dbi(pci, PCI_PREF_MEMORY_BASE, val);
876
877 dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_0, 0);
878
Vidya Sagar56e15a22019-08-13 17:06:27 +0530879 /* Enable as 0xFFFF0001 response for CRS */
880 val = dw_pcie_readl_dbi(pci, PORT_LOGIC_AMBA_ERROR_RESPONSE_DEFAULT);
881 val &= ~(AMBA_ERROR_RESPONSE_CRS_MASK << AMBA_ERROR_RESPONSE_CRS_SHIFT);
882 val |= (AMBA_ERROR_RESPONSE_CRS_OKAY_FFFF0001 <<
883 AMBA_ERROR_RESPONSE_CRS_SHIFT);
884 dw_pcie_writel_dbi(pci, PORT_LOGIC_AMBA_ERROR_RESPONSE_DEFAULT, val);
885
Vidya Sagar56e15a22019-08-13 17:06:27 +0530886 /* Configure Max lane width from DT */
887 val = dw_pcie_readl_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKCAP);
888 val &= ~PCI_EXP_LNKCAP_MLW;
889 val |= (pcie->num_lanes << PCI_EXP_LNKSTA_NLW_SHIFT);
890 dw_pcie_writel_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKCAP, val);
891
892 config_gen3_gen4_eq_presets(pcie);
893
894 init_host_aspm(pcie);
895
Vidya Sagar6b6fafc2020-12-03 19:04:47 +0530896 /* Disable ASPM-L1SS advertisement if there is no CLKREQ routing */
897 if (!pcie->supports_clkreq) {
898 disable_aspm_l11(pcie);
899 disable_aspm_l12(pcie);
900 }
901
Vidya Sagar56e15a22019-08-13 17:06:27 +0530902 val = dw_pcie_readl_dbi(pci, GEN3_RELATED_OFF);
903 val &= ~GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL;
904 dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
905
906 if (pcie->update_fc_fixup) {
907 val = dw_pcie_readl_dbi(pci, CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF);
908 val |= 0x1 << CFG_TIMER_CTRL_ACK_NAK_SHIFT;
909 dw_pcie_writel_dbi(pci, CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF, val);
910 }
911
Vidya Sagar56e15a22019-08-13 17:06:27 +0530912 clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ);
913
Rob Herring275e88b2020-12-18 08:39:05 -0600914 return 0;
915}
916
917static int tegra_pcie_dw_start_link(struct dw_pcie *pci)
918{
919 u32 val, offset, speed, tmp;
920 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
921 struct pcie_port *pp = &pci->pp;
922 bool retry = true;
923
924 if (pcie->mode == DW_PCIE_EP_TYPE) {
925 enable_irq(pcie->pex_rst_irq);
926 return 0;
927 }
928
929retry_link:
Vidya Sagar56e15a22019-08-13 17:06:27 +0530930 /* Assert RST */
931 val = appl_readl(pcie, APPL_PINMUX);
932 val &= ~APPL_PINMUX_PEX_RST;
933 appl_writel(pcie, val, APPL_PINMUX);
934
935 usleep_range(100, 200);
936
937 /* Enable LTSSM */
938 val = appl_readl(pcie, APPL_CTRL);
939 val |= APPL_CTRL_LTSSM_EN;
940 appl_writel(pcie, val, APPL_CTRL);
941
942 /* De-assert RST */
943 val = appl_readl(pcie, APPL_PINMUX);
944 val |= APPL_PINMUX_PEX_RST;
945 appl_writel(pcie, val, APPL_PINMUX);
946
947 msleep(100);
Vidya Sagar56e15a22019-08-13 17:06:27 +0530948
949 if (dw_pcie_wait_for_link(pci)) {
Rob Herring275e88b2020-12-18 08:39:05 -0600950 if (!retry)
951 return 0;
Vidya Sagar56e15a22019-08-13 17:06:27 +0530952 /*
953 * There are some endpoints which can't get the link up if
954 * root port has Data Link Feature (DLF) enabled.
955 * Refer Spec rev 4.0 ver 1.0 sec 3.4.2 & 7.7.4 for more info
956 * on Scaled Flow Control and DLF.
957 * So, need to confirm that is indeed the case here and attempt
958 * link up once again with DLF disabled.
959 */
960 val = appl_readl(pcie, APPL_DEBUG);
961 val &= APPL_DEBUG_LTSSM_STATE_MASK;
962 val >>= APPL_DEBUG_LTSSM_STATE_SHIFT;
963 tmp = appl_readl(pcie, APPL_LINK_STATUS);
964 tmp &= APPL_LINK_STATUS_RDLH_LINK_UP;
965 if (!(val == 0x11 && !tmp)) {
966 /* Link is down for all good reasons */
967 return 0;
968 }
969
970 dev_info(pci->dev, "Link is down in DLL");
971 dev_info(pci->dev, "Trying again with DLFE disabled\n");
972 /* Disable LTSSM */
973 val = appl_readl(pcie, APPL_CTRL);
974 val &= ~APPL_CTRL_LTSSM_EN;
975 appl_writel(pcie, val, APPL_CTRL);
976
977 reset_control_assert(pcie->core_rst);
978 reset_control_deassert(pcie->core_rst);
979
980 offset = dw_pcie_find_ext_capability(pci, PCI_EXT_CAP_ID_DLF);
981 val = dw_pcie_readl_dbi(pci, offset + PCI_DLF_CAP);
982 val &= ~PCI_DLF_EXCHANGE_ENABLE;
983 dw_pcie_writel_dbi(pci, offset, val);
984
Rob Herring275e88b2020-12-18 08:39:05 -0600985 tegra_pcie_dw_host_init(pp);
986 dw_pcie_setup_rc(pp);
Vidya Sagar56e15a22019-08-13 17:06:27 +0530987
Rob Herring275e88b2020-12-18 08:39:05 -0600988 retry = false;
989 goto retry_link;
Vidya Sagar56e15a22019-08-13 17:06:27 +0530990 }
991
992 speed = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) &
993 PCI_EXP_LNKSTA_CLS;
994 clk_set_rate(pcie->core_clk, pcie_gen_freq[speed - 1]);
995
996 tegra_pcie_enable_interrupts(pp);
997
998 return 0;
999}
1000
1001static int tegra_pcie_dw_link_up(struct dw_pcie *pci)
1002{
1003 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
1004 u32 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA);
1005
1006 return !!(val & PCI_EXP_LNKSTA_DLLLA);
1007}
1008
Vidya Sagarc57247f2020-03-03 23:40:52 +05301009static void tegra_pcie_dw_stop_link(struct dw_pcie *pci)
1010{
1011 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
1012
1013 disable_irq(pcie->pex_rst_irq);
1014}
1015
Vidya Sagar56e15a22019-08-13 17:06:27 +05301016static const struct dw_pcie_ops tegra_dw_pcie_ops = {
1017 .link_up = tegra_pcie_dw_link_up,
Vidya Sagarc57247f2020-03-03 23:40:52 +05301018 .start_link = tegra_pcie_dw_start_link,
1019 .stop_link = tegra_pcie_dw_stop_link,
Vidya Sagar56e15a22019-08-13 17:06:27 +05301020};
1021
Rikard Falkebornd895ce72021-02-07 23:16:04 +01001022static const struct dw_pcie_host_ops tegra_pcie_dw_host_ops = {
Vidya Sagar56e15a22019-08-13 17:06:27 +05301023 .host_init = tegra_pcie_dw_host_init,
Vidya Sagar56e15a22019-08-13 17:06:27 +05301024};
1025
1026static void tegra_pcie_disable_phy(struct tegra_pcie_dw *pcie)
1027{
1028 unsigned int phy_count = pcie->phy_count;
1029
1030 while (phy_count--) {
1031 phy_power_off(pcie->phys[phy_count]);
1032 phy_exit(pcie->phys[phy_count]);
1033 }
1034}
1035
1036static int tegra_pcie_enable_phy(struct tegra_pcie_dw *pcie)
1037{
1038 unsigned int i;
1039 int ret;
1040
1041 for (i = 0; i < pcie->phy_count; i++) {
1042 ret = phy_init(pcie->phys[i]);
1043 if (ret < 0)
1044 goto phy_power_off;
1045
1046 ret = phy_power_on(pcie->phys[i]);
1047 if (ret < 0)
1048 goto phy_exit;
1049 }
1050
1051 return 0;
1052
1053phy_power_off:
1054 while (i--) {
1055 phy_power_off(pcie->phys[i]);
1056phy_exit:
1057 phy_exit(pcie->phys[i]);
1058 }
1059
1060 return ret;
1061}
1062
1063static int tegra_pcie_dw_parse_dt(struct tegra_pcie_dw *pcie)
1064{
Vidya Sagard5353c02020-11-26 00:55:54 +05301065 struct platform_device *pdev = to_platform_device(pcie->dev);
Vidya Sagar56e15a22019-08-13 17:06:27 +05301066 struct device_node *np = pcie->dev->of_node;
1067 int ret;
1068
Vidya Sagard5353c02020-11-26 00:55:54 +05301069 pcie->dbi_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi");
1070 if (!pcie->dbi_res) {
1071 dev_err(pcie->dev, "Failed to find \"dbi\" region\n");
1072 return -ENODEV;
1073 }
1074
Vidya Sagar56e15a22019-08-13 17:06:27 +05301075 ret = of_property_read_u32(np, "nvidia,aspm-cmrt-us", &pcie->aspm_cmrt);
1076 if (ret < 0) {
1077 dev_info(pcie->dev, "Failed to read ASPM T_cmrt: %d\n", ret);
1078 return ret;
1079 }
1080
1081 ret = of_property_read_u32(np, "nvidia,aspm-pwr-on-t-us",
1082 &pcie->aspm_pwr_on_t);
1083 if (ret < 0)
1084 dev_info(pcie->dev, "Failed to read ASPM Power On time: %d\n",
1085 ret);
1086
1087 ret = of_property_read_u32(np, "nvidia,aspm-l0s-entrance-latency-us",
1088 &pcie->aspm_l0s_enter_lat);
1089 if (ret < 0)
1090 dev_info(pcie->dev,
1091 "Failed to read ASPM L0s Entrance latency: %d\n", ret);
1092
1093 ret = of_property_read_u32(np, "num-lanes", &pcie->num_lanes);
1094 if (ret < 0) {
1095 dev_err(pcie->dev, "Failed to read num-lanes: %d\n", ret);
1096 return ret;
1097 }
1098
Vidya Sagar56e15a22019-08-13 17:06:27 +05301099 ret = of_property_read_u32_index(np, "nvidia,bpmp", 1, &pcie->cid);
1100 if (ret) {
1101 dev_err(pcie->dev, "Failed to read Controller-ID: %d\n", ret);
1102 return ret;
1103 }
1104
1105 ret = of_property_count_strings(np, "phy-names");
1106 if (ret < 0) {
1107 dev_err(pcie->dev, "Failed to find PHY entries: %d\n",
1108 ret);
1109 return ret;
1110 }
1111 pcie->phy_count = ret;
1112
1113 if (of_property_read_bool(np, "nvidia,update-fc-fixup"))
1114 pcie->update_fc_fixup = true;
1115
1116 pcie->supports_clkreq =
1117 of_property_read_bool(pcie->dev->of_node, "supports-clkreq");
1118
1119 pcie->enable_cdm_check =
1120 of_property_read_bool(np, "snps,enable-cdm-check");
1121
Vidya Sagarc57247f2020-03-03 23:40:52 +05301122 if (pcie->mode == DW_PCIE_RC_TYPE)
1123 return 0;
1124
1125 /* Endpoint mode specific DT entries */
1126 pcie->pex_rst_gpiod = devm_gpiod_get(pcie->dev, "reset", GPIOD_IN);
1127 if (IS_ERR(pcie->pex_rst_gpiod)) {
Thierry Reding54455232020-03-19 14:12:30 +01001128 int err = PTR_ERR(pcie->pex_rst_gpiod);
1129 const char *level = KERN_ERR;
1130
1131 if (err == -EPROBE_DEFER)
1132 level = KERN_DEBUG;
1133
1134 dev_printk(level, pcie->dev,
1135 dev_fmt("Failed to get PERST GPIO: %d\n"),
1136 err);
1137 return err;
Vidya Sagarc57247f2020-03-03 23:40:52 +05301138 }
1139
1140 pcie->pex_refclk_sel_gpiod = devm_gpiod_get(pcie->dev,
1141 "nvidia,refclk-select",
1142 GPIOD_OUT_HIGH);
1143 if (IS_ERR(pcie->pex_refclk_sel_gpiod)) {
Thierry Reding54455232020-03-19 14:12:30 +01001144 int err = PTR_ERR(pcie->pex_refclk_sel_gpiod);
1145 const char *level = KERN_ERR;
1146
1147 if (err == -EPROBE_DEFER)
1148 level = KERN_DEBUG;
1149
1150 dev_printk(level, pcie->dev,
1151 dev_fmt("Failed to get REFCLK select GPIOs: %d\n"),
1152 err);
Vidya Sagarc57247f2020-03-03 23:40:52 +05301153 pcie->pex_refclk_sel_gpiod = NULL;
1154 }
1155
Vidya Sagar56e15a22019-08-13 17:06:27 +05301156 return 0;
1157}
1158
1159static int tegra_pcie_bpmp_set_ctrl_state(struct tegra_pcie_dw *pcie,
1160 bool enable)
1161{
1162 struct mrq_uphy_response resp;
1163 struct tegra_bpmp_message msg;
1164 struct mrq_uphy_request req;
1165
1166 /* Controller-5 doesn't need to have its state set by BPMP-FW */
1167 if (pcie->cid == 5)
1168 return 0;
1169
1170 memset(&req, 0, sizeof(req));
1171 memset(&resp, 0, sizeof(resp));
1172
1173 req.cmd = CMD_UPHY_PCIE_CONTROLLER_STATE;
1174 req.controller_state.pcie_controller = pcie->cid;
1175 req.controller_state.enable = enable;
1176
1177 memset(&msg, 0, sizeof(msg));
1178 msg.mrq = MRQ_UPHY;
1179 msg.tx.data = &req;
1180 msg.tx.size = sizeof(req);
1181 msg.rx.data = &resp;
1182 msg.rx.size = sizeof(resp);
1183
1184 return tegra_bpmp_transfer(pcie->bpmp, &msg);
1185}
1186
Vidya Sagarc57247f2020-03-03 23:40:52 +05301187static int tegra_pcie_bpmp_set_pll_state(struct tegra_pcie_dw *pcie,
1188 bool enable)
1189{
1190 struct mrq_uphy_response resp;
1191 struct tegra_bpmp_message msg;
1192 struct mrq_uphy_request req;
1193
1194 memset(&req, 0, sizeof(req));
1195 memset(&resp, 0, sizeof(resp));
1196
1197 if (enable) {
1198 req.cmd = CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT;
1199 req.ep_ctrlr_pll_init.ep_controller = pcie->cid;
1200 } else {
1201 req.cmd = CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF;
1202 req.ep_ctrlr_pll_off.ep_controller = pcie->cid;
1203 }
1204
1205 memset(&msg, 0, sizeof(msg));
1206 msg.mrq = MRQ_UPHY;
1207 msg.tx.data = &req;
1208 msg.tx.size = sizeof(req);
1209 msg.rx.data = &resp;
1210 msg.rx.size = sizeof(resp);
1211
1212 return tegra_bpmp_transfer(pcie->bpmp, &msg);
1213}
1214
Vidya Sagar56e15a22019-08-13 17:06:27 +05301215static void tegra_pcie_downstream_dev_to_D0(struct tegra_pcie_dw *pcie)
1216{
1217 struct pcie_port *pp = &pcie->pci.pp;
1218 struct pci_bus *child, *root_bus = NULL;
1219 struct pci_dev *pdev;
1220
1221 /*
1222 * link doesn't go into L2 state with some of the endpoints with Tegra
1223 * if they are not in D0 state. So, need to make sure that immediate
1224 * downstream devices are in D0 state before sending PME_TurnOff to put
1225 * link into L2 state.
1226 * This is as per PCI Express Base r4.0 v1.0 September 27-2017,
1227 * 5.2 Link State Power Management (Page #428).
1228 */
1229
Rob Herring5808d432020-08-20 21:53:57 -06001230 list_for_each_entry(child, &pp->bridge->bus->children, node) {
Vidya Sagar56e15a22019-08-13 17:06:27 +05301231 /* Bring downstream devices to D0 if they are not already in */
Rob Herring5808d432020-08-20 21:53:57 -06001232 if (child->parent == pp->bridge->bus) {
Vidya Sagar56e15a22019-08-13 17:06:27 +05301233 root_bus = child;
1234 break;
1235 }
1236 }
1237
1238 if (!root_bus) {
1239 dev_err(pcie->dev, "Failed to find downstream devices\n");
1240 return;
1241 }
1242
1243 list_for_each_entry(pdev, &root_bus->devices, bus_list) {
1244 if (PCI_SLOT(pdev->devfn) == 0) {
1245 if (pci_set_power_state(pdev, PCI_D0))
1246 dev_err(pcie->dev,
1247 "Failed to transition %s to D0 state\n",
1248 dev_name(&pdev->dev));
1249 }
1250 }
1251}
1252
Vidya Sagar0a901f22019-09-05 16:15:51 +05301253static int tegra_pcie_get_slot_regulators(struct tegra_pcie_dw *pcie)
1254{
1255 pcie->slot_ctl_3v3 = devm_regulator_get_optional(pcie->dev, "vpcie3v3");
1256 if (IS_ERR(pcie->slot_ctl_3v3)) {
1257 if (PTR_ERR(pcie->slot_ctl_3v3) != -ENODEV)
1258 return PTR_ERR(pcie->slot_ctl_3v3);
1259
1260 pcie->slot_ctl_3v3 = NULL;
1261 }
1262
1263 pcie->slot_ctl_12v = devm_regulator_get_optional(pcie->dev, "vpcie12v");
1264 if (IS_ERR(pcie->slot_ctl_12v)) {
1265 if (PTR_ERR(pcie->slot_ctl_12v) != -ENODEV)
1266 return PTR_ERR(pcie->slot_ctl_12v);
1267
1268 pcie->slot_ctl_12v = NULL;
1269 }
1270
1271 return 0;
1272}
1273
1274static int tegra_pcie_enable_slot_regulators(struct tegra_pcie_dw *pcie)
1275{
1276 int ret;
1277
1278 if (pcie->slot_ctl_3v3) {
1279 ret = regulator_enable(pcie->slot_ctl_3v3);
1280 if (ret < 0) {
1281 dev_err(pcie->dev,
1282 "Failed to enable 3.3V slot supply: %d\n", ret);
1283 return ret;
1284 }
1285 }
1286
1287 if (pcie->slot_ctl_12v) {
1288 ret = regulator_enable(pcie->slot_ctl_12v);
1289 if (ret < 0) {
1290 dev_err(pcie->dev,
1291 "Failed to enable 12V slot supply: %d\n", ret);
1292 goto fail_12v_enable;
1293 }
1294 }
1295
1296 /*
1297 * According to PCI Express Card Electromechanical Specification
1298 * Revision 1.1, Table-2.4, T_PVPERL (Power stable to PERST# inactive)
1299 * should be a minimum of 100ms.
1300 */
1301 if (pcie->slot_ctl_3v3 || pcie->slot_ctl_12v)
1302 msleep(100);
1303
1304 return 0;
1305
1306fail_12v_enable:
1307 if (pcie->slot_ctl_3v3)
1308 regulator_disable(pcie->slot_ctl_3v3);
1309 return ret;
1310}
1311
1312static void tegra_pcie_disable_slot_regulators(struct tegra_pcie_dw *pcie)
1313{
1314 if (pcie->slot_ctl_12v)
1315 regulator_disable(pcie->slot_ctl_12v);
1316 if (pcie->slot_ctl_3v3)
1317 regulator_disable(pcie->slot_ctl_3v3);
1318}
1319
Vidya Sagar56e15a22019-08-13 17:06:27 +05301320static int tegra_pcie_config_controller(struct tegra_pcie_dw *pcie,
1321 bool en_hw_hot_rst)
1322{
1323 int ret;
1324 u32 val;
1325
1326 ret = tegra_pcie_bpmp_set_ctrl_state(pcie, true);
1327 if (ret) {
1328 dev_err(pcie->dev,
1329 "Failed to enable controller %u: %d\n", pcie->cid, ret);
1330 return ret;
1331 }
1332
Vidya Sagar0a901f22019-09-05 16:15:51 +05301333 ret = tegra_pcie_enable_slot_regulators(pcie);
1334 if (ret < 0)
1335 goto fail_slot_reg_en;
1336
Vidya Sagar56e15a22019-08-13 17:06:27 +05301337 ret = regulator_enable(pcie->pex_ctl_supply);
1338 if (ret < 0) {
1339 dev_err(pcie->dev, "Failed to enable regulator: %d\n", ret);
1340 goto fail_reg_en;
1341 }
1342
1343 ret = clk_prepare_enable(pcie->core_clk);
1344 if (ret) {
1345 dev_err(pcie->dev, "Failed to enable core clock: %d\n", ret);
1346 goto fail_core_clk;
1347 }
1348
1349 ret = reset_control_deassert(pcie->core_apb_rst);
1350 if (ret) {
1351 dev_err(pcie->dev, "Failed to deassert core APB reset: %d\n",
1352 ret);
1353 goto fail_core_apb_rst;
1354 }
1355
1356 if (en_hw_hot_rst) {
1357 /* Enable HW_HOT_RST mode */
1358 val = appl_readl(pcie, APPL_CTRL);
1359 val &= ~(APPL_CTRL_HW_HOT_RST_MODE_MASK <<
1360 APPL_CTRL_HW_HOT_RST_MODE_SHIFT);
1361 val |= APPL_CTRL_HW_HOT_RST_EN;
1362 appl_writel(pcie, val, APPL_CTRL);
1363 }
1364
1365 ret = tegra_pcie_enable_phy(pcie);
1366 if (ret) {
1367 dev_err(pcie->dev, "Failed to enable PHY: %d\n", ret);
1368 goto fail_phy;
1369 }
1370
1371 /* Update CFG base address */
1372 appl_writel(pcie, pcie->dbi_res->start & APPL_CFG_BASE_ADDR_MASK,
1373 APPL_CFG_BASE_ADDR);
1374
1375 /* Configure this core for RP mode operation */
1376 appl_writel(pcie, APPL_DM_TYPE_RP, APPL_DM_TYPE);
1377
1378 appl_writel(pcie, 0x0, APPL_CFG_SLCG_OVERRIDE);
1379
1380 val = appl_readl(pcie, APPL_CTRL);
1381 appl_writel(pcie, val | APPL_CTRL_SYS_PRE_DET_STATE, APPL_CTRL);
1382
1383 val = appl_readl(pcie, APPL_CFG_MISC);
1384 val |= (APPL_CFG_MISC_ARCACHE_VAL << APPL_CFG_MISC_ARCACHE_SHIFT);
1385 appl_writel(pcie, val, APPL_CFG_MISC);
1386
1387 if (!pcie->supports_clkreq) {
1388 val = appl_readl(pcie, APPL_PINMUX);
Vidya Sagarff5c2bb92019-10-05 22:12:11 +05301389 val |= APPL_PINMUX_CLKREQ_OVERRIDE_EN;
1390 val &= ~APPL_PINMUX_CLKREQ_OVERRIDE;
Vidya Sagar56e15a22019-08-13 17:06:27 +05301391 appl_writel(pcie, val, APPL_PINMUX);
1392 }
1393
1394 /* Update iATU_DMA base address */
1395 appl_writel(pcie,
1396 pcie->atu_dma_res->start & APPL_CFG_IATU_DMA_BASE_ADDR_MASK,
1397 APPL_CFG_IATU_DMA_BASE_ADDR);
1398
1399 reset_control_deassert(pcie->core_rst);
1400
Vidya Sagar56e15a22019-08-13 17:06:27 +05301401 return ret;
1402
1403fail_phy:
1404 reset_control_assert(pcie->core_apb_rst);
1405fail_core_apb_rst:
1406 clk_disable_unprepare(pcie->core_clk);
1407fail_core_clk:
1408 regulator_disable(pcie->pex_ctl_supply);
1409fail_reg_en:
Vidya Sagar0a901f22019-09-05 16:15:51 +05301410 tegra_pcie_disable_slot_regulators(pcie);
1411fail_slot_reg_en:
Vidya Sagar56e15a22019-08-13 17:06:27 +05301412 tegra_pcie_bpmp_set_ctrl_state(pcie, false);
1413
1414 return ret;
1415}
1416
Vidya Sagarb8f0d672020-12-03 19:04:49 +05301417static void tegra_pcie_unconfig_controller(struct tegra_pcie_dw *pcie)
Vidya Sagar56e15a22019-08-13 17:06:27 +05301418{
1419 int ret;
1420
1421 ret = reset_control_assert(pcie->core_rst);
Vidya Sagarb8f0d672020-12-03 19:04:49 +05301422 if (ret)
1423 dev_err(pcie->dev, "Failed to assert \"core\" reset: %d\n", ret);
Vidya Sagar56e15a22019-08-13 17:06:27 +05301424
1425 tegra_pcie_disable_phy(pcie);
1426
1427 ret = reset_control_assert(pcie->core_apb_rst);
Vidya Sagarb8f0d672020-12-03 19:04:49 +05301428 if (ret)
Vidya Sagar56e15a22019-08-13 17:06:27 +05301429 dev_err(pcie->dev, "Failed to assert APB reset: %d\n", ret);
Vidya Sagar56e15a22019-08-13 17:06:27 +05301430
1431 clk_disable_unprepare(pcie->core_clk);
1432
1433 ret = regulator_disable(pcie->pex_ctl_supply);
Vidya Sagarb8f0d672020-12-03 19:04:49 +05301434 if (ret)
Vidya Sagar56e15a22019-08-13 17:06:27 +05301435 dev_err(pcie->dev, "Failed to disable regulator: %d\n", ret);
Vidya Sagar56e15a22019-08-13 17:06:27 +05301436
Vidya Sagar0a901f22019-09-05 16:15:51 +05301437 tegra_pcie_disable_slot_regulators(pcie);
1438
Vidya Sagar56e15a22019-08-13 17:06:27 +05301439 ret = tegra_pcie_bpmp_set_ctrl_state(pcie, false);
Vidya Sagarb8f0d672020-12-03 19:04:49 +05301440 if (ret)
Vidya Sagar56e15a22019-08-13 17:06:27 +05301441 dev_err(pcie->dev, "Failed to disable controller %d: %d\n",
1442 pcie->cid, ret);
Vidya Sagar56e15a22019-08-13 17:06:27 +05301443}
1444
1445static int tegra_pcie_init_controller(struct tegra_pcie_dw *pcie)
1446{
1447 struct dw_pcie *pci = &pcie->pci;
1448 struct pcie_port *pp = &pci->pp;
1449 int ret;
1450
1451 ret = tegra_pcie_config_controller(pcie, false);
1452 if (ret < 0)
1453 return ret;
1454
1455 pp->ops = &tegra_pcie_dw_host_ops;
1456
1457 ret = dw_pcie_host_init(pp);
1458 if (ret < 0) {
1459 dev_err(pcie->dev, "Failed to add PCIe port: %d\n", ret);
1460 goto fail_host_init;
1461 }
1462
1463 return 0;
1464
1465fail_host_init:
Vidya Sagarb8f0d672020-12-03 19:04:49 +05301466 tegra_pcie_unconfig_controller(pcie);
1467 return ret;
Vidya Sagar56e15a22019-08-13 17:06:27 +05301468}
1469
1470static int tegra_pcie_try_link_l2(struct tegra_pcie_dw *pcie)
1471{
1472 u32 val;
1473
1474 if (!tegra_pcie_dw_link_up(&pcie->pci))
1475 return 0;
1476
1477 val = appl_readl(pcie, APPL_RADM_STATUS);
1478 val |= APPL_PM_XMT_TURNOFF_STATE;
1479 appl_writel(pcie, val, APPL_RADM_STATUS);
1480
1481 return readl_poll_timeout_atomic(pcie->appl_base + APPL_DEBUG, val,
1482 val & APPL_DEBUG_PM_LINKST_IN_L2_LAT,
1483 1, PME_ACK_TIMEOUT);
1484}
1485
1486static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie)
1487{
1488 u32 data;
1489 int err;
1490
1491 if (!tegra_pcie_dw_link_up(&pcie->pci)) {
1492 dev_dbg(pcie->dev, "PCIe link is not up...!\n");
1493 return;
1494 }
1495
Om Prakash Singh834c5cf2021-06-23 15:35:23 +05301496 /*
1497 * PCIe controller exits from L2 only if reset is applied, so
1498 * controller doesn't handle interrupts. But in cases where
1499 * L2 entry fails, PERST# is asserted which can trigger surprise
1500 * link down AER. However this function call happens in
1501 * suspend_noirq(), so AER interrupt will not be processed.
1502 * Disable all interrupts to avoid such a scenario.
1503 */
1504 appl_writel(pcie, 0x0, APPL_INTR_EN_L0_0);
1505
Vidya Sagar56e15a22019-08-13 17:06:27 +05301506 if (tegra_pcie_try_link_l2(pcie)) {
1507 dev_info(pcie->dev, "Link didn't transition to L2 state\n");
1508 /*
1509 * TX lane clock freq will reset to Gen1 only if link is in L2
1510 * or detect state.
1511 * So apply pex_rst to end point to force RP to go into detect
1512 * state
1513 */
1514 data = appl_readl(pcie, APPL_PINMUX);
1515 data &= ~APPL_PINMUX_PEX_RST;
1516 appl_writel(pcie, data, APPL_PINMUX);
1517
Vidya Sagarcf68e3b2020-12-03 19:04:51 +05301518 /*
1519 * Some cards do not go to detect state even after de-asserting
1520 * PERST#. So, de-assert LTSSM to bring link to detect state.
1521 */
1522 data = readl(pcie->appl_base + APPL_CTRL);
1523 data &= ~APPL_CTRL_LTSSM_EN;
1524 writel(data, pcie->appl_base + APPL_CTRL);
1525
Vidya Sagar56e15a22019-08-13 17:06:27 +05301526 err = readl_poll_timeout_atomic(pcie->appl_base + APPL_DEBUG,
1527 data,
1528 ((data &
1529 APPL_DEBUG_LTSSM_STATE_MASK) >>
1530 APPL_DEBUG_LTSSM_STATE_SHIFT) ==
1531 LTSSM_STATE_PRE_DETECT,
1532 1, LTSSM_TIMEOUT);
Vidya Sagarcf68e3b2020-12-03 19:04:51 +05301533 if (err)
Vidya Sagar56e15a22019-08-13 17:06:27 +05301534 dev_info(pcie->dev, "Link didn't go to detect state\n");
Vidya Sagar56e15a22019-08-13 17:06:27 +05301535 }
1536 /*
1537 * DBI registers may not be accessible after this as PLL-E would be
1538 * down depending on how CLKREQ is pulled by end point
1539 */
1540 data = appl_readl(pcie, APPL_PINMUX);
1541 data |= (APPL_PINMUX_CLKREQ_OVERRIDE_EN | APPL_PINMUX_CLKREQ_OVERRIDE);
1542 /* Cut REFCLK to slot */
1543 data |= APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE_EN;
1544 data &= ~APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE;
1545 appl_writel(pcie, data, APPL_PINMUX);
1546}
1547
Vidya Sagarb8f0d672020-12-03 19:04:49 +05301548static void tegra_pcie_deinit_controller(struct tegra_pcie_dw *pcie)
Vidya Sagar56e15a22019-08-13 17:06:27 +05301549{
1550 tegra_pcie_downstream_dev_to_D0(pcie);
1551 dw_pcie_host_deinit(&pcie->pci.pp);
1552 tegra_pcie_dw_pme_turnoff(pcie);
Vidya Sagarb8f0d672020-12-03 19:04:49 +05301553 tegra_pcie_unconfig_controller(pcie);
Vidya Sagar56e15a22019-08-13 17:06:27 +05301554}
1555
1556static int tegra_pcie_config_rp(struct tegra_pcie_dw *pcie)
1557{
Vidya Sagar56e15a22019-08-13 17:06:27 +05301558 struct device *dev = pcie->dev;
1559 char *name;
1560 int ret;
1561
Vidya Sagar56e15a22019-08-13 17:06:27 +05301562 pm_runtime_enable(dev);
1563
1564 ret = pm_runtime_get_sync(dev);
1565 if (ret < 0) {
1566 dev_err(dev, "Failed to get runtime sync for PCIe dev: %d\n",
1567 ret);
Vidya Sagarf4ff4fa2019-09-05 16:15:50 +05301568 goto fail_pm_get_sync;
1569 }
1570
1571 ret = pinctrl_pm_select_default_state(dev);
1572 if (ret < 0) {
1573 dev_err(dev, "Failed to configure sideband pins: %d\n", ret);
Dinghao Liu1c1dbb22020-05-21 11:13:49 +08001574 goto fail_pm_get_sync;
Vidya Sagar56e15a22019-08-13 17:06:27 +05301575 }
1576
Vidya Sagar3d710af2020-12-03 19:04:50 +05301577 ret = tegra_pcie_init_controller(pcie);
1578 if (ret < 0) {
1579 dev_err(dev, "Failed to initialize controller: %d\n", ret);
1580 goto fail_pm_get_sync;
1581 }
Vidya Sagar56e15a22019-08-13 17:06:27 +05301582
1583 pcie->link_state = tegra_pcie_dw_link_up(&pcie->pci);
1584 if (!pcie->link_state) {
1585 ret = -ENOMEDIUM;
1586 goto fail_host_init;
1587 }
1588
1589 name = devm_kasprintf(dev, GFP_KERNEL, "%pOFP", dev->of_node);
1590 if (!name) {
1591 ret = -ENOMEM;
1592 goto fail_host_init;
1593 }
1594
1595 pcie->debugfs = debugfs_create_dir(name, NULL);
Greg Kroah-Hartmand27b1cd2020-08-18 15:37:39 +02001596 init_debugfs(pcie);
Vidya Sagar56e15a22019-08-13 17:06:27 +05301597
1598 return ret;
1599
1600fail_host_init:
1601 tegra_pcie_deinit_controller(pcie);
Vidya Sagarf4ff4fa2019-09-05 16:15:50 +05301602fail_pm_get_sync:
Dinghao Liu1c1dbb22020-05-21 11:13:49 +08001603 pm_runtime_put_sync(dev);
Vidya Sagar56e15a22019-08-13 17:06:27 +05301604 pm_runtime_disable(dev);
1605 return ret;
1606}
1607
Vidya Sagarc57247f2020-03-03 23:40:52 +05301608static void pex_ep_event_pex_rst_assert(struct tegra_pcie_dw *pcie)
1609{
1610 u32 val;
1611 int ret;
1612
1613 if (pcie->ep_state == EP_STATE_DISABLED)
1614 return;
1615
1616 /* Disable LTSSM */
1617 val = appl_readl(pcie, APPL_CTRL);
1618 val &= ~APPL_CTRL_LTSSM_EN;
1619 appl_writel(pcie, val, APPL_CTRL);
1620
1621 ret = readl_poll_timeout(pcie->appl_base + APPL_DEBUG, val,
1622 ((val & APPL_DEBUG_LTSSM_STATE_MASK) >>
1623 APPL_DEBUG_LTSSM_STATE_SHIFT) ==
1624 LTSSM_STATE_PRE_DETECT,
1625 1, LTSSM_TIMEOUT);
1626 if (ret)
1627 dev_err(pcie->dev, "Failed to go Detect state: %d\n", ret);
1628
1629 reset_control_assert(pcie->core_rst);
1630
1631 tegra_pcie_disable_phy(pcie);
1632
1633 reset_control_assert(pcie->core_apb_rst);
1634
1635 clk_disable_unprepare(pcie->core_clk);
1636
1637 pm_runtime_put_sync(pcie->dev);
1638
1639 ret = tegra_pcie_bpmp_set_pll_state(pcie, false);
1640 if (ret)
1641 dev_err(pcie->dev, "Failed to turn off UPHY: %d\n", ret);
1642
1643 pcie->ep_state = EP_STATE_DISABLED;
1644 dev_dbg(pcie->dev, "Uninitialization of endpoint is completed\n");
1645}
1646
1647static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie)
1648{
1649 struct dw_pcie *pci = &pcie->pci;
1650 struct dw_pcie_ep *ep = &pci->ep;
1651 struct device *dev = pcie->dev;
1652 u32 val;
1653 int ret;
1654
1655 if (pcie->ep_state == EP_STATE_ENABLED)
1656 return;
1657
Dinghao Liu5859c922021-04-08 15:26:58 +08001658 ret = pm_runtime_resume_and_get(dev);
Vidya Sagarc57247f2020-03-03 23:40:52 +05301659 if (ret < 0) {
1660 dev_err(dev, "Failed to get runtime sync for PCIe dev: %d\n",
1661 ret);
1662 return;
1663 }
1664
1665 ret = tegra_pcie_bpmp_set_pll_state(pcie, true);
1666 if (ret) {
1667 dev_err(dev, "Failed to init UPHY for PCIe EP: %d\n", ret);
1668 goto fail_pll_init;
1669 }
1670
1671 ret = clk_prepare_enable(pcie->core_clk);
1672 if (ret) {
1673 dev_err(dev, "Failed to enable core clock: %d\n", ret);
1674 goto fail_core_clk_enable;
1675 }
1676
1677 ret = reset_control_deassert(pcie->core_apb_rst);
1678 if (ret) {
1679 dev_err(dev, "Failed to deassert core APB reset: %d\n", ret);
1680 goto fail_core_apb_rst;
1681 }
1682
1683 ret = tegra_pcie_enable_phy(pcie);
1684 if (ret) {
1685 dev_err(dev, "Failed to enable PHY: %d\n", ret);
1686 goto fail_phy;
1687 }
1688
1689 /* Clear any stale interrupt statuses */
1690 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L0);
1691 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0);
1692 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_1);
1693 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_2);
1694 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_3);
1695 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_6);
1696 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_7);
1697 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_8_0);
1698 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_9);
1699 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_10);
1700 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_11);
1701 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_13);
1702 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_14);
1703 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_15);
1704 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_17);
1705
1706 /* configure this core for EP mode operation */
1707 val = appl_readl(pcie, APPL_DM_TYPE);
1708 val &= ~APPL_DM_TYPE_MASK;
1709 val |= APPL_DM_TYPE_EP;
1710 appl_writel(pcie, val, APPL_DM_TYPE);
1711
1712 appl_writel(pcie, 0x0, APPL_CFG_SLCG_OVERRIDE);
1713
1714 val = appl_readl(pcie, APPL_CTRL);
1715 val |= APPL_CTRL_SYS_PRE_DET_STATE;
1716 val |= APPL_CTRL_HW_HOT_RST_EN;
1717 appl_writel(pcie, val, APPL_CTRL);
1718
1719 val = appl_readl(pcie, APPL_CFG_MISC);
1720 val |= APPL_CFG_MISC_SLV_EP_MODE;
1721 val |= (APPL_CFG_MISC_ARCACHE_VAL << APPL_CFG_MISC_ARCACHE_SHIFT);
1722 appl_writel(pcie, val, APPL_CFG_MISC);
1723
1724 val = appl_readl(pcie, APPL_PINMUX);
1725 val |= APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE_EN;
1726 val |= APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE;
1727 appl_writel(pcie, val, APPL_PINMUX);
1728
1729 appl_writel(pcie, pcie->dbi_res->start & APPL_CFG_BASE_ADDR_MASK,
1730 APPL_CFG_BASE_ADDR);
1731
1732 appl_writel(pcie, pcie->atu_dma_res->start &
1733 APPL_CFG_IATU_DMA_BASE_ADDR_MASK,
1734 APPL_CFG_IATU_DMA_BASE_ADDR);
1735
1736 val = appl_readl(pcie, APPL_INTR_EN_L0_0);
1737 val |= APPL_INTR_EN_L0_0_SYS_INTR_EN;
1738 val |= APPL_INTR_EN_L0_0_LINK_STATE_INT_EN;
1739 val |= APPL_INTR_EN_L0_0_PCI_CMD_EN_INT_EN;
1740 appl_writel(pcie, val, APPL_INTR_EN_L0_0);
1741
1742 val = appl_readl(pcie, APPL_INTR_EN_L1_0_0);
1743 val |= APPL_INTR_EN_L1_0_0_HOT_RESET_DONE_INT_EN;
1744 val |= APPL_INTR_EN_L1_0_0_RDLH_LINK_UP_INT_EN;
1745 appl_writel(pcie, val, APPL_INTR_EN_L1_0_0);
1746
1747 reset_control_deassert(pcie->core_rst);
1748
1749 if (pcie->update_fc_fixup) {
1750 val = dw_pcie_readl_dbi(pci, CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF);
1751 val |= 0x1 << CFG_TIMER_CTRL_ACK_NAK_SHIFT;
1752 dw_pcie_writel_dbi(pci, CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF, val);
1753 }
1754
1755 config_gen3_gen4_eq_presets(pcie);
1756
1757 init_host_aspm(pcie);
1758
1759 /* Disable ASPM-L1SS advertisement if there is no CLKREQ routing */
1760 if (!pcie->supports_clkreq) {
1761 disable_aspm_l11(pcie);
1762 disable_aspm_l12(pcie);
1763 }
1764
1765 val = dw_pcie_readl_dbi(pci, GEN3_RELATED_OFF);
1766 val &= ~GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL;
1767 dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
1768
Vidya Sagarc57247f2020-03-03 23:40:52 +05301769 pcie->pcie_cap_base = dw_pcie_find_capability(&pcie->pci,
1770 PCI_CAP_ID_EXP);
1771 clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ);
1772
1773 val = (ep->msi_mem_phys & MSIX_ADDR_MATCH_LOW_OFF_MASK);
1774 val |= MSIX_ADDR_MATCH_LOW_OFF_EN;
1775 dw_pcie_writel_dbi(pci, MSIX_ADDR_MATCH_LOW_OFF, val);
Om Prakash Singh43537cf2021-06-23 15:35:22 +05301776 val = (upper_32_bits(ep->msi_mem_phys) & MSIX_ADDR_MATCH_HIGH_OFF_MASK);
Vidya Sagarc57247f2020-03-03 23:40:52 +05301777 dw_pcie_writel_dbi(pci, MSIX_ADDR_MATCH_HIGH_OFF, val);
1778
1779 ret = dw_pcie_ep_init_complete(ep);
1780 if (ret) {
1781 dev_err(dev, "Failed to complete initialization: %d\n", ret);
1782 goto fail_init_complete;
1783 }
1784
1785 dw_pcie_ep_init_notify(ep);
1786
1787 /* Enable LTSSM */
1788 val = appl_readl(pcie, APPL_CTRL);
1789 val |= APPL_CTRL_LTSSM_EN;
1790 appl_writel(pcie, val, APPL_CTRL);
1791
1792 pcie->ep_state = EP_STATE_ENABLED;
1793 dev_dbg(dev, "Initialization of endpoint is completed\n");
1794
1795 return;
1796
1797fail_init_complete:
1798 reset_control_assert(pcie->core_rst);
1799 tegra_pcie_disable_phy(pcie);
1800fail_phy:
1801 reset_control_assert(pcie->core_apb_rst);
1802fail_core_apb_rst:
1803 clk_disable_unprepare(pcie->core_clk);
1804fail_core_clk_enable:
1805 tegra_pcie_bpmp_set_pll_state(pcie, false);
1806fail_pll_init:
1807 pm_runtime_put_sync(dev);
1808}
1809
1810static irqreturn_t tegra_pcie_ep_pex_rst_irq(int irq, void *arg)
1811{
1812 struct tegra_pcie_dw *pcie = arg;
1813
1814 if (gpiod_get_value(pcie->pex_rst_gpiod))
1815 pex_ep_event_pex_rst_assert(pcie);
1816 else
1817 pex_ep_event_pex_rst_deassert(pcie);
1818
1819 return IRQ_HANDLED;
1820}
1821
1822static int tegra_pcie_ep_raise_legacy_irq(struct tegra_pcie_dw *pcie, u16 irq)
1823{
1824 /* Tegra194 supports only INTA */
1825 if (irq > 1)
1826 return -EINVAL;
1827
1828 appl_writel(pcie, 1, APPL_LEGACY_INTX);
1829 usleep_range(1000, 2000);
1830 appl_writel(pcie, 0, APPL_LEGACY_INTX);
1831 return 0;
1832}
1833
1834static int tegra_pcie_ep_raise_msi_irq(struct tegra_pcie_dw *pcie, u16 irq)
1835{
1836 if (unlikely(irq > 31))
1837 return -EINVAL;
1838
Jon Hunterf67092e2021-06-18 17:02:19 +01001839 appl_writel(pcie, BIT(irq), APPL_MSI_CTRL_1);
Vidya Sagarc57247f2020-03-03 23:40:52 +05301840
1841 return 0;
1842}
1843
1844static int tegra_pcie_ep_raise_msix_irq(struct tegra_pcie_dw *pcie, u16 irq)
1845{
1846 struct dw_pcie_ep *ep = &pcie->pci.ep;
1847
1848 writel(irq, ep->msi_mem);
1849
1850 return 0;
1851}
1852
1853static int tegra_pcie_ep_raise_irq(struct dw_pcie_ep *ep, u8 func_no,
1854 enum pci_epc_irq_type type,
1855 u16 interrupt_num)
1856{
1857 struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
1858 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
1859
1860 switch (type) {
1861 case PCI_EPC_IRQ_LEGACY:
1862 return tegra_pcie_ep_raise_legacy_irq(pcie, interrupt_num);
1863
1864 case PCI_EPC_IRQ_MSI:
1865 return tegra_pcie_ep_raise_msi_irq(pcie, interrupt_num);
1866
1867 case PCI_EPC_IRQ_MSIX:
1868 return tegra_pcie_ep_raise_msix_irq(pcie, interrupt_num);
1869
1870 default:
1871 dev_err(pci->dev, "Unknown IRQ type\n");
1872 return -EPERM;
1873 }
1874
1875 return 0;
1876}
1877
1878static const struct pci_epc_features tegra_pcie_epc_features = {
1879 .linkup_notifier = true,
1880 .core_init_notifier = true,
1881 .msi_capable = false,
1882 .msix_capable = false,
1883 .reserved_bar = 1 << BAR_2 | 1 << BAR_3 | 1 << BAR_4 | 1 << BAR_5,
1884 .bar_fixed_64bit = 1 << BAR_0,
1885 .bar_fixed_size[0] = SZ_1M,
1886};
1887
1888static const struct pci_epc_features*
1889tegra_pcie_ep_get_features(struct dw_pcie_ep *ep)
1890{
1891 return &tegra_pcie_epc_features;
1892}
1893
Rikard Falkebornd895ce72021-02-07 23:16:04 +01001894static const struct dw_pcie_ep_ops pcie_ep_ops = {
Vidya Sagarc57247f2020-03-03 23:40:52 +05301895 .raise_irq = tegra_pcie_ep_raise_irq,
1896 .get_features = tegra_pcie_ep_get_features,
1897};
1898
1899static int tegra_pcie_config_ep(struct tegra_pcie_dw *pcie,
1900 struct platform_device *pdev)
1901{
1902 struct dw_pcie *pci = &pcie->pci;
1903 struct device *dev = pcie->dev;
1904 struct dw_pcie_ep *ep;
Vidya Sagarc57247f2020-03-03 23:40:52 +05301905 char *name;
1906 int ret;
1907
1908 ep = &pci->ep;
1909 ep->ops = &pcie_ep_ops;
1910
Vidya Sagarc57247f2020-03-03 23:40:52 +05301911 ep->page_size = SZ_64K;
1912
1913 ret = gpiod_set_debounce(pcie->pex_rst_gpiod, PERST_DEBOUNCE_TIME);
1914 if (ret < 0) {
1915 dev_err(dev, "Failed to set PERST GPIO debounce time: %d\n",
1916 ret);
1917 return ret;
1918 }
1919
1920 ret = gpiod_to_irq(pcie->pex_rst_gpiod);
1921 if (ret < 0) {
1922 dev_err(dev, "Failed to get IRQ for PERST GPIO: %d\n", ret);
1923 return ret;
1924 }
1925 pcie->pex_rst_irq = (unsigned int)ret;
1926
1927 name = devm_kasprintf(dev, GFP_KERNEL, "tegra_pcie_%u_pex_rst_irq",
1928 pcie->cid);
1929 if (!name) {
1930 dev_err(dev, "Failed to create PERST IRQ string\n");
1931 return -ENOMEM;
1932 }
1933
1934 irq_set_status_flags(pcie->pex_rst_irq, IRQ_NOAUTOEN);
1935
1936 pcie->ep_state = EP_STATE_DISABLED;
1937
1938 ret = devm_request_threaded_irq(dev, pcie->pex_rst_irq, NULL,
1939 tegra_pcie_ep_pex_rst_irq,
1940 IRQF_TRIGGER_RISING |
1941 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1942 name, (void *)pcie);
1943 if (ret < 0) {
1944 dev_err(dev, "Failed to request IRQ for PERST: %d\n", ret);
1945 return ret;
1946 }
1947
Vidya Sagarc57247f2020-03-03 23:40:52 +05301948 pm_runtime_enable(dev);
1949
1950 ret = dw_pcie_ep_init(ep);
1951 if (ret) {
1952 dev_err(dev, "Failed to initialize DWC Endpoint subsystem: %d\n",
1953 ret);
1954 return ret;
1955 }
1956
1957 return 0;
1958}
1959
Vidya Sagar56e15a22019-08-13 17:06:27 +05301960static int tegra_pcie_dw_probe(struct platform_device *pdev)
1961{
Vidya Sagarc57247f2020-03-03 23:40:52 +05301962 const struct tegra_pcie_dw_of_data *data;
Vidya Sagar56e15a22019-08-13 17:06:27 +05301963 struct device *dev = &pdev->dev;
1964 struct resource *atu_dma_res;
1965 struct tegra_pcie_dw *pcie;
Vidya Sagar56e15a22019-08-13 17:06:27 +05301966 struct pcie_port *pp;
1967 struct dw_pcie *pci;
1968 struct phy **phys;
1969 char *name;
1970 int ret;
1971 u32 i;
1972
Vidya Sagarc57247f2020-03-03 23:40:52 +05301973 data = of_device_get_match_data(dev);
1974
Vidya Sagar56e15a22019-08-13 17:06:27 +05301975 pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL);
1976 if (!pcie)
1977 return -ENOMEM;
1978
1979 pci = &pcie->pci;
1980 pci->dev = &pdev->dev;
1981 pci->ops = &tegra_dw_pcie_ops;
Rob Herringaeaa0bf2020-08-20 21:54:19 -06001982 pci->n_fts[0] = N_FTS_VAL;
1983 pci->n_fts[1] = FTS_VAL;
Vidya Sagar01254b62020-12-03 19:04:48 +05301984 pci->version = 0x490A;
Rob Herringaeaa0bf2020-08-20 21:54:19 -06001985
Vidya Sagar56e15a22019-08-13 17:06:27 +05301986 pp = &pci->pp;
Rob Herring331e9bc2020-11-05 15:11:50 -06001987 pp->num_vectors = MAX_MSI_IRQS;
Vidya Sagar56e15a22019-08-13 17:06:27 +05301988 pcie->dev = &pdev->dev;
Vidya Sagarc57247f2020-03-03 23:40:52 +05301989 pcie->mode = (enum dw_pcie_device_mode)data->mode;
Vidya Sagar56e15a22019-08-13 17:06:27 +05301990
1991 ret = tegra_pcie_dw_parse_dt(pcie);
1992 if (ret < 0) {
Thierry Reding54455232020-03-19 14:12:30 +01001993 const char *level = KERN_ERR;
1994
1995 if (ret == -EPROBE_DEFER)
1996 level = KERN_DEBUG;
1997
1998 dev_printk(level, dev,
1999 dev_fmt("Failed to parse device tree: %d\n"),
2000 ret);
Vidya Sagar56e15a22019-08-13 17:06:27 +05302001 return ret;
2002 }
2003
Vidya Sagar0a901f22019-09-05 16:15:51 +05302004 ret = tegra_pcie_get_slot_regulators(pcie);
2005 if (ret < 0) {
Thierry Reding54455232020-03-19 14:12:30 +01002006 const char *level = KERN_ERR;
2007
2008 if (ret == -EPROBE_DEFER)
2009 level = KERN_DEBUG;
2010
2011 dev_printk(level, dev,
2012 dev_fmt("Failed to get slot regulators: %d\n"),
2013 ret);
Vidya Sagar0a901f22019-09-05 16:15:51 +05302014 return ret;
2015 }
2016
Vidya Sagarc57247f2020-03-03 23:40:52 +05302017 if (pcie->pex_refclk_sel_gpiod)
2018 gpiod_set_value(pcie->pex_refclk_sel_gpiod, 1);
2019
Vidya Sagar56e15a22019-08-13 17:06:27 +05302020 pcie->pex_ctl_supply = devm_regulator_get(dev, "vddio-pex-ctl");
2021 if (IS_ERR(pcie->pex_ctl_supply)) {
2022 ret = PTR_ERR(pcie->pex_ctl_supply);
2023 if (ret != -EPROBE_DEFER)
2024 dev_err(dev, "Failed to get regulator: %ld\n",
2025 PTR_ERR(pcie->pex_ctl_supply));
2026 return ret;
2027 }
2028
2029 pcie->core_clk = devm_clk_get(dev, "core");
2030 if (IS_ERR(pcie->core_clk)) {
2031 dev_err(dev, "Failed to get core clock: %ld\n",
2032 PTR_ERR(pcie->core_clk));
2033 return PTR_ERR(pcie->core_clk);
2034 }
2035
2036 pcie->appl_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
2037 "appl");
2038 if (!pcie->appl_res) {
2039 dev_err(dev, "Failed to find \"appl\" region\n");
2040 return -ENODEV;
2041 }
2042
2043 pcie->appl_base = devm_ioremap_resource(dev, pcie->appl_res);
2044 if (IS_ERR(pcie->appl_base))
2045 return PTR_ERR(pcie->appl_base);
2046
2047 pcie->core_apb_rst = devm_reset_control_get(dev, "apb");
2048 if (IS_ERR(pcie->core_apb_rst)) {
2049 dev_err(dev, "Failed to get APB reset: %ld\n",
2050 PTR_ERR(pcie->core_apb_rst));
2051 return PTR_ERR(pcie->core_apb_rst);
2052 }
2053
2054 phys = devm_kcalloc(dev, pcie->phy_count, sizeof(*phys), GFP_KERNEL);
2055 if (!phys)
2056 return -ENOMEM;
2057
2058 for (i = 0; i < pcie->phy_count; i++) {
2059 name = kasprintf(GFP_KERNEL, "p2u-%u", i);
2060 if (!name) {
2061 dev_err(dev, "Failed to create P2U string\n");
2062 return -ENOMEM;
2063 }
2064 phys[i] = devm_phy_get(dev, name);
2065 kfree(name);
2066 if (IS_ERR(phys[i])) {
2067 ret = PTR_ERR(phys[i]);
2068 if (ret != -EPROBE_DEFER)
2069 dev_err(dev, "Failed to get PHY: %d\n", ret);
2070 return ret;
2071 }
2072 }
2073
2074 pcie->phys = phys;
2075
Vidya Sagar56e15a22019-08-13 17:06:27 +05302076 atu_dma_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
2077 "atu_dma");
2078 if (!atu_dma_res) {
2079 dev_err(dev, "Failed to find \"atu_dma\" region\n");
2080 return -ENODEV;
2081 }
2082 pcie->atu_dma_res = atu_dma_res;
2083
Rob Herring281f1f92020-11-05 15:11:59 -06002084 pci->atu_size = resource_size(atu_dma_res);
Vidya Sagar56e15a22019-08-13 17:06:27 +05302085 pci->atu_base = devm_ioremap_resource(dev, atu_dma_res);
2086 if (IS_ERR(pci->atu_base))
2087 return PTR_ERR(pci->atu_base);
2088
2089 pcie->core_rst = devm_reset_control_get(dev, "core");
2090 if (IS_ERR(pcie->core_rst)) {
2091 dev_err(dev, "Failed to get core reset: %ld\n",
2092 PTR_ERR(pcie->core_rst));
2093 return PTR_ERR(pcie->core_rst);
2094 }
2095
2096 pp->irq = platform_get_irq_byname(pdev, "intr");
Krzysztof Wilczyńskicaecb052020-08-02 14:25:53 +00002097 if (pp->irq < 0)
Aman Sharma0584bff2020-03-12 00:49:02 +05302098 return pp->irq;
Vidya Sagar56e15a22019-08-13 17:06:27 +05302099
Vidya Sagar56e15a22019-08-13 17:06:27 +05302100 pcie->bpmp = tegra_bpmp_get(dev);
2101 if (IS_ERR(pcie->bpmp))
2102 return PTR_ERR(pcie->bpmp);
2103
2104 platform_set_drvdata(pdev, pcie);
2105
Vidya Sagarc57247f2020-03-03 23:40:52 +05302106 switch (pcie->mode) {
2107 case DW_PCIE_RC_TYPE:
2108 ret = devm_request_irq(dev, pp->irq, tegra_pcie_rp_irq_handler,
2109 IRQF_SHARED, "tegra-pcie-intr", pcie);
2110 if (ret) {
2111 dev_err(dev, "Failed to request IRQ %d: %d\n", pp->irq,
2112 ret);
2113 goto fail;
2114 }
2115
2116 ret = tegra_pcie_config_rp(pcie);
2117 if (ret && ret != -ENOMEDIUM)
2118 goto fail;
2119 else
2120 return 0;
2121 break;
2122
2123 case DW_PCIE_EP_TYPE:
2124 ret = devm_request_threaded_irq(dev, pp->irq,
2125 tegra_pcie_ep_hard_irq,
2126 tegra_pcie_ep_irq_thread,
2127 IRQF_SHARED | IRQF_ONESHOT,
2128 "tegra-pcie-ep-intr", pcie);
2129 if (ret) {
2130 dev_err(dev, "Failed to request IRQ %d: %d\n", pp->irq,
2131 ret);
2132 goto fail;
2133 }
2134
2135 ret = tegra_pcie_config_ep(pcie, pdev);
2136 if (ret < 0)
2137 goto fail;
2138 break;
2139
2140 default:
2141 dev_err(dev, "Invalid PCIe device type %d\n", pcie->mode);
2142 }
Vidya Sagar56e15a22019-08-13 17:06:27 +05302143
2144fail:
2145 tegra_bpmp_put(pcie->bpmp);
2146 return ret;
2147}
2148
2149static int tegra_pcie_dw_remove(struct platform_device *pdev)
2150{
2151 struct tegra_pcie_dw *pcie = platform_get_drvdata(pdev);
2152
2153 if (!pcie->link_state)
2154 return 0;
2155
2156 debugfs_remove_recursive(pcie->debugfs);
2157 tegra_pcie_deinit_controller(pcie);
2158 pm_runtime_put_sync(pcie->dev);
2159 pm_runtime_disable(pcie->dev);
2160 tegra_bpmp_put(pcie->bpmp);
Vidya Sagarc57247f2020-03-03 23:40:52 +05302161 if (pcie->pex_refclk_sel_gpiod)
2162 gpiod_set_value(pcie->pex_refclk_sel_gpiod, 0);
Vidya Sagar56e15a22019-08-13 17:06:27 +05302163
2164 return 0;
2165}
2166
2167static int tegra_pcie_dw_suspend_late(struct device *dev)
2168{
2169 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev);
2170 u32 val;
2171
2172 if (!pcie->link_state)
2173 return 0;
2174
2175 /* Enable HW_HOT_RST mode */
2176 val = appl_readl(pcie, APPL_CTRL);
2177 val &= ~(APPL_CTRL_HW_HOT_RST_MODE_MASK <<
2178 APPL_CTRL_HW_HOT_RST_MODE_SHIFT);
2179 val |= APPL_CTRL_HW_HOT_RST_EN;
2180 appl_writel(pcie, val, APPL_CTRL);
2181
2182 return 0;
2183}
2184
2185static int tegra_pcie_dw_suspend_noirq(struct device *dev)
2186{
2187 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev);
2188
2189 if (!pcie->link_state)
2190 return 0;
2191
2192 /* Save MSI interrupt vector */
2193 pcie->msi_ctrl_int = dw_pcie_readl_dbi(&pcie->pci,
2194 PORT_LOGIC_MSI_CTRL_INT_0_EN);
2195 tegra_pcie_downstream_dev_to_D0(pcie);
2196 tegra_pcie_dw_pme_turnoff(pcie);
Vidya Sagarb8f0d672020-12-03 19:04:49 +05302197 tegra_pcie_unconfig_controller(pcie);
Vidya Sagar56e15a22019-08-13 17:06:27 +05302198
Vidya Sagarb8f0d672020-12-03 19:04:49 +05302199 return 0;
Vidya Sagar56e15a22019-08-13 17:06:27 +05302200}
2201
2202static int tegra_pcie_dw_resume_noirq(struct device *dev)
2203{
2204 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev);
2205 int ret;
2206
2207 if (!pcie->link_state)
2208 return 0;
2209
2210 ret = tegra_pcie_config_controller(pcie, true);
2211 if (ret < 0)
2212 return ret;
2213
2214 ret = tegra_pcie_dw_host_init(&pcie->pci.pp);
2215 if (ret < 0) {
2216 dev_err(dev, "Failed to init host: %d\n", ret);
2217 goto fail_host_init;
2218 }
2219
Vidya Sagarc4bf1f22021-05-04 22:51:57 +05302220 dw_pcie_setup_rc(&pcie->pci.pp);
2221
Rob Herring275e88b2020-12-18 08:39:05 -06002222 ret = tegra_pcie_dw_start_link(&pcie->pci);
2223 if (ret < 0)
2224 goto fail_host_init;
2225
Vidya Sagar56e15a22019-08-13 17:06:27 +05302226 /* Restore MSI interrupt vector */
2227 dw_pcie_writel_dbi(&pcie->pci, PORT_LOGIC_MSI_CTRL_INT_0_EN,
2228 pcie->msi_ctrl_int);
2229
2230 return 0;
2231
2232fail_host_init:
Vidya Sagarb8f0d672020-12-03 19:04:49 +05302233 tegra_pcie_unconfig_controller(pcie);
2234 return ret;
Vidya Sagar56e15a22019-08-13 17:06:27 +05302235}
2236
2237static int tegra_pcie_dw_resume_early(struct device *dev)
2238{
2239 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev);
2240 u32 val;
2241
Om Prakash Singhde2bbf22021-06-23 15:35:24 +05302242 if (pcie->mode == DW_PCIE_EP_TYPE) {
2243 dev_err(dev, "Suspend is not supported in EP mode");
2244 return -ENOTSUPP;
2245 }
2246
Vidya Sagar56e15a22019-08-13 17:06:27 +05302247 if (!pcie->link_state)
2248 return 0;
2249
2250 /* Disable HW_HOT_RST mode */
2251 val = appl_readl(pcie, APPL_CTRL);
2252 val &= ~(APPL_CTRL_HW_HOT_RST_MODE_MASK <<
2253 APPL_CTRL_HW_HOT_RST_MODE_SHIFT);
2254 val |= APPL_CTRL_HW_HOT_RST_MODE_IMDT_RST <<
2255 APPL_CTRL_HW_HOT_RST_MODE_SHIFT;
2256 val &= ~APPL_CTRL_HW_HOT_RST_EN;
2257 appl_writel(pcie, val, APPL_CTRL);
2258
2259 return 0;
2260}
2261
2262static void tegra_pcie_dw_shutdown(struct platform_device *pdev)
2263{
2264 struct tegra_pcie_dw *pcie = platform_get_drvdata(pdev);
2265
2266 if (!pcie->link_state)
2267 return;
2268
2269 debugfs_remove_recursive(pcie->debugfs);
2270 tegra_pcie_downstream_dev_to_D0(pcie);
2271
2272 disable_irq(pcie->pci.pp.irq);
2273 if (IS_ENABLED(CONFIG_PCI_MSI))
2274 disable_irq(pcie->pci.pp.msi_irq);
2275
2276 tegra_pcie_dw_pme_turnoff(pcie);
Vidya Sagarb8f0d672020-12-03 19:04:49 +05302277 tegra_pcie_unconfig_controller(pcie);
Vidya Sagar56e15a22019-08-13 17:06:27 +05302278}
2279
Vidya Sagarc57247f2020-03-03 23:40:52 +05302280static const struct tegra_pcie_dw_of_data tegra_pcie_dw_rc_of_data = {
2281 .mode = DW_PCIE_RC_TYPE,
2282};
2283
2284static const struct tegra_pcie_dw_of_data tegra_pcie_dw_ep_of_data = {
2285 .mode = DW_PCIE_EP_TYPE,
2286};
2287
Vidya Sagar56e15a22019-08-13 17:06:27 +05302288static const struct of_device_id tegra_pcie_dw_of_match[] = {
2289 {
2290 .compatible = "nvidia,tegra194-pcie",
Vidya Sagarc57247f2020-03-03 23:40:52 +05302291 .data = &tegra_pcie_dw_rc_of_data,
2292 },
2293 {
2294 .compatible = "nvidia,tegra194-pcie-ep",
2295 .data = &tegra_pcie_dw_ep_of_data,
Vidya Sagar56e15a22019-08-13 17:06:27 +05302296 },
2297 {},
2298};
2299
2300static const struct dev_pm_ops tegra_pcie_dw_pm_ops = {
2301 .suspend_late = tegra_pcie_dw_suspend_late,
2302 .suspend_noirq = tegra_pcie_dw_suspend_noirq,
2303 .resume_noirq = tegra_pcie_dw_resume_noirq,
2304 .resume_early = tegra_pcie_dw_resume_early,
2305};
2306
2307static struct platform_driver tegra_pcie_dw_driver = {
2308 .probe = tegra_pcie_dw_probe,
2309 .remove = tegra_pcie_dw_remove,
2310 .shutdown = tegra_pcie_dw_shutdown,
2311 .driver = {
2312 .name = "tegra194-pcie",
2313 .pm = &tegra_pcie_dw_pm_ops,
2314 .of_match_table = tegra_pcie_dw_of_match,
2315 },
2316};
2317module_platform_driver(tegra_pcie_dw_driver);
2318
2319MODULE_DEVICE_TABLE(of, tegra_pcie_dw_of_match);
2320
2321MODULE_AUTHOR("Vidya Sagar <vidyas@nvidia.com>");
2322MODULE_DESCRIPTION("NVIDIA PCIe host controller driver");
2323MODULE_LICENSE("GPL v2");