Lines Matching full:pcie
3 * PCIe host controller driver for the following SoCs
35 #include "pcie-designware.h"
297 static inline void appl_writel(struct tegra_pcie_dw *pcie, const u32 value, in appl_writel() argument
300 writel_relaxed(value, pcie->appl_base + reg); in appl_writel()
303 static inline u32 appl_readl(struct tegra_pcie_dw *pcie, const u32 reg) in appl_readl() argument
305 return readl_relaxed(pcie->appl_base + reg); in appl_readl()
315 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in apply_bad_link_workaround() local
324 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA); in apply_bad_link_workaround()
328 if (pcie->init_link_width > current_link_width) { in apply_bad_link_workaround()
329 dev_warn(pci->dev, "PCIe link is bad, width reduced\n"); in apply_bad_link_workaround()
330 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + in apply_bad_link_workaround()
334 dw_pcie_writew_dbi(pci, pcie->pcie_cap_base + in apply_bad_link_workaround()
337 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + in apply_bad_link_workaround()
340 dw_pcie_writew_dbi(pci, pcie->pcie_cap_base + in apply_bad_link_workaround()
348 struct tegra_pcie_dw *pcie = arg; in tegra_pcie_rp_irq_handler() local
349 struct dw_pcie *pci = &pcie->pci; in tegra_pcie_rp_irq_handler()
354 status_l0 = appl_readl(pcie, APPL_INTR_STATUS_L0); in tegra_pcie_rp_irq_handler()
356 status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_0_0); in tegra_pcie_rp_irq_handler()
357 appl_writel(pcie, status_l1, APPL_INTR_STATUS_L1_0_0); in tegra_pcie_rp_irq_handler()
358 if (!pcie->of_data->has_sbr_reset_fix && in tegra_pcie_rp_irq_handler()
361 val = appl_readl(pcie, APPL_CAR_RESET_OVRD); in tegra_pcie_rp_irq_handler()
363 appl_writel(pcie, val, APPL_CAR_RESET_OVRD); in tegra_pcie_rp_irq_handler()
365 val = appl_readl(pcie, APPL_CAR_RESET_OVRD); in tegra_pcie_rp_irq_handler()
367 appl_writel(pcie, val, APPL_CAR_RESET_OVRD); in tegra_pcie_rp_irq_handler()
376 status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_8_0); in tegra_pcie_rp_irq_handler()
378 appl_writel(pcie, in tegra_pcie_rp_irq_handler()
384 val_w = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + in tegra_pcie_rp_irq_handler()
387 dw_pcie_writew_dbi(pci, pcie->pcie_cap_base + in tegra_pcie_rp_irq_handler()
390 appl_writel(pcie, in tegra_pcie_rp_irq_handler()
394 val_w = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + in tegra_pcie_rp_irq_handler()
402 status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_18); in tegra_pcie_rp_irq_handler()
424 static void pex_ep_event_hot_rst_done(struct tegra_pcie_dw *pcie) in pex_ep_event_hot_rst_done() argument
428 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L0); in pex_ep_event_hot_rst_done()
429 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0); in pex_ep_event_hot_rst_done()
430 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_1); in pex_ep_event_hot_rst_done()
431 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_2); in pex_ep_event_hot_rst_done()
432 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_3); in pex_ep_event_hot_rst_done()
433 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_6); in pex_ep_event_hot_rst_done()
434 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_7); in pex_ep_event_hot_rst_done()
435 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_8_0); in pex_ep_event_hot_rst_done()
436 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_9); in pex_ep_event_hot_rst_done()
437 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_10); in pex_ep_event_hot_rst_done()
438 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_11); in pex_ep_event_hot_rst_done()
439 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_13); in pex_ep_event_hot_rst_done()
440 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_14); in pex_ep_event_hot_rst_done()
441 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_15); in pex_ep_event_hot_rst_done()
442 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_17); in pex_ep_event_hot_rst_done()
443 appl_writel(pcie, 0xFFFFFFFF, APPL_MSI_CTRL_2); in pex_ep_event_hot_rst_done()
445 val = appl_readl(pcie, APPL_CTRL); in pex_ep_event_hot_rst_done()
447 appl_writel(pcie, val, APPL_CTRL); in pex_ep_event_hot_rst_done()
452 struct tegra_pcie_dw *pcie = arg; in tegra_pcie_ep_irq_thread() local
453 struct dw_pcie *pci = &pcie->pci; in tegra_pcie_ep_irq_thread()
456 speed = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) & in tegra_pcie_ep_irq_thread()
458 clk_set_rate(pcie->core_clk, pcie_gen_freq[speed - 1]); in tegra_pcie_ep_irq_thread()
460 if (pcie->of_data->has_ltr_req_fix) in tegra_pcie_ep_irq_thread()
464 val = dw_pcie_readl_dbi(pci, pcie->cfg_link_cap_l1sub); in tegra_pcie_ep_irq_thread()
476 appl_writel(pcie, val, APPL_LTR_MSG_1); in tegra_pcie_ep_irq_thread()
479 val = appl_readl(pcie, APPL_LTR_MSG_2); in tegra_pcie_ep_irq_thread()
481 appl_writel(pcie, val, APPL_LTR_MSG_2); in tegra_pcie_ep_irq_thread()
485 val = appl_readl(pcie, APPL_LTR_MSG_2); in tegra_pcie_ep_irq_thread()
493 dev_err(pcie->dev, "Failed to send LTR message\n"); in tegra_pcie_ep_irq_thread()
501 struct tegra_pcie_dw *pcie = arg; in tegra_pcie_ep_hard_irq() local
502 struct dw_pcie_ep *ep = &pcie->pci.ep; in tegra_pcie_ep_hard_irq()
506 status_l0 = appl_readl(pcie, APPL_INTR_STATUS_L0); in tegra_pcie_ep_hard_irq()
508 status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_0_0); in tegra_pcie_ep_hard_irq()
509 appl_writel(pcie, status_l1, APPL_INTR_STATUS_L1_0_0); in tegra_pcie_ep_hard_irq()
512 pex_ep_event_hot_rst_done(pcie); in tegra_pcie_ep_hard_irq()
515 link_status = appl_readl(pcie, APPL_LINK_STATUS); in tegra_pcie_ep_hard_irq()
517 dev_dbg(pcie->dev, "Link is up with Host\n"); in tegra_pcie_ep_hard_irq()
526 status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_15); in tegra_pcie_ep_hard_irq()
527 appl_writel(pcie, status_l1, APPL_INTR_STATUS_L1_15); in tegra_pcie_ep_hard_irq()
536 dev_warn(pcie->dev, "Random interrupt (STATUS = 0x%08X)\n", in tegra_pcie_ep_hard_irq()
538 appl_writel(pcie, status_l0, APPL_INTR_STATUS_L0); in tegra_pcie_ep_hard_irq()
549 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_dw_rd_own_conf() local
557 if (!pcie->of_data->has_msix_doorbell_access_fix && in tegra_pcie_dw_rd_own_conf()
571 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_dw_wr_own_conf() local
579 if (!pcie->of_data->has_msix_doorbell_access_fix && in tegra_pcie_dw_wr_own_conf()
593 static void disable_aspm_l11(struct tegra_pcie_dw *pcie) in disable_aspm_l11() argument
597 val = dw_pcie_readl_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub); in disable_aspm_l11()
599 dw_pcie_writel_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub, val); in disable_aspm_l11()
602 static void disable_aspm_l12(struct tegra_pcie_dw *pcie) in disable_aspm_l12() argument
606 val = dw_pcie_readl_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub); in disable_aspm_l12()
608 dw_pcie_writel_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub, val); in disable_aspm_l12()
611 static inline u32 event_counter_prog(struct tegra_pcie_dw *pcie, u32 event) in event_counter_prog() argument
615 val = dw_pcie_readl_dbi(&pcie->pci, pcie->ras_des_cap + in event_counter_prog()
621 dw_pcie_writel_dbi(&pcie->pci, pcie->ras_des_cap + in event_counter_prog()
623 val = dw_pcie_readl_dbi(&pcie->pci, pcie->ras_des_cap + in event_counter_prog()
631 struct tegra_pcie_dw *pcie = (struct tegra_pcie_dw *) in aspm_state_cnt() local
636 event_counter_prog(pcie, EVENT_COUNTER_EVENT_Tx_L0S)); in aspm_state_cnt()
639 event_counter_prog(pcie, EVENT_COUNTER_EVENT_Rx_L0S)); in aspm_state_cnt()
642 event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1)); in aspm_state_cnt()
645 event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1_1)); in aspm_state_cnt()
648 event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1_2)); in aspm_state_cnt()
651 dw_pcie_writel_dbi(&pcie->pci, pcie->ras_des_cap + in aspm_state_cnt()
658 dw_pcie_writel_dbi(&pcie->pci, pcie->ras_des_cap + in aspm_state_cnt()
664 static void init_host_aspm(struct tegra_pcie_dw *pcie) in init_host_aspm() argument
666 struct dw_pcie *pci = &pcie->pci; in init_host_aspm()
670 pcie->cfg_link_cap_l1sub = val + PCI_L1SS_CAP; in init_host_aspm()
672 pcie->ras_des_cap = dw_pcie_find_ext_capability(&pcie->pci, in init_host_aspm()
678 dw_pcie_writel_dbi(pci, pcie->ras_des_cap + in init_host_aspm()
682 val = dw_pcie_readl_dbi(pci, pcie->cfg_link_cap_l1sub); in init_host_aspm()
684 val |= (pcie->aspm_cmrt << 8); in init_host_aspm()
685 val |= (pcie->aspm_pwr_on_t << 19); in init_host_aspm()
686 dw_pcie_writel_dbi(pci, pcie->cfg_link_cap_l1sub, val); in init_host_aspm()
691 val |= (pcie->aspm_l0s_enter_lat << PORT_AFR_L0S_ENTRANCE_LAT_SHIFT); in init_host_aspm()
696 static void init_debugfs(struct tegra_pcie_dw *pcie) in init_debugfs() argument
698 debugfs_create_devm_seqfile(pcie->dev, "aspm_state_cnt", pcie->debugfs, in init_debugfs()
702 static inline void disable_aspm_l12(struct tegra_pcie_dw *pcie) { return; } in disable_aspm_l12() argument
703 static inline void disable_aspm_l11(struct tegra_pcie_dw *pcie) { return; } in disable_aspm_l11() argument
704 static inline void init_host_aspm(struct tegra_pcie_dw *pcie) { return; } in init_host_aspm() argument
705 static inline void init_debugfs(struct tegra_pcie_dw *pcie) { return; } in init_debugfs() argument
711 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_enable_system_interrupts() local
715 val = appl_readl(pcie, APPL_INTR_EN_L0_0); in tegra_pcie_enable_system_interrupts()
717 appl_writel(pcie, val, APPL_INTR_EN_L0_0); in tegra_pcie_enable_system_interrupts()
719 if (!pcie->of_data->has_sbr_reset_fix) { in tegra_pcie_enable_system_interrupts()
720 val = appl_readl(pcie, APPL_INTR_EN_L1_0_0); in tegra_pcie_enable_system_interrupts()
722 appl_writel(pcie, val, APPL_INTR_EN_L1_0_0); in tegra_pcie_enable_system_interrupts()
725 if (pcie->enable_cdm_check) { in tegra_pcie_enable_system_interrupts()
726 val = appl_readl(pcie, APPL_INTR_EN_L0_0); in tegra_pcie_enable_system_interrupts()
727 val |= pcie->of_data->cdm_chk_int_en_bit; in tegra_pcie_enable_system_interrupts()
728 appl_writel(pcie, val, APPL_INTR_EN_L0_0); in tegra_pcie_enable_system_interrupts()
730 val = appl_readl(pcie, APPL_INTR_EN_L1_18); in tegra_pcie_enable_system_interrupts()
733 appl_writel(pcie, val, APPL_INTR_EN_L1_18); 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()
738 pcie->init_link_width = (val_w & PCI_EXP_LNKSTA_NLW) >> in tegra_pcie_enable_system_interrupts()
741 val_w = dw_pcie_readw_dbi(&pcie->pci, pcie->pcie_cap_base + in tegra_pcie_enable_system_interrupts()
744 dw_pcie_writew_dbi(&pcie->pci, pcie->pcie_cap_base + PCI_EXP_LNKCTL, in tegra_pcie_enable_system_interrupts()
751 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_enable_legacy_interrupts() local
755 val = appl_readl(pcie, APPL_INTR_EN_L0_0); in tegra_pcie_enable_legacy_interrupts()
758 appl_writel(pcie, val, APPL_INTR_EN_L0_0); in tegra_pcie_enable_legacy_interrupts()
760 val = appl_readl(pcie, APPL_INTR_EN_L1_8_0); in tegra_pcie_enable_legacy_interrupts()
766 appl_writel(pcie, val, APPL_INTR_EN_L1_8_0); in tegra_pcie_enable_legacy_interrupts()
772 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_enable_msi_interrupts() local
776 val = appl_readl(pcie, APPL_INTR_EN_L0_0); in tegra_pcie_enable_msi_interrupts()
779 appl_writel(pcie, val, APPL_INTR_EN_L0_0); in tegra_pcie_enable_msi_interrupts()
785 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_enable_interrupts() local
788 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L0); in tegra_pcie_enable_interrupts()
789 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0); in tegra_pcie_enable_interrupts()
790 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_1); in tegra_pcie_enable_interrupts()
791 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_2); in tegra_pcie_enable_interrupts()
792 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_3); in tegra_pcie_enable_interrupts()
793 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_6); in tegra_pcie_enable_interrupts()
794 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_7); in tegra_pcie_enable_interrupts()
795 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_8_0); in tegra_pcie_enable_interrupts()
796 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_9); in tegra_pcie_enable_interrupts()
797 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_10); in tegra_pcie_enable_interrupts()
798 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_11); in tegra_pcie_enable_interrupts()
799 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_13); in tegra_pcie_enable_interrupts()
800 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_14); in tegra_pcie_enable_interrupts()
801 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_15); in tegra_pcie_enable_interrupts()
802 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_17); in tegra_pcie_enable_interrupts()
810 static void config_gen3_gen4_eq_presets(struct tegra_pcie_dw *pcie) in config_gen3_gen4_eq_presets() argument
812 struct dw_pcie *pci = &pcie->pci; in config_gen3_gen4_eq_presets()
816 for (i = 0; i < pcie->num_lanes; i++) { in config_gen3_gen4_eq_presets()
854 val |= (pcie->of_data->gen4_preset_vec << in config_gen3_gen4_eq_presets()
867 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_dw_host_init() local
873 if (!pcie->pcie_cap_base) in tegra_pcie_dw_host_init()
874 pcie->pcie_cap_base = dw_pcie_find_capability(&pcie->pci, in tegra_pcie_dw_host_init()
877 val_16 = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_DEVCTL); in tegra_pcie_dw_host_init()
880 dw_pcie_writew_dbi(pci, pcie->pcie_cap_base + PCI_EXP_DEVCTL, val_16); in tegra_pcie_dw_host_init()
901 val = dw_pcie_readl_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKCAP); in tegra_pcie_dw_host_init()
903 val |= (pcie->num_lanes << PCI_EXP_LNKSTA_NLW_SHIFT); in tegra_pcie_dw_host_init()
904 dw_pcie_writel_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKCAP, val); in tegra_pcie_dw_host_init()
907 if (pcie->enable_srns) { in tegra_pcie_dw_host_init()
908 val_16 = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + in tegra_pcie_dw_host_init()
911 dw_pcie_writew_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA, in tegra_pcie_dw_host_init()
915 config_gen3_gen4_eq_presets(pcie); in tegra_pcie_dw_host_init()
917 init_host_aspm(pcie); in tegra_pcie_dw_host_init()
920 if (!pcie->supports_clkreq) { in tegra_pcie_dw_host_init()
921 disable_aspm_l11(pcie); in tegra_pcie_dw_host_init()
922 disable_aspm_l12(pcie); in tegra_pcie_dw_host_init()
925 if (!pcie->of_data->has_l1ss_exit_fix) { in tegra_pcie_dw_host_init()
931 if (pcie->update_fc_fixup) { in tegra_pcie_dw_host_init()
937 clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ); in tegra_pcie_dw_host_init()
945 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_dw_start_link() local
949 if (pcie->of_data->mode == DW_PCIE_EP_TYPE) { in tegra_pcie_dw_start_link()
950 enable_irq(pcie->pex_rst_irq); in tegra_pcie_dw_start_link()
956 val = appl_readl(pcie, APPL_PINMUX); in tegra_pcie_dw_start_link()
958 appl_writel(pcie, val, APPL_PINMUX); in tegra_pcie_dw_start_link()
963 val = appl_readl(pcie, APPL_CTRL); in tegra_pcie_dw_start_link()
965 appl_writel(pcie, val, APPL_CTRL); in tegra_pcie_dw_start_link()
968 val = appl_readl(pcie, APPL_PINMUX); in tegra_pcie_dw_start_link()
970 appl_writel(pcie, val, APPL_PINMUX); in tegra_pcie_dw_start_link()
985 val = appl_readl(pcie, APPL_DEBUG); in tegra_pcie_dw_start_link()
988 tmp = appl_readl(pcie, APPL_LINK_STATUS); in tegra_pcie_dw_start_link()
998 val = appl_readl(pcie, APPL_CTRL); in tegra_pcie_dw_start_link()
1000 appl_writel(pcie, val, APPL_CTRL); in tegra_pcie_dw_start_link()
1002 reset_control_assert(pcie->core_rst); in tegra_pcie_dw_start_link()
1003 reset_control_deassert(pcie->core_rst); in tegra_pcie_dw_start_link()
1017 speed = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) & in tegra_pcie_dw_start_link()
1019 clk_set_rate(pcie->core_clk, pcie_gen_freq[speed - 1]); in tegra_pcie_dw_start_link()
1028 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_dw_link_up() local
1029 u32 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA); in tegra_pcie_dw_link_up()
1036 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_dw_stop_link() local
1038 disable_irq(pcie->pex_rst_irq); in tegra_pcie_dw_stop_link()
1051 static void tegra_pcie_disable_phy(struct tegra_pcie_dw *pcie) in tegra_pcie_disable_phy() argument
1053 unsigned int phy_count = pcie->phy_count; in tegra_pcie_disable_phy()
1056 phy_power_off(pcie->phys[phy_count]); in tegra_pcie_disable_phy()
1057 phy_exit(pcie->phys[phy_count]); in tegra_pcie_disable_phy()
1061 static int tegra_pcie_enable_phy(struct tegra_pcie_dw *pcie) in tegra_pcie_enable_phy() argument
1066 for (i = 0; i < pcie->phy_count; i++) { in tegra_pcie_enable_phy()
1067 ret = phy_init(pcie->phys[i]); in tegra_pcie_enable_phy()
1071 ret = phy_power_on(pcie->phys[i]); in tegra_pcie_enable_phy()
1080 phy_power_off(pcie->phys[i]); in tegra_pcie_enable_phy()
1082 phy_exit(pcie->phys[i]); in tegra_pcie_enable_phy()
1088 static int tegra_pcie_dw_parse_dt(struct tegra_pcie_dw *pcie) in tegra_pcie_dw_parse_dt() argument
1090 struct platform_device *pdev = to_platform_device(pcie->dev); in tegra_pcie_dw_parse_dt()
1091 struct device_node *np = pcie->dev->of_node; in tegra_pcie_dw_parse_dt()
1094 pcie->dbi_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi"); in tegra_pcie_dw_parse_dt()
1095 if (!pcie->dbi_res) { in tegra_pcie_dw_parse_dt()
1096 dev_err(pcie->dev, "Failed to find \"dbi\" region\n"); in tegra_pcie_dw_parse_dt()
1100 ret = of_property_read_u32(np, "nvidia,aspm-cmrt-us", &pcie->aspm_cmrt); in tegra_pcie_dw_parse_dt()
1102 dev_info(pcie->dev, "Failed to read ASPM T_cmrt: %d\n", ret); in tegra_pcie_dw_parse_dt()
1107 &pcie->aspm_pwr_on_t); in tegra_pcie_dw_parse_dt()
1109 dev_info(pcie->dev, "Failed to read ASPM Power On time: %d\n", in tegra_pcie_dw_parse_dt()
1113 &pcie->aspm_l0s_enter_lat); in tegra_pcie_dw_parse_dt()
1115 dev_info(pcie->dev, in tegra_pcie_dw_parse_dt()
1118 ret = of_property_read_u32(np, "num-lanes", &pcie->num_lanes); in tegra_pcie_dw_parse_dt()
1120 dev_err(pcie->dev, "Failed to read num-lanes: %d\n", ret); in tegra_pcie_dw_parse_dt()
1124 ret = of_property_read_u32_index(np, "nvidia,bpmp", 1, &pcie->cid); in tegra_pcie_dw_parse_dt()
1126 dev_err(pcie->dev, "Failed to read Controller-ID: %d\n", ret); in tegra_pcie_dw_parse_dt()
1132 dev_err(pcie->dev, "Failed to find PHY entries: %d\n", in tegra_pcie_dw_parse_dt()
1136 pcie->phy_count = ret; in tegra_pcie_dw_parse_dt()
1139 pcie->update_fc_fixup = true; in tegra_pcie_dw_parse_dt()
1142 if (pcie->of_data->version == TEGRA194_DWC_IP_VER) { in tegra_pcie_dw_parse_dt()
1143 if (pcie->of_data->mode == DW_PCIE_EP_TYPE) in tegra_pcie_dw_parse_dt()
1144 pcie->enable_ext_refclk = true; in tegra_pcie_dw_parse_dt()
1146 pcie->enable_ext_refclk = in tegra_pcie_dw_parse_dt()
1147 of_property_read_bool(pcie->dev->of_node, in tegra_pcie_dw_parse_dt()
1151 pcie->supports_clkreq = in tegra_pcie_dw_parse_dt()
1152 of_property_read_bool(pcie->dev->of_node, "supports-clkreq"); in tegra_pcie_dw_parse_dt()
1154 pcie->enable_cdm_check = in tegra_pcie_dw_parse_dt()
1157 if (pcie->of_data->version == TEGRA234_DWC_IP_VER) in tegra_pcie_dw_parse_dt()
1158 pcie->enable_srns = in tegra_pcie_dw_parse_dt()
1161 if (pcie->of_data->mode == DW_PCIE_RC_TYPE) in tegra_pcie_dw_parse_dt()
1165 pcie->pex_rst_gpiod = devm_gpiod_get(pcie->dev, "reset", GPIOD_IN); in tegra_pcie_dw_parse_dt()
1166 if (IS_ERR(pcie->pex_rst_gpiod)) { in tegra_pcie_dw_parse_dt()
1167 int err = PTR_ERR(pcie->pex_rst_gpiod); in tegra_pcie_dw_parse_dt()
1173 dev_printk(level, pcie->dev, in tegra_pcie_dw_parse_dt()
1179 pcie->pex_refclk_sel_gpiod = devm_gpiod_get(pcie->dev, in tegra_pcie_dw_parse_dt()
1182 if (IS_ERR(pcie->pex_refclk_sel_gpiod)) { in tegra_pcie_dw_parse_dt()
1183 int err = PTR_ERR(pcie->pex_refclk_sel_gpiod); in tegra_pcie_dw_parse_dt()
1189 dev_printk(level, pcie->dev, in tegra_pcie_dw_parse_dt()
1192 pcie->pex_refclk_sel_gpiod = NULL; in tegra_pcie_dw_parse_dt()
1198 static int tegra_pcie_bpmp_set_ctrl_state(struct tegra_pcie_dw *pcie, in tegra_pcie_bpmp_set_ctrl_state() argument
1209 if (pcie->of_data->version == TEGRA194_DWC_IP_VER && pcie->cid == 5) in tegra_pcie_bpmp_set_ctrl_state()
1216 req.controller_state.pcie_controller = pcie->cid; in tegra_pcie_bpmp_set_ctrl_state()
1226 return tegra_bpmp_transfer(pcie->bpmp, &msg); in tegra_pcie_bpmp_set_ctrl_state()
1229 static int tegra_pcie_bpmp_set_pll_state(struct tegra_pcie_dw *pcie, in tegra_pcie_bpmp_set_pll_state() argument
1241 req.ep_ctrlr_pll_init.ep_controller = pcie->cid; in tegra_pcie_bpmp_set_pll_state()
1244 req.ep_ctrlr_pll_off.ep_controller = pcie->cid; in tegra_pcie_bpmp_set_pll_state()
1254 return tegra_bpmp_transfer(pcie->bpmp, &msg); in tegra_pcie_bpmp_set_pll_state()
1257 static void tegra_pcie_downstream_dev_to_D0(struct tegra_pcie_dw *pcie) in tegra_pcie_downstream_dev_to_D0() argument
1259 struct dw_pcie_rp *pp = &pcie->pci.pp; in tegra_pcie_downstream_dev_to_D0()
1281 dev_err(pcie->dev, "Failed to find downstream devices\n"); in tegra_pcie_downstream_dev_to_D0()
1288 dev_err(pcie->dev, in tegra_pcie_downstream_dev_to_D0()
1295 static int tegra_pcie_get_slot_regulators(struct tegra_pcie_dw *pcie) in tegra_pcie_get_slot_regulators() argument
1297 pcie->slot_ctl_3v3 = devm_regulator_get_optional(pcie->dev, "vpcie3v3"); in tegra_pcie_get_slot_regulators()
1298 if (IS_ERR(pcie->slot_ctl_3v3)) { in tegra_pcie_get_slot_regulators()
1299 if (PTR_ERR(pcie->slot_ctl_3v3) != -ENODEV) in tegra_pcie_get_slot_regulators()
1300 return PTR_ERR(pcie->slot_ctl_3v3); in tegra_pcie_get_slot_regulators()
1302 pcie->slot_ctl_3v3 = NULL; in tegra_pcie_get_slot_regulators()
1305 pcie->slot_ctl_12v = devm_regulator_get_optional(pcie->dev, "vpcie12v"); in tegra_pcie_get_slot_regulators()
1306 if (IS_ERR(pcie->slot_ctl_12v)) { in tegra_pcie_get_slot_regulators()
1307 if (PTR_ERR(pcie->slot_ctl_12v) != -ENODEV) in tegra_pcie_get_slot_regulators()
1308 return PTR_ERR(pcie->slot_ctl_12v); in tegra_pcie_get_slot_regulators()
1310 pcie->slot_ctl_12v = NULL; in tegra_pcie_get_slot_regulators()
1316 static int tegra_pcie_enable_slot_regulators(struct tegra_pcie_dw *pcie) in tegra_pcie_enable_slot_regulators() argument
1320 if (pcie->slot_ctl_3v3) { in tegra_pcie_enable_slot_regulators()
1321 ret = regulator_enable(pcie->slot_ctl_3v3); in tegra_pcie_enable_slot_regulators()
1323 dev_err(pcie->dev, in tegra_pcie_enable_slot_regulators()
1329 if (pcie->slot_ctl_12v) { in tegra_pcie_enable_slot_regulators()
1330 ret = regulator_enable(pcie->slot_ctl_12v); in tegra_pcie_enable_slot_regulators()
1332 dev_err(pcie->dev, in tegra_pcie_enable_slot_regulators()
1343 if (pcie->slot_ctl_3v3 || pcie->slot_ctl_12v) in tegra_pcie_enable_slot_regulators()
1349 if (pcie->slot_ctl_3v3) in tegra_pcie_enable_slot_regulators()
1350 regulator_disable(pcie->slot_ctl_3v3); in tegra_pcie_enable_slot_regulators()
1354 static void tegra_pcie_disable_slot_regulators(struct tegra_pcie_dw *pcie) in tegra_pcie_disable_slot_regulators() argument
1356 if (pcie->slot_ctl_12v) in tegra_pcie_disable_slot_regulators()
1357 regulator_disable(pcie->slot_ctl_12v); in tegra_pcie_disable_slot_regulators()
1358 if (pcie->slot_ctl_3v3) in tegra_pcie_disable_slot_regulators()
1359 regulator_disable(pcie->slot_ctl_3v3); in tegra_pcie_disable_slot_regulators()
1362 static int tegra_pcie_config_controller(struct tegra_pcie_dw *pcie, in tegra_pcie_config_controller() argument
1368 ret = tegra_pcie_bpmp_set_ctrl_state(pcie, true); in tegra_pcie_config_controller()
1370 dev_err(pcie->dev, in tegra_pcie_config_controller()
1371 "Failed to enable controller %u: %d\n", pcie->cid, ret); in tegra_pcie_config_controller()
1375 if (pcie->enable_ext_refclk) { in tegra_pcie_config_controller()
1376 ret = tegra_pcie_bpmp_set_pll_state(pcie, true); in tegra_pcie_config_controller()
1378 dev_err(pcie->dev, "Failed to init UPHY: %d\n", ret); in tegra_pcie_config_controller()
1383 ret = tegra_pcie_enable_slot_regulators(pcie); in tegra_pcie_config_controller()
1387 ret = regulator_enable(pcie->pex_ctl_supply); in tegra_pcie_config_controller()
1389 dev_err(pcie->dev, "Failed to enable regulator: %d\n", ret); in tegra_pcie_config_controller()
1393 ret = clk_prepare_enable(pcie->core_clk); in tegra_pcie_config_controller()
1395 dev_err(pcie->dev, "Failed to enable core clock: %d\n", ret); in tegra_pcie_config_controller()
1399 ret = reset_control_deassert(pcie->core_apb_rst); in tegra_pcie_config_controller()
1401 dev_err(pcie->dev, "Failed to deassert core APB reset: %d\n", in tegra_pcie_config_controller()
1406 if (en_hw_hot_rst || pcie->of_data->has_sbr_reset_fix) { in tegra_pcie_config_controller()
1408 val = appl_readl(pcie, APPL_CTRL); in tegra_pcie_config_controller()
1414 appl_writel(pcie, val, APPL_CTRL); in tegra_pcie_config_controller()
1417 ret = tegra_pcie_enable_phy(pcie); in tegra_pcie_config_controller()
1419 dev_err(pcie->dev, "Failed to enable PHY: %d\n", ret); in tegra_pcie_config_controller()
1424 appl_writel(pcie, pcie->dbi_res->start & APPL_CFG_BASE_ADDR_MASK, in tegra_pcie_config_controller()
1428 appl_writel(pcie, APPL_DM_TYPE_RP, APPL_DM_TYPE); in tegra_pcie_config_controller()
1430 appl_writel(pcie, 0x0, APPL_CFG_SLCG_OVERRIDE); in tegra_pcie_config_controller()
1432 val = appl_readl(pcie, APPL_CTRL); in tegra_pcie_config_controller()
1433 appl_writel(pcie, val | APPL_CTRL_SYS_PRE_DET_STATE, APPL_CTRL); in tegra_pcie_config_controller()
1435 val = appl_readl(pcie, APPL_CFG_MISC); in tegra_pcie_config_controller()
1437 appl_writel(pcie, val, APPL_CFG_MISC); in tegra_pcie_config_controller()
1439 if (pcie->enable_srns || pcie->enable_ext_refclk) { in tegra_pcie_config_controller()
1441 * When Tegra PCIe RP is using external clock, it cannot supply in tegra_pcie_config_controller()
1442 * same clock to its downstream hierarchy. Hence, gate PCIe RP in tegra_pcie_config_controller()
1446 val = appl_readl(pcie, APPL_PINMUX); in tegra_pcie_config_controller()
1449 appl_writel(pcie, val, APPL_PINMUX); in tegra_pcie_config_controller()
1452 if (!pcie->supports_clkreq) { in tegra_pcie_config_controller()
1453 val = appl_readl(pcie, APPL_PINMUX); in tegra_pcie_config_controller()
1456 appl_writel(pcie, val, APPL_PINMUX); in tegra_pcie_config_controller()
1460 appl_writel(pcie, in tegra_pcie_config_controller()
1461 pcie->atu_dma_res->start & APPL_CFG_IATU_DMA_BASE_ADDR_MASK, in tegra_pcie_config_controller()
1464 reset_control_deassert(pcie->core_rst); in tegra_pcie_config_controller()
1469 reset_control_assert(pcie->core_apb_rst); in tegra_pcie_config_controller()
1471 clk_disable_unprepare(pcie->core_clk); in tegra_pcie_config_controller()
1473 regulator_disable(pcie->pex_ctl_supply); in tegra_pcie_config_controller()
1475 tegra_pcie_disable_slot_regulators(pcie); in tegra_pcie_config_controller()
1477 if (pcie->enable_ext_refclk) in tegra_pcie_config_controller()
1478 tegra_pcie_bpmp_set_pll_state(pcie, false); in tegra_pcie_config_controller()
1480 tegra_pcie_bpmp_set_ctrl_state(pcie, false); in tegra_pcie_config_controller()
1485 static void tegra_pcie_unconfig_controller(struct tegra_pcie_dw *pcie) in tegra_pcie_unconfig_controller() argument
1489 ret = reset_control_assert(pcie->core_rst); in tegra_pcie_unconfig_controller()
1491 dev_err(pcie->dev, "Failed to assert \"core\" reset: %d\n", ret); in tegra_pcie_unconfig_controller()
1493 tegra_pcie_disable_phy(pcie); in tegra_pcie_unconfig_controller()
1495 ret = reset_control_assert(pcie->core_apb_rst); in tegra_pcie_unconfig_controller()
1497 dev_err(pcie->dev, "Failed to assert APB reset: %d\n", ret); in tegra_pcie_unconfig_controller()
1499 clk_disable_unprepare(pcie->core_clk); in tegra_pcie_unconfig_controller()
1501 ret = regulator_disable(pcie->pex_ctl_supply); in tegra_pcie_unconfig_controller()
1503 dev_err(pcie->dev, "Failed to disable regulator: %d\n", ret); in tegra_pcie_unconfig_controller()
1505 tegra_pcie_disable_slot_regulators(pcie); in tegra_pcie_unconfig_controller()
1507 if (pcie->enable_ext_refclk) { in tegra_pcie_unconfig_controller()
1508 ret = tegra_pcie_bpmp_set_pll_state(pcie, false); in tegra_pcie_unconfig_controller()
1510 dev_err(pcie->dev, "Failed to deinit UPHY: %d\n", ret); in tegra_pcie_unconfig_controller()
1513 ret = tegra_pcie_bpmp_set_ctrl_state(pcie, false); in tegra_pcie_unconfig_controller()
1515 dev_err(pcie->dev, "Failed to disable controller %d: %d\n", in tegra_pcie_unconfig_controller()
1516 pcie->cid, ret); in tegra_pcie_unconfig_controller()
1519 static int tegra_pcie_init_controller(struct tegra_pcie_dw *pcie) in tegra_pcie_init_controller() argument
1521 struct dw_pcie *pci = &pcie->pci; in tegra_pcie_init_controller()
1525 ret = tegra_pcie_config_controller(pcie, false); in tegra_pcie_init_controller()
1533 dev_err(pcie->dev, "Failed to add PCIe port: %d\n", ret); in tegra_pcie_init_controller()
1540 tegra_pcie_unconfig_controller(pcie); in tegra_pcie_init_controller()
1544 static int tegra_pcie_try_link_l2(struct tegra_pcie_dw *pcie) in tegra_pcie_try_link_l2() argument
1548 if (!tegra_pcie_dw_link_up(&pcie->pci)) in tegra_pcie_try_link_l2()
1551 val = appl_readl(pcie, APPL_RADM_STATUS); in tegra_pcie_try_link_l2()
1553 appl_writel(pcie, val, APPL_RADM_STATUS); in tegra_pcie_try_link_l2()
1555 return readl_poll_timeout_atomic(pcie->appl_base + APPL_DEBUG, val, in tegra_pcie_try_link_l2()
1560 static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie) in tegra_pcie_dw_pme_turnoff() argument
1565 if (!tegra_pcie_dw_link_up(&pcie->pci)) { in tegra_pcie_dw_pme_turnoff()
1566 dev_dbg(pcie->dev, "PCIe link is not up...!\n"); in tegra_pcie_dw_pme_turnoff()
1571 * PCIe controller exits from L2 only if reset is applied, so in tegra_pcie_dw_pme_turnoff()
1578 appl_writel(pcie, 0x0, APPL_INTR_EN_L0_0); in tegra_pcie_dw_pme_turnoff()
1580 if (tegra_pcie_try_link_l2(pcie)) { in tegra_pcie_dw_pme_turnoff()
1581 dev_info(pcie->dev, "Link didn't transition to L2 state\n"); in tegra_pcie_dw_pme_turnoff()
1588 data = appl_readl(pcie, APPL_PINMUX); in tegra_pcie_dw_pme_turnoff()
1590 appl_writel(pcie, data, APPL_PINMUX); in tegra_pcie_dw_pme_turnoff()
1596 data = readl(pcie->appl_base + APPL_CTRL); in tegra_pcie_dw_pme_turnoff()
1598 writel(data, pcie->appl_base + APPL_CTRL); in tegra_pcie_dw_pme_turnoff()
1600 err = readl_poll_timeout_atomic(pcie->appl_base + APPL_DEBUG, in tegra_pcie_dw_pme_turnoff()
1608 dev_info(pcie->dev, "Link didn't go to detect state\n"); in tegra_pcie_dw_pme_turnoff()
1614 data = appl_readl(pcie, APPL_PINMUX); in tegra_pcie_dw_pme_turnoff()
1619 appl_writel(pcie, data, APPL_PINMUX); in tegra_pcie_dw_pme_turnoff()
1622 static void tegra_pcie_deinit_controller(struct tegra_pcie_dw *pcie) in tegra_pcie_deinit_controller() argument
1624 tegra_pcie_downstream_dev_to_D0(pcie); in tegra_pcie_deinit_controller()
1625 dw_pcie_host_deinit(&pcie->pci.pp); in tegra_pcie_deinit_controller()
1626 tegra_pcie_dw_pme_turnoff(pcie); in tegra_pcie_deinit_controller()
1627 tegra_pcie_unconfig_controller(pcie); in tegra_pcie_deinit_controller()
1630 static int tegra_pcie_config_rp(struct tegra_pcie_dw *pcie) in tegra_pcie_config_rp() argument
1632 struct device *dev = pcie->dev; in tegra_pcie_config_rp()
1640 dev_err(dev, "Failed to get runtime sync for PCIe dev: %d\n", in tegra_pcie_config_rp()
1651 ret = tegra_pcie_init_controller(pcie); in tegra_pcie_config_rp()
1657 pcie->link_state = tegra_pcie_dw_link_up(&pcie->pci); in tegra_pcie_config_rp()
1658 if (!pcie->link_state) { in tegra_pcie_config_rp()
1669 pcie->debugfs = debugfs_create_dir(name, NULL); in tegra_pcie_config_rp()
1670 init_debugfs(pcie); in tegra_pcie_config_rp()
1675 tegra_pcie_deinit_controller(pcie); in tegra_pcie_config_rp()
1682 static void pex_ep_event_pex_rst_assert(struct tegra_pcie_dw *pcie) in pex_ep_event_pex_rst_assert() argument
1687 if (pcie->ep_state == EP_STATE_DISABLED) in pex_ep_event_pex_rst_assert()
1691 val = appl_readl(pcie, APPL_CTRL); in pex_ep_event_pex_rst_assert()
1693 appl_writel(pcie, val, APPL_CTRL); in pex_ep_event_pex_rst_assert()
1695 ret = readl_poll_timeout(pcie->appl_base + APPL_DEBUG, val, in pex_ep_event_pex_rst_assert()
1701 dev_err(pcie->dev, "Failed to go Detect state: %d\n", ret); in pex_ep_event_pex_rst_assert()
1703 reset_control_assert(pcie->core_rst); in pex_ep_event_pex_rst_assert()
1705 tegra_pcie_disable_phy(pcie); in pex_ep_event_pex_rst_assert()
1707 reset_control_assert(pcie->core_apb_rst); in pex_ep_event_pex_rst_assert()
1709 clk_disable_unprepare(pcie->core_clk); in pex_ep_event_pex_rst_assert()
1711 pm_runtime_put_sync(pcie->dev); in pex_ep_event_pex_rst_assert()
1713 if (pcie->enable_ext_refclk) { in pex_ep_event_pex_rst_assert()
1714 ret = tegra_pcie_bpmp_set_pll_state(pcie, false); in pex_ep_event_pex_rst_assert()
1716 dev_err(pcie->dev, "Failed to turn off UPHY: %d\n", in pex_ep_event_pex_rst_assert()
1720 ret = tegra_pcie_bpmp_set_pll_state(pcie, false); in pex_ep_event_pex_rst_assert()
1722 dev_err(pcie->dev, "Failed to turn off UPHY: %d\n", ret); in pex_ep_event_pex_rst_assert()
1724 pcie->ep_state = EP_STATE_DISABLED; in pex_ep_event_pex_rst_assert()
1725 dev_dbg(pcie->dev, "Uninitialization of endpoint is completed\n"); in pex_ep_event_pex_rst_assert()
1728 static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie) in pex_ep_event_pex_rst_deassert() argument
1730 struct dw_pcie *pci = &pcie->pci; in pex_ep_event_pex_rst_deassert()
1732 struct device *dev = pcie->dev; in pex_ep_event_pex_rst_deassert()
1737 if (pcie->ep_state == EP_STATE_ENABLED) in pex_ep_event_pex_rst_deassert()
1742 dev_err(dev, "Failed to get runtime sync for PCIe dev: %d\n", in pex_ep_event_pex_rst_deassert()
1747 ret = tegra_pcie_bpmp_set_ctrl_state(pcie, true); in pex_ep_event_pex_rst_deassert()
1749 dev_err(pcie->dev, "Failed to enable controller %u: %d\n", in pex_ep_event_pex_rst_deassert()
1750 pcie->cid, ret); in pex_ep_event_pex_rst_deassert()
1754 if (pcie->enable_ext_refclk) { in pex_ep_event_pex_rst_deassert()
1755 ret = tegra_pcie_bpmp_set_pll_state(pcie, true); in pex_ep_event_pex_rst_deassert()
1757 dev_err(dev, "Failed to init UPHY for PCIe EP: %d\n", in pex_ep_event_pex_rst_deassert()
1763 ret = clk_prepare_enable(pcie->core_clk); in pex_ep_event_pex_rst_deassert()
1769 ret = reset_control_deassert(pcie->core_apb_rst); in pex_ep_event_pex_rst_deassert()
1775 ret = tegra_pcie_enable_phy(pcie); in pex_ep_event_pex_rst_deassert()
1782 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L0); in pex_ep_event_pex_rst_deassert()
1783 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0); in pex_ep_event_pex_rst_deassert()
1784 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_1); in pex_ep_event_pex_rst_deassert()
1785 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_2); in pex_ep_event_pex_rst_deassert()
1786 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_3); in pex_ep_event_pex_rst_deassert()
1787 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_6); in pex_ep_event_pex_rst_deassert()
1788 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_7); in pex_ep_event_pex_rst_deassert()
1789 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_8_0); in pex_ep_event_pex_rst_deassert()
1790 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_9); in pex_ep_event_pex_rst_deassert()
1791 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_10); in pex_ep_event_pex_rst_deassert()
1792 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_11); in pex_ep_event_pex_rst_deassert()
1793 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_13); in pex_ep_event_pex_rst_deassert()
1794 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_14); in pex_ep_event_pex_rst_deassert()
1795 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_15); in pex_ep_event_pex_rst_deassert()
1796 appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_17); in pex_ep_event_pex_rst_deassert()
1799 val = appl_readl(pcie, APPL_DM_TYPE); in pex_ep_event_pex_rst_deassert()
1802 appl_writel(pcie, val, APPL_DM_TYPE); in pex_ep_event_pex_rst_deassert()
1804 appl_writel(pcie, 0x0, APPL_CFG_SLCG_OVERRIDE); in pex_ep_event_pex_rst_deassert()
1806 val = appl_readl(pcie, APPL_CTRL); in pex_ep_event_pex_rst_deassert()
1809 appl_writel(pcie, val, APPL_CTRL); in pex_ep_event_pex_rst_deassert()
1811 val = appl_readl(pcie, APPL_CFG_MISC); in pex_ep_event_pex_rst_deassert()
1814 appl_writel(pcie, val, APPL_CFG_MISC); in pex_ep_event_pex_rst_deassert()
1816 val = appl_readl(pcie, APPL_PINMUX); in pex_ep_event_pex_rst_deassert()
1819 appl_writel(pcie, val, APPL_PINMUX); in pex_ep_event_pex_rst_deassert()
1821 appl_writel(pcie, pcie->dbi_res->start & APPL_CFG_BASE_ADDR_MASK, in pex_ep_event_pex_rst_deassert()
1824 appl_writel(pcie, pcie->atu_dma_res->start & in pex_ep_event_pex_rst_deassert()
1828 val = appl_readl(pcie, APPL_INTR_EN_L0_0); in pex_ep_event_pex_rst_deassert()
1832 appl_writel(pcie, val, APPL_INTR_EN_L0_0); in pex_ep_event_pex_rst_deassert()
1834 val = appl_readl(pcie, APPL_INTR_EN_L1_0_0); in pex_ep_event_pex_rst_deassert()
1837 appl_writel(pcie, val, APPL_INTR_EN_L1_0_0); in pex_ep_event_pex_rst_deassert()
1839 reset_control_deassert(pcie->core_rst); in pex_ep_event_pex_rst_deassert()
1841 if (pcie->update_fc_fixup) { in pex_ep_event_pex_rst_deassert()
1847 config_gen3_gen4_eq_presets(pcie); in pex_ep_event_pex_rst_deassert()
1849 init_host_aspm(pcie); in pex_ep_event_pex_rst_deassert()
1852 if (!pcie->supports_clkreq) { in pex_ep_event_pex_rst_deassert()
1853 disable_aspm_l11(pcie); in pex_ep_event_pex_rst_deassert()
1854 disable_aspm_l12(pcie); in pex_ep_event_pex_rst_deassert()
1857 if (!pcie->of_data->has_l1ss_exit_fix) { in pex_ep_event_pex_rst_deassert()
1863 pcie->pcie_cap_base = dw_pcie_find_capability(&pcie->pci, in pex_ep_event_pex_rst_deassert()
1866 val_16 = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_DEVCTL); in pex_ep_event_pex_rst_deassert()
1869 dw_pcie_writew_dbi(pci, pcie->pcie_cap_base + PCI_EXP_DEVCTL, val_16); in pex_ep_event_pex_rst_deassert()
1872 if (pcie->enable_srns) { in pex_ep_event_pex_rst_deassert()
1873 val_16 = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + in pex_ep_event_pex_rst_deassert()
1876 dw_pcie_writew_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA, in pex_ep_event_pex_rst_deassert()
1880 clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ); in pex_ep_event_pex_rst_deassert()
1897 if (pcie->of_data->has_ltr_req_fix) { in pex_ep_event_pex_rst_deassert()
1898 val = appl_readl(pcie, APPL_LTR_MSG_2); in pex_ep_event_pex_rst_deassert()
1900 appl_writel(pcie, val, APPL_LTR_MSG_2); in pex_ep_event_pex_rst_deassert()
1904 val = appl_readl(pcie, APPL_CTRL); in pex_ep_event_pex_rst_deassert()
1906 appl_writel(pcie, val, APPL_CTRL); in pex_ep_event_pex_rst_deassert()
1908 pcie->ep_state = EP_STATE_ENABLED; in pex_ep_event_pex_rst_deassert()
1914 reset_control_assert(pcie->core_rst); in pex_ep_event_pex_rst_deassert()
1915 tegra_pcie_disable_phy(pcie); in pex_ep_event_pex_rst_deassert()
1917 reset_control_assert(pcie->core_apb_rst); in pex_ep_event_pex_rst_deassert()
1919 clk_disable_unprepare(pcie->core_clk); in pex_ep_event_pex_rst_deassert()
1921 tegra_pcie_bpmp_set_pll_state(pcie, false); in pex_ep_event_pex_rst_deassert()
1923 tegra_pcie_bpmp_set_ctrl_state(pcie, false); in pex_ep_event_pex_rst_deassert()
1930 struct tegra_pcie_dw *pcie = arg; in tegra_pcie_ep_pex_rst_irq() local
1932 if (gpiod_get_value(pcie->pex_rst_gpiod)) in tegra_pcie_ep_pex_rst_irq()
1933 pex_ep_event_pex_rst_assert(pcie); in tegra_pcie_ep_pex_rst_irq()
1935 pex_ep_event_pex_rst_deassert(pcie); in tegra_pcie_ep_pex_rst_irq()
1940 static int tegra_pcie_ep_raise_legacy_irq(struct tegra_pcie_dw *pcie, u16 irq) in tegra_pcie_ep_raise_legacy_irq() argument
1946 appl_writel(pcie, 1, APPL_LEGACY_INTX); in tegra_pcie_ep_raise_legacy_irq()
1948 appl_writel(pcie, 0, APPL_LEGACY_INTX); in tegra_pcie_ep_raise_legacy_irq()
1952 static int tegra_pcie_ep_raise_msi_irq(struct tegra_pcie_dw *pcie, u16 irq) in tegra_pcie_ep_raise_msi_irq() argument
1957 appl_writel(pcie, BIT(irq), APPL_MSI_CTRL_1); in tegra_pcie_ep_raise_msi_irq()
1962 static int tegra_pcie_ep_raise_msix_irq(struct tegra_pcie_dw *pcie, u16 irq) in tegra_pcie_ep_raise_msix_irq() argument
1964 struct dw_pcie_ep *ep = &pcie->pci.ep; in tegra_pcie_ep_raise_msix_irq()
1976 struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); in tegra_pcie_ep_raise_irq() local
1980 return tegra_pcie_ep_raise_legacy_irq(pcie, interrupt_num); in tegra_pcie_ep_raise_irq()
1983 return tegra_pcie_ep_raise_msi_irq(pcie, interrupt_num); in tegra_pcie_ep_raise_irq()
1986 return tegra_pcie_ep_raise_msix_irq(pcie, interrupt_num); in tegra_pcie_ep_raise_irq()
2017 static int tegra_pcie_config_ep(struct tegra_pcie_dw *pcie, in tegra_pcie_config_ep() argument
2020 struct dw_pcie *pci = &pcie->pci; in tegra_pcie_config_ep()
2021 struct device *dev = pcie->dev; in tegra_pcie_config_ep()
2031 ret = gpiod_set_debounce(pcie->pex_rst_gpiod, PERST_DEBOUNCE_TIME); in tegra_pcie_config_ep()
2038 ret = gpiod_to_irq(pcie->pex_rst_gpiod); in tegra_pcie_config_ep()
2043 pcie->pex_rst_irq = (unsigned int)ret; in tegra_pcie_config_ep()
2046 pcie->cid); in tegra_pcie_config_ep()
2052 irq_set_status_flags(pcie->pex_rst_irq, IRQ_NOAUTOEN); in tegra_pcie_config_ep()
2054 pcie->ep_state = EP_STATE_DISABLED; in tegra_pcie_config_ep()
2056 ret = devm_request_threaded_irq(dev, pcie->pex_rst_irq, NULL, in tegra_pcie_config_ep()
2060 name, (void *)pcie); in tegra_pcie_config_ep()
2084 struct tegra_pcie_dw *pcie; in tegra_pcie_dw_probe() local
2094 pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); in tegra_pcie_dw_probe()
2095 if (!pcie) in tegra_pcie_dw_probe()
2098 pci = &pcie->pci; in tegra_pcie_dw_probe()
2101 pcie->dev = &pdev->dev; in tegra_pcie_dw_probe()
2102 pcie->of_data = (struct tegra_pcie_dw_of_data *)data; in tegra_pcie_dw_probe()
2103 pci->n_fts[0] = pcie->of_data->n_fts[0]; in tegra_pcie_dw_probe()
2104 pci->n_fts[1] = pcie->of_data->n_fts[1]; in tegra_pcie_dw_probe()
2108 ret = tegra_pcie_dw_parse_dt(pcie); in tegra_pcie_dw_probe()
2121 ret = tegra_pcie_get_slot_regulators(pcie); in tegra_pcie_dw_probe()
2134 if (pcie->pex_refclk_sel_gpiod) in tegra_pcie_dw_probe()
2135 gpiod_set_value(pcie->pex_refclk_sel_gpiod, 1); in tegra_pcie_dw_probe()
2137 pcie->pex_ctl_supply = devm_regulator_get(dev, "vddio-pex-ctl"); in tegra_pcie_dw_probe()
2138 if (IS_ERR(pcie->pex_ctl_supply)) { in tegra_pcie_dw_probe()
2139 ret = PTR_ERR(pcie->pex_ctl_supply); in tegra_pcie_dw_probe()
2142 PTR_ERR(pcie->pex_ctl_supply)); in tegra_pcie_dw_probe()
2146 pcie->core_clk = devm_clk_get(dev, "core"); in tegra_pcie_dw_probe()
2147 if (IS_ERR(pcie->core_clk)) { in tegra_pcie_dw_probe()
2149 PTR_ERR(pcie->core_clk)); in tegra_pcie_dw_probe()
2150 return PTR_ERR(pcie->core_clk); in tegra_pcie_dw_probe()
2153 pcie->appl_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, in tegra_pcie_dw_probe()
2155 if (!pcie->appl_res) { in tegra_pcie_dw_probe()
2160 pcie->appl_base = devm_ioremap_resource(dev, pcie->appl_res); in tegra_pcie_dw_probe()
2161 if (IS_ERR(pcie->appl_base)) in tegra_pcie_dw_probe()
2162 return PTR_ERR(pcie->appl_base); in tegra_pcie_dw_probe()
2164 pcie->core_apb_rst = devm_reset_control_get(dev, "apb"); in tegra_pcie_dw_probe()
2165 if (IS_ERR(pcie->core_apb_rst)) { in tegra_pcie_dw_probe()
2167 PTR_ERR(pcie->core_apb_rst)); in tegra_pcie_dw_probe()
2168 return PTR_ERR(pcie->core_apb_rst); in tegra_pcie_dw_probe()
2171 phys = devm_kcalloc(dev, pcie->phy_count, sizeof(*phys), GFP_KERNEL); in tegra_pcie_dw_probe()
2175 for (i = 0; i < pcie->phy_count; i++) { in tegra_pcie_dw_probe()
2191 pcie->phys = phys; in tegra_pcie_dw_probe()
2199 pcie->atu_dma_res = atu_dma_res; in tegra_pcie_dw_probe()
2206 pcie->core_rst = devm_reset_control_get(dev, "core"); in tegra_pcie_dw_probe()
2207 if (IS_ERR(pcie->core_rst)) { in tegra_pcie_dw_probe()
2209 PTR_ERR(pcie->core_rst)); in tegra_pcie_dw_probe()
2210 return PTR_ERR(pcie->core_rst); in tegra_pcie_dw_probe()
2217 pcie->bpmp = tegra_bpmp_get(dev); in tegra_pcie_dw_probe()
2218 if (IS_ERR(pcie->bpmp)) in tegra_pcie_dw_probe()
2219 return PTR_ERR(pcie->bpmp); in tegra_pcie_dw_probe()
2221 platform_set_drvdata(pdev, pcie); in tegra_pcie_dw_probe()
2223 switch (pcie->of_data->mode) { in tegra_pcie_dw_probe()
2226 IRQF_SHARED, "tegra-pcie-intr", pcie); in tegra_pcie_dw_probe()
2233 ret = tegra_pcie_config_rp(pcie); in tegra_pcie_dw_probe()
2245 "tegra-pcie-ep-intr", pcie); in tegra_pcie_dw_probe()
2252 ret = tegra_pcie_config_ep(pcie, pdev); in tegra_pcie_dw_probe()
2258 dev_err(dev, "Invalid PCIe device type %d\n", in tegra_pcie_dw_probe()
2259 pcie->of_data->mode); in tegra_pcie_dw_probe()
2263 tegra_bpmp_put(pcie->bpmp); in tegra_pcie_dw_probe()
2269 struct tegra_pcie_dw *pcie = platform_get_drvdata(pdev); in tegra_pcie_dw_remove() local
2271 if (pcie->of_data->mode == DW_PCIE_RC_TYPE) { in tegra_pcie_dw_remove()
2272 if (!pcie->link_state) in tegra_pcie_dw_remove()
2275 debugfs_remove_recursive(pcie->debugfs); in tegra_pcie_dw_remove()
2276 tegra_pcie_deinit_controller(pcie); in tegra_pcie_dw_remove()
2277 pm_runtime_put_sync(pcie->dev); in tegra_pcie_dw_remove()
2279 disable_irq(pcie->pex_rst_irq); in tegra_pcie_dw_remove()
2280 pex_ep_event_pex_rst_assert(pcie); in tegra_pcie_dw_remove()
2283 pm_runtime_disable(pcie->dev); in tegra_pcie_dw_remove()
2284 tegra_bpmp_put(pcie->bpmp); in tegra_pcie_dw_remove()
2285 if (pcie->pex_refclk_sel_gpiod) in tegra_pcie_dw_remove()
2286 gpiod_set_value(pcie->pex_refclk_sel_gpiod, 0); in tegra_pcie_dw_remove()
2293 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev); in tegra_pcie_dw_suspend_late() local
2296 if (pcie->of_data->mode == DW_PCIE_EP_TYPE) { in tegra_pcie_dw_suspend_late()
2297 dev_err(dev, "Failed to Suspend as Tegra PCIe is in EP mode\n"); in tegra_pcie_dw_suspend_late()
2301 if (!pcie->link_state) in tegra_pcie_dw_suspend_late()
2305 if (!pcie->of_data->has_sbr_reset_fix) { in tegra_pcie_dw_suspend_late()
2306 val = appl_readl(pcie, APPL_CTRL); in tegra_pcie_dw_suspend_late()
2310 appl_writel(pcie, val, APPL_CTRL); in tegra_pcie_dw_suspend_late()
2318 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev); in tegra_pcie_dw_suspend_noirq() local
2320 if (!pcie->link_state) in tegra_pcie_dw_suspend_noirq()
2323 tegra_pcie_downstream_dev_to_D0(pcie); in tegra_pcie_dw_suspend_noirq()
2324 tegra_pcie_dw_pme_turnoff(pcie); in tegra_pcie_dw_suspend_noirq()
2325 tegra_pcie_unconfig_controller(pcie); in tegra_pcie_dw_suspend_noirq()
2332 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev); in tegra_pcie_dw_resume_noirq() local
2335 if (!pcie->link_state) in tegra_pcie_dw_resume_noirq()
2338 ret = tegra_pcie_config_controller(pcie, true); in tegra_pcie_dw_resume_noirq()
2342 ret = tegra_pcie_dw_host_init(&pcie->pci.pp); in tegra_pcie_dw_resume_noirq()
2348 dw_pcie_setup_rc(&pcie->pci.pp); in tegra_pcie_dw_resume_noirq()
2350 ret = tegra_pcie_dw_start_link(&pcie->pci); in tegra_pcie_dw_resume_noirq()
2357 tegra_pcie_unconfig_controller(pcie); in tegra_pcie_dw_resume_noirq()
2363 struct tegra_pcie_dw *pcie = dev_get_drvdata(dev); in tegra_pcie_dw_resume_early() local
2366 if (pcie->of_data->mode == DW_PCIE_EP_TYPE) { in tegra_pcie_dw_resume_early()
2371 if (!pcie->link_state) in tegra_pcie_dw_resume_early()
2375 if (!pcie->of_data->has_sbr_reset_fix) { in tegra_pcie_dw_resume_early()
2376 val = appl_readl(pcie, APPL_CTRL); in tegra_pcie_dw_resume_early()
2382 appl_writel(pcie, val, APPL_CTRL); in tegra_pcie_dw_resume_early()
2390 struct tegra_pcie_dw *pcie = platform_get_drvdata(pdev); in tegra_pcie_dw_shutdown() local
2392 if (pcie->of_data->mode == DW_PCIE_RC_TYPE) { in tegra_pcie_dw_shutdown()
2393 if (!pcie->link_state) in tegra_pcie_dw_shutdown()
2396 debugfs_remove_recursive(pcie->debugfs); in tegra_pcie_dw_shutdown()
2397 tegra_pcie_downstream_dev_to_D0(pcie); in tegra_pcie_dw_shutdown()
2399 disable_irq(pcie->pci.pp.irq); in tegra_pcie_dw_shutdown()
2401 disable_irq(pcie->pci.pp.msi_irq[0]); in tegra_pcie_dw_shutdown()
2403 tegra_pcie_dw_pme_turnoff(pcie); in tegra_pcie_dw_shutdown()
2404 tegra_pcie_unconfig_controller(pcie); in tegra_pcie_dw_shutdown()
2405 pm_runtime_put_sync(pcie->dev); in tegra_pcie_dw_shutdown()
2407 disable_irq(pcie->pex_rst_irq); in tegra_pcie_dw_shutdown()
2408 pex_ep_event_pex_rst_assert(pcie); in tegra_pcie_dw_shutdown()
2455 .compatible = "nvidia,tegra194-pcie",
2459 .compatible = "nvidia,tegra194-pcie-ep",
2463 .compatible = "nvidia,tegra234-pcie",
2467 .compatible = "nvidia,tegra234-pcie-ep",
2485 .name = "tegra194-pcie",
2495 MODULE_DESCRIPTION("NVIDIA PCIe host controller driver");