linux/drivers/pci/controller/dwc/pcie-tegra194.c

// SPDX-License-Identifier: GPL-2.0+
/*
 * PCIe host controller driver for the following SoCs
 * Tegra194
 * Tegra234
 *
 * Copyright (C) 2019-2022 NVIDIA Corporation.
 *
 * Author: Vidya Sagar <[email protected]>
 */

#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();