blob: 389e74be846ceedddb3894be435f46384053721a [file] [log] [blame]
Bjorn Helgaas736759e2018-01-26 14:22:04 -06001// SPDX-License-Identifier: GPL-2.0+
Thierry Redingd1523b52013-08-09 16:49:19 +02002/*
Jay Agarwal94716cd2013-08-09 16:49:24 +02003 * PCIe host controller driver for Tegra SoCs
Thierry Redingd1523b52013-08-09 16:49:19 +02004 *
5 * Copyright (c) 2010, CompuLab, Ltd.
6 * Author: Mike Rapoport <mike@compulab.co.il>
7 *
8 * Based on NVIDIA PCIe driver
9 * Copyright (c) 2008-2009, NVIDIA Corporation.
10 *
11 * Bits taken from arch/arm/mach-dove/pcie.c
12 *
Paul Gortmakerad183272016-07-02 19:13:31 -040013 * Author: Thierry Reding <treding@nvidia.com>
Thierry Redingd1523b52013-08-09 16:49:19 +020014 */
15
16#include <linux/clk.h>
Thierry Reding2cb989f2014-07-22 12:30:46 -060017#include <linux/debugfs.h>
Thierry Redingd1523b52013-08-09 16:49:19 +020018#include <linux/delay.h>
19#include <linux/export.h>
20#include <linux/interrupt.h>
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +053021#include <linux/iopoll.h>
Thierry Redingd1523b52013-08-09 16:49:19 +020022#include <linux/irq.h>
23#include <linux/irqdomain.h>
24#include <linux/kernel.h>
Paul Gortmakerad183272016-07-02 19:13:31 -040025#include <linux/init.h>
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +053026#include <linux/module.h>
Thierry Redingd1523b52013-08-09 16:49:19 +020027#include <linux/msi.h>
28#include <linux/of_address.h>
29#include <linux/of_pci.h>
30#include <linux/of_platform.h>
31#include <linux/pci.h>
Thierry Reding7f1f0542014-08-26 17:11:38 +020032#include <linux/phy/phy.h>
Thierry Redingd1523b52013-08-09 16:49:19 +020033#include <linux/platform_device.h>
Stephen Warren3127a6b2013-11-06 15:56:58 -070034#include <linux/reset.h>
Thierry Redingd1523b52013-08-09 16:49:19 +020035#include <linux/sizes.h>
36#include <linux/slab.h>
Thierry Redingd1523b52013-08-09 16:49:19 +020037#include <linux/vmalloc.h>
38#include <linux/regulator/consumer.h>
39
Thierry Reding306a7f92014-07-17 13:17:24 +020040#include <soc/tegra/cpuidle.h>
Thierry Reding72323982014-07-11 13:19:06 +020041#include <soc/tegra/pmc.h>
Thierry Reding306a7f92014-07-17 13:17:24 +020042
Thierry Redingd1523b52013-08-09 16:49:19 +020043#define INT_PCI_MSI_NR (8 * 32)
Thierry Redingd1523b52013-08-09 16:49:19 +020044
45/* register definitions */
46
47#define AFI_AXI_BAR0_SZ 0x00
48#define AFI_AXI_BAR1_SZ 0x04
49#define AFI_AXI_BAR2_SZ 0x08
50#define AFI_AXI_BAR3_SZ 0x0c
51#define AFI_AXI_BAR4_SZ 0x10
52#define AFI_AXI_BAR5_SZ 0x14
53
54#define AFI_AXI_BAR0_START 0x18
55#define AFI_AXI_BAR1_START 0x1c
56#define AFI_AXI_BAR2_START 0x20
57#define AFI_AXI_BAR3_START 0x24
58#define AFI_AXI_BAR4_START 0x28
59#define AFI_AXI_BAR5_START 0x2c
60
61#define AFI_FPCI_BAR0 0x30
62#define AFI_FPCI_BAR1 0x34
63#define AFI_FPCI_BAR2 0x38
64#define AFI_FPCI_BAR3 0x3c
65#define AFI_FPCI_BAR4 0x40
66#define AFI_FPCI_BAR5 0x44
67
68#define AFI_CACHE_BAR0_SZ 0x48
69#define AFI_CACHE_BAR0_ST 0x4c
70#define AFI_CACHE_BAR1_SZ 0x50
71#define AFI_CACHE_BAR1_ST 0x54
72
73#define AFI_MSI_BAR_SZ 0x60
74#define AFI_MSI_FPCI_BAR_ST 0x64
75#define AFI_MSI_AXI_BAR_ST 0x68
76
77#define AFI_MSI_VEC0 0x6c
78#define AFI_MSI_VEC1 0x70
79#define AFI_MSI_VEC2 0x74
80#define AFI_MSI_VEC3 0x78
81#define AFI_MSI_VEC4 0x7c
82#define AFI_MSI_VEC5 0x80
83#define AFI_MSI_VEC6 0x84
84#define AFI_MSI_VEC7 0x88
85
86#define AFI_MSI_EN_VEC0 0x8c
87#define AFI_MSI_EN_VEC1 0x90
88#define AFI_MSI_EN_VEC2 0x94
89#define AFI_MSI_EN_VEC3 0x98
90#define AFI_MSI_EN_VEC4 0x9c
91#define AFI_MSI_EN_VEC5 0xa0
92#define AFI_MSI_EN_VEC6 0xa4
93#define AFI_MSI_EN_VEC7 0xa8
94
95#define AFI_CONFIGURATION 0xac
96#define AFI_CONFIGURATION_EN_FPCI (1 << 0)
97
98#define AFI_FPCI_ERROR_MASKS 0xb0
99
100#define AFI_INTR_MASK 0xb4
101#define AFI_INTR_MASK_INT_MASK (1 << 0)
102#define AFI_INTR_MASK_MSI_MASK (1 << 8)
103
104#define AFI_INTR_CODE 0xb8
105#define AFI_INTR_CODE_MASK 0xf
Thierry Reding7f1f0542014-08-26 17:11:38 +0200106#define AFI_INTR_INI_SLAVE_ERROR 1
107#define AFI_INTR_INI_DECODE_ERROR 2
Thierry Redingd1523b52013-08-09 16:49:19 +0200108#define AFI_INTR_TARGET_ABORT 3
109#define AFI_INTR_MASTER_ABORT 4
110#define AFI_INTR_INVALID_WRITE 5
111#define AFI_INTR_LEGACY 6
112#define AFI_INTR_FPCI_DECODE_ERROR 7
Thierry Reding7f1f0542014-08-26 17:11:38 +0200113#define AFI_INTR_AXI_DECODE_ERROR 8
114#define AFI_INTR_FPCI_TIMEOUT 9
115#define AFI_INTR_PE_PRSNT_SENSE 10
116#define AFI_INTR_PE_CLKREQ_SENSE 11
117#define AFI_INTR_CLKCLAMP_SENSE 12
118#define AFI_INTR_RDY4PD_SENSE 13
119#define AFI_INTR_P2P_ERROR 14
Thierry Redingd1523b52013-08-09 16:49:19 +0200120
121#define AFI_INTR_SIGNATURE 0xbc
122#define AFI_UPPER_FPCI_ADDRESS 0xc0
123#define AFI_SM_INTR_ENABLE 0xc4
124#define AFI_SM_INTR_INTA_ASSERT (1 << 0)
125#define AFI_SM_INTR_INTB_ASSERT (1 << 1)
126#define AFI_SM_INTR_INTC_ASSERT (1 << 2)
127#define AFI_SM_INTR_INTD_ASSERT (1 << 3)
128#define AFI_SM_INTR_INTA_DEASSERT (1 << 4)
129#define AFI_SM_INTR_INTB_DEASSERT (1 << 5)
130#define AFI_SM_INTR_INTC_DEASSERT (1 << 6)
131#define AFI_SM_INTR_INTD_DEASSERT (1 << 7)
132
133#define AFI_AFI_INTR_ENABLE 0xc8
134#define AFI_INTR_EN_INI_SLVERR (1 << 0)
135#define AFI_INTR_EN_INI_DECERR (1 << 1)
136#define AFI_INTR_EN_TGT_SLVERR (1 << 2)
137#define AFI_INTR_EN_TGT_DECERR (1 << 3)
138#define AFI_INTR_EN_TGT_WRERR (1 << 4)
139#define AFI_INTR_EN_DFPCI_DECERR (1 << 5)
140#define AFI_INTR_EN_AXI_DECERR (1 << 6)
141#define AFI_INTR_EN_FPCI_TIMEOUT (1 << 7)
Jay Agarwal94716cd2013-08-09 16:49:24 +0200142#define AFI_INTR_EN_PRSNT_SENSE (1 << 8)
Thierry Redingd1523b52013-08-09 16:49:19 +0200143
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +0530144#define AFI_PCIE_PME 0xf0
145
Thierry Redingd1523b52013-08-09 16:49:19 +0200146#define AFI_PCIE_CONFIG 0x0f8
147#define AFI_PCIE_CONFIG_PCIE_DISABLE(x) (1 << ((x) + 1))
148#define AFI_PCIE_CONFIG_PCIE_DISABLE_ALL 0xe
149#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_MASK (0xf << 20)
150#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_SINGLE (0x0 << 20)
Jay Agarwal94716cd2013-08-09 16:49:24 +0200151#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_420 (0x0 << 20)
Thierry Reding7f1f0542014-08-26 17:11:38 +0200152#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_X2_X1 (0x0 << 20)
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +0530153#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_401 (0x0 << 20)
Thierry Redingd1523b52013-08-09 16:49:19 +0200154#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_DUAL (0x1 << 20)
Jay Agarwal94716cd2013-08-09 16:49:24 +0200155#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_222 (0x1 << 20)
Thierry Reding7f1f0542014-08-26 17:11:38 +0200156#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_X4_X1 (0x1 << 20)
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +0530157#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_211 (0x1 << 20)
Jay Agarwal94716cd2013-08-09 16:49:24 +0200158#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_411 (0x2 << 20)
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +0530159#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_111 (0x2 << 20)
Thierry Redingd1523b52013-08-09 16:49:19 +0200160
161#define AFI_FUSE 0x104
162#define AFI_FUSE_PCIE_T0_GEN2_DIS (1 << 2)
163
164#define AFI_PEX0_CTRL 0x110
165#define AFI_PEX1_CTRL 0x118
Jay Agarwal94716cd2013-08-09 16:49:24 +0200166#define AFI_PEX2_CTRL 0x128
Thierry Redingd1523b52013-08-09 16:49:19 +0200167#define AFI_PEX_CTRL_RST (1 << 0)
Jay Agarwal94716cd2013-08-09 16:49:24 +0200168#define AFI_PEX_CTRL_CLKREQ_EN (1 << 1)
Thierry Redingd1523b52013-08-09 16:49:19 +0200169#define AFI_PEX_CTRL_REFCLK_EN (1 << 3)
Thierry Reding7f1f0542014-08-26 17:11:38 +0200170#define AFI_PEX_CTRL_OVERRIDE_EN (1 << 4)
171
172#define AFI_PLLE_CONTROL 0x160
173#define AFI_PLLE_CONTROL_BYPASS_PADS2PLLE_CONTROL (1 << 9)
174#define AFI_PLLE_CONTROL_PADS2PLLE_CONTROL_EN (1 << 1)
Thierry Redingd1523b52013-08-09 16:49:19 +0200175
Jay Agarwal94716cd2013-08-09 16:49:24 +0200176#define AFI_PEXBIAS_CTRL_0 0x168
177
Thierry Redingacb341e2016-07-25 16:02:05 -0500178#define RP_VEND_XP 0x00000f00
Thierry Redingd1523b52013-08-09 16:49:19 +0200179#define RP_VEND_XP_DL_UP (1 << 30)
180
Thierry Reding76245ca2016-11-25 11:57:14 +0100181#define RP_VEND_CTL2 0x00000fa8
182#define RP_VEND_CTL2_PCA_ENABLE (1 << 7)
183
Thierry Redingacb341e2016-07-25 16:02:05 -0500184#define RP_PRIV_MISC 0x00000fe0
185#define RP_PRIV_MISC_PRSNT_MAP_EP_PRSNT (0xe << 0)
186#define RP_PRIV_MISC_PRSNT_MAP_EP_ABSNT (0xf << 0)
Thierry Reding7f1f0542014-08-26 17:11:38 +0200187
Thierry Redingd1523b52013-08-09 16:49:19 +0200188#define RP_LINK_CONTROL_STATUS 0x00000090
189#define RP_LINK_CONTROL_STATUS_DL_LINK_ACTIVE 0x20000000
190#define RP_LINK_CONTROL_STATUS_LINKSTAT_MASK 0x3fff0000
191
Thierry Redingacb341e2016-07-25 16:02:05 -0500192#define PADS_CTL_SEL 0x0000009c
Thierry Redingd1523b52013-08-09 16:49:19 +0200193
Thierry Redingacb341e2016-07-25 16:02:05 -0500194#define PADS_CTL 0x000000a0
Thierry Redingd1523b52013-08-09 16:49:19 +0200195#define PADS_CTL_IDDQ_1L (1 << 0)
196#define PADS_CTL_TX_DATA_EN_1L (1 << 6)
197#define PADS_CTL_RX_DATA_EN_1L (1 << 10)
198
Thierry Redingacb341e2016-07-25 16:02:05 -0500199#define PADS_PLL_CTL_TEGRA20 0x000000b8
200#define PADS_PLL_CTL_TEGRA30 0x000000b4
Thierry Redingd1523b52013-08-09 16:49:19 +0200201#define PADS_PLL_CTL_RST_B4SM (1 << 1)
202#define PADS_PLL_CTL_LOCKDET (1 << 8)
203#define PADS_PLL_CTL_REFCLK_MASK (0x3 << 16)
204#define PADS_PLL_CTL_REFCLK_INTERNAL_CML (0 << 16)
205#define PADS_PLL_CTL_REFCLK_INTERNAL_CMOS (1 << 16)
206#define PADS_PLL_CTL_REFCLK_EXTERNAL (2 << 16)
207#define PADS_PLL_CTL_TXCLKREF_MASK (0x1 << 20)
208#define PADS_PLL_CTL_TXCLKREF_DIV10 (0 << 20)
209#define PADS_PLL_CTL_TXCLKREF_DIV5 (1 << 20)
Jay Agarwal94716cd2013-08-09 16:49:24 +0200210#define PADS_PLL_CTL_TXCLKREF_BUF_EN (1 << 22)
211
Thierry Redingacb341e2016-07-25 16:02:05 -0500212#define PADS_REFCLK_CFG0 0x000000c8
213#define PADS_REFCLK_CFG1 0x000000cc
214#define PADS_REFCLK_BIAS 0x000000d0
Thierry Redingd1523b52013-08-09 16:49:19 +0200215
Stephen Warrenb02b07a2013-08-09 16:49:25 +0200216/*
217 * Fields in PADS_REFCLK_CFG*. Those registers form an array of 16-bit
218 * entries, one entry per PCIe port. These field definitions and desired
219 * values aren't in the TRM, but do come from NVIDIA.
220 */
221#define PADS_REFCLK_CFG_TERM_SHIFT 2 /* 6:2 */
222#define PADS_REFCLK_CFG_E_TERM_SHIFT 7
223#define PADS_REFCLK_CFG_PREDI_SHIFT 8 /* 11:8 */
224#define PADS_REFCLK_CFG_DRVI_SHIFT 12 /* 15:12 */
225
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +0530226#define PME_ACK_TIMEOUT 10000
227
Thierry Redingd1523b52013-08-09 16:49:19 +0200228struct tegra_msi {
Yijing Wangc2791b82014-11-11 17:45:45 -0700229 struct msi_controller chip;
Thierry Redingd1523b52013-08-09 16:49:19 +0200230 DECLARE_BITMAP(used, INT_PCI_MSI_NR);
231 struct irq_domain *domain;
Thierry Reding8c2b4e32017-10-09 12:29:35 +0200232 unsigned long pages;
Thierry Redingd1523b52013-08-09 16:49:19 +0200233 struct mutex lock;
Thierry Redingc0165552017-05-04 22:10:31 +0200234 u64 phys;
Thierry Redingd1523b52013-08-09 16:49:19 +0200235 int irq;
236};
237
Jay Agarwal94716cd2013-08-09 16:49:24 +0200238/* used to differentiate between Tegra SoC generations */
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +0530239struct tegra_pcie_port_soc {
240 struct {
241 u8 turnoff_bit;
242 u8 ack_bit;
243 } pme;
244};
245
Thierry Redinga7fbae22016-08-15 17:31:31 +0200246struct tegra_pcie_soc {
Jay Agarwal94716cd2013-08-09 16:49:24 +0200247 unsigned int num_ports;
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +0530248 const struct tegra_pcie_port_soc *ports;
Jay Agarwal94716cd2013-08-09 16:49:24 +0200249 unsigned int msi_base_shift;
250 u32 pads_pll_ctl;
251 u32 tx_ref_sel;
Stephen Warrenf8144302016-07-25 16:02:27 -0500252 u32 pads_refclk_cfg0;
253 u32 pads_refclk_cfg1;
Jay Agarwal94716cd2013-08-09 16:49:24 +0200254 bool has_pex_clkreq_en;
255 bool has_pex_bias_ctrl;
256 bool has_intr_prsnt_sense;
Jay Agarwal94716cd2013-08-09 16:49:24 +0200257 bool has_cml_clk;
Thierry Reding7f1f0542014-08-26 17:11:38 +0200258 bool has_gen2;
Thierry Reding76245ca2016-11-25 11:57:14 +0100259 bool force_pca_enable;
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +0530260 bool program_uphy;
Jay Agarwal94716cd2013-08-09 16:49:24 +0200261};
262
Yijing Wangc2791b82014-11-11 17:45:45 -0700263static inline struct tegra_msi *to_tegra_msi(struct msi_controller *chip)
Thierry Redingd1523b52013-08-09 16:49:19 +0200264{
265 return container_of(chip, struct tegra_msi, chip);
266}
267
268struct tegra_pcie {
269 struct device *dev;
270
271 void __iomem *pads;
272 void __iomem *afi;
Vidya Sagar1fd92922017-12-20 21:36:07 +0100273 void __iomem *cfg;
Thierry Redingd1523b52013-08-09 16:49:19 +0200274 int irq;
275
Vidya Sagar1fd92922017-12-20 21:36:07 +0100276 struct resource cs;
Thierry Redingd1523b52013-08-09 16:49:19 +0200277 struct resource io;
Thierry Reding51067872014-11-27 09:54:09 +0100278 struct resource pio;
Thierry Redingd1523b52013-08-09 16:49:19 +0200279 struct resource mem;
280 struct resource prefetch;
281 struct resource busn;
282
Thierry Reding56e75e22016-02-09 15:52:32 +0100283 struct {
284 resource_size_t mem;
285 resource_size_t io;
286 } offset;
287
Thierry Redingd1523b52013-08-09 16:49:19 +0200288 struct clk *pex_clk;
289 struct clk *afi_clk;
Thierry Redingd1523b52013-08-09 16:49:19 +0200290 struct clk *pll_e;
Jay Agarwal94716cd2013-08-09 16:49:24 +0200291 struct clk *cml_clk;
Thierry Redingd1523b52013-08-09 16:49:19 +0200292
Stephen Warren3127a6b2013-11-06 15:56:58 -0700293 struct reset_control *pex_rst;
294 struct reset_control *afi_rst;
295 struct reset_control *pcie_xrst;
296
Thierry Reding6fe7c182015-11-11 18:25:59 +0100297 bool legacy_phy;
Thierry Reding7f1f0542014-08-26 17:11:38 +0200298 struct phy *phy;
299
Thierry Redingd1523b52013-08-09 16:49:19 +0200300 struct tegra_msi msi;
301
302 struct list_head ports;
Thierry Redingd1523b52013-08-09 16:49:19 +0200303 u32 xbar_config;
304
Thierry Reding077fb152014-05-28 16:49:13 +0200305 struct regulator_bulk_data *supplies;
306 unsigned int num_supplies;
Jay Agarwal94716cd2013-08-09 16:49:24 +0200307
Thierry Redinga7fbae22016-08-15 17:31:31 +0200308 const struct tegra_pcie_soc *soc;
Thierry Reding2cb989f2014-07-22 12:30:46 -0600309 struct dentry *debugfs;
Thierry Redingd1523b52013-08-09 16:49:19 +0200310};
311
312struct tegra_pcie_port {
313 struct tegra_pcie *pcie;
Thierry Reding6fe7c182015-11-11 18:25:59 +0100314 struct device_node *np;
Thierry Redingd1523b52013-08-09 16:49:19 +0200315 struct list_head list;
316 struct resource regs;
317 void __iomem *base;
318 unsigned int index;
319 unsigned int lanes;
Thierry Reding6fe7c182015-11-11 18:25:59 +0100320
321 struct phy **phys;
Thierry Redingd1523b52013-08-09 16:49:19 +0200322};
323
324struct tegra_pcie_bus {
Thierry Redingd1523b52013-08-09 16:49:19 +0200325 struct list_head list;
326 unsigned int nr;
327};
328
Thierry Redingd1523b52013-08-09 16:49:19 +0200329static inline void afi_writel(struct tegra_pcie *pcie, u32 value,
330 unsigned long offset)
331{
332 writel(value, pcie->afi + offset);
333}
334
335static inline u32 afi_readl(struct tegra_pcie *pcie, unsigned long offset)
336{
337 return readl(pcie->afi + offset);
338}
339
340static inline void pads_writel(struct tegra_pcie *pcie, u32 value,
341 unsigned long offset)
342{
343 writel(value, pcie->pads + offset);
344}
345
346static inline u32 pads_readl(struct tegra_pcie *pcie, unsigned long offset)
347{
348 return readl(pcie->pads + offset);
349}
350
351/*
352 * The configuration space mapping on Tegra is somewhat similar to the ECAM
353 * defined by PCIe. However it deviates a bit in how the 4 bits for extended
354 * register accesses are mapped:
355 *
356 * [27:24] extended register number
357 * [23:16] bus number
358 * [15:11] device number
359 * [10: 8] function number
360 * [ 7: 0] register number
361 *
362 * Mapping the whole extended configuration space would require 256 MiB of
363 * virtual address space, only a small part of which will actually be used.
Thierry Redingd1523b52013-08-09 16:49:19 +0200364 *
Vidya Sagar1fd92922017-12-20 21:36:07 +0100365 * To work around this, a 4 KiB region is used to generate the required
366 * configuration transaction with relevant B:D:F and register offset values.
367 * This is achieved by dynamically programming base address and size of
368 * AFI_AXI_BAR used for end point config space mapping to make sure that the
369 * address (access to which generates correct config transaction) falls in
370 * this 4 KiB region.
Thierry Redingd1523b52013-08-09 16:49:19 +0200371 */
Vidya Sagar1fd92922017-12-20 21:36:07 +0100372static unsigned int tegra_pcie_conf_offset(u8 bus, unsigned int devfn,
373 unsigned int where)
Thierry Redingd1523b52013-08-09 16:49:19 +0200374{
Vidya Sagar1fd92922017-12-20 21:36:07 +0100375 return ((where & 0xf00) << 16) | (bus << 16) | (PCI_SLOT(devfn) << 11) |
376 (PCI_FUNC(devfn) << 8) | (where & 0xff);
Thierry Redingb4d18d72016-02-09 15:30:48 +0100377}
378
379static void __iomem *tegra_pcie_map_bus(struct pci_bus *bus,
380 unsigned int devfn,
381 int where)
Thierry Redingd1523b52013-08-09 16:49:19 +0200382{
Manikanta Maddireddy78243ff2018-01-11 11:38:03 +0530383 struct tegra_pcie *pcie = bus->sysdata;
Thierry Redingd1523b52013-08-09 16:49:19 +0200384 void __iomem *addr = NULL;
385
386 if (bus->number == 0) {
387 unsigned int slot = PCI_SLOT(devfn);
388 struct tegra_pcie_port *port;
389
390 list_for_each_entry(port, &pcie->ports, list) {
391 if (port->index + 1 == slot) {
392 addr = port->base + (where & ~3);
393 break;
394 }
395 }
396 } else {
Vidya Sagar1fd92922017-12-20 21:36:07 +0100397 unsigned int offset;
398 u32 base;
Thierry Redingb4d18d72016-02-09 15:30:48 +0100399
Vidya Sagar1fd92922017-12-20 21:36:07 +0100400 offset = tegra_pcie_conf_offset(bus->number, devfn, where);
Thierry Redingb4d18d72016-02-09 15:30:48 +0100401
Vidya Sagar1fd92922017-12-20 21:36:07 +0100402 /* move 4 KiB window to offset within the FPCI region */
403 base = 0xfe100000 + ((offset & ~(SZ_4K - 1)) >> 8);
404 afi_writel(pcie, base, AFI_FPCI_BAR0);
Thierry Redingd1523b52013-08-09 16:49:19 +0200405
Vidya Sagar1fd92922017-12-20 21:36:07 +0100406 /* move to correct offset within the 4 KiB page */
407 addr = pcie->cfg + (offset & (SZ_4K - 1));
Thierry Redingd1523b52013-08-09 16:49:19 +0200408 }
409
410 return addr;
411}
412
Thierry Redingb6cfe8b2017-09-22 23:18:41 -0700413static int tegra_pcie_config_read(struct pci_bus *bus, unsigned int devfn,
414 int where, int size, u32 *value)
415{
416 if (bus->number == 0)
417 return pci_generic_config_read32(bus, devfn, where, size,
418 value);
419
420 return pci_generic_config_read(bus, devfn, where, size, value);
421}
422
423static int tegra_pcie_config_write(struct pci_bus *bus, unsigned int devfn,
424 int where, int size, u32 value)
425{
426 if (bus->number == 0)
427 return pci_generic_config_write32(bus, devfn, where, size,
428 value);
429
430 return pci_generic_config_write(bus, devfn, where, size, value);
431}
432
Thierry Redingd1523b52013-08-09 16:49:19 +0200433static struct pci_ops tegra_pcie_ops = {
Thierry Redingb4d18d72016-02-09 15:30:48 +0100434 .map_bus = tegra_pcie_map_bus,
Thierry Redingb6cfe8b2017-09-22 23:18:41 -0700435 .read = tegra_pcie_config_read,
436 .write = tegra_pcie_config_write,
Thierry Redingd1523b52013-08-09 16:49:19 +0200437};
438
439static unsigned long tegra_pcie_port_get_pex_ctrl(struct tegra_pcie_port *port)
440{
441 unsigned long ret = 0;
442
443 switch (port->index) {
444 case 0:
445 ret = AFI_PEX0_CTRL;
446 break;
447
448 case 1:
449 ret = AFI_PEX1_CTRL;
450 break;
Jay Agarwal94716cd2013-08-09 16:49:24 +0200451
452 case 2:
453 ret = AFI_PEX2_CTRL;
454 break;
Thierry Redingd1523b52013-08-09 16:49:19 +0200455 }
456
457 return ret;
458}
459
460static void tegra_pcie_port_reset(struct tegra_pcie_port *port)
461{
462 unsigned long ctrl = tegra_pcie_port_get_pex_ctrl(port);
463 unsigned long value;
464
465 /* pulse reset signal */
466 value = afi_readl(port->pcie, ctrl);
467 value &= ~AFI_PEX_CTRL_RST;
468 afi_writel(port->pcie, value, ctrl);
469
470 usleep_range(1000, 2000);
471
472 value = afi_readl(port->pcie, ctrl);
473 value |= AFI_PEX_CTRL_RST;
474 afi_writel(port->pcie, value, ctrl);
475}
476
477static void tegra_pcie_port_enable(struct tegra_pcie_port *port)
478{
479 unsigned long ctrl = tegra_pcie_port_get_pex_ctrl(port);
Thierry Redinga7fbae22016-08-15 17:31:31 +0200480 const struct tegra_pcie_soc *soc = port->pcie->soc;
Thierry Redingd1523b52013-08-09 16:49:19 +0200481 unsigned long value;
482
483 /* enable reference clock */
484 value = afi_readl(port->pcie, ctrl);
485 value |= AFI_PEX_CTRL_REFCLK_EN;
Jay Agarwal94716cd2013-08-09 16:49:24 +0200486
487 if (soc->has_pex_clkreq_en)
488 value |= AFI_PEX_CTRL_CLKREQ_EN;
489
Thierry Reding7f1f0542014-08-26 17:11:38 +0200490 value |= AFI_PEX_CTRL_OVERRIDE_EN;
491
Thierry Redingd1523b52013-08-09 16:49:19 +0200492 afi_writel(port->pcie, value, ctrl);
493
494 tegra_pcie_port_reset(port);
Thierry Reding76245ca2016-11-25 11:57:14 +0100495
496 if (soc->force_pca_enable) {
497 value = readl(port->base + RP_VEND_CTL2);
498 value |= RP_VEND_CTL2_PCA_ENABLE;
499 writel(value, port->base + RP_VEND_CTL2);
500 }
Thierry Redingd1523b52013-08-09 16:49:19 +0200501}
502
503static void tegra_pcie_port_disable(struct tegra_pcie_port *port)
504{
505 unsigned long ctrl = tegra_pcie_port_get_pex_ctrl(port);
Thierry Redinga7fbae22016-08-15 17:31:31 +0200506 const struct tegra_pcie_soc *soc = port->pcie->soc;
Thierry Redingd1523b52013-08-09 16:49:19 +0200507 unsigned long value;
508
509 /* assert port reset */
510 value = afi_readl(port->pcie, ctrl);
511 value &= ~AFI_PEX_CTRL_RST;
512 afi_writel(port->pcie, value, ctrl);
513
514 /* disable reference clock */
515 value = afi_readl(port->pcie, ctrl);
Thierry Reding0d20d622014-08-26 17:11:35 +0200516
517 if (soc->has_pex_clkreq_en)
518 value &= ~AFI_PEX_CTRL_CLKREQ_EN;
519
Thierry Redingd1523b52013-08-09 16:49:19 +0200520 value &= ~AFI_PEX_CTRL_REFCLK_EN;
521 afi_writel(port->pcie, value, ctrl);
522}
523
524static void tegra_pcie_port_free(struct tegra_pcie_port *port)
525{
526 struct tegra_pcie *pcie = port->pcie;
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500527 struct device *dev = pcie->dev;
Thierry Redingd1523b52013-08-09 16:49:19 +0200528
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500529 devm_iounmap(dev, port->base);
530 devm_release_mem_region(dev, port->regs.start,
Thierry Redingd1523b52013-08-09 16:49:19 +0200531 resource_size(&port->regs));
532 list_del(&port->list);
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500533 devm_kfree(dev, port);
Thierry Redingd1523b52013-08-09 16:49:19 +0200534}
535
Thierry Redingd1523b52013-08-09 16:49:19 +0200536/* Tegra PCIE root complex wrongly reports device class */
537static void tegra_pcie_fixup_class(struct pci_dev *dev)
538{
539 dev->class = PCI_CLASS_BRIDGE_PCI << 8;
540}
541DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0bf0, tegra_pcie_fixup_class);
542DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0bf1, tegra_pcie_fixup_class);
Jay Agarwal94716cd2013-08-09 16:49:24 +0200543DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0e1c, tegra_pcie_fixup_class);
544DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0e1d, tegra_pcie_fixup_class);
Thierry Redingd1523b52013-08-09 16:49:19 +0200545
546/* Tegra PCIE requires relaxed ordering */
547static void tegra_pcie_relax_enable(struct pci_dev *dev)
548{
549 pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_RELAX_EN);
550}
551DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, tegra_pcie_relax_enable);
552
Arnd Bergmann76f25412016-11-25 11:57:12 +0100553static int tegra_pcie_request_resources(struct tegra_pcie *pcie)
Thierry Redingd1523b52013-08-09 16:49:19 +0200554{
Arnd Bergmann76f25412016-11-25 11:57:12 +0100555 struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
556 struct list_head *windows = &host->windows;
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500557 struct device *dev = pcie->dev;
Thierry Reding41534e52014-08-01 14:15:11 +0200558 int err;
559
Arnd Bergmann76f25412016-11-25 11:57:12 +0100560 pci_add_resource_offset(windows, &pcie->pio, pcie->offset.io);
561 pci_add_resource_offset(windows, &pcie->mem, pcie->offset.mem);
562 pci_add_resource_offset(windows, &pcie->prefetch, pcie->offset.mem);
563 pci_add_resource(windows, &pcie->busn);
Thierry Reding56e75e22016-02-09 15:52:32 +0100564
Arnd Bergmann76f25412016-11-25 11:57:12 +0100565 err = devm_request_pci_bus_resources(dev, windows);
Manikanta Maddireddy527557a2018-02-28 15:30:32 +0530566 if (err < 0) {
567 pci_free_resource_list(windows);
Thierry Reding56e75e22016-02-09 15:52:32 +0100568 return err;
Manikanta Maddireddy527557a2018-02-28 15:30:32 +0530569 }
Thierry Reding56e75e22016-02-09 15:52:32 +0100570
Arnd Bergmann76f25412016-11-25 11:57:12 +0100571 pci_remap_iospace(&pcie->pio, pcie->io.start);
Lorenzo Pieralisi13f392e2016-08-15 17:50:46 +0100572
Arnd Bergmann76f25412016-11-25 11:57:12 +0100573 return 0;
Thierry Redingd1523b52013-08-09 16:49:19 +0200574}
575
Manikanta Maddireddy527557a2018-02-28 15:30:32 +0530576static void tegra_pcie_free_resources(struct tegra_pcie *pcie)
577{
578 struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
579 struct list_head *windows = &host->windows;
580
581 pci_unmap_iospace(&pcie->pio);
582 pci_free_resource_list(windows);
583}
584
Thierry Redingd1523b52013-08-09 16:49:19 +0200585static int tegra_pcie_map_irq(const struct pci_dev *pdev, u8 slot, u8 pin)
586{
Manikanta Maddireddy78243ff2018-01-11 11:38:03 +0530587 struct tegra_pcie *pcie = pdev->bus->sysdata;
Lucas Stachf5d33522014-04-16 10:24:32 -0600588 int irq;
Thierry Redingd1523b52013-08-09 16:49:19 +0200589
Stephen Warrenb4f17372013-05-06 14:19:19 -0600590 tegra_cpuidle_pcie_irqs_in_use();
591
Lucas Stachf5d33522014-04-16 10:24:32 -0600592 irq = of_irq_parse_and_map_pci(pdev, slot, pin);
593 if (!irq)
594 irq = pcie->irq;
595
596 return irq;
Thierry Redingd1523b52013-08-09 16:49:19 +0200597}
598
Thierry Redingd1523b52013-08-09 16:49:19 +0200599static irqreturn_t tegra_pcie_isr(int irq, void *arg)
600{
601 const char *err_msg[] = {
602 "Unknown",
603 "AXI slave error",
604 "AXI decode error",
605 "Target abort",
606 "Master abort",
607 "Invalid write",
Thierry Reding7f1f0542014-08-26 17:11:38 +0200608 "Legacy interrupt",
Thierry Redingd1523b52013-08-09 16:49:19 +0200609 "Response decoding error",
610 "AXI response decoding error",
611 "Transaction timeout",
Thierry Reding7f1f0542014-08-26 17:11:38 +0200612 "Slot present pin change",
613 "Slot clock request change",
614 "TMS clock ramp change",
615 "TMS ready for power down",
616 "Peer2Peer error",
Thierry Redingd1523b52013-08-09 16:49:19 +0200617 };
618 struct tegra_pcie *pcie = arg;
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500619 struct device *dev = pcie->dev;
Thierry Redingd1523b52013-08-09 16:49:19 +0200620 u32 code, signature;
621
622 code = afi_readl(pcie, AFI_INTR_CODE) & AFI_INTR_CODE_MASK;
623 signature = afi_readl(pcie, AFI_INTR_SIGNATURE);
624 afi_writel(pcie, 0, AFI_INTR_CODE);
625
626 if (code == AFI_INTR_LEGACY)
627 return IRQ_NONE;
628
629 if (code >= ARRAY_SIZE(err_msg))
630 code = 0;
631
632 /*
633 * do not pollute kernel log with master abort reports since they
634 * happen a lot during enumeration
635 */
636 if (code == AFI_INTR_MASTER_ABORT)
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500637 dev_dbg(dev, "%s, signature: %08x\n", err_msg[code], signature);
Thierry Redingd1523b52013-08-09 16:49:19 +0200638 else
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500639 dev_err(dev, "%s, signature: %08x\n", err_msg[code], signature);
Thierry Redingd1523b52013-08-09 16:49:19 +0200640
641 if (code == AFI_INTR_TARGET_ABORT || code == AFI_INTR_MASTER_ABORT ||
642 code == AFI_INTR_FPCI_DECODE_ERROR) {
643 u32 fpci = afi_readl(pcie, AFI_UPPER_FPCI_ADDRESS) & 0xff;
644 u64 address = (u64)fpci << 32 | (signature & 0xfffffffc);
645
646 if (code == AFI_INTR_MASTER_ABORT)
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500647 dev_dbg(dev, " FPCI address: %10llx\n", address);
Thierry Redingd1523b52013-08-09 16:49:19 +0200648 else
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500649 dev_err(dev, " FPCI address: %10llx\n", address);
Thierry Redingd1523b52013-08-09 16:49:19 +0200650 }
651
652 return IRQ_HANDLED;
653}
654
655/*
656 * FPCI map is as follows:
657 * - 0xfdfc000000: I/O space
658 * - 0xfdfe000000: type 0 configuration space
659 * - 0xfdff000000: type 1 configuration space
660 * - 0xfe00000000: type 0 extended configuration space
661 * - 0xfe10000000: type 1 extended configuration space
662 */
663static void tegra_pcie_setup_translations(struct tegra_pcie *pcie)
664{
665 u32 fpci_bar, size, axi_address;
666
667 /* Bar 0: type 1 extended configuration space */
Vidya Sagar1fd92922017-12-20 21:36:07 +0100668 size = resource_size(&pcie->cs);
669 afi_writel(pcie, pcie->cs.start, AFI_AXI_BAR0_START);
Thierry Redingd1523b52013-08-09 16:49:19 +0200670 afi_writel(pcie, size >> 12, AFI_AXI_BAR0_SZ);
Thierry Redingd1523b52013-08-09 16:49:19 +0200671
672 /* Bar 1: downstream IO bar */
673 fpci_bar = 0xfdfc0000;
674 size = resource_size(&pcie->io);
Thierry Reding51067872014-11-27 09:54:09 +0100675 axi_address = pcie->io.start;
Thierry Redingd1523b52013-08-09 16:49:19 +0200676 afi_writel(pcie, axi_address, AFI_AXI_BAR1_START);
677 afi_writel(pcie, size >> 12, AFI_AXI_BAR1_SZ);
678 afi_writel(pcie, fpci_bar, AFI_FPCI_BAR1);
679
680 /* Bar 2: prefetchable memory BAR */
681 fpci_bar = (((pcie->prefetch.start >> 12) & 0x0fffffff) << 4) | 0x1;
682 size = resource_size(&pcie->prefetch);
683 axi_address = pcie->prefetch.start;
684 afi_writel(pcie, axi_address, AFI_AXI_BAR2_START);
685 afi_writel(pcie, size >> 12, AFI_AXI_BAR2_SZ);
686 afi_writel(pcie, fpci_bar, AFI_FPCI_BAR2);
687
688 /* Bar 3: non prefetchable memory BAR */
689 fpci_bar = (((pcie->mem.start >> 12) & 0x0fffffff) << 4) | 0x1;
690 size = resource_size(&pcie->mem);
691 axi_address = pcie->mem.start;
692 afi_writel(pcie, axi_address, AFI_AXI_BAR3_START);
693 afi_writel(pcie, size >> 12, AFI_AXI_BAR3_SZ);
694 afi_writel(pcie, fpci_bar, AFI_FPCI_BAR3);
695
696 /* NULL out the remaining BARs as they are not used */
697 afi_writel(pcie, 0, AFI_AXI_BAR4_START);
698 afi_writel(pcie, 0, AFI_AXI_BAR4_SZ);
699 afi_writel(pcie, 0, AFI_FPCI_BAR4);
700
701 afi_writel(pcie, 0, AFI_AXI_BAR5_START);
702 afi_writel(pcie, 0, AFI_AXI_BAR5_SZ);
703 afi_writel(pcie, 0, AFI_FPCI_BAR5);
704
705 /* map all upstream transactions as uncached */
Thierry Redinge32faa32016-02-09 15:52:33 +0100706 afi_writel(pcie, 0, AFI_CACHE_BAR0_ST);
Thierry Redingd1523b52013-08-09 16:49:19 +0200707 afi_writel(pcie, 0, AFI_CACHE_BAR0_SZ);
708 afi_writel(pcie, 0, AFI_CACHE_BAR1_ST);
709 afi_writel(pcie, 0, AFI_CACHE_BAR1_SZ);
710
711 /* MSI translations are setup only when needed */
712 afi_writel(pcie, 0, AFI_MSI_FPCI_BAR_ST);
713 afi_writel(pcie, 0, AFI_MSI_BAR_SZ);
714 afi_writel(pcie, 0, AFI_MSI_AXI_BAR_ST);
715 afi_writel(pcie, 0, AFI_MSI_BAR_SZ);
716}
717
Thierry Reding7f1f0542014-08-26 17:11:38 +0200718static int tegra_pcie_pll_wait(struct tegra_pcie *pcie, unsigned long timeout)
Thierry Redingd1523b52013-08-09 16:49:19 +0200719{
Thierry Redinga7fbae22016-08-15 17:31:31 +0200720 const struct tegra_pcie_soc *soc = pcie->soc;
Thierry Reding7f1f0542014-08-26 17:11:38 +0200721 u32 value;
Thierry Redingd1523b52013-08-09 16:49:19 +0200722
Thierry Reding7f1f0542014-08-26 17:11:38 +0200723 timeout = jiffies + msecs_to_jiffies(timeout);
Jay Agarwal94716cd2013-08-09 16:49:24 +0200724
Thierry Reding7f1f0542014-08-26 17:11:38 +0200725 while (time_before(jiffies, timeout)) {
726 value = pads_readl(pcie, soc->pads_pll_ctl);
727 if (value & PADS_PLL_CTL_LOCKDET)
728 return 0;
729 }
Thierry Redingd1523b52013-08-09 16:49:19 +0200730
Thierry Reding7f1f0542014-08-26 17:11:38 +0200731 return -ETIMEDOUT;
732}
Thierry Redingd1523b52013-08-09 16:49:19 +0200733
Thierry Reding7f1f0542014-08-26 17:11:38 +0200734static int tegra_pcie_phy_enable(struct tegra_pcie *pcie)
735{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500736 struct device *dev = pcie->dev;
Thierry Redinga7fbae22016-08-15 17:31:31 +0200737 const struct tegra_pcie_soc *soc = pcie->soc;
Thierry Reding7f1f0542014-08-26 17:11:38 +0200738 u32 value;
739 int err;
Thierry Redingd1523b52013-08-09 16:49:19 +0200740
Bjorn Helgaasf7625982013-11-14 11:28:18 -0700741 /* initialize internal PHY, enable up to 16 PCIE lanes */
Thierry Redingd1523b52013-08-09 16:49:19 +0200742 pads_writel(pcie, 0x0, PADS_CTL_SEL);
743
744 /* override IDDQ to 1 on all 4 lanes */
745 value = pads_readl(pcie, PADS_CTL);
746 value |= PADS_CTL_IDDQ_1L;
747 pads_writel(pcie, value, PADS_CTL);
748
749 /*
750 * Set up PHY PLL inputs select PLLE output as refclock,
751 * set TX ref sel to div10 (not div5).
752 */
Jay Agarwal94716cd2013-08-09 16:49:24 +0200753 value = pads_readl(pcie, soc->pads_pll_ctl);
Thierry Redingd1523b52013-08-09 16:49:19 +0200754 value &= ~(PADS_PLL_CTL_REFCLK_MASK | PADS_PLL_CTL_TXCLKREF_MASK);
Jay Agarwal94716cd2013-08-09 16:49:24 +0200755 value |= PADS_PLL_CTL_REFCLK_INTERNAL_CML | soc->tx_ref_sel;
756 pads_writel(pcie, value, soc->pads_pll_ctl);
Thierry Redingd1523b52013-08-09 16:49:19 +0200757
Eric Yuenec732762014-08-26 17:11:37 +0200758 /* reset PLL */
759 value = pads_readl(pcie, soc->pads_pll_ctl);
760 value &= ~PADS_PLL_CTL_RST_B4SM;
761 pads_writel(pcie, value, soc->pads_pll_ctl);
762
763 usleep_range(20, 100);
764
Thierry Redingd1523b52013-08-09 16:49:19 +0200765 /* take PLL out of reset */
Jay Agarwal94716cd2013-08-09 16:49:24 +0200766 value = pads_readl(pcie, soc->pads_pll_ctl);
Thierry Redingd1523b52013-08-09 16:49:19 +0200767 value |= PADS_PLL_CTL_RST_B4SM;
Jay Agarwal94716cd2013-08-09 16:49:24 +0200768 pads_writel(pcie, value, soc->pads_pll_ctl);
Thierry Redingd1523b52013-08-09 16:49:19 +0200769
Thierry Redingd1523b52013-08-09 16:49:19 +0200770 /* wait for the PLL to lock */
Thierry Reding7f1f0542014-08-26 17:11:38 +0200771 err = tegra_pcie_pll_wait(pcie, 500);
772 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500773 dev_err(dev, "PLL failed to lock: %d\n", err);
Thierry Reding7f1f0542014-08-26 17:11:38 +0200774 return err;
775 }
Thierry Redingd1523b52013-08-09 16:49:19 +0200776
777 /* turn off IDDQ override */
778 value = pads_readl(pcie, PADS_CTL);
779 value &= ~PADS_CTL_IDDQ_1L;
780 pads_writel(pcie, value, PADS_CTL);
781
782 /* enable TX/RX data */
783 value = pads_readl(pcie, PADS_CTL);
784 value |= PADS_CTL_TX_DATA_EN_1L | PADS_CTL_RX_DATA_EN_1L;
785 pads_writel(pcie, value, PADS_CTL);
786
Thierry Reding7f1f0542014-08-26 17:11:38 +0200787 return 0;
788}
789
Thierry Reding6fe7c182015-11-11 18:25:59 +0100790static int tegra_pcie_phy_disable(struct tegra_pcie *pcie)
791{
Thierry Redinga7fbae22016-08-15 17:31:31 +0200792 const struct tegra_pcie_soc *soc = pcie->soc;
Thierry Reding6fe7c182015-11-11 18:25:59 +0100793 u32 value;
794
795 /* disable TX/RX data */
796 value = pads_readl(pcie, PADS_CTL);
797 value &= ~(PADS_CTL_TX_DATA_EN_1L | PADS_CTL_RX_DATA_EN_1L);
798 pads_writel(pcie, value, PADS_CTL);
799
800 /* override IDDQ */
801 value = pads_readl(pcie, PADS_CTL);
802 value |= PADS_CTL_IDDQ_1L;
Bjorn Helgaas8dd99bc2016-10-05 16:04:13 -0500803 pads_writel(pcie, value, PADS_CTL);
Thierry Reding6fe7c182015-11-11 18:25:59 +0100804
805 /* reset PLL */
806 value = pads_readl(pcie, soc->pads_pll_ctl);
807 value &= ~PADS_PLL_CTL_RST_B4SM;
808 pads_writel(pcie, value, soc->pads_pll_ctl);
809
810 usleep_range(20, 100);
811
812 return 0;
813}
814
815static int tegra_pcie_port_phy_power_on(struct tegra_pcie_port *port)
816{
817 struct device *dev = port->pcie->dev;
818 unsigned int i;
819 int err;
820
821 for (i = 0; i < port->lanes; i++) {
822 err = phy_power_on(port->phys[i]);
823 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500824 dev_err(dev, "failed to power on PHY#%u: %d\n", i, err);
Thierry Reding6fe7c182015-11-11 18:25:59 +0100825 return err;
826 }
827 }
828
829 return 0;
830}
831
832static int tegra_pcie_port_phy_power_off(struct tegra_pcie_port *port)
833{
834 struct device *dev = port->pcie->dev;
835 unsigned int i;
836 int err;
837
838 for (i = 0; i < port->lanes; i++) {
839 err = phy_power_off(port->phys[i]);
840 if (err < 0) {
841 dev_err(dev, "failed to power off PHY#%u: %d\n", i,
842 err);
843 return err;
844 }
845 }
846
847 return 0;
848}
849
850static int tegra_pcie_phy_power_on(struct tegra_pcie *pcie)
851{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500852 struct device *dev = pcie->dev;
Thierry Redinga7fbae22016-08-15 17:31:31 +0200853 const struct tegra_pcie_soc *soc = pcie->soc;
Thierry Reding6fe7c182015-11-11 18:25:59 +0100854 struct tegra_pcie_port *port;
855 int err;
856
857 if (pcie->legacy_phy) {
858 if (pcie->phy)
859 err = phy_power_on(pcie->phy);
860 else
861 err = tegra_pcie_phy_enable(pcie);
862
863 if (err < 0)
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500864 dev_err(dev, "failed to power on PHY: %d\n", err);
Thierry Reding6fe7c182015-11-11 18:25:59 +0100865
866 return err;
867 }
868
869 list_for_each_entry(port, &pcie->ports, list) {
870 err = tegra_pcie_port_phy_power_on(port);
871 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500872 dev_err(dev,
Thierry Reding6fe7c182015-11-11 18:25:59 +0100873 "failed to power on PCIe port %u PHY: %d\n",
874 port->index, err);
875 return err;
876 }
877 }
878
Stephen Warrencf5d31802016-07-25 16:02:21 -0500879 /* Configure the reference clock driver */
Stephen Warrenf8144302016-07-25 16:02:27 -0500880 pads_writel(pcie, soc->pads_refclk_cfg0, PADS_REFCLK_CFG0);
Stephen Warrencf5d31802016-07-25 16:02:21 -0500881
882 if (soc->num_ports > 2)
Stephen Warrenf8144302016-07-25 16:02:27 -0500883 pads_writel(pcie, soc->pads_refclk_cfg1, PADS_REFCLK_CFG1);
Stephen Warrencf5d31802016-07-25 16:02:21 -0500884
Thierry Reding6fe7c182015-11-11 18:25:59 +0100885 return 0;
886}
887
888static int tegra_pcie_phy_power_off(struct tegra_pcie *pcie)
889{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500890 struct device *dev = pcie->dev;
Thierry Reding6fe7c182015-11-11 18:25:59 +0100891 struct tegra_pcie_port *port;
892 int err;
893
894 if (pcie->legacy_phy) {
895 if (pcie->phy)
896 err = phy_power_off(pcie->phy);
897 else
898 err = tegra_pcie_phy_disable(pcie);
899
900 if (err < 0)
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500901 dev_err(dev, "failed to power off PHY: %d\n", err);
Thierry Reding6fe7c182015-11-11 18:25:59 +0100902
903 return err;
904 }
905
906 list_for_each_entry(port, &pcie->ports, list) {
907 err = tegra_pcie_port_phy_power_off(port);
908 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500909 dev_err(dev,
Thierry Reding6fe7c182015-11-11 18:25:59 +0100910 "failed to power off PCIe port %u PHY: %d\n",
911 port->index, err);
912 return err;
913 }
914 }
915
916 return 0;
917}
918
Thierry Reding7f1f0542014-08-26 17:11:38 +0200919static int tegra_pcie_enable_controller(struct tegra_pcie *pcie)
920{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -0500921 struct device *dev = pcie->dev;
Thierry Redinga7fbae22016-08-15 17:31:31 +0200922 const struct tegra_pcie_soc *soc = pcie->soc;
Thierry Reding7f1f0542014-08-26 17:11:38 +0200923 struct tegra_pcie_port *port;
924 unsigned long value;
925 int err;
926
927 /* enable PLL power down */
928 if (pcie->phy) {
929 value = afi_readl(pcie, AFI_PLLE_CONTROL);
930 value &= ~AFI_PLLE_CONTROL_BYPASS_PADS2PLLE_CONTROL;
931 value |= AFI_PLLE_CONTROL_PADS2PLLE_CONTROL_EN;
932 afi_writel(pcie, value, AFI_PLLE_CONTROL);
933 }
934
935 /* power down PCIe slot clock bias pad */
936 if (soc->has_pex_bias_ctrl)
937 afi_writel(pcie, 0, AFI_PEXBIAS_CTRL_0);
938
939 /* configure mode and disable all ports */
940 value = afi_readl(pcie, AFI_PCIE_CONFIG);
941 value &= ~AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_MASK;
942 value |= AFI_PCIE_CONFIG_PCIE_DISABLE_ALL | pcie->xbar_config;
943
944 list_for_each_entry(port, &pcie->ports, list)
945 value &= ~AFI_PCIE_CONFIG_PCIE_DISABLE(port->index);
946
947 afi_writel(pcie, value, AFI_PCIE_CONFIG);
948
949 if (soc->has_gen2) {
950 value = afi_readl(pcie, AFI_FUSE);
951 value &= ~AFI_FUSE_PCIE_T0_GEN2_DIS;
952 afi_writel(pcie, value, AFI_FUSE);
953 } else {
954 value = afi_readl(pcie, AFI_FUSE);
955 value |= AFI_FUSE_PCIE_T0_GEN2_DIS;
956 afi_writel(pcie, value, AFI_FUSE);
957 }
958
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +0530959 if (soc->program_uphy) {
960 err = tegra_pcie_phy_power_on(pcie);
961 if (err < 0) {
962 dev_err(dev, "failed to power on PHY(s): %d\n", err);
963 return err;
964 }
Thierry Reding7f1f0542014-08-26 17:11:38 +0200965 }
966
Thierry Redingd1523b52013-08-09 16:49:19 +0200967 /* take the PCIe interface module out of reset */
Stephen Warren3127a6b2013-11-06 15:56:58 -0700968 reset_control_deassert(pcie->pcie_xrst);
Thierry Redingd1523b52013-08-09 16:49:19 +0200969
970 /* finally enable PCIe */
971 value = afi_readl(pcie, AFI_CONFIGURATION);
972 value |= AFI_CONFIGURATION_EN_FPCI;
973 afi_writel(pcie, value, AFI_CONFIGURATION);
974
975 value = AFI_INTR_EN_INI_SLVERR | AFI_INTR_EN_INI_DECERR |
976 AFI_INTR_EN_TGT_SLVERR | AFI_INTR_EN_TGT_DECERR |
977 AFI_INTR_EN_TGT_WRERR | AFI_INTR_EN_DFPCI_DECERR;
Jay Agarwal94716cd2013-08-09 16:49:24 +0200978
979 if (soc->has_intr_prsnt_sense)
980 value |= AFI_INTR_EN_PRSNT_SENSE;
981
Thierry Redingd1523b52013-08-09 16:49:19 +0200982 afi_writel(pcie, value, AFI_AFI_INTR_ENABLE);
983 afi_writel(pcie, 0xffffffff, AFI_SM_INTR_ENABLE);
984
985 /* don't enable MSI for now, only when needed */
986 afi_writel(pcie, AFI_INTR_MASK_INT_MASK, AFI_INTR_MASK);
987
988 /* disable all exceptions */
989 afi_writel(pcie, 0, AFI_FPCI_ERROR_MASKS);
990
991 return 0;
992}
993
Manikanta Maddireddy527557a2018-02-28 15:30:32 +0530994static void tegra_pcie_disable_controller(struct tegra_pcie *pcie)
995{
996 int err;
997
998 reset_control_assert(pcie->pcie_xrst);
999
1000 if (pcie->soc->program_uphy) {
1001 err = tegra_pcie_phy_power_off(pcie);
1002 if (err < 0)
1003 dev_err(pcie->dev, "failed to power off PHY(s): %d\n",
1004 err);
1005 }
1006}
1007
Thierry Redingd1523b52013-08-09 16:49:19 +02001008static void tegra_pcie_power_off(struct tegra_pcie *pcie)
1009{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001010 struct device *dev = pcie->dev;
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05301011 const struct tegra_pcie_soc *soc = pcie->soc;
Thierry Redingd1523b52013-08-09 16:49:19 +02001012 int err;
1013
Stephen Warren3127a6b2013-11-06 15:56:58 -07001014 reset_control_assert(pcie->afi_rst);
1015 reset_control_assert(pcie->pex_rst);
Thierry Redingd1523b52013-08-09 16:49:19 +02001016
Manikanta Maddireddy527557a2018-02-28 15:30:32 +05301017 clk_disable_unprepare(pcie->pll_e);
1018 if (soc->has_cml_clk)
1019 clk_disable_unprepare(pcie->cml_clk);
1020 clk_disable_unprepare(pcie->afi_clk);
1021 clk_disable_unprepare(pcie->pex_clk);
1022
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05301023 if (!dev->pm_domain)
1024 tegra_powergate_power_off(TEGRA_POWERGATE_PCIE);
Thierry Redingd1523b52013-08-09 16:49:19 +02001025
Thierry Reding077fb152014-05-28 16:49:13 +02001026 err = regulator_bulk_disable(pcie->num_supplies, pcie->supplies);
Thierry Redingd1523b52013-08-09 16:49:19 +02001027 if (err < 0)
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001028 dev_warn(dev, "failed to disable regulators: %d\n", err);
Thierry Redingd1523b52013-08-09 16:49:19 +02001029}
1030
1031static int tegra_pcie_power_on(struct tegra_pcie *pcie)
1032{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001033 struct device *dev = pcie->dev;
Thierry Redinga7fbae22016-08-15 17:31:31 +02001034 const struct tegra_pcie_soc *soc = pcie->soc;
Thierry Redingd1523b52013-08-09 16:49:19 +02001035 int err;
1036
Stephen Warren3127a6b2013-11-06 15:56:58 -07001037 reset_control_assert(pcie->pcie_xrst);
1038 reset_control_assert(pcie->afi_rst);
1039 reset_control_assert(pcie->pex_rst);
Thierry Redingd1523b52013-08-09 16:49:19 +02001040
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05301041 if (!dev->pm_domain)
1042 tegra_powergate_power_off(TEGRA_POWERGATE_PCIE);
Thierry Redingd1523b52013-08-09 16:49:19 +02001043
1044 /* enable regulators */
Thierry Reding077fb152014-05-28 16:49:13 +02001045 err = regulator_bulk_enable(pcie->num_supplies, pcie->supplies);
1046 if (err < 0)
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001047 dev_err(dev, "failed to enable regulators: %d\n", err);
Jay Agarwal94716cd2013-08-09 16:49:24 +02001048
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05301049 if (dev->pm_domain) {
1050 err = clk_prepare_enable(pcie->pex_clk);
1051 if (err) {
1052 dev_err(dev, "failed to enable PEX clock: %d\n", err);
1053 return err;
1054 }
1055 reset_control_deassert(pcie->pex_rst);
1056 } else {
1057 err = tegra_powergate_sequence_power_up(TEGRA_POWERGATE_PCIE,
1058 pcie->pex_clk,
1059 pcie->pex_rst);
1060 if (err) {
1061 dev_err(dev, "powerup sequence failed: %d\n", err);
1062 return err;
1063 }
Thierry Redingd1523b52013-08-09 16:49:19 +02001064 }
1065
Stephen Warren3127a6b2013-11-06 15:56:58 -07001066 reset_control_deassert(pcie->afi_rst);
Thierry Redingd1523b52013-08-09 16:49:19 +02001067
1068 err = clk_prepare_enable(pcie->afi_clk);
1069 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001070 dev_err(dev, "failed to enable AFI clock: %d\n", err);
Thierry Redingd1523b52013-08-09 16:49:19 +02001071 return err;
1072 }
1073
Jay Agarwal94716cd2013-08-09 16:49:24 +02001074 if (soc->has_cml_clk) {
1075 err = clk_prepare_enable(pcie->cml_clk);
1076 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001077 dev_err(dev, "failed to enable CML clock: %d\n", err);
Jay Agarwal94716cd2013-08-09 16:49:24 +02001078 return err;
1079 }
1080 }
1081
Thierry Redingd1523b52013-08-09 16:49:19 +02001082 err = clk_prepare_enable(pcie->pll_e);
1083 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001084 dev_err(dev, "failed to enable PLLE clock: %d\n", err);
Thierry Redingd1523b52013-08-09 16:49:19 +02001085 return err;
1086 }
1087
1088 return 0;
1089}
1090
1091static int tegra_pcie_clocks_get(struct tegra_pcie *pcie)
1092{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001093 struct device *dev = pcie->dev;
Thierry Redinga7fbae22016-08-15 17:31:31 +02001094 const struct tegra_pcie_soc *soc = pcie->soc;
Jay Agarwal94716cd2013-08-09 16:49:24 +02001095
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001096 pcie->pex_clk = devm_clk_get(dev, "pex");
Thierry Redingd1523b52013-08-09 16:49:19 +02001097 if (IS_ERR(pcie->pex_clk))
1098 return PTR_ERR(pcie->pex_clk);
1099
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001100 pcie->afi_clk = devm_clk_get(dev, "afi");
Thierry Redingd1523b52013-08-09 16:49:19 +02001101 if (IS_ERR(pcie->afi_clk))
1102 return PTR_ERR(pcie->afi_clk);
1103
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001104 pcie->pll_e = devm_clk_get(dev, "pll_e");
Thierry Redingd1523b52013-08-09 16:49:19 +02001105 if (IS_ERR(pcie->pll_e))
1106 return PTR_ERR(pcie->pll_e);
1107
Jay Agarwal94716cd2013-08-09 16:49:24 +02001108 if (soc->has_cml_clk) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001109 pcie->cml_clk = devm_clk_get(dev, "cml");
Jay Agarwal94716cd2013-08-09 16:49:24 +02001110 if (IS_ERR(pcie->cml_clk))
1111 return PTR_ERR(pcie->cml_clk);
1112 }
1113
Thierry Redingd1523b52013-08-09 16:49:19 +02001114 return 0;
1115}
1116
Stephen Warren3127a6b2013-11-06 15:56:58 -07001117static int tegra_pcie_resets_get(struct tegra_pcie *pcie)
1118{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001119 struct device *dev = pcie->dev;
1120
Philipp Zabel4b9cc2c2017-07-19 17:25:57 +02001121 pcie->pex_rst = devm_reset_control_get_exclusive(dev, "pex");
Stephen Warren3127a6b2013-11-06 15:56:58 -07001122 if (IS_ERR(pcie->pex_rst))
1123 return PTR_ERR(pcie->pex_rst);
1124
Philipp Zabel4b9cc2c2017-07-19 17:25:57 +02001125 pcie->afi_rst = devm_reset_control_get_exclusive(dev, "afi");
Stephen Warren3127a6b2013-11-06 15:56:58 -07001126 if (IS_ERR(pcie->afi_rst))
1127 return PTR_ERR(pcie->afi_rst);
1128
Philipp Zabel4b9cc2c2017-07-19 17:25:57 +02001129 pcie->pcie_xrst = devm_reset_control_get_exclusive(dev, "pcie_x");
Stephen Warren3127a6b2013-11-06 15:56:58 -07001130 if (IS_ERR(pcie->pcie_xrst))
1131 return PTR_ERR(pcie->pcie_xrst);
1132
1133 return 0;
1134}
1135
Thierry Reding6fe7c182015-11-11 18:25:59 +01001136static int tegra_pcie_phys_get_legacy(struct tegra_pcie *pcie)
1137{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001138 struct device *dev = pcie->dev;
Thierry Reding6fe7c182015-11-11 18:25:59 +01001139 int err;
1140
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001141 pcie->phy = devm_phy_optional_get(dev, "pcie");
Thierry Reding6fe7c182015-11-11 18:25:59 +01001142 if (IS_ERR(pcie->phy)) {
1143 err = PTR_ERR(pcie->phy);
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001144 dev_err(dev, "failed to get PHY: %d\n", err);
Thierry Reding6fe7c182015-11-11 18:25:59 +01001145 return err;
1146 }
1147
1148 err = phy_init(pcie->phy);
1149 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001150 dev_err(dev, "failed to initialize PHY: %d\n", err);
Thierry Reding6fe7c182015-11-11 18:25:59 +01001151 return err;
1152 }
1153
1154 pcie->legacy_phy = true;
1155
1156 return 0;
1157}
1158
1159static struct phy *devm_of_phy_optional_get_index(struct device *dev,
1160 struct device_node *np,
1161 const char *consumer,
1162 unsigned int index)
1163{
1164 struct phy *phy;
1165 char *name;
1166
1167 name = kasprintf(GFP_KERNEL, "%s-%u", consumer, index);
1168 if (!name)
1169 return ERR_PTR(-ENOMEM);
1170
1171 phy = devm_of_phy_get(dev, np, name);
1172 kfree(name);
1173
1174 if (IS_ERR(phy) && PTR_ERR(phy) == -ENODEV)
1175 phy = NULL;
1176
1177 return phy;
1178}
1179
1180static int tegra_pcie_port_get_phys(struct tegra_pcie_port *port)
1181{
1182 struct device *dev = port->pcie->dev;
1183 struct phy *phy;
1184 unsigned int i;
1185 int err;
1186
1187 port->phys = devm_kcalloc(dev, sizeof(phy), port->lanes, GFP_KERNEL);
1188 if (!port->phys)
1189 return -ENOMEM;
1190
1191 for (i = 0; i < port->lanes; i++) {
1192 phy = devm_of_phy_optional_get_index(dev, port->np, "pcie", i);
1193 if (IS_ERR(phy)) {
1194 dev_err(dev, "failed to get PHY#%u: %ld\n", i,
1195 PTR_ERR(phy));
1196 return PTR_ERR(phy);
1197 }
1198
1199 err = phy_init(phy);
1200 if (err < 0) {
1201 dev_err(dev, "failed to initialize PHY#%u: %d\n", i,
1202 err);
1203 return err;
1204 }
1205
1206 port->phys[i] = phy;
1207 }
1208
1209 return 0;
1210}
1211
1212static int tegra_pcie_phys_get(struct tegra_pcie *pcie)
1213{
Thierry Redinga7fbae22016-08-15 17:31:31 +02001214 const struct tegra_pcie_soc *soc = pcie->soc;
Thierry Reding6fe7c182015-11-11 18:25:59 +01001215 struct device_node *np = pcie->dev->of_node;
1216 struct tegra_pcie_port *port;
1217 int err;
1218
1219 if (!soc->has_gen2 || of_find_property(np, "phys", NULL) != NULL)
1220 return tegra_pcie_phys_get_legacy(pcie);
1221
1222 list_for_each_entry(port, &pcie->ports, list) {
1223 err = tegra_pcie_port_get_phys(port);
1224 if (err < 0)
1225 return err;
1226 }
1227
1228 return 0;
1229}
1230
Manikanta Maddireddy527557a2018-02-28 15:30:32 +05301231static void tegra_pcie_phys_put(struct tegra_pcie *pcie)
1232{
1233 struct tegra_pcie_port *port;
1234 struct device *dev = pcie->dev;
1235 int err, i;
1236
1237 if (pcie->legacy_phy) {
1238 err = phy_exit(pcie->phy);
1239 if (err < 0)
1240 dev_err(dev, "failed to teardown PHY: %d\n", err);
1241 return;
1242 }
1243
1244 list_for_each_entry(port, &pcie->ports, list) {
1245 for (i = 0; i < port->lanes; i++) {
1246 err = phy_exit(port->phys[i]);
1247 if (err < 0)
1248 dev_err(dev, "failed to teardown PHY#%u: %d\n",
1249 i, err);
1250 }
1251 }
1252}
1253
1254
Thierry Redingd1523b52013-08-09 16:49:19 +02001255static int tegra_pcie_get_resources(struct tegra_pcie *pcie)
1256{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001257 struct device *dev = pcie->dev;
1258 struct platform_device *pdev = to_platform_device(dev);
Thierry Redingd1523b52013-08-09 16:49:19 +02001259 struct resource *pads, *afi, *res;
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05301260 const struct tegra_pcie_soc *soc = pcie->soc;
Thierry Redingd1523b52013-08-09 16:49:19 +02001261 int err;
1262
1263 err = tegra_pcie_clocks_get(pcie);
1264 if (err) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001265 dev_err(dev, "failed to get clocks: %d\n", err);
Thierry Redingd1523b52013-08-09 16:49:19 +02001266 return err;
1267 }
1268
Stephen Warren3127a6b2013-11-06 15:56:58 -07001269 err = tegra_pcie_resets_get(pcie);
1270 if (err) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001271 dev_err(dev, "failed to get resets: %d\n", err);
Stephen Warren3127a6b2013-11-06 15:56:58 -07001272 return err;
1273 }
1274
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05301275 if (soc->program_uphy) {
1276 err = tegra_pcie_phys_get(pcie);
1277 if (err < 0) {
1278 dev_err(dev, "failed to get PHYs: %d\n", err);
1279 return err;
1280 }
Thierry Reding7f1f0542014-08-26 17:11:38 +02001281 }
1282
Thierry Redingd1523b52013-08-09 16:49:19 +02001283 pads = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pads");
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001284 pcie->pads = devm_ioremap_resource(dev, pads);
Julia Lawalldc05ee32013-08-26 11:11:09 +02001285 if (IS_ERR(pcie->pads)) {
1286 err = PTR_ERR(pcie->pads);
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05301287 goto phys_put;
Thierry Redingd1523b52013-08-09 16:49:19 +02001288 }
1289
1290 afi = platform_get_resource_byname(pdev, IORESOURCE_MEM, "afi");
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001291 pcie->afi = devm_ioremap_resource(dev, afi);
Julia Lawalldc05ee32013-08-26 11:11:09 +02001292 if (IS_ERR(pcie->afi)) {
1293 err = PTR_ERR(pcie->afi);
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05301294 goto phys_put;
Thierry Redingd1523b52013-08-09 16:49:19 +02001295 }
1296
Julia Lawalldc05ee32013-08-26 11:11:09 +02001297 /* request configuration space, but remap later, on demand */
Thierry Redingd1523b52013-08-09 16:49:19 +02001298 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cs");
1299 if (!res) {
1300 err = -EADDRNOTAVAIL;
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05301301 goto phys_put;
Thierry Redingd1523b52013-08-09 16:49:19 +02001302 }
1303
Vidya Sagar1fd92922017-12-20 21:36:07 +01001304 pcie->cs = *res;
1305
1306 /* constrain configuration space to 4 KiB */
1307 pcie->cs.end = pcie->cs.start + SZ_4K - 1;
1308
1309 pcie->cfg = devm_ioremap_resource(dev, &pcie->cs);
1310 if (IS_ERR(pcie->cfg)) {
1311 err = PTR_ERR(pcie->cfg);
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05301312 goto phys_put;
Thierry Redingd1523b52013-08-09 16:49:19 +02001313 }
1314
1315 /* request interrupt */
1316 err = platform_get_irq_byname(pdev, "intr");
1317 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001318 dev_err(dev, "failed to get IRQ: %d\n", err);
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05301319 goto phys_put;
Thierry Redingd1523b52013-08-09 16:49:19 +02001320 }
1321
1322 pcie->irq = err;
1323
1324 err = request_irq(pcie->irq, tegra_pcie_isr, IRQF_SHARED, "PCIE", pcie);
1325 if (err) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001326 dev_err(dev, "failed to register IRQ: %d\n", err);
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05301327 goto phys_put;
Thierry Redingd1523b52013-08-09 16:49:19 +02001328 }
1329
1330 return 0;
1331
Manikanta Maddireddy527557a2018-02-28 15:30:32 +05301332phys_put:
1333 if (soc->program_uphy)
1334 tegra_pcie_phys_put(pcie);
Thierry Redingd1523b52013-08-09 16:49:19 +02001335 return err;
1336}
1337
1338static int tegra_pcie_put_resources(struct tegra_pcie *pcie)
1339{
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05301340 const struct tegra_pcie_soc *soc = pcie->soc;
Thierry Reding7f1f0542014-08-26 17:11:38 +02001341
Thierry Redingd1523b52013-08-09 16:49:19 +02001342 if (pcie->irq > 0)
1343 free_irq(pcie->irq, pcie);
1344
Manikanta Maddireddy527557a2018-02-28 15:30:32 +05301345 if (soc->program_uphy)
1346 tegra_pcie_phys_put(pcie);
Thierry Reding7f1f0542014-08-26 17:11:38 +02001347
Thierry Redingd1523b52013-08-09 16:49:19 +02001348 return 0;
1349}
1350
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05301351static void tegra_pcie_pme_turnoff(struct tegra_pcie_port *port)
1352{
1353 struct tegra_pcie *pcie = port->pcie;
1354 const struct tegra_pcie_soc *soc = pcie->soc;
1355 int err;
1356 u32 val;
1357 u8 ack_bit;
1358
1359 val = afi_readl(pcie, AFI_PCIE_PME);
1360 val |= (0x1 << soc->ports[port->index].pme.turnoff_bit);
1361 afi_writel(pcie, val, AFI_PCIE_PME);
1362
1363 ack_bit = soc->ports[port->index].pme.ack_bit;
1364 err = readl_poll_timeout(pcie->afi + AFI_PCIE_PME, val,
1365 val & (0x1 << ack_bit), 1, PME_ACK_TIMEOUT);
1366 if (err)
1367 dev_err(pcie->dev, "PME Ack is not received on port: %d\n",
1368 port->index);
1369
1370 usleep_range(10000, 11000);
1371
1372 val = afi_readl(pcie, AFI_PCIE_PME);
1373 val &= ~(0x1 << soc->ports[port->index].pme.turnoff_bit);
1374 afi_writel(pcie, val, AFI_PCIE_PME);
1375}
1376
Thierry Redingd1523b52013-08-09 16:49:19 +02001377static int tegra_msi_alloc(struct tegra_msi *chip)
1378{
1379 int msi;
1380
1381 mutex_lock(&chip->lock);
1382
1383 msi = find_first_zero_bit(chip->used, INT_PCI_MSI_NR);
1384 if (msi < INT_PCI_MSI_NR)
1385 set_bit(msi, chip->used);
1386 else
1387 msi = -ENOSPC;
1388
1389 mutex_unlock(&chip->lock);
1390
1391 return msi;
1392}
1393
1394static void tegra_msi_free(struct tegra_msi *chip, unsigned long irq)
1395{
1396 struct device *dev = chip->chip.dev;
1397
1398 mutex_lock(&chip->lock);
1399
1400 if (!test_bit(irq, chip->used))
1401 dev_err(dev, "trying to free unused MSI#%lu\n", irq);
1402 else
1403 clear_bit(irq, chip->used);
1404
1405 mutex_unlock(&chip->lock);
1406}
1407
1408static irqreturn_t tegra_pcie_msi_irq(int irq, void *data)
1409{
1410 struct tegra_pcie *pcie = data;
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001411 struct device *dev = pcie->dev;
Thierry Redingd1523b52013-08-09 16:49:19 +02001412 struct tegra_msi *msi = &pcie->msi;
1413 unsigned int i, processed = 0;
1414
1415 for (i = 0; i < 8; i++) {
1416 unsigned long reg = afi_readl(pcie, AFI_MSI_VEC0 + i * 4);
1417
1418 while (reg) {
1419 unsigned int offset = find_first_bit(&reg, 32);
1420 unsigned int index = i * 32 + offset;
1421 unsigned int irq;
1422
1423 /* clear the interrupt */
1424 afi_writel(pcie, 1 << offset, AFI_MSI_VEC0 + i * 4);
1425
1426 irq = irq_find_mapping(msi->domain, index);
1427 if (irq) {
1428 if (test_bit(index, msi->used))
1429 generic_handle_irq(irq);
1430 else
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001431 dev_info(dev, "unhandled MSI\n");
Thierry Redingd1523b52013-08-09 16:49:19 +02001432 } else {
1433 /*
1434 * that's weird who triggered this?
1435 * just clear it
1436 */
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001437 dev_info(dev, "unexpected MSI\n");
Thierry Redingd1523b52013-08-09 16:49:19 +02001438 }
1439
1440 /* see if there's any more pending in this vector */
1441 reg = afi_readl(pcie, AFI_MSI_VEC0 + i * 4);
1442
1443 processed++;
1444 }
1445 }
1446
1447 return processed > 0 ? IRQ_HANDLED : IRQ_NONE;
1448}
1449
Yijing Wangc2791b82014-11-11 17:45:45 -07001450static int tegra_msi_setup_irq(struct msi_controller *chip,
1451 struct pci_dev *pdev, struct msi_desc *desc)
Thierry Redingd1523b52013-08-09 16:49:19 +02001452{
1453 struct tegra_msi *msi = to_tegra_msi(chip);
1454 struct msi_msg msg;
1455 unsigned int irq;
1456 int hwirq;
1457
1458 hwirq = tegra_msi_alloc(msi);
1459 if (hwirq < 0)
1460 return hwirq;
1461
1462 irq = irq_create_mapping(msi->domain, hwirq);
Jisheng Zhang019fa462014-07-29 09:33:30 +08001463 if (!irq) {
1464 tegra_msi_free(msi, hwirq);
Thierry Redingd1523b52013-08-09 16:49:19 +02001465 return -EINVAL;
Jisheng Zhang019fa462014-07-29 09:33:30 +08001466 }
Thierry Redingd1523b52013-08-09 16:49:19 +02001467
1468 irq_set_msi_desc(irq, desc);
1469
Thierry Redingc0165552017-05-04 22:10:31 +02001470 msg.address_lo = lower_32_bits(msi->phys);
1471 msg.address_hi = upper_32_bits(msi->phys);
Thierry Redingd1523b52013-08-09 16:49:19 +02001472 msg.data = hwirq;
1473
Jiang Liu83a18912014-11-09 23:10:34 +08001474 pci_write_msi_msg(irq, &msg);
Thierry Redingd1523b52013-08-09 16:49:19 +02001475
1476 return 0;
1477}
1478
Yijing Wangc2791b82014-11-11 17:45:45 -07001479static void tegra_msi_teardown_irq(struct msi_controller *chip,
1480 unsigned int irq)
Thierry Redingd1523b52013-08-09 16:49:19 +02001481{
1482 struct tegra_msi *msi = to_tegra_msi(chip);
1483 struct irq_data *d = irq_get_irq_data(irq);
Jisheng Zhang019fa462014-07-29 09:33:30 +08001484 irq_hw_number_t hwirq = irqd_to_hwirq(d);
Thierry Redingd1523b52013-08-09 16:49:19 +02001485
Jisheng Zhang019fa462014-07-29 09:33:30 +08001486 irq_dispose_mapping(irq);
1487 tegra_msi_free(msi, hwirq);
Thierry Redingd1523b52013-08-09 16:49:19 +02001488}
1489
1490static struct irq_chip tegra_msi_irq_chip = {
1491 .name = "Tegra PCIe MSI",
Thomas Gleixner280510f2014-11-23 12:23:20 +01001492 .irq_enable = pci_msi_unmask_irq,
1493 .irq_disable = pci_msi_mask_irq,
1494 .irq_mask = pci_msi_mask_irq,
1495 .irq_unmask = pci_msi_unmask_irq,
Thierry Redingd1523b52013-08-09 16:49:19 +02001496};
1497
1498static int tegra_msi_map(struct irq_domain *domain, unsigned int irq,
1499 irq_hw_number_t hwirq)
1500{
1501 irq_set_chip_and_handler(irq, &tegra_msi_irq_chip, handle_simple_irq);
1502 irq_set_chip_data(irq, domain->host_data);
Thierry Redingd1523b52013-08-09 16:49:19 +02001503
Stephen Warrenb4f17372013-05-06 14:19:19 -06001504 tegra_cpuidle_pcie_irqs_in_use();
1505
Thierry Redingd1523b52013-08-09 16:49:19 +02001506 return 0;
1507}
1508
1509static const struct irq_domain_ops msi_domain_ops = {
1510 .map = tegra_msi_map,
1511};
1512
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05301513static int tegra_pcie_msi_setup(struct tegra_pcie *pcie)
Thierry Redingd1523b52013-08-09 16:49:19 +02001514{
Arnd Bergmann76f25412016-11-25 11:57:12 +01001515 struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
1516 struct platform_device *pdev = to_platform_device(pcie->dev);
Thierry Redingd1523b52013-08-09 16:49:19 +02001517 struct tegra_msi *msi = &pcie->msi;
Arnd Bergmann76f25412016-11-25 11:57:12 +01001518 struct device *dev = pcie->dev;
Thierry Redingd1523b52013-08-09 16:49:19 +02001519 int err;
Thierry Redingd1523b52013-08-09 16:49:19 +02001520
1521 mutex_init(&msi->lock);
1522
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001523 msi->chip.dev = dev;
Thierry Redingd1523b52013-08-09 16:49:19 +02001524 msi->chip.setup_irq = tegra_msi_setup_irq;
1525 msi->chip.teardown_irq = tegra_msi_teardown_irq;
1526
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001527 msi->domain = irq_domain_add_linear(dev->of_node, INT_PCI_MSI_NR,
Thierry Redingd1523b52013-08-09 16:49:19 +02001528 &msi_domain_ops, &msi->chip);
1529 if (!msi->domain) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001530 dev_err(dev, "failed to create IRQ domain\n");
Thierry Redingd1523b52013-08-09 16:49:19 +02001531 return -ENOMEM;
1532 }
1533
1534 err = platform_get_irq_byname(pdev, "msi");
1535 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001536 dev_err(dev, "failed to get IRQ: %d\n", err);
Thierry Redingd1523b52013-08-09 16:49:19 +02001537 goto err;
1538 }
1539
1540 msi->irq = err;
1541
Grygorii Strashko8ff0ef92015-12-10 21:18:20 +02001542 err = request_irq(msi->irq, tegra_pcie_msi_irq, IRQF_NO_THREAD,
Thierry Redingd1523b52013-08-09 16:49:19 +02001543 tegra_msi_irq_chip.name, pcie);
1544 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001545 dev_err(dev, "failed to request IRQ: %d\n", err);
Thierry Redingd1523b52013-08-09 16:49:19 +02001546 goto err;
1547 }
1548
Thierry Reding8c2b4e32017-10-09 12:29:35 +02001549 /* setup AFI/FPCI range */
1550 msi->pages = __get_free_pages(GFP_KERNEL, 0);
1551 msi->phys = virt_to_phys((void *)msi->pages);
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05301552 host->msi = &msi->chip;
1553
1554 return 0;
1555
1556err:
1557 irq_domain_remove(msi->domain);
1558 return err;
1559}
1560
1561static void tegra_pcie_enable_msi(struct tegra_pcie *pcie)
1562{
1563 const struct tegra_pcie_soc *soc = pcie->soc;
1564 struct tegra_msi *msi = &pcie->msi;
1565 u32 reg;
Thierry Redingd1523b52013-08-09 16:49:19 +02001566
Thierry Redingc0165552017-05-04 22:10:31 +02001567 afi_writel(pcie, msi->phys >> soc->msi_base_shift, AFI_MSI_FPCI_BAR_ST);
1568 afi_writel(pcie, msi->phys, AFI_MSI_AXI_BAR_ST);
Thierry Redingd1523b52013-08-09 16:49:19 +02001569 /* this register is in 4K increments */
1570 afi_writel(pcie, 1, AFI_MSI_BAR_SZ);
1571
1572 /* enable all MSI vectors */
1573 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC0);
1574 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC1);
1575 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC2);
1576 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC3);
1577 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC4);
1578 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC5);
1579 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC6);
1580 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC7);
1581
1582 /* and unmask the MSI interrupt */
1583 reg = afi_readl(pcie, AFI_INTR_MASK);
1584 reg |= AFI_INTR_MASK_MSI_MASK;
1585 afi_writel(pcie, reg, AFI_INTR_MASK);
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05301586}
Thierry Redingd1523b52013-08-09 16:49:19 +02001587
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05301588static void tegra_pcie_msi_teardown(struct tegra_pcie *pcie)
1589{
1590 struct tegra_msi *msi = &pcie->msi;
1591 unsigned int i, irq;
Arnd Bergmann76f25412016-11-25 11:57:12 +01001592
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05301593 free_pages(msi->pages, 0);
Thierry Redingd1523b52013-08-09 16:49:19 +02001594
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05301595 if (msi->irq > 0)
1596 free_irq(msi->irq, pcie);
1597
1598 for (i = 0; i < INT_PCI_MSI_NR; i++) {
1599 irq = irq_find_mapping(msi->domain, i);
1600 if (irq > 0)
1601 irq_dispose_mapping(irq);
1602 }
1603
Thierry Redingd1523b52013-08-09 16:49:19 +02001604 irq_domain_remove(msi->domain);
Thierry Redingd1523b52013-08-09 16:49:19 +02001605}
1606
1607static int tegra_pcie_disable_msi(struct tegra_pcie *pcie)
1608{
Thierry Redingd1523b52013-08-09 16:49:19 +02001609 u32 value;
1610
1611 /* mask the MSI interrupt */
1612 value = afi_readl(pcie, AFI_INTR_MASK);
1613 value &= ~AFI_INTR_MASK_MSI_MASK;
1614 afi_writel(pcie, value, AFI_INTR_MASK);
1615
1616 /* disable all MSI vectors */
1617 afi_writel(pcie, 0, AFI_MSI_EN_VEC0);
1618 afi_writel(pcie, 0, AFI_MSI_EN_VEC1);
1619 afi_writel(pcie, 0, AFI_MSI_EN_VEC2);
1620 afi_writel(pcie, 0, AFI_MSI_EN_VEC3);
1621 afi_writel(pcie, 0, AFI_MSI_EN_VEC4);
1622 afi_writel(pcie, 0, AFI_MSI_EN_VEC5);
1623 afi_writel(pcie, 0, AFI_MSI_EN_VEC6);
1624 afi_writel(pcie, 0, AFI_MSI_EN_VEC7);
1625
Thierry Redingd1523b52013-08-09 16:49:19 +02001626 return 0;
1627}
1628
1629static int tegra_pcie_get_xbar_config(struct tegra_pcie *pcie, u32 lanes,
1630 u32 *xbar)
1631{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001632 struct device *dev = pcie->dev;
1633 struct device_node *np = dev->of_node;
Thierry Redingd1523b52013-08-09 16:49:19 +02001634
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05301635 if (of_device_is_compatible(np, "nvidia,tegra186-pcie")) {
1636 switch (lanes) {
1637 case 0x010004:
1638 dev_info(dev, "4x1, 1x1 configuration\n");
1639 *xbar = AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_401;
1640 return 0;
1641
1642 case 0x010102:
1643 dev_info(dev, "2x1, 1X1, 1x1 configuration\n");
1644 *xbar = AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_211;
1645 return 0;
1646
1647 case 0x010101:
1648 dev_info(dev, "1x1, 1x1, 1x1 configuration\n");
1649 *xbar = AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_111;
1650 return 0;
1651
1652 default:
1653 dev_info(dev, "wrong configuration updated in DT, "
1654 "switching to default 2x1, 1x1, 1x1 "
1655 "configuration\n");
1656 *xbar = AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_211;
1657 return 0;
1658 }
1659 } else if (of_device_is_compatible(np, "nvidia,tegra124-pcie") ||
1660 of_device_is_compatible(np, "nvidia,tegra210-pcie")) {
Thierry Reding7f1f0542014-08-26 17:11:38 +02001661 switch (lanes) {
1662 case 0x0000104:
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001663 dev_info(dev, "4x1, 1x1 configuration\n");
Thierry Reding7f1f0542014-08-26 17:11:38 +02001664 *xbar = AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_X4_X1;
1665 return 0;
1666
1667 case 0x0000102:
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001668 dev_info(dev, "2x1, 1x1 configuration\n");
Thierry Reding7f1f0542014-08-26 17:11:38 +02001669 *xbar = AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_X2_X1;
1670 return 0;
1671 }
1672 } else if (of_device_is_compatible(np, "nvidia,tegra30-pcie")) {
Jay Agarwal94716cd2013-08-09 16:49:24 +02001673 switch (lanes) {
1674 case 0x00000204:
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001675 dev_info(dev, "4x1, 2x1 configuration\n");
Jay Agarwal94716cd2013-08-09 16:49:24 +02001676 *xbar = AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_420;
1677 return 0;
Thierry Redingd1523b52013-08-09 16:49:19 +02001678
Jay Agarwal94716cd2013-08-09 16:49:24 +02001679 case 0x00020202:
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001680 dev_info(dev, "2x3 configuration\n");
Jay Agarwal94716cd2013-08-09 16:49:24 +02001681 *xbar = AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_222;
1682 return 0;
1683
1684 case 0x00010104:
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001685 dev_info(dev, "4x1, 1x2 configuration\n");
Jay Agarwal94716cd2013-08-09 16:49:24 +02001686 *xbar = AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_411;
1687 return 0;
1688 }
1689 } else if (of_device_is_compatible(np, "nvidia,tegra20-pcie")) {
1690 switch (lanes) {
1691 case 0x00000004:
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001692 dev_info(dev, "single-mode configuration\n");
Jay Agarwal94716cd2013-08-09 16:49:24 +02001693 *xbar = AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_SINGLE;
1694 return 0;
1695
1696 case 0x00000202:
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001697 dev_info(dev, "dual-mode configuration\n");
Jay Agarwal94716cd2013-08-09 16:49:24 +02001698 *xbar = AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_DUAL;
1699 return 0;
1700 }
Thierry Redingd1523b52013-08-09 16:49:19 +02001701 }
1702
1703 return -EINVAL;
1704}
1705
Thierry Reding077fb152014-05-28 16:49:13 +02001706/*
1707 * Check whether a given set of supplies is available in a device tree node.
1708 * This is used to check whether the new or the legacy device tree bindings
1709 * should be used.
1710 */
1711static bool of_regulator_bulk_available(struct device_node *np,
1712 struct regulator_bulk_data *supplies,
1713 unsigned int num_supplies)
1714{
1715 char property[32];
1716 unsigned int i;
1717
1718 for (i = 0; i < num_supplies; i++) {
1719 snprintf(property, 32, "%s-supply", supplies[i].supply);
1720
1721 if (of_find_property(np, property, NULL) == NULL)
1722 return false;
1723 }
1724
1725 return true;
1726}
1727
1728/*
1729 * Old versions of the device tree binding for this device used a set of power
1730 * supplies that didn't match the hardware inputs. This happened to work for a
1731 * number of cases but is not future proof. However to preserve backwards-
1732 * compatibility with old device trees, this function will try to use the old
1733 * set of supplies.
1734 */
1735static int tegra_pcie_get_legacy_regulators(struct tegra_pcie *pcie)
1736{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001737 struct device *dev = pcie->dev;
1738 struct device_node *np = dev->of_node;
Thierry Reding077fb152014-05-28 16:49:13 +02001739
1740 if (of_device_is_compatible(np, "nvidia,tegra30-pcie"))
1741 pcie->num_supplies = 3;
1742 else if (of_device_is_compatible(np, "nvidia,tegra20-pcie"))
1743 pcie->num_supplies = 2;
1744
1745 if (pcie->num_supplies == 0) {
Rob Herringb63773a2017-07-18 16:43:21 -05001746 dev_err(dev, "device %pOF not supported in legacy mode\n", np);
Thierry Reding077fb152014-05-28 16:49:13 +02001747 return -ENODEV;
1748 }
1749
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001750 pcie->supplies = devm_kcalloc(dev, pcie->num_supplies,
Thierry Reding077fb152014-05-28 16:49:13 +02001751 sizeof(*pcie->supplies),
1752 GFP_KERNEL);
1753 if (!pcie->supplies)
1754 return -ENOMEM;
1755
1756 pcie->supplies[0].supply = "pex-clk";
1757 pcie->supplies[1].supply = "vdd";
1758
1759 if (pcie->num_supplies > 2)
1760 pcie->supplies[2].supply = "avdd";
1761
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001762 return devm_regulator_bulk_get(dev, pcie->num_supplies, pcie->supplies);
Thierry Reding077fb152014-05-28 16:49:13 +02001763}
1764
1765/*
1766 * Obtains the list of regulators required for a particular generation of the
1767 * IP block.
1768 *
1769 * This would've been nice to do simply by providing static tables for use
1770 * with the regulator_bulk_*() API, but unfortunately Tegra30 is a bit quirky
1771 * in that it has two pairs or AVDD_PEX and VDD_PEX supplies (PEXA and PEXB)
1772 * and either seems to be optional depending on which ports are being used.
1773 */
1774static int tegra_pcie_get_regulators(struct tegra_pcie *pcie, u32 lane_mask)
1775{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001776 struct device *dev = pcie->dev;
1777 struct device_node *np = dev->of_node;
Thierry Reding077fb152014-05-28 16:49:13 +02001778 unsigned int i = 0;
1779
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05301780 if (of_device_is_compatible(np, "nvidia,tegra186-pcie")) {
1781 pcie->num_supplies = 4;
1782
1783 pcie->supplies = devm_kcalloc(pcie->dev, pcie->num_supplies,
1784 sizeof(*pcie->supplies),
1785 GFP_KERNEL);
1786 if (!pcie->supplies)
1787 return -ENOMEM;
1788
1789 pcie->supplies[i++].supply = "dvdd-pex";
1790 pcie->supplies[i++].supply = "hvdd-pex-pll";
1791 pcie->supplies[i++].supply = "hvdd-pex";
1792 pcie->supplies[i++].supply = "vddio-pexctl-aud";
1793 } else if (of_device_is_compatible(np, "nvidia,tegra210-pcie")) {
Thierry Redingc7a091c2016-11-25 11:57:15 +01001794 pcie->num_supplies = 6;
1795
1796 pcie->supplies = devm_kcalloc(pcie->dev, pcie->num_supplies,
1797 sizeof(*pcie->supplies),
1798 GFP_KERNEL);
1799 if (!pcie->supplies)
1800 return -ENOMEM;
1801
1802 pcie->supplies[i++].supply = "avdd-pll-uerefe";
1803 pcie->supplies[i++].supply = "hvddio-pex";
1804 pcie->supplies[i++].supply = "dvddio-pex";
1805 pcie->supplies[i++].supply = "dvdd-pex-pll";
1806 pcie->supplies[i++].supply = "hvdd-pex-pll-e";
1807 pcie->supplies[i++].supply = "vddio-pex-ctl";
1808 } else if (of_device_is_compatible(np, "nvidia,tegra124-pcie")) {
Thierry Reding7f1f0542014-08-26 17:11:38 +02001809 pcie->num_supplies = 7;
1810
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001811 pcie->supplies = devm_kcalloc(dev, pcie->num_supplies,
Thierry Reding7f1f0542014-08-26 17:11:38 +02001812 sizeof(*pcie->supplies),
1813 GFP_KERNEL);
1814 if (!pcie->supplies)
1815 return -ENOMEM;
1816
1817 pcie->supplies[i++].supply = "avddio-pex";
1818 pcie->supplies[i++].supply = "dvddio-pex";
1819 pcie->supplies[i++].supply = "avdd-pex-pll";
1820 pcie->supplies[i++].supply = "hvdd-pex";
1821 pcie->supplies[i++].supply = "hvdd-pex-pll-e";
1822 pcie->supplies[i++].supply = "vddio-pex-ctl";
1823 pcie->supplies[i++].supply = "avdd-pll-erefe";
1824 } else if (of_device_is_compatible(np, "nvidia,tegra30-pcie")) {
Thierry Reding077fb152014-05-28 16:49:13 +02001825 bool need_pexa = false, need_pexb = false;
1826
1827 /* VDD_PEXA and AVDD_PEXA supply lanes 0 to 3 */
1828 if (lane_mask & 0x0f)
1829 need_pexa = true;
1830
1831 /* VDD_PEXB and AVDD_PEXB supply lanes 4 to 5 */
1832 if (lane_mask & 0x30)
1833 need_pexb = true;
1834
1835 pcie->num_supplies = 4 + (need_pexa ? 2 : 0) +
1836 (need_pexb ? 2 : 0);
1837
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001838 pcie->supplies = devm_kcalloc(dev, pcie->num_supplies,
Thierry Reding077fb152014-05-28 16:49:13 +02001839 sizeof(*pcie->supplies),
1840 GFP_KERNEL);
1841 if (!pcie->supplies)
1842 return -ENOMEM;
1843
1844 pcie->supplies[i++].supply = "avdd-pex-pll";
1845 pcie->supplies[i++].supply = "hvdd-pex";
1846 pcie->supplies[i++].supply = "vddio-pex-ctl";
1847 pcie->supplies[i++].supply = "avdd-plle";
1848
1849 if (need_pexa) {
1850 pcie->supplies[i++].supply = "avdd-pexa";
1851 pcie->supplies[i++].supply = "vdd-pexa";
1852 }
1853
1854 if (need_pexb) {
1855 pcie->supplies[i++].supply = "avdd-pexb";
1856 pcie->supplies[i++].supply = "vdd-pexb";
1857 }
1858 } else if (of_device_is_compatible(np, "nvidia,tegra20-pcie")) {
1859 pcie->num_supplies = 5;
1860
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001861 pcie->supplies = devm_kcalloc(dev, pcie->num_supplies,
Thierry Reding077fb152014-05-28 16:49:13 +02001862 sizeof(*pcie->supplies),
1863 GFP_KERNEL);
1864 if (!pcie->supplies)
1865 return -ENOMEM;
1866
1867 pcie->supplies[0].supply = "avdd-pex";
1868 pcie->supplies[1].supply = "vdd-pex";
1869 pcie->supplies[2].supply = "avdd-pex-pll";
1870 pcie->supplies[3].supply = "avdd-plle";
1871 pcie->supplies[4].supply = "vddio-pex-clk";
1872 }
1873
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001874 if (of_regulator_bulk_available(dev->of_node, pcie->supplies,
Thierry Reding077fb152014-05-28 16:49:13 +02001875 pcie->num_supplies))
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001876 return devm_regulator_bulk_get(dev, pcie->num_supplies,
Thierry Reding077fb152014-05-28 16:49:13 +02001877 pcie->supplies);
1878
1879 /*
1880 * If not all regulators are available for this new scheme, assume
1881 * that the device tree complies with an older version of the device
1882 * tree binding.
1883 */
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001884 dev_info(dev, "using legacy DT binding for power supplies\n");
Thierry Reding077fb152014-05-28 16:49:13 +02001885
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001886 devm_kfree(dev, pcie->supplies);
Thierry Reding077fb152014-05-28 16:49:13 +02001887 pcie->num_supplies = 0;
1888
1889 return tegra_pcie_get_legacy_regulators(pcie);
1890}
1891
Thierry Redingd1523b52013-08-09 16:49:19 +02001892static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)
1893{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001894 struct device *dev = pcie->dev;
1895 struct device_node *np = dev->of_node, *port;
Thierry Redinga7fbae22016-08-15 17:31:31 +02001896 const struct tegra_pcie_soc *soc = pcie->soc;
Thierry Redingd1523b52013-08-09 16:49:19 +02001897 struct of_pci_range_parser parser;
1898 struct of_pci_range range;
Thierry Reding077fb152014-05-28 16:49:13 +02001899 u32 lanes = 0, mask = 0;
1900 unsigned int lane = 0;
Thierry Redingd1523b52013-08-09 16:49:19 +02001901 struct resource res;
Thierry Redingd1523b52013-08-09 16:49:19 +02001902 int err;
1903
1904 if (of_pci_range_parser_init(&parser, np)) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001905 dev_err(dev, "missing \"ranges\" property\n");
Thierry Redingd1523b52013-08-09 16:49:19 +02001906 return -EINVAL;
1907 }
1908
Thierry Redingd1523b52013-08-09 16:49:19 +02001909 for_each_of_pci_range(&parser, &range) {
Liviu Dudau0b0b0892014-09-29 15:29:25 +01001910 err = of_pci_range_to_resource(&range, np, &res);
1911 if (err < 0)
1912 return err;
Thierry Redingd1523b52013-08-09 16:49:19 +02001913
1914 switch (res.flags & IORESOURCE_TYPE_BITS) {
1915 case IORESOURCE_IO:
Thierry Reding56e75e22016-02-09 15:52:32 +01001916 /* Track the bus -> CPU I/O mapping offset. */
1917 pcie->offset.io = res.start - range.pci_addr;
1918
Thierry Reding51067872014-11-27 09:54:09 +01001919 memcpy(&pcie->pio, &res, sizeof(res));
1920 pcie->pio.name = np->full_name;
1921
1922 /*
1923 * The Tegra PCIe host bridge uses this to program the
1924 * mapping of the I/O space to the physical address,
1925 * so we override the .start and .end fields here that
1926 * of_pci_range_to_resource() converted to I/O space.
1927 * We also set the IORESOURCE_MEM type to clarify that
1928 * the resource is in the physical memory space.
1929 */
1930 pcie->io.start = range.cpu_addr;
1931 pcie->io.end = range.cpu_addr + range.size - 1;
1932 pcie->io.flags = IORESOURCE_MEM;
1933 pcie->io.name = "I/O";
1934
1935 memcpy(&res, &pcie->io, sizeof(res));
Thierry Redingd1523b52013-08-09 16:49:19 +02001936 break;
1937
1938 case IORESOURCE_MEM:
Thierry Reding56e75e22016-02-09 15:52:32 +01001939 /*
1940 * Track the bus -> CPU memory mapping offset. This
1941 * assumes that the prefetchable and non-prefetchable
1942 * regions will be the last of type IORESOURCE_MEM in
1943 * the ranges property.
1944 * */
1945 pcie->offset.mem = res.start - range.pci_addr;
1946
Thierry Redingd1523b52013-08-09 16:49:19 +02001947 if (res.flags & IORESOURCE_PREFETCH) {
1948 memcpy(&pcie->prefetch, &res, sizeof(res));
Thierry Reding41534e52014-08-01 14:15:11 +02001949 pcie->prefetch.name = "prefetchable";
Thierry Redingd1523b52013-08-09 16:49:19 +02001950 } else {
1951 memcpy(&pcie->mem, &res, sizeof(res));
Thierry Reding41534e52014-08-01 14:15:11 +02001952 pcie->mem.name = "non-prefetchable";
Thierry Redingd1523b52013-08-09 16:49:19 +02001953 }
1954 break;
1955 }
1956 }
1957
1958 err = of_pci_parse_bus_range(np, &pcie->busn);
1959 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001960 dev_err(dev, "failed to parse ranges property: %d\n", err);
Thierry Redingd1523b52013-08-09 16:49:19 +02001961 pcie->busn.name = np->name;
1962 pcie->busn.start = 0;
1963 pcie->busn.end = 0xff;
1964 pcie->busn.flags = IORESOURCE_BUS;
1965 }
1966
1967 /* parse root ports */
1968 for_each_child_of_node(np, port) {
1969 struct tegra_pcie_port *rp;
1970 unsigned int index;
1971 u32 value;
1972
1973 err = of_pci_get_devfn(port);
1974 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001975 dev_err(dev, "failed to parse address: %d\n", err);
Thierry Redingd1523b52013-08-09 16:49:19 +02001976 return err;
1977 }
1978
1979 index = PCI_SLOT(err);
1980
Jay Agarwal94716cd2013-08-09 16:49:24 +02001981 if (index < 1 || index > soc->num_ports) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001982 dev_err(dev, "invalid port number: %d\n", index);
Thierry Redingd1523b52013-08-09 16:49:19 +02001983 return -EINVAL;
1984 }
1985
1986 index--;
1987
1988 err = of_property_read_u32(port, "nvidia,num-lanes", &value);
1989 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001990 dev_err(dev, "failed to parse # of lanes: %d\n",
Thierry Redingd1523b52013-08-09 16:49:19 +02001991 err);
1992 return err;
1993 }
1994
1995 if (value > 16) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05001996 dev_err(dev, "invalid # of lanes: %u\n", value);
Thierry Redingd1523b52013-08-09 16:49:19 +02001997 return -EINVAL;
1998 }
1999
2000 lanes |= value << (index << 3);
2001
Thierry Reding077fb152014-05-28 16:49:13 +02002002 if (!of_device_is_available(port)) {
2003 lane += value;
Thierry Redingd1523b52013-08-09 16:49:19 +02002004 continue;
Thierry Reding077fb152014-05-28 16:49:13 +02002005 }
2006
2007 mask |= ((1 << value) - 1) << lane;
2008 lane += value;
Thierry Redingd1523b52013-08-09 16:49:19 +02002009
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05002010 rp = devm_kzalloc(dev, sizeof(*rp), GFP_KERNEL);
Thierry Redingd1523b52013-08-09 16:49:19 +02002011 if (!rp)
2012 return -ENOMEM;
2013
2014 err = of_address_to_resource(port, 0, &rp->regs);
2015 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05002016 dev_err(dev, "failed to parse address: %d\n", err);
Thierry Redingd1523b52013-08-09 16:49:19 +02002017 return err;
2018 }
2019
2020 INIT_LIST_HEAD(&rp->list);
2021 rp->index = index;
2022 rp->lanes = value;
2023 rp->pcie = pcie;
Thierry Reding6fe7c182015-11-11 18:25:59 +01002024 rp->np = port;
Thierry Redingd1523b52013-08-09 16:49:19 +02002025
Lorenzo Pieralisi3e02dc42017-04-19 17:49:06 +01002026 rp->base = devm_pci_remap_cfg_resource(dev, &rp->regs);
Julia Lawalldc05ee32013-08-26 11:11:09 +02002027 if (IS_ERR(rp->base))
2028 return PTR_ERR(rp->base);
Thierry Redingd1523b52013-08-09 16:49:19 +02002029
2030 list_add_tail(&rp->list, &pcie->ports);
2031 }
2032
2033 err = tegra_pcie_get_xbar_config(pcie, lanes, &pcie->xbar_config);
2034 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05002035 dev_err(dev, "invalid lane configuration\n");
Thierry Redingd1523b52013-08-09 16:49:19 +02002036 return err;
2037 }
2038
Thierry Reding077fb152014-05-28 16:49:13 +02002039 err = tegra_pcie_get_regulators(pcie, mask);
2040 if (err < 0)
2041 return err;
2042
Thierry Redingd1523b52013-08-09 16:49:19 +02002043 return 0;
2044}
2045
2046/*
2047 * FIXME: If there are no PCIe cards attached, then calling this function
2048 * can result in the increase of the bootup time as there are big timeout
2049 * loops.
2050 */
2051#define TEGRA_PCIE_LINKUP_TIMEOUT 200 /* up to 1.2 seconds */
2052static bool tegra_pcie_port_check_link(struct tegra_pcie_port *port)
2053{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05002054 struct device *dev = port->pcie->dev;
Thierry Redingd1523b52013-08-09 16:49:19 +02002055 unsigned int retries = 3;
2056 unsigned long value;
2057
Thierry Reding7f1f0542014-08-26 17:11:38 +02002058 /* override presence detection */
2059 value = readl(port->base + RP_PRIV_MISC);
2060 value &= ~RP_PRIV_MISC_PRSNT_MAP_EP_ABSNT;
2061 value |= RP_PRIV_MISC_PRSNT_MAP_EP_PRSNT;
2062 writel(value, port->base + RP_PRIV_MISC);
2063
Thierry Redingd1523b52013-08-09 16:49:19 +02002064 do {
2065 unsigned int timeout = TEGRA_PCIE_LINKUP_TIMEOUT;
2066
2067 do {
2068 value = readl(port->base + RP_VEND_XP);
2069
2070 if (value & RP_VEND_XP_DL_UP)
2071 break;
2072
2073 usleep_range(1000, 2000);
2074 } while (--timeout);
2075
2076 if (!timeout) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05002077 dev_err(dev, "link %u down, retrying\n", port->index);
Thierry Redingd1523b52013-08-09 16:49:19 +02002078 goto retry;
2079 }
2080
2081 timeout = TEGRA_PCIE_LINKUP_TIMEOUT;
2082
2083 do {
2084 value = readl(port->base + RP_LINK_CONTROL_STATUS);
2085
2086 if (value & RP_LINK_CONTROL_STATUS_DL_LINK_ACTIVE)
2087 return true;
2088
2089 usleep_range(1000, 2000);
2090 } while (--timeout);
2091
2092retry:
2093 tegra_pcie_port_reset(port);
2094 } while (--retries);
2095
2096 return false;
2097}
2098
Arnd Bergmann76f25412016-11-25 11:57:12 +01002099static void tegra_pcie_enable_ports(struct tegra_pcie *pcie)
Thierry Redingd1523b52013-08-09 16:49:19 +02002100{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05002101 struct device *dev = pcie->dev;
Thierry Redingd1523b52013-08-09 16:49:19 +02002102 struct tegra_pcie_port *port, *tmp;
Thierry Redingd1523b52013-08-09 16:49:19 +02002103
2104 list_for_each_entry_safe(port, tmp, &pcie->ports, list) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05002105 dev_info(dev, "probing port %u, using %u lanes\n",
Thierry Redingd1523b52013-08-09 16:49:19 +02002106 port->index, port->lanes);
2107
2108 tegra_pcie_port_enable(port);
2109
2110 if (tegra_pcie_port_check_link(port))
2111 continue;
2112
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05002113 dev_info(dev, "link %u down, ignoring\n", port->index);
Thierry Redingd1523b52013-08-09 16:49:19 +02002114
2115 tegra_pcie_port_disable(port);
2116 tegra_pcie_port_free(port);
2117 }
Thierry Redingd1523b52013-08-09 16:49:19 +02002118}
2119
Manikanta Maddireddy527557a2018-02-28 15:30:32 +05302120static void tegra_pcie_disable_ports(struct tegra_pcie *pcie)
2121{
2122 struct tegra_pcie_port *port, *tmp;
2123
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05302124 list_for_each_entry_safe(port, tmp, &pcie->ports, list)
Manikanta Maddireddy527557a2018-02-28 15:30:32 +05302125 tegra_pcie_port_disable(port);
Manikanta Maddireddy527557a2018-02-28 15:30:32 +05302126}
2127
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302128static const struct tegra_pcie_port_soc tegra20_pcie_ports[] = {
2129 { .pme.turnoff_bit = 0, .pme.ack_bit = 5 },
2130 { .pme.turnoff_bit = 8, .pme.ack_bit = 10 },
2131};
2132
Thierry Redinga7fbae22016-08-15 17:31:31 +02002133static const struct tegra_pcie_soc tegra20_pcie = {
Jay Agarwal94716cd2013-08-09 16:49:24 +02002134 .num_ports = 2,
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302135 .ports = tegra20_pcie_ports,
Jay Agarwal94716cd2013-08-09 16:49:24 +02002136 .msi_base_shift = 0,
2137 .pads_pll_ctl = PADS_PLL_CTL_TEGRA20,
2138 .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_DIV10,
Stephen Warrenf8144302016-07-25 16:02:27 -05002139 .pads_refclk_cfg0 = 0xfa5cfa5c,
Jay Agarwal94716cd2013-08-09 16:49:24 +02002140 .has_pex_clkreq_en = false,
2141 .has_pex_bias_ctrl = false,
2142 .has_intr_prsnt_sense = false,
Jay Agarwal94716cd2013-08-09 16:49:24 +02002143 .has_cml_clk = false,
Thierry Reding7f1f0542014-08-26 17:11:38 +02002144 .has_gen2 = false,
Thierry Reding76245ca2016-11-25 11:57:14 +01002145 .force_pca_enable = false,
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05302146 .program_uphy = true,
Jay Agarwal94716cd2013-08-09 16:49:24 +02002147};
2148
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302149static const struct tegra_pcie_port_soc tegra30_pcie_ports[] = {
2150 { .pme.turnoff_bit = 0, .pme.ack_bit = 5 },
2151 { .pme.turnoff_bit = 8, .pme.ack_bit = 10 },
2152 { .pme.turnoff_bit = 16, .pme.ack_bit = 18 },
2153};
2154
Thierry Redinga7fbae22016-08-15 17:31:31 +02002155static const struct tegra_pcie_soc tegra30_pcie = {
Jay Agarwal94716cd2013-08-09 16:49:24 +02002156 .num_ports = 3,
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302157 .ports = tegra30_pcie_ports,
Jay Agarwal94716cd2013-08-09 16:49:24 +02002158 .msi_base_shift = 8,
2159 .pads_pll_ctl = PADS_PLL_CTL_TEGRA30,
2160 .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_BUF_EN,
Stephen Warrenf8144302016-07-25 16:02:27 -05002161 .pads_refclk_cfg0 = 0xfa5cfa5c,
2162 .pads_refclk_cfg1 = 0xfa5cfa5c,
Jay Agarwal94716cd2013-08-09 16:49:24 +02002163 .has_pex_clkreq_en = true,
2164 .has_pex_bias_ctrl = true,
2165 .has_intr_prsnt_sense = true,
Jay Agarwal94716cd2013-08-09 16:49:24 +02002166 .has_cml_clk = true,
Thierry Reding7f1f0542014-08-26 17:11:38 +02002167 .has_gen2 = false,
Thierry Reding76245ca2016-11-25 11:57:14 +01002168 .force_pca_enable = false,
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05302169 .program_uphy = true,
Thierry Reding7f1f0542014-08-26 17:11:38 +02002170};
2171
Thierry Redinga7fbae22016-08-15 17:31:31 +02002172static const struct tegra_pcie_soc tegra124_pcie = {
Thierry Reding7f1f0542014-08-26 17:11:38 +02002173 .num_ports = 2,
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302174 .ports = tegra20_pcie_ports,
Thierry Reding7f1f0542014-08-26 17:11:38 +02002175 .msi_base_shift = 8,
2176 .pads_pll_ctl = PADS_PLL_CTL_TEGRA30,
2177 .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_BUF_EN,
Stephen Warrenf8144302016-07-25 16:02:27 -05002178 .pads_refclk_cfg0 = 0x44ac44ac,
Thierry Reding7f1f0542014-08-26 17:11:38 +02002179 .has_pex_clkreq_en = true,
2180 .has_pex_bias_ctrl = true,
2181 .has_intr_prsnt_sense = true,
2182 .has_cml_clk = true,
2183 .has_gen2 = true,
Thierry Reding76245ca2016-11-25 11:57:14 +01002184 .force_pca_enable = false,
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05302185 .program_uphy = true,
Jay Agarwal94716cd2013-08-09 16:49:24 +02002186};
2187
Thierry Redingc7a091c2016-11-25 11:57:15 +01002188static const struct tegra_pcie_soc tegra210_pcie = {
2189 .num_ports = 2,
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302190 .ports = tegra20_pcie_ports,
Thierry Redingc7a091c2016-11-25 11:57:15 +01002191 .msi_base_shift = 8,
2192 .pads_pll_ctl = PADS_PLL_CTL_TEGRA30,
2193 .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_BUF_EN,
2194 .pads_refclk_cfg0 = 0x90b890b8,
2195 .has_pex_clkreq_en = true,
2196 .has_pex_bias_ctrl = true,
2197 .has_intr_prsnt_sense = true,
2198 .has_cml_clk = true,
2199 .has_gen2 = true,
2200 .force_pca_enable = true,
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05302201 .program_uphy = true,
2202};
2203
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302204static const struct tegra_pcie_port_soc tegra186_pcie_ports[] = {
2205 { .pme.turnoff_bit = 0, .pme.ack_bit = 5 },
2206 { .pme.turnoff_bit = 8, .pme.ack_bit = 10 },
2207 { .pme.turnoff_bit = 12, .pme.ack_bit = 14 },
2208};
2209
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05302210static const struct tegra_pcie_soc tegra186_pcie = {
2211 .num_ports = 3,
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302212 .ports = tegra186_pcie_ports,
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05302213 .msi_base_shift = 8,
2214 .pads_pll_ctl = PADS_PLL_CTL_TEGRA30,
2215 .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_BUF_EN,
2216 .pads_refclk_cfg0 = 0x80b880b8,
2217 .pads_refclk_cfg1 = 0x000480b8,
2218 .has_pex_clkreq_en = true,
2219 .has_pex_bias_ctrl = true,
2220 .has_intr_prsnt_sense = true,
2221 .has_cml_clk = false,
2222 .has_gen2 = true,
2223 .force_pca_enable = false,
2224 .program_uphy = false,
Thierry Redingc7a091c2016-11-25 11:57:15 +01002225};
2226
Jay Agarwal94716cd2013-08-09 16:49:24 +02002227static const struct of_device_id tegra_pcie_of_match[] = {
Manikanta Maddireddy9cea5132017-09-27 17:28:35 +05302228 { .compatible = "nvidia,tegra186-pcie", .data = &tegra186_pcie },
Thierry Redingc7a091c2016-11-25 11:57:15 +01002229 { .compatible = "nvidia,tegra210-pcie", .data = &tegra210_pcie },
Thierry Redinga7fbae22016-08-15 17:31:31 +02002230 { .compatible = "nvidia,tegra124-pcie", .data = &tegra124_pcie },
2231 { .compatible = "nvidia,tegra30-pcie", .data = &tegra30_pcie },
2232 { .compatible = "nvidia,tegra20-pcie", .data = &tegra20_pcie },
Jay Agarwal94716cd2013-08-09 16:49:24 +02002233 { },
2234};
Jay Agarwal94716cd2013-08-09 16:49:24 +02002235
Thierry Reding2cb989f2014-07-22 12:30:46 -06002236static void *tegra_pcie_ports_seq_start(struct seq_file *s, loff_t *pos)
2237{
2238 struct tegra_pcie *pcie = s->private;
2239
2240 if (list_empty(&pcie->ports))
2241 return NULL;
2242
2243 seq_printf(s, "Index Status\n");
2244
2245 return seq_list_start(&pcie->ports, *pos);
2246}
2247
2248static void *tegra_pcie_ports_seq_next(struct seq_file *s, void *v, loff_t *pos)
2249{
2250 struct tegra_pcie *pcie = s->private;
2251
2252 return seq_list_next(v, &pcie->ports, pos);
2253}
2254
2255static void tegra_pcie_ports_seq_stop(struct seq_file *s, void *v)
2256{
2257}
2258
2259static int tegra_pcie_ports_seq_show(struct seq_file *s, void *v)
2260{
2261 bool up = false, active = false;
2262 struct tegra_pcie_port *port;
2263 unsigned int value;
2264
2265 port = list_entry(v, struct tegra_pcie_port, list);
2266
2267 value = readl(port->base + RP_VEND_XP);
2268
2269 if (value & RP_VEND_XP_DL_UP)
2270 up = true;
2271
2272 value = readl(port->base + RP_LINK_CONTROL_STATUS);
2273
2274 if (value & RP_LINK_CONTROL_STATUS_DL_LINK_ACTIVE)
2275 active = true;
2276
2277 seq_printf(s, "%2u ", port->index);
2278
2279 if (up)
2280 seq_printf(s, "up");
2281
2282 if (active) {
2283 if (up)
2284 seq_printf(s, ", ");
2285
2286 seq_printf(s, "active");
2287 }
2288
2289 seq_printf(s, "\n");
2290 return 0;
2291}
2292
2293static const struct seq_operations tegra_pcie_ports_seq_ops = {
2294 .start = tegra_pcie_ports_seq_start,
2295 .next = tegra_pcie_ports_seq_next,
2296 .stop = tegra_pcie_ports_seq_stop,
2297 .show = tegra_pcie_ports_seq_show,
2298};
2299
2300static int tegra_pcie_ports_open(struct inode *inode, struct file *file)
2301{
2302 struct tegra_pcie *pcie = inode->i_private;
2303 struct seq_file *s;
2304 int err;
2305
2306 err = seq_open(file, &tegra_pcie_ports_seq_ops);
2307 if (err)
2308 return err;
2309
2310 s = file->private_data;
2311 s->private = pcie;
2312
2313 return 0;
2314}
2315
2316static const struct file_operations tegra_pcie_ports_ops = {
2317 .owner = THIS_MODULE,
2318 .open = tegra_pcie_ports_open,
2319 .read = seq_read,
2320 .llseek = seq_lseek,
2321 .release = seq_release,
2322};
2323
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302324static void tegra_pcie_debugfs_exit(struct tegra_pcie *pcie)
2325{
2326 debugfs_remove_recursive(pcie->debugfs);
2327 pcie->debugfs = NULL;
2328}
2329
Thierry Reding2cb989f2014-07-22 12:30:46 -06002330static int tegra_pcie_debugfs_init(struct tegra_pcie *pcie)
2331{
2332 struct dentry *file;
2333
2334 pcie->debugfs = debugfs_create_dir("pcie", NULL);
2335 if (!pcie->debugfs)
2336 return -ENOMEM;
2337
2338 file = debugfs_create_file("ports", S_IFREG | S_IRUGO, pcie->debugfs,
2339 pcie, &tegra_pcie_ports_ops);
2340 if (!file)
2341 goto remove;
2342
2343 return 0;
2344
2345remove:
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302346 tegra_pcie_debugfs_exit(pcie);
Thierry Reding2cb989f2014-07-22 12:30:46 -06002347 return -ENOMEM;
2348}
2349
Thierry Redingd1523b52013-08-09 16:49:19 +02002350static int tegra_pcie_probe(struct platform_device *pdev)
2351{
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05002352 struct device *dev = &pdev->dev;
Arnd Bergmann76f25412016-11-25 11:57:12 +01002353 struct pci_host_bridge *host;
Thierry Redingd1523b52013-08-09 16:49:19 +02002354 struct tegra_pcie *pcie;
Arnd Bergmann76f25412016-11-25 11:57:12 +01002355 struct pci_bus *child;
Thierry Redingd1523b52013-08-09 16:49:19 +02002356 int err;
2357
Lorenzo Pieralisi792abc62017-06-28 15:13:54 -05002358 host = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
Arnd Bergmann76f25412016-11-25 11:57:12 +01002359 if (!host)
Thierry Redingd1523b52013-08-09 16:49:19 +02002360 return -ENOMEM;
2361
Arnd Bergmann76f25412016-11-25 11:57:12 +01002362 pcie = pci_host_bridge_priv(host);
Manikanta Maddireddy78243ff2018-01-11 11:38:03 +05302363 host->sysdata = pcie;
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302364 platform_set_drvdata(pdev, pcie);
Arnd Bergmann76f25412016-11-25 11:57:12 +01002365
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05002366 pcie->soc = of_device_get_match_data(dev);
Thierry Redingd1523b52013-08-09 16:49:19 +02002367 INIT_LIST_HEAD(&pcie->ports);
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05002368 pcie->dev = dev;
Thierry Redingd1523b52013-08-09 16:49:19 +02002369
2370 err = tegra_pcie_parse_dt(pcie);
2371 if (err < 0)
2372 return err;
2373
Thierry Redingd1523b52013-08-09 16:49:19 +02002374 err = tegra_pcie_get_resources(pcie);
2375 if (err < 0) {
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05002376 dev_err(dev, "failed to request resources: %d\n", err);
Thierry Redingd1523b52013-08-09 16:49:19 +02002377 return err;
2378 }
2379
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05302380 err = tegra_pcie_msi_setup(pcie);
2381 if (err < 0) {
2382 dev_err(dev, "failed to enable MSI support: %d\n", err);
Thierry Redingd1523b52013-08-09 16:49:19 +02002383 goto put_resources;
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05302384 }
2385
2386 pm_runtime_enable(pcie->dev);
2387 err = pm_runtime_get_sync(pcie->dev);
2388 if (err) {
2389 dev_err(dev, "fail to enable pcie controller: %d\n", err);
2390 goto teardown_msi;
2391 }
Thierry Redingd1523b52013-08-09 16:49:19 +02002392
Arnd Bergmann76f25412016-11-25 11:57:12 +01002393 err = tegra_pcie_request_resources(pcie);
2394 if (err)
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05302395 goto pm_runtime_put;
Arnd Bergmann76f25412016-11-25 11:57:12 +01002396
Arnd Bergmann76f25412016-11-25 11:57:12 +01002397 host->busnr = pcie->busn.start;
2398 host->dev.parent = &pdev->dev;
2399 host->ops = &tegra_pcie_ops;
Lorenzo Pieralisidd5fcce2017-06-28 15:14:05 -05002400 host->map_irq = tegra_pcie_map_irq;
2401 host->swizzle_irq = pci_common_swizzle;
Arnd Bergmann76f25412016-11-25 11:57:12 +01002402
Lorenzo Pieralisicea9bc02017-06-28 15:13:55 -05002403 err = pci_scan_root_bus_bridge(host);
Thierry Redingd1523b52013-08-09 16:49:19 +02002404 if (err < 0) {
Arnd Bergmann76f25412016-11-25 11:57:12 +01002405 dev_err(dev, "failed to register host: %d\n", err);
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05302406 goto free_resources;
Thierry Redingd1523b52013-08-09 16:49:19 +02002407 }
2408
Arnd Bergmann76f25412016-11-25 11:57:12 +01002409 pci_bus_size_bridges(host->bus);
2410 pci_bus_assign_resources(host->bus);
2411
2412 list_for_each_entry(child, &host->bus->children, node)
2413 pcie_bus_configure_settings(child);
2414
2415 pci_bus_add_devices(host->bus);
2416
Thierry Reding2cb989f2014-07-22 12:30:46 -06002417 if (IS_ENABLED(CONFIG_DEBUG_FS)) {
2418 err = tegra_pcie_debugfs_init(pcie);
2419 if (err < 0)
Bjorn Helgaasa581fa92016-10-06 13:43:04 -05002420 dev_err(dev, "failed to setup debugfs: %d\n", err);
Thierry Reding2cb989f2014-07-22 12:30:46 -06002421 }
2422
Thierry Redingd1523b52013-08-09 16:49:19 +02002423 return 0;
2424
Manikanta Maddireddy527557a2018-02-28 15:30:32 +05302425free_resources:
2426 tegra_pcie_free_resources(pcie);
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05302427pm_runtime_put:
2428 pm_runtime_put_sync(pcie->dev);
2429 pm_runtime_disable(pcie->dev);
2430teardown_msi:
2431 tegra_pcie_msi_teardown(pcie);
Thierry Redingd1523b52013-08-09 16:49:19 +02002432put_resources:
2433 tegra_pcie_put_resources(pcie);
2434 return err;
2435}
2436
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302437static int tegra_pcie_remove(struct platform_device *pdev)
2438{
2439 struct tegra_pcie *pcie = platform_get_drvdata(pdev);
2440 struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05302441 struct tegra_pcie_port *port, *tmp;
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302442
2443 if (IS_ENABLED(CONFIG_DEBUG_FS))
2444 tegra_pcie_debugfs_exit(pcie);
2445
2446 pci_stop_root_bus(host->bus);
2447 pci_remove_root_bus(host->bus);
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05302448 tegra_pcie_free_resources(pcie);
2449 pm_runtime_put_sync(pcie->dev);
2450 pm_runtime_disable(pcie->dev);
2451
2452 if (IS_ENABLED(CONFIG_PCI_MSI))
2453 tegra_pcie_msi_teardown(pcie);
2454
2455 tegra_pcie_put_resources(pcie);
2456
2457 list_for_each_entry_safe(port, tmp, &pcie->ports, list)
2458 tegra_pcie_port_free(port);
2459
2460 return 0;
2461}
2462
2463static int __maybe_unused tegra_pcie_pm_suspend(struct device *dev)
2464{
2465 struct tegra_pcie *pcie = dev_get_drvdata(dev);
2466 struct tegra_pcie_port *port;
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302467
2468 list_for_each_entry(port, &pcie->ports, list)
2469 tegra_pcie_pme_turnoff(port);
2470
2471 tegra_pcie_disable_ports(pcie);
2472
2473 if (IS_ENABLED(CONFIG_PCI_MSI))
2474 tegra_pcie_disable_msi(pcie);
2475
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302476 tegra_pcie_disable_controller(pcie);
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05302477 tegra_pcie_power_off(pcie);
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302478
2479 return 0;
2480}
2481
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05302482static int __maybe_unused tegra_pcie_pm_resume(struct device *dev)
2483{
2484 struct tegra_pcie *pcie = dev_get_drvdata(dev);
2485 int err;
2486
2487 err = tegra_pcie_power_on(pcie);
2488 if (err) {
2489 dev_err(dev, "tegra pcie power on fail: %d\n", err);
2490 return err;
2491 }
2492 err = tegra_pcie_enable_controller(pcie);
2493 if (err) {
2494 dev_err(dev, "tegra pcie controller enable fail: %d\n", err);
2495 goto poweroff;
2496 }
2497 tegra_pcie_setup_translations(pcie);
2498
2499 if (IS_ENABLED(CONFIG_PCI_MSI))
2500 tegra_pcie_enable_msi(pcie);
2501
2502 tegra_pcie_enable_ports(pcie);
2503
2504 return 0;
2505
2506poweroff:
2507 tegra_pcie_power_off(pcie);
2508
2509 return err;
2510}
2511
2512static const struct dev_pm_ops tegra_pcie_pm_ops = {
2513 SET_RUNTIME_PM_OPS(tegra_pcie_pm_suspend, tegra_pcie_pm_resume, NULL)
2514 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(tegra_pcie_pm_suspend,
2515 tegra_pcie_pm_resume)
2516};
2517
Thierry Redingd1523b52013-08-09 16:49:19 +02002518static struct platform_driver tegra_pcie_driver = {
2519 .driver = {
2520 .name = "tegra-pcie",
Thierry Redingd1523b52013-08-09 16:49:19 +02002521 .of_match_table = tegra_pcie_of_match,
2522 .suppress_bind_attrs = true,
Manikanta Maddireddyda76ba52018-02-28 15:30:34 +05302523 .pm = &tegra_pcie_pm_ops,
Thierry Redingd1523b52013-08-09 16:49:19 +02002524 },
2525 .probe = tegra_pcie_probe,
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302526 .remove = tegra_pcie_remove,
Thierry Redingd1523b52013-08-09 16:49:19 +02002527};
Manikanta Maddireddy662b94c2018-02-28 15:30:33 +05302528module_platform_driver(tegra_pcie_driver);
2529MODULE_LICENSE("GPL");