1 // 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> 14 #include <linux/interrupt.h> 15 #include <linux/iopoll.h> 16 #include <linux/kernel.h> 17 #include <linux/module.h> 18 #include <linux/of.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" 36 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) 43 44 #define APPL_CTRL 0x4 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 51 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) 59 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) 64 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) 67 68 #define APPL_INTR_STATUS_L1_0_0 0x20 69 #define APPL_INTR_STATUS_L1_0_0_LINK_REQ_RST_NOT_CHGED BIT(1) 70 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 76 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) 82 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) 87 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 95 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) 100 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) 105 106 #define APPL_MSI_CTRL_2 0xB0 107 108 #define APPL_LTR_MSG_1 0xC4 109 #define LTR_MSG_REQ BIT(15) 110 #define LTR_MST_NO_SNOOP_SHIFT 16 111 112 #define APPL_LTR_MSG_2 0xC8 113 #define APPL_LTR_MSG_2_LTR_MSG_REQ_STATE BIT(3) 114 115 #define APPL_LINK_STATUS 0xCC 116 #define APPL_LINK_STATUS_RDLH_LINK_UP BIT(0) 117 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 124 125 #define APPL_RADM_STATUS 0xE4 126 #define APPL_PM_XMT_TURNOFF_STATE BIT(0) 127 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 132 133 #define APPL_CFG_BASE_ADDR 0x104 134 #define APPL_CFG_BASE_ADDR_MASK GENMASK(31, 12) 135 136 #define APPL_CFG_IATU_DMA_BASE_ADDR 0x108 137 #define APPL_CFG_IATU_DMA_BASE_ADDR_MASK GENMASK(31, 18) 138 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 144 145 #define APPL_CFG_SLCG_OVERRIDE 0x114 146 #define APPL_CFG_SLCG_OVERRIDE_SLCG_EN_MASTER BIT(0) 147 148 #define APPL_CAR_RESET_OVRD 0x12C 149 #define APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N BIT(0) 150 151 #define IO_BASE_IO_DECODE BIT(0) 152 #define IO_BASE_IO_DECODE_BIT8 BIT(8) 153 154 #define CFG_PREF_MEM_LIMIT_BASE_MEM_DECODE BIT(0) 155 #define CFG_PREF_MEM_LIMIT_BASE_MEM_LIMIT_DECODE BIT(16) 156 157 #define CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF 0x718 158 #define CFG_TIMER_CTRL_ACK_NAK_SHIFT (19) 159 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 172 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) 181 #define N_FTS_VAL 52 182 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) 186 #define FTS_VAL 52 187 188 #define PORT_LOGIC_MSI_CTRL_INT_0_EN 0x828 189 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) 194 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) 200 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 207 208 #define PORT_LOGIC_MSIX_DOORBELL 0x948 209 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 214 215 #define PME_ACK_TIMEOUT 10000 216 217 #define LTSSM_TIMEOUT 50000 /* 50ms */ 218 219 #define GEN3_GEN4_EQ_PRESET_INIT 5 220 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 225 226 static const unsigned int pcie_gen_freq[] = { 227 GEN1_CORE_CLK_FREQ, 228 GEN2_CORE_CLK_FREQ, 229 GEN3_CORE_CLK_FREQ, 230 GEN4_CORE_CLK_FREQ 231 }; 232 233 static const u32 event_cntr_ctrl_offset[] = { 234 0x1d8, 235 0x1a8, 236 0x1a8, 237 0x1a8, 238 0x1c4, 239 0x1d8 240 }; 241 242 static const u32 event_cntr_data_offset[] = { 243 0x1dc, 244 0x1ac, 245 0x1ac, 246 0x1ac, 247 0x1c8, 248 0x1dc 249 }; 250 251 struct tegra_pcie_dw { 252 struct device *dev; 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; 260 struct dw_pcie pci; 261 struct tegra_bpmp *bpmp; 262 263 bool supports_clkreq; 264 bool enable_cdm_check; 265 bool link_state; 266 bool update_fc_fixup; 267 u8 init_link_width; 268 u32 msi_ctrl_int; 269 u32 num_lanes; 270 u32 max_speed; 271 u32 cid; 272 u32 cfg_link_cap_l1sub; 273 u32 pcie_cap_base; 274 u32 aspm_cmrt; 275 u32 aspm_pwr_on_t; 276 u32 aspm_l0s_enter_lat; 277 278 struct regulator *pex_ctl_supply; 279 struct regulator *slot_ctl_3v3; 280 struct regulator *slot_ctl_12v; 281 282 unsigned int phy_count; 283 struct phy **phys; 284 285 struct dentry *debugfs; 286 }; 287 288 static inline struct tegra_pcie_dw *to_tegra_pcie(struct dw_pcie *pci) 289 { 290 return container_of(pci, struct tegra_pcie_dw, pci); 291 } 292 293 static inline void appl_writel(struct tegra_pcie_dw *pcie, const u32 value, 294 const u32 reg) 295 { 296 writel_relaxed(value, pcie->appl_base + reg); 297 } 298 299 static inline u32 appl_readl(struct tegra_pcie_dw *pcie, const u32 reg) 300 { 301 return readl_relaxed(pcie->appl_base + reg); 302 } 303 304 struct tegra_pcie_soc { 305 enum dw_pcie_device_mode mode; 306 }; 307 308 static void apply_bad_link_workaround(struct pcie_port *pp) 309 { 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; 313 u16 val; 314 315 /* 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 319 */ 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 + 327 PCI_EXP_LNKCTL2); 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); 332 333 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + 334 PCI_EXP_LNKCTL); 335 val |= PCI_EXP_LNKCTL_RL; 336 dw_pcie_writew_dbi(pci, pcie->pcie_cap_base + 337 PCI_EXP_LNKCTL, val); 338 } 339 } 340 } 341 342 static irqreturn_t tegra_pcie_rp_irq_handler(struct tegra_pcie_dw *pcie) 343 { 344 struct dw_pcie *pci = &pcie->pci; 345 struct pcie_port *pp = &pci->pp; 346 u32 val, tmp; 347 u16 val_w; 348 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); 354 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); 359 udelay(1); 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); 363 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); 367 } 368 } 369 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) { 373 appl_writel(pcie, 374 APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS, 375 APPL_INTR_STATUS_L1_8_0); 376 apply_bad_link_workaround(pp); 377 } 378 if (val & APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS) { 379 appl_writel(pcie, 380 APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS, 381 APPL_INTR_STATUS_L1_8_0); 382 383 val_w = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + 384 PCI_EXP_LNKSTA); 385 dev_dbg(pci->dev, "Link Speed : Gen-%u\n", val_w & 386 PCI_EXP_LNKSTA_CLS); 387 } 388 } 389 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; 397 } 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; 401 } 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; 405 } 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); 409 } 410 411 return IRQ_HANDLED; 412 } 413 414 static irqreturn_t tegra_pcie_irq_handler(int irq, void *arg) 415 { 416 struct tegra_pcie_dw *pcie = arg; 417 418 return tegra_pcie_rp_irq_handler(pcie); 419 } 420 421 static int tegra_pcie_dw_rd_own_conf(struct pcie_port *pp, int where, int size, 422 u32 *val) 423 { 424 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); 425 426 /* 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 431 */ 432 if (where == PORT_LOGIC_MSIX_DOORBELL) { 433 *val = 0x00000000; 434 return PCIBIOS_SUCCESSFUL; 435 } 436 437 return dw_pcie_read(pci->dbi_base + where, size, val); 438 } 439 440 static int tegra_pcie_dw_wr_own_conf(struct pcie_port *pp, int where, int size, 441 u32 val) 442 { 443 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); 444 445 /* 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 450 */ 451 if (where == PORT_LOGIC_MSIX_DOORBELL) 452 return PCIBIOS_SUCCESSFUL; 453 454 return dw_pcie_write(pci->dbi_base + where, size, val); 455 } 456 457 #if defined(CONFIG_PCIEASPM) 458 static void disable_aspm_l11(struct tegra_pcie_dw *pcie) 459 { 460 u32 val; 461 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); 465 } 466 467 static void disable_aspm_l12(struct tegra_pcie_dw *pcie) 468 { 469 u32 val; 470 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); 474 } 475 476 static inline u32 event_counter_prog(struct tegra_pcie_dw *pcie, u32 event) 477 { 478 u32 val; 479 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]); 487 488 return val; 489 } 490 491 static int aspm_state_cnt(struct seq_file *s, void *data) 492 { 493 struct tegra_pcie_dw *pcie = (struct tegra_pcie_dw *) 494 dev_get_drvdata(s->private); 495 u32 val; 496 497 seq_printf(s, "Tx L0s entry count : %u\n", 498 event_counter_prog(pcie, EVENT_COUNTER_EVENT_Tx_L0S)); 499 500 seq_printf(s, "Rx L0s entry count : %u\n", 501 event_counter_prog(pcie, EVENT_COUNTER_EVENT_Rx_L0S)); 502 503 seq_printf(s, "Link L1 entry count : %u\n", 504 event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1)); 505 506 seq_printf(s, "Link L1.1 entry count : %u\n", 507 event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1_1)); 508 509 seq_printf(s, "Link L1.2 entry count : %u\n", 510 event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1_2)); 511 512 /* Clear all counters */ 513 dw_pcie_writel_dbi(&pcie->pci, event_cntr_ctrl_offset[pcie->cid], 514 EVENT_COUNTER_ALL_CLEAR); 515 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); 520 521 return 0; 522 } 523 524 static void init_host_aspm(struct tegra_pcie_dw *pcie) 525 { 526 struct dw_pcie *pci = &pcie->pci; 527 u32 val; 528 529 val = dw_pcie_find_ext_capability(pci, PCI_EXT_CAP_ID_L1SS); 530 pcie->cfg_link_cap_l1sub = val + PCI_L1SS_CAP; 531 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); 536 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); 543 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); 548 val |= ENTER_ASPM; 549 dw_pcie_writel_dbi(pci, PORT_LOGIC_ACK_F_ASPM_CTRL, val); 550 } 551 552 static int init_debugfs(struct tegra_pcie_dw *pcie) 553 { 554 struct dentry *d; 555 556 d = debugfs_create_devm_seqfile(pcie->dev, "aspm_state_cnt", 557 pcie->debugfs, aspm_state_cnt); 558 if (IS_ERR_OR_NULL(d)) 559 dev_err(pcie->dev, 560 "Failed to create debugfs file \"aspm_state_cnt\"\n"); 561 562 return 0; 563 } 564 #else 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; } 569 #endif 570 571 static void tegra_pcie_enable_system_interrupts(struct pcie_port *pp) 572 { 573 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); 574 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); 575 u32 val; 576 u16 val_w; 577 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); 581 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); 585 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); 590 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); 595 } 596 597 val_w = dw_pcie_readw_dbi(&pcie->pci, pcie->pcie_cap_base + 598 PCI_EXP_LNKSTA); 599 pcie->init_link_width = (val_w & PCI_EXP_LNKSTA_NLW) >> 600 PCI_EXP_LNKSTA_NLW_SHIFT; 601 602 val_w = dw_pcie_readw_dbi(&pcie->pci, pcie->pcie_cap_base + 603 PCI_EXP_LNKCTL); 604 val_w |= PCI_EXP_LNKCTL_LBMIE; 605 dw_pcie_writew_dbi(&pcie->pci, pcie->pcie_cap_base + PCI_EXP_LNKCTL, 606 val_w); 607 } 608 609 static void tegra_pcie_enable_legacy_interrupts(struct pcie_port *pp) 610 { 611 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); 612 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); 613 u32 val; 614 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); 620 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); 628 } 629 630 static void tegra_pcie_enable_msi_interrupts(struct pcie_port *pp) 631 { 632 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); 633 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); 634 u32 val; 635 636 dw_pcie_msi_init(pp); 637 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); 643 } 644 645 static void tegra_pcie_enable_interrupts(struct pcie_port *pp) 646 { 647 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); 648 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); 649 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); 666 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); 671 } 672 673 static void config_gen3_gen4_eq_presets(struct tegra_pcie_dw *pcie) 674 { 675 struct dw_pcie *pci = &pcie->pci; 676 u32 val, offset, i; 677 678 /* Program init preset */ 679 for (i = 0; i < pcie->num_lanes; i++) { 680 dw_pcie_read(pci->dbi_base + CAP_SPCIE_CAP_OFF 681 + (i * 2), 2, &val); 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 688 + (i * 2), 2, val); 689 690 offset = dw_pcie_find_ext_capability(pci, 691 PCI_EXT_CAP_ID_PL_16GT) + 692 PCI_PL_16GT_LE_CTRL; 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); 700 } 701 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); 705 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); 711 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); 716 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); 722 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); 726 } 727 728 static void tegra_pcie_prepare_host(struct pcie_port *pp) 729 { 730 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); 731 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); 732 u32 val; 733 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); 737 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); 742 743 dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_0, 0); 744 745 /* Configure FTS */ 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); 750 751 val = dw_pcie_readl_dbi(pci, PORT_LOGIC_GEN2_CTRL); 752 val &= ~FTS_MASK; 753 val |= FTS_VAL; 754 dw_pcie_writel_dbi(pci, PORT_LOGIC_GEN2_CTRL, val); 755 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); 762 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 + 766 PCI_EXP_LNKCAP); 767 val &= ~PCI_EXP_LNKCAP_SLS; 768 val |= pcie->max_speed; 769 dw_pcie_writel_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKCAP, 770 val); 771 } 772 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); 778 779 config_gen3_gen4_eq_presets(pcie); 780 781 init_host_aspm(pcie); 782 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); 786 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); 791 } 792 793 dw_pcie_setup_rc(pp); 794 795 clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ); 796 797 /* Assert RST */ 798 val = appl_readl(pcie, APPL_PINMUX); 799 val &= ~APPL_PINMUX_PEX_RST; 800 appl_writel(pcie, val, APPL_PINMUX); 801 802 usleep_range(100, 200); 803 804 /* Enable LTSSM */ 805 val = appl_readl(pcie, APPL_CTRL); 806 val |= APPL_CTRL_LTSSM_EN; 807 appl_writel(pcie, val, APPL_CTRL); 808 809 /* De-assert RST */ 810 val = appl_readl(pcie, APPL_PINMUX); 811 val |= APPL_PINMUX_PEX_RST; 812 appl_writel(pcie, val, APPL_PINMUX); 813 814 msleep(100); 815 } 816 817 static int tegra_pcie_dw_host_init(struct pcie_port *pp) 818 { 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; 822 823 tegra_pcie_prepare_host(pp); 824 825 if (dw_pcie_wait_for_link(pci)) { 826 /* 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. 833 */ 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 */ 841 return 0; 842 } 843 844 dev_info(pci->dev, "Link is down in DLL"); 845 dev_info(pci->dev, "Trying again with DLFE disabled\n"); 846 /* Disable LTSSM */ 847 val = appl_readl(pcie, APPL_CTRL); 848 val &= ~APPL_CTRL_LTSSM_EN; 849 appl_writel(pcie, val, APPL_CTRL); 850 851 reset_control_assert(pcie->core_rst); 852 reset_control_deassert(pcie->core_rst); 853 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); 858 859 tegra_pcie_prepare_host(pp); 860 861 if (dw_pcie_wait_for_link(pci)) 862 return 0; 863 } 864 865 speed = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) & 866 PCI_EXP_LNKSTA_CLS; 867 clk_set_rate(pcie->core_clk, pcie_gen_freq[speed - 1]); 868 869 tegra_pcie_enable_interrupts(pp); 870 871 return 0; 872 } 873 874 static int tegra_pcie_dw_link_up(struct dw_pcie *pci) 875 { 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); 878 879 return !!(val & PCI_EXP_LNKSTA_DLLLA); 880 } 881 882 static void tegra_pcie_set_msi_vec_num(struct pcie_port *pp) 883 { 884 pp->num_vectors = MAX_MSI_IRQS; 885 } 886 887 static const struct dw_pcie_ops tegra_dw_pcie_ops = { 888 .link_up = tegra_pcie_dw_link_up, 889 }; 890 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, 896 }; 897 898 static void tegra_pcie_disable_phy(struct tegra_pcie_dw *pcie) 899 { 900 unsigned int phy_count = pcie->phy_count; 901 902 while (phy_count--) { 903 phy_power_off(pcie->phys[phy_count]); 904 phy_exit(pcie->phys[phy_count]); 905 } 906 } 907 908 static int tegra_pcie_enable_phy(struct tegra_pcie_dw *pcie) 909 { 910 unsigned int i; 911 int ret; 912 913 for (i = 0; i < pcie->phy_count; i++) { 914 ret = phy_init(pcie->phys[i]); 915 if (ret < 0) 916 goto phy_power_off; 917 918 ret = phy_power_on(pcie->phys[i]); 919 if (ret < 0) 920 goto phy_exit; 921 } 922 923 return 0; 924 925 phy_power_off: 926 while (i--) { 927 phy_power_off(pcie->phys[i]); 928 phy_exit: 929 phy_exit(pcie->phys[i]); 930 } 931 932 return ret; 933 } 934 935 static int tegra_pcie_dw_parse_dt(struct tegra_pcie_dw *pcie) 936 { 937 struct device_node *np = pcie->dev->of_node; 938 int ret; 939 940 ret = of_property_read_u32(np, "nvidia,aspm-cmrt-us", &pcie->aspm_cmrt); 941 if (ret < 0) { 942 dev_info(pcie->dev, "Failed to read ASPM T_cmrt: %d\n", ret); 943 return ret; 944 } 945 946 ret = of_property_read_u32(np, "nvidia,aspm-pwr-on-t-us", 947 &pcie->aspm_pwr_on_t); 948 if (ret < 0) 949 dev_info(pcie->dev, "Failed to read ASPM Power On time: %d\n", 950 ret); 951 952 ret = of_property_read_u32(np, "nvidia,aspm-l0s-entrance-latency-us", 953 &pcie->aspm_l0s_enter_lat); 954 if (ret < 0) 955 dev_info(pcie->dev, 956 "Failed to read ASPM L0s Entrance latency: %d\n", ret); 957 958 ret = of_property_read_u32(np, "num-lanes", &pcie->num_lanes); 959 if (ret < 0) { 960 dev_err(pcie->dev, "Failed to read num-lanes: %d\n", ret); 961 return ret; 962 } 963 964 pcie->max_speed = of_pci_get_max_link_speed(np); 965 966 ret = of_property_read_u32_index(np, "nvidia,bpmp", 1, &pcie->cid); 967 if (ret) { 968 dev_err(pcie->dev, "Failed to read Controller-ID: %d\n", ret); 969 return ret; 970 } 971 972 ret = of_property_count_strings(np, "phy-names"); 973 if (ret < 0) { 974 dev_err(pcie->dev, "Failed to find PHY entries: %d\n", 975 ret); 976 return ret; 977 } 978 pcie->phy_count = ret; 979 980 if (of_property_read_bool(np, "nvidia,update-fc-fixup")) 981 pcie->update_fc_fixup = true; 982 983 pcie->supports_clkreq = 984 of_property_read_bool(pcie->dev->of_node, "supports-clkreq"); 985 986 pcie->enable_cdm_check = 987 of_property_read_bool(np, "snps,enable-cdm-check"); 988 989 return 0; 990 } 991 992 static int tegra_pcie_bpmp_set_ctrl_state(struct tegra_pcie_dw *pcie, 993 bool enable) 994 { 995 struct mrq_uphy_response resp; 996 struct tegra_bpmp_message msg; 997 struct mrq_uphy_request req; 998 999 /* Controller-5 doesn't need to have its state set by BPMP-FW */ 1000 if (pcie->cid == 5) 1001 return 0; 1002 1003 memset(&req, 0, sizeof(req)); 1004 memset(&resp, 0, sizeof(resp)); 1005 1006 req.cmd = CMD_UPHY_PCIE_CONTROLLER_STATE; 1007 req.controller_state.pcie_controller = pcie->cid; 1008 req.controller_state.enable = enable; 1009 1010 memset(&msg, 0, sizeof(msg)); 1011 msg.mrq = MRQ_UPHY; 1012 msg.tx.data = &req; 1013 msg.tx.size = sizeof(req); 1014 msg.rx.data = &resp; 1015 msg.rx.size = sizeof(resp); 1016 1017 return tegra_bpmp_transfer(pcie->bpmp, &msg); 1018 } 1019 1020 static void tegra_pcie_downstream_dev_to_D0(struct tegra_pcie_dw *pcie) 1021 { 1022 struct pcie_port *pp = &pcie->pci.pp; 1023 struct pci_bus *child, *root_bus = NULL; 1024 struct pci_dev *pdev; 1025 1026 /* 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). 1033 */ 1034 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) { 1038 root_bus = child; 1039 break; 1040 } 1041 } 1042 1043 if (!root_bus) { 1044 dev_err(pcie->dev, "Failed to find downstream devices\n"); 1045 return; 1046 } 1047 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)) 1051 dev_err(pcie->dev, 1052 "Failed to transition %s to D0 state\n", 1053 dev_name(&pdev->dev)); 1054 } 1055 } 1056 } 1057 1058 static int tegra_pcie_get_slot_regulators(struct tegra_pcie_dw *pcie) 1059 { 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); 1064 1065 pcie->slot_ctl_3v3 = NULL; 1066 } 1067 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); 1072 1073 pcie->slot_ctl_12v = NULL; 1074 } 1075 1076 return 0; 1077 } 1078 1079 static int tegra_pcie_enable_slot_regulators(struct tegra_pcie_dw *pcie) 1080 { 1081 int ret; 1082 1083 if (pcie->slot_ctl_3v3) { 1084 ret = regulator_enable(pcie->slot_ctl_3v3); 1085 if (ret < 0) { 1086 dev_err(pcie->dev, 1087 "Failed to enable 3.3V slot supply: %d\n", ret); 1088 return ret; 1089 } 1090 } 1091 1092 if (pcie->slot_ctl_12v) { 1093 ret = regulator_enable(pcie->slot_ctl_12v); 1094 if (ret < 0) { 1095 dev_err(pcie->dev, 1096 "Failed to enable 12V slot supply: %d\n", ret); 1097 goto fail_12v_enable; 1098 } 1099 } 1100 1101 /* 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. 1105 */ 1106 if (pcie->slot_ctl_3v3 || pcie->slot_ctl_12v) 1107 msleep(100); 1108 1109 return 0; 1110 1111 fail_12v_enable: 1112 if (pcie->slot_ctl_3v3) 1113 regulator_disable(pcie->slot_ctl_3v3); 1114 return ret; 1115 } 1116 1117 static void tegra_pcie_disable_slot_regulators(struct tegra_pcie_dw *pcie) 1118 { 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); 1123 } 1124 1125 static int tegra_pcie_config_controller(struct tegra_pcie_dw *pcie, 1126 bool en_hw_hot_rst) 1127 { 1128 int ret; 1129 u32 val; 1130 1131 ret = tegra_pcie_bpmp_set_ctrl_state(pcie, true); 1132 if (ret) { 1133 dev_err(pcie->dev, 1134 "Failed to enable controller %u: %d\n", pcie->cid, ret); 1135 return ret; 1136 } 1137 1138 ret = tegra_pcie_enable_slot_regulators(pcie); 1139 if (ret < 0) 1140 goto fail_slot_reg_en; 1141 1142 ret = regulator_enable(pcie->pex_ctl_supply); 1143 if (ret < 0) { 1144 dev_err(pcie->dev, "Failed to enable regulator: %d\n", ret); 1145 goto fail_reg_en; 1146 } 1147 1148 ret = clk_prepare_enable(pcie->core_clk); 1149 if (ret) { 1150 dev_err(pcie->dev, "Failed to enable core clock: %d\n", ret); 1151 goto fail_core_clk; 1152 } 1153 1154 ret = reset_control_deassert(pcie->core_apb_rst); 1155 if (ret) { 1156 dev_err(pcie->dev, "Failed to deassert core APB reset: %d\n", 1157 ret); 1158 goto fail_core_apb_rst; 1159 } 1160 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); 1168 } 1169 1170 ret = tegra_pcie_enable_phy(pcie); 1171 if (ret) { 1172 dev_err(pcie->dev, "Failed to enable PHY: %d\n", ret); 1173 goto fail_phy; 1174 } 1175 1176 /* Update CFG base address */ 1177 appl_writel(pcie, pcie->dbi_res->start & APPL_CFG_BASE_ADDR_MASK, 1178 APPL_CFG_BASE_ADDR); 1179 1180 /* Configure this core for RP mode operation */ 1181 appl_writel(pcie, APPL_DM_TYPE_RP, APPL_DM_TYPE); 1182 1183 appl_writel(pcie, 0x0, APPL_CFG_SLCG_OVERRIDE); 1184 1185 val = appl_readl(pcie, APPL_CTRL); 1186 appl_writel(pcie, val | APPL_CTRL_SYS_PRE_DET_STATE, APPL_CTRL); 1187 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); 1191 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); 1197 } 1198 1199 /* Update iATU_DMA base address */ 1200 appl_writel(pcie, 1201 pcie->atu_dma_res->start & APPL_CFG_IATU_DMA_BASE_ADDR_MASK, 1202 APPL_CFG_IATU_DMA_BASE_ADDR); 1203 1204 reset_control_deassert(pcie->core_rst); 1205 1206 pcie->pcie_cap_base = dw_pcie_find_capability(&pcie->pci, 1207 PCI_CAP_ID_EXP); 1208 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); 1213 } 1214 1215 return ret; 1216 1217 fail_phy: 1218 reset_control_assert(pcie->core_apb_rst); 1219 fail_core_apb_rst: 1220 clk_disable_unprepare(pcie->core_clk); 1221 fail_core_clk: 1222 regulator_disable(pcie->pex_ctl_supply); 1223 fail_reg_en: 1224 tegra_pcie_disable_slot_regulators(pcie); 1225 fail_slot_reg_en: 1226 tegra_pcie_bpmp_set_ctrl_state(pcie, false); 1227 1228 return ret; 1229 } 1230 1231 static int __deinit_controller(struct tegra_pcie_dw *pcie) 1232 { 1233 int ret; 1234 1235 ret = reset_control_assert(pcie->core_rst); 1236 if (ret) { 1237 dev_err(pcie->dev, "Failed to assert \"core\" reset: %d\n", 1238 ret); 1239 return ret; 1240 } 1241 1242 tegra_pcie_disable_phy(pcie); 1243 1244 ret = reset_control_assert(pcie->core_apb_rst); 1245 if (ret) { 1246 dev_err(pcie->dev, "Failed to assert APB reset: %d\n", ret); 1247 return ret; 1248 } 1249 1250 clk_disable_unprepare(pcie->core_clk); 1251 1252 ret = regulator_disable(pcie->pex_ctl_supply); 1253 if (ret) { 1254 dev_err(pcie->dev, "Failed to disable regulator: %d\n", ret); 1255 return ret; 1256 } 1257 1258 tegra_pcie_disable_slot_regulators(pcie); 1259 1260 ret = tegra_pcie_bpmp_set_ctrl_state(pcie, false); 1261 if (ret) { 1262 dev_err(pcie->dev, "Failed to disable controller %d: %d\n", 1263 pcie->cid, ret); 1264 return ret; 1265 } 1266 1267 return ret; 1268 } 1269 1270 static int tegra_pcie_init_controller(struct tegra_pcie_dw *pcie) 1271 { 1272 struct dw_pcie *pci = &pcie->pci; 1273 struct pcie_port *pp = &pci->pp; 1274 int ret; 1275 1276 ret = tegra_pcie_config_controller(pcie, false); 1277 if (ret < 0) 1278 return ret; 1279 1280 pp->ops = &tegra_pcie_dw_host_ops; 1281 1282 ret = dw_pcie_host_init(pp); 1283 if (ret < 0) { 1284 dev_err(pcie->dev, "Failed to add PCIe port: %d\n", ret); 1285 goto fail_host_init; 1286 } 1287 1288 return 0; 1289 1290 fail_host_init: 1291 return __deinit_controller(pcie); 1292 } 1293 1294 static int tegra_pcie_try_link_l2(struct tegra_pcie_dw *pcie) 1295 { 1296 u32 val; 1297 1298 if (!tegra_pcie_dw_link_up(&pcie->pci)) 1299 return 0; 1300 1301 val = appl_readl(pcie, APPL_RADM_STATUS); 1302 val |= APPL_PM_XMT_TURNOFF_STATE; 1303 appl_writel(pcie, val, APPL_RADM_STATUS); 1304 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); 1308 } 1309 1310 static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie) 1311 { 1312 u32 data; 1313 int err; 1314 1315 if (!tegra_pcie_dw_link_up(&pcie->pci)) { 1316 dev_dbg(pcie->dev, "PCIe link is not up...!\n"); 1317 return; 1318 } 1319 1320 if (tegra_pcie_try_link_l2(pcie)) { 1321 dev_info(pcie->dev, "Link didn't transition to L2 state\n"); 1322 /* 1323 * TX lane clock freq will reset to Gen1 only if link is in L2 1324 * or detect state. 1325 * So apply pex_rst to end point to force RP to go into detect 1326 * state 1327 */ 1328 data = appl_readl(pcie, APPL_PINMUX); 1329 data &= ~APPL_PINMUX_PEX_RST; 1330 appl_writel(pcie, data, APPL_PINMUX); 1331 1332 err = readl_poll_timeout_atomic(pcie->appl_base + APPL_DEBUG, 1333 data, 1334 ((data & 1335 APPL_DEBUG_LTSSM_STATE_MASK) >> 1336 APPL_DEBUG_LTSSM_STATE_SHIFT) == 1337 LTSSM_STATE_PRE_DETECT, 1338 1, LTSSM_TIMEOUT); 1339 if (err) { 1340 dev_info(pcie->dev, "Link didn't go to detect state\n"); 1341 } else { 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); 1346 } 1347 } 1348 /* 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 1351 */ 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); 1358 } 1359 1360 static int tegra_pcie_deinit_controller(struct tegra_pcie_dw *pcie) 1361 { 1362 tegra_pcie_downstream_dev_to_D0(pcie); 1363 dw_pcie_host_deinit(&pcie->pci.pp); 1364 tegra_pcie_dw_pme_turnoff(pcie); 1365 1366 return __deinit_controller(pcie); 1367 } 1368 1369 static int tegra_pcie_config_rp(struct tegra_pcie_dw *pcie) 1370 { 1371 struct pcie_port *pp = &pcie->pci.pp; 1372 struct device *dev = pcie->dev; 1373 char *name; 1374 int ret; 1375 1376 if (IS_ENABLED(CONFIG_PCI_MSI)) { 1377 pp->msi_irq = of_irq_get_byname(dev->of_node, "msi"); 1378 if (!pp->msi_irq) { 1379 dev_err(dev, "Failed to get MSI interrupt\n"); 1380 return -ENODEV; 1381 } 1382 } 1383 1384 pm_runtime_enable(dev); 1385 1386 ret = pm_runtime_get_sync(dev); 1387 if (ret < 0) { 1388 dev_err(dev, "Failed to get runtime sync for PCIe dev: %d\n", 1389 ret); 1390 goto fail_pm_get_sync; 1391 } 1392 1393 ret = pinctrl_pm_select_default_state(dev); 1394 if (ret < 0) { 1395 dev_err(dev, "Failed to configure sideband pins: %d\n", ret); 1396 goto fail_pinctrl; 1397 } 1398 1399 tegra_pcie_init_controller(pcie); 1400 1401 pcie->link_state = tegra_pcie_dw_link_up(&pcie->pci); 1402 if (!pcie->link_state) { 1403 ret = -ENOMEDIUM; 1404 goto fail_host_init; 1405 } 1406 1407 name = devm_kasprintf(dev, GFP_KERNEL, "%pOFP", dev->of_node); 1408 if (!name) { 1409 ret = -ENOMEM; 1410 goto fail_host_init; 1411 } 1412 1413 pcie->debugfs = debugfs_create_dir(name, NULL); 1414 if (!pcie->debugfs) 1415 dev_err(dev, "Failed to create debugfs\n"); 1416 else 1417 init_debugfs(pcie); 1418 1419 return ret; 1420 1421 fail_host_init: 1422 tegra_pcie_deinit_controller(pcie); 1423 fail_pinctrl: 1424 pm_runtime_put_sync(dev); 1425 fail_pm_get_sync: 1426 pm_runtime_disable(dev); 1427 return ret; 1428 } 1429 1430 static int tegra_pcie_dw_probe(struct platform_device *pdev) 1431 { 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; 1438 struct phy **phys; 1439 char *name; 1440 int ret; 1441 u32 i; 1442 1443 pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); 1444 if (!pcie) 1445 return -ENOMEM; 1446 1447 pci = &pcie->pci; 1448 pci->dev = &pdev->dev; 1449 pci->ops = &tegra_dw_pcie_ops; 1450 pp = &pci->pp; 1451 pcie->dev = &pdev->dev; 1452 1453 ret = tegra_pcie_dw_parse_dt(pcie); 1454 if (ret < 0) { 1455 dev_err(dev, "Failed to parse device tree: %d\n", ret); 1456 return ret; 1457 } 1458 1459 ret = tegra_pcie_get_slot_regulators(pcie); 1460 if (ret < 0) { 1461 dev_err(dev, "Failed to get slot regulators: %d\n", ret); 1462 return ret; 1463 } 1464 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)); 1471 return ret; 1472 } 1473 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); 1479 } 1480 1481 pcie->appl_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, 1482 "appl"); 1483 if (!pcie->appl_res) { 1484 dev_err(dev, "Failed to find \"appl\" region\n"); 1485 return -ENODEV; 1486 } 1487 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); 1491 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); 1497 } 1498 1499 phys = devm_kcalloc(dev, pcie->phy_count, sizeof(*phys), GFP_KERNEL); 1500 if (!phys) 1501 return -ENOMEM; 1502 1503 for (i = 0; i < pcie->phy_count; i++) { 1504 name = kasprintf(GFP_KERNEL, "p2u-%u", i); 1505 if (!name) { 1506 dev_err(dev, "Failed to create P2U string\n"); 1507 return -ENOMEM; 1508 } 1509 phys[i] = devm_phy_get(dev, name); 1510 kfree(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); 1515 return ret; 1516 } 1517 } 1518 1519 pcie->phys = phys; 1520 1521 dbi_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi"); 1522 if (!dbi_res) { 1523 dev_err(dev, "Failed to find \"dbi\" region\n"); 1524 return -ENODEV; 1525 } 1526 pcie->dbi_res = dbi_res; 1527 1528 pci->dbi_base = devm_ioremap_resource(dev, dbi_res); 1529 if (IS_ERR(pci->dbi_base)) 1530 return PTR_ERR(pci->dbi_base); 1531 1532 /* Tegra HW locates DBI2 at a fixed offset from DBI */ 1533 pci->dbi_base2 = pci->dbi_base + 0x1000; 1534 1535 atu_dma_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, 1536 "atu_dma"); 1537 if (!atu_dma_res) { 1538 dev_err(dev, "Failed to find \"atu_dma\" region\n"); 1539 return -ENODEV; 1540 } 1541 pcie->atu_dma_res = atu_dma_res; 1542 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); 1546 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); 1552 } 1553 1554 pp->irq = platform_get_irq_byname(pdev, "intr"); 1555 if (!pp->irq) { 1556 dev_err(dev, "Failed to get \"intr\" interrupt\n"); 1557 return -ENODEV; 1558 } 1559 1560 ret = devm_request_irq(dev, pp->irq, tegra_pcie_irq_handler, 1561 IRQF_SHARED, "tegra-pcie-intr", pcie); 1562 if (ret) { 1563 dev_err(dev, "Failed to request IRQ %d: %d\n", pp->irq, ret); 1564 return ret; 1565 } 1566 1567 pcie->bpmp = tegra_bpmp_get(dev); 1568 if (IS_ERR(pcie->bpmp)) 1569 return PTR_ERR(pcie->bpmp); 1570 1571 platform_set_drvdata(pdev, pcie); 1572 1573 ret = tegra_pcie_config_rp(pcie); 1574 if (ret && ret != -ENOMEDIUM) 1575 goto fail; 1576 else 1577 return 0; 1578 1579 fail: 1580 tegra_bpmp_put(pcie->bpmp); 1581 return ret; 1582 } 1583 1584 static int tegra_pcie_dw_remove(struct platform_device *pdev) 1585 { 1586 struct tegra_pcie_dw *pcie = platform_get_drvdata(pdev); 1587 1588 if (!pcie->link_state) 1589 return 0; 1590 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); 1596 1597 return 0; 1598 } 1599 1600 static int tegra_pcie_dw_suspend_late(struct device *dev) 1601 { 1602 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev); 1603 u32 val; 1604 1605 if (!pcie->link_state) 1606 return 0; 1607 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); 1614 1615 return 0; 1616 } 1617 1618 static int tegra_pcie_dw_suspend_noirq(struct device *dev) 1619 { 1620 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev); 1621 1622 if (!pcie->link_state) 1623 return 0; 1624 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); 1630 1631 return __deinit_controller(pcie); 1632 } 1633 1634 static int tegra_pcie_dw_resume_noirq(struct device *dev) 1635 { 1636 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev); 1637 int ret; 1638 1639 if (!pcie->link_state) 1640 return 0; 1641 1642 ret = tegra_pcie_config_controller(pcie, true); 1643 if (ret < 0) 1644 return ret; 1645 1646 ret = tegra_pcie_dw_host_init(&pcie->pci.pp); 1647 if (ret < 0) { 1648 dev_err(dev, "Failed to init host: %d\n", ret); 1649 goto fail_host_init; 1650 } 1651 1652 /* Restore MSI interrupt vector */ 1653 dw_pcie_writel_dbi(&pcie->pci, PORT_LOGIC_MSI_CTRL_INT_0_EN, 1654 pcie->msi_ctrl_int); 1655 1656 return 0; 1657 1658 fail_host_init: 1659 return __deinit_controller(pcie); 1660 } 1661 1662 static int tegra_pcie_dw_resume_early(struct device *dev) 1663 { 1664 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev); 1665 u32 val; 1666 1667 if (!pcie->link_state) 1668 return 0; 1669 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); 1678 1679 return 0; 1680 } 1681 1682 static void tegra_pcie_dw_shutdown(struct platform_device *pdev) 1683 { 1684 struct tegra_pcie_dw *pcie = platform_get_drvdata(pdev); 1685 1686 if (!pcie->link_state) 1687 return; 1688 1689 debugfs_remove_recursive(pcie->debugfs); 1690 tegra_pcie_downstream_dev_to_D0(pcie); 1691 1692 disable_irq(pcie->pci.pp.irq); 1693 if (IS_ENABLED(CONFIG_PCI_MSI)) 1694 disable_irq(pcie->pci.pp.msi_irq); 1695 1696 tegra_pcie_dw_pme_turnoff(pcie); 1697 __deinit_controller(pcie); 1698 } 1699 1700 static const struct of_device_id tegra_pcie_dw_of_match[] = { 1701 { 1702 .compatible = "nvidia,tegra194-pcie", 1703 }, 1704 {}, 1705 }; 1706 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, 1712 }; 1713 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, 1718 .driver = { 1719 .name = "tegra194-pcie", 1720 .pm = &tegra_pcie_dw_pm_ops, 1721 .of_match_table = tegra_pcie_dw_of_match, 1722 }, 1723 }; 1724 module_platform_driver(tegra_pcie_dw_driver); 1725 1726 MODULE_DEVICE_TABLE(of, tegra_pcie_dw_of_match); 1727 1728 MODULE_AUTHOR("Vidya Sagar <vidyas@nvidia.com>"); 1729 MODULE_DESCRIPTION("NVIDIA PCIe host controller driver"); 1730 MODULE_LICENSE("GPL v2"); 1731