blob: c25a2a4f2e3d5c8e8a2073e045e4f3d550ea25bc [file] [log] [blame]
Mike Rapoport77ffc142010-09-27 11:26:33 +02001/*
2 * arch/arm/mach-tegra/pci.c
3 *
4 * PCIe host controller driver for TEGRA(2) SOCs
5 *
6 * Copyright (c) 2010, CompuLab, Ltd.
7 * Author: Mike Rapoport <mike@compulab.co.il>
8 *
9 * Based on NVIDIA PCIe driver
10 * Copyright (c) 2008-2009, NVIDIA Corporation.
11 *
12 * Bits taken from arch/arm/mach-dove/pcie.c
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful, but WITHOUT
20 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
22 * more details.
23 *
24 * You should have received a copy of the GNU General Public License along
25 * with this program; if not, write to the Free Software Foundation, Inc.,
26 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
27 */
28
29#include <linux/kernel.h>
30#include <linux/pci.h>
31#include <linux/interrupt.h>
32#include <linux/irq.h>
33#include <linux/clk.h>
34#include <linux/delay.h>
Paul Gortmakerdc280942011-07-31 16:17:29 -040035#include <linux/export.h>
Mike Rapoport77ffc142010-09-27 11:26:33 +020036
37#include <asm/sizes.h>
38#include <asm/mach/pci.h>
39
Mike Rapoport77ffc142010-09-27 11:26:33 +020040#include <mach/iomap.h>
41#include <mach/clk.h>
Mike Rapoportb96cc7f2011-03-02 14:34:05 +020042#include <mach/powergate.h>
Mike Rapoport77ffc142010-09-27 11:26:33 +020043
Olof Johansson3ead5132011-09-08 18:11:24 -070044#include "board.h"
45
Mike Rapoport77ffc142010-09-27 11:26:33 +020046/* register definitions */
47#define AFI_OFFSET 0x3800
48#define PADS_OFFSET 0x3000
49#define RP0_OFFSET 0x0000
50#define RP1_OFFSET 0x1000
51
52#define AFI_AXI_BAR0_SZ 0x00
53#define AFI_AXI_BAR1_SZ 0x04
54#define AFI_AXI_BAR2_SZ 0x08
55#define AFI_AXI_BAR3_SZ 0x0c
56#define AFI_AXI_BAR4_SZ 0x10
57#define AFI_AXI_BAR5_SZ 0x14
58
59#define AFI_AXI_BAR0_START 0x18
60#define AFI_AXI_BAR1_START 0x1c
61#define AFI_AXI_BAR2_START 0x20
62#define AFI_AXI_BAR3_START 0x24
63#define AFI_AXI_BAR4_START 0x28
64#define AFI_AXI_BAR5_START 0x2c
65
66#define AFI_FPCI_BAR0 0x30
67#define AFI_FPCI_BAR1 0x34
68#define AFI_FPCI_BAR2 0x38
69#define AFI_FPCI_BAR3 0x3c
70#define AFI_FPCI_BAR4 0x40
71#define AFI_FPCI_BAR5 0x44
72
73#define AFI_CACHE_BAR0_SZ 0x48
74#define AFI_CACHE_BAR0_ST 0x4c
75#define AFI_CACHE_BAR1_SZ 0x50
76#define AFI_CACHE_BAR1_ST 0x54
77
78#define AFI_MSI_BAR_SZ 0x60
79#define AFI_MSI_FPCI_BAR_ST 0x64
80#define AFI_MSI_AXI_BAR_ST 0x68
81
82#define AFI_CONFIGURATION 0xac
83#define AFI_CONFIGURATION_EN_FPCI (1 << 0)
84
85#define AFI_FPCI_ERROR_MASKS 0xb0
86
87#define AFI_INTR_MASK 0xb4
88#define AFI_INTR_MASK_INT_MASK (1 << 0)
89#define AFI_INTR_MASK_MSI_MASK (1 << 8)
90
91#define AFI_INTR_CODE 0xb8
92#define AFI_INTR_CODE_MASK 0xf
93#define AFI_INTR_MASTER_ABORT 4
94#define AFI_INTR_LEGACY 6
95
96#define AFI_INTR_SIGNATURE 0xbc
97#define AFI_SM_INTR_ENABLE 0xc4
98
99#define AFI_AFI_INTR_ENABLE 0xc8
100#define AFI_INTR_EN_INI_SLVERR (1 << 0)
101#define AFI_INTR_EN_INI_DECERR (1 << 1)
102#define AFI_INTR_EN_TGT_SLVERR (1 << 2)
103#define AFI_INTR_EN_TGT_DECERR (1 << 3)
104#define AFI_INTR_EN_TGT_WRERR (1 << 4)
105#define AFI_INTR_EN_DFPCI_DECERR (1 << 5)
106#define AFI_INTR_EN_AXI_DECERR (1 << 6)
107#define AFI_INTR_EN_FPCI_TIMEOUT (1 << 7)
108
109#define AFI_PCIE_CONFIG 0x0f8
110#define AFI_PCIE_CONFIG_PCIEC0_DISABLE_DEVICE (1 << 1)
111#define AFI_PCIE_CONFIG_PCIEC1_DISABLE_DEVICE (1 << 2)
112#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_MASK (0xf << 20)
113#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_SINGLE (0x0 << 20)
114#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_DUAL (0x1 << 20)
115
116#define AFI_FUSE 0x104
117#define AFI_FUSE_PCIE_T0_GEN2_DIS (1 << 2)
118
119#define AFI_PEX0_CTRL 0x110
120#define AFI_PEX1_CTRL 0x118
121#define AFI_PEX_CTRL_RST (1 << 0)
122#define AFI_PEX_CTRL_REFCLK_EN (1 << 3)
123
124#define RP_VEND_XP 0x00000F00
125#define RP_VEND_XP_DL_UP (1 << 30)
126
127#define RP_LINK_CONTROL_STATUS 0x00000090
128#define RP_LINK_CONTROL_STATUS_LINKSTAT_MASK 0x3fff0000
129
130#define PADS_CTL_SEL 0x0000009C
131
132#define PADS_CTL 0x000000A0
133#define PADS_CTL_IDDQ_1L (1 << 0)
134#define PADS_CTL_TX_DATA_EN_1L (1 << 6)
135#define PADS_CTL_RX_DATA_EN_1L (1 << 10)
136
137#define PADS_PLL_CTL 0x000000B8
138#define PADS_PLL_CTL_RST_B4SM (1 << 1)
139#define PADS_PLL_CTL_LOCKDET (1 << 8)
140#define PADS_PLL_CTL_REFCLK_MASK (0x3 << 16)
141#define PADS_PLL_CTL_REFCLK_INTERNAL_CML (0 << 16)
142#define PADS_PLL_CTL_REFCLK_INTERNAL_CMOS (1 << 16)
143#define PADS_PLL_CTL_REFCLK_EXTERNAL (2 << 16)
144#define PADS_PLL_CTL_TXCLKREF_MASK (0x1 << 20)
145#define PADS_PLL_CTL_TXCLKREF_DIV10 (0 << 20)
146#define PADS_PLL_CTL_TXCLKREF_DIV5 (1 << 20)
147
148/* PMC access is required for PCIE xclk (un)clamping */
149#define PMC_SCRATCH42 0x144
150#define PMC_SCRATCH42_PCX_CLAMP (1 << 0)
151
152static void __iomem *reg_pmc_base = IO_ADDRESS(TEGRA_PMC_BASE);
153
154#define pmc_writel(value, reg) \
Olof Johanssonefaa19a2011-09-08 18:09:54 -0700155 __raw_writel(value, reg_pmc_base + (reg))
Mike Rapoport77ffc142010-09-27 11:26:33 +0200156#define pmc_readl(reg) \
Olof Johanssonefaa19a2011-09-08 18:09:54 -0700157 __raw_readl(reg_pmc_base + (reg))
Mike Rapoport77ffc142010-09-27 11:26:33 +0200158
159/*
160 * Tegra2 defines 1GB in the AXI address map for PCIe.
161 *
162 * That address space is split into different regions, with sizes and
163 * offsets as follows:
164 *
165 * 0x80000000 - 0x80003fff - PCI controller registers
166 * 0x80004000 - 0x80103fff - PCI configuration space
167 * 0x80104000 - 0x80203fff - PCI extended configuration space
168 * 0x80203fff - 0x803fffff - unused
169 * 0x80400000 - 0x8040ffff - downstream IO
170 * 0x80410000 - 0x8fffffff - unused
171 * 0x90000000 - 0x9fffffff - non-prefetchable memory
172 * 0xa0000000 - 0xbfffffff - prefetchable memory
173 */
174#define TEGRA_PCIE_BASE 0x80000000
175
176#define PCIE_REGS_SZ SZ_16K
177#define PCIE_CFG_OFF PCIE_REGS_SZ
178#define PCIE_CFG_SZ SZ_1M
179#define PCIE_EXT_CFG_OFF (PCIE_CFG_SZ + PCIE_CFG_OFF)
180#define PCIE_EXT_CFG_SZ SZ_1M
181#define PCIE_IOMAP_SZ (PCIE_REGS_SZ + PCIE_CFG_SZ + PCIE_EXT_CFG_SZ)
182
183#define MMIO_BASE (TEGRA_PCIE_BASE + SZ_4M)
184#define MMIO_SIZE SZ_64K
185#define MEM_BASE_0 (TEGRA_PCIE_BASE + SZ_256M)
186#define MEM_SIZE_0 SZ_128M
187#define MEM_BASE_1 (MEM_BASE_0 + MEM_SIZE_0)
188#define MEM_SIZE_1 SZ_128M
189#define PREFETCH_MEM_BASE_0 (MEM_BASE_1 + MEM_SIZE_1)
190#define PREFETCH_MEM_SIZE_0 SZ_128M
191#define PREFETCH_MEM_BASE_1 (PREFETCH_MEM_BASE_0 + PREFETCH_MEM_SIZE_0)
192#define PREFETCH_MEM_SIZE_1 SZ_128M
193
194#define PCIE_CONF_BUS(b) ((b) << 16)
195#define PCIE_CONF_DEV(d) ((d) << 11)
196#define PCIE_CONF_FUNC(f) ((f) << 8)
197#define PCIE_CONF_REG(r) \
198 (((r) & ~0x3) | (((r) < 256) ? PCIE_CFG_OFF : PCIE_EXT_CFG_OFF))
199
200struct tegra_pcie_port {
201 int index;
202 u8 root_bus_nr;
203 void __iomem *base;
204
205 bool link_up;
206
207 char io_space_name[16];
208 char mem_space_name[16];
209 char prefetch_space_name[20];
210 struct resource res[3];
211};
212
213struct tegra_pcie_info {
214 struct tegra_pcie_port port[2];
215 int num_ports;
216
217 void __iomem *regs;
218 struct resource res_mmio;
219
220 struct clk *pex_clk;
221 struct clk *afi_clk;
222 struct clk *pcie_xclk;
223 struct clk *pll_e;
224};
225
226static struct tegra_pcie_info tegra_pcie = {
227 .res_mmio = {
228 .name = "PCI IO",
229 .start = MMIO_BASE,
230 .end = MMIO_BASE + MMIO_SIZE - 1,
231 .flags = IORESOURCE_MEM,
232 },
233};
234
235void __iomem *tegra_pcie_io_base;
236EXPORT_SYMBOL(tegra_pcie_io_base);
237
238static inline void afi_writel(u32 value, unsigned long offset)
239{
240 writel(value, offset + AFI_OFFSET + tegra_pcie.regs);
241}
242
243static inline u32 afi_readl(unsigned long offset)
244{
245 return readl(offset + AFI_OFFSET + tegra_pcie.regs);
246}
247
248static inline void pads_writel(u32 value, unsigned long offset)
249{
250 writel(value, offset + PADS_OFFSET + tegra_pcie.regs);
251}
252
253static inline u32 pads_readl(unsigned long offset)
254{
255 return readl(offset + PADS_OFFSET + tegra_pcie.regs);
256}
257
258static struct tegra_pcie_port *bus_to_port(int bus)
259{
260 int i;
261
262 for (i = tegra_pcie.num_ports - 1; i >= 0; i--) {
263 int rbus = tegra_pcie.port[i].root_bus_nr;
264 if (rbus != -1 && rbus == bus)
265 break;
266 }
267
268 return i >= 0 ? tegra_pcie.port + i : NULL;
269}
270
271static int tegra_pcie_read_conf(struct pci_bus *bus, unsigned int devfn,
272 int where, int size, u32 *val)
273{
274 struct tegra_pcie_port *pp = bus_to_port(bus->number);
275 void __iomem *addr;
276
277 if (pp) {
278 if (devfn != 0) {
279 *val = 0xffffffff;
280 return PCIBIOS_DEVICE_NOT_FOUND;
281 }
282
283 addr = pp->base + (where & ~0x3);
284 } else {
285 addr = tegra_pcie.regs + (PCIE_CONF_BUS(bus->number) +
286 PCIE_CONF_DEV(PCI_SLOT(devfn)) +
287 PCIE_CONF_FUNC(PCI_FUNC(devfn)) +
288 PCIE_CONF_REG(where));
289 }
290
291 *val = readl(addr);
292
293 if (size == 1)
294 *val = (*val >> (8 * (where & 3))) & 0xff;
295 else if (size == 2)
296 *val = (*val >> (8 * (where & 3))) & 0xffff;
297
298 return PCIBIOS_SUCCESSFUL;
299}
300
301static int tegra_pcie_write_conf(struct pci_bus *bus, unsigned int devfn,
302 int where, int size, u32 val)
303{
304 struct tegra_pcie_port *pp = bus_to_port(bus->number);
305 void __iomem *addr;
306
307 u32 mask;
308 u32 tmp;
309
310 if (pp) {
311 if (devfn != 0)
312 return PCIBIOS_DEVICE_NOT_FOUND;
313
314 addr = pp->base + (where & ~0x3);
315 } else {
316 addr = tegra_pcie.regs + (PCIE_CONF_BUS(bus->number) +
317 PCIE_CONF_DEV(PCI_SLOT(devfn)) +
318 PCIE_CONF_FUNC(PCI_FUNC(devfn)) +
319 PCIE_CONF_REG(where));
320 }
321
322 if (size == 4) {
323 writel(val, addr);
324 return PCIBIOS_SUCCESSFUL;
325 }
326
327 if (size == 2)
328 mask = ~(0xffff << ((where & 0x3) * 8));
329 else if (size == 1)
330 mask = ~(0xff << ((where & 0x3) * 8));
331 else
332 return PCIBIOS_BAD_REGISTER_NUMBER;
333
334 tmp = readl(addr) & mask;
335 tmp |= val << ((where & 0x3) * 8);
336 writel(tmp, addr);
337
338 return PCIBIOS_SUCCESSFUL;
339}
340
341static struct pci_ops tegra_pcie_ops = {
342 .read = tegra_pcie_read_conf,
343 .write = tegra_pcie_write_conf,
344};
345
346static void __devinit tegra_pcie_fixup_bridge(struct pci_dev *dev)
347{
348 u16 reg;
349
350 if ((dev->class >> 16) == PCI_BASE_CLASS_BRIDGE) {
351 pci_read_config_word(dev, PCI_COMMAND, &reg);
352 reg |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
353 PCI_COMMAND_MASTER | PCI_COMMAND_SERR);
354 pci_write_config_word(dev, PCI_COMMAND, reg);
355 }
356}
357DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, tegra_pcie_fixup_bridge);
358
359/* Tegra PCIE root complex wrongly reports device class */
360static void __devinit tegra_pcie_fixup_class(struct pci_dev *dev)
361{
362 dev->class = PCI_CLASS_BRIDGE_PCI << 8;
363}
364DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0bf0, tegra_pcie_fixup_class);
365DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0bf1, tegra_pcie_fixup_class);
366
367/* Tegra PCIE requires relaxed ordering */
368static void __devinit tegra_pcie_relax_enable(struct pci_dev *dev)
369{
Jiang Liu3b870112012-07-24 17:20:13 +0800370 pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_RELAX_EN);
Mike Rapoport77ffc142010-09-27 11:26:33 +0200371}
372DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, tegra_pcie_relax_enable);
373
374static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
375{
376 struct tegra_pcie_port *pp;
377
378 if (nr >= tegra_pcie.num_ports)
379 return 0;
380
381 pp = tegra_pcie.port + nr;
382 pp->root_bus_nr = sys->busnr;
383
384 /*
385 * IORESOURCE_IO
386 */
387 snprintf(pp->io_space_name, sizeof(pp->io_space_name),
388 "PCIe %d I/O", pp->index);
389 pp->io_space_name[sizeof(pp->io_space_name) - 1] = 0;
390 pp->res[0].name = pp->io_space_name;
391 if (pp->index == 0) {
392 pp->res[0].start = PCIBIOS_MIN_IO;
393 pp->res[0].end = pp->res[0].start + SZ_32K - 1;
394 } else {
395 pp->res[0].start = PCIBIOS_MIN_IO + SZ_32K;
396 pp->res[0].end = IO_SPACE_LIMIT;
397 }
398 pp->res[0].flags = IORESOURCE_IO;
399 if (request_resource(&ioport_resource, &pp->res[0]))
400 panic("Request PCIe IO resource failed\n");
Bjorn Helgaas9f786d02012-02-23 20:19:01 -0700401 pci_add_resource_offset(&sys->resources, &pp->res[0], sys->io_offset);
Mike Rapoport77ffc142010-09-27 11:26:33 +0200402
403 /*
404 * IORESOURCE_MEM
405 */
406 snprintf(pp->mem_space_name, sizeof(pp->mem_space_name),
407 "PCIe %d MEM", pp->index);
408 pp->mem_space_name[sizeof(pp->mem_space_name) - 1] = 0;
409 pp->res[1].name = pp->mem_space_name;
410 if (pp->index == 0) {
411 pp->res[1].start = MEM_BASE_0;
412 pp->res[1].end = pp->res[1].start + MEM_SIZE_0 - 1;
413 } else {
414 pp->res[1].start = MEM_BASE_1;
415 pp->res[1].end = pp->res[1].start + MEM_SIZE_1 - 1;
416 }
417 pp->res[1].flags = IORESOURCE_MEM;
418 if (request_resource(&iomem_resource, &pp->res[1]))
419 panic("Request PCIe Memory resource failed\n");
Bjorn Helgaas9f786d02012-02-23 20:19:01 -0700420 pci_add_resource_offset(&sys->resources, &pp->res[1], sys->mem_offset);
Mike Rapoport77ffc142010-09-27 11:26:33 +0200421
422 /*
423 * IORESOURCE_MEM | IORESOURCE_PREFETCH
424 */
425 snprintf(pp->prefetch_space_name, sizeof(pp->prefetch_space_name),
426 "PCIe %d PREFETCH MEM", pp->index);
427 pp->prefetch_space_name[sizeof(pp->prefetch_space_name) - 1] = 0;
428 pp->res[2].name = pp->prefetch_space_name;
429 if (pp->index == 0) {
430 pp->res[2].start = PREFETCH_MEM_BASE_0;
431 pp->res[2].end = pp->res[2].start + PREFETCH_MEM_SIZE_0 - 1;
432 } else {
433 pp->res[2].start = PREFETCH_MEM_BASE_1;
434 pp->res[2].end = pp->res[2].start + PREFETCH_MEM_SIZE_1 - 1;
435 }
436 pp->res[2].flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
437 if (request_resource(&iomem_resource, &pp->res[2]))
438 panic("Request PCIe Prefetch Memory resource failed\n");
Bjorn Helgaas9f786d02012-02-23 20:19:01 -0700439 pci_add_resource_offset(&sys->resources, &pp->res[2], sys->mem_offset);
Mike Rapoport77ffc142010-09-27 11:26:33 +0200440
441 return 1;
442}
443
Ralf Baechled5341942011-06-10 15:30:21 +0100444static int tegra_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
Mike Rapoport77ffc142010-09-27 11:26:33 +0200445{
446 return INT_PCIE_INTR;
447}
448
449static struct pci_bus __init *tegra_pcie_scan_bus(int nr,
450 struct pci_sys_data *sys)
451{
452 struct tegra_pcie_port *pp;
453
454 if (nr >= tegra_pcie.num_ports)
Olof Johansson31e66062011-09-08 18:11:46 -0700455 return NULL;
Mike Rapoport77ffc142010-09-27 11:26:33 +0200456
457 pp = tegra_pcie.port + nr;
458 pp->root_bus_nr = sys->busnr;
459
Bjorn Helgaas37d15902011-10-28 16:26:16 -0600460 return pci_scan_root_bus(NULL, sys->busnr, &tegra_pcie_ops, sys,
461 &sys->resources);
Mike Rapoport77ffc142010-09-27 11:26:33 +0200462}
463
464static struct hw_pci tegra_pcie_hw __initdata = {
465 .nr_controllers = 2,
466 .setup = tegra_pcie_setup,
467 .scan = tegra_pcie_scan_bus,
Mike Rapoport77ffc142010-09-27 11:26:33 +0200468 .map_irq = tegra_pcie_map_irq,
469};
470
471
472static irqreturn_t tegra_pcie_isr(int irq, void *arg)
473{
474 const char *err_msg[] = {
475 "Unknown",
476 "AXI slave error",
477 "AXI decode error",
478 "Target abort",
479 "Master abort",
480 "Invalid write",
481 "Response decoding error",
482 "AXI response decoding error",
483 "Transcation timeout",
484 };
485
486 u32 code, signature;
487
488 code = afi_readl(AFI_INTR_CODE) & AFI_INTR_CODE_MASK;
489 signature = afi_readl(AFI_INTR_SIGNATURE);
490 afi_writel(0, AFI_INTR_CODE);
491
492 if (code == AFI_INTR_LEGACY)
493 return IRQ_NONE;
494
495 if (code >= ARRAY_SIZE(err_msg))
496 code = 0;
497
498 /*
499 * do not pollute kernel log with master abort reports since they
500 * happen a lot during enumeration
501 */
502 if (code == AFI_INTR_MASTER_ABORT)
503 pr_debug("PCIE: %s, signature: %08x\n", err_msg[code], signature);
504 else
505 pr_err("PCIE: %s, signature: %08x\n", err_msg[code], signature);
506
507 return IRQ_HANDLED;
508}
509
510static void tegra_pcie_setup_translations(void)
511{
512 u32 fpci_bar;
513 u32 size;
514 u32 axi_address;
515
516 /* Bar 0: config Bar */
517 fpci_bar = ((u32)0xfdff << 16);
518 size = PCIE_CFG_SZ;
519 axi_address = TEGRA_PCIE_BASE + PCIE_CFG_OFF;
520 afi_writel(axi_address, AFI_AXI_BAR0_START);
521 afi_writel(size >> 12, AFI_AXI_BAR0_SZ);
522 afi_writel(fpci_bar, AFI_FPCI_BAR0);
523
524 /* Bar 1: extended config Bar */
525 fpci_bar = ((u32)0xfe1 << 20);
526 size = PCIE_EXT_CFG_SZ;
527 axi_address = TEGRA_PCIE_BASE + PCIE_EXT_CFG_OFF;
528 afi_writel(axi_address, AFI_AXI_BAR1_START);
529 afi_writel(size >> 12, AFI_AXI_BAR1_SZ);
530 afi_writel(fpci_bar, AFI_FPCI_BAR1);
531
532 /* Bar 2: downstream IO bar */
533 fpci_bar = ((__u32)0xfdfc << 16);
534 size = MMIO_SIZE;
535 axi_address = MMIO_BASE;
536 afi_writel(axi_address, AFI_AXI_BAR2_START);
537 afi_writel(size >> 12, AFI_AXI_BAR2_SZ);
538 afi_writel(fpci_bar, AFI_FPCI_BAR2);
539
540 /* Bar 3: prefetchable memory BAR */
541 fpci_bar = (((PREFETCH_MEM_BASE_0 >> 12) & 0x0fffffff) << 4) | 0x1;
542 size = PREFETCH_MEM_SIZE_0 + PREFETCH_MEM_SIZE_1;
543 axi_address = PREFETCH_MEM_BASE_0;
544 afi_writel(axi_address, AFI_AXI_BAR3_START);
545 afi_writel(size >> 12, AFI_AXI_BAR3_SZ);
546 afi_writel(fpci_bar, AFI_FPCI_BAR3);
547
548 /* Bar 4: non prefetchable memory BAR */
549 fpci_bar = (((MEM_BASE_0 >> 12) & 0x0FFFFFFF) << 4) | 0x1;
550 size = MEM_SIZE_0 + MEM_SIZE_1;
551 axi_address = MEM_BASE_0;
552 afi_writel(axi_address, AFI_AXI_BAR4_START);
553 afi_writel(size >> 12, AFI_AXI_BAR4_SZ);
554 afi_writel(fpci_bar, AFI_FPCI_BAR4);
555
556 /* Bar 5: NULL out the remaining BAR as it is not used */
557 fpci_bar = 0;
558 size = 0;
559 axi_address = 0;
560 afi_writel(axi_address, AFI_AXI_BAR5_START);
561 afi_writel(size >> 12, AFI_AXI_BAR5_SZ);
562 afi_writel(fpci_bar, AFI_FPCI_BAR5);
563
564 /* map all upstream transactions as uncached */
565 afi_writel(PHYS_OFFSET, AFI_CACHE_BAR0_ST);
566 afi_writel(0, AFI_CACHE_BAR0_SZ);
567 afi_writel(0, AFI_CACHE_BAR1_ST);
568 afi_writel(0, AFI_CACHE_BAR1_SZ);
569
570 /* No MSI */
571 afi_writel(0, AFI_MSI_FPCI_BAR_ST);
572 afi_writel(0, AFI_MSI_BAR_SZ);
573 afi_writel(0, AFI_MSI_AXI_BAR_ST);
574 afi_writel(0, AFI_MSI_BAR_SZ);
575}
576
Dmitry Artamonow795d5fd2012-03-06 12:45:43 +0400577static int tegra_pcie_enable_controller(void)
Mike Rapoport77ffc142010-09-27 11:26:33 +0200578{
579 u32 val, reg;
Dmitry Artamonow795d5fd2012-03-06 12:45:43 +0400580 int i, timeout;
Mike Rapoport77ffc142010-09-27 11:26:33 +0200581
582 /* Enable slot clock and pulse the reset signals */
583 for (i = 0, reg = AFI_PEX0_CTRL; i < 2; i++, reg += 0x8) {
584 val = afi_readl(reg) | AFI_PEX_CTRL_REFCLK_EN;
585 afi_writel(val, reg);
586 val &= ~AFI_PEX_CTRL_RST;
587 afi_writel(val, reg);
588
589 val = afi_readl(reg) | AFI_PEX_CTRL_RST;
590 afi_writel(val, reg);
591 }
592
593 /* Enable dual controller and both ports */
594 val = afi_readl(AFI_PCIE_CONFIG);
595 val &= ~(AFI_PCIE_CONFIG_PCIEC0_DISABLE_DEVICE |
596 AFI_PCIE_CONFIG_PCIEC1_DISABLE_DEVICE |
597 AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_MASK);
598 val |= AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_DUAL;
599 afi_writel(val, AFI_PCIE_CONFIG);
600
601 val = afi_readl(AFI_FUSE) & ~AFI_FUSE_PCIE_T0_GEN2_DIS;
602 afi_writel(val, AFI_FUSE);
603
604 /* Initialze internal PHY, enable up to 16 PCIE lanes */
605 pads_writel(0x0, PADS_CTL_SEL);
606
607 /* override IDDQ to 1 on all 4 lanes */
608 val = pads_readl(PADS_CTL) | PADS_CTL_IDDQ_1L;
609 pads_writel(val, PADS_CTL);
610
611 /*
612 * set up PHY PLL inputs select PLLE output as refclock,
613 * set TX ref sel to div10 (not div5)
614 */
615 val = pads_readl(PADS_PLL_CTL);
616 val &= ~(PADS_PLL_CTL_REFCLK_MASK | PADS_PLL_CTL_TXCLKREF_MASK);
617 val |= (PADS_PLL_CTL_REFCLK_INTERNAL_CML | PADS_PLL_CTL_TXCLKREF_DIV10);
618 pads_writel(val, PADS_PLL_CTL);
619
620 /* take PLL out of reset */
621 val = pads_readl(PADS_PLL_CTL) | PADS_PLL_CTL_RST_B4SM;
622 pads_writel(val, PADS_PLL_CTL);
623
624 /*
625 * Hack, set the clock voltage to the DEFAULT provided by hw folks.
626 * This doesn't exist in the documentation
627 */
628 pads_writel(0xfa5cfa5c, 0xc8);
629
630 /* Wait for the PLL to lock */
Dmitry Artamonow2f926ee2012-03-13 09:46:27 +0400631 timeout = 300;
Mike Rapoport77ffc142010-09-27 11:26:33 +0200632 do {
633 val = pads_readl(PADS_PLL_CTL);
Dmitry Artamonow2f926ee2012-03-13 09:46:27 +0400634 usleep_range(1000, 1000);
Dmitry Artamonow795d5fd2012-03-06 12:45:43 +0400635 if (--timeout == 0) {
636 pr_err("Tegra PCIe error: timeout waiting for PLL\n");
637 return -EBUSY;
638 }
Mike Rapoport77ffc142010-09-27 11:26:33 +0200639 } while (!(val & PADS_PLL_CTL_LOCKDET));
640
641 /* turn off IDDQ override */
642 val = pads_readl(PADS_CTL) & ~PADS_CTL_IDDQ_1L;
643 pads_writel(val, PADS_CTL);
644
645 /* enable TX/RX data */
646 val = pads_readl(PADS_CTL);
647 val |= (PADS_CTL_TX_DATA_EN_1L | PADS_CTL_RX_DATA_EN_1L);
648 pads_writel(val, PADS_CTL);
649
650 /* Take the PCIe interface module out of reset */
651 tegra_periph_reset_deassert(tegra_pcie.pcie_xclk);
652
653 /* Finally enable PCIe */
654 val = afi_readl(AFI_CONFIGURATION) | AFI_CONFIGURATION_EN_FPCI;
655 afi_writel(val, AFI_CONFIGURATION);
656
657 val = (AFI_INTR_EN_INI_SLVERR | AFI_INTR_EN_INI_DECERR |
658 AFI_INTR_EN_TGT_SLVERR | AFI_INTR_EN_TGT_DECERR |
659 AFI_INTR_EN_TGT_WRERR | AFI_INTR_EN_DFPCI_DECERR);
660 afi_writel(val, AFI_AFI_INTR_ENABLE);
661 afi_writel(0xffffffff, AFI_SM_INTR_ENABLE);
662
663 /* FIXME: No MSI for now, only INT */
664 afi_writel(AFI_INTR_MASK_INT_MASK, AFI_INTR_MASK);
665
666 /* Disable all execptions */
667 afi_writel(0, AFI_FPCI_ERROR_MASKS);
668
Dmitry Artamonow2f926ee2012-03-13 09:46:27 +0400669 return 0;
Mike Rapoport77ffc142010-09-27 11:26:33 +0200670}
671
672static void tegra_pcie_xclk_clamp(bool clamp)
673{
674 u32 reg;
675
676 reg = pmc_readl(PMC_SCRATCH42) & ~PMC_SCRATCH42_PCX_CLAMP;
677
678 if (clamp)
679 reg |= PMC_SCRATCH42_PCX_CLAMP;
680
681 pmc_writel(reg, PMC_SCRATCH42);
682}
683
Mike Rapoport1e40a972011-03-02 14:34:04 +0200684static void tegra_pcie_power_off(void)
685{
686 tegra_periph_reset_assert(tegra_pcie.pcie_xclk);
687 tegra_periph_reset_assert(tegra_pcie.afi_clk);
688 tegra_periph_reset_assert(tegra_pcie.pex_clk);
689
Mike Rapoportb96cc7f2011-03-02 14:34:05 +0200690 tegra_powergate_power_off(TEGRA_POWERGATE_PCIE);
Mike Rapoport1e40a972011-03-02 14:34:04 +0200691 tegra_pcie_xclk_clamp(true);
692}
693
Mike Rapoportb96cc7f2011-03-02 14:34:05 +0200694static int tegra_pcie_power_regate(void)
Mike Rapoport77ffc142010-09-27 11:26:33 +0200695{
Mike Rapoportb96cc7f2011-03-02 14:34:05 +0200696 int err;
697
698 tegra_pcie_power_off();
699
Mike Rapoport77ffc142010-09-27 11:26:33 +0200700 tegra_pcie_xclk_clamp(true);
Mike Rapoportb96cc7f2011-03-02 14:34:05 +0200701
Mike Rapoport77ffc142010-09-27 11:26:33 +0200702 tegra_periph_reset_assert(tegra_pcie.pcie_xclk);
Mike Rapoportb96cc7f2011-03-02 14:34:05 +0200703 tegra_periph_reset_assert(tegra_pcie.afi_clk);
704
705 err = tegra_powergate_sequence_power_up(TEGRA_POWERGATE_PCIE,
706 tegra_pcie.pex_clk);
707 if (err) {
708 pr_err("PCIE: powerup sequence failed: %d\n", err);
709 return err;
710 }
711
712 tegra_periph_reset_deassert(tegra_pcie.afi_clk);
713
Mike Rapoport77ffc142010-09-27 11:26:33 +0200714 tegra_pcie_xclk_clamp(false);
715
Prashant Gaikwad6a5278d2012-06-05 09:59:35 +0530716 clk_prepare_enable(tegra_pcie.afi_clk);
717 clk_prepare_enable(tegra_pcie.pex_clk);
718 return clk_prepare_enable(tegra_pcie.pll_e);
Mike Rapoport77ffc142010-09-27 11:26:33 +0200719}
720
Mike Rapoport77ffc142010-09-27 11:26:33 +0200721static int tegra_pcie_clocks_get(void)
722{
723 int err;
724
725 tegra_pcie.pex_clk = clk_get(NULL, "pex");
726 if (IS_ERR(tegra_pcie.pex_clk))
727 return PTR_ERR(tegra_pcie.pex_clk);
728
729 tegra_pcie.afi_clk = clk_get(NULL, "afi");
730 if (IS_ERR(tegra_pcie.afi_clk)) {
731 err = PTR_ERR(tegra_pcie.afi_clk);
732 goto err_afi_clk;
733 }
734
735 tegra_pcie.pcie_xclk = clk_get(NULL, "pcie_xclk");
736 if (IS_ERR(tegra_pcie.pcie_xclk)) {
737 err = PTR_ERR(tegra_pcie.pcie_xclk);
738 goto err_pcie_xclk;
739 }
740
741 tegra_pcie.pll_e = clk_get_sys(NULL, "pll_e");
742 if (IS_ERR(tegra_pcie.pll_e)) {
743 err = PTR_ERR(tegra_pcie.pll_e);
744 goto err_pll_e;
745 }
746
747 return 0;
748
749err_pll_e:
750 clk_put(tegra_pcie.pcie_xclk);
751err_pcie_xclk:
752 clk_put(tegra_pcie.afi_clk);
753err_afi_clk:
754 clk_put(tegra_pcie.pex_clk);
755
756 return err;
757}
758
759static void tegra_pcie_clocks_put(void)
760{
761 clk_put(tegra_pcie.pll_e);
762 clk_put(tegra_pcie.pcie_xclk);
763 clk_put(tegra_pcie.afi_clk);
764 clk_put(tegra_pcie.pex_clk);
765}
766
767static int __init tegra_pcie_get_resources(void)
768{
769 struct resource *res_mmio = &tegra_pcie.res_mmio;
770 int err;
771
772 err = tegra_pcie_clocks_get();
773 if (err) {
774 pr_err("PCIE: failed to get clocks: %d\n", err);
775 return err;
776 }
777
Mike Rapoportb96cc7f2011-03-02 14:34:05 +0200778 err = tegra_pcie_power_regate();
Mike Rapoport77ffc142010-09-27 11:26:33 +0200779 if (err) {
780 pr_err("PCIE: failed to power up: %d\n", err);
781 goto err_pwr_on;
782 }
783
784 tegra_pcie.regs = ioremap_nocache(TEGRA_PCIE_BASE, PCIE_IOMAP_SZ);
785 if (tegra_pcie.regs == NULL) {
786 pr_err("PCIE: Failed to map PCI/AFI registers\n");
787 err = -ENOMEM;
788 goto err_map_reg;
789 }
790
791 err = request_resource(&iomem_resource, res_mmio);
792 if (err) {
793 pr_err("PCIE: Failed to request resources: %d\n", err);
794 goto err_req_io;
795 }
796
797 tegra_pcie_io_base = ioremap_nocache(res_mmio->start,
798 resource_size(res_mmio));
799 if (tegra_pcie_io_base == NULL) {
800 pr_err("PCIE: Failed to map IO\n");
801 err = -ENOMEM;
802 goto err_map_io;
803 }
804
805 err = request_irq(INT_PCIE_INTR, tegra_pcie_isr,
806 IRQF_SHARED, "PCIE", &tegra_pcie);
807 if (err) {
808 pr_err("PCIE: Failed to register IRQ: %d\n", err);
809 goto err_irq;
810 }
811 set_irq_flags(INT_PCIE_INTR, IRQF_VALID);
812
813 return 0;
814
815err_irq:
816 iounmap(tegra_pcie_io_base);
817err_map_io:
818 release_resource(&tegra_pcie.res_mmio);
819err_req_io:
820 iounmap(tegra_pcie.regs);
821err_map_reg:
822 tegra_pcie_power_off();
823err_pwr_on:
824 tegra_pcie_clocks_put();
825
826 return err;
827}
828
829/*
830 * FIXME: If there are no PCIe cards attached, then calling this function
831 * can result in the increase of the bootup time as there are big timeout
832 * loops.
833 */
834#define TEGRA_PCIE_LINKUP_TIMEOUT 200 /* up to 1.2 seconds */
835static bool tegra_pcie_check_link(struct tegra_pcie_port *pp, int idx,
836 u32 reset_reg)
837{
838 u32 reg;
839 int retries = 3;
840 int timeout;
841
842 do {
843 timeout = TEGRA_PCIE_LINKUP_TIMEOUT;
844 while (timeout) {
845 reg = readl(pp->base + RP_VEND_XP);
846
847 if (reg & RP_VEND_XP_DL_UP)
848 break;
849
850 mdelay(1);
851 timeout--;
852 }
853
854 if (!timeout) {
855 pr_err("PCIE: port %d: link down, retrying\n", idx);
856 goto retry;
857 }
858
859 timeout = TEGRA_PCIE_LINKUP_TIMEOUT;
860 while (timeout) {
861 reg = readl(pp->base + RP_LINK_CONTROL_STATUS);
862
863 if (reg & 0x20000000)
864 return true;
865
866 mdelay(1);
867 timeout--;
868 }
869
870retry:
871 /* Pulse the PEX reset */
872 reg = afi_readl(reset_reg) | AFI_PEX_CTRL_RST;
873 afi_writel(reg, reset_reg);
874 mdelay(1);
875 reg = afi_readl(reset_reg) & ~AFI_PEX_CTRL_RST;
876 afi_writel(reg, reset_reg);
877
878 retries--;
879 } while (retries);
880
881 return false;
882}
883
884static void __init tegra_pcie_add_port(int index, u32 offset, u32 reset_reg)
885{
886 struct tegra_pcie_port *pp;
887
888 pp = tegra_pcie.port + tegra_pcie.num_ports;
889
890 pp->index = -1;
891 pp->base = tegra_pcie.regs + offset;
892 pp->link_up = tegra_pcie_check_link(pp, index, reset_reg);
893
894 if (!pp->link_up) {
895 pp->base = NULL;
896 printk(KERN_INFO "PCIE: port %d: link down, ignoring\n", index);
897 return;
898 }
899
900 tegra_pcie.num_ports++;
901 pp->index = index;
902 pp->root_bus_nr = -1;
903 memset(pp->res, 0, sizeof(pp->res));
904}
905
906int __init tegra_pcie_init(bool init_port0, bool init_port1)
907{
908 int err;
909
910 if (!(init_port0 || init_port1))
911 return -ENODEV;
912
Rob Herringc9d95fb2011-06-28 21:16:13 -0500913 pcibios_min_mem = 0;
914
Mike Rapoport77ffc142010-09-27 11:26:33 +0200915 err = tegra_pcie_get_resources();
916 if (err)
917 return err;
918
Dmitry Artamonow795d5fd2012-03-06 12:45:43 +0400919 err = tegra_pcie_enable_controller();
920 if (err)
921 return err;
Mike Rapoport77ffc142010-09-27 11:26:33 +0200922
923 /* setup the AFI address translations */
924 tegra_pcie_setup_translations();
925
926 if (init_port0)
927 tegra_pcie_add_port(0, RP0_OFFSET, AFI_PEX0_CTRL);
928
929 if (init_port1)
930 tegra_pcie_add_port(1, RP1_OFFSET, AFI_PEX1_CTRL);
931
932 pci_common_init(&tegra_pcie_hw);
933
934 return 0;
935}