cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pcie-tegra194.c (63994B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * PCIe host controller driver for Tegra194 SoC
      4 *
      5 * Copyright (C) 2019 NVIDIA Corporation.
      6 *
      7 * Author: Vidya Sagar <vidyas@nvidia.com>
      8 */
      9
     10#include <linux/clk.h>
     11#include <linux/debugfs.h>
     12#include <linux/delay.h>
     13#include <linux/gpio.h>
     14#include <linux/gpio/consumer.h>
     15#include <linux/interrupt.h>
     16#include <linux/iopoll.h>
     17#include <linux/kernel.h>
     18#include <linux/module.h>
     19#include <linux/of.h>
     20#include <linux/of_device.h>
     21#include <linux/of_gpio.h>
     22#include <linux/of_irq.h>
     23#include <linux/of_pci.h>
     24#include <linux/pci.h>
     25#include <linux/phy/phy.h>
     26#include <linux/pinctrl/consumer.h>
     27#include <linux/platform_device.h>
     28#include <linux/pm_runtime.h>
     29#include <linux/random.h>
     30#include <linux/reset.h>
     31#include <linux/resource.h>
     32#include <linux/types.h>
     33#include "pcie-designware.h"
     34#include <soc/tegra/bpmp.h>
     35#include <soc/tegra/bpmp-abi.h>
     36#include "../../pci.h"
     37
     38#define APPL_PINMUX				0x0
     39#define APPL_PINMUX_PEX_RST			BIT(0)
     40#define APPL_PINMUX_CLKREQ_OVERRIDE_EN		BIT(2)
     41#define APPL_PINMUX_CLKREQ_OVERRIDE		BIT(3)
     42#define APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE_EN	BIT(4)
     43#define APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE	BIT(5)
     44
     45#define APPL_CTRL				0x4
     46#define APPL_CTRL_SYS_PRE_DET_STATE		BIT(6)
     47#define APPL_CTRL_LTSSM_EN			BIT(7)
     48#define APPL_CTRL_HW_HOT_RST_EN			BIT(20)
     49#define APPL_CTRL_HW_HOT_RST_MODE_MASK		GENMASK(1, 0)
     50#define APPL_CTRL_HW_HOT_RST_MODE_SHIFT		22
     51#define APPL_CTRL_HW_HOT_RST_MODE_IMDT_RST	0x1
     52
     53#define APPL_INTR_EN_L0_0			0x8
     54#define APPL_INTR_EN_L0_0_LINK_STATE_INT_EN	BIT(0)
     55#define APPL_INTR_EN_L0_0_MSI_RCV_INT_EN	BIT(4)
     56#define APPL_INTR_EN_L0_0_INT_INT_EN		BIT(8)
     57#define APPL_INTR_EN_L0_0_PCI_CMD_EN_INT_EN	BIT(15)
     58#define APPL_INTR_EN_L0_0_CDM_REG_CHK_INT_EN	BIT(19)
     59#define APPL_INTR_EN_L0_0_SYS_INTR_EN		BIT(30)
     60#define APPL_INTR_EN_L0_0_SYS_MSI_INTR_EN	BIT(31)
     61
     62#define APPL_INTR_STATUS_L0			0xC
     63#define APPL_INTR_STATUS_L0_LINK_STATE_INT	BIT(0)
     64#define APPL_INTR_STATUS_L0_INT_INT		BIT(8)
     65#define APPL_INTR_STATUS_L0_PCI_CMD_EN_INT	BIT(15)
     66#define APPL_INTR_STATUS_L0_PEX_RST_INT		BIT(16)
     67#define APPL_INTR_STATUS_L0_CDM_REG_CHK_INT	BIT(18)
     68
     69#define APPL_INTR_EN_L1_0_0				0x1C
     70#define APPL_INTR_EN_L1_0_0_LINK_REQ_RST_NOT_INT_EN	BIT(1)
     71#define APPL_INTR_EN_L1_0_0_RDLH_LINK_UP_INT_EN		BIT(3)
     72#define APPL_INTR_EN_L1_0_0_HOT_RESET_DONE_INT_EN	BIT(30)
     73
     74#define APPL_INTR_STATUS_L1_0_0				0x20
     75#define APPL_INTR_STATUS_L1_0_0_LINK_REQ_RST_NOT_CHGED	BIT(1)
     76#define APPL_INTR_STATUS_L1_0_0_RDLH_LINK_UP_CHGED	BIT(3)
     77#define APPL_INTR_STATUS_L1_0_0_HOT_RESET_DONE		BIT(30)
     78
     79#define APPL_INTR_STATUS_L1_1			0x2C
     80#define APPL_INTR_STATUS_L1_2			0x30
     81#define APPL_INTR_STATUS_L1_3			0x34
     82#define APPL_INTR_STATUS_L1_6			0x3C
     83#define APPL_INTR_STATUS_L1_7			0x40
     84#define APPL_INTR_STATUS_L1_15_CFG_BME_CHGED	BIT(1)
     85
     86#define APPL_INTR_EN_L1_8_0			0x44
     87#define APPL_INTR_EN_L1_8_BW_MGT_INT_EN		BIT(2)
     88#define APPL_INTR_EN_L1_8_AUTO_BW_INT_EN	BIT(3)
     89#define APPL_INTR_EN_L1_8_INTX_EN		BIT(11)
     90#define APPL_INTR_EN_L1_8_AER_INT_EN		BIT(15)
     91
     92#define APPL_INTR_STATUS_L1_8_0			0x4C
     93#define APPL_INTR_STATUS_L1_8_0_EDMA_INT_MASK	GENMASK(11, 6)
     94#define APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS	BIT(2)
     95#define APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS	BIT(3)
     96
     97#define APPL_INTR_STATUS_L1_9			0x54
     98#define APPL_INTR_STATUS_L1_10			0x58
     99#define APPL_INTR_STATUS_L1_11			0x64
    100#define APPL_INTR_STATUS_L1_13			0x74
    101#define APPL_INTR_STATUS_L1_14			0x78
    102#define APPL_INTR_STATUS_L1_15			0x7C
    103#define APPL_INTR_STATUS_L1_17			0x88
    104
    105#define APPL_INTR_EN_L1_18				0x90
    106#define APPL_INTR_EN_L1_18_CDM_REG_CHK_CMPLT		BIT(2)
    107#define APPL_INTR_EN_L1_18_CDM_REG_CHK_CMP_ERR		BIT(1)
    108#define APPL_INTR_EN_L1_18_CDM_REG_CHK_LOGIC_ERR	BIT(0)
    109
    110#define APPL_INTR_STATUS_L1_18				0x94
    111#define APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMPLT	BIT(2)
    112#define APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMP_ERR	BIT(1)
    113#define APPL_INTR_STATUS_L1_18_CDM_REG_CHK_LOGIC_ERR	BIT(0)
    114
    115#define APPL_MSI_CTRL_1				0xAC
    116
    117#define APPL_MSI_CTRL_2				0xB0
    118
    119#define APPL_LEGACY_INTX			0xB8
    120
    121#define APPL_LTR_MSG_1				0xC4
    122#define LTR_MSG_REQ				BIT(15)
    123#define LTR_MST_NO_SNOOP_SHIFT			16
    124
    125#define APPL_LTR_MSG_2				0xC8
    126#define APPL_LTR_MSG_2_LTR_MSG_REQ_STATE	BIT(3)
    127
    128#define APPL_LINK_STATUS			0xCC
    129#define APPL_LINK_STATUS_RDLH_LINK_UP		BIT(0)
    130
    131#define APPL_DEBUG				0xD0
    132#define APPL_DEBUG_PM_LINKST_IN_L2_LAT		BIT(21)
    133#define APPL_DEBUG_PM_LINKST_IN_L0		0x11
    134#define APPL_DEBUG_LTSSM_STATE_MASK		GENMASK(8, 3)
    135#define APPL_DEBUG_LTSSM_STATE_SHIFT		3
    136#define LTSSM_STATE_PRE_DETECT			5
    137
    138#define APPL_RADM_STATUS			0xE4
    139#define APPL_PM_XMT_TURNOFF_STATE		BIT(0)
    140
    141#define APPL_DM_TYPE				0x100
    142#define APPL_DM_TYPE_MASK			GENMASK(3, 0)
    143#define APPL_DM_TYPE_RP				0x4
    144#define APPL_DM_TYPE_EP				0x0
    145
    146#define APPL_CFG_BASE_ADDR			0x104
    147#define APPL_CFG_BASE_ADDR_MASK			GENMASK(31, 12)
    148
    149#define APPL_CFG_IATU_DMA_BASE_ADDR		0x108
    150#define APPL_CFG_IATU_DMA_BASE_ADDR_MASK	GENMASK(31, 18)
    151
    152#define APPL_CFG_MISC				0x110
    153#define APPL_CFG_MISC_SLV_EP_MODE		BIT(14)
    154#define APPL_CFG_MISC_ARCACHE_MASK		GENMASK(13, 10)
    155#define APPL_CFG_MISC_ARCACHE_SHIFT		10
    156#define APPL_CFG_MISC_ARCACHE_VAL		3
    157
    158#define APPL_CFG_SLCG_OVERRIDE			0x114
    159#define APPL_CFG_SLCG_OVERRIDE_SLCG_EN_MASTER	BIT(0)
    160
    161#define APPL_CAR_RESET_OVRD				0x12C
    162#define APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N	BIT(0)
    163
    164#define IO_BASE_IO_DECODE				BIT(0)
    165#define IO_BASE_IO_DECODE_BIT8				BIT(8)
    166
    167#define CFG_PREF_MEM_LIMIT_BASE_MEM_DECODE		BIT(0)
    168#define CFG_PREF_MEM_LIMIT_BASE_MEM_LIMIT_DECODE	BIT(16)
    169
    170#define CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF	0x718
    171#define CFG_TIMER_CTRL_ACK_NAK_SHIFT	(19)
    172
    173#define EVENT_COUNTER_ALL_CLEAR		0x3
    174#define EVENT_COUNTER_ENABLE_ALL	0x7
    175#define EVENT_COUNTER_ENABLE_SHIFT	2
    176#define EVENT_COUNTER_EVENT_SEL_MASK	GENMASK(7, 0)
    177#define EVENT_COUNTER_EVENT_SEL_SHIFT	16
    178#define EVENT_COUNTER_EVENT_Tx_L0S	0x2
    179#define EVENT_COUNTER_EVENT_Rx_L0S	0x3
    180#define EVENT_COUNTER_EVENT_L1		0x5
    181#define EVENT_COUNTER_EVENT_L1_1	0x7
    182#define EVENT_COUNTER_EVENT_L1_2	0x8
    183#define EVENT_COUNTER_GROUP_SEL_SHIFT	24
    184#define EVENT_COUNTER_GROUP_5		0x5
    185
    186#define N_FTS_VAL					52
    187#define FTS_VAL						52
    188
    189#define GEN3_EQ_CONTROL_OFF			0x8a8
    190#define GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_SHIFT	8
    191#define GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_MASK	GENMASK(23, 8)
    192#define GEN3_EQ_CONTROL_OFF_FB_MODE_MASK	GENMASK(3, 0)
    193
    194#define GEN3_RELATED_OFF			0x890
    195#define GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL	BIT(0)
    196#define GEN3_RELATED_OFF_GEN3_EQ_DISABLE	BIT(16)
    197#define GEN3_RELATED_OFF_RATE_SHADOW_SEL_SHIFT	24
    198#define GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK	GENMASK(25, 24)
    199
    200#define PORT_LOGIC_AMBA_ERROR_RESPONSE_DEFAULT	0x8D0
    201#define AMBA_ERROR_RESPONSE_CRS_SHIFT		3
    202#define AMBA_ERROR_RESPONSE_CRS_MASK		GENMASK(1, 0)
    203#define AMBA_ERROR_RESPONSE_CRS_OKAY		0
    204#define AMBA_ERROR_RESPONSE_CRS_OKAY_FFFFFFFF	1
    205#define AMBA_ERROR_RESPONSE_CRS_OKAY_FFFF0001	2
    206
    207#define MSIX_ADDR_MATCH_LOW_OFF			0x940
    208#define MSIX_ADDR_MATCH_LOW_OFF_EN		BIT(0)
    209#define MSIX_ADDR_MATCH_LOW_OFF_MASK		GENMASK(31, 2)
    210
    211#define MSIX_ADDR_MATCH_HIGH_OFF		0x944
    212#define MSIX_ADDR_MATCH_HIGH_OFF_MASK		GENMASK(31, 0)
    213
    214#define PORT_LOGIC_MSIX_DOORBELL			0x948
    215
    216#define CAP_SPCIE_CAP_OFF			0x154
    217#define CAP_SPCIE_CAP_OFF_DSP_TX_PRESET0_MASK	GENMASK(3, 0)
    218#define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_MASK	GENMASK(11, 8)
    219#define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_SHIFT	8
    220
    221#define PME_ACK_TIMEOUT 10000
    222
    223#define LTSSM_TIMEOUT 50000	/* 50ms */
    224
    225#define GEN3_GEN4_EQ_PRESET_INIT	5
    226
    227#define GEN1_CORE_CLK_FREQ	62500000
    228#define GEN2_CORE_CLK_FREQ	125000000
    229#define GEN3_CORE_CLK_FREQ	250000000
    230#define GEN4_CORE_CLK_FREQ	500000000
    231
    232#define LTR_MSG_TIMEOUT		(100 * 1000)
    233
    234#define PERST_DEBOUNCE_TIME	(5 * 1000)
    235
    236#define EP_STATE_DISABLED	0
    237#define EP_STATE_ENABLED	1
    238
    239static const unsigned int pcie_gen_freq[] = {
    240	GEN1_CORE_CLK_FREQ,
    241	GEN2_CORE_CLK_FREQ,
    242	GEN3_CORE_CLK_FREQ,
    243	GEN4_CORE_CLK_FREQ
    244};
    245
    246struct tegra194_pcie {
    247	struct device *dev;
    248	struct resource *appl_res;
    249	struct resource *dbi_res;
    250	struct resource *atu_dma_res;
    251	void __iomem *appl_base;
    252	struct clk *core_clk;
    253	struct reset_control *core_apb_rst;
    254	struct reset_control *core_rst;
    255	struct dw_pcie pci;
    256	struct tegra_bpmp *bpmp;
    257
    258	enum dw_pcie_device_mode mode;
    259
    260	bool supports_clkreq;
    261	bool enable_cdm_check;
    262	bool link_state;
    263	bool update_fc_fixup;
    264	u8 init_link_width;
    265	u32 msi_ctrl_int;
    266	u32 num_lanes;
    267	u32 cid;
    268	u32 cfg_link_cap_l1sub;
    269	u32 pcie_cap_base;
    270	u32 aspm_cmrt;
    271	u32 aspm_pwr_on_t;
    272	u32 aspm_l0s_enter_lat;
    273
    274	struct regulator *pex_ctl_supply;
    275	struct regulator *slot_ctl_3v3;
    276	struct regulator *slot_ctl_12v;
    277
    278	unsigned int phy_count;
    279	struct phy **phys;
    280
    281	struct dentry *debugfs;
    282
    283	/* Endpoint mode specific */
    284	struct gpio_desc *pex_rst_gpiod;
    285	struct gpio_desc *pex_refclk_sel_gpiod;
    286	unsigned int pex_rst_irq;
    287	int ep_state;
    288};
    289
    290struct tegra194_pcie_of_data {
    291	enum dw_pcie_device_mode mode;
    292};
    293
    294static inline struct tegra194_pcie *to_tegra_pcie(struct dw_pcie *pci)
    295{
    296	return container_of(pci, struct tegra194_pcie, pci);
    297}
    298
    299static inline void appl_writel(struct tegra194_pcie *pcie, const u32 value,
    300			       const u32 reg)
    301{
    302	writel_relaxed(value, pcie->appl_base + reg);
    303}
    304
    305static inline u32 appl_readl(struct tegra194_pcie *pcie, const u32 reg)
    306{
    307	return readl_relaxed(pcie->appl_base + reg);
    308}
    309
    310struct tegra_pcie_soc {
    311	enum dw_pcie_device_mode mode;
    312};
    313
    314static void apply_bad_link_workaround(struct pcie_port *pp)
    315{
    316	struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
    317	struct tegra194_pcie *pcie = to_tegra_pcie(pci);
    318	u32 current_link_width;
    319	u16 val;
    320
    321	/*
    322	 * NOTE:- Since this scenario is uncommon and link as such is not
    323	 * stable anyway, not waiting to confirm if link is really
    324	 * transitioning to Gen-2 speed
    325	 */
    326	val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA);
    327	if (val & PCI_EXP_LNKSTA_LBMS) {
    328		current_link_width = (val & PCI_EXP_LNKSTA_NLW) >>
    329				     PCI_EXP_LNKSTA_NLW_SHIFT;
    330		if (pcie->init_link_width > current_link_width) {
    331			dev_warn(pci->dev, "PCIe link is bad, width reduced\n");
    332			val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base +
    333						PCI_EXP_LNKCTL2);
    334			val &= ~PCI_EXP_LNKCTL2_TLS;
    335			val |= PCI_EXP_LNKCTL2_TLS_2_5GT;
    336			dw_pcie_writew_dbi(pci, pcie->pcie_cap_base +
    337					   PCI_EXP_LNKCTL2, val);
    338
    339			val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base +
    340						PCI_EXP_LNKCTL);
    341			val |= PCI_EXP_LNKCTL_RL;
    342			dw_pcie_writew_dbi(pci, pcie->pcie_cap_base +
    343					   PCI_EXP_LNKCTL, val);
    344		}
    345	}
    346}
    347
    348static irqreturn_t tegra_pcie_rp_irq_handler(int irq, void *arg)
    349{
    350	struct tegra194_pcie *pcie = arg;
    351	struct dw_pcie *pci = &pcie->pci;
    352	struct pcie_port *pp = &pci->pp;
    353	u32 val, tmp;
    354	u16 val_w;
    355
    356	val = appl_readl(pcie, APPL_INTR_STATUS_L0);
    357	if (val & APPL_INTR_STATUS_L0_LINK_STATE_INT) {
    358		val = appl_readl(pcie, APPL_INTR_STATUS_L1_0_0);
    359		if (val & APPL_INTR_STATUS_L1_0_0_LINK_REQ_RST_NOT_CHGED) {
    360			appl_writel(pcie, val, APPL_INTR_STATUS_L1_0_0);
    361
    362			/* SBR & Surprise Link Down WAR */
    363			val = appl_readl(pcie, APPL_CAR_RESET_OVRD);
    364			val &= ~APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N;
    365			appl_writel(pcie, val, APPL_CAR_RESET_OVRD);
    366			udelay(1);
    367			val = appl_readl(pcie, APPL_CAR_RESET_OVRD);
    368			val |= APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N;
    369			appl_writel(pcie, val, APPL_CAR_RESET_OVRD);
    370
    371			val = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL);
    372			val |= PORT_LOGIC_SPEED_CHANGE;
    373			dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val);
    374		}
    375	}
    376
    377	if (val & APPL_INTR_STATUS_L0_INT_INT) {
    378		val = appl_readl(pcie, APPL_INTR_STATUS_L1_8_0);
    379		if (val & APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS) {
    380			appl_writel(pcie,
    381				    APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS,
    382				    APPL_INTR_STATUS_L1_8_0);
    383			apply_bad_link_workaround(pp);
    384		}
    385		if (val & APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS) {
    386			appl_writel(pcie,
    387				    APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS,
    388				    APPL_INTR_STATUS_L1_8_0);
    389
    390			val_w = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base +
    391						  PCI_EXP_LNKSTA);
    392			dev_dbg(pci->dev, "Link Speed : Gen-%u\n", val_w &
    393				PCI_EXP_LNKSTA_CLS);
    394		}
    395	}
    396
    397	val = appl_readl(pcie, APPL_INTR_STATUS_L0);
    398	if (val & APPL_INTR_STATUS_L0_CDM_REG_CHK_INT) {
    399		val = appl_readl(pcie, APPL_INTR_STATUS_L1_18);
    400		tmp = dw_pcie_readl_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS);
    401		if (val & APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMPLT) {
    402			dev_info(pci->dev, "CDM check complete\n");
    403			tmp |= PCIE_PL_CHK_REG_CHK_REG_COMPLETE;
    404		}
    405		if (val & APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMP_ERR) {
    406			dev_err(pci->dev, "CDM comparison mismatch\n");
    407			tmp |= PCIE_PL_CHK_REG_CHK_REG_COMPARISON_ERROR;
    408		}
    409		if (val & APPL_INTR_STATUS_L1_18_CDM_REG_CHK_LOGIC_ERR) {
    410			dev_err(pci->dev, "CDM Logic error\n");
    411			tmp |= PCIE_PL_CHK_REG_CHK_REG_LOGIC_ERROR;
    412		}
    413		dw_pcie_writel_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS, tmp);
    414		tmp = dw_pcie_readl_dbi(pci, PCIE_PL_CHK_REG_ERR_ADDR);
    415		dev_err(pci->dev, "CDM Error Address Offset = 0x%08X\n", tmp);
    416	}
    417
    418	return IRQ_HANDLED;
    419}
    420
    421static void pex_ep_event_hot_rst_done(struct tegra194_pcie *pcie)
    422{
    423	u32 val;
    424
    425	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L0);
    426	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0);
    427	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_1);
    428	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_2);
    429	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_3);
    430	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_6);
    431	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_7);
    432	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_8_0);
    433	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_9);
    434	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_10);
    435	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_11);
    436	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_13);
    437	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_14);
    438	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_15);
    439	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_17);
    440	appl_writel(pcie, 0xFFFFFFFF, APPL_MSI_CTRL_2);
    441
    442	val = appl_readl(pcie, APPL_CTRL);
    443	val |= APPL_CTRL_LTSSM_EN;
    444	appl_writel(pcie, val, APPL_CTRL);
    445}
    446
    447static irqreturn_t tegra_pcie_ep_irq_thread(int irq, void *arg)
    448{
    449	struct tegra194_pcie *pcie = arg;
    450	struct dw_pcie *pci = &pcie->pci;
    451	u32 val, speed;
    452
    453	speed = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) &
    454		PCI_EXP_LNKSTA_CLS;
    455	clk_set_rate(pcie->core_clk, pcie_gen_freq[speed - 1]);
    456
    457	/* If EP doesn't advertise L1SS, just return */
    458	val = dw_pcie_readl_dbi(pci, pcie->cfg_link_cap_l1sub);
    459	if (!(val & (PCI_L1SS_CAP_ASPM_L1_1 | PCI_L1SS_CAP_ASPM_L1_2)))
    460		return IRQ_HANDLED;
    461
    462	/* Check if BME is set to '1' */
    463	val = dw_pcie_readl_dbi(pci, PCI_COMMAND);
    464	if (val & PCI_COMMAND_MASTER) {
    465		ktime_t timeout;
    466
    467		/* 110us for both snoop and no-snoop */
    468		val = 110 | (2 << PCI_LTR_SCALE_SHIFT) | LTR_MSG_REQ;
    469		val |= (val << LTR_MST_NO_SNOOP_SHIFT);
    470		appl_writel(pcie, val, APPL_LTR_MSG_1);
    471
    472		/* Send LTR upstream */
    473		val = appl_readl(pcie, APPL_LTR_MSG_2);
    474		val |= APPL_LTR_MSG_2_LTR_MSG_REQ_STATE;
    475		appl_writel(pcie, val, APPL_LTR_MSG_2);
    476
    477		timeout = ktime_add_us(ktime_get(), LTR_MSG_TIMEOUT);
    478		for (;;) {
    479			val = appl_readl(pcie, APPL_LTR_MSG_2);
    480			if (!(val & APPL_LTR_MSG_2_LTR_MSG_REQ_STATE))
    481				break;
    482			if (ktime_after(ktime_get(), timeout))
    483				break;
    484			usleep_range(1000, 1100);
    485		}
    486		if (val & APPL_LTR_MSG_2_LTR_MSG_REQ_STATE)
    487			dev_err(pcie->dev, "Failed to send LTR message\n");
    488	}
    489
    490	return IRQ_HANDLED;
    491}
    492
    493static irqreturn_t tegra_pcie_ep_hard_irq(int irq, void *arg)
    494{
    495	struct tegra194_pcie *pcie = arg;
    496	struct dw_pcie_ep *ep = &pcie->pci.ep;
    497	int spurious = 1;
    498	u32 status_l0, status_l1, link_status;
    499
    500	status_l0 = appl_readl(pcie, APPL_INTR_STATUS_L0);
    501	if (status_l0 & APPL_INTR_STATUS_L0_LINK_STATE_INT) {
    502		status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_0_0);
    503		appl_writel(pcie, status_l1, APPL_INTR_STATUS_L1_0_0);
    504
    505		if (status_l1 & APPL_INTR_STATUS_L1_0_0_HOT_RESET_DONE)
    506			pex_ep_event_hot_rst_done(pcie);
    507
    508		if (status_l1 & APPL_INTR_STATUS_L1_0_0_RDLH_LINK_UP_CHGED) {
    509			link_status = appl_readl(pcie, APPL_LINK_STATUS);
    510			if (link_status & APPL_LINK_STATUS_RDLH_LINK_UP) {
    511				dev_dbg(pcie->dev, "Link is up with Host\n");
    512				dw_pcie_ep_linkup(ep);
    513			}
    514		}
    515
    516		spurious = 0;
    517	}
    518
    519	if (status_l0 & APPL_INTR_STATUS_L0_PCI_CMD_EN_INT) {
    520		status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_15);
    521		appl_writel(pcie, status_l1, APPL_INTR_STATUS_L1_15);
    522
    523		if (status_l1 & APPL_INTR_STATUS_L1_15_CFG_BME_CHGED)
    524			return IRQ_WAKE_THREAD;
    525
    526		spurious = 0;
    527	}
    528
    529	if (spurious) {
    530		dev_warn(pcie->dev, "Random interrupt (STATUS = 0x%08X)\n",
    531			 status_l0);
    532		appl_writel(pcie, status_l0, APPL_INTR_STATUS_L0);
    533	}
    534
    535	return IRQ_HANDLED;
    536}
    537
    538static int tegra194_pcie_rd_own_conf(struct pci_bus *bus, u32 devfn, int where,
    539				     int size, u32 *val)
    540{
    541	/*
    542	 * This is an endpoint mode specific register happen to appear even
    543	 * when controller is operating in root port mode and system hangs
    544	 * when it is accessed with link being in ASPM-L1 state.
    545	 * So skip accessing it altogether
    546	 */
    547	if (!PCI_SLOT(devfn) && where == PORT_LOGIC_MSIX_DOORBELL) {
    548		*val = 0x00000000;
    549		return PCIBIOS_SUCCESSFUL;
    550	}
    551
    552	return pci_generic_config_read(bus, devfn, where, size, val);
    553}
    554
    555static int tegra194_pcie_wr_own_conf(struct pci_bus *bus, u32 devfn, int where,
    556				     int size, u32 val)
    557{
    558	/*
    559	 * This is an endpoint mode specific register happen to appear even
    560	 * when controller is operating in root port mode and system hangs
    561	 * when it is accessed with link being in ASPM-L1 state.
    562	 * So skip accessing it altogether
    563	 */
    564	if (!PCI_SLOT(devfn) && where == PORT_LOGIC_MSIX_DOORBELL)
    565		return PCIBIOS_SUCCESSFUL;
    566
    567	return pci_generic_config_write(bus, devfn, where, size, val);
    568}
    569
    570static struct pci_ops tegra_pci_ops = {
    571	.map_bus = dw_pcie_own_conf_map_bus,
    572	.read = tegra194_pcie_rd_own_conf,
    573	.write = tegra194_pcie_wr_own_conf,
    574};
    575
    576#if defined(CONFIG_PCIEASPM)
    577static const u32 event_cntr_ctrl_offset[] = {
    578	0x1d8,
    579	0x1a8,
    580	0x1a8,
    581	0x1a8,
    582	0x1c4,
    583	0x1d8
    584};
    585
    586static const u32 event_cntr_data_offset[] = {
    587	0x1dc,
    588	0x1ac,
    589	0x1ac,
    590	0x1ac,
    591	0x1c8,
    592	0x1dc
    593};
    594
    595static void disable_aspm_l11(struct tegra194_pcie *pcie)
    596{
    597	u32 val;
    598
    599	val = dw_pcie_readl_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub);
    600	val &= ~PCI_L1SS_CAP_ASPM_L1_1;
    601	dw_pcie_writel_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub, val);
    602}
    603
    604static void disable_aspm_l12(struct tegra194_pcie *pcie)
    605{
    606	u32 val;
    607
    608	val = dw_pcie_readl_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub);
    609	val &= ~PCI_L1SS_CAP_ASPM_L1_2;
    610	dw_pcie_writel_dbi(&pcie->pci, pcie->cfg_link_cap_l1sub, val);
    611}
    612
    613static inline u32 event_counter_prog(struct tegra194_pcie *pcie, u32 event)
    614{
    615	u32 val;
    616
    617	val = dw_pcie_readl_dbi(&pcie->pci, event_cntr_ctrl_offset[pcie->cid]);
    618	val &= ~(EVENT_COUNTER_EVENT_SEL_MASK << EVENT_COUNTER_EVENT_SEL_SHIFT);
    619	val |= EVENT_COUNTER_GROUP_5 << EVENT_COUNTER_GROUP_SEL_SHIFT;
    620	val |= event << EVENT_COUNTER_EVENT_SEL_SHIFT;
    621	val |= EVENT_COUNTER_ENABLE_ALL << EVENT_COUNTER_ENABLE_SHIFT;
    622	dw_pcie_writel_dbi(&pcie->pci, event_cntr_ctrl_offset[pcie->cid], val);
    623	val = dw_pcie_readl_dbi(&pcie->pci, event_cntr_data_offset[pcie->cid]);
    624
    625	return val;
    626}
    627
    628static int aspm_state_cnt(struct seq_file *s, void *data)
    629{
    630	struct tegra194_pcie *pcie = (struct tegra194_pcie *)
    631				     dev_get_drvdata(s->private);
    632	u32 val;
    633
    634	seq_printf(s, "Tx L0s entry count : %u\n",
    635		   event_counter_prog(pcie, EVENT_COUNTER_EVENT_Tx_L0S));
    636
    637	seq_printf(s, "Rx L0s entry count : %u\n",
    638		   event_counter_prog(pcie, EVENT_COUNTER_EVENT_Rx_L0S));
    639
    640	seq_printf(s, "Link L1 entry count : %u\n",
    641		   event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1));
    642
    643	seq_printf(s, "Link L1.1 entry count : %u\n",
    644		   event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1_1));
    645
    646	seq_printf(s, "Link L1.2 entry count : %u\n",
    647		   event_counter_prog(pcie, EVENT_COUNTER_EVENT_L1_2));
    648
    649	/* Clear all counters */
    650	dw_pcie_writel_dbi(&pcie->pci, event_cntr_ctrl_offset[pcie->cid],
    651			   EVENT_COUNTER_ALL_CLEAR);
    652
    653	/* Re-enable counting */
    654	val = EVENT_COUNTER_ENABLE_ALL << EVENT_COUNTER_ENABLE_SHIFT;
    655	val |= EVENT_COUNTER_GROUP_5 << EVENT_COUNTER_GROUP_SEL_SHIFT;
    656	dw_pcie_writel_dbi(&pcie->pci, event_cntr_ctrl_offset[pcie->cid], val);
    657
    658	return 0;
    659}
    660
    661static void init_host_aspm(struct tegra194_pcie *pcie)
    662{
    663	struct dw_pcie *pci = &pcie->pci;
    664	u32 val;
    665
    666	val = dw_pcie_find_ext_capability(pci, PCI_EXT_CAP_ID_L1SS);
    667	pcie->cfg_link_cap_l1sub = val + PCI_L1SS_CAP;
    668
    669	/* Enable ASPM counters */
    670	val = EVENT_COUNTER_ENABLE_ALL << EVENT_COUNTER_ENABLE_SHIFT;
    671	val |= EVENT_COUNTER_GROUP_5 << EVENT_COUNTER_GROUP_SEL_SHIFT;
    672	dw_pcie_writel_dbi(pci, event_cntr_ctrl_offset[pcie->cid], val);
    673
    674	/* Program T_cmrt and T_pwr_on values */
    675	val = dw_pcie_readl_dbi(pci, pcie->cfg_link_cap_l1sub);
    676	val &= ~(PCI_L1SS_CAP_CM_RESTORE_TIME | PCI_L1SS_CAP_P_PWR_ON_VALUE);
    677	val |= (pcie->aspm_cmrt << 8);
    678	val |= (pcie->aspm_pwr_on_t << 19);
    679	dw_pcie_writel_dbi(pci, pcie->cfg_link_cap_l1sub, val);
    680
    681	/* Program L0s and L1 entrance latencies */
    682	val = dw_pcie_readl_dbi(pci, PCIE_PORT_AFR);
    683	val &= ~PORT_AFR_L0S_ENTRANCE_LAT_MASK;
    684	val |= (pcie->aspm_l0s_enter_lat << PORT_AFR_L0S_ENTRANCE_LAT_SHIFT);
    685	val |= PORT_AFR_ENTER_ASPM;
    686	dw_pcie_writel_dbi(pci, PCIE_PORT_AFR, val);
    687}
    688
    689static void init_debugfs(struct tegra194_pcie *pcie)
    690{
    691	debugfs_create_devm_seqfile(pcie->dev, "aspm_state_cnt", pcie->debugfs,
    692				    aspm_state_cnt);
    693}
    694#else
    695static inline void disable_aspm_l12(struct tegra194_pcie *pcie) { return; }
    696static inline void disable_aspm_l11(struct tegra194_pcie *pcie) { return; }
    697static inline void init_host_aspm(struct tegra194_pcie *pcie) { return; }
    698static inline void init_debugfs(struct tegra194_pcie *pcie) { return; }
    699#endif
    700
    701static void tegra_pcie_enable_system_interrupts(struct pcie_port *pp)
    702{
    703	struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
    704	struct tegra194_pcie *pcie = to_tegra_pcie(pci);
    705	u32 val;
    706	u16 val_w;
    707
    708	val = appl_readl(pcie, APPL_INTR_EN_L0_0);
    709	val |= APPL_INTR_EN_L0_0_LINK_STATE_INT_EN;
    710	appl_writel(pcie, val, APPL_INTR_EN_L0_0);
    711
    712	val = appl_readl(pcie, APPL_INTR_EN_L1_0_0);
    713	val |= APPL_INTR_EN_L1_0_0_LINK_REQ_RST_NOT_INT_EN;
    714	appl_writel(pcie, val, APPL_INTR_EN_L1_0_0);
    715
    716	if (pcie->enable_cdm_check) {
    717		val = appl_readl(pcie, APPL_INTR_EN_L0_0);
    718		val |= APPL_INTR_EN_L0_0_CDM_REG_CHK_INT_EN;
    719		appl_writel(pcie, val, APPL_INTR_EN_L0_0);
    720
    721		val = appl_readl(pcie, APPL_INTR_EN_L1_18);
    722		val |= APPL_INTR_EN_L1_18_CDM_REG_CHK_CMP_ERR;
    723		val |= APPL_INTR_EN_L1_18_CDM_REG_CHK_LOGIC_ERR;
    724		appl_writel(pcie, val, APPL_INTR_EN_L1_18);
    725	}
    726
    727	val_w = dw_pcie_readw_dbi(&pcie->pci, pcie->pcie_cap_base +
    728				  PCI_EXP_LNKSTA);
    729	pcie->init_link_width = (val_w & PCI_EXP_LNKSTA_NLW) >>
    730				PCI_EXP_LNKSTA_NLW_SHIFT;
    731
    732	val_w = dw_pcie_readw_dbi(&pcie->pci, pcie->pcie_cap_base +
    733				  PCI_EXP_LNKCTL);
    734	val_w |= PCI_EXP_LNKCTL_LBMIE;
    735	dw_pcie_writew_dbi(&pcie->pci, pcie->pcie_cap_base + PCI_EXP_LNKCTL,
    736			   val_w);
    737}
    738
    739static void tegra_pcie_enable_legacy_interrupts(struct pcie_port *pp)
    740{
    741	struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
    742	struct tegra194_pcie *pcie = to_tegra_pcie(pci);
    743	u32 val;
    744
    745	/* Enable legacy interrupt generation */
    746	val = appl_readl(pcie, APPL_INTR_EN_L0_0);
    747	val |= APPL_INTR_EN_L0_0_SYS_INTR_EN;
    748	val |= APPL_INTR_EN_L0_0_INT_INT_EN;
    749	appl_writel(pcie, val, APPL_INTR_EN_L0_0);
    750
    751	val = appl_readl(pcie, APPL_INTR_EN_L1_8_0);
    752	val |= APPL_INTR_EN_L1_8_INTX_EN;
    753	val |= APPL_INTR_EN_L1_8_AUTO_BW_INT_EN;
    754	val |= APPL_INTR_EN_L1_8_BW_MGT_INT_EN;
    755	if (IS_ENABLED(CONFIG_PCIEAER))
    756		val |= APPL_INTR_EN_L1_8_AER_INT_EN;
    757	appl_writel(pcie, val, APPL_INTR_EN_L1_8_0);
    758}
    759
    760static void tegra_pcie_enable_msi_interrupts(struct pcie_port *pp)
    761{
    762	struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
    763	struct tegra194_pcie *pcie = to_tegra_pcie(pci);
    764	u32 val;
    765
    766	/* Enable MSI interrupt generation */
    767	val = appl_readl(pcie, APPL_INTR_EN_L0_0);
    768	val |= APPL_INTR_EN_L0_0_SYS_MSI_INTR_EN;
    769	val |= APPL_INTR_EN_L0_0_MSI_RCV_INT_EN;
    770	appl_writel(pcie, val, APPL_INTR_EN_L0_0);
    771}
    772
    773static void tegra_pcie_enable_interrupts(struct pcie_port *pp)
    774{
    775	struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
    776	struct tegra194_pcie *pcie = to_tegra_pcie(pci);
    777
    778	/* Clear interrupt statuses before enabling interrupts */
    779	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L0);
    780	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0);
    781	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_1);
    782	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_2);
    783	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_3);
    784	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_6);
    785	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_7);
    786	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_8_0);
    787	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_9);
    788	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_10);
    789	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_11);
    790	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_13);
    791	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_14);
    792	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_15);
    793	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_17);
    794
    795	tegra_pcie_enable_system_interrupts(pp);
    796	tegra_pcie_enable_legacy_interrupts(pp);
    797	if (IS_ENABLED(CONFIG_PCI_MSI))
    798		tegra_pcie_enable_msi_interrupts(pp);
    799}
    800
    801static void config_gen3_gen4_eq_presets(struct tegra194_pcie *pcie)
    802{
    803	struct dw_pcie *pci = &pcie->pci;
    804	u32 val, offset, i;
    805
    806	/* Program init preset */
    807	for (i = 0; i < pcie->num_lanes; i++) {
    808		val = dw_pcie_readw_dbi(pci, CAP_SPCIE_CAP_OFF + (i * 2));
    809		val &= ~CAP_SPCIE_CAP_OFF_DSP_TX_PRESET0_MASK;
    810		val |= GEN3_GEN4_EQ_PRESET_INIT;
    811		val &= ~CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_MASK;
    812		val |= (GEN3_GEN4_EQ_PRESET_INIT <<
    813			   CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_SHIFT);
    814		dw_pcie_writew_dbi(pci, CAP_SPCIE_CAP_OFF + (i * 2), val);
    815
    816		offset = dw_pcie_find_ext_capability(pci,
    817						     PCI_EXT_CAP_ID_PL_16GT) +
    818				PCI_PL_16GT_LE_CTRL;
    819		val = dw_pcie_readb_dbi(pci, offset + i);
    820		val &= ~PCI_PL_16GT_LE_CTRL_DSP_TX_PRESET_MASK;
    821		val |= GEN3_GEN4_EQ_PRESET_INIT;
    822		val &= ~PCI_PL_16GT_LE_CTRL_USP_TX_PRESET_MASK;
    823		val |= (GEN3_GEN4_EQ_PRESET_INIT <<
    824			PCI_PL_16GT_LE_CTRL_USP_TX_PRESET_SHIFT);
    825		dw_pcie_writeb_dbi(pci, offset + i, val);
    826	}
    827
    828	val = dw_pcie_readl_dbi(pci, GEN3_RELATED_OFF);
    829	val &= ~GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK;
    830	dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
    831
    832	val = dw_pcie_readl_dbi(pci, GEN3_EQ_CONTROL_OFF);
    833	val &= ~GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_MASK;
    834	val |= (0x3ff << GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_SHIFT);
    835	val &= ~GEN3_EQ_CONTROL_OFF_FB_MODE_MASK;
    836	dw_pcie_writel_dbi(pci, GEN3_EQ_CONTROL_OFF, val);
    837
    838	val = dw_pcie_readl_dbi(pci, GEN3_RELATED_OFF);
    839	val &= ~GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK;
    840	val |= (0x1 << GEN3_RELATED_OFF_RATE_SHADOW_SEL_SHIFT);
    841	dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
    842
    843	val = dw_pcie_readl_dbi(pci, GEN3_EQ_CONTROL_OFF);
    844	val &= ~GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_MASK;
    845	val |= (0x360 << GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC_SHIFT);
    846	val &= ~GEN3_EQ_CONTROL_OFF_FB_MODE_MASK;
    847	dw_pcie_writel_dbi(pci, GEN3_EQ_CONTROL_OFF, val);
    848
    849	val = dw_pcie_readl_dbi(pci, GEN3_RELATED_OFF);
    850	val &= ~GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK;
    851	dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
    852}
    853
    854static int tegra194_pcie_host_init(struct pcie_port *pp)
    855{
    856	struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
    857	struct tegra194_pcie *pcie = to_tegra_pcie(pci);
    858	u32 val;
    859
    860	pp->bridge->ops = &tegra_pci_ops;
    861
    862	if (!pcie->pcie_cap_base)
    863		pcie->pcie_cap_base = dw_pcie_find_capability(&pcie->pci,
    864							      PCI_CAP_ID_EXP);
    865
    866	val = dw_pcie_readl_dbi(pci, PCI_IO_BASE);
    867	val &= ~(IO_BASE_IO_DECODE | IO_BASE_IO_DECODE_BIT8);
    868	dw_pcie_writel_dbi(pci, PCI_IO_BASE, val);
    869
    870	val = dw_pcie_readl_dbi(pci, PCI_PREF_MEMORY_BASE);
    871	val |= CFG_PREF_MEM_LIMIT_BASE_MEM_DECODE;
    872	val |= CFG_PREF_MEM_LIMIT_BASE_MEM_LIMIT_DECODE;
    873	dw_pcie_writel_dbi(pci, PCI_PREF_MEMORY_BASE, val);
    874
    875	dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_0, 0);
    876
    877	/* Enable as 0xFFFF0001 response for CRS */
    878	val = dw_pcie_readl_dbi(pci, PORT_LOGIC_AMBA_ERROR_RESPONSE_DEFAULT);
    879	val &= ~(AMBA_ERROR_RESPONSE_CRS_MASK << AMBA_ERROR_RESPONSE_CRS_SHIFT);
    880	val |= (AMBA_ERROR_RESPONSE_CRS_OKAY_FFFF0001 <<
    881		AMBA_ERROR_RESPONSE_CRS_SHIFT);
    882	dw_pcie_writel_dbi(pci, PORT_LOGIC_AMBA_ERROR_RESPONSE_DEFAULT, val);
    883
    884	/* Configure Max lane width from DT */
    885	val = dw_pcie_readl_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKCAP);
    886	val &= ~PCI_EXP_LNKCAP_MLW;
    887	val |= (pcie->num_lanes << PCI_EXP_LNKSTA_NLW_SHIFT);
    888	dw_pcie_writel_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKCAP, val);
    889
    890	config_gen3_gen4_eq_presets(pcie);
    891
    892	init_host_aspm(pcie);
    893
    894	/* Disable ASPM-L1SS advertisement if there is no CLKREQ routing */
    895	if (!pcie->supports_clkreq) {
    896		disable_aspm_l11(pcie);
    897		disable_aspm_l12(pcie);
    898	}
    899
    900	val = dw_pcie_readl_dbi(pci, GEN3_RELATED_OFF);
    901	val &= ~GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL;
    902	dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
    903
    904	if (pcie->update_fc_fixup) {
    905		val = dw_pcie_readl_dbi(pci, CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF);
    906		val |= 0x1 << CFG_TIMER_CTRL_ACK_NAK_SHIFT;
    907		dw_pcie_writel_dbi(pci, CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF, val);
    908	}
    909
    910	clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ);
    911
    912	return 0;
    913}
    914
    915static int tegra194_pcie_start_link(struct dw_pcie *pci)
    916{
    917	u32 val, offset, speed, tmp;
    918	struct tegra194_pcie *pcie = to_tegra_pcie(pci);
    919	struct pcie_port *pp = &pci->pp;
    920	bool retry = true;
    921
    922	if (pcie->mode == DW_PCIE_EP_TYPE) {
    923		enable_irq(pcie->pex_rst_irq);
    924		return 0;
    925	}
    926
    927retry_link:
    928	/* Assert RST */
    929	val = appl_readl(pcie, APPL_PINMUX);
    930	val &= ~APPL_PINMUX_PEX_RST;
    931	appl_writel(pcie, val, APPL_PINMUX);
    932
    933	usleep_range(100, 200);
    934
    935	/* Enable LTSSM */
    936	val = appl_readl(pcie, APPL_CTRL);
    937	val |= APPL_CTRL_LTSSM_EN;
    938	appl_writel(pcie, val, APPL_CTRL);
    939
    940	/* De-assert RST */
    941	val = appl_readl(pcie, APPL_PINMUX);
    942	val |= APPL_PINMUX_PEX_RST;
    943	appl_writel(pcie, val, APPL_PINMUX);
    944
    945	msleep(100);
    946
    947	if (dw_pcie_wait_for_link(pci)) {
    948		if (!retry)
    949			return 0;
    950		/*
    951		 * There are some endpoints which can't get the link up if
    952		 * root port has Data Link Feature (DLF) enabled.
    953		 * Refer Spec rev 4.0 ver 1.0 sec 3.4.2 & 7.7.4 for more info
    954		 * on Scaled Flow Control and DLF.
    955		 * So, need to confirm that is indeed the case here and attempt
    956		 * link up once again with DLF disabled.
    957		 */
    958		val = appl_readl(pcie, APPL_DEBUG);
    959		val &= APPL_DEBUG_LTSSM_STATE_MASK;
    960		val >>= APPL_DEBUG_LTSSM_STATE_SHIFT;
    961		tmp = appl_readl(pcie, APPL_LINK_STATUS);
    962		tmp &= APPL_LINK_STATUS_RDLH_LINK_UP;
    963		if (!(val == 0x11 && !tmp)) {
    964			/* Link is down for all good reasons */
    965			return 0;
    966		}
    967
    968		dev_info(pci->dev, "Link is down in DLL");
    969		dev_info(pci->dev, "Trying again with DLFE disabled\n");
    970		/* Disable LTSSM */
    971		val = appl_readl(pcie, APPL_CTRL);
    972		val &= ~APPL_CTRL_LTSSM_EN;
    973		appl_writel(pcie, val, APPL_CTRL);
    974
    975		reset_control_assert(pcie->core_rst);
    976		reset_control_deassert(pcie->core_rst);
    977
    978		offset = dw_pcie_find_ext_capability(pci, PCI_EXT_CAP_ID_DLF);
    979		val = dw_pcie_readl_dbi(pci, offset + PCI_DLF_CAP);
    980		val &= ~PCI_DLF_EXCHANGE_ENABLE;
    981		dw_pcie_writel_dbi(pci, offset, val);
    982
    983		tegra194_pcie_host_init(pp);
    984		dw_pcie_setup_rc(pp);
    985
    986		retry = false;
    987		goto retry_link;
    988	}
    989
    990	speed = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) &
    991		PCI_EXP_LNKSTA_CLS;
    992	clk_set_rate(pcie->core_clk, pcie_gen_freq[speed - 1]);
    993
    994	tegra_pcie_enable_interrupts(pp);
    995
    996	return 0;
    997}
    998
    999static int tegra194_pcie_link_up(struct dw_pcie *pci)
   1000{
   1001	struct tegra194_pcie *pcie = to_tegra_pcie(pci);
   1002	u32 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA);
   1003
   1004	return !!(val & PCI_EXP_LNKSTA_DLLLA);
   1005}
   1006
   1007static void tegra194_pcie_stop_link(struct dw_pcie *pci)
   1008{
   1009	struct tegra194_pcie *pcie = to_tegra_pcie(pci);
   1010
   1011	disable_irq(pcie->pex_rst_irq);
   1012}
   1013
   1014static const struct dw_pcie_ops tegra_dw_pcie_ops = {
   1015	.link_up = tegra194_pcie_link_up,
   1016	.start_link = tegra194_pcie_start_link,
   1017	.stop_link = tegra194_pcie_stop_link,
   1018};
   1019
   1020static const struct dw_pcie_host_ops tegra194_pcie_host_ops = {
   1021	.host_init = tegra194_pcie_host_init,
   1022};
   1023
   1024static void tegra_pcie_disable_phy(struct tegra194_pcie *pcie)
   1025{
   1026	unsigned int phy_count = pcie->phy_count;
   1027
   1028	while (phy_count--) {
   1029		phy_power_off(pcie->phys[phy_count]);
   1030		phy_exit(pcie->phys[phy_count]);
   1031	}
   1032}
   1033
   1034static int tegra_pcie_enable_phy(struct tegra194_pcie *pcie)
   1035{
   1036	unsigned int i;
   1037	int ret;
   1038
   1039	for (i = 0; i < pcie->phy_count; i++) {
   1040		ret = phy_init(pcie->phys[i]);
   1041		if (ret < 0)
   1042			goto phy_power_off;
   1043
   1044		ret = phy_power_on(pcie->phys[i]);
   1045		if (ret < 0)
   1046			goto phy_exit;
   1047	}
   1048
   1049	return 0;
   1050
   1051phy_power_off:
   1052	while (i--) {
   1053		phy_power_off(pcie->phys[i]);
   1054phy_exit:
   1055		phy_exit(pcie->phys[i]);
   1056	}
   1057
   1058	return ret;
   1059}
   1060
   1061static int tegra194_pcie_parse_dt(struct tegra194_pcie *pcie)
   1062{
   1063	struct platform_device *pdev = to_platform_device(pcie->dev);
   1064	struct device_node *np = pcie->dev->of_node;
   1065	int ret;
   1066
   1067	pcie->dbi_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi");
   1068	if (!pcie->dbi_res) {
   1069		dev_err(pcie->dev, "Failed to find \"dbi\" region\n");
   1070		return -ENODEV;
   1071	}
   1072
   1073	ret = of_property_read_u32(np, "nvidia,aspm-cmrt-us", &pcie->aspm_cmrt);
   1074	if (ret < 0) {
   1075		dev_info(pcie->dev, "Failed to read ASPM T_cmrt: %d\n", ret);
   1076		return ret;
   1077	}
   1078
   1079	ret = of_property_read_u32(np, "nvidia,aspm-pwr-on-t-us",
   1080				   &pcie->aspm_pwr_on_t);
   1081	if (ret < 0)
   1082		dev_info(pcie->dev, "Failed to read ASPM Power On time: %d\n",
   1083			 ret);
   1084
   1085	ret = of_property_read_u32(np, "nvidia,aspm-l0s-entrance-latency-us",
   1086				   &pcie->aspm_l0s_enter_lat);
   1087	if (ret < 0)
   1088		dev_info(pcie->dev,
   1089			 "Failed to read ASPM L0s Entrance latency: %d\n", ret);
   1090
   1091	ret = of_property_read_u32(np, "num-lanes", &pcie->num_lanes);
   1092	if (ret < 0) {
   1093		dev_err(pcie->dev, "Failed to read num-lanes: %d\n", ret);
   1094		return ret;
   1095	}
   1096
   1097	ret = of_property_read_u32_index(np, "nvidia,bpmp", 1, &pcie->cid);
   1098	if (ret) {
   1099		dev_err(pcie->dev, "Failed to read Controller-ID: %d\n", ret);
   1100		return ret;
   1101	}
   1102
   1103	ret = of_property_count_strings(np, "phy-names");
   1104	if (ret < 0) {
   1105		dev_err(pcie->dev, "Failed to find PHY entries: %d\n",
   1106			ret);
   1107		return ret;
   1108	}
   1109	pcie->phy_count = ret;
   1110
   1111	if (of_property_read_bool(np, "nvidia,update-fc-fixup"))
   1112		pcie->update_fc_fixup = true;
   1113
   1114	pcie->supports_clkreq =
   1115		of_property_read_bool(pcie->dev->of_node, "supports-clkreq");
   1116
   1117	pcie->enable_cdm_check =
   1118		of_property_read_bool(np, "snps,enable-cdm-check");
   1119
   1120	if (pcie->mode == DW_PCIE_RC_TYPE)
   1121		return 0;
   1122
   1123	/* Endpoint mode specific DT entries */
   1124	pcie->pex_rst_gpiod = devm_gpiod_get(pcie->dev, "reset", GPIOD_IN);
   1125	if (IS_ERR(pcie->pex_rst_gpiod)) {
   1126		int err = PTR_ERR(pcie->pex_rst_gpiod);
   1127		const char *level = KERN_ERR;
   1128
   1129		if (err == -EPROBE_DEFER)
   1130			level = KERN_DEBUG;
   1131
   1132		dev_printk(level, pcie->dev,
   1133			   dev_fmt("Failed to get PERST GPIO: %d\n"),
   1134			   err);
   1135		return err;
   1136	}
   1137
   1138	pcie->pex_refclk_sel_gpiod = devm_gpiod_get(pcie->dev,
   1139						    "nvidia,refclk-select",
   1140						    GPIOD_OUT_HIGH);
   1141	if (IS_ERR(pcie->pex_refclk_sel_gpiod)) {
   1142		int err = PTR_ERR(pcie->pex_refclk_sel_gpiod);
   1143		const char *level = KERN_ERR;
   1144
   1145		if (err == -EPROBE_DEFER)
   1146			level = KERN_DEBUG;
   1147
   1148		dev_printk(level, pcie->dev,
   1149			   dev_fmt("Failed to get REFCLK select GPIOs: %d\n"),
   1150			   err);
   1151		pcie->pex_refclk_sel_gpiod = NULL;
   1152	}
   1153
   1154	return 0;
   1155}
   1156
   1157static int tegra_pcie_bpmp_set_ctrl_state(struct tegra194_pcie *pcie,
   1158					  bool enable)
   1159{
   1160	struct mrq_uphy_response resp;
   1161	struct tegra_bpmp_message msg;
   1162	struct mrq_uphy_request req;
   1163
   1164	/* Controller-5 doesn't need to have its state set by BPMP-FW */
   1165	if (pcie->cid == 5)
   1166		return 0;
   1167
   1168	memset(&req, 0, sizeof(req));
   1169	memset(&resp, 0, sizeof(resp));
   1170
   1171	req.cmd = CMD_UPHY_PCIE_CONTROLLER_STATE;
   1172	req.controller_state.pcie_controller = pcie->cid;
   1173	req.controller_state.enable = enable;
   1174
   1175	memset(&msg, 0, sizeof(msg));
   1176	msg.mrq = MRQ_UPHY;
   1177	msg.tx.data = &req;
   1178	msg.tx.size = sizeof(req);
   1179	msg.rx.data = &resp;
   1180	msg.rx.size = sizeof(resp);
   1181
   1182	return tegra_bpmp_transfer(pcie->bpmp, &msg);
   1183}
   1184
   1185static int tegra_pcie_bpmp_set_pll_state(struct tegra194_pcie *pcie,
   1186					 bool enable)
   1187{
   1188	struct mrq_uphy_response resp;
   1189	struct tegra_bpmp_message msg;
   1190	struct mrq_uphy_request req;
   1191
   1192	memset(&req, 0, sizeof(req));
   1193	memset(&resp, 0, sizeof(resp));
   1194
   1195	if (enable) {
   1196		req.cmd = CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT;
   1197		req.ep_ctrlr_pll_init.ep_controller = pcie->cid;
   1198	} else {
   1199		req.cmd = CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF;
   1200		req.ep_ctrlr_pll_off.ep_controller = pcie->cid;
   1201	}
   1202
   1203	memset(&msg, 0, sizeof(msg));
   1204	msg.mrq = MRQ_UPHY;
   1205	msg.tx.data = &req;
   1206	msg.tx.size = sizeof(req);
   1207	msg.rx.data = &resp;
   1208	msg.rx.size = sizeof(resp);
   1209
   1210	return tegra_bpmp_transfer(pcie->bpmp, &msg);
   1211}
   1212
   1213static void tegra_pcie_downstream_dev_to_D0(struct tegra194_pcie *pcie)
   1214{
   1215	struct pcie_port *pp = &pcie->pci.pp;
   1216	struct pci_bus *child, *root_bus = NULL;
   1217	struct pci_dev *pdev;
   1218
   1219	/*
   1220	 * link doesn't go into L2 state with some of the endpoints with Tegra
   1221	 * if they are not in D0 state. So, need to make sure that immediate
   1222	 * downstream devices are in D0 state before sending PME_TurnOff to put
   1223	 * link into L2 state.
   1224	 * This is as per PCI Express Base r4.0 v1.0 September 27-2017,
   1225	 * 5.2 Link State Power Management (Page #428).
   1226	 */
   1227
   1228	list_for_each_entry(child, &pp->bridge->bus->children, node) {
   1229		/* Bring downstream devices to D0 if they are not already in */
   1230		if (child->parent == pp->bridge->bus) {
   1231			root_bus = child;
   1232			break;
   1233		}
   1234	}
   1235
   1236	if (!root_bus) {
   1237		dev_err(pcie->dev, "Failed to find downstream devices\n");
   1238		return;
   1239	}
   1240
   1241	list_for_each_entry(pdev, &root_bus->devices, bus_list) {
   1242		if (PCI_SLOT(pdev->devfn) == 0) {
   1243			if (pci_set_power_state(pdev, PCI_D0))
   1244				dev_err(pcie->dev,
   1245					"Failed to transition %s to D0 state\n",
   1246					dev_name(&pdev->dev));
   1247		}
   1248	}
   1249}
   1250
   1251static int tegra_pcie_get_slot_regulators(struct tegra194_pcie *pcie)
   1252{
   1253	pcie->slot_ctl_3v3 = devm_regulator_get_optional(pcie->dev, "vpcie3v3");
   1254	if (IS_ERR(pcie->slot_ctl_3v3)) {
   1255		if (PTR_ERR(pcie->slot_ctl_3v3) != -ENODEV)
   1256			return PTR_ERR(pcie->slot_ctl_3v3);
   1257
   1258		pcie->slot_ctl_3v3 = NULL;
   1259	}
   1260
   1261	pcie->slot_ctl_12v = devm_regulator_get_optional(pcie->dev, "vpcie12v");
   1262	if (IS_ERR(pcie->slot_ctl_12v)) {
   1263		if (PTR_ERR(pcie->slot_ctl_12v) != -ENODEV)
   1264			return PTR_ERR(pcie->slot_ctl_12v);
   1265
   1266		pcie->slot_ctl_12v = NULL;
   1267	}
   1268
   1269	return 0;
   1270}
   1271
   1272static int tegra_pcie_enable_slot_regulators(struct tegra194_pcie *pcie)
   1273{
   1274	int ret;
   1275
   1276	if (pcie->slot_ctl_3v3) {
   1277		ret = regulator_enable(pcie->slot_ctl_3v3);
   1278		if (ret < 0) {
   1279			dev_err(pcie->dev,
   1280				"Failed to enable 3.3V slot supply: %d\n", ret);
   1281			return ret;
   1282		}
   1283	}
   1284
   1285	if (pcie->slot_ctl_12v) {
   1286		ret = regulator_enable(pcie->slot_ctl_12v);
   1287		if (ret < 0) {
   1288			dev_err(pcie->dev,
   1289				"Failed to enable 12V slot supply: %d\n", ret);
   1290			goto fail_12v_enable;
   1291		}
   1292	}
   1293
   1294	/*
   1295	 * According to PCI Express Card Electromechanical Specification
   1296	 * Revision 1.1, Table-2.4, T_PVPERL (Power stable to PERST# inactive)
   1297	 * should be a minimum of 100ms.
   1298	 */
   1299	if (pcie->slot_ctl_3v3 || pcie->slot_ctl_12v)
   1300		msleep(100);
   1301
   1302	return 0;
   1303
   1304fail_12v_enable:
   1305	if (pcie->slot_ctl_3v3)
   1306		regulator_disable(pcie->slot_ctl_3v3);
   1307	return ret;
   1308}
   1309
   1310static void tegra_pcie_disable_slot_regulators(struct tegra194_pcie *pcie)
   1311{
   1312	if (pcie->slot_ctl_12v)
   1313		regulator_disable(pcie->slot_ctl_12v);
   1314	if (pcie->slot_ctl_3v3)
   1315		regulator_disable(pcie->slot_ctl_3v3);
   1316}
   1317
   1318static int tegra_pcie_config_controller(struct tegra194_pcie *pcie,
   1319					bool en_hw_hot_rst)
   1320{
   1321	int ret;
   1322	u32 val;
   1323
   1324	ret = tegra_pcie_bpmp_set_ctrl_state(pcie, true);
   1325	if (ret) {
   1326		dev_err(pcie->dev,
   1327			"Failed to enable controller %u: %d\n", pcie->cid, ret);
   1328		return ret;
   1329	}
   1330
   1331	ret = tegra_pcie_enable_slot_regulators(pcie);
   1332	if (ret < 0)
   1333		goto fail_slot_reg_en;
   1334
   1335	ret = regulator_enable(pcie->pex_ctl_supply);
   1336	if (ret < 0) {
   1337		dev_err(pcie->dev, "Failed to enable regulator: %d\n", ret);
   1338		goto fail_reg_en;
   1339	}
   1340
   1341	ret = clk_prepare_enable(pcie->core_clk);
   1342	if (ret) {
   1343		dev_err(pcie->dev, "Failed to enable core clock: %d\n", ret);
   1344		goto fail_core_clk;
   1345	}
   1346
   1347	ret = reset_control_deassert(pcie->core_apb_rst);
   1348	if (ret) {
   1349		dev_err(pcie->dev, "Failed to deassert core APB reset: %d\n",
   1350			ret);
   1351		goto fail_core_apb_rst;
   1352	}
   1353
   1354	if (en_hw_hot_rst) {
   1355		/* Enable HW_HOT_RST mode */
   1356		val = appl_readl(pcie, APPL_CTRL);
   1357		val &= ~(APPL_CTRL_HW_HOT_RST_MODE_MASK <<
   1358			 APPL_CTRL_HW_HOT_RST_MODE_SHIFT);
   1359		val |= APPL_CTRL_HW_HOT_RST_EN;
   1360		appl_writel(pcie, val, APPL_CTRL);
   1361	}
   1362
   1363	ret = tegra_pcie_enable_phy(pcie);
   1364	if (ret) {
   1365		dev_err(pcie->dev, "Failed to enable PHY: %d\n", ret);
   1366		goto fail_phy;
   1367	}
   1368
   1369	/* Update CFG base address */
   1370	appl_writel(pcie, pcie->dbi_res->start & APPL_CFG_BASE_ADDR_MASK,
   1371		    APPL_CFG_BASE_ADDR);
   1372
   1373	/* Configure this core for RP mode operation */
   1374	appl_writel(pcie, APPL_DM_TYPE_RP, APPL_DM_TYPE);
   1375
   1376	appl_writel(pcie, 0x0, APPL_CFG_SLCG_OVERRIDE);
   1377
   1378	val = appl_readl(pcie, APPL_CTRL);
   1379	appl_writel(pcie, val | APPL_CTRL_SYS_PRE_DET_STATE, APPL_CTRL);
   1380
   1381	val = appl_readl(pcie, APPL_CFG_MISC);
   1382	val |= (APPL_CFG_MISC_ARCACHE_VAL << APPL_CFG_MISC_ARCACHE_SHIFT);
   1383	appl_writel(pcie, val, APPL_CFG_MISC);
   1384
   1385	if (!pcie->supports_clkreq) {
   1386		val = appl_readl(pcie, APPL_PINMUX);
   1387		val |= APPL_PINMUX_CLKREQ_OVERRIDE_EN;
   1388		val &= ~APPL_PINMUX_CLKREQ_OVERRIDE;
   1389		appl_writel(pcie, val, APPL_PINMUX);
   1390	}
   1391
   1392	/* Update iATU_DMA base address */
   1393	appl_writel(pcie,
   1394		    pcie->atu_dma_res->start & APPL_CFG_IATU_DMA_BASE_ADDR_MASK,
   1395		    APPL_CFG_IATU_DMA_BASE_ADDR);
   1396
   1397	reset_control_deassert(pcie->core_rst);
   1398
   1399	return ret;
   1400
   1401fail_phy:
   1402	reset_control_assert(pcie->core_apb_rst);
   1403fail_core_apb_rst:
   1404	clk_disable_unprepare(pcie->core_clk);
   1405fail_core_clk:
   1406	regulator_disable(pcie->pex_ctl_supply);
   1407fail_reg_en:
   1408	tegra_pcie_disable_slot_regulators(pcie);
   1409fail_slot_reg_en:
   1410	tegra_pcie_bpmp_set_ctrl_state(pcie, false);
   1411
   1412	return ret;
   1413}
   1414
   1415static void tegra_pcie_unconfig_controller(struct tegra194_pcie *pcie)
   1416{
   1417	int ret;
   1418
   1419	ret = reset_control_assert(pcie->core_rst);
   1420	if (ret)
   1421		dev_err(pcie->dev, "Failed to assert \"core\" reset: %d\n", ret);
   1422
   1423	tegra_pcie_disable_phy(pcie);
   1424
   1425	ret = reset_control_assert(pcie->core_apb_rst);
   1426	if (ret)
   1427		dev_err(pcie->dev, "Failed to assert APB reset: %d\n", ret);
   1428
   1429	clk_disable_unprepare(pcie->core_clk);
   1430
   1431	ret = regulator_disable(pcie->pex_ctl_supply);
   1432	if (ret)
   1433		dev_err(pcie->dev, "Failed to disable regulator: %d\n", ret);
   1434
   1435	tegra_pcie_disable_slot_regulators(pcie);
   1436
   1437	ret = tegra_pcie_bpmp_set_ctrl_state(pcie, false);
   1438	if (ret)
   1439		dev_err(pcie->dev, "Failed to disable controller %d: %d\n",
   1440			pcie->cid, ret);
   1441}
   1442
   1443static int tegra_pcie_init_controller(struct tegra194_pcie *pcie)
   1444{
   1445	struct dw_pcie *pci = &pcie->pci;
   1446	struct pcie_port *pp = &pci->pp;
   1447	int ret;
   1448
   1449	ret = tegra_pcie_config_controller(pcie, false);
   1450	if (ret < 0)
   1451		return ret;
   1452
   1453	pp->ops = &tegra194_pcie_host_ops;
   1454
   1455	ret = dw_pcie_host_init(pp);
   1456	if (ret < 0) {
   1457		dev_err(pcie->dev, "Failed to add PCIe port: %d\n", ret);
   1458		goto fail_host_init;
   1459	}
   1460
   1461	return 0;
   1462
   1463fail_host_init:
   1464	tegra_pcie_unconfig_controller(pcie);
   1465	return ret;
   1466}
   1467
   1468static int tegra_pcie_try_link_l2(struct tegra194_pcie *pcie)
   1469{
   1470	u32 val;
   1471
   1472	if (!tegra194_pcie_link_up(&pcie->pci))
   1473		return 0;
   1474
   1475	val = appl_readl(pcie, APPL_RADM_STATUS);
   1476	val |= APPL_PM_XMT_TURNOFF_STATE;
   1477	appl_writel(pcie, val, APPL_RADM_STATUS);
   1478
   1479	return readl_poll_timeout_atomic(pcie->appl_base + APPL_DEBUG, val,
   1480				 val & APPL_DEBUG_PM_LINKST_IN_L2_LAT,
   1481				 1, PME_ACK_TIMEOUT);
   1482}
   1483
   1484static void tegra194_pcie_pme_turnoff(struct tegra194_pcie *pcie)
   1485{
   1486	u32 data;
   1487	int err;
   1488
   1489	if (!tegra194_pcie_link_up(&pcie->pci)) {
   1490		dev_dbg(pcie->dev, "PCIe link is not up...!\n");
   1491		return;
   1492	}
   1493
   1494	/*
   1495	 * PCIe controller exits from L2 only if reset is applied, so
   1496	 * controller doesn't handle interrupts. But in cases where
   1497	 * L2 entry fails, PERST# is asserted which can trigger surprise
   1498	 * link down AER. However this function call happens in
   1499	 * suspend_noirq(), so AER interrupt will not be processed.
   1500	 * Disable all interrupts to avoid such a scenario.
   1501	 */
   1502	appl_writel(pcie, 0x0, APPL_INTR_EN_L0_0);
   1503
   1504	if (tegra_pcie_try_link_l2(pcie)) {
   1505		dev_info(pcie->dev, "Link didn't transition to L2 state\n");
   1506		/*
   1507		 * TX lane clock freq will reset to Gen1 only if link is in L2
   1508		 * or detect state.
   1509		 * So apply pex_rst to end point to force RP to go into detect
   1510		 * state
   1511		 */
   1512		data = appl_readl(pcie, APPL_PINMUX);
   1513		data &= ~APPL_PINMUX_PEX_RST;
   1514		appl_writel(pcie, data, APPL_PINMUX);
   1515
   1516		/*
   1517		 * Some cards do not go to detect state even after de-asserting
   1518		 * PERST#. So, de-assert LTSSM to bring link to detect state.
   1519		 */
   1520		data = readl(pcie->appl_base + APPL_CTRL);
   1521		data &= ~APPL_CTRL_LTSSM_EN;
   1522		writel(data, pcie->appl_base + APPL_CTRL);
   1523
   1524		err = readl_poll_timeout_atomic(pcie->appl_base + APPL_DEBUG,
   1525						data,
   1526						((data &
   1527						APPL_DEBUG_LTSSM_STATE_MASK) >>
   1528						APPL_DEBUG_LTSSM_STATE_SHIFT) ==
   1529						LTSSM_STATE_PRE_DETECT,
   1530						1, LTSSM_TIMEOUT);
   1531		if (err)
   1532			dev_info(pcie->dev, "Link didn't go to detect state\n");
   1533	}
   1534	/*
   1535	 * DBI registers may not be accessible after this as PLL-E would be
   1536	 * down depending on how CLKREQ is pulled by end point
   1537	 */
   1538	data = appl_readl(pcie, APPL_PINMUX);
   1539	data |= (APPL_PINMUX_CLKREQ_OVERRIDE_EN | APPL_PINMUX_CLKREQ_OVERRIDE);
   1540	/* Cut REFCLK to slot */
   1541	data |= APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE_EN;
   1542	data &= ~APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE;
   1543	appl_writel(pcie, data, APPL_PINMUX);
   1544}
   1545
   1546static void tegra_pcie_deinit_controller(struct tegra194_pcie *pcie)
   1547{
   1548	tegra_pcie_downstream_dev_to_D0(pcie);
   1549	dw_pcie_host_deinit(&pcie->pci.pp);
   1550	tegra194_pcie_pme_turnoff(pcie);
   1551	tegra_pcie_unconfig_controller(pcie);
   1552}
   1553
   1554static int tegra_pcie_config_rp(struct tegra194_pcie *pcie)
   1555{
   1556	struct device *dev = pcie->dev;
   1557	char *name;
   1558	int ret;
   1559
   1560	pm_runtime_enable(dev);
   1561
   1562	ret = pm_runtime_get_sync(dev);
   1563	if (ret < 0) {
   1564		dev_err(dev, "Failed to get runtime sync for PCIe dev: %d\n",
   1565			ret);
   1566		goto fail_pm_get_sync;
   1567	}
   1568
   1569	ret = pinctrl_pm_select_default_state(dev);
   1570	if (ret < 0) {
   1571		dev_err(dev, "Failed to configure sideband pins: %d\n", ret);
   1572		goto fail_pm_get_sync;
   1573	}
   1574
   1575	ret = tegra_pcie_init_controller(pcie);
   1576	if (ret < 0) {
   1577		dev_err(dev, "Failed to initialize controller: %d\n", ret);
   1578		goto fail_pm_get_sync;
   1579	}
   1580
   1581	pcie->link_state = tegra194_pcie_link_up(&pcie->pci);
   1582	if (!pcie->link_state) {
   1583		ret = -ENOMEDIUM;
   1584		goto fail_host_init;
   1585	}
   1586
   1587	name = devm_kasprintf(dev, GFP_KERNEL, "%pOFP", dev->of_node);
   1588	if (!name) {
   1589		ret = -ENOMEM;
   1590		goto fail_host_init;
   1591	}
   1592
   1593	pcie->debugfs = debugfs_create_dir(name, NULL);
   1594	init_debugfs(pcie);
   1595
   1596	return ret;
   1597
   1598fail_host_init:
   1599	tegra_pcie_deinit_controller(pcie);
   1600fail_pm_get_sync:
   1601	pm_runtime_put_sync(dev);
   1602	pm_runtime_disable(dev);
   1603	return ret;
   1604}
   1605
   1606static void pex_ep_event_pex_rst_assert(struct tegra194_pcie *pcie)
   1607{
   1608	u32 val;
   1609	int ret;
   1610
   1611	if (pcie->ep_state == EP_STATE_DISABLED)
   1612		return;
   1613
   1614	/* Disable LTSSM */
   1615	val = appl_readl(pcie, APPL_CTRL);
   1616	val &= ~APPL_CTRL_LTSSM_EN;
   1617	appl_writel(pcie, val, APPL_CTRL);
   1618
   1619	ret = readl_poll_timeout(pcie->appl_base + APPL_DEBUG, val,
   1620				 ((val & APPL_DEBUG_LTSSM_STATE_MASK) >>
   1621				 APPL_DEBUG_LTSSM_STATE_SHIFT) ==
   1622				 LTSSM_STATE_PRE_DETECT,
   1623				 1, LTSSM_TIMEOUT);
   1624	if (ret)
   1625		dev_err(pcie->dev, "Failed to go Detect state: %d\n", ret);
   1626
   1627	reset_control_assert(pcie->core_rst);
   1628
   1629	tegra_pcie_disable_phy(pcie);
   1630
   1631	reset_control_assert(pcie->core_apb_rst);
   1632
   1633	clk_disable_unprepare(pcie->core_clk);
   1634
   1635	pm_runtime_put_sync(pcie->dev);
   1636
   1637	ret = tegra_pcie_bpmp_set_pll_state(pcie, false);
   1638	if (ret)
   1639		dev_err(pcie->dev, "Failed to turn off UPHY: %d\n", ret);
   1640
   1641	pcie->ep_state = EP_STATE_DISABLED;
   1642	dev_dbg(pcie->dev, "Uninitialization of endpoint is completed\n");
   1643}
   1644
   1645static void pex_ep_event_pex_rst_deassert(struct tegra194_pcie *pcie)
   1646{
   1647	struct dw_pcie *pci = &pcie->pci;
   1648	struct dw_pcie_ep *ep = &pci->ep;
   1649	struct device *dev = pcie->dev;
   1650	u32 val;
   1651	int ret;
   1652
   1653	if (pcie->ep_state == EP_STATE_ENABLED)
   1654		return;
   1655
   1656	ret = pm_runtime_resume_and_get(dev);
   1657	if (ret < 0) {
   1658		dev_err(dev, "Failed to get runtime sync for PCIe dev: %d\n",
   1659			ret);
   1660		return;
   1661	}
   1662
   1663	ret = tegra_pcie_bpmp_set_pll_state(pcie, true);
   1664	if (ret) {
   1665		dev_err(dev, "Failed to init UPHY for PCIe EP: %d\n", ret);
   1666		goto fail_pll_init;
   1667	}
   1668
   1669	ret = clk_prepare_enable(pcie->core_clk);
   1670	if (ret) {
   1671		dev_err(dev, "Failed to enable core clock: %d\n", ret);
   1672		goto fail_core_clk_enable;
   1673	}
   1674
   1675	ret = reset_control_deassert(pcie->core_apb_rst);
   1676	if (ret) {
   1677		dev_err(dev, "Failed to deassert core APB reset: %d\n", ret);
   1678		goto fail_core_apb_rst;
   1679	}
   1680
   1681	ret = tegra_pcie_enable_phy(pcie);
   1682	if (ret) {
   1683		dev_err(dev, "Failed to enable PHY: %d\n", ret);
   1684		goto fail_phy;
   1685	}
   1686
   1687	/* Clear any stale interrupt statuses */
   1688	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L0);
   1689	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0);
   1690	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_1);
   1691	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_2);
   1692	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_3);
   1693	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_6);
   1694	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_7);
   1695	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_8_0);
   1696	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_9);
   1697	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_10);
   1698	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_11);
   1699	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_13);
   1700	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_14);
   1701	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_15);
   1702	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_17);
   1703
   1704	/* configure this core for EP mode operation */
   1705	val = appl_readl(pcie, APPL_DM_TYPE);
   1706	val &= ~APPL_DM_TYPE_MASK;
   1707	val |= APPL_DM_TYPE_EP;
   1708	appl_writel(pcie, val, APPL_DM_TYPE);
   1709
   1710	appl_writel(pcie, 0x0, APPL_CFG_SLCG_OVERRIDE);
   1711
   1712	val = appl_readl(pcie, APPL_CTRL);
   1713	val |= APPL_CTRL_SYS_PRE_DET_STATE;
   1714	val |= APPL_CTRL_HW_HOT_RST_EN;
   1715	appl_writel(pcie, val, APPL_CTRL);
   1716
   1717	val = appl_readl(pcie, APPL_CFG_MISC);
   1718	val |= APPL_CFG_MISC_SLV_EP_MODE;
   1719	val |= (APPL_CFG_MISC_ARCACHE_VAL << APPL_CFG_MISC_ARCACHE_SHIFT);
   1720	appl_writel(pcie, val, APPL_CFG_MISC);
   1721
   1722	val = appl_readl(pcie, APPL_PINMUX);
   1723	val |= APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE_EN;
   1724	val |= APPL_PINMUX_CLK_OUTPUT_IN_OVERRIDE;
   1725	appl_writel(pcie, val, APPL_PINMUX);
   1726
   1727	appl_writel(pcie, pcie->dbi_res->start & APPL_CFG_BASE_ADDR_MASK,
   1728		    APPL_CFG_BASE_ADDR);
   1729
   1730	appl_writel(pcie, pcie->atu_dma_res->start &
   1731		    APPL_CFG_IATU_DMA_BASE_ADDR_MASK,
   1732		    APPL_CFG_IATU_DMA_BASE_ADDR);
   1733
   1734	val = appl_readl(pcie, APPL_INTR_EN_L0_0);
   1735	val |= APPL_INTR_EN_L0_0_SYS_INTR_EN;
   1736	val |= APPL_INTR_EN_L0_0_LINK_STATE_INT_EN;
   1737	val |= APPL_INTR_EN_L0_0_PCI_CMD_EN_INT_EN;
   1738	appl_writel(pcie, val, APPL_INTR_EN_L0_0);
   1739
   1740	val = appl_readl(pcie, APPL_INTR_EN_L1_0_0);
   1741	val |= APPL_INTR_EN_L1_0_0_HOT_RESET_DONE_INT_EN;
   1742	val |= APPL_INTR_EN_L1_0_0_RDLH_LINK_UP_INT_EN;
   1743	appl_writel(pcie, val, APPL_INTR_EN_L1_0_0);
   1744
   1745	reset_control_deassert(pcie->core_rst);
   1746
   1747	if (pcie->update_fc_fixup) {
   1748		val = dw_pcie_readl_dbi(pci, CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF);
   1749		val |= 0x1 << CFG_TIMER_CTRL_ACK_NAK_SHIFT;
   1750		dw_pcie_writel_dbi(pci, CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF, val);
   1751	}
   1752
   1753	config_gen3_gen4_eq_presets(pcie);
   1754
   1755	init_host_aspm(pcie);
   1756
   1757	/* Disable ASPM-L1SS advertisement if there is no CLKREQ routing */
   1758	if (!pcie->supports_clkreq) {
   1759		disable_aspm_l11(pcie);
   1760		disable_aspm_l12(pcie);
   1761	}
   1762
   1763	val = dw_pcie_readl_dbi(pci, GEN3_RELATED_OFF);
   1764	val &= ~GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL;
   1765	dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
   1766
   1767	pcie->pcie_cap_base = dw_pcie_find_capability(&pcie->pci,
   1768						      PCI_CAP_ID_EXP);
   1769	clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ);
   1770
   1771	val = (ep->msi_mem_phys & MSIX_ADDR_MATCH_LOW_OFF_MASK);
   1772	val |= MSIX_ADDR_MATCH_LOW_OFF_EN;
   1773	dw_pcie_writel_dbi(pci, MSIX_ADDR_MATCH_LOW_OFF, val);
   1774	val = (upper_32_bits(ep->msi_mem_phys) & MSIX_ADDR_MATCH_HIGH_OFF_MASK);
   1775	dw_pcie_writel_dbi(pci, MSIX_ADDR_MATCH_HIGH_OFF, val);
   1776
   1777	ret = dw_pcie_ep_init_complete(ep);
   1778	if (ret) {
   1779		dev_err(dev, "Failed to complete initialization: %d\n", ret);
   1780		goto fail_init_complete;
   1781	}
   1782
   1783	dw_pcie_ep_init_notify(ep);
   1784
   1785	/* Enable LTSSM */
   1786	val = appl_readl(pcie, APPL_CTRL);
   1787	val |= APPL_CTRL_LTSSM_EN;
   1788	appl_writel(pcie, val, APPL_CTRL);
   1789
   1790	pcie->ep_state = EP_STATE_ENABLED;
   1791	dev_dbg(dev, "Initialization of endpoint is completed\n");
   1792
   1793	return;
   1794
   1795fail_init_complete:
   1796	reset_control_assert(pcie->core_rst);
   1797	tegra_pcie_disable_phy(pcie);
   1798fail_phy:
   1799	reset_control_assert(pcie->core_apb_rst);
   1800fail_core_apb_rst:
   1801	clk_disable_unprepare(pcie->core_clk);
   1802fail_core_clk_enable:
   1803	tegra_pcie_bpmp_set_pll_state(pcie, false);
   1804fail_pll_init:
   1805	pm_runtime_put_sync(dev);
   1806}
   1807
   1808static irqreturn_t tegra_pcie_ep_pex_rst_irq(int irq, void *arg)
   1809{
   1810	struct tegra194_pcie *pcie = arg;
   1811
   1812	if (gpiod_get_value(pcie->pex_rst_gpiod))
   1813		pex_ep_event_pex_rst_assert(pcie);
   1814	else
   1815		pex_ep_event_pex_rst_deassert(pcie);
   1816
   1817	return IRQ_HANDLED;
   1818}
   1819
   1820static int tegra_pcie_ep_raise_legacy_irq(struct tegra194_pcie *pcie, u16 irq)
   1821{
   1822	/* Tegra194 supports only INTA */
   1823	if (irq > 1)
   1824		return -EINVAL;
   1825
   1826	appl_writel(pcie, 1, APPL_LEGACY_INTX);
   1827	usleep_range(1000, 2000);
   1828	appl_writel(pcie, 0, APPL_LEGACY_INTX);
   1829	return 0;
   1830}
   1831
   1832static int tegra_pcie_ep_raise_msi_irq(struct tegra194_pcie *pcie, u16 irq)
   1833{
   1834	if (unlikely(irq > 31))
   1835		return -EINVAL;
   1836
   1837	appl_writel(pcie, BIT(irq), APPL_MSI_CTRL_1);
   1838
   1839	return 0;
   1840}
   1841
   1842static int tegra_pcie_ep_raise_msix_irq(struct tegra194_pcie *pcie, u16 irq)
   1843{
   1844	struct dw_pcie_ep *ep = &pcie->pci.ep;
   1845
   1846	writel(irq, ep->msi_mem);
   1847
   1848	return 0;
   1849}
   1850
   1851static int tegra_pcie_ep_raise_irq(struct dw_pcie_ep *ep, u8 func_no,
   1852				   enum pci_epc_irq_type type,
   1853				   u16 interrupt_num)
   1854{
   1855	struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
   1856	struct tegra194_pcie *pcie = to_tegra_pcie(pci);
   1857
   1858	switch (type) {
   1859	case PCI_EPC_IRQ_LEGACY:
   1860		return tegra_pcie_ep_raise_legacy_irq(pcie, interrupt_num);
   1861
   1862	case PCI_EPC_IRQ_MSI:
   1863		return tegra_pcie_ep_raise_msi_irq(pcie, interrupt_num);
   1864
   1865	case PCI_EPC_IRQ_MSIX:
   1866		return tegra_pcie_ep_raise_msix_irq(pcie, interrupt_num);
   1867
   1868	default:
   1869		dev_err(pci->dev, "Unknown IRQ type\n");
   1870		return -EPERM;
   1871	}
   1872
   1873	return 0;
   1874}
   1875
   1876static const struct pci_epc_features tegra_pcie_epc_features = {
   1877	.linkup_notifier = true,
   1878	.core_init_notifier = true,
   1879	.msi_capable = false,
   1880	.msix_capable = false,
   1881	.reserved_bar = 1 << BAR_2 | 1 << BAR_3 | 1 << BAR_4 | 1 << BAR_5,
   1882	.bar_fixed_64bit = 1 << BAR_0,
   1883	.bar_fixed_size[0] = SZ_1M,
   1884};
   1885
   1886static const struct pci_epc_features*
   1887tegra_pcie_ep_get_features(struct dw_pcie_ep *ep)
   1888{
   1889	return &tegra_pcie_epc_features;
   1890}
   1891
   1892static const struct dw_pcie_ep_ops pcie_ep_ops = {
   1893	.raise_irq = tegra_pcie_ep_raise_irq,
   1894	.get_features = tegra_pcie_ep_get_features,
   1895};
   1896
   1897static int tegra_pcie_config_ep(struct tegra194_pcie *pcie,
   1898				struct platform_device *pdev)
   1899{
   1900	struct dw_pcie *pci = &pcie->pci;
   1901	struct device *dev = pcie->dev;
   1902	struct dw_pcie_ep *ep;
   1903	char *name;
   1904	int ret;
   1905
   1906	ep = &pci->ep;
   1907	ep->ops = &pcie_ep_ops;
   1908
   1909	ep->page_size = SZ_64K;
   1910
   1911	ret = gpiod_set_debounce(pcie->pex_rst_gpiod, PERST_DEBOUNCE_TIME);
   1912	if (ret < 0) {
   1913		dev_err(dev, "Failed to set PERST GPIO debounce time: %d\n",
   1914			ret);
   1915		return ret;
   1916	}
   1917
   1918	ret = gpiod_to_irq(pcie->pex_rst_gpiod);
   1919	if (ret < 0) {
   1920		dev_err(dev, "Failed to get IRQ for PERST GPIO: %d\n", ret);
   1921		return ret;
   1922	}
   1923	pcie->pex_rst_irq = (unsigned int)ret;
   1924
   1925	name = devm_kasprintf(dev, GFP_KERNEL, "tegra_pcie_%u_pex_rst_irq",
   1926			      pcie->cid);
   1927	if (!name) {
   1928		dev_err(dev, "Failed to create PERST IRQ string\n");
   1929		return -ENOMEM;
   1930	}
   1931
   1932	irq_set_status_flags(pcie->pex_rst_irq, IRQ_NOAUTOEN);
   1933
   1934	pcie->ep_state = EP_STATE_DISABLED;
   1935
   1936	ret = devm_request_threaded_irq(dev, pcie->pex_rst_irq, NULL,
   1937					tegra_pcie_ep_pex_rst_irq,
   1938					IRQF_TRIGGER_RISING |
   1939					IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
   1940					name, (void *)pcie);
   1941	if (ret < 0) {
   1942		dev_err(dev, "Failed to request IRQ for PERST: %d\n", ret);
   1943		return ret;
   1944	}
   1945
   1946	pm_runtime_enable(dev);
   1947
   1948	ret = dw_pcie_ep_init(ep);
   1949	if (ret) {
   1950		dev_err(dev, "Failed to initialize DWC Endpoint subsystem: %d\n",
   1951			ret);
   1952		return ret;
   1953	}
   1954
   1955	return 0;
   1956}
   1957
   1958static int tegra194_pcie_probe(struct platform_device *pdev)
   1959{
   1960	const struct tegra194_pcie_of_data *data;
   1961	struct device *dev = &pdev->dev;
   1962	struct resource *atu_dma_res;
   1963	struct tegra194_pcie *pcie;
   1964	struct pcie_port *pp;
   1965	struct dw_pcie *pci;
   1966	struct phy **phys;
   1967	char *name;
   1968	int ret;
   1969	u32 i;
   1970
   1971	data = of_device_get_match_data(dev);
   1972
   1973	pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL);
   1974	if (!pcie)
   1975		return -ENOMEM;
   1976
   1977	pci = &pcie->pci;
   1978	pci->dev = &pdev->dev;
   1979	pci->ops = &tegra_dw_pcie_ops;
   1980	pci->n_fts[0] = N_FTS_VAL;
   1981	pci->n_fts[1] = FTS_VAL;
   1982	pci->version = 0x490A;
   1983
   1984	pp = &pci->pp;
   1985	pp->num_vectors = MAX_MSI_IRQS;
   1986	pcie->dev = &pdev->dev;
   1987	pcie->mode = (enum dw_pcie_device_mode)data->mode;
   1988
   1989	ret = tegra194_pcie_parse_dt(pcie);
   1990	if (ret < 0) {
   1991		const char *level = KERN_ERR;
   1992
   1993		if (ret == -EPROBE_DEFER)
   1994			level = KERN_DEBUG;
   1995
   1996		dev_printk(level, dev,
   1997			   dev_fmt("Failed to parse device tree: %d\n"),
   1998			   ret);
   1999		return ret;
   2000	}
   2001
   2002	ret = tegra_pcie_get_slot_regulators(pcie);
   2003	if (ret < 0) {
   2004		const char *level = KERN_ERR;
   2005
   2006		if (ret == -EPROBE_DEFER)
   2007			level = KERN_DEBUG;
   2008
   2009		dev_printk(level, dev,
   2010			   dev_fmt("Failed to get slot regulators: %d\n"),
   2011			   ret);
   2012		return ret;
   2013	}
   2014
   2015	if (pcie->pex_refclk_sel_gpiod)
   2016		gpiod_set_value(pcie->pex_refclk_sel_gpiod, 1);
   2017
   2018	pcie->pex_ctl_supply = devm_regulator_get(dev, "vddio-pex-ctl");
   2019	if (IS_ERR(pcie->pex_ctl_supply)) {
   2020		ret = PTR_ERR(pcie->pex_ctl_supply);
   2021		if (ret != -EPROBE_DEFER)
   2022			dev_err(dev, "Failed to get regulator: %ld\n",
   2023				PTR_ERR(pcie->pex_ctl_supply));
   2024		return ret;
   2025	}
   2026
   2027	pcie->core_clk = devm_clk_get(dev, "core");
   2028	if (IS_ERR(pcie->core_clk)) {
   2029		dev_err(dev, "Failed to get core clock: %ld\n",
   2030			PTR_ERR(pcie->core_clk));
   2031		return PTR_ERR(pcie->core_clk);
   2032	}
   2033
   2034	pcie->appl_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
   2035						      "appl");
   2036	if (!pcie->appl_res) {
   2037		dev_err(dev, "Failed to find \"appl\" region\n");
   2038		return -ENODEV;
   2039	}
   2040
   2041	pcie->appl_base = devm_ioremap_resource(dev, pcie->appl_res);
   2042	if (IS_ERR(pcie->appl_base))
   2043		return PTR_ERR(pcie->appl_base);
   2044
   2045	pcie->core_apb_rst = devm_reset_control_get(dev, "apb");
   2046	if (IS_ERR(pcie->core_apb_rst)) {
   2047		dev_err(dev, "Failed to get APB reset: %ld\n",
   2048			PTR_ERR(pcie->core_apb_rst));
   2049		return PTR_ERR(pcie->core_apb_rst);
   2050	}
   2051
   2052	phys = devm_kcalloc(dev, pcie->phy_count, sizeof(*phys), GFP_KERNEL);
   2053	if (!phys)
   2054		return -ENOMEM;
   2055
   2056	for (i = 0; i < pcie->phy_count; i++) {
   2057		name = kasprintf(GFP_KERNEL, "p2u-%u", i);
   2058		if (!name) {
   2059			dev_err(dev, "Failed to create P2U string\n");
   2060			return -ENOMEM;
   2061		}
   2062		phys[i] = devm_phy_get(dev, name);
   2063		kfree(name);
   2064		if (IS_ERR(phys[i])) {
   2065			ret = PTR_ERR(phys[i]);
   2066			if (ret != -EPROBE_DEFER)
   2067				dev_err(dev, "Failed to get PHY: %d\n", ret);
   2068			return ret;
   2069		}
   2070	}
   2071
   2072	pcie->phys = phys;
   2073
   2074	atu_dma_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
   2075						   "atu_dma");
   2076	if (!atu_dma_res) {
   2077		dev_err(dev, "Failed to find \"atu_dma\" region\n");
   2078		return -ENODEV;
   2079	}
   2080	pcie->atu_dma_res = atu_dma_res;
   2081
   2082	pci->atu_size = resource_size(atu_dma_res);
   2083	pci->atu_base = devm_ioremap_resource(dev, atu_dma_res);
   2084	if (IS_ERR(pci->atu_base))
   2085		return PTR_ERR(pci->atu_base);
   2086
   2087	pcie->core_rst = devm_reset_control_get(dev, "core");
   2088	if (IS_ERR(pcie->core_rst)) {
   2089		dev_err(dev, "Failed to get core reset: %ld\n",
   2090			PTR_ERR(pcie->core_rst));
   2091		return PTR_ERR(pcie->core_rst);
   2092	}
   2093
   2094	pp->irq = platform_get_irq_byname(pdev, "intr");
   2095	if (pp->irq < 0)
   2096		return pp->irq;
   2097
   2098	pcie->bpmp = tegra_bpmp_get(dev);
   2099	if (IS_ERR(pcie->bpmp))
   2100		return PTR_ERR(pcie->bpmp);
   2101
   2102	platform_set_drvdata(pdev, pcie);
   2103
   2104	switch (pcie->mode) {
   2105	case DW_PCIE_RC_TYPE:
   2106		ret = devm_request_irq(dev, pp->irq, tegra_pcie_rp_irq_handler,
   2107				       IRQF_SHARED, "tegra-pcie-intr", pcie);
   2108		if (ret) {
   2109			dev_err(dev, "Failed to request IRQ %d: %d\n", pp->irq,
   2110				ret);
   2111			goto fail;
   2112		}
   2113
   2114		ret = tegra_pcie_config_rp(pcie);
   2115		if (ret && ret != -ENOMEDIUM)
   2116			goto fail;
   2117		else
   2118			return 0;
   2119		break;
   2120
   2121	case DW_PCIE_EP_TYPE:
   2122		ret = devm_request_threaded_irq(dev, pp->irq,
   2123						tegra_pcie_ep_hard_irq,
   2124						tegra_pcie_ep_irq_thread,
   2125						IRQF_SHARED | IRQF_ONESHOT,
   2126						"tegra-pcie-ep-intr", pcie);
   2127		if (ret) {
   2128			dev_err(dev, "Failed to request IRQ %d: %d\n", pp->irq,
   2129				ret);
   2130			goto fail;
   2131		}
   2132
   2133		ret = tegra_pcie_config_ep(pcie, pdev);
   2134		if (ret < 0)
   2135			goto fail;
   2136		break;
   2137
   2138	default:
   2139		dev_err(dev, "Invalid PCIe device type %d\n", pcie->mode);
   2140	}
   2141
   2142fail:
   2143	tegra_bpmp_put(pcie->bpmp);
   2144	return ret;
   2145}
   2146
   2147static int tegra194_pcie_remove(struct platform_device *pdev)
   2148{
   2149	struct tegra194_pcie *pcie = platform_get_drvdata(pdev);
   2150
   2151	if (!pcie->link_state)
   2152		return 0;
   2153
   2154	debugfs_remove_recursive(pcie->debugfs);
   2155	tegra_pcie_deinit_controller(pcie);
   2156	pm_runtime_put_sync(pcie->dev);
   2157	pm_runtime_disable(pcie->dev);
   2158	tegra_bpmp_put(pcie->bpmp);
   2159	if (pcie->pex_refclk_sel_gpiod)
   2160		gpiod_set_value(pcie->pex_refclk_sel_gpiod, 0);
   2161
   2162	return 0;
   2163}
   2164
   2165static int tegra194_pcie_suspend_late(struct device *dev)
   2166{
   2167	struct tegra194_pcie *pcie = dev_get_drvdata(dev);
   2168	u32 val;
   2169
   2170	if (!pcie->link_state)
   2171		return 0;
   2172
   2173	/* Enable HW_HOT_RST mode */
   2174	val = appl_readl(pcie, APPL_CTRL);
   2175	val &= ~(APPL_CTRL_HW_HOT_RST_MODE_MASK <<
   2176		 APPL_CTRL_HW_HOT_RST_MODE_SHIFT);
   2177	val |= APPL_CTRL_HW_HOT_RST_EN;
   2178	appl_writel(pcie, val, APPL_CTRL);
   2179
   2180	return 0;
   2181}
   2182
   2183static int tegra194_pcie_suspend_noirq(struct device *dev)
   2184{
   2185	struct tegra194_pcie *pcie = dev_get_drvdata(dev);
   2186
   2187	if (!pcie->link_state)
   2188		return 0;
   2189
   2190	tegra_pcie_downstream_dev_to_D0(pcie);
   2191	tegra194_pcie_pme_turnoff(pcie);
   2192	tegra_pcie_unconfig_controller(pcie);
   2193
   2194	return 0;
   2195}
   2196
   2197static int tegra194_pcie_resume_noirq(struct device *dev)
   2198{
   2199	struct tegra194_pcie *pcie = dev_get_drvdata(dev);
   2200	int ret;
   2201
   2202	if (!pcie->link_state)
   2203		return 0;
   2204
   2205	ret = tegra_pcie_config_controller(pcie, true);
   2206	if (ret < 0)
   2207		return ret;
   2208
   2209	ret = tegra194_pcie_host_init(&pcie->pci.pp);
   2210	if (ret < 0) {
   2211		dev_err(dev, "Failed to init host: %d\n", ret);
   2212		goto fail_host_init;
   2213	}
   2214
   2215	dw_pcie_setup_rc(&pcie->pci.pp);
   2216
   2217	ret = tegra194_pcie_start_link(&pcie->pci);
   2218	if (ret < 0)
   2219		goto fail_host_init;
   2220
   2221	return 0;
   2222
   2223fail_host_init:
   2224	tegra_pcie_unconfig_controller(pcie);
   2225	return ret;
   2226}
   2227
   2228static int tegra194_pcie_resume_early(struct device *dev)
   2229{
   2230	struct tegra194_pcie *pcie = dev_get_drvdata(dev);
   2231	u32 val;
   2232
   2233	if (pcie->mode == DW_PCIE_EP_TYPE) {
   2234		dev_err(dev, "Suspend is not supported in EP mode");
   2235		return -ENOTSUPP;
   2236	}
   2237
   2238	if (!pcie->link_state)
   2239		return 0;
   2240
   2241	/* Disable HW_HOT_RST mode */
   2242	val = appl_readl(pcie, APPL_CTRL);
   2243	val &= ~(APPL_CTRL_HW_HOT_RST_MODE_MASK <<
   2244		 APPL_CTRL_HW_HOT_RST_MODE_SHIFT);
   2245	val |= APPL_CTRL_HW_HOT_RST_MODE_IMDT_RST <<
   2246	       APPL_CTRL_HW_HOT_RST_MODE_SHIFT;
   2247	val &= ~APPL_CTRL_HW_HOT_RST_EN;
   2248	appl_writel(pcie, val, APPL_CTRL);
   2249
   2250	return 0;
   2251}
   2252
   2253static void tegra194_pcie_shutdown(struct platform_device *pdev)
   2254{
   2255	struct tegra194_pcie *pcie = platform_get_drvdata(pdev);
   2256
   2257	if (!pcie->link_state)
   2258		return;
   2259
   2260	debugfs_remove_recursive(pcie->debugfs);
   2261	tegra_pcie_downstream_dev_to_D0(pcie);
   2262
   2263	disable_irq(pcie->pci.pp.irq);
   2264	if (IS_ENABLED(CONFIG_PCI_MSI))
   2265		disable_irq(pcie->pci.pp.msi_irq);
   2266
   2267	tegra194_pcie_pme_turnoff(pcie);
   2268	tegra_pcie_unconfig_controller(pcie);
   2269}
   2270
   2271static const struct tegra194_pcie_of_data tegra194_pcie_rc_of_data = {
   2272	.mode = DW_PCIE_RC_TYPE,
   2273};
   2274
   2275static const struct tegra194_pcie_of_data tegra194_pcie_ep_of_data = {
   2276	.mode = DW_PCIE_EP_TYPE,
   2277};
   2278
   2279static const struct of_device_id tegra194_pcie_of_match[] = {
   2280	{
   2281		.compatible = "nvidia,tegra194-pcie",
   2282		.data = &tegra194_pcie_rc_of_data,
   2283	},
   2284	{
   2285		.compatible = "nvidia,tegra194-pcie-ep",
   2286		.data = &tegra194_pcie_ep_of_data,
   2287	},
   2288	{},
   2289};
   2290
   2291static const struct dev_pm_ops tegra194_pcie_pm_ops = {
   2292	.suspend_late = tegra194_pcie_suspend_late,
   2293	.suspend_noirq = tegra194_pcie_suspend_noirq,
   2294	.resume_noirq = tegra194_pcie_resume_noirq,
   2295	.resume_early = tegra194_pcie_resume_early,
   2296};
   2297
   2298static struct platform_driver tegra194_pcie_driver = {
   2299	.probe = tegra194_pcie_probe,
   2300	.remove = tegra194_pcie_remove,
   2301	.shutdown = tegra194_pcie_shutdown,
   2302	.driver = {
   2303		.name	= "tegra194-pcie",
   2304		.pm = &tegra194_pcie_pm_ops,
   2305		.of_match_table = tegra194_pcie_of_match,
   2306	},
   2307};
   2308module_platform_driver(tegra194_pcie_driver);
   2309
   2310MODULE_DEVICE_TABLE(of, tegra194_pcie_of_match);
   2311
   2312MODULE_AUTHOR("Vidya Sagar <vidyas@nvidia.com>");
   2313MODULE_DESCRIPTION("NVIDIA PCIe host controller driver");
   2314MODULE_LICENSE("GPL v2");