#include <linux/bitfield.h>
#include <linux/clk.h>
#include <linux/debugfs.h>
#include <linux/delay.h>
#include <linux/gpio/consumer.h>
#include <linux/interconnect.h>
#include <linux/interrupt.h>
#include <linux/iopoll.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_pci.h>
#include <linux/pci.h>
#include <linux/phy/phy.h>
#include <linux/pinctrl/consumer.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/random.h>
#include <linux/reset.h>
#include <linux/resource.h>
#include <linux/types.h>
#include "pcie-designware.h"
#include <soc/tegra/bpmp.h>
#include <soc/tegra/bpmp-abi.h>
#include "../../pci.h"
#define TEGRA194_DWC_IP_VER …
#define TEGRA234_DWC_IP_VER …
#define APPL_PINMUX …
#define APPL_PINMUX_PEX_RST …
#define APPL_PINMUX_CLKREQ_OVERRIDE_EN …
#define APPL_PINMUX_CLKREQ_OVERRIDE …
#define APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE_EN …
#define APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE …
#define APPL_CTRL …
#define APPL_CTRL_SYS_PRE_DET_STATE …
#define APPL_CTRL_LTSSM_EN …
#define APPL_CTRL_HW_HOT_RST_EN …
#define APPL_CTRL_HW_HOT_RST_MODE_MASK …
#define APPL_CTRL_HW_HOT_RST_MODE_SHIFT …
#define APPL_CTRL_HW_HOT_RST_MODE_IMDT_RST …
#define APPL_CTRL_HW_HOT_RST_MODE_IMDT_RST_LTSSM_EN …
#define APPL_INTR_EN_L0_0 …
#define APPL_INTR_EN_L0_0_LINK_STATE_INT_EN …
#define APPL_INTR_EN_L0_0_MSI_RCV_INT_EN …
#define APPL_INTR_EN_L0_0_INT_INT_EN …
#define APPL_INTR_EN_L0_0_PCI_CMD_EN_INT_EN …
#define APPL_INTR_EN_L0_0_CDM_REG_CHK_INT_EN …
#define APPL_INTR_EN_L0_0_SYS_INTR_EN …
#define APPL_INTR_EN_L0_0_SYS_MSI_INTR_EN …
#define APPL_INTR_STATUS_L0 …
#define APPL_INTR_STATUS_L0_LINK_STATE_INT …
#define APPL_INTR_STATUS_L0_INT_INT …
#define APPL_INTR_STATUS_L0_PCI_CMD_EN_INT …
#define APPL_INTR_STATUS_L0_PEX_RST_INT …
#define APPL_INTR_STATUS_L0_CDM_REG_CHK_INT …
#define APPL_INTR_EN_L1_0_0 …
#define APPL_INTR_EN_L1_0_0_LINK_REQ_RST_NOT_INT_EN …
#define APPL_INTR_EN_L1_0_0_RDLH_LINK_UP_INT_EN …
#define APPL_INTR_EN_L1_0_0_HOT_RESET_DONE_INT_EN …
#define APPL_INTR_STATUS_L1_0_0 …
#define APPL_INTR_STATUS_L1_0_0_LINK_REQ_RST_NOT_CHGED …
#define APPL_INTR_STATUS_L1_0_0_RDLH_LINK_UP_CHGED …
#define APPL_INTR_STATUS_L1_0_0_HOT_RESET_DONE …
#define APPL_INTR_STATUS_L1_1 …
#define APPL_INTR_STATUS_L1_2 …
#define APPL_INTR_STATUS_L1_3 …
#define APPL_INTR_STATUS_L1_6 …
#define APPL_INTR_STATUS_L1_7 …
#define APPL_INTR_STATUS_L1_15_CFG_BME_CHGED …
#define APPL_INTR_EN_L1_8_0 …
#define APPL_INTR_EN_L1_8_BW_MGT_INT_EN …
#define APPL_INTR_EN_L1_8_AUTO_BW_INT_EN …
#define APPL_INTR_EN_L1_8_INTX_EN …
#define APPL_INTR_EN_L1_8_AER_INT_EN …
#define APPL_INTR_STATUS_L1_8_0 …
#define APPL_INTR_STATUS_L1_8_0_EDMA_INT_MASK …
#define APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS …
#define APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS …
#define APPL_INTR_STATUS_L1_9 …
#define APPL_INTR_STATUS_L1_10 …
#define APPL_INTR_STATUS_L1_11 …
#define APPL_INTR_STATUS_L1_13 …
#define APPL_INTR_STATUS_L1_14 …
#define APPL_INTR_STATUS_L1_15 …
#define APPL_INTR_STATUS_L1_17 …
#define APPL_INTR_EN_L1_18 …
#define APPL_INTR_EN_L1_18_CDM_REG_CHK_CMPLT …
#define APPL_INTR_EN_L1_18_CDM_REG_CHK_CMP_ERR …
#define APPL_INTR_EN_L1_18_CDM_REG_CHK_LOGIC_ERR …
#define APPL_INTR_STATUS_L1_18 …
#define APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMPLT …
#define APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMP_ERR …
#define APPL_INTR_STATUS_L1_18_CDM_REG_CHK_LOGIC_ERR …
#define APPL_MSI_CTRL_1 …
#define APPL_MSI_CTRL_2 …
#define APPL_LEGACY_INTX …
#define APPL_LTR_MSG_1 …
#define LTR_MSG_REQ …
#define LTR_NOSNOOP_MSG_REQ …
#define APPL_LTR_MSG_2 …
#define APPL_LTR_MSG_2_LTR_MSG_REQ_STATE …
#define APPL_LINK_STATUS …
#define APPL_LINK_STATUS_RDLH_LINK_UP …
#define APPL_DEBUG …
#define APPL_DEBUG_PM_LINKST_IN_L2_LAT …
#define APPL_DEBUG_PM_LINKST_IN_L0 …
#define APPL_DEBUG_LTSSM_STATE_MASK …
#define APPL_DEBUG_LTSSM_STATE_SHIFT …
#define LTSSM_STATE_PRE_DETECT …
#define APPL_RADM_STATUS …
#define APPL_PM_XMT_TURNOFF_STATE …
#define APPL_DM_TYPE …
#define APPL_DM_TYPE_MASK …
#define APPL_DM_TYPE_RP …
#define APPL_DM_TYPE_EP …
#define APPL_CFG_BASE_ADDR …
#define APPL_CFG_BASE_ADDR_MASK …
#define APPL_CFG_IATU_DMA_BASE_ADDR …
#define APPL_CFG_IATU_DMA_BASE_ADDR_MASK …
#define APPL_CFG_MISC …
#define APPL_CFG_MISC_SLV_EP_MODE …
#define APPL_CFG_MISC_ARCACHE_MASK …
#define APPL_CFG_MISC_ARCACHE_SHIFT …
#define APPL_CFG_MISC_ARCACHE_VAL …
#define APPL_CFG_SLCG_OVERRIDE …
#define APPL_CFG_SLCG_OVERRIDE_SLCG_EN_MASTER …
#define APPL_CAR_RESET_OVRD …
#define APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N …
#define IO_BASE_IO_DECODE …
#define IO_BASE_IO_DECODE_BIT8 …
#define CFG_PREF_MEM_LIMIT_BASE_MEM_DECODE …
#define CFG_PREF_MEM_LIMIT_BASE_MEM_LIMIT_DECODE …
#define CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF …
#define CFG_TIMER_CTRL_ACK_NAK_SHIFT …
#define N_FTS_VAL …
#define FTS_VAL …
#define PORT_LOGIC_AMBA_ERROR_RESPONSE_DEFAULT …
#define AMBA_ERROR_RESPONSE_RRS_SHIFT …
#define AMBA_ERROR_RESPONSE_RRS_MASK …
#define AMBA_ERROR_RESPONSE_RRS_OKAY …
#define AMBA_ERROR_RESPONSE_RRS_OKAY_FFFFFFFF …
#define AMBA_ERROR_RESPONSE_RRS_OKAY_FFFF0001 …
#define MSIX_ADDR_MATCH_LOW_OFF …
#define MSIX_ADDR_MATCH_LOW_OFF_EN …
#define MSIX_ADDR_MATCH_LOW_OFF_MASK …
#define MSIX_ADDR_MATCH_HIGH_OFF …
#define MSIX_ADDR_MATCH_HIGH_OFF_MASK …
#define PORT_LOGIC_MSIX_DOORBELL …
#define CAP_SPCIE_CAP_OFF …
#define CAP_SPCIE_CAP_OFF_DSP_TX_PRESET0_MASK …
#define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_MASK …
#define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_SHIFT …
#define PME_ACK_TIMEOUT …
#define LTSSM_TIMEOUT …
#define GEN3_GEN4_EQ_PRESET_INIT …
#define GEN1_CORE_CLK_FREQ …
#define GEN2_CORE_CLK_FREQ …
#define GEN3_CORE_CLK_FREQ …
#define GEN4_CORE_CLK_FREQ …
#define LTR_MSG_TIMEOUT …
#define PERST_DEBOUNCE_TIME …
#define EP_STATE_DISABLED …
#define EP_STATE_ENABLED …
static const unsigned int pcie_gen_freq[] = …;
struct tegra_pcie_dw_of_data { … };
struct tegra_pcie_dw { … };
static inline struct tegra_pcie_dw *to_tegra_pcie(struct dw_pcie *pci)
{ … }
static inline void appl_writel(struct tegra_pcie_dw *pcie, const u32 value,
const u32 reg)
{ … }
static inline u32 appl_readl(struct tegra_pcie_dw *pcie, const u32 reg)
{ … }
static void tegra_pcie_icc_set(struct tegra_pcie_dw *pcie)
{ … }
static void apply_bad_link_workaround(struct dw_pcie_rp *pp)
{ … }
static irqreturn_t tegra_pcie_rp_irq_handler(int irq, void *arg)
{ … }
static void pex_ep_event_hot_rst_done(struct tegra_pcie_dw *pcie)
{ … }
static irqreturn_t tegra_pcie_ep_irq_thread(int irq, void *arg)
{ … }
static irqreturn_t tegra_pcie_ep_hard_irq(int irq, void *arg)
{ … }
static int tegra_pcie_dw_rd_own_conf(struct pci_bus *bus, u32 devfn, int where,
int size, u32 *val)
{ … }
static int tegra_pcie_dw_wr_own_conf(struct pci_bus *bus, u32 devfn, int where,
int size, u32 val)
{ … }
static struct pci_ops tegra_pci_ops = …;
#if defined(CONFIG_PCIEASPM)
static void disable_aspm_l11(struct tegra_pcie_dw *pcie)
{ … }
static void disable_aspm_l12(struct tegra_pcie_dw *pcie)
{ … }
static inline u32 event_counter_prog(struct tegra_pcie_dw *pcie, u32 event)
{ … }
static int aspm_state_cnt(struct seq_file *s, void *data)
{ … }
static void init_host_aspm(struct tegra_pcie_dw *pcie)
{ … }
static void init_debugfs(struct tegra_pcie_dw *pcie)
{ … }
#else
static inline void disable_aspm_l12(struct tegra_pcie_dw *pcie) { return; }
static inline void disable_aspm_l11(struct tegra_pcie_dw *pcie) { return; }
static inline void init_host_aspm(struct tegra_pcie_dw *pcie) { return; }
static inline void init_debugfs(struct tegra_pcie_dw *pcie) { return; }
#endif
static void tegra_pcie_enable_system_interrupts(struct dw_pcie_rp *pp)
{ … }
static void tegra_pcie_enable_intx_interrupts(struct dw_pcie_rp *pp)
{ … }
static void tegra_pcie_enable_msi_interrupts(struct dw_pcie_rp *pp)
{ … }
static void tegra_pcie_enable_interrupts(struct dw_pcie_rp *pp)
{ … }
static void config_gen3_gen4_eq_presets(struct tegra_pcie_dw *pcie)
{ … }
static int tegra_pcie_dw_host_init(struct dw_pcie_rp *pp)
{ … }
static int tegra_pcie_dw_start_link(struct dw_pcie *pci)
{ … }
static int tegra_pcie_dw_link_up(struct dw_pcie *pci)
{ … }
static void tegra_pcie_dw_stop_link(struct dw_pcie *pci)
{ … }
static const struct dw_pcie_ops tegra_dw_pcie_ops = …;
static const struct dw_pcie_host_ops tegra_pcie_dw_host_ops = …;
static void tegra_pcie_disable_phy(struct tegra_pcie_dw *pcie)
{ … }
static int tegra_pcie_enable_phy(struct tegra_pcie_dw *pcie)
{ … }
static int tegra_pcie_dw_parse_dt(struct tegra_pcie_dw *pcie)
{ … }
static int tegra_pcie_bpmp_set_ctrl_state(struct tegra_pcie_dw *pcie,
bool enable)
{ … }
static int tegra_pcie_bpmp_set_pll_state(struct tegra_pcie_dw *pcie,
bool enable)
{ … }
static void tegra_pcie_downstream_dev_to_D0(struct tegra_pcie_dw *pcie)
{ … }
static int tegra_pcie_get_slot_regulators(struct tegra_pcie_dw *pcie)
{ … }
static int tegra_pcie_enable_slot_regulators(struct tegra_pcie_dw *pcie)
{ … }
static void tegra_pcie_disable_slot_regulators(struct tegra_pcie_dw *pcie)
{ … }
static int tegra_pcie_config_controller(struct tegra_pcie_dw *pcie,
bool en_hw_hot_rst)
{ … }
static void tegra_pcie_unconfig_controller(struct tegra_pcie_dw *pcie)
{ … }
static int tegra_pcie_init_controller(struct tegra_pcie_dw *pcie)
{ … }
static int tegra_pcie_try_link_l2(struct tegra_pcie_dw *pcie)
{ … }
static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie)
{ … }
static void tegra_pcie_deinit_controller(struct tegra_pcie_dw *pcie)
{ … }
static int tegra_pcie_config_rp(struct tegra_pcie_dw *pcie)
{ … }
static void pex_ep_event_pex_rst_assert(struct tegra_pcie_dw *pcie)
{ … }
static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie)
{ … }
static irqreturn_t tegra_pcie_ep_pex_rst_irq(int irq, void *arg)
{ … }
static int tegra_pcie_ep_raise_intx_irq(struct tegra_pcie_dw *pcie, u16 irq)
{ … }
static int tegra_pcie_ep_raise_msi_irq(struct tegra_pcie_dw *pcie, u16 irq)
{ … }
static int tegra_pcie_ep_raise_msix_irq(struct tegra_pcie_dw *pcie, u16 irq)
{ … }
static int tegra_pcie_ep_raise_irq(struct dw_pcie_ep *ep, u8 func_no,
unsigned int type, u16 interrupt_num)
{ … }
static const struct pci_epc_features tegra_pcie_epc_features = …;
static const struct pci_epc_features*
tegra_pcie_ep_get_features(struct dw_pcie_ep *ep)
{ … }
static const struct dw_pcie_ep_ops pcie_ep_ops = …;
static int tegra_pcie_config_ep(struct tegra_pcie_dw *pcie,
struct platform_device *pdev)
{ … }
static int tegra_pcie_dw_probe(struct platform_device *pdev)
{ … }
static void tegra_pcie_dw_remove(struct platform_device *pdev)
{ … }
static int tegra_pcie_dw_suspend_late(struct device *dev)
{ … }
static int tegra_pcie_dw_suspend_noirq(struct device *dev)
{ … }
static int tegra_pcie_dw_resume_noirq(struct device *dev)
{ … }
static int tegra_pcie_dw_resume_early(struct device *dev)
{ … }
static void tegra_pcie_dw_shutdown(struct platform_device *pdev)
{ … }
static const struct tegra_pcie_dw_of_data tegra194_pcie_dw_rc_of_data = …;
static const struct tegra_pcie_dw_of_data tegra194_pcie_dw_ep_of_data = …;
static const struct tegra_pcie_dw_of_data tegra234_pcie_dw_rc_of_data = …;
static const struct tegra_pcie_dw_of_data tegra234_pcie_dw_ep_of_data = …;
static const struct of_device_id tegra_pcie_dw_of_match[] = …;
static const struct dev_pm_ops tegra_pcie_dw_pm_ops = …;
static struct platform_driver tegra_pcie_dw_driver = …;
module_platform_driver(…) …;
MODULE_DEVICE_TABLE(of, tegra_pcie_dw_of_match);
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;