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