Lines Matching +full:pcie +full:- +full:0
1 // SPDX-License-Identifier: GPL-2.0+
3 * PCIe host controller driver for Tegra194 SoC
34 #include "pcie-designware.h"
36 #include <soc/tegra/bpmp-abi.h>
39 #define APPL_PINMUX 0x0
40 #define APPL_PINMUX_PEX_RST BIT(0)
46 #define APPL_CTRL 0x4
50 #define APPL_CTRL_HW_HOT_RST_MODE_MASK GENMASK(1, 0)
52 #define APPL_CTRL_HW_HOT_RST_MODE_IMDT_RST 0x1
54 #define APPL_INTR_EN_L0_0 0x8
55 #define APPL_INTR_EN_L0_0_LINK_STATE_INT_EN BIT(0)
63 #define APPL_INTR_STATUS_L0 0xC
64 #define APPL_INTR_STATUS_L0_LINK_STATE_INT BIT(0)
70 #define APPL_INTR_EN_L1_0_0 0x1C
75 #define APPL_INTR_STATUS_L1_0_0 0x20
80 #define APPL_INTR_STATUS_L1_1 0x2C
81 #define APPL_INTR_STATUS_L1_2 0x30
82 #define APPL_INTR_STATUS_L1_3 0x34
83 #define APPL_INTR_STATUS_L1_6 0x3C
84 #define APPL_INTR_STATUS_L1_7 0x40
87 #define APPL_INTR_EN_L1_8_0 0x44
93 #define APPL_INTR_STATUS_L1_8_0 0x4C
98 #define APPL_INTR_STATUS_L1_9 0x54
99 #define APPL_INTR_STATUS_L1_10 0x58
100 #define APPL_INTR_STATUS_L1_11 0x64
101 #define APPL_INTR_STATUS_L1_13 0x74
102 #define APPL_INTR_STATUS_L1_14 0x78
103 #define APPL_INTR_STATUS_L1_15 0x7C
104 #define APPL_INTR_STATUS_L1_17 0x88
106 #define APPL_INTR_EN_L1_18 0x90
109 #define APPL_INTR_EN_L1_18_CDM_REG_CHK_LOGIC_ERR BIT(0)
111 #define APPL_INTR_STATUS_L1_18 0x94
114 #define APPL_INTR_STATUS_L1_18_CDM_REG_CHK_LOGIC_ERR BIT(0)
116 #define APPL_MSI_CTRL_1 0xAC
118 #define APPL_MSI_CTRL_2 0xB0
120 #define APPL_LEGACY_INTX 0xB8
122 #define APPL_LTR_MSG_1 0xC4
126 #define APPL_LTR_MSG_2 0xC8
129 #define APPL_LINK_STATUS 0xCC
130 #define APPL_LINK_STATUS_RDLH_LINK_UP BIT(0)
132 #define APPL_DEBUG 0xD0
134 #define APPL_DEBUG_PM_LINKST_IN_L0 0x11
139 #define APPL_RADM_STATUS 0xE4
140 #define APPL_PM_XMT_TURNOFF_STATE BIT(0)
142 #define APPL_DM_TYPE 0x100
143 #define APPL_DM_TYPE_MASK GENMASK(3, 0)
144 #define APPL_DM_TYPE_RP 0x4
145 #define APPL_DM_TYPE_EP 0x0
147 #define APPL_CFG_BASE_ADDR 0x104
150 #define APPL_CFG_IATU_DMA_BASE_ADDR 0x108
153 #define APPL_CFG_MISC 0x110
159 #define APPL_CFG_SLCG_OVERRIDE 0x114
160 #define APPL_CFG_SLCG_OVERRIDE_SLCG_EN_MASTER BIT(0)
162 #define APPL_CAR_RESET_OVRD 0x12C
163 #define APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N BIT(0)
165 #define IO_BASE_IO_DECODE BIT(0)
168 #define CFG_PREF_MEM_LIMIT_BASE_MEM_DECODE BIT(0)
171 #define CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF 0x718
174 #define EVENT_COUNTER_ALL_CLEAR 0x3
175 #define EVENT_COUNTER_ENABLE_ALL 0x7
177 #define EVENT_COUNTER_EVENT_SEL_MASK GENMASK(7, 0)
179 #define EVENT_COUNTER_EVENT_Tx_L0S 0x2
180 #define EVENT_COUNTER_EVENT_Rx_L0S 0x3
181 #define EVENT_COUNTER_EVENT_L1 0x5
182 #define EVENT_COUNTER_EVENT_L1_1 0x7
183 #define EVENT_COUNTER_EVENT_L1_2 0x8
185 #define EVENT_COUNTER_GROUP_5 0x5
190 #define PORT_LOGIC_MSI_CTRL_INT_0_EN 0x828
192 #define GEN3_EQ_CONTROL_OFF 0x8a8
195 #define GEN3_EQ_CONTROL_OFF_FB_MODE_MASK GENMASK(3, 0)
197 #define GEN3_RELATED_OFF 0x890
198 #define GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL BIT(0)
203 #define PORT_LOGIC_AMBA_ERROR_RESPONSE_DEFAULT 0x8D0
205 #define AMBA_ERROR_RESPONSE_CRS_MASK GENMASK(1, 0)
206 #define AMBA_ERROR_RESPONSE_CRS_OKAY 0
210 #define MSIX_ADDR_MATCH_LOW_OFF 0x940
211 #define MSIX_ADDR_MATCH_LOW_OFF_EN BIT(0)
214 #define MSIX_ADDR_MATCH_HIGH_OFF 0x944
215 #define MSIX_ADDR_MATCH_HIGH_OFF_MASK GENMASK(31, 0)
217 #define PORT_LOGIC_MSIX_DOORBELL 0x948
219 #define CAP_SPCIE_CAP_OFF 0x154
220 #define CAP_SPCIE_CAP_OFF_DSP_TX_PRESET0_MASK GENMASK(3, 0)
239 #define EP_STATE_DISABLED 0
243 GEN1_CORE_CLK_FREQ, /* PCI_EXP_LNKSTA_CLS == 0; undefined */
251 0x1d8,
252 0x1a8,
253 0x1a8,
254 0x1a8,
255 0x1c4,
256 0x1d8
260 0x1dc,
261 0x1ac,
262 0x1ac,
263 0x1ac,
264 0x1c8,
265 0x1dc
321 static inline void appl_writel(struct tegra_pcie_dw *pcie, const u32 value, in appl_writel() argument
324 writel_relaxed(value, pcie->appl_base + reg); in appl_writel()
327 static inline u32 appl_readl(struct tegra_pcie_dw *pcie, const u32 reg) in appl_readl() argument
329 return readl_relaxed(pcie->appl_base + reg); in appl_readl()
339 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in apply_bad_link_workaround() local
344 * NOTE:- Since this scenario is uncommon and link as such is not in apply_bad_link_workaround()
346 * transitioning to Gen-2 speed in apply_bad_link_workaround()
348 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA); in apply_bad_link_workaround()
351 if (pcie->init_link_width > current_link_width) { in apply_bad_link_workaround()
352 dev_warn(pci->dev, "PCIe link is bad, width reduced\n"); in apply_bad_link_workaround()
353 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + in apply_bad_link_workaround()
357 dw_pcie_writew_dbi(pci, pcie->pcie_cap_base + in apply_bad_link_workaround()
360 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + in apply_bad_link_workaround()
363 dw_pcie_writew_dbi(pci, pcie->pcie_cap_base + in apply_bad_link_workaround()
371 struct tegra_pcie_dw *pcie = arg; in tegra_pcie_rp_irq_handler() local
372 struct dw_pcie *pci = &pcie->pci; in tegra_pcie_rp_irq_handler()
373 struct pcie_port *pp = &pci->pp; in tegra_pcie_rp_irq_handler()
377 status_l0 = appl_readl(pcie, APPL_INTR_STATUS_L0); in tegra_pcie_rp_irq_handler()
379 status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_0_0); in tegra_pcie_rp_irq_handler()
380 appl_writel(pcie, status_l1, APPL_INTR_STATUS_L1_0_0); in tegra_pcie_rp_irq_handler()
383 val = appl_readl(pcie, APPL_CAR_RESET_OVRD); in tegra_pcie_rp_irq_handler()
385 appl_writel(pcie, val, APPL_CAR_RESET_OVRD); in tegra_pcie_rp_irq_handler()
387 val = appl_readl(pcie, APPL_CAR_RESET_OVRD); in tegra_pcie_rp_irq_handler()
389 appl_writel(pcie, val, APPL_CAR_RESET_OVRD); in tegra_pcie_rp_irq_handler()
398 status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_8_0); in tegra_pcie_rp_irq_handler()
400 appl_writel(pcie, in tegra_pcie_rp_irq_handler()
406 appl_writel(pcie, in tegra_pcie_rp_irq_handler()
410 val_w = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + in tegra_pcie_rp_irq_handler()
412 dev_dbg(pci->dev, "Link Speed : Gen-%u\n", val_w & in tegra_pcie_rp_irq_handler()
418 status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_18); in tegra_pcie_rp_irq_handler()
421 dev_info(pci->dev, "CDM check complete\n"); in tegra_pcie_rp_irq_handler()
425 dev_err(pci->dev, "CDM comparison mismatch\n"); in tegra_pcie_rp_irq_handler()
429 dev_err(pci->dev, "CDM Logic error\n"); in tegra_pcie_rp_irq_handler()
434 dev_err(pci->dev, "CDM Error Address Offset = 0x%08X\n", val); in tegra_pcie_rp_irq_handler()
440 static void pex_ep_event_hot_rst_done(struct tegra_pcie_dw *pcie) in pex_ep_event_hot_rst_done() argument
444 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L0); in pex_ep_event_hot_rst_done()
445 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0); in pex_ep_event_hot_rst_done()
446 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_1); in pex_ep_event_hot_rst_done()
447 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_2); in pex_ep_event_hot_rst_done()
448 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_3); in pex_ep_event_hot_rst_done()
449 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_6); in pex_ep_event_hot_rst_done()
450 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_7); in pex_ep_event_hot_rst_done()
451 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_8_0); in pex_ep_event_hot_rst_done()
452 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_9); in pex_ep_event_hot_rst_done()
453 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_10); in pex_ep_event_hot_rst_done()
454 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_11); in pex_ep_event_hot_rst_done()
455 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_13); in pex_ep_event_hot_rst_done()
456 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_14); in pex_ep_event_hot_rst_done()
457 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_15); in pex_ep_event_hot_rst_done()
458 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_17); in pex_ep_event_hot_rst_done()
459 appl_writel(pcie, 0xFFFFFFFF, APPL_MSI_CTRL_2); in pex_ep_event_hot_rst_done()
461 val = appl_readl(pcie, APPL_CTRL); in pex_ep_event_hot_rst_done()
463 appl_writel(pcie, val, APPL_CTRL); in pex_ep_event_hot_rst_done()
468 struct tegra_pcie_dw *pcie = arg; in tegra_pcie_ep_irq_thread() local
469 struct dw_pcie *pci = &pcie->pci; in tegra_pcie_ep_irq_thread()
472 speed = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) & in tegra_pcie_ep_irq_thread()
476 speed = 0; in tegra_pcie_ep_irq_thread()
478 clk_set_rate(pcie->core_clk, pcie_gen_freq[speed]); in tegra_pcie_ep_irq_thread()
481 val = dw_pcie_readl_dbi(pci, pcie->cfg_link_cap_l1sub); in tegra_pcie_ep_irq_thread()
490 /* 110us for both snoop and no-snoop */ in tegra_pcie_ep_irq_thread()
493 appl_writel(pcie, val, APPL_LTR_MSG_1); in tegra_pcie_ep_irq_thread()
496 val = appl_readl(pcie, APPL_LTR_MSG_2); in tegra_pcie_ep_irq_thread()
498 appl_writel(pcie, val, APPL_LTR_MSG_2); in tegra_pcie_ep_irq_thread()
502 val = appl_readl(pcie, APPL_LTR_MSG_2); in tegra_pcie_ep_irq_thread()
510 dev_err(pcie->dev, "Failed to send LTR message\n"); in tegra_pcie_ep_irq_thread()
518 struct tegra_pcie_dw *pcie = arg; in tegra_pcie_ep_hard_irq() local
519 struct dw_pcie_ep *ep = &pcie->pci.ep; in tegra_pcie_ep_hard_irq()
523 status_l0 = appl_readl(pcie, APPL_INTR_STATUS_L0); in tegra_pcie_ep_hard_irq()
525 status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_0_0); in tegra_pcie_ep_hard_irq()
526 appl_writel(pcie, status_l1, APPL_INTR_STATUS_L1_0_0); in tegra_pcie_ep_hard_irq()
529 pex_ep_event_hot_rst_done(pcie); in tegra_pcie_ep_hard_irq()
532 link_status = appl_readl(pcie, APPL_LINK_STATUS); in tegra_pcie_ep_hard_irq()
534 dev_dbg(pcie->dev, "Link is up with Host\n"); in tegra_pcie_ep_hard_irq()
539 spurious = 0; in tegra_pcie_ep_hard_irq()
543 status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_15); in tegra_pcie_ep_hard_irq()
544 appl_writel(pcie, status_l1, APPL_INTR_STATUS_L1_15); in tegra_pcie_ep_hard_irq()
549 spurious = 0; in tegra_pcie_ep_hard_irq()
553 dev_warn(pcie->dev, "Random interrupt (STATUS = 0x%08X)\n", in tegra_pcie_ep_hard_irq()
555 appl_writel(pcie, status_l0, APPL_INTR_STATUS_L0); in tegra_pcie_ep_hard_irq()
567 * when it is accessed with link being in ASPM-L1 state. in tegra_pcie_dw_rd_own_conf()
571 *val = 0x00000000; in tegra_pcie_dw_rd_own_conf()
584 * when it is accessed with link being in ASPM-L1 state. in tegra_pcie_dw_wr_own_conf()
600 static void disable_aspm_l11(struct tegra_pcie_dw *pcie) in disable_aspm_l11() argument
604 val = dw_pcie_readl_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub); in disable_aspm_l11()
606 dw_pcie_writel_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub, val); in disable_aspm_l11()
609 static void disable_aspm_l12(struct tegra_pcie_dw *pcie) in disable_aspm_l12() argument
613 val = dw_pcie_readl_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub); in disable_aspm_l12()
615 dw_pcie_writel_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub, val); in disable_aspm_l12()
618 static inline u32 event_counter_prog(struct tegra_pcie_dw *pcie, u32 event) in event_counter_prog() argument
622 val = dw_pcie_readl_dbi(&pcie->pci, event_cntr_ctrl_offset[pcie->cid]); in event_counter_prog()
627 dw_pcie_writel_dbi(&pcie->pci, event_cntr_ctrl_offset[pcie->cid], val); in event_counter_prog()
628 val = dw_pcie_readl_dbi(&pcie->pci, event_cntr_data_offset[pcie->cid]); in event_counter_prog()
635 struct tegra_pcie_dw *pcie = (struct tegra_pcie_dw *) in aspm_state_cnt() local
636 dev_get_drvdata(s->private); in aspm_state_cnt()
640 event_counter_prog(pcie, EVENT_COUNTER_EVENT_Tx_L0S)); in aspm_state_cnt()
643 event_counter_prog(pcie, EVENT_COUNTER_EVENT_Rx_L0S)); in aspm_state_cnt()
646 event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1)); in aspm_state_cnt()
649 event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1_1)); in aspm_state_cnt()
652 event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1_2)); in aspm_state_cnt()
655 dw_pcie_writel_dbi(&pcie->pci, event_cntr_ctrl_offset[pcie->cid], in aspm_state_cnt()
658 /* Re-enable counting */ in aspm_state_cnt()
661 dw_pcie_writel_dbi(&pcie->pci, event_cntr_ctrl_offset[pcie->cid], val); in aspm_state_cnt()
663 return 0; in aspm_state_cnt()
666 static void init_host_aspm(struct tegra_pcie_dw *pcie) in init_host_aspm() argument
668 struct dw_pcie *pci = &pcie->pci; in init_host_aspm()
672 pcie->cfg_link_cap_l1sub = val + PCI_L1SS_CAP; in init_host_aspm()
677 dw_pcie_writel_dbi(pci, event_cntr_ctrl_offset[pcie->cid], val); in init_host_aspm()
680 val = dw_pcie_readl_dbi(pci, pcie->cfg_link_cap_l1sub); in init_host_aspm()
682 val |= (pcie->aspm_cmrt << 8); in init_host_aspm()
683 val |= (pcie->aspm_pwr_on_t << 19); in init_host_aspm()
684 dw_pcie_writel_dbi(pci, pcie->cfg_link_cap_l1sub, val); in init_host_aspm()
689 val |= (pcie->aspm_l0s_enter_lat << PORT_AFR_L0S_ENTRANCE_LAT_SHIFT); in init_host_aspm()
694 static void init_debugfs(struct tegra_pcie_dw *pcie) in init_debugfs() argument
696 debugfs_create_devm_seqfile(pcie->dev, "aspm_state_cnt", pcie->debugfs, in init_debugfs()
700 static inline void disable_aspm_l12(struct tegra_pcie_dw *pcie) { return; } in disable_aspm_l12() argument
701 static inline void disable_aspm_l11(struct tegra_pcie_dw *pcie) { return; } in disable_aspm_l11() argument
702 static inline void init_host_aspm(struct tegra_pcie_dw *pcie) { return; } in init_host_aspm() argument
703 static inline void init_debugfs(struct tegra_pcie_dw *pcie) { return; } in init_debugfs() argument
709 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_enable_system_interrupts() local
713 val = appl_readl(pcie, APPL_INTR_EN_L0_0); in tegra_pcie_enable_system_interrupts()
715 appl_writel(pcie, val, APPL_INTR_EN_L0_0); in tegra_pcie_enable_system_interrupts()
717 val = appl_readl(pcie, APPL_INTR_EN_L1_0_0); in tegra_pcie_enable_system_interrupts()
719 appl_writel(pcie, val, APPL_INTR_EN_L1_0_0); in tegra_pcie_enable_system_interrupts()
721 if (pcie->enable_cdm_check) { in tegra_pcie_enable_system_interrupts()
722 val = appl_readl(pcie, APPL_INTR_EN_L0_0); in tegra_pcie_enable_system_interrupts()
724 appl_writel(pcie, val, APPL_INTR_EN_L0_0); in tegra_pcie_enable_system_interrupts()
726 val = appl_readl(pcie, APPL_INTR_EN_L1_18); in tegra_pcie_enable_system_interrupts()
729 appl_writel(pcie, val, APPL_INTR_EN_L1_18); in tegra_pcie_enable_system_interrupts()
732 val_w = dw_pcie_readw_dbi(&pcie->pci, pcie->pcie_cap_base + in tegra_pcie_enable_system_interrupts()
734 pcie->init_link_width = FIELD_GET(PCI_EXP_LNKSTA_NLW, val_w); in tegra_pcie_enable_system_interrupts()
736 val_w = dw_pcie_readw_dbi(&pcie->pci, pcie->pcie_cap_base + in tegra_pcie_enable_system_interrupts()
739 dw_pcie_writew_dbi(&pcie->pci, pcie->pcie_cap_base + PCI_EXP_LNKCTL, in tegra_pcie_enable_system_interrupts()
746 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_enable_legacy_interrupts() local
750 val = appl_readl(pcie, APPL_INTR_EN_L0_0); in tegra_pcie_enable_legacy_interrupts()
753 appl_writel(pcie, val, APPL_INTR_EN_L0_0); in tegra_pcie_enable_legacy_interrupts()
755 val = appl_readl(pcie, APPL_INTR_EN_L1_8_0); in tegra_pcie_enable_legacy_interrupts()
761 appl_writel(pcie, val, APPL_INTR_EN_L1_8_0); in tegra_pcie_enable_legacy_interrupts()
767 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_enable_msi_interrupts() local
773 val = appl_readl(pcie, APPL_INTR_EN_L0_0); in tegra_pcie_enable_msi_interrupts()
776 appl_writel(pcie, val, APPL_INTR_EN_L0_0); in tegra_pcie_enable_msi_interrupts()
782 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_enable_interrupts() local
785 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L0); in tegra_pcie_enable_interrupts()
786 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0); in tegra_pcie_enable_interrupts()
787 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_1); in tegra_pcie_enable_interrupts()
788 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_2); in tegra_pcie_enable_interrupts()
789 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_3); in tegra_pcie_enable_interrupts()
790 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_6); in tegra_pcie_enable_interrupts()
791 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_7); in tegra_pcie_enable_interrupts()
792 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_8_0); in tegra_pcie_enable_interrupts()
793 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_9); in tegra_pcie_enable_interrupts()
794 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_10); in tegra_pcie_enable_interrupts()
795 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_11); in tegra_pcie_enable_interrupts()
796 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_13); in tegra_pcie_enable_interrupts()
797 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_14); in tegra_pcie_enable_interrupts()
798 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_15); in tegra_pcie_enable_interrupts()
799 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_17); in tegra_pcie_enable_interrupts()
807 static void config_gen3_gen4_eq_presets(struct tegra_pcie_dw *pcie) in config_gen3_gen4_eq_presets() argument
809 struct dw_pcie *pci = &pcie->pci; in config_gen3_gen4_eq_presets()
813 for (i = 0; i < pcie->num_lanes; i++) { in config_gen3_gen4_eq_presets()
840 val |= (0x3ff << GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_SHIFT); in config_gen3_gen4_eq_presets()
846 val |= (0x1 << GEN3_RELATED_OFF_RATE_SHADOW_SEL_SHIFT); in config_gen3_gen4_eq_presets()
851 val |= (0x360 << GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_SHIFT); in config_gen3_gen4_eq_presets()
863 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_prepare_host() local
875 dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_0, 0); in tegra_pcie_prepare_host()
877 /* Enable as 0xFFFF0001 response for CRS */ in tegra_pcie_prepare_host()
885 val = dw_pcie_readl_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKCAP); in tegra_pcie_prepare_host()
887 val |= FIELD_PREP(PCI_EXP_LNKCAP_MLW, pcie->num_lanes); in tegra_pcie_prepare_host()
888 dw_pcie_writel_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKCAP, val); in tegra_pcie_prepare_host()
890 config_gen3_gen4_eq_presets(pcie); in tegra_pcie_prepare_host()
892 init_host_aspm(pcie); in tegra_pcie_prepare_host()
898 if (pcie->update_fc_fixup) { in tegra_pcie_prepare_host()
900 val |= 0x1 << CFG_TIMER_CTRL_ACK_NAK_SHIFT; in tegra_pcie_prepare_host()
906 clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ); in tegra_pcie_prepare_host()
909 val = appl_readl(pcie, APPL_PINMUX); in tegra_pcie_prepare_host()
911 appl_writel(pcie, val, APPL_PINMUX); in tegra_pcie_prepare_host()
916 val = appl_readl(pcie, APPL_CTRL); in tegra_pcie_prepare_host()
918 appl_writel(pcie, val, APPL_CTRL); in tegra_pcie_prepare_host()
920 /* De-assert RST */ in tegra_pcie_prepare_host()
921 val = appl_readl(pcie, APPL_PINMUX); in tegra_pcie_prepare_host()
923 appl_writel(pcie, val, APPL_PINMUX); in tegra_pcie_prepare_host()
931 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_dw_host_init() local
934 pp->bridge->ops = &tegra_pci_ops; in tegra_pcie_dw_host_init()
947 val = appl_readl(pcie, APPL_DEBUG); in tegra_pcie_dw_host_init()
950 tmp = appl_readl(pcie, APPL_LINK_STATUS); in tegra_pcie_dw_host_init()
952 if (!(val == 0x11 && !tmp)) { in tegra_pcie_dw_host_init()
954 return 0; in tegra_pcie_dw_host_init()
957 dev_info(pci->dev, "Link is down in DLL"); in tegra_pcie_dw_host_init()
958 dev_info(pci->dev, "Trying again with DLFE disabled\n"); in tegra_pcie_dw_host_init()
960 val = appl_readl(pcie, APPL_CTRL); in tegra_pcie_dw_host_init()
962 appl_writel(pcie, val, APPL_CTRL); in tegra_pcie_dw_host_init()
964 reset_control_assert(pcie->core_rst); in tegra_pcie_dw_host_init()
965 reset_control_deassert(pcie->core_rst); in tegra_pcie_dw_host_init()
975 return 0; in tegra_pcie_dw_host_init()
978 speed = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) & in tegra_pcie_dw_host_init()
982 speed = 0; in tegra_pcie_dw_host_init()
984 clk_set_rate(pcie->core_clk, pcie_gen_freq[speed]); in tegra_pcie_dw_host_init()
988 return 0; in tegra_pcie_dw_host_init()
993 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_dw_link_up() local
994 u32 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA); in tegra_pcie_dw_link_up()
1001 pp->num_vectors = MAX_MSI_IRQS; in tegra_pcie_set_msi_vec_num()
1006 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_dw_start_link() local
1008 enable_irq(pcie->pex_rst_irq); in tegra_pcie_dw_start_link()
1010 return 0; in tegra_pcie_dw_start_link()
1015 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_dw_stop_link() local
1017 disable_irq(pcie->pex_rst_irq); in tegra_pcie_dw_stop_link()
1031 static void tegra_pcie_disable_phy(struct tegra_pcie_dw *pcie) in tegra_pcie_disable_phy() argument
1033 unsigned int phy_count = pcie->phy_count; in tegra_pcie_disable_phy()
1035 while (phy_count--) { in tegra_pcie_disable_phy()
1036 phy_power_off(pcie->phys[phy_count]); in tegra_pcie_disable_phy()
1037 phy_exit(pcie->phys[phy_count]); in tegra_pcie_disable_phy()
1041 static int tegra_pcie_enable_phy(struct tegra_pcie_dw *pcie) in tegra_pcie_enable_phy() argument
1046 for (i = 0; i < pcie->phy_count; i++) { in tegra_pcie_enable_phy()
1047 ret = phy_init(pcie->phys[i]); in tegra_pcie_enable_phy()
1048 if (ret < 0) in tegra_pcie_enable_phy()
1051 ret = phy_power_on(pcie->phys[i]); in tegra_pcie_enable_phy()
1052 if (ret < 0) in tegra_pcie_enable_phy()
1056 return 0; in tegra_pcie_enable_phy()
1059 while (i--) { in tegra_pcie_enable_phy()
1060 phy_power_off(pcie->phys[i]); in tegra_pcie_enable_phy()
1062 phy_exit(pcie->phys[i]); in tegra_pcie_enable_phy()
1068 static int tegra_pcie_dw_parse_dt(struct tegra_pcie_dw *pcie) in tegra_pcie_dw_parse_dt() argument
1070 struct device_node *np = pcie->dev->of_node; in tegra_pcie_dw_parse_dt()
1073 ret = of_property_read_u32(np, "nvidia,aspm-cmrt-us", &pcie->aspm_cmrt); in tegra_pcie_dw_parse_dt()
1074 if (ret < 0) { in tegra_pcie_dw_parse_dt()
1075 dev_info(pcie->dev, "Failed to read ASPM T_cmrt: %d\n", ret); in tegra_pcie_dw_parse_dt()
1079 ret = of_property_read_u32(np, "nvidia,aspm-pwr-on-t-us", in tegra_pcie_dw_parse_dt()
1080 &pcie->aspm_pwr_on_t); in tegra_pcie_dw_parse_dt()
1081 if (ret < 0) in tegra_pcie_dw_parse_dt()
1082 dev_info(pcie->dev, "Failed to read ASPM Power On time: %d\n", in tegra_pcie_dw_parse_dt()
1085 ret = of_property_read_u32(np, "nvidia,aspm-l0s-entrance-latency-us", in tegra_pcie_dw_parse_dt()
1086 &pcie->aspm_l0s_enter_lat); in tegra_pcie_dw_parse_dt()
1087 if (ret < 0) in tegra_pcie_dw_parse_dt()
1088 dev_info(pcie->dev, in tegra_pcie_dw_parse_dt()
1091 ret = of_property_read_u32(np, "num-lanes", &pcie->num_lanes); in tegra_pcie_dw_parse_dt()
1092 if (ret < 0) { in tegra_pcie_dw_parse_dt()
1093 dev_err(pcie->dev, "Failed to read num-lanes: %d\n", ret); in tegra_pcie_dw_parse_dt()
1097 ret = of_property_read_u32_index(np, "nvidia,bpmp", 1, &pcie->cid); in tegra_pcie_dw_parse_dt()
1099 dev_err(pcie->dev, "Failed to read Controller-ID: %d\n", ret); in tegra_pcie_dw_parse_dt()
1103 ret = of_property_count_strings(np, "phy-names"); in tegra_pcie_dw_parse_dt()
1104 if (ret < 0) { in tegra_pcie_dw_parse_dt()
1105 dev_err(pcie->dev, "Failed to find PHY entries: %d\n", in tegra_pcie_dw_parse_dt()
1109 pcie->phy_count = ret; in tegra_pcie_dw_parse_dt()
1111 if (of_property_read_bool(np, "nvidia,update-fc-fixup")) in tegra_pcie_dw_parse_dt()
1112 pcie->update_fc_fixup = true; in tegra_pcie_dw_parse_dt()
1114 pcie->supports_clkreq = in tegra_pcie_dw_parse_dt()
1115 of_property_read_bool(pcie->dev->of_node, "supports-clkreq"); in tegra_pcie_dw_parse_dt()
1117 pcie->enable_cdm_check = in tegra_pcie_dw_parse_dt()
1118 of_property_read_bool(np, "snps,enable-cdm-check"); in tegra_pcie_dw_parse_dt()
1120 if (pcie->mode == DW_PCIE_RC_TYPE) in tegra_pcie_dw_parse_dt()
1121 return 0; in tegra_pcie_dw_parse_dt()
1124 pcie->pex_rst_gpiod = devm_gpiod_get(pcie->dev, "reset", GPIOD_IN); in tegra_pcie_dw_parse_dt()
1125 if (IS_ERR(pcie->pex_rst_gpiod)) { in tegra_pcie_dw_parse_dt()
1126 int err = PTR_ERR(pcie->pex_rst_gpiod); in tegra_pcie_dw_parse_dt()
1129 if (err == -EPROBE_DEFER) in tegra_pcie_dw_parse_dt()
1132 dev_printk(level, pcie->dev, in tegra_pcie_dw_parse_dt()
1138 pcie->pex_refclk_sel_gpiod = devm_gpiod_get(pcie->dev, in tegra_pcie_dw_parse_dt()
1139 "nvidia,refclk-select", in tegra_pcie_dw_parse_dt()
1141 if (IS_ERR(pcie->pex_refclk_sel_gpiod)) { in tegra_pcie_dw_parse_dt()
1142 int err = PTR_ERR(pcie->pex_refclk_sel_gpiod); in tegra_pcie_dw_parse_dt()
1145 if (err == -EPROBE_DEFER) in tegra_pcie_dw_parse_dt()
1148 dev_printk(level, pcie->dev, in tegra_pcie_dw_parse_dt()
1151 pcie->pex_refclk_sel_gpiod = NULL; in tegra_pcie_dw_parse_dt()
1154 return 0; in tegra_pcie_dw_parse_dt()
1157 static int tegra_pcie_bpmp_set_ctrl_state(struct tegra_pcie_dw *pcie, in tegra_pcie_bpmp_set_ctrl_state() argument
1164 /* Controller-5 doesn't need to have its state set by BPMP-FW */ in tegra_pcie_bpmp_set_ctrl_state()
1165 if (pcie->cid == 5) in tegra_pcie_bpmp_set_ctrl_state()
1166 return 0; in tegra_pcie_bpmp_set_ctrl_state()
1168 memset(&req, 0, sizeof(req)); in tegra_pcie_bpmp_set_ctrl_state()
1169 memset(&resp, 0, sizeof(resp)); in tegra_pcie_bpmp_set_ctrl_state()
1172 req.controller_state.pcie_controller = pcie->cid; in tegra_pcie_bpmp_set_ctrl_state()
1175 memset(&msg, 0, sizeof(msg)); in tegra_pcie_bpmp_set_ctrl_state()
1182 return tegra_bpmp_transfer(pcie->bpmp, &msg); in tegra_pcie_bpmp_set_ctrl_state()
1185 static int tegra_pcie_bpmp_set_pll_state(struct tegra_pcie_dw *pcie, in tegra_pcie_bpmp_set_pll_state() argument
1192 memset(&req, 0, sizeof(req)); in tegra_pcie_bpmp_set_pll_state()
1193 memset(&resp, 0, sizeof(resp)); in tegra_pcie_bpmp_set_pll_state()
1197 req.ep_ctrlr_pll_init.ep_controller = pcie->cid; in tegra_pcie_bpmp_set_pll_state()
1200 req.ep_ctrlr_pll_off.ep_controller = pcie->cid; in tegra_pcie_bpmp_set_pll_state()
1203 memset(&msg, 0, sizeof(msg)); in tegra_pcie_bpmp_set_pll_state()
1210 return tegra_bpmp_transfer(pcie->bpmp, &msg); in tegra_pcie_bpmp_set_pll_state()
1213 static void tegra_pcie_downstream_dev_to_D0(struct tegra_pcie_dw *pcie) in tegra_pcie_downstream_dev_to_D0() argument
1215 struct pcie_port *pp = &pcie->pci.pp; in tegra_pcie_downstream_dev_to_D0()
1224 * This is as per PCI Express Base r4.0 v1.0 September 27-2017, in tegra_pcie_downstream_dev_to_D0()
1228 list_for_each_entry(child, &pp->bridge->bus->children, node) { in tegra_pcie_downstream_dev_to_D0()
1230 if (child->parent == pp->bridge->bus) { in tegra_pcie_downstream_dev_to_D0()
1237 dev_err(pcie->dev, "Failed to find downstream devices\n"); in tegra_pcie_downstream_dev_to_D0()
1241 list_for_each_entry(pdev, &root_bus->devices, bus_list) { in tegra_pcie_downstream_dev_to_D0()
1242 if (PCI_SLOT(pdev->devfn) == 0) { in tegra_pcie_downstream_dev_to_D0()
1244 dev_err(pcie->dev, in tegra_pcie_downstream_dev_to_D0()
1246 dev_name(&pdev->dev)); in tegra_pcie_downstream_dev_to_D0()
1251 static int tegra_pcie_get_slot_regulators(struct tegra_pcie_dw *pcie) in tegra_pcie_get_slot_regulators() argument
1253 pcie->slot_ctl_3v3 = devm_regulator_get_optional(pcie->dev, "vpcie3v3"); in tegra_pcie_get_slot_regulators()
1254 if (IS_ERR(pcie->slot_ctl_3v3)) { in tegra_pcie_get_slot_regulators()
1255 if (PTR_ERR(pcie->slot_ctl_3v3) != -ENODEV) in tegra_pcie_get_slot_regulators()
1256 return PTR_ERR(pcie->slot_ctl_3v3); in tegra_pcie_get_slot_regulators()
1258 pcie->slot_ctl_3v3 = NULL; in tegra_pcie_get_slot_regulators()
1261 pcie->slot_ctl_12v = devm_regulator_get_optional(pcie->dev, "vpcie12v"); in tegra_pcie_get_slot_regulators()
1262 if (IS_ERR(pcie->slot_ctl_12v)) { in tegra_pcie_get_slot_regulators()
1263 if (PTR_ERR(pcie->slot_ctl_12v) != -ENODEV) in tegra_pcie_get_slot_regulators()
1264 return PTR_ERR(pcie->slot_ctl_12v); in tegra_pcie_get_slot_regulators()
1266 pcie->slot_ctl_12v = NULL; in tegra_pcie_get_slot_regulators()
1269 return 0; in tegra_pcie_get_slot_regulators()
1272 static int tegra_pcie_enable_slot_regulators(struct tegra_pcie_dw *pcie) in tegra_pcie_enable_slot_regulators() argument
1276 if (pcie->slot_ctl_3v3) { in tegra_pcie_enable_slot_regulators()
1277 ret = regulator_enable(pcie->slot_ctl_3v3); in tegra_pcie_enable_slot_regulators()
1278 if (ret < 0) { in tegra_pcie_enable_slot_regulators()
1279 dev_err(pcie->dev, in tegra_pcie_enable_slot_regulators()
1285 if (pcie->slot_ctl_12v) { in tegra_pcie_enable_slot_regulators()
1286 ret = regulator_enable(pcie->slot_ctl_12v); in tegra_pcie_enable_slot_regulators()
1287 if (ret < 0) { in tegra_pcie_enable_slot_regulators()
1288 dev_err(pcie->dev, in tegra_pcie_enable_slot_regulators()
1296 * Revision 1.1, Table-2.4, T_PVPERL (Power stable to PERST# inactive) in tegra_pcie_enable_slot_regulators()
1299 if (pcie->slot_ctl_3v3 || pcie->slot_ctl_12v) in tegra_pcie_enable_slot_regulators()
1302 return 0; in tegra_pcie_enable_slot_regulators()
1305 if (pcie->slot_ctl_3v3) in tegra_pcie_enable_slot_regulators()
1306 regulator_disable(pcie->slot_ctl_3v3); in tegra_pcie_enable_slot_regulators()
1310 static void tegra_pcie_disable_slot_regulators(struct tegra_pcie_dw *pcie) in tegra_pcie_disable_slot_regulators() argument
1312 if (pcie->slot_ctl_12v) in tegra_pcie_disable_slot_regulators()
1313 regulator_disable(pcie->slot_ctl_12v); in tegra_pcie_disable_slot_regulators()
1314 if (pcie->slot_ctl_3v3) in tegra_pcie_disable_slot_regulators()
1315 regulator_disable(pcie->slot_ctl_3v3); in tegra_pcie_disable_slot_regulators()
1318 static int tegra_pcie_config_controller(struct tegra_pcie_dw *pcie, in tegra_pcie_config_controller() argument
1324 ret = tegra_pcie_bpmp_set_ctrl_state(pcie, true); in tegra_pcie_config_controller()
1326 dev_err(pcie->dev, in tegra_pcie_config_controller()
1327 "Failed to enable controller %u: %d\n", pcie->cid, ret); in tegra_pcie_config_controller()
1331 ret = tegra_pcie_enable_slot_regulators(pcie); in tegra_pcie_config_controller()
1332 if (ret < 0) in tegra_pcie_config_controller()
1335 ret = regulator_enable(pcie->pex_ctl_supply); in tegra_pcie_config_controller()
1336 if (ret < 0) { in tegra_pcie_config_controller()
1337 dev_err(pcie->dev, "Failed to enable regulator: %d\n", ret); in tegra_pcie_config_controller()
1341 ret = clk_prepare_enable(pcie->core_clk); in tegra_pcie_config_controller()
1343 dev_err(pcie->dev, "Failed to enable core clock: %d\n", ret); in tegra_pcie_config_controller()
1347 ret = reset_control_deassert(pcie->core_apb_rst); in tegra_pcie_config_controller()
1349 dev_err(pcie->dev, "Failed to deassert core APB reset: %d\n", in tegra_pcie_config_controller()
1356 val = appl_readl(pcie, APPL_CTRL); in tegra_pcie_config_controller()
1360 appl_writel(pcie, val, APPL_CTRL); in tegra_pcie_config_controller()
1363 ret = tegra_pcie_enable_phy(pcie); in tegra_pcie_config_controller()
1365 dev_err(pcie->dev, "Failed to enable PHY: %d\n", ret); in tegra_pcie_config_controller()
1370 appl_writel(pcie, pcie->dbi_res->start & APPL_CFG_BASE_ADDR_MASK, in tegra_pcie_config_controller()
1374 appl_writel(pcie, APPL_DM_TYPE_RP, APPL_DM_TYPE); in tegra_pcie_config_controller()
1376 appl_writel(pcie, 0x0, APPL_CFG_SLCG_OVERRIDE); in tegra_pcie_config_controller()
1378 val = appl_readl(pcie, APPL_CTRL); in tegra_pcie_config_controller()
1379 appl_writel(pcie, val | APPL_CTRL_SYS_PRE_DET_STATE, APPL_CTRL); in tegra_pcie_config_controller()
1381 val = appl_readl(pcie, APPL_CFG_MISC); in tegra_pcie_config_controller()
1383 appl_writel(pcie, val, APPL_CFG_MISC); in tegra_pcie_config_controller()
1385 if (!pcie->supports_clkreq) { in tegra_pcie_config_controller()
1386 val = appl_readl(pcie, APPL_PINMUX); in tegra_pcie_config_controller()
1389 appl_writel(pcie, val, APPL_PINMUX); in tegra_pcie_config_controller()
1393 appl_writel(pcie, in tegra_pcie_config_controller()
1394 pcie->atu_dma_res->start & APPL_CFG_IATU_DMA_BASE_ADDR_MASK, in tegra_pcie_config_controller()
1397 reset_control_deassert(pcie->core_rst); in tegra_pcie_config_controller()
1399 pcie->pcie_cap_base = dw_pcie_find_capability(&pcie->pci, in tegra_pcie_config_controller()
1402 /* Disable ASPM-L1SS advertisement as there is no CLKREQ routing */ in tegra_pcie_config_controller()
1403 if (!pcie->supports_clkreq) { in tegra_pcie_config_controller()
1404 disable_aspm_l11(pcie); in tegra_pcie_config_controller()
1405 disable_aspm_l12(pcie); in tegra_pcie_config_controller()
1411 reset_control_assert(pcie->core_apb_rst); in tegra_pcie_config_controller()
1413 clk_disable_unprepare(pcie->core_clk); in tegra_pcie_config_controller()
1415 regulator_disable(pcie->pex_ctl_supply); in tegra_pcie_config_controller()
1417 tegra_pcie_disable_slot_regulators(pcie); in tegra_pcie_config_controller()
1419 tegra_pcie_bpmp_set_ctrl_state(pcie, false); in tegra_pcie_config_controller()
1424 static int __deinit_controller(struct tegra_pcie_dw *pcie) in __deinit_controller() argument
1428 ret = reset_control_assert(pcie->core_rst); in __deinit_controller()
1430 dev_err(pcie->dev, "Failed to assert \"core\" reset: %d\n", in __deinit_controller()
1435 tegra_pcie_disable_phy(pcie); in __deinit_controller()
1437 ret = reset_control_assert(pcie->core_apb_rst); in __deinit_controller()
1439 dev_err(pcie->dev, "Failed to assert APB reset: %d\n", ret); in __deinit_controller()
1443 clk_disable_unprepare(pcie->core_clk); in __deinit_controller()
1445 ret = regulator_disable(pcie->pex_ctl_supply); in __deinit_controller()
1447 dev_err(pcie->dev, "Failed to disable regulator: %d\n", ret); in __deinit_controller()
1451 tegra_pcie_disable_slot_regulators(pcie); in __deinit_controller()
1453 ret = tegra_pcie_bpmp_set_ctrl_state(pcie, false); in __deinit_controller()
1455 dev_err(pcie->dev, "Failed to disable controller %d: %d\n", in __deinit_controller()
1456 pcie->cid, ret); in __deinit_controller()
1463 static int tegra_pcie_init_controller(struct tegra_pcie_dw *pcie) in tegra_pcie_init_controller() argument
1465 struct dw_pcie *pci = &pcie->pci; in tegra_pcie_init_controller()
1466 struct pcie_port *pp = &pci->pp; in tegra_pcie_init_controller()
1469 ret = tegra_pcie_config_controller(pcie, false); in tegra_pcie_init_controller()
1470 if (ret < 0) in tegra_pcie_init_controller()
1473 pp->ops = &tegra_pcie_dw_host_ops; in tegra_pcie_init_controller()
1476 if (ret < 0) { in tegra_pcie_init_controller()
1477 dev_err(pcie->dev, "Failed to add PCIe port: %d\n", ret); in tegra_pcie_init_controller()
1481 return 0; in tegra_pcie_init_controller()
1484 return __deinit_controller(pcie); in tegra_pcie_init_controller()
1487 static int tegra_pcie_try_link_l2(struct tegra_pcie_dw *pcie) in tegra_pcie_try_link_l2() argument
1491 if (!tegra_pcie_dw_link_up(&pcie->pci)) in tegra_pcie_try_link_l2()
1492 return 0; in tegra_pcie_try_link_l2()
1494 val = appl_readl(pcie, APPL_RADM_STATUS); in tegra_pcie_try_link_l2()
1496 appl_writel(pcie, val, APPL_RADM_STATUS); in tegra_pcie_try_link_l2()
1498 return readl_poll_timeout_atomic(pcie->appl_base + APPL_DEBUG, val, in tegra_pcie_try_link_l2()
1503 static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie) in tegra_pcie_dw_pme_turnoff() argument
1508 if (!tegra_pcie_dw_link_up(&pcie->pci)) { in tegra_pcie_dw_pme_turnoff()
1509 dev_dbg(pcie->dev, "PCIe link is not up...!\n"); in tegra_pcie_dw_pme_turnoff()
1513 if (tegra_pcie_try_link_l2(pcie)) { in tegra_pcie_dw_pme_turnoff()
1514 dev_info(pcie->dev, "Link didn't transition to L2 state\n"); in tegra_pcie_dw_pme_turnoff()
1521 data = appl_readl(pcie, APPL_PINMUX); in tegra_pcie_dw_pme_turnoff()
1523 appl_writel(pcie, data, APPL_PINMUX); in tegra_pcie_dw_pme_turnoff()
1525 err = readl_poll_timeout_atomic(pcie->appl_base + APPL_DEBUG, in tegra_pcie_dw_pme_turnoff()
1533 dev_info(pcie->dev, "Link didn't go to detect state\n"); in tegra_pcie_dw_pme_turnoff()
1536 data = appl_readl(pcie, APPL_CTRL); in tegra_pcie_dw_pme_turnoff()
1538 appl_writel(pcie, data, APPL_CTRL); in tegra_pcie_dw_pme_turnoff()
1542 * DBI registers may not be accessible after this as PLL-E would be in tegra_pcie_dw_pme_turnoff()
1545 data = appl_readl(pcie, APPL_PINMUX); in tegra_pcie_dw_pme_turnoff()
1550 appl_writel(pcie, data, APPL_PINMUX); in tegra_pcie_dw_pme_turnoff()
1553 static int tegra_pcie_deinit_controller(struct tegra_pcie_dw *pcie) in tegra_pcie_deinit_controller() argument
1555 tegra_pcie_downstream_dev_to_D0(pcie); in tegra_pcie_deinit_controller()
1556 dw_pcie_host_deinit(&pcie->pci.pp); in tegra_pcie_deinit_controller()
1557 tegra_pcie_dw_pme_turnoff(pcie); in tegra_pcie_deinit_controller()
1559 return __deinit_controller(pcie); in tegra_pcie_deinit_controller()
1562 static int tegra_pcie_config_rp(struct tegra_pcie_dw *pcie) in tegra_pcie_config_rp() argument
1564 struct pcie_port *pp = &pcie->pci.pp; in tegra_pcie_config_rp()
1565 struct device *dev = pcie->dev; in tegra_pcie_config_rp()
1570 pp->msi_irq = of_irq_get_byname(dev->of_node, "msi"); in tegra_pcie_config_rp()
1571 if (!pp->msi_irq) { in tegra_pcie_config_rp()
1573 return -ENODEV; in tegra_pcie_config_rp()
1580 if (ret < 0) { in tegra_pcie_config_rp()
1581 dev_err(dev, "Failed to get runtime sync for PCIe dev: %d\n", in tegra_pcie_config_rp()
1587 if (ret < 0) { in tegra_pcie_config_rp()
1592 tegra_pcie_init_controller(pcie); in tegra_pcie_config_rp()
1594 pcie->link_state = tegra_pcie_dw_link_up(&pcie->pci); in tegra_pcie_config_rp()
1595 if (!pcie->link_state) { in tegra_pcie_config_rp()
1596 ret = -ENOMEDIUM; in tegra_pcie_config_rp()
1600 name = devm_kasprintf(dev, GFP_KERNEL, "%pOFP", dev->of_node); in tegra_pcie_config_rp()
1602 ret = -ENOMEM; in tegra_pcie_config_rp()
1606 pcie->debugfs = debugfs_create_dir(name, NULL); in tegra_pcie_config_rp()
1607 init_debugfs(pcie); in tegra_pcie_config_rp()
1612 tegra_pcie_deinit_controller(pcie); in tegra_pcie_config_rp()
1619 static void pex_ep_event_pex_rst_assert(struct tegra_pcie_dw *pcie) in pex_ep_event_pex_rst_assert() argument
1624 if (pcie->ep_state == EP_STATE_DISABLED) in pex_ep_event_pex_rst_assert()
1628 val = appl_readl(pcie, APPL_CTRL); in pex_ep_event_pex_rst_assert()
1630 appl_writel(pcie, val, APPL_CTRL); in pex_ep_event_pex_rst_assert()
1632 ret = readl_poll_timeout(pcie->appl_base + APPL_DEBUG, val, in pex_ep_event_pex_rst_assert()
1638 dev_err(pcie->dev, "Failed to go Detect state: %d\n", ret); in pex_ep_event_pex_rst_assert()
1640 reset_control_assert(pcie->core_rst); in pex_ep_event_pex_rst_assert()
1642 tegra_pcie_disable_phy(pcie); in pex_ep_event_pex_rst_assert()
1644 reset_control_assert(pcie->core_apb_rst); in pex_ep_event_pex_rst_assert()
1646 clk_disable_unprepare(pcie->core_clk); in pex_ep_event_pex_rst_assert()
1648 pm_runtime_put_sync(pcie->dev); in pex_ep_event_pex_rst_assert()
1650 ret = tegra_pcie_bpmp_set_pll_state(pcie, false); in pex_ep_event_pex_rst_assert()
1652 dev_err(pcie->dev, "Failed to turn off UPHY: %d\n", ret); in pex_ep_event_pex_rst_assert()
1654 pcie->ep_state = EP_STATE_DISABLED; in pex_ep_event_pex_rst_assert()
1655 dev_dbg(pcie->dev, "Uninitialization of endpoint is completed\n"); in pex_ep_event_pex_rst_assert()
1658 static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie) in pex_ep_event_pex_rst_deassert() argument
1660 struct dw_pcie *pci = &pcie->pci; in pex_ep_event_pex_rst_deassert()
1661 struct dw_pcie_ep *ep = &pci->ep; in pex_ep_event_pex_rst_deassert()
1662 struct device *dev = pcie->dev; in pex_ep_event_pex_rst_deassert()
1666 if (pcie->ep_state == EP_STATE_ENABLED) in pex_ep_event_pex_rst_deassert()
1670 if (ret < 0) { in pex_ep_event_pex_rst_deassert()
1671 dev_err(dev, "Failed to get runtime sync for PCIe dev: %d\n", in pex_ep_event_pex_rst_deassert()
1676 ret = tegra_pcie_bpmp_set_pll_state(pcie, true); in pex_ep_event_pex_rst_deassert()
1678 dev_err(dev, "Failed to init UPHY for PCIe EP: %d\n", ret); in pex_ep_event_pex_rst_deassert()
1682 ret = clk_prepare_enable(pcie->core_clk); in pex_ep_event_pex_rst_deassert()
1688 ret = reset_control_deassert(pcie->core_apb_rst); in pex_ep_event_pex_rst_deassert()
1694 ret = tegra_pcie_enable_phy(pcie); in pex_ep_event_pex_rst_deassert()
1701 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L0); in pex_ep_event_pex_rst_deassert()
1702 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0); in pex_ep_event_pex_rst_deassert()
1703 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_1); in pex_ep_event_pex_rst_deassert()
1704 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_2); in pex_ep_event_pex_rst_deassert()
1705 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_3); in pex_ep_event_pex_rst_deassert()
1706 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_6); in pex_ep_event_pex_rst_deassert()
1707 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_7); in pex_ep_event_pex_rst_deassert()
1708 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_8_0); in pex_ep_event_pex_rst_deassert()
1709 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_9); in pex_ep_event_pex_rst_deassert()
1710 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_10); in pex_ep_event_pex_rst_deassert()
1711 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_11); in pex_ep_event_pex_rst_deassert()
1712 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_13); in pex_ep_event_pex_rst_deassert()
1713 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_14); in pex_ep_event_pex_rst_deassert()
1714 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_15); in pex_ep_event_pex_rst_deassert()
1715 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_17); in pex_ep_event_pex_rst_deassert()
1718 val = appl_readl(pcie, APPL_DM_TYPE); in pex_ep_event_pex_rst_deassert()
1721 appl_writel(pcie, val, APPL_DM_TYPE); in pex_ep_event_pex_rst_deassert()
1723 appl_writel(pcie, 0x0, APPL_CFG_SLCG_OVERRIDE); in pex_ep_event_pex_rst_deassert()
1725 val = appl_readl(pcie, APPL_CTRL); in pex_ep_event_pex_rst_deassert()
1728 appl_writel(pcie, val, APPL_CTRL); in pex_ep_event_pex_rst_deassert()
1730 val = appl_readl(pcie, APPL_CFG_MISC); in pex_ep_event_pex_rst_deassert()
1733 appl_writel(pcie, val, APPL_CFG_MISC); in pex_ep_event_pex_rst_deassert()
1735 val = appl_readl(pcie, APPL_PINMUX); in pex_ep_event_pex_rst_deassert()
1738 appl_writel(pcie, val, APPL_PINMUX); in pex_ep_event_pex_rst_deassert()
1740 appl_writel(pcie, pcie->dbi_res->start & APPL_CFG_BASE_ADDR_MASK, in pex_ep_event_pex_rst_deassert()
1743 appl_writel(pcie, pcie->atu_dma_res->start & in pex_ep_event_pex_rst_deassert()
1747 val = appl_readl(pcie, APPL_INTR_EN_L0_0); in pex_ep_event_pex_rst_deassert()
1751 appl_writel(pcie, val, APPL_INTR_EN_L0_0); in pex_ep_event_pex_rst_deassert()
1753 val = appl_readl(pcie, APPL_INTR_EN_L1_0_0); in pex_ep_event_pex_rst_deassert()
1756 appl_writel(pcie, val, APPL_INTR_EN_L1_0_0); in pex_ep_event_pex_rst_deassert()
1758 reset_control_deassert(pcie->core_rst); in pex_ep_event_pex_rst_deassert()
1760 if (pcie->update_fc_fixup) { in pex_ep_event_pex_rst_deassert()
1762 val |= 0x1 << CFG_TIMER_CTRL_ACK_NAK_SHIFT; in pex_ep_event_pex_rst_deassert()
1766 config_gen3_gen4_eq_presets(pcie); in pex_ep_event_pex_rst_deassert()
1768 init_host_aspm(pcie); in pex_ep_event_pex_rst_deassert()
1770 /* Disable ASPM-L1SS advertisement if there is no CLKREQ routing */ in pex_ep_event_pex_rst_deassert()
1771 if (!pcie->supports_clkreq) { in pex_ep_event_pex_rst_deassert()
1772 disable_aspm_l11(pcie); in pex_ep_event_pex_rst_deassert()
1773 disable_aspm_l12(pcie); in pex_ep_event_pex_rst_deassert()
1780 pcie->pcie_cap_base = dw_pcie_find_capability(&pcie->pci, in pex_ep_event_pex_rst_deassert()
1782 clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ); in pex_ep_event_pex_rst_deassert()
1784 val = (ep->msi_mem_phys & MSIX_ADDR_MATCH_LOW_OFF_MASK); in pex_ep_event_pex_rst_deassert()
1787 val = (upper_32_bits(ep->msi_mem_phys) & MSIX_ADDR_MATCH_HIGH_OFF_MASK); in pex_ep_event_pex_rst_deassert()
1799 val = appl_readl(pcie, APPL_CTRL); in pex_ep_event_pex_rst_deassert()
1801 appl_writel(pcie, val, APPL_CTRL); in pex_ep_event_pex_rst_deassert()
1803 pcie->ep_state = EP_STATE_ENABLED; in pex_ep_event_pex_rst_deassert()
1809 reset_control_assert(pcie->core_rst); in pex_ep_event_pex_rst_deassert()
1810 tegra_pcie_disable_phy(pcie); in pex_ep_event_pex_rst_deassert()
1812 reset_control_assert(pcie->core_apb_rst); in pex_ep_event_pex_rst_deassert()
1814 clk_disable_unprepare(pcie->core_clk); in pex_ep_event_pex_rst_deassert()
1816 tegra_pcie_bpmp_set_pll_state(pcie, false); in pex_ep_event_pex_rst_deassert()
1823 struct tegra_pcie_dw *pcie = arg; in tegra_pcie_ep_pex_rst_irq() local
1825 if (gpiod_get_value(pcie->pex_rst_gpiod)) in tegra_pcie_ep_pex_rst_irq()
1826 pex_ep_event_pex_rst_assert(pcie); in tegra_pcie_ep_pex_rst_irq()
1828 pex_ep_event_pex_rst_deassert(pcie); in tegra_pcie_ep_pex_rst_irq()
1833 static int tegra_pcie_ep_raise_legacy_irq(struct tegra_pcie_dw *pcie, u16 irq) in tegra_pcie_ep_raise_legacy_irq() argument
1837 return -EINVAL; in tegra_pcie_ep_raise_legacy_irq()
1839 appl_writel(pcie, 1, APPL_LEGACY_INTX); in tegra_pcie_ep_raise_legacy_irq()
1841 appl_writel(pcie, 0, APPL_LEGACY_INTX); in tegra_pcie_ep_raise_legacy_irq()
1842 return 0; in tegra_pcie_ep_raise_legacy_irq()
1845 static int tegra_pcie_ep_raise_msi_irq(struct tegra_pcie_dw *pcie, u16 irq) in tegra_pcie_ep_raise_msi_irq() argument
1848 return -EINVAL; in tegra_pcie_ep_raise_msi_irq()
1850 appl_writel(pcie, BIT(irq), APPL_MSI_CTRL_1); in tegra_pcie_ep_raise_msi_irq()
1852 return 0; in tegra_pcie_ep_raise_msi_irq()
1855 static int tegra_pcie_ep_raise_msix_irq(struct tegra_pcie_dw *pcie, u16 irq) in tegra_pcie_ep_raise_msix_irq() argument
1857 struct dw_pcie_ep *ep = &pcie->pci.ep; in tegra_pcie_ep_raise_msix_irq()
1859 writel(irq, ep->msi_mem); in tegra_pcie_ep_raise_msix_irq()
1861 return 0; in tegra_pcie_ep_raise_msix_irq()
1869 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_ep_raise_irq() local
1873 return tegra_pcie_ep_raise_legacy_irq(pcie, interrupt_num); in tegra_pcie_ep_raise_irq()
1876 return tegra_pcie_ep_raise_msi_irq(pcie, interrupt_num); in tegra_pcie_ep_raise_irq()
1879 return tegra_pcie_ep_raise_msix_irq(pcie, interrupt_num); in tegra_pcie_ep_raise_irq()
1882 dev_err(pci->dev, "Unknown IRQ type\n"); in tegra_pcie_ep_raise_irq()
1883 return -EPERM; in tegra_pcie_ep_raise_irq()
1886 return 0; in tegra_pcie_ep_raise_irq()
1896 .bar_fixed_size[0] = SZ_1M,
1910 static int tegra_pcie_config_ep(struct tegra_pcie_dw *pcie, in tegra_pcie_config_ep() argument
1913 struct dw_pcie *pci = &pcie->pci; in tegra_pcie_config_ep()
1914 struct device *dev = pcie->dev; in tegra_pcie_config_ep()
1920 ep = &pci->ep; in tegra_pcie_config_ep()
1921 ep->ops = &pcie_ep_ops; in tegra_pcie_config_ep()
1925 return -EINVAL; in tegra_pcie_config_ep()
1927 ep->phys_base = res->start; in tegra_pcie_config_ep()
1928 ep->addr_size = resource_size(res); in tegra_pcie_config_ep()
1929 ep->page_size = SZ_64K; in tegra_pcie_config_ep()
1931 ret = gpiod_set_debounce(pcie->pex_rst_gpiod, PERST_DEBOUNCE_TIME); in tegra_pcie_config_ep()
1932 if (ret < 0) { in tegra_pcie_config_ep()
1938 ret = gpiod_to_irq(pcie->pex_rst_gpiod); in tegra_pcie_config_ep()
1939 if (ret < 0) { in tegra_pcie_config_ep()
1943 pcie->pex_rst_irq = (unsigned int)ret; in tegra_pcie_config_ep()
1946 pcie->cid); in tegra_pcie_config_ep()
1949 return -ENOMEM; in tegra_pcie_config_ep()
1952 irq_set_status_flags(pcie->pex_rst_irq, IRQ_NOAUTOEN); in tegra_pcie_config_ep()
1954 pcie->ep_state = EP_STATE_DISABLED; in tegra_pcie_config_ep()
1956 ret = devm_request_threaded_irq(dev, pcie->pex_rst_irq, NULL, in tegra_pcie_config_ep()
1960 name, (void *)pcie); in tegra_pcie_config_ep()
1961 if (ret < 0) { in tegra_pcie_config_ep()
1967 pcie->cid); in tegra_pcie_config_ep()
1969 dev_err(dev, "Failed to create PCIe EP work thread string\n"); in tegra_pcie_config_ep()
1970 return -ENOMEM; in tegra_pcie_config_ep()
1983 return 0; in tegra_pcie_config_ep()
1989 struct device *dev = &pdev->dev; in tegra_pcie_dw_probe()
1991 struct tegra_pcie_dw *pcie; in tegra_pcie_dw_probe() local
2002 pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); in tegra_pcie_dw_probe()
2003 if (!pcie) in tegra_pcie_dw_probe()
2004 return -ENOMEM; in tegra_pcie_dw_probe()
2006 pci = &pcie->pci; in tegra_pcie_dw_probe()
2007 pci->dev = &pdev->dev; in tegra_pcie_dw_probe()
2008 pci->ops = &tegra_dw_pcie_ops; in tegra_pcie_dw_probe()
2009 pci->n_fts[0] = N_FTS_VAL; in tegra_pcie_dw_probe()
2010 pci->n_fts[1] = FTS_VAL; in tegra_pcie_dw_probe()
2012 pp = &pci->pp; in tegra_pcie_dw_probe()
2013 pcie->dev = &pdev->dev; in tegra_pcie_dw_probe()
2014 pcie->mode = (enum dw_pcie_device_mode)data->mode; in tegra_pcie_dw_probe()
2016 ret = tegra_pcie_dw_parse_dt(pcie); in tegra_pcie_dw_probe()
2017 if (ret < 0) { in tegra_pcie_dw_probe()
2020 if (ret == -EPROBE_DEFER) in tegra_pcie_dw_probe()
2029 ret = tegra_pcie_get_slot_regulators(pcie); in tegra_pcie_dw_probe()
2030 if (ret < 0) { in tegra_pcie_dw_probe()
2033 if (ret == -EPROBE_DEFER) in tegra_pcie_dw_probe()
2042 if (pcie->pex_refclk_sel_gpiod) in tegra_pcie_dw_probe()
2043 gpiod_set_value(pcie->pex_refclk_sel_gpiod, 1); in tegra_pcie_dw_probe()
2045 pcie->pex_ctl_supply = devm_regulator_get(dev, "vddio-pex-ctl"); in tegra_pcie_dw_probe()
2046 if (IS_ERR(pcie->pex_ctl_supply)) { in tegra_pcie_dw_probe()
2047 ret = PTR_ERR(pcie->pex_ctl_supply); in tegra_pcie_dw_probe()
2048 if (ret != -EPROBE_DEFER) in tegra_pcie_dw_probe()
2050 PTR_ERR(pcie->pex_ctl_supply)); in tegra_pcie_dw_probe()
2054 pcie->core_clk = devm_clk_get(dev, "core"); in tegra_pcie_dw_probe()
2055 if (IS_ERR(pcie->core_clk)) { in tegra_pcie_dw_probe()
2057 PTR_ERR(pcie->core_clk)); in tegra_pcie_dw_probe()
2058 return PTR_ERR(pcie->core_clk); in tegra_pcie_dw_probe()
2061 pcie->appl_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, in tegra_pcie_dw_probe()
2063 if (!pcie->appl_res) { in tegra_pcie_dw_probe()
2065 return -ENODEV; in tegra_pcie_dw_probe()
2068 pcie->appl_base = devm_ioremap_resource(dev, pcie->appl_res); in tegra_pcie_dw_probe()
2069 if (IS_ERR(pcie->appl_base)) in tegra_pcie_dw_probe()
2070 return PTR_ERR(pcie->appl_base); in tegra_pcie_dw_probe()
2072 pcie->core_apb_rst = devm_reset_control_get(dev, "apb"); in tegra_pcie_dw_probe()
2073 if (IS_ERR(pcie->core_apb_rst)) { in tegra_pcie_dw_probe()
2075 PTR_ERR(pcie->core_apb_rst)); in tegra_pcie_dw_probe()
2076 return PTR_ERR(pcie->core_apb_rst); in tegra_pcie_dw_probe()
2079 phys = devm_kcalloc(dev, pcie->phy_count, sizeof(*phys), GFP_KERNEL); in tegra_pcie_dw_probe()
2081 return -ENOMEM; in tegra_pcie_dw_probe()
2083 for (i = 0; i < pcie->phy_count; i++) { in tegra_pcie_dw_probe()
2084 name = kasprintf(GFP_KERNEL, "p2u-%u", i); in tegra_pcie_dw_probe()
2087 return -ENOMEM; in tegra_pcie_dw_probe()
2093 if (ret != -EPROBE_DEFER) in tegra_pcie_dw_probe()
2099 pcie->phys = phys; in tegra_pcie_dw_probe()
2104 return -ENODEV; in tegra_pcie_dw_probe()
2106 pcie->dbi_res = dbi_res; in tegra_pcie_dw_probe()
2108 pci->dbi_base = devm_ioremap_resource(dev, dbi_res); in tegra_pcie_dw_probe()
2109 if (IS_ERR(pci->dbi_base)) in tegra_pcie_dw_probe()
2110 return PTR_ERR(pci->dbi_base); in tegra_pcie_dw_probe()
2113 pci->dbi_base2 = pci->dbi_base + 0x1000; in tegra_pcie_dw_probe()
2119 return -ENODEV; in tegra_pcie_dw_probe()
2121 pcie->atu_dma_res = atu_dma_res; in tegra_pcie_dw_probe()
2123 pci->atu_base = devm_ioremap_resource(dev, atu_dma_res); in tegra_pcie_dw_probe()
2124 if (IS_ERR(pci->atu_base)) in tegra_pcie_dw_probe()
2125 return PTR_ERR(pci->atu_base); in tegra_pcie_dw_probe()
2127 pcie->core_rst = devm_reset_control_get(dev, "core"); in tegra_pcie_dw_probe()
2128 if (IS_ERR(pcie->core_rst)) { in tegra_pcie_dw_probe()
2130 PTR_ERR(pcie->core_rst)); in tegra_pcie_dw_probe()
2131 return PTR_ERR(pcie->core_rst); in tegra_pcie_dw_probe()
2134 pp->irq = platform_get_irq_byname(pdev, "intr"); in tegra_pcie_dw_probe()
2135 if (pp->irq < 0) in tegra_pcie_dw_probe()
2136 return pp->irq; in tegra_pcie_dw_probe()
2138 pcie->bpmp = tegra_bpmp_get(dev); in tegra_pcie_dw_probe()
2139 if (IS_ERR(pcie->bpmp)) in tegra_pcie_dw_probe()
2140 return PTR_ERR(pcie->bpmp); in tegra_pcie_dw_probe()
2142 platform_set_drvdata(pdev, pcie); in tegra_pcie_dw_probe()
2144 switch (pcie->mode) { in tegra_pcie_dw_probe()
2146 ret = devm_request_irq(dev, pp->irq, tegra_pcie_rp_irq_handler, in tegra_pcie_dw_probe()
2147 IRQF_SHARED, "tegra-pcie-intr", pcie); in tegra_pcie_dw_probe()
2149 dev_err(dev, "Failed to request IRQ %d: %d\n", pp->irq, in tegra_pcie_dw_probe()
2154 ret = tegra_pcie_config_rp(pcie); in tegra_pcie_dw_probe()
2155 if (ret && ret != -ENOMEDIUM) in tegra_pcie_dw_probe()
2158 return 0; in tegra_pcie_dw_probe()
2162 ret = devm_request_threaded_irq(dev, pp->irq, in tegra_pcie_dw_probe()
2166 "tegra-pcie-ep-intr", pcie); in tegra_pcie_dw_probe()
2168 dev_err(dev, "Failed to request IRQ %d: %d\n", pp->irq, in tegra_pcie_dw_probe()
2173 ret = tegra_pcie_config_ep(pcie, pdev); in tegra_pcie_dw_probe()
2174 if (ret < 0) in tegra_pcie_dw_probe()
2179 dev_err(dev, "Invalid PCIe device type %d\n", pcie->mode); in tegra_pcie_dw_probe()
2183 tegra_bpmp_put(pcie->bpmp); in tegra_pcie_dw_probe()
2189 struct tegra_pcie_dw *pcie = platform_get_drvdata(pdev); in tegra_pcie_dw_remove() local
2191 if (!pcie->link_state) in tegra_pcie_dw_remove()
2192 return 0; in tegra_pcie_dw_remove()
2194 debugfs_remove_recursive(pcie->debugfs); in tegra_pcie_dw_remove()
2195 tegra_pcie_deinit_controller(pcie); in tegra_pcie_dw_remove()
2196 pm_runtime_put_sync(pcie->dev); in tegra_pcie_dw_remove()
2197 pm_runtime_disable(pcie->dev); in tegra_pcie_dw_remove()
2198 tegra_bpmp_put(pcie->bpmp); in tegra_pcie_dw_remove()
2199 if (pcie->pex_refclk_sel_gpiod) in tegra_pcie_dw_remove()
2200 gpiod_set_value(pcie->pex_refclk_sel_gpiod, 0); in tegra_pcie_dw_remove()
2202 return 0; in tegra_pcie_dw_remove()
2207 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev); in tegra_pcie_dw_suspend_late() local
2210 if (!pcie->link_state) in tegra_pcie_dw_suspend_late()
2211 return 0; in tegra_pcie_dw_suspend_late()
2214 val = appl_readl(pcie, APPL_CTRL); in tegra_pcie_dw_suspend_late()
2218 appl_writel(pcie, val, APPL_CTRL); in tegra_pcie_dw_suspend_late()
2220 return 0; in tegra_pcie_dw_suspend_late()
2225 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev); in tegra_pcie_dw_suspend_noirq() local
2227 if (!pcie->link_state) in tegra_pcie_dw_suspend_noirq()
2228 return 0; in tegra_pcie_dw_suspend_noirq()
2231 pcie->msi_ctrl_int = dw_pcie_readl_dbi(&pcie->pci, in tegra_pcie_dw_suspend_noirq()
2233 tegra_pcie_downstream_dev_to_D0(pcie); in tegra_pcie_dw_suspend_noirq()
2234 tegra_pcie_dw_pme_turnoff(pcie); in tegra_pcie_dw_suspend_noirq()
2236 return __deinit_controller(pcie); in tegra_pcie_dw_suspend_noirq()
2241 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev); in tegra_pcie_dw_resume_noirq() local
2244 if (!pcie->link_state) in tegra_pcie_dw_resume_noirq()
2245 return 0; in tegra_pcie_dw_resume_noirq()
2247 ret = tegra_pcie_config_controller(pcie, true); in tegra_pcie_dw_resume_noirq()
2248 if (ret < 0) in tegra_pcie_dw_resume_noirq()
2251 ret = tegra_pcie_dw_host_init(&pcie->pci.pp); in tegra_pcie_dw_resume_noirq()
2252 if (ret < 0) { in tegra_pcie_dw_resume_noirq()
2258 dw_pcie_writel_dbi(&pcie->pci, PORT_LOGIC_MSI_CTRL_INT_0_EN, in tegra_pcie_dw_resume_noirq()
2259 pcie->msi_ctrl_int); in tegra_pcie_dw_resume_noirq()
2261 return 0; in tegra_pcie_dw_resume_noirq()
2264 return __deinit_controller(pcie); in tegra_pcie_dw_resume_noirq()
2269 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev); in tegra_pcie_dw_resume_early() local
2272 if (!pcie->link_state) in tegra_pcie_dw_resume_early()
2273 return 0; in tegra_pcie_dw_resume_early()
2276 val = appl_readl(pcie, APPL_CTRL); in tegra_pcie_dw_resume_early()
2282 appl_writel(pcie, val, APPL_CTRL); in tegra_pcie_dw_resume_early()
2284 return 0; in tegra_pcie_dw_resume_early()
2289 struct tegra_pcie_dw *pcie = platform_get_drvdata(pdev); in tegra_pcie_dw_shutdown() local
2291 if (!pcie->link_state) in tegra_pcie_dw_shutdown()
2294 debugfs_remove_recursive(pcie->debugfs); in tegra_pcie_dw_shutdown()
2295 tegra_pcie_downstream_dev_to_D0(pcie); in tegra_pcie_dw_shutdown()
2297 disable_irq(pcie->pci.pp.irq); in tegra_pcie_dw_shutdown()
2299 disable_irq(pcie->pci.pp.msi_irq); in tegra_pcie_dw_shutdown()
2301 tegra_pcie_dw_pme_turnoff(pcie); in tegra_pcie_dw_shutdown()
2302 __deinit_controller(pcie); in tegra_pcie_dw_shutdown()
2315 .compatible = "nvidia,tegra194-pcie",
2319 .compatible = "nvidia,tegra194-pcie-ep",
2337 .name = "tegra194-pcie",
2347 MODULE_DESCRIPTION("NVIDIA PCIe host controller driver");