1 From 86b0b37729298b067157263b7bf5dbf735527e7c Mon Sep 17 00:00:00 2001
2 From: John Crispin <blogic@openwrt.org>
3 Date: Wed, 13 Mar 2013 09:39:02 +0100
4 Subject: [PATCH 30/40] MIPS: lantiq: add pcie driver
7 arch/mips/lantiq/Kconfig | 10 +
8 arch/mips/lantiq/xway/sysctrl.c | 2 +
9 arch/mips/pci/Makefile | 2 +
10 arch/mips/pci/fixup-lantiq-pcie.c | 82 ++
11 arch/mips/pci/fixup-lantiq.c | 3 +
12 arch/mips/pci/ifxmips_pci_common.h | 57 ++
13 arch/mips/pci/ifxmips_pcie.c | 1607 ++++++++++++++++++++++++++++++++++++
14 arch/mips/pci/ifxmips_pcie.h | 135 +++
15 arch/mips/pci/ifxmips_pcie_ar10.h | 290 +++++++
16 arch/mips/pci/ifxmips_pcie_msi.c | 392 +++++++++
17 arch/mips/pci/ifxmips_pcie_phy.c | 478 +++++++++++
18 arch/mips/pci/ifxmips_pcie_pm.c | 176 ++++
19 arch/mips/pci/ifxmips_pcie_pm.h | 36 +
20 arch/mips/pci/ifxmips_pcie_reg.h | 1001 ++++++++++++++++++++++
21 arch/mips/pci/ifxmips_pcie_vr9.h | 271 ++++++
22 arch/mips/pci/pci.c | 25 +
23 drivers/pci/pcie/aer/Kconfig | 2 +-
24 include/linux/pci.h | 2 +
25 include/linux/pci_ids.h | 6 +
26 19 files changed, 4576 insertions(+), 1 deletion(-)
27 create mode 100644 arch/mips/pci/fixup-lantiq-pcie.c
28 create mode 100644 arch/mips/pci/ifxmips_pci_common.h
29 create mode 100644 arch/mips/pci/ifxmips_pcie.c
30 create mode 100644 arch/mips/pci/ifxmips_pcie.h
31 create mode 100644 arch/mips/pci/ifxmips_pcie_ar10.h
32 create mode 100644 arch/mips/pci/ifxmips_pcie_msi.c
33 create mode 100644 arch/mips/pci/ifxmips_pcie_phy.c
34 create mode 100644 arch/mips/pci/ifxmips_pcie_pm.c
35 create mode 100644 arch/mips/pci/ifxmips_pcie_pm.h
36 create mode 100644 arch/mips/pci/ifxmips_pcie_reg.h
37 create mode 100644 arch/mips/pci/ifxmips_pcie_vr9.h
39 diff --git a/arch/mips/lantiq/Kconfig b/arch/mips/lantiq/Kconfig
40 index 675310a..4c9a241 100644
41 --- a/arch/mips/lantiq/Kconfig
42 +++ b/arch/mips/lantiq/Kconfig
43 @@ -18,6 +18,7 @@ config SOC_XWAY
47 + select ARCH_SUPPORTS_MSI
51 @@ -37,6 +38,15 @@ config PCI_LANTIQ
53 depends on SOC_XWAY && PCI
57 + depends on SOC_XWAY && PCI
59 +config PCIE_LANTIQ_MSI
61 + depends on PCIE_LANTIQ && PCI_MSI
65 bool "XRX200 PHY firmware loader"
67 diff --git a/arch/mips/lantiq/xway/sysctrl.c b/arch/mips/lantiq/xway/sysctrl.c
68 index c24924f..e30dde8 100644
69 --- a/arch/mips/lantiq/xway/sysctrl.c
70 +++ b/arch/mips/lantiq/xway/sysctrl.c
71 @@ -377,6 +377,8 @@ void __init ltq_soc_init(void)
72 PMU_PPE_EMA | PMU_PPE_TC | PMU_PPE_SLL01 |
73 PMU_PPE_QSB | PMU_PPE_TOP);
74 clkdev_add_pmu("1f203000.rcu", "gphy", 0, PMU_GPHY);
75 + pmu_w32(~0, PMU_PWDSR1);
76 + pmu_w32(pmu_r32(PMU_PWDSR) & ~PMU_PCIE_CLK, PMU_PWDSR);
77 } else if (of_machine_is_compatible("lantiq,ar9")) {
78 clkdev_add_static(ltq_ar9_cpu_hz(), ltq_ar9_fpi_hz(),
79 ltq_ar9_fpi_hz(), CLOCK_250M);
80 diff --git a/arch/mips/pci/Makefile b/arch/mips/pci/Makefile
81 index ce995d3..bd32fe1 100644
82 --- a/arch/mips/pci/Makefile
83 +++ b/arch/mips/pci/Makefile
84 @@ -42,6 +42,8 @@ obj-$(CONFIG_SIBYTE_BCM1x80) += pci-bcm1480.o pci-bcm1480ht.o
85 obj-$(CONFIG_SNI_RM) += fixup-sni.o ops-sni.o
86 obj-$(CONFIG_LANTIQ) += fixup-lantiq.o
87 obj-$(CONFIG_PCI_LANTIQ) += pci-lantiq.o ops-lantiq.o
88 +obj-$(CONFIG_PCIE_LANTIQ) += ifxmips_pcie_phy.o ifxmips_pcie.o fixup-lantiq-pcie.o
89 +obj-$(CONFIG_PCIE_LANTIQ_MSI) += pcie-lantiq-msi.o
90 obj-$(CONFIG_TANBAC_TB0219) += fixup-tb0219.o
91 obj-$(CONFIG_TANBAC_TB0226) += fixup-tb0226.o
92 obj-$(CONFIG_TANBAC_TB0287) += fixup-tb0287.o
93 diff --git a/arch/mips/pci/fixup-lantiq-pcie.c b/arch/mips/pci/fixup-lantiq-pcie.c
95 index 0000000..50a1c3b
97 +++ b/arch/mips/pci/fixup-lantiq-pcie.c
99 +/******************************************************************************
101 +** FILE NAME : ifxmips_fixup_pcie.c
102 +** PROJECT : IFX UEIP for VRX200
105 +** DATE : 02 Mar 2009
106 +** AUTHOR : Lei Chuanhua
107 +** DESCRIPTION : PCIe Root Complex Driver
108 +** COPYRIGHT : Copyright (c) 2009
109 +** Infineon Technologies AG
110 +** Am Campeon 1-12, 85579 Neubiberg, Germany
112 +** This program is free software; you can redistribute it and/or modify
113 +** it under the terms of the GNU General Public License as published by
114 +** the Free Software Foundation; either version 2 of the License, or
115 +** (at your option) any later version.
117 +** $Version $Date $Author $Comment
118 +** 0.0.1 17 Mar,2009 Lei Chuanhua Initial version
119 +*******************************************************************************/
121 + \file ifxmips_fixup_pcie.c
123 + \brief PCIe Fixup functions source file
125 +#include <linux/pci.h>
126 +#include <linux/pci_regs.h>
127 +#include <linux/pci_ids.h>
129 +#include <lantiq_soc.h>
131 +#include "pcie-lantiq.h"
133 +#define PCI_VENDOR_ID_INFINEON 0x15D1
134 +#define PCI_DEVICE_ID_INFINEON_DANUBE 0x000F
135 +#define PCI_DEVICE_ID_INFINEON_PCIE 0x0011
136 +#define PCI_VENDOR_ID_LANTIQ 0x1BEF
137 +#define PCI_DEVICE_ID_LANTIQ_PCIE 0x0011
141 +static void __devinit
142 +ifx_pcie_fixup_resource(struct pci_dev *dev)
146 + IFX_PCIE_PRINT(PCIE_MSG_FIXUP, "%s dev %s: enter\n", __func__, pci_name(dev));
148 + printk("%s: fixup host controller %s (%04x:%04x)\n",
149 + __func__, pci_name(dev), dev->vendor, dev->device);
151 + /* Setup COMMAND register */
152 + reg = PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER /* |
153 + PCI_COMMAND_INTX_DISABLE */| PCI_COMMAND_SERR;
154 + pci_write_config_word(dev, PCI_COMMAND, reg);
155 + IFX_PCIE_PRINT(PCIE_MSG_FIXUP, "%s dev %s: exit\n", __func__, pci_name(dev));
157 +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INFINEON, PCI_DEVICE_ID_INFINEON_PCIE, ifx_pcie_fixup_resource);
158 +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LANTIQ, PCI_VENDOR_ID_LANTIQ, ifx_pcie_fixup_resource);
160 +static void __devinit
161 +ifx_pcie_rc_class_early_fixup(struct pci_dev *dev)
163 + IFX_PCIE_PRINT(PCIE_MSG_FIXUP, "%s dev %s: enter\n", __func__, pci_name(dev));
165 + if (dev->devfn == PCI_DEVFN(0, 0) &&
166 + (dev->class >> 8) == PCI_CLASS_BRIDGE_HOST) {
168 + dev->class = (PCI_CLASS_BRIDGE_PCI << 8) | (dev->class & 0xff);
170 + printk(KERN_INFO "%s: fixed pcie host bridge to pci-pci bridge\n", __func__);
172 + IFX_PCIE_PRINT(PCIE_MSG_FIXUP, "%s dev %s: exit\n", __func__, pci_name(dev));
176 +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INFINEON, PCI_DEVICE_ID_INFINEON_PCIE,
177 + ifx_pcie_rc_class_early_fixup);
179 +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LANTIQ, PCI_DEVICE_ID_LANTIQ_PCIE,
180 + ifx_pcie_rc_class_early_fixup);
181 diff --git a/arch/mips/pci/fixup-lantiq.c b/arch/mips/pci/fixup-lantiq.c
182 index 6c829df..cf5c4e0 100644
183 --- a/arch/mips/pci/fixup-lantiq.c
184 +++ b/arch/mips/pci/fixup-lantiq.c
187 int (*ltq_pci_plat_arch_init)(struct pci_dev *dev) = NULL;
188 int (*ltq_pci_plat_dev_init)(struct pci_dev *dev) = NULL;
189 +int (*ltq_pci_map_irq)(const struct pci_dev *dev, u8 slot, u8 pin);
191 int pcibios_plat_dev_init(struct pci_dev *dev)
193 @@ -28,6 +29,8 @@ int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
194 struct of_irq dev_irq;
197 + if (ltq_pci_map_irq)
198 + return ltq_pci_map_irq(dev, slot, pin);
199 if (of_irq_map_pci(dev, &dev_irq)) {
200 dev_err(&dev->dev, "trying to map irq for unknown slot:%d pin:%d\n",
202 diff --git a/arch/mips/pci/ifxmips_pci_common.h b/arch/mips/pci/ifxmips_pci_common.h
204 index 0000000..46f4cb2
206 +++ b/arch/mips/pci/ifxmips_pci_common.h
208 +/******************************************************************************
210 +** FILE NAME : ifxmips_pci_common.h
211 +** PROJECT : IFX UEIP
212 +** MODULES : PCI subsystem
214 +** DATE : 30 June 2009
215 +** AUTHOR : Lei Chuanhua
216 +** DESCRIPTION : PCIe Root Complex Driver
217 +** COPYRIGHT : Copyright (c) 2009
218 +** Infineon Technologies AG
219 +** Am Campeon 1-12, 85579 Neubiberg, Germany
221 +** This program is free software; you can redistribute it and/or modify
222 +** it under the terms of the GNU General Public License as published by
223 +** the Free Software Foundation; either version 2 of the License, or
224 +** (at your option) any later version.
226 +** $Version $Date $Author $Comment
227 +** 0.0.1 30 June,2009 Lei Chuanhua Initial version
228 +*******************************************************************************/
230 +#ifndef IFXMIPS_PCI_COMMON_H
231 +#define IFXMIPS_PCI_COMMON_H
232 +#include <linux/version.h>
234 + \defgroup IFX_PCI_COM IFX PCI/PCIe common parts for OS integration
235 + \brief PCI/PCIe common parts
239 + \defgroup IFX_PCI_COM_OS OS APIs
240 + \ingroup IFX_PCI_COM
241 + \brief PCI/PCIe bus driver OS interface functions
244 + \file ifxmips_pci_common.h
245 + \ingroup IFX_PCI_COM
246 + \brief PCI/PCIe bus driver common OS header file
248 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
249 +#define IFX_PCI_CONST
251 +#define IFX_PCI_CONST const
253 +#ifdef CONFIG_IFX_PCI
254 +extern int ifx_pci_bios_map_irq(IFX_PCI_CONST struct pci_dev *dev, u8 slot, u8 pin);
255 +extern int ifx_pci_bios_plat_dev_init(struct pci_dev *dev);
256 +#endif /* COFNIG_IFX_PCI */
258 +#ifdef CONFIG_IFX_PCIE
259 +extern int ifx_pcie_bios_map_irq(IFX_PCI_CONST struct pci_dev *dev, u8 slot, u8 pin);
260 +extern int ifx_pcie_bios_plat_dev_init(struct pci_dev *dev);
263 +#endif /* IFXMIPS_PCI_COMMON_H */
265 diff --git a/arch/mips/pci/ifxmips_pcie.c b/arch/mips/pci/ifxmips_pcie.c
267 index 0000000..5cebfe6
269 +++ b/arch/mips/pci/ifxmips_pcie.c
271 +/******************************************************************************
273 +** FILE NAME : ifxmips_pcie.c
274 +** PROJECT : IFX UEIP for VRX200
275 +** MODULES : PCI MSI sub module
277 +** DATE : 02 Mar 2009
278 +** AUTHOR : Lei Chuanhua
279 +** DESCRIPTION : PCIe Root Complex Driver
280 +** COPYRIGHT : Copyright (c) 2009
281 +** Infineon Technologies AG
282 +** Am Campeon 1-12, 85579 Neubiberg, Germany
284 +** This program is free software; you can redistribute it and/or modify
285 +** it under the terms of the GNU General Public License as published by
286 +** the Free Software Foundation; either version 2 of the License, or
287 +** (at your option) any later version.
289 +** $Version $Date $Author $Comment
290 +** 0.0.1 02 Mar,2009 Lei Chuanhua Initial version
291 +*******************************************************************************/
293 + \file ifxmips_pcie.c
295 + \brief PCI express bus driver source file
297 +#include <linux/types.h>
298 +#include <linux/pci.h>
299 +#include <linux/kernel.h>
300 +#include <linux/init.h>
301 +#include <linux/delay.h>
302 +#include <linux/mm.h>
303 +#include <asm/paccess.h>
304 +#include <linux/pci.h>
305 +#include <linux/pci_regs.h>
306 +#include <linux/module.h>
308 +#include "ifxmips_pcie.h"
309 +#include "ifxmips_pcie_reg.h"
311 +#define IFX_PCIE_VER_MAJOR 1
312 +#define IFX_PCIE_VER_MID 5
313 +#define IFX_PCIE_VER_MINOR 3
315 +/* Enable 32bit io due to its mem mapped io nature */
316 +#define IFX_PCIE_ERROR_INT
317 +#define CONFIG_IFX_PCIE_1ST_CORE
318 +#define IFX_PCIE_IO_32BIT
320 +#define IFX_PCIE_IR (INT_NUM_IM4_IRL0 + 25)
321 +#define IFX_PCIE_INTA (INT_NUM_IM4_IRL0 + 8)
322 +#define IFX_PCIE_INTB (INT_NUM_IM4_IRL0 + 9)
323 +#define IFX_PCIE_INTC (INT_NUM_IM4_IRL0 + 10)
324 +#define IFX_PCIE_INTD (INT_NUM_IM4_IRL0 + 11)
325 +#define MS(_v, _f) (((_v) & (_f)) >> _f##_S)
326 +#define SM(_v, _f) (((_v) << _f##_S) & (_f))
327 +#define IFX_REG_SET_BIT(_f, _r) \
328 + IFX_REG_W32((IFX_REG_R32((_r)) &~ (_f)) | (_f), (_r))
330 +static DEFINE_SPINLOCK(ifx_pcie_lock);
332 +u32 g_pcie_debug_flag = PCIE_MSG_ANY & (~PCIE_MSG_CFG);
334 +static ifx_pcie_irq_t pcie_irqs[IFX_PCIE_CORE_NR] = {
337 + .irq = IFX_PCIE_IR,
338 + .name = "ifx_pcie_rc0",
343 + .irq_bit = PCIE_IRN_INTA,
344 + .irq = IFX_PCIE_INTA,
347 + .irq_bit = PCIE_IRN_INTB,
348 + .irq = IFX_PCIE_INTB,
351 + .irq_bit = PCIE_IRN_INTC,
352 + .irq = IFX_PCIE_INTC,
355 + .irq_bit = PCIE_IRN_INTD,
356 + .irq = IFX_PCIE_INTD,
361 +#ifdef CONFIG_IFX_PCIE_2ND_CORE
364 + .irq = IFX_PCIE1_IR,
365 + .name = "ifx_pcie_rc1",
370 + .irq_bit = PCIE_IRN_INTA,
371 + .irq = IFX_PCIE1_INTA,
374 + .irq_bit = PCIE_IRN_INTB,
375 + .irq = IFX_PCIE1_INTB,
378 + .irq_bit = PCIE_IRN_INTC,
379 + .irq = IFX_PCIE1_INTC,
382 + .irq_bit = PCIE_IRN_INTD,
383 + .irq = IFX_PCIE1_INTD,
388 +#endif /* CONFIG_IFX_PCIE_2ND_CORE */
392 +ifx_pcie_debug(const char *fmt, ...)
394 + static char buf[256] = {0}; /* XXX */
398 + vsnprintf(buf, sizeof(buf), fmt, ap);
404 +#ifdef IFX_PCI_PHY_DBG
405 +/* Generate hot reset, XXX must catpure to verify */
407 +pcie_secondary_bus_reset(int pcie_port)
411 +#define IFX_PCIE_RESET_TIME 20
413 + /* Assert Secondary Bus Reset */
414 + reg = IFX_REG_R32(PCIE_INTRBCTRL(pcie_port));
415 + reg |= PCIE_INTRBCTRL_RST_SECONDARY_BUS;
416 + IFX_REG_W32(reg, PCIE_INTRBCTRL(pcie_port));
418 + /* De-assert Secondary Bus Reset */
419 + reg &= ~PCIE_INTRBCTRL_RST_SECONDARY_BUS;
420 + IFX_REG_W32(reg, PCIE_INTRBCTRL(pcie_port));
422 + /* XXX, wait at least 100 ms, then restore again */
423 + for (i = 0; i < IFX_PCIE_RESET_TIME; i++) {
426 +#undef IFX_PCIE_RESET_TIME
429 +/* Error or L0s to L0 */
431 +pcie_retrain_link(int pcie_port)
435 +#define IFX_PCIE_RETRAIN_TIME 1000
437 + reg = IFX_REG_R32(PCIE_LCTLSTS(pcie_port));
438 + reg |= PCIE_LCTLSTS_RETRIAN_LINK;
439 + IFX_REG_W32(reg, PCIE_LCTLSTS(pcie_port));
441 + /* Wait for the link to come up */
442 + for (i = 0; i < IFX_PCIE_RETRAIN_TIME; i++) {
443 + if (!(IFX_REG_R32(PCIE_LCTLSTS(pcie_port)) & PCIE_LCTLSTS_RETRAIN_PENDING)) {
448 + if (i >= IFX_PCIE_RETRAIN_TIME) {
449 + IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s retrain timeout\n", __func__);
453 +#undef IFX_PCIE_RETRAIN_TIME
457 +pcie_disable_scrambling(int pcie_port)
461 + reg = IFX_REG_R32(PCIE_PLCR(pcie_port));
462 + reg |= PCIE_PLCR_SCRAMBLE_DISABLE;
463 + IFX_REG_W32(reg, PCIE_PLCR(pcie_port));
465 +#endif /* IFX_PCI_PHY_DBG */
468 +pcie_ltssm_enable(int pcie_port)
471 +#define IFX_PCIE_LTSSM_ENABLE_TIMEOUT 10
473 + IFX_REG_W32(PCIE_RC_CCR_LTSSM_ENABLE, PCIE_RC_CCR(pcie_port)); /* Enable LTSSM */
475 + /* Wait for the link to come up */
476 + for (i = 0; i < IFX_PCIE_LTSSM_ENABLE_TIMEOUT; i++) {
477 + if (!(IFX_REG_R32(PCIE_LCTLSTS(pcie_port)) & PCIE_LCTLSTS_RETRAIN_PENDING)) {
482 + if (i >= IFX_PCIE_LTSSM_ENABLE_TIMEOUT) {
483 + IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s link timeout!!!!!\n", __func__);
487 +#undef IFX_PCIE_LTSSM_ENABLE_TIMEOUT
491 +pcie_ltssm_disable(int pcie_port)
493 + IFX_REG_W32(0, PCIE_RC_CCR(pcie_port)); /* Disable LTSSM */
494 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_RC_CCR 0x%08x\n",
495 + __func__, IFX_REG_R32(PCIE_RC_CCR(pcie_port)));
499 +pcie_ahb_bus_error_suppress(int pcie_port)
501 + IFX_REG_W32(PCIE_AHB_CTRL_BUS_ERROR_SUPPRESS, PCIE_AHB_CTRL(pcie_port));
505 +pcie_status_register_clear(int pcie_port)
507 + /* Clear the status register, XXX, seperate function */
508 + IFX_REG_W32(0, PCIE_RC_DR(pcie_port));
509 + IFX_REG_W32(0, PCIE_PCICMDSTS(pcie_port));
510 + IFX_REG_W32(0, PCIE_DCTLSTS(pcie_port));
511 + IFX_REG_W32(0, PCIE_LCTLSTS(pcie_port));
512 + IFX_REG_W32(0, PCIE_SLCTLSTS(pcie_port));
513 + IFX_REG_W32(0, PCIE_RSTS(pcie_port));
514 + IFX_REG_W32(0, PCIE_UES_R(pcie_port));
515 + IFX_REG_W32(0, PCIE_UEMR(pcie_port));
516 + IFX_REG_W32(0, PCIE_UESR(pcie_port));
517 + IFX_REG_W32(0, PCIE_CESR(pcie_port));
518 + IFX_REG_W32(0, PCIE_CEMR(pcie_port));
519 + IFX_REG_W32(0, PCIE_RESR(pcie_port));
520 + IFX_REG_W32(0, PCIE_PVCCRSR(pcie_port));
521 + IFX_REG_W32(0, PCIE_VC0_RSR0(pcie_port));
522 + IFX_REG_W32(0, PCIE_TPFCS(pcie_port));
523 + IFX_REG_W32(0, PCIE_TNPFCS(pcie_port));
524 + IFX_REG_W32(0, PCIE_TCFCS(pcie_port));
525 + IFX_REG_W32(0, PCIE_QSR(pcie_port));
526 + IFX_REG_W32(0, PCIE_IOBLSECS(pcie_port));
530 +ifx_pcie_link_up(int pcie_port)
532 + return (IFX_REG_R32(PCIE_PHY_SR(pcie_port)) & PCIE_PHY_SR_PHY_LINK_UP) ? 1 : 0;
537 +pcie_status_registers_dump(int pcie_port)
539 + printk(KERN_INFO "PCIe_PCICMDSTS: 0x%08x\n", IFX_REG_R32(PCIE_PCICMDSTS(pcie_port)));
540 + printk(KERN_INFO "PCIe_RC_DR: 0x%08x\n", IFX_REG_R32(PCIE_RC_DR(pcie_port)));
541 + printk(KERN_INFO "PCIe_DCTLSTS: 0x%08x\n", IFX_REG_R32(PCIE_DCTLSTS(pcie_port)));
542 + printk(KERN_INFO "PCIe_LCTLSTS: 0x%08x\n", IFX_REG_R32(PCIE_LCTLSTS(pcie_port)));
543 + printk(KERN_INFO "PCIe_SLCTLSTS: 0x%08x\n", IFX_REG_R32(PCIE_SLCTLSTS(pcie_port)));
544 + printk(KERN_INFO "PCIe_RSTS: 0x%08x\n", IFX_REG_R32(PCIE_RSTS(pcie_port)));
545 + printk(KERN_INFO "PCIe_UES_R: 0x%08x\n", IFX_REG_R32(PCIE_UES_R(pcie_port)));
546 + printk(KERN_INFO "PCIe_UEMR: 0x%08x\n", IFX_REG_R32(PCIE_UEMR(pcie_port)));
547 + printk(KERN_INFO "PCIe_UESR: 0x%08x\n", IFX_REG_R32(PCIE_UESR(pcie_port)));
548 + printk(KERN_INFO "PCIe_CESR: 0x%08x\n", IFX_REG_R32(PCIE_CESR(pcie_port)));
549 + printk(KERN_INFO "PCIe_CEMR: 0x%08x\n", IFX_REG_R32(PCIE_CEMR(pcie_port)));
550 + printk(KERN_INFO "PCIe_RESR: 0x%08x\n", IFX_REG_R32(PCIE_RESR(pcie_port)));
551 + printk(KERN_INFO "PCIe_ESIR: 0x%08x\n", IFX_REG_R32(PCIE_ESIR(pcie_port)));
552 + printk(KERN_INFO "PCIe_PVCCRSR: 0x%08x\n", IFX_REG_R32(PCIE_PVCCRSR(pcie_port)));
553 + printk(KERN_INFO "PCIe_VC0_RSR0: 0x%08x\n", IFX_REG_R32(PCIE_VC0_RSR0(pcie_port)));
554 + printk(KERN_INFO "PCIe_TPFCS: 0x%08x\n", IFX_REG_R32(PCIE_TPFCS(pcie_port)));
555 + printk(KERN_INFO "PCIe_TNPFCS: 0x%08x\n", IFX_REG_R32(PCIE_TNPFCS(pcie_port)));
556 + printk(KERN_INFO "PCIe_TCFCS: 0x%08x\n", IFX_REG_R32(PCIE_TCFCS(pcie_port)));
557 + printk(KERN_INFO "PCIe_QSR: 0x%08x\n", IFX_REG_R32(PCIE_QSR(pcie_port)));
558 + printk(KERN_INFO "PCIe_VCTAR1: 0x%08x\n", IFX_REG_R32(PCIE_VCTAR1(pcie_port)));
559 + printk(KERN_INFO "PCIe_VCTAR2: 0x%08x\n", IFX_REG_R32(PCIE_VCTAR2(pcie_port)));
560 + printk(KERN_INFO "PCIe_IOBLSECS: 0x%08x\n", IFX_REG_R32(PCIE_IOBLSECS(pcie_port)));
561 + printk(KERN_INFO "PCIe_ALTRT: 0x%08x\n", IFX_REG_R32(PCIE_ALTRT(pcie_port)));
562 + printk(KERN_INFO "PCIe_SNR: 0x%08x\n", IFX_REG_R32(PCIE_SNR(pcie_port)));
563 + printk(KERN_INFO "PCIe_DBR0: 0x%08x\n", IFX_REG_R32(PCIE_DBR0(pcie_port)));
564 + printk(KERN_INFO "PCIe_DBR1: 0x%08x\n", IFX_REG_R32(PCIE_DBR1(pcie_port)));
568 +pcie_post_dump(int pcie_port)
570 + printk(KERN_INFO "PCIe_PCICMDSTS: 0x%08x\n", IFX_REG_R32(PCIE_PCICMDSTS(pcie_port)));
571 + printk(KERN_INFO "PCIe_MBML: 0x%08x\n", IFX_REG_R32(PCIE_MBML(pcie_port)));
572 + printk(KERN_INFO "PCIe_PBML: 0x%08x\n", IFX_REG_R32(PCIE_PMBL(pcie_port)));
573 + printk(KERN_INFO "PCIe_IOBLSECS: 0x%08x\n", IFX_REG_R32(PCIE_IOBLSECS(pcie_port)));
574 + printk(KERN_INFO "PCIe_IO_BANDL: 0x%08x\n", IFX_REG_R32(PCIE_IO_BANDL(pcie_port)));
575 + printk(KERN_INFO "PCIe_INTRBCTRL: 0x%08x\n", IFX_REG_R32(PCIE_INTRBCTRL(pcie_port)));
576 + printk(KERN_INFO "Power State: D%1d\n", IFX_REG_R32(PCIE_PM_CSR(pcie_port)) & PCIE_PM_CSR_POWER_STATE);
577 + printk(KERN_INFO "Negotiated Link Width: %d\n", MS(IFX_REG_R32(PCIE_LCTLSTS(pcie_port)), PCIE_LCTLSTS_NEGOTIATED_LINK_WIDTH));
578 + printk(KERN_INFO "Number of VCs: %d\n", IFX_REG_R32(PCIE_PVC1(pcie_port)) & PCIE_PVC1_EXT_VC_CNT);
579 + printk(KERN_INFO "Low-priority VCs: %d\n", MS(IFX_REG_R32(PCIE_PVC1(pcie_port)), PCIE_PVC1_LOW_PRI_EXT_VC_CNT));
580 + printk(KERN_INFO "VC Arbitration: 0x%08x\n", IFX_REG_R32(PCIE_PVC2(pcie_port)) & PCIE_PVC2_VC_ARB_WRR);
581 + printk(KERN_INFO "Port Arbitration: 0x%08x\n", IFX_REG_R32(PCIE_VC0_RC(pcie_port)) & PCIE_VC0_RC_PORT_ARB);
583 + if (ifx_pcie_link_up(pcie_port)) {
584 + printk(KERN_INFO "PCIe PHY Link is UP\n");
587 + printk(KERN_INFO "PCIe PHY Link is DOWN!\n");
589 + if ((IFX_REG_R32(PCIE_RC_DR(pcie_port)) & PCIE_RC_DR_DLL_UP)) {
590 + printk(KERN_INFO "PCIe DLL is UP\n");
593 + printk(KERN_INFO "PCIe DLL is DOWN!\n");
596 + if ((IFX_REG_R32(PCIE_LCTLSTS(pcie_port)) & PCIE_LCTLSTS_DLL_ACTIVE)) {
597 + printk(KERN_INFO "PCIE_LCTLSTS in DL_Active state!\n");
600 + printk(KERN_INFO "PCIE_LCTLSTS NOT in DL_Active state!\n");
603 +#endif /* IFX_PCIE_DBG */
605 +/* XXX, this function is not needed in fact */
607 +pcie_mem_io_setup(int pcie_port)
611 + * BAR[0:1] readonly register
612 + * RC contains only minimal BARs for packets mapped to this device
613 + * Mem/IO filters defines a range of memory occupied by memory mapped IO devices that
614 + * reside on the downstream side fo the bridge.
616 + reg = SM((PCIE_MEM_PHY_PORT_TO_END(pcie_port) >> 20), PCIE_MBML_MEM_LIMIT_ADDR)
617 + | SM((PCIE_MEM_PHY_PORT_TO_BASE(pcie_port) >> 20), PCIE_MBML_MEM_BASE_ADDR);
619 + IFX_REG_W32(reg, PCIE_MBML(pcie_port));
621 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_MBML: 0x%08x\n",
622 + __func__, IFX_REG_R32(PCIE_MBML(pcie_port)));
624 +#ifdef IFX_PCIE_PREFETCH_MEM_64BIT
625 + reg = SM((PCIE_MEM_PHY_PORT_TO_END(pcie_port) >> 20), PCIE_PMBL_END_ADDR)
626 + | SM((PCIE_MEM_PHY_PORT_TO_BASE(pcie_port) >> 20), PCIE_PMBL_UPPER_12BIT)
627 + | PCIE_PMBL_64BIT_ADDR;
628 + IFX_REG_W32(reg, PCIE_PMBL(pcie_port));
630 + /* Must configure upper 32bit */
631 + IFX_REG_W32(0, PCIE_PMBU32(pcie_port));
632 + IFX_REG_W32(0, PCIE_PMLU32(pcie_port));
634 + /* PCIe_PBML, same as MBML */
635 + IFX_REG_W32(IFX_REG_R32(PCIE_MBML(pcie_port)), PCIE_PMBL(pcie_port));
637 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_PMBL: 0x%08x\n",
638 + __func__, IFX_REG_R32(PCIE_PMBL(pcie_port)));
640 + /* IO Address Range */
641 + reg = SM((PCIE_IO_PHY_PORT_TO_END(pcie_port) >> 12), PCIE_IOBLSECS_IO_LIMIT_ADDR)
642 + | SM((PCIE_IO_PHY_PORT_TO_BASE(pcie_port) >> 12), PCIE_IOBLSECS_IO_BASE_ADDR);
643 +#ifdef IFX_PCIE_IO_32BIT
644 + reg |= PCIE_IOBLSECS_32BIT_IO_ADDR;
645 +#endif /* IFX_PCIE_IO_32BIT */
646 + IFX_REG_W32(reg, PCIE_IOBLSECS(pcie_port));
648 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_IOBLSECS: 0x%08x\n",
649 + __func__, IFX_REG_R32(PCIE_IOBLSECS(pcie_port)));
650 +#ifdef IFX_PCIE_IO_32BIT
651 + reg = SM((PCIE_IO_PHY_PORT_TO_END(pcie_port) >> 16), PCIE_IO_BANDL_UPPER_16BIT_IO_LIMIT)
652 + | SM((PCIE_IO_PHY_PORT_TO_BASE(pcie_port) >> 16), PCIE_IO_BANDL_UPPER_16BIT_IO_BASE);
653 + IFX_REG_W32(reg, PCIE_IO_BANDL(pcie_port));
655 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_IO_BANDL: 0x%08x\n",
656 + __func__, IFX_REG_R32(PCIE_IO_BANDL(pcie_port)));
657 +#endif /* IFX_PCIE_IO_32BIT */
661 +pcie_msi_setup(int pcie_port)
665 + /* XXX, MSI stuff should only apply to EP */
666 + /* MSI Capability: Only enable 32-bit addresses */
667 + reg = IFX_REG_R32(PCIE_MCAPR(pcie_port));
668 + reg &= ~PCIE_MCAPR_ADDR64_CAP;
670 + reg |= PCIE_MCAPR_MSI_ENABLE;
672 + /* Disable multiple message */
673 + reg &= ~(PCIE_MCAPR_MULTI_MSG_CAP | PCIE_MCAPR_MULTI_MSG_ENABLE);
674 + IFX_REG_W32(reg, PCIE_MCAPR(pcie_port));
675 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_MCAPR: 0x%08x\n",
676 + __func__, IFX_REG_R32(PCIE_MCAPR(pcie_port)));
680 +pcie_pm_setup(int pcie_port)
684 + /* Enable PME, Soft reset enabled */
685 + reg = IFX_REG_R32(PCIE_PM_CSR(pcie_port));
686 + reg |= PCIE_PM_CSR_PME_ENABLE | PCIE_PM_CSR_SW_RST;
687 + IFX_REG_W32(reg, PCIE_PM_CSR(pcie_port));
688 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_PM_CSR: 0x%08x\n",
689 + __func__, IFX_REG_R32(PCIE_PM_CSR(pcie_port)));
693 +pcie_bus_setup(int pcie_port)
697 + reg = SM(0, PCIE_BNR_PRIMARY_BUS_NUM) | SM(1, PCIE_PNR_SECONDARY_BUS_NUM) | SM(0xFF, PCIE_PNR_SUB_BUS_NUM);
698 + IFX_REG_W32(reg, PCIE_BNR(pcie_port));
699 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_BNR: 0x%08x\n",
700 + __func__, IFX_REG_R32(PCIE_BNR(pcie_port)));
704 +pcie_device_setup(int pcie_port)
708 + /* Device capability register, set up Maximum payload size */
709 + reg = IFX_REG_R32(PCIE_DCAP(pcie_port));
710 + reg |= PCIE_DCAP_ROLE_BASE_ERR_REPORT;
711 + reg |= SM(PCIE_MAX_PAYLOAD_128, PCIE_DCAP_MAX_PAYLOAD_SIZE);
713 + /* Only available for EP */
714 + reg &= ~(PCIE_DCAP_EP_L0S_LATENCY | PCIE_DCAP_EP_L1_LATENCY);
715 + IFX_REG_W32(reg, PCIE_DCAP(pcie_port));
716 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_DCAP: 0x%08x\n",
717 + __func__, IFX_REG_R32(PCIE_DCAP(pcie_port)));
719 + /* Device control and status register */
720 + /* Set Maximum Read Request size for the device as a Requestor */
721 + reg = IFX_REG_R32(PCIE_DCTLSTS(pcie_port));
724 + * Request size can be larger than the MPS used, but the completions returned
725 + * for the read will be bounded by the MPS size.
726 + * In our system, Max request size depends on AHB burst size. It is 64 bytes.
727 + * but we set it as 128 as minimum one.
729 + reg |= SM(PCIE_MAX_PAYLOAD_128, PCIE_DCTLSTS_MAX_READ_SIZE)
730 + | SM(PCIE_MAX_PAYLOAD_128, PCIE_DCTLSTS_MAX_PAYLOAD_SIZE);
732 + /* Enable relaxed ordering, no snoop, and all kinds of errors */
733 + reg |= PCIE_DCTLSTS_RELAXED_ORDERING_EN | PCIE_DCTLSTS_ERR_EN | PCIE_DCTLSTS_NO_SNOOP_EN;
735 + IFX_REG_W32(reg, PCIE_DCTLSTS(pcie_port));
736 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_DCTLSTS: 0x%08x\n",
737 + __func__, IFX_REG_R32(PCIE_DCTLSTS(pcie_port)));
741 +pcie_link_setup(int pcie_port)
746 + * XXX, Link capability register, bit 18 for EP CLKREQ# dynamic clock management for L1, L2/3 CPM
747 + * L0s is reported during link training via TS1 order set by N_FTS
749 + reg = IFX_REG_R32(PCIE_LCAP(pcie_port));
750 + reg &= ~PCIE_LCAP_L0S_EIXT_LATENCY;
751 + reg |= SM(3, PCIE_LCAP_L0S_EIXT_LATENCY);
752 + IFX_REG_W32(reg, PCIE_LCAP(pcie_port));
753 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_LCAP: 0x%08x\n",
754 + __func__, IFX_REG_R32(PCIE_LCAP(pcie_port)));
756 + /* Link control and status register */
757 + reg = IFX_REG_R32(PCIE_LCTLSTS(pcie_port));
759 + /* Link Enable, ASPM enabled */
760 + reg &= ~PCIE_LCTLSTS_LINK_DISABLE;
762 +#ifdef CONFIG_PCIEASPM
764 + * We use the same physical reference clock that the platform provides on the connector
765 + * It paved the way for ASPM to calculate the new exit Latency
767 + reg |= PCIE_LCTLSTS_SLOT_CLK_CFG;
768 + reg |= PCIE_LCTLSTS_COM_CLK_CFG;
770 + * We should disable ASPM by default except that we have dedicated power management support
771 + * Enable ASPM will cause the system hangup/instability, performance degration
773 + reg |= PCIE_LCTLSTS_ASPM_ENABLE;
775 + reg &= ~PCIE_LCTLSTS_ASPM_ENABLE;
776 +#endif /* CONFIG_PCIEASPM */
779 + * The maximum size of any completion with data packet is bounded by the MPS setting
780 + * in device control register
783 + /* RCB may cause multiple split transactions, two options available, we use 64 byte RCB */
784 + reg &= ~ PCIE_LCTLSTS_RCB128;
786 + IFX_REG_W32(reg, PCIE_LCTLSTS(pcie_port));
787 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_LCTLSTS: 0x%08x\n",
788 + __func__, IFX_REG_R32(PCIE_LCTLSTS(pcie_port)));
792 +pcie_error_setup(int pcie_port)
797 + * Forward ERR_COR, ERR_NONFATAL, ERR_FATAL to the backbone
798 + * Poisoned write TLPs and completions indicating poisoned TLPs will set the PCIe_PCICMDSTS.MDPE
800 + reg = IFX_REG_R32(PCIE_INTRBCTRL(pcie_port));
801 + reg |= PCIE_INTRBCTRL_SERR_ENABLE | PCIE_INTRBCTRL_PARITY_ERR_RESP_ENABLE;
803 + IFX_REG_W32(reg, PCIE_INTRBCTRL(pcie_port));
804 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_INTRBCTRL: 0x%08x\n",
805 + __func__, IFX_REG_R32(PCIE_INTRBCTRL(pcie_port)));
807 + /* Uncorrectable Error Mask Register, Unmask <enable> all bits in PCIE_UESR */
808 + reg = IFX_REG_R32(PCIE_UEMR(pcie_port));
809 + reg &= ~PCIE_ALL_UNCORRECTABLE_ERR;
810 + IFX_REG_W32(reg, PCIE_UEMR(pcie_port));
811 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_UEMR: 0x%08x\n",
812 + __func__, IFX_REG_R32(PCIE_UEMR(pcie_port)));
814 + /* Uncorrectable Error Severity Register, ALL errors are FATAL */
815 + IFX_REG_W32(PCIE_ALL_UNCORRECTABLE_ERR, PCIE_UESR(pcie_port));
816 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_UESR: 0x%08x\n",
817 + __func__, IFX_REG_R32(PCIE_UESR(pcie_port)));
819 + /* Correctable Error Mask Register, unmask <enable> all bits */
820 + reg = IFX_REG_R32(PCIE_CEMR(pcie_port));
821 + reg &= ~PCIE_CORRECTABLE_ERR;
822 + IFX_REG_W32(reg, PCIE_CEMR(pcie_port));
823 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_CEMR: 0x%08x\n",
824 + __func__, IFX_REG_R32(PCIE_CEMR(pcie_port)));
826 + /* Advanced Error Capabilities and Control Registr */
827 + reg = IFX_REG_R32(PCIE_AECCR(pcie_port));
828 + reg |= PCIE_AECCR_ECRC_CHECK_EN | PCIE_AECCR_ECRC_GEN_EN;
829 + IFX_REG_W32(reg, PCIE_AECCR(pcie_port));
830 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_AECCR: 0x%08x\n",
831 + __func__, IFX_REG_R32(PCIE_AECCR(pcie_port)));
833 + /* Root Error Command Register, Report all types of errors */
834 + reg = IFX_REG_R32(PCIE_RECR(pcie_port));
835 + reg |= PCIE_RECR_ERR_REPORT_EN;
836 + IFX_REG_W32(reg, PCIE_RECR(pcie_port));
837 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_RECR: 0x%08x\n",
838 + __func__, IFX_REG_R32(PCIE_RECR(pcie_port)));
840 + /* Clear the Root status register */
841 + reg = IFX_REG_R32(PCIE_RESR(pcie_port));
842 + IFX_REG_W32(reg, PCIE_RESR(pcie_port));
846 +pcie_root_setup(int pcie_port)
850 + /* Root control and capabilities register */
851 + reg = IFX_REG_R32(PCIE_RCTLCAP(pcie_port));
852 + reg |= PCIE_RCTLCAP_SERR_ENABLE | PCIE_RCTLCAP_PME_INT_EN;
853 + IFX_REG_W32(reg, PCIE_RCTLCAP(pcie_port));
854 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_RCTLCAP: 0x%08x\n",
855 + __func__, IFX_REG_R32(PCIE_RCTLCAP(pcie_port)));
859 +pcie_vc_setup(int pcie_port)
863 + /* Port VC Capability Register 2 */
864 + reg = IFX_REG_R32(PCIE_PVC2(pcie_port));
865 + reg &= ~PCIE_PVC2_VC_ARB_WRR;
866 + reg |= PCIE_PVC2_VC_ARB_16P_FIXED_WRR;
867 + IFX_REG_W32(reg, PCIE_PVC2(pcie_port));
868 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_PVC2: 0x%08x\n",
869 + __func__, IFX_REG_R32(PCIE_PVC2(pcie_port)));
871 + /* VC0 Resource Capability Register */
872 + reg = IFX_REG_R32(PCIE_VC0_RC(pcie_port));
873 + reg &= ~PCIE_VC0_RC_REJECT_SNOOP;
874 + IFX_REG_W32(reg, PCIE_VC0_RC(pcie_port));
875 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_VC0_RC: 0x%08x\n",
876 + __func__, IFX_REG_R32(PCIE_VC0_RC(pcie_port)));
880 +pcie_port_logic_setup(int pcie_port)
884 + /* FTS number, default 12, increase to 63, may increase time from/to L0s to L0 */
885 + reg = IFX_REG_R32(PCIE_AFR(pcie_port));
886 + reg &= ~(PCIE_AFR_FTS_NUM | PCIE_AFR_COM_FTS_NUM);
887 + reg |= SM(PCIE_AFR_FTS_NUM_DEFAULT, PCIE_AFR_FTS_NUM)
888 + | SM(PCIE_AFR_FTS_NUM_DEFAULT, PCIE_AFR_COM_FTS_NUM);
889 + /* L0s and L1 entry latency */
890 + reg &= ~(PCIE_AFR_L0S_ENTRY_LATENCY | PCIE_AFR_L1_ENTRY_LATENCY);
891 + reg |= SM(PCIE_AFR_L0S_ENTRY_LATENCY_DEFAULT, PCIE_AFR_L0S_ENTRY_LATENCY)
892 + | SM(PCIE_AFR_L1_ENTRY_LATENCY_DEFAULT, PCIE_AFR_L1_ENTRY_LATENCY);
893 + IFX_REG_W32(reg, PCIE_AFR(pcie_port));
895 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_AFR: 0x%08x\n",
896 + __func__, IFX_REG_R32(PCIE_AFR(pcie_port)));
898 + /* Port Link Control Register */
899 + reg = IFX_REG_R32(PCIE_PLCR(pcie_port));
900 + reg |= PCIE_PLCR_DLL_LINK_EN; /* Enable the DLL link */
901 + IFX_REG_W32(reg, PCIE_PLCR(pcie_port));
902 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_PLCR: 0x%08x\n",
903 + __func__, IFX_REG_R32(PCIE_PLCR(pcie_port)));
905 + /* Lane Skew Register */
906 + reg = IFX_REG_R32(PCIE_LSR(pcie_port));
907 + /* Enable ACK/NACK and FC */
908 + reg &= ~(PCIE_LSR_ACKNAK_DISABLE | PCIE_LSR_FC_DISABLE);
909 + IFX_REG_W32(reg, PCIE_LSR(pcie_port));
910 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_LSR: 0x%08x\n",
911 + __func__, IFX_REG_R32(PCIE_LSR(pcie_port)));
913 + /* Symbol Timer Register and Filter Mask Register 1 */
914 + reg = IFX_REG_R32(PCIE_STRFMR(pcie_port));
916 + /* Default SKP interval is very accurate already, 5us */
917 + /* Enable IO/CFG transaction */
918 + reg |= PCIE_STRFMR_RX_CFG_TRANS_ENABLE | PCIE_STRFMR_RX_IO_TRANS_ENABLE;
919 + /* Disable FC WDT */
920 + reg &= ~PCIE_STRFMR_FC_WDT_DISABLE;
921 + IFX_REG_W32(reg, PCIE_STRFMR(pcie_port));
922 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_STRFMR: 0x%08x\n",
923 + __func__, IFX_REG_R32(PCIE_STRFMR(pcie_port)));
925 + /* Filter Masker Register 2 */
926 + reg = IFX_REG_R32(PCIE_FMR2(pcie_port));
927 + reg |= PCIE_FMR2_VENDOR_MSG1_PASSED_TO_TRGT1 | PCIE_FMR2_VENDOR_MSG0_PASSED_TO_TRGT1;
928 + IFX_REG_W32(reg, PCIE_FMR2(pcie_port));
929 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_FMR2: 0x%08x\n",
930 + __func__, IFX_REG_R32(PCIE_FMR2(pcie_port)));
932 + /* VC0 Completion Receive Queue Control Register */
933 + reg = IFX_REG_R32(PCIE_VC0_CRQCR(pcie_port));
934 + reg &= ~PCIE_VC0_CRQCR_CPL_TLP_QUEUE_MODE;
935 + reg |= SM(PCIE_VC0_TLP_QUEUE_MODE_BYPASS, PCIE_VC0_CRQCR_CPL_TLP_QUEUE_MODE);
936 + IFX_REG_W32(reg, PCIE_VC0_CRQCR(pcie_port));
937 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_VC0_CRQCR: 0x%08x\n",
938 + __func__, IFX_REG_R32(PCIE_VC0_CRQCR(pcie_port)));
942 +pcie_rc_cfg_reg_setup(int pcie_port)
944 + pcie_ltssm_disable(pcie_port);
945 + pcie_mem_io_setup(pcie_port);
946 + pcie_msi_setup(pcie_port);
947 + pcie_pm_setup(pcie_port);
948 + pcie_bus_setup(pcie_port);
949 + pcie_device_setup(pcie_port);
950 + pcie_link_setup(pcie_port);
951 + pcie_error_setup(pcie_port);
952 + pcie_root_setup(pcie_port);
953 + pcie_vc_setup(pcie_port);
954 + pcie_port_logic_setup(pcie_port);
958 +ifx_pcie_wait_phy_link_up(int pcie_port)
960 +#define IFX_PCIE_PHY_LINK_UP_TIMEOUT 1000 /* XXX, tunable */
963 + /* Wait for PHY link is up */
964 + for (i = 0; i < IFX_PCIE_PHY_LINK_UP_TIMEOUT; i++) {
965 + if (ifx_pcie_link_up(pcie_port)) {
970 + if (i >= IFX_PCIE_PHY_LINK_UP_TIMEOUT) {
971 + printk(KERN_ERR "%s timeout\n", __func__);
975 + /* Check data link up or not */
976 + if (!(IFX_REG_R32(PCIE_RC_DR(pcie_port)) & PCIE_RC_DR_DLL_UP)) {
977 + printk(KERN_ERR "%s DLL link is still down\n", __func__);
981 + /* Check Data link active or not */
982 + if (!(IFX_REG_R32(PCIE_LCTLSTS(pcie_port)) & PCIE_LCTLSTS_DLL_ACTIVE)) {
983 + printk(KERN_ERR "%s DLL is not active\n", __func__);
987 +#undef IFX_PCIE_PHY_LINK_UP_TIMEOUT
991 +pcie_app_loigc_setup(int pcie_port)
993 +#ifdef IFX_PCIE_PHY_DBG
994 + pcie_disable_scrambling(pcie_port);
995 +#endif /* IFX_PCIE_PHY_DBG */
996 + pcie_ahb_bus_error_suppress(pcie_port);
998 + /* Pull PCIe EP out of reset */
999 + pcie_device_rst_deassert(pcie_port);
1001 + /* Start LTSSM training between RC and EP */
1002 + pcie_ltssm_enable(pcie_port);
1004 + /* Check PHY status after enabling LTSSM */
1005 + if (ifx_pcie_wait_phy_link_up(pcie_port) != 0) {
1012 + * Must be done after ltssm due to based on negotiated link
1013 + * width and payload size
1014 + * Update the Replay Time Limit. Empirically, some PCIe
1015 + * devices take a little longer to respond than expected under
1016 + * load. As a workaround for this we configure the Replay Time
1017 + * Limit to the value expected for a 512 byte MPS instead of
1018 + * our actual 128 byte MPS. The numbers below are directly
1019 + * from the PCIe spec table 3-4/5.
1022 +pcie_replay_time_update(int pcie_port)
1028 + reg = IFX_REG_R32(PCIE_LCTLSTS(pcie_port));
1030 + nlw = MS(reg, PCIE_LCTLSTS_NEGOTIATED_LINK_WIDTH);
1032 + case PCIE_MAX_LENGTH_WIDTH_X1:
1035 + case PCIE_MAX_LENGTH_WIDTH_X2:
1038 + case PCIE_MAX_LENGTH_WIDTH_X4:
1041 + case PCIE_MAX_LENGTH_WIDTH_X8:
1048 + reg = IFX_REG_R32(PCIE_ALTRT(pcie_port));
1049 + reg &= ~PCIE_ALTRT_REPLAY_TIME_LIMIT;
1050 + reg |= SM(rtl, PCIE_ALTRT_REPLAY_TIME_LIMIT);
1051 + IFX_REG_W32(reg, PCIE_ALTRT(pcie_port));
1053 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_ALTRT 0x%08x\n",
1054 + __func__, IFX_REG_R32(PCIE_ALTRT(pcie_port)));
1058 + * Table 359 Enhanced Configuration Address Mapping1)
1059 + * 1) This table is defined in Table 7-1, page 341, PCI Express Base Specification v1.1
1060 + * Memory Address PCI Express Configuration Space
1061 + * A[(20+n-1):20] Bus Number 1 < n < 8
1062 + * A[19:15] Device Number
1063 + * A[14:12] Function Number
1064 + * A[11:8] Extended Register Number
1065 + * A[7:2] Register Number
1066 + * A[1:0] Along with size of the access, used to generate Byte Enables
1067 + * For VR9, only the address bits [22:0] are mapped to the configuration space:
1068 + * . Address bits [22:20] select the target bus (1-of-8)1)
1069 + * . Address bits [19:15] select the target device (1-of-32) on the bus
1070 + * . Address bits [14:12] select the target function (1-of-8) within the device.
1071 + * . Address bits [11:2] selects the target dword (1-of-1024) within the selected function.s configuration space
1072 + * . Address bits [1:0] define the start byte location within the selected dword.
1075 +pcie_bus_addr(u8 bus_num, u16 devfn, int where)
1082 + addr = ((PCI_SLOT(devfn) & 0x1F) << 15) | ((PCI_FUNC(devfn) & 0x7) << 12) | ((where & 0xFFF)& ~3);
1086 + /* type 1, only support 8 buses */
1087 + addr = ((bus & 0x7) << 20) | ((PCI_SLOT(devfn) & 0x1F) << 15) |
1088 + ((PCI_FUNC(devfn) & 0x7) << 12) | ((where & 0xFFF) & ~3);
1090 + IFX_PCIE_PRINT(PCIE_MSG_CFG, "%s: bus addr : %02x:%02x.%01x/%02x, addr=%08x\n",
1091 + __func__, bus_num, PCI_SLOT(devfn), PCI_FUNC(devfn), where, addr);
1096 +pcie_valid_config(int pcie_port, int bus, int dev)
1099 + if ((bus == 0) && (dev == 0)) {
1103 + /* No physical link */
1104 + if (!ifx_pcie_link_up(pcie_port)) {
1108 + /* Bus zero only has RC itself
1109 + * XXX, check if EP will be integrated
1111 + if ((bus == 0) && (dev != 0)) {
1115 + /* Maximum 8 buses supported for VRX */
1121 + * PCIe is PtP link, one bus only supports only one device
1122 + * except bus zero and PCIe switch which is virtual bus device
1123 + * The following two conditions really depends on the system design
1124 + * and attached the device.
1125 + * XXX, how about more new switch
1127 + if ((bus == 1) && (dev != 0)) {
1131 + if ((bus >= 3) && (dev != 0)) {
1138 +ifx_pcie_cfg_rd(int pcie_port, u32 reg)
1140 + return IFX_REG_R32((volatile u32 *)(PCIE_CFG_PORT_TO_BASE(pcie_port) + reg));
1144 +ifx_pcie_cfg_wr(int pcie_port, unsigned int reg, u32 val)
1146 + IFX_REG_W32( val, (volatile u32 *)(PCIE_CFG_PORT_TO_BASE(pcie_port) + reg));
1150 +ifx_pcie_rc_cfg_rd(int pcie_port, u32 reg)
1152 + return IFX_REG_R32((volatile u32 *)(PCIE_RC_PORT_TO_BASE(pcie_port) + reg));
1156 +ifx_pcie_rc_cfg_wr(int pcie_port, unsigned int reg, u32 val)
1158 + IFX_REG_W32(val, (volatile u32 *)(PCIE_RC_PORT_TO_BASE(pcie_port) + reg));
1162 +ifx_pcie_bus_enum_read_hack(int where, u32 value)
1164 + u32 tvalue = value;
1166 + if (where == PCI_PRIMARY_BUS) {
1167 + u8 primary, secondary, subordinate;
1169 + primary = tvalue & 0xFF;
1170 + secondary = (tvalue >> 8) & 0xFF;
1171 + subordinate = (tvalue >> 16) & 0xFF;
1172 + primary += pcibios_1st_host_bus_nr();
1173 + secondary += pcibios_1st_host_bus_nr();
1174 + subordinate += pcibios_1st_host_bus_nr();
1175 + tvalue = (tvalue & 0xFF000000) | (u32)primary | (u32)(secondary << 8) | (u32)(subordinate << 16);
1181 +ifx_pcie_bus_enum_write_hack(int where, u32 value)
1183 + u32 tvalue = value;
1185 + if (where == PCI_PRIMARY_BUS) {
1186 + u8 primary, secondary, subordinate;
1188 + primary = tvalue & 0xFF;
1189 + secondary = (tvalue >> 8) & 0xFF;
1190 + subordinate = (tvalue >> 16) & 0xFF;
1191 + if (primary > 0 && primary != 0xFF) {
1192 + primary -= pcibios_1st_host_bus_nr();
1195 + if (secondary > 0 && secondary != 0xFF) {
1196 + secondary -= pcibios_1st_host_bus_nr();
1198 + if (subordinate > 0 && subordinate != 0xFF) {
1199 + subordinate -= pcibios_1st_host_bus_nr();
1201 + tvalue = (tvalue & 0xFF000000) | (u32)primary | (u32)(secondary << 8) | (u32)(subordinate << 16);
1203 + else if (where == PCI_SUBORDINATE_BUS) {
1204 + u8 subordinate = tvalue & 0xFF;
1206 + subordinate = subordinate > 0 ? subordinate - pcibios_1st_host_bus_nr() : 0;
1207 + tvalue = subordinate;
1213 + * \fn static int ifx_pcie_read_config(struct pci_bus *bus, u32 devfn,
1214 + * int where, int size, u32 *value)
1215 + * \brief Read a value from configuration space
1217 + * \param[in] bus Pointer to pci bus
1218 + * \param[in] devfn PCI device function number
1219 + * \param[in] where PCI register number
1220 + * \param[in] size Register read size
1221 + * \param[out] value Pointer to return value
1222 + * \return PCIBIOS_BAD_REGISTER_NUMBER Invalid register number
1223 + * \return PCIBIOS_FUNC_NOT_SUPPORTED PCI function not supported
1224 + * \return PCIBIOS_DEVICE_NOT_FOUND PCI device not found
1225 + * \return PCIBIOS_SUCCESSFUL OK
1226 + * \ingroup IFX_PCIE_OS
1229 +ifx_pcie_read_config(struct pci_bus *bus, u32 devfn,
1230 + int where, int size, u32 *value)
1233 + int bus_number = bus->number;
1234 + static const u32 mask[8] = {0, 0xff, 0xffff, 0, 0xffffffff, 0, 0, 0};
1235 + int ret = PCIBIOS_SUCCESSFUL;
1236 + struct ifx_pci_controller *ctrl = bus->sysdata;
1237 + int pcie_port = ctrl->port;
1239 + if (unlikely(size != 1 && size != 2 && size != 4)){
1240 + ret = PCIBIOS_BAD_REGISTER_NUMBER;
1244 + /* Make sure the address is aligned to natural boundary */
1245 + if (unlikely(((size - 1) & where))) {
1246 + ret = PCIBIOS_BAD_REGISTER_NUMBER;
1251 + * If we are second controller, we have to cheat OS so that it assume
1252 + * its bus number starts from 0 in host controller
1254 + bus_number = ifx_pcie_bus_nr_deduct(bus_number, pcie_port);
1257 + * We need to force the bus number to be zero on the root
1258 + * bus. Linux numbers the 2nd root bus to start after all
1259 + * busses on root 0.
1261 + if (bus->parent == NULL) {
1266 + * PCIe only has a single device connected to it. It is
1267 + * always device ID 0. Don't bother doing reads for other
1268 + * device IDs on the first segment.
1270 + if ((bus_number == 0) && (PCI_SLOT(devfn) != 0)) {
1271 + ret = PCIBIOS_FUNC_NOT_SUPPORTED;
1275 + if (pcie_valid_config(pcie_port, bus_number, PCI_SLOT(devfn)) == 0) {
1276 + *value = 0xffffffff;
1277 + ret = PCIBIOS_DEVICE_NOT_FOUND;
1281 + IFX_PCIE_PRINT(PCIE_MSG_READ_CFG, "%s: %02x:%02x.%01x/%02x:%01d\n", __func__, bus_number,
1282 + PCI_SLOT(devfn), PCI_FUNC(devfn), where, size);
1284 + PCIE_IRQ_LOCK(ifx_pcie_lock);
1285 + if (bus_number == 0) { /* RC itself */
1289 + data = ifx_pcie_rc_cfg_rd(pcie_port, t);
1290 + IFX_PCIE_PRINT(PCIE_MSG_READ_CFG, "%s: rd local cfg, offset:%08x, data:%08x\n",
1291 + __func__, t, data);
1294 + u32 addr = pcie_bus_addr(bus_number, devfn, where);
1296 + data = ifx_pcie_cfg_rd(pcie_port, addr);
1297 + if (pcie_port == IFX_PCIE_PORT0) {
1298 + #ifdef CONFIG_IFX_PCIE_HW_SWAP
1299 + data = le32_to_cpu(data);
1300 + #endif /* CONFIG_IFX_PCIE_HW_SWAP */
1303 + #ifdef CONFIG_IFX_PCIE1_HW_SWAP
1304 + data = le32_to_cpu(data);
1305 + #endif /* CONFIG_IFX_PCIE_HW_SWAP */
1308 + /* To get a correct PCI topology, we have to restore the bus number to OS */
1309 + data = ifx_pcie_bus_enum_hack(bus, devfn, where, data, pcie_port, 1);
1311 + PCIE_IRQ_UNLOCK(ifx_pcie_lock);
1312 + IFX_PCIE_PRINT(PCIE_MSG_READ_CFG, "%s: read config: data=%08x raw=%08x\n",
1313 + __func__, (data >> (8 * (where & 3))) & mask[size & 7], data);
1315 + *value = (data >> (8 * (where & 3))) & mask[size & 7];
1321 +ifx_pcie_size_to_value(int where, int size, u32 data, u32 value)
1328 + shift = (where & 0x3) << 3;
1329 + tdata &= ~(0xffU << shift);
1330 + tdata |= ((value & 0xffU) << shift);
1333 + shift = (where & 3) << 3;
1334 + tdata &= ~(0xffffU << shift);
1335 + tdata |= ((value & 0xffffU) << shift);
1345 + * \fn static static int ifx_pcie_write_config(struct pci_bus *bus, u32 devfn,
1346 + * int where, int size, u32 value)
1347 + * \brief Write a value to PCI configuration space
1349 + * \param[in] bus Pointer to pci bus
1350 + * \param[in] devfn PCI device function number
1351 + * \param[in] where PCI register number
1352 + * \param[in] size The register size to be written
1353 + * \param[in] value The valule to be written
1354 + * \return PCIBIOS_BAD_REGISTER_NUMBER Invalid register number
1355 + * \return PCIBIOS_DEVICE_NOT_FOUND PCI device not found
1356 + * \return PCIBIOS_SUCCESSFUL OK
1357 + * \ingroup IFX_PCIE_OS
1360 +ifx_pcie_write_config(struct pci_bus *bus, u32 devfn,
1361 + int where, int size, u32 value)
1363 + int bus_number = bus->number;
1364 + int ret = PCIBIOS_SUCCESSFUL;
1365 + struct ifx_pci_controller *ctrl = bus->sysdata;
1366 + int pcie_port = ctrl->port;
1367 + u32 tvalue = value;
1370 + /* Make sure the address is aligned to natural boundary */
1371 + if (unlikely(((size - 1) & where))) {
1372 + ret = PCIBIOS_BAD_REGISTER_NUMBER;
1376 + * If we are second controller, we have to cheat OS so that it assume
1377 + * its bus number starts from 0 in host controller
1379 + bus_number = ifx_pcie_bus_nr_deduct(bus_number, pcie_port);
1382 + * We need to force the bus number to be zero on the root
1383 + * bus. Linux numbers the 2nd root bus to start after all
1384 + * busses on root 0.
1386 + if (bus->parent == NULL) {
1390 + if (pcie_valid_config(pcie_port, bus_number, PCI_SLOT(devfn)) == 0) {
1391 + ret = PCIBIOS_DEVICE_NOT_FOUND;
1395 + IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG, "%s: %02x:%02x.%01x/%02x:%01d value=%08x\n", __func__,
1396 + bus_number, PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, value);
1398 + /* XXX, some PCIe device may need some delay */
1399 + PCIE_IRQ_LOCK(ifx_pcie_lock);
1402 + * To configure the correct bus topology using native way, we have to cheat Os so that
1403 + * it can configure the PCIe hardware correctly.
1405 + tvalue = ifx_pcie_bus_enum_hack(bus, devfn, where, value, pcie_port, 0);
1407 + if (bus_number == 0) { /* RC itself */
1411 + IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG,"%s: wr local cfg, offset:%08x, fill:%08x\n", __func__, t, value);
1412 + data = ifx_pcie_rc_cfg_rd(pcie_port, t);
1413 + IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG,"%s: rd local cfg, offset:%08x, data:%08x\n", __func__, t, data);
1415 + data = ifx_pcie_size_to_value(where, size, data, tvalue);
1417 + IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG,"%s: wr local cfg, offset:%08x, value:%08x\n", __func__, t, data);
1418 + ifx_pcie_rc_cfg_wr(pcie_port, t, data);
1419 + IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG,"%s: rd local cfg, offset:%08x, value:%08x\n",
1420 + __func__, t, ifx_pcie_rc_cfg_rd(pcie_port, t));
1423 + u32 addr = pcie_bus_addr(bus_number, devfn, where);
1425 + IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG,"%s: wr cfg, offset:%08x, fill:%08x\n", __func__, addr, value);
1426 + data = ifx_pcie_cfg_rd(pcie_port, addr);
1427 + if (pcie_port == IFX_PCIE_PORT0) {
1428 + #ifdef CONFIG_IFX_PCIE_HW_SWAP
1429 + data = le32_to_cpu(data);
1430 + #endif /* CONFIG_IFX_PCIE_HW_SWAP */
1433 + #ifdef CONFIG_IFX_PCIE1_HW_SWAP
1434 + data = le32_to_cpu(data);
1435 + #endif /* CONFIG_IFX_PCIE_HW_SWAP */
1437 + IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG,"%s: rd cfg, offset:%08x, data:%08x\n", __func__, addr, data);
1439 + data = ifx_pcie_size_to_value(where, size, data, tvalue);
1440 + if (pcie_port == IFX_PCIE_PORT0) {
1441 + #ifdef CONFIG_IFX_PCIE_HW_SWAP
1442 + data = cpu_to_le32(data);
1443 + #endif /* CONFIG_IFX_PCIE_HW_SWAP */
1446 + #ifdef CONFIG_IFX_PCIE1_HW_SWAP
1447 + data = cpu_to_le32(data);
1448 + #endif /* CONFIG_IFX_PCIE_HW_SWAP */
1450 + IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG, "%s: wr cfg, offset:%08x, value:%08x\n", __func__, addr, data);
1451 + ifx_pcie_cfg_wr(pcie_port, addr, data);
1452 + IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG, "%s: rd cfg, offset:%08x, value:%08x\n",
1453 + __func__, addr, ifx_pcie_cfg_rd(pcie_port, addr));
1455 + PCIE_IRQ_UNLOCK(ifx_pcie_lock);
1460 +static struct resource ifx_pcie_io_resource = {
1461 + .name = "PCIe0 I/O space",
1462 + .start = PCIE_IO_PHY_BASE,
1463 + .end = PCIE_IO_PHY_END,
1464 + .flags = IORESOURCE_IO,
1467 +static struct resource ifx_pcie_mem_resource = {
1468 + .name = "PCIe0 Memory space",
1469 + .start = PCIE_MEM_PHY_BASE,
1470 + .end = PCIE_MEM_PHY_END,
1471 + .flags = IORESOURCE_MEM,
1474 +static struct pci_ops ifx_pcie_ops = {
1475 + .read = ifx_pcie_read_config,
1476 + .write = ifx_pcie_write_config,
1479 +#ifdef CONFIG_IFX_PCIE_2ND_CORE
1480 +static struct resource ifx_pcie1_io_resource = {
1481 + .name = "PCIe1 I/O space",
1482 + .start = PCIE1_IO_PHY_BASE,
1483 + .end = PCIE1_IO_PHY_END,
1484 + .flags = IORESOURCE_IO,
1487 +static struct resource ifx_pcie1_mem_resource = {
1488 + .name = "PCIe1 Memory space",
1489 + .start = PCIE1_MEM_PHY_BASE,
1490 + .end = PCIE1_MEM_PHY_END,
1491 + .flags = IORESOURCE_MEM,
1493 +#endif /* CONFIG_IFX_PCIE_2ND_CORE */
1495 +static struct ifx_pci_controller ifx_pcie_controller[IFX_PCIE_CORE_NR] = {
1498 + .pci_ops = &ifx_pcie_ops,
1499 + .mem_resource = &ifx_pcie_mem_resource,
1500 + .io_resource = &ifx_pcie_io_resource,
1502 + .port = IFX_PCIE_PORT0,
1504 +#ifdef CONFIG_IFX_PCIE_2ND_CORE
1507 + .pci_ops = &ifx_pcie_ops,
1508 + .mem_resource = &ifx_pcie1_mem_resource,
1509 + .io_resource = &ifx_pcie1_io_resource,
1511 + .port = IFX_PCIE_PORT1,
1513 +#endif /* CONFIG_IFX_PCIE_2ND_CORE */
1516 +#ifdef IFX_PCIE_ERROR_INT
1518 +pcie_core_int_clear_all(int pcie_port)
1522 + reg = IFX_REG_R32(PCIE_IRNCR(pcie_port));
1523 + IFX_PCIE_PRINT(PCIE_MSG_ISR, "%s PCIE_IRNCR: 0x%08x\n",
1524 + __func__, IFX_REG_R32(PCIE_IRNCR(pcie_port)));
1525 + reg &= PCIE_RC_CORE_COMBINED_INT;
1526 + IFX_REG_W32(reg, PCIE_IRNCR(pcie_port));
1530 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
1531 +pcie_rc_core_isr(int irq, void *dev_id)
1533 +pcie_rc_core_isr(int irq, void *dev_id, struct pt_regs *regs)
1536 + struct ifx_pci_controller *ctrl = (struct ifx_pci_controller *)dev_id;
1537 + int pcie_port = ctrl->port;
1539 + IFX_PCIE_PRINT(PCIE_MSG_ISR, "PCIe RC error intr %d\n", irq);
1540 + pcie_core_int_clear_all(pcie_port);
1541 + return IRQ_HANDLED;
1545 +pcie_rc_core_int_init(int pcie_port)
1549 + IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s enter \n", __func__);
1551 + /* Enable core interrupt */
1552 + IFX_REG_SET_BIT(PCIE_RC_CORE_COMBINED_INT, PCIE_IRNEN(pcie_port));
1553 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_IRNEN: 0x%08x\n",
1554 + __func__, IFX_REG_R32(PCIE_IRNEN(pcie_port)));
1556 + /* Clear it first */
1557 + IFX_REG_SET_BIT(PCIE_RC_CORE_COMBINED_INT, PCIE_IRNCR(pcie_port));
1558 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_IRNCR: 0x%08x\n",
1559 + __func__, IFX_REG_R32(PCIE_IRNCR(pcie_port)));
1560 + ret = request_irq(pcie_irqs[pcie_port].ir_irq.irq, pcie_rc_core_isr, IRQF_DISABLED,
1561 + pcie_irqs[pcie_port].ir_irq.name, &ifx_pcie_controller[pcie_port]);
1563 + printk(KERN_ERR "%s request irq %d failed\n", __func__, IFX_PCIE_IR);
1565 + IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s exit \n", __func__);
1569 +#endif /* IFX_PCIE_ERROR_INT */
1572 + * \fn int ifx_pcie_bios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
1573 + * \brief Map a PCI device to the appropriate interrupt line
1575 + * \param[in] dev The Linux PCI device structure for the device to map
1576 + * \param[in] slot The slot number for this device on __BUS 0__. Linux
1577 + * enumerates through all the bridges and figures out the
1578 + * slot on Bus 0 where this device eventually hooks to.
1579 + * \param[in] pin The PCI interrupt pin read from the device, then swizzled
1580 + * as it goes through each bridge.
1581 + * \return Interrupt number for the device
1582 + * \ingroup IFX_PCIE_OS
1585 +ifx_pcie_bios_map_irq(IFX_PCI_CONST struct pci_dev *dev, u8 slot, u8 pin)
1589 + struct ifx_pci_controller *ctrl = dev->bus->sysdata;
1590 + int pcie_port = ctrl->port;
1592 + printk("%s port %d dev %s slot %d pin %d \n", __func__, pcie_port, pci_name(dev), slot, pin);
1594 + if ((pin == PCIE_LEGACY_DISABLE) || (pin > PCIE_LEGACY_INT_MAX)) {
1595 + printk(KERN_WARNING "WARNING: dev %s: invalid interrupt pin %d\n", pci_name(dev), pin);
1598 + /* Pin index so minus one */
1599 + irq_bit = pcie_irqs[pcie_port].legacy_irq[pin - 1].irq_bit;
1600 + irq = pcie_irqs[pcie_port].legacy_irq[pin - 1].irq;
1601 + IFX_REG_SET_BIT(irq_bit, PCIE_IRNEN(pcie_port));
1602 +// printk("%s PCIE_IRNEN: 0x%08x\n", __func__, IFX_REG_R32(PCIE_IRNEN(pcie_port)));
1603 + IFX_REG_SET_BIT(irq_bit, PCIE_IRNCR(pcie_port));
1604 + // printk("%s PCIE_IRNCR: 0x%08x\n", __func__, IFX_REG_R32(PCIE_IRNCR(pcie_port)));
1605 + printk("%s dev %s irq %d assigned\n", __func__, pci_name(dev), irq);
1606 +// printk("%s dev %s: exit\n", __func__, pci_name(dev));
1611 + * \fn int ifx_pcie_bios_plat_dev_init(struct pci_dev *dev)
1612 + * \brief Called to perform platform specific PCI setup
1614 + * \param[in] dev The Linux PCI device structure for the device to map
1616 + * \ingroup IFX_PCIE_OS
1619 +ifx_pcie_bios_plat_dev_init(struct pci_dev *dev)
1622 +#ifdef IFX_PCIE_ERROR_INT
1625 +#endif /* IFX_PCIE_ERROR_INT */
1627 + IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s enter \n", __func__);
1628 + /* Enable reporting System errors and parity errors on all devices */
1629 + /* Enable parity checking and error reporting */
1630 + pci_read_config_word(dev, PCI_COMMAND, &config);
1631 + config |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR /*| PCI_COMMAND_INVALIDATE |
1632 + PCI_COMMAND_FAST_BACK*/;
1633 + pci_write_config_word(dev, PCI_COMMAND, config);
1635 + if (dev->subordinate) {
1636 + /* Set latency timers on sub bridges */
1637 + pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER, 0x40); /* XXX, */
1638 + /* More bridge error detection */
1639 + pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &config);
1640 + config |= PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR;
1641 + pci_write_config_word(dev, PCI_BRIDGE_CONTROL, config);
1643 +#ifdef IFX_PCIE_ERROR_INT
1644 + /* Enable the PCIe normal error reporting */
1645 + pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
1648 + /* Disable system error generation in response to error messages */
1649 + pci_read_config_word(dev, pos + PCI_EXP_RTCTL, &config);
1650 + config &= ~(PCI_EXP_RTCTL_SECEE | PCI_EXP_RTCTL_SENFEE | PCI_EXP_RTCTL_SEFEE);
1651 + pci_write_config_word(dev, pos + PCI_EXP_RTCTL, config);
1653 + /* Clear PCIE Capability's Device Status */
1654 + pci_read_config_word(dev, pos + PCI_EXP_DEVSTA, &config);
1655 + pci_write_config_word(dev, pos + PCI_EXP_DEVSTA, config);
1657 + /* Update Device Control */
1658 + pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &config);
1659 + /* Correctable Error Reporting */
1660 + config |= PCI_EXP_DEVCTL_CERE;
1661 + /* Non-Fatal Error Reporting */
1662 + config |= PCI_EXP_DEVCTL_NFERE;
1663 + /* Fatal Error Reporting */
1664 + config |= PCI_EXP_DEVCTL_FERE;
1665 + /* Unsupported Request */
1666 + config |= PCI_EXP_DEVCTL_URRE;
1667 + pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, config);
1670 + /* Find the Advanced Error Reporting capability */
1671 + pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
1673 + /* Clear Uncorrectable Error Status */
1674 + pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, &dconfig);
1675 + pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, dconfig);
1676 + /* Enable reporting of all uncorrectable errors */
1677 + /* Uncorrectable Error Mask - turned on bits disable errors */
1678 + pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_MASK, 0);
1680 + * Leave severity at HW default. This only controls if
1681 + * errors are reported as uncorrectable or
1682 + * correctable, not if the error is reported.
1684 + /* PCI_ERR_UNCOR_SEVER - Uncorrectable Error Severity */
1685 + /* Clear Correctable Error Status */
1686 + pci_read_config_dword(dev, pos + PCI_ERR_COR_STATUS, &dconfig);
1687 + pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS, dconfig);
1688 + /* Enable reporting of all correctable errors */
1689 + /* Correctable Error Mask - turned on bits disable errors */
1690 + pci_write_config_dword(dev, pos + PCI_ERR_COR_MASK, 0);
1691 + /* Advanced Error Capabilities */
1692 + pci_read_config_dword(dev, pos + PCI_ERR_CAP, &dconfig);
1693 + /* ECRC Generation Enable */
1694 + if (dconfig & PCI_ERR_CAP_ECRC_GENC) {
1695 + dconfig |= PCI_ERR_CAP_ECRC_GENE;
1697 + /* ECRC Check Enable */
1698 + if (dconfig & PCI_ERR_CAP_ECRC_CHKC) {
1699 + dconfig |= PCI_ERR_CAP_ECRC_CHKE;
1701 + pci_write_config_dword(dev, pos + PCI_ERR_CAP, dconfig);
1703 + /* PCI_ERR_HEADER_LOG - Header Log Register (16 bytes) */
1704 + /* Enable Root Port's interrupt in response to error messages */
1705 + pci_write_config_dword(dev, pos + PCI_ERR_ROOT_COMMAND,
1706 + PCI_ERR_ROOT_CMD_COR_EN |
1707 + PCI_ERR_ROOT_CMD_NONFATAL_EN |
1708 + PCI_ERR_ROOT_CMD_FATAL_EN);
1709 + /* Clear the Root status register */
1710 + pci_read_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, &dconfig);
1711 + pci_write_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, dconfig);
1713 +#endif /* IFX_PCIE_ERROR_INT */
1714 + /* WAR, only 128 MRRS is supported, force all EPs to support this value */
1715 + pcie_set_readrq(dev, 128);
1716 + IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s exit \n", __func__);
1721 +pcie_phy_rst(int pcie_port)
1723 + pcie_phy_rst_assert(pcie_port);
1724 + pcie_phy_rst_deassert(pcie_port);
1726 + /* Make sure PHY PLL is stable */
1731 +pcie_rc_initialize(int pcie_port)
1734 +#define IFX_PCIE_PHY_LOOP_CNT 5
1736 + pcie_rcu_endian_setup(pcie_port);
1738 + pcie_ep_gpio_rst_init(pcie_port);
1741 + * XXX, PCIe elastic buffer bug will cause not to be detected. One more
1742 + * reset PCIe PHY will solve this issue
1744 + for (i = 0; i < IFX_PCIE_PHY_LOOP_CNT; i++) {
1745 + /* Disable PCIe PHY Analog part for sanity check */
1746 + pcie_phy_pmu_disable(pcie_port);
1748 + pcie_phy_rst(pcie_port);
1750 + /* PCIe Core reset enabled, low active, sw programmed */
1751 + pcie_core_rst_assert(pcie_port);
1753 + /* Put PCIe EP in reset status */
1754 + pcie_device_rst_assert(pcie_port);
1756 + /* PCI PHY & Core reset disabled, high active, sw programmed */
1757 + pcie_core_rst_deassert(pcie_port);
1759 + /* Already in a quiet state, program PLL, enable PHY, check ready bit */
1760 + pcie_phy_clock_mode_setup(pcie_port);
1762 + /* Enable PCIe PHY and Clock */
1763 + pcie_core_pmu_setup(pcie_port);
1765 + /* Clear status registers */
1766 + pcie_status_register_clear(pcie_port);
1768 + #ifdef CONFIG_PCI_MSI
1769 + pcie_msi_init(pcie_port);
1770 + #endif /* CONFIG_PCI_MSI */
1771 + pcie_rc_cfg_reg_setup(pcie_port);
1773 + /* Once link is up, break out */
1774 + if (pcie_app_loigc_setup(pcie_port) == 0) {
1778 + if (i >= IFX_PCIE_PHY_LOOP_CNT) {
1779 + printk(KERN_ERR "%s link up failed!!!!!\n", __func__);
1782 + /* NB, don't increase ACK/NACK timer timeout value, which will cause a lot of COR errors */
1783 + pcie_replay_time_update(pcie_port);
1784 +#ifdef IFX_PCIE_DBG
1785 + pcie_post_dump(pcie_port);
1786 + pcie_status_registers_dump(pcie_port);
1787 +#endif /* IFX_PCIE_DBG */
1792 +ifx_pcie_startup_port_nr(void)
1794 + int pcie_port = IFX_PCIE_PORT0;
1796 +#if defined (CONFIG_IFX_PCIE_1ST_CORE) && defined (CONFIG_IFX_PCIE_2ND_CORE)
1797 + pcie_port = IFX_PCIE_PORT0;
1798 +#elif defined (CONFIG_IFX_PCIE_1ST_CORE)
1799 + pcie_port = IFX_PCIE_PORT0;
1800 +#elif defined (CONFIG_IFX_PCIE_2ND_CORE)
1801 + pcie_port = IFX_PCIE_PORT1;
1803 + #error "Please choose valid PCIe Core"
1809 + * \fn static int __init ifx_pcie_bios_init(void)
1810 + * \brief Initialize the IFX PCIe controllers
1812 + * \return -EIO PCIe PHY link is not up
1813 + * \return -ENOMEM Configuration/IO space failed to map
1815 + * \ingroup IFX_PCIE_OS
1817 +extern int (*ltq_pci_plat_arch_init)(struct pci_dev *dev);
1818 +extern int (*ltq_pci_map_irq)(const struct pci_dev *dev, u8 slot, u8 pin);
1821 +ifx_pcie_bios_init(void)
1823 + char ver_str[128] = {0};
1824 + void __iomem *io_map_base;
1828 + IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s enter \n", __func__);
1830 + ltq_pci_map_irq = ifx_pcie_bios_map_irq;
1831 + ltq_pci_plat_arch_init = ifx_pcie_bios_plat_dev_init;
1833 + /* Enable AHB Master/ Slave */
1834 + pcie_ahb_pmu_setup();
1836 + startup_port = ifx_pcie_startup_port_nr();
1838 + for (pcie_port = startup_port; pcie_port < IFX_PCIE_CORE_NR; pcie_port++){
1839 + if (pcie_rc_initialize(pcie_port) == 0) {
1840 + IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s: ifx_pcie_cfg_base 0x%p\n",
1841 + __func__, PCIE_CFG_PORT_TO_BASE(pcie_port));
1842 + /* Otherwise, warning will pop up */
1843 + io_map_base = ioremap(PCIE_IO_PHY_PORT_TO_BASE(pcie_port), PCIE_IO_SIZE);
1844 + if (io_map_base == NULL) {
1845 + IFX_PCIE_PRINT(PCIE_MSG_ERR, "%s io space ioremap failed\n", __func__);
1848 + ifx_pcie_controller[pcie_port].pcic.io_map_base = (unsigned long)io_map_base;
1850 + register_pci_controller(&ifx_pcie_controller[pcie_port].pcic);
1851 + /* XXX, clear error status */
1853 + IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s: mem_resource 0x%p, io_resource 0x%p\n",
1854 + __func__, &ifx_pcie_controller[pcie_port].pcic.mem_resource,
1855 + &ifx_pcie_controller[pcie_port].pcic.io_resource);
1857 + #ifdef IFX_PCIE_ERROR_INT
1858 + pcie_rc_core_int_init(pcie_port);
1859 + #endif /* IFX_PCIE_ERROR_INT */
1862 +#ifdef CONFIG_IFX_PMCU
1863 + ifx_pcie_pmcu_init();
1864 +#endif /* CONFIG_IFX_PMCU */
1866 + sprintf(ver_str, "PCIe Root Complex %d.%d.%d", IFX_PCIE_VER_MAJOR, IFX_PCIE_VER_MID, IFX_PCIE_VER_MINOR);
1867 + printk(KERN_INFO "%s", ver_str);
1869 +#undef IFX_PCIE_PHY_LOOP_CNT
1871 +arch_initcall(ifx_pcie_bios_init);
1873 +MODULE_LICENSE("GPL");
1874 +MODULE_AUTHOR("Chuanhua.Lei@infineon.com");
1875 +MODULE_SUPPORTED_DEVICE("Infineon builtin PCIe RC module");
1876 +MODULE_DESCRIPTION("Infineon builtin PCIe RC driver");
1878 diff --git a/arch/mips/pci/ifxmips_pcie.h b/arch/mips/pci/ifxmips_pcie.h
1879 new file mode 100644
1880 index 0000000..c6f92f5
1882 +++ b/arch/mips/pci/ifxmips_pcie.h
1884 +/******************************************************************************
1886 +** FILE NAME : ifxmips_pcie.h
1887 +** PROJECT : IFX UEIP for VRX200
1888 +** MODULES : PCIe module
1890 +** DATE : 02 Mar 2009
1891 +** AUTHOR : Lei Chuanhua
1892 +** DESCRIPTION : PCIe Root Complex Driver
1893 +** COPYRIGHT : Copyright (c) 2009
1894 +** Infineon Technologies AG
1895 +** Am Campeon 1-12, 85579 Neubiberg, Germany
1897 +** This program is free software; you can redistribute it and/or modify
1898 +** it under the terms of the GNU General Public License as published by
1899 +** the Free Software Foundation; either version 2 of the License, or
1900 +** (at your option) any later version.
1902 +** $Version $Date $Author $Comment
1903 +** 0.0.1 17 Mar,2009 Lei Chuanhua Initial version
1904 +*******************************************************************************/
1905 +#ifndef IFXMIPS_PCIE_H
1906 +#define IFXMIPS_PCIE_H
1907 +#include <linux/version.h>
1908 +#include <linux/types.h>
1909 +#include <linux/pci.h>
1910 +#include <linux/interrupt.h>
1911 +#include "ifxmips_pci_common.h"
1912 +#include "ifxmips_pcie_reg.h"
1915 + \defgroup IFX_PCIE PCI Express bus driver module
1916 + \brief PCI Express IP module support VRX200
1920 + \defgroup IFX_PCIE_OS OS APIs
1922 + \brief PCIe bus driver OS interface functions
1926 + \file ifxmips_pcie.h
1928 + \brief header file for PCIe module common header file
1930 +#define PCIE_IRQ_LOCK(lock) do { \
1931 + unsigned long flags; \
1932 + spin_lock_irqsave(&(lock), flags);
1933 +#define PCIE_IRQ_UNLOCK(lock) \
1934 + spin_unlock_irqrestore(&(lock), flags); \
1937 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
1938 +#define IRQF_SHARED SA_SHIRQ
1941 +#define PCIE_MSG_MSI 0x00000001
1942 +#define PCIE_MSG_ISR 0x00000002
1943 +#define PCIE_MSG_FIXUP 0x00000004
1944 +#define PCIE_MSG_READ_CFG 0x00000008
1945 +#define PCIE_MSG_WRITE_CFG 0x00000010
1946 +#define PCIE_MSG_CFG (PCIE_MSG_READ_CFG | PCIE_MSG_WRITE_CFG)
1947 +#define PCIE_MSG_REG 0x00000020
1948 +#define PCIE_MSG_INIT 0x00000040
1949 +#define PCIE_MSG_ERR 0x00000080
1950 +#define PCIE_MSG_PHY 0x00000100
1951 +#define PCIE_MSG_ANY 0x000001ff
1953 +#define IFX_PCIE_PORT0 0
1954 +#define IFX_PCIE_PORT1 1
1956 +#ifdef CONFIG_IFX_PCIE_2ND_CORE
1957 +#define IFX_PCIE_CORE_NR 2
1959 +#define IFX_PCIE_CORE_NR 1
1962 +#define IFX_PCIE_ERROR_INT
1964 +//#define IFX_PCIE_DBG
1966 +#if defined(IFX_PCIE_DBG)
1967 +#define IFX_PCIE_PRINT(_m, _fmt, args...) do { \
1968 + ifx_pcie_debug((_fmt), ##args); \
1973 +#define IFX_PCIE_PRINT(_m, _fmt, args...) \
1975 +#define INLINE inline
1978 +struct ifx_pci_controller {
1979 + struct pci_controller pcic;
1981 + /* RC specific, per host bus information */
1982 + u32 port; /* Port index, 0 -- 1st core, 1 -- 2nd core */
1985 +typedef struct ifx_pcie_ir_irq {
1986 + const unsigned int irq;
1987 + const char name[16];
1988 +}ifx_pcie_ir_irq_t;
1990 +typedef struct ifx_pcie_legacy_irq{
1991 + const u32 irq_bit;
1993 +}ifx_pcie_legacy_irq_t;
1995 +typedef struct ifx_pcie_irq {
1996 + ifx_pcie_ir_irq_t ir_irq;
1997 + ifx_pcie_legacy_irq_t legacy_irq[PCIE_LEGACY_INT_MAX];
2000 +extern u32 g_pcie_debug_flag;
2001 +extern void ifx_pcie_debug(const char *fmt, ...);
2002 +extern void pcie_phy_clock_mode_setup(int pcie_port);
2003 +extern void pcie_msi_pic_init(int pcie_port);
2004 +extern u32 ifx_pcie_bus_enum_read_hack(int where, u32 value);
2005 +extern u32 ifx_pcie_bus_enum_write_hack(int where, u32 value);
2010 +#include "ifxmips_pcie_vr9.h"
2011 +#elif defined (CONFIG_AR10)
2012 +#include "ifxmips_pcie_ar10.h"
2014 +#error "PCIE: platform not defined"
2015 +#endif /* CONFIG_VR9 */
2017 +#endif /* IFXMIPS_PCIE_H */
2019 diff --git a/arch/mips/pci/ifxmips_pcie_ar10.h b/arch/mips/pci/ifxmips_pcie_ar10.h
2020 new file mode 100644
2021 index 0000000..99ff463
2023 +++ b/arch/mips/pci/ifxmips_pcie_ar10.h
2025 +/****************************************************************************
2026 + Copyright (c) 2010
2027 + Lantiq Deutschland GmbH
2028 + Am Campeon 3; 85579 Neubiberg, Germany
2030 + For licensing information, see the file 'LICENSE' in the root folder of
2031 + this software module.
2033 + *****************************************************************************/
2035 + \file ifxmips_pcie_ar10.h
2037 + \brief PCIe RC driver ar10 specific file
2040 +#ifndef IFXMIPS_PCIE_AR10_H
2041 +#define IFXMIPS_PCIE_AR10_H
2042 +#ifndef AUTOCONF_INCLUDED
2043 +#include <linux/config.h>
2044 +#endif /* AUTOCONF_INCLUDED */
2045 +#include <linux/types.h>
2046 +#include <linux/delay.h>
2048 +/* Project header file */
2049 +#include <asm/ifx/ifx_types.h>
2050 +#include <asm/ifx/ifx_pmu.h>
2051 +#include <asm/ifx/ifx_gpio.h>
2052 +#include <asm/ifx/ifx_ebu_led.h>
2054 +static inline void pcie_ep_gpio_rst_init(int pcie_port)
2056 + ifx_ebu_led_enable();
2057 + if (pcie_port == 0) {
2058 + ifx_ebu_led_set_data(11, 1);
2061 + ifx_ebu_led_set_data(12, 1);
2065 +static inline void pcie_ahb_pmu_setup(void)
2067 + /* XXX, moved to CGU to control AHBM */
2070 +static inline void pcie_rcu_endian_setup(int pcie_port)
2074 + reg = IFX_REG_R32(IFX_RCU_AHB_ENDIAN);
2075 + /* Inbound, big endian */
2076 + reg |= IFX_RCU_BE_AHB4S;
2077 + if (pcie_port == 0) {
2078 + reg |= IFX_RCU_BE_PCIE0M;
2080 + #ifdef CONFIG_IFX_PCIE_HW_SWAP
2081 + /* Outbound, software swap needed */
2082 + reg |= IFX_RCU_BE_AHB3M;
2083 + reg &= ~IFX_RCU_BE_PCIE0S;
2085 + /* Outbound little endian */
2086 + reg &= ~IFX_RCU_BE_AHB3M;
2087 + reg &= ~IFX_RCU_BE_PCIE0S;
2091 + reg |= IFX_RCU_BE_PCIE1M;
2092 + #ifdef CONFIG_IFX_PCIE1_HW_SWAP
2093 + /* Outbound, software swap needed */
2094 + reg |= IFX_RCU_BE_AHB3M;
2095 + reg &= ~IFX_RCU_BE_PCIE1S;
2097 + /* Outbound little endian */
2098 + reg &= ~IFX_RCU_BE_AHB3M;
2099 + reg &= ~IFX_RCU_BE_PCIE1S;
2103 + IFX_REG_W32(reg, IFX_RCU_AHB_ENDIAN);
2104 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s IFX_RCU_AHB_ENDIAN: 0x%08x\n", __func__, IFX_REG_R32(IFX_RCU_AHB_ENDIAN));
2107 +static inline void pcie_phy_pmu_enable(int pcie_port)
2109 + if (pcie_port == 0) { /* XXX, should use macro*/
2110 + PCIE0_PHY_PMU_SETUP(IFX_PMU_ENABLE);
2113 + PCIE1_PHY_PMU_SETUP(IFX_PMU_ENABLE);
2117 +static inline void pcie_phy_pmu_disable(int pcie_port)
2119 + if (pcie_port == 0) { /* XXX, should use macro*/
2120 + PCIE0_PHY_PMU_SETUP(IFX_PMU_DISABLE);
2123 + PCIE1_PHY_PMU_SETUP(IFX_PMU_DISABLE);
2127 +static inline void pcie_pdi_big_endian(int pcie_port)
2131 + reg = IFX_REG_R32(IFX_RCU_AHB_ENDIAN);
2132 + if (pcie_port == 0) {
2133 + /* Config AHB->PCIe and PDI endianness */
2134 + reg |= IFX_RCU_BE_PCIE0_PDI;
2137 + /* Config AHB->PCIe and PDI endianness */
2138 + reg |= IFX_RCU_BE_PCIE1_PDI;
2140 + IFX_REG_W32(reg, IFX_RCU_AHB_ENDIAN);
2143 +static inline void pcie_pdi_pmu_enable(int pcie_port)
2145 + if (pcie_port == 0) {
2146 + /* Enable PDI to access PCIe PHY register */
2147 + PDI0_PMU_SETUP(IFX_PMU_ENABLE);
2150 + PDI1_PMU_SETUP(IFX_PMU_ENABLE);
2154 +static inline void pcie_core_rst_assert(int pcie_port)
2158 + reg = IFX_REG_R32(IFX_RCU_RST_REQ);
2160 + /* Reset Core, bit 22 */
2161 + if (pcie_port == 0) {
2162 + reg |= 0x00400000;
2165 + reg |= 0x08000000; /* Bit 27 */
2167 + IFX_REG_W32(reg, IFX_RCU_RST_REQ);
2170 +static inline void pcie_core_rst_deassert(int pcie_port)
2174 + /* Make sure one micro-second delay */
2177 + reg = IFX_REG_R32(IFX_RCU_RST_REQ);
2178 + if (pcie_port == 0) {
2179 + reg &= ~0x00400000; /* bit 22 */
2182 + reg &= ~0x08000000; /* Bit 27 */
2184 + IFX_REG_W32(reg, IFX_RCU_RST_REQ);
2187 +static inline void pcie_phy_rst_assert(int pcie_port)
2191 + reg = IFX_REG_R32(IFX_RCU_RST_REQ);
2192 + if (pcie_port == 0) {
2193 + reg |= 0x00001000; /* Bit 12 */
2196 + reg |= 0x00002000; /* Bit 13 */
2198 + IFX_REG_W32(reg, IFX_RCU_RST_REQ);
2201 +static inline void pcie_phy_rst_deassert(int pcie_port)
2205 + /* Make sure one micro-second delay */
2208 + reg = IFX_REG_R32(IFX_RCU_RST_REQ);
2209 + if (pcie_port == 0) {
2210 + reg &= ~0x00001000; /* Bit 12 */
2213 + reg &= ~0x00002000; /* Bit 13 */
2215 + IFX_REG_W32(reg, IFX_RCU_RST_REQ);
2218 +static inline void pcie_device_rst_assert(int pcie_port)
2220 + if (pcie_port == 0) {
2221 + ifx_ebu_led_set_data(11, 0);
2224 + ifx_ebu_led_set_data(12, 0);
2228 +static inline void pcie_device_rst_deassert(int pcie_port)
2231 + if (pcie_port == 0) {
2232 + ifx_ebu_led_set_data(11, 1);
2235 + ifx_ebu_led_set_data(12, 1);
2237 + ifx_ebu_led_disable();
2240 +static inline void pcie_core_pmu_setup(int pcie_port)
2242 + if (pcie_port == 0) {
2243 + PCIE0_CTRL_PMU_SETUP(IFX_PMU_ENABLE);
2246 + PCIE1_CTRL_PMU_SETUP(IFX_PMU_ENABLE);
2250 +static inline void pcie_msi_init(int pcie_port)
2252 + pcie_msi_pic_init(pcie_port);
2253 + if (pcie_port == 0) {
2254 + MSI0_PMU_SETUP(IFX_PMU_ENABLE);
2257 + MSI1_PMU_SETUP(IFX_PMU_ENABLE);
2262 +ifx_pcie_bus_nr_deduct(u32 bus_number, int pcie_port)
2264 + u32 tbus_number = bus_number;
2266 +#ifdef CONFIG_IFX_PCIE_2ND_CORE
2267 + if (pcie_port == IFX_PCIE_PORT1) { /* Port 1 must check if there are two cores enabled */
2268 + if (pcibios_host_nr() > 1) {
2269 + tbus_number -= pcibios_1st_host_bus_nr();
2272 +#endif /* CONFIG_IFX_PCI */
2273 + return tbus_number;
2277 +ifx_pcie_bus_enum_hack(struct pci_bus *bus, u32 devfn, int where, u32 value, int pcie_port, int read)
2279 + struct pci_dev *pdev;
2280 + u32 tvalue = value;
2282 + /* Sanity check */
2283 + pdev = pci_get_slot(bus, devfn);
2284 + if (pdev == NULL) {
2288 + /* Only care about PCI bridge */
2289 + if (pdev->hdr_type != PCI_HEADER_TYPE_BRIDGE) {
2293 + if (read) { /* Read hack */
2294 + #ifdef CONFIG_IFX_PCIE_2ND_CORE
2295 + if (pcie_port == IFX_PCIE_PORT1) { /* Port 1 must check if there are two cores enabled */
2296 + if (pcibios_host_nr() > 1) {
2297 + tvalue = ifx_pcie_bus_enum_read_hack(where, tvalue);
2300 + #endif /* CONFIG_IFX_PCIE_2ND_CORE */
2302 + else { /* Write hack */
2303 + #ifdef CONFIG_IFX_PCIE_2ND_CORE
2304 + if (pcie_port == IFX_PCIE_PORT1) { /* Port 1 must check if there are two cores enabled */
2305 + if (pcibios_host_nr() > 1) {
2306 + tvalue = ifx_pcie_bus_enum_write_hack(where, tvalue);
2314 +#endif /* IFXMIPS_PCIE_AR10_H */
2315 diff --git a/arch/mips/pci/ifxmips_pcie_msi.c b/arch/mips/pci/ifxmips_pcie_msi.c
2316 new file mode 100644
2317 index 0000000..bffd6fa
2319 +++ b/arch/mips/pci/ifxmips_pcie_msi.c
2321 +/******************************************************************************
2323 +** FILE NAME : ifxmips_pcie_msi.c
2324 +** PROJECT : IFX UEIP for VRX200
2325 +** MODULES : PCI MSI sub module
2327 +** DATE : 02 Mar 2009
2328 +** AUTHOR : Lei Chuanhua
2329 +** DESCRIPTION : PCIe MSI Driver
2330 +** COPYRIGHT : Copyright (c) 2009
2331 +** Infineon Technologies AG
2332 +** Am Campeon 1-12, 85579 Neubiberg, Germany
2334 +** This program is free software; you can redistribute it and/or modify
2335 +** it under the terms of the GNU General Public License as published by
2336 +** the Free Software Foundation; either version 2 of the License, or
2337 +** (at your option) any later version.
2339 +** $Date $Author $Comment
2340 +** 02 Mar,2009 Lei Chuanhua Initial version
2341 +*******************************************************************************/
2343 + \defgroup IFX_PCIE_MSI MSI OS APIs
2345 + \brief PCIe bus driver OS interface functions
2349 + \file ifxmips_pcie_msi.c
2351 + \brief PCIe MSI OS interface file
2354 +#ifndef AUTOCONF_INCLUDED
2355 +#include <linux/config.h>
2356 +#endif /* AUTOCONF_INCLUDED */
2357 +#include <linux/init.h>
2358 +#include <linux/sched.h>
2359 +#include <linux/slab.h>
2360 +#include <linux/interrupt.h>
2361 +#include <linux/kernel_stat.h>
2362 +#include <linux/pci.h>
2363 +#include <linux/msi.h>
2364 +#include <linux/module.h>
2365 +#include <asm/bootinfo.h>
2366 +#include <asm/irq.h>
2367 +#include <asm/traps.h>
2369 +#include <asm/ifx/ifx_types.h>
2370 +#include <asm/ifx/ifx_regs.h>
2371 +#include <asm/ifx/common_routines.h>
2372 +#include <asm/ifx/irq.h>
2374 +#include "ifxmips_pcie_reg.h"
2375 +#include "ifxmips_pcie.h"
2377 +#define IFX_MSI_IRQ_NUM 16
2380 + IFX_PCIE_MSI_IDX0 = 0,
2381 + IFX_PCIE_MSI_IDX1,
2382 + IFX_PCIE_MSI_IDX2,
2383 + IFX_PCIE_MSI_IDX3,
2386 +typedef struct ifx_msi_irq_idx {
2389 +}ifx_msi_irq_idx_t;
2391 +struct ifx_msi_pic {
2392 + volatile u32 pic_table[IFX_MSI_IRQ_NUM];
2393 + volatile u32 pic_endian; /* 0x40 */
2395 +typedef struct ifx_msi_pic *ifx_msi_pic_t;
2397 +typedef struct ifx_msi_irq {
2398 + const volatile ifx_msi_pic_t msi_pic_p;
2399 + const u32 msi_phy_base;
2400 + const ifx_msi_irq_idx_t msi_irq_idx[IFX_MSI_IRQ_NUM];
2402 + * Each bit in msi_free_irq_bitmask represents a MSI interrupt that is
2405 + u16 msi_free_irq_bitmask;
2408 + * Each bit in msi_multiple_irq_bitmask tells that the device using
2409 + * this bit in msi_free_irq_bitmask is also using the next bit. This
2410 + * is used so we can disable all of the MSI interrupts when a device
2413 + u16 msi_multiple_irq_bitmask;
2416 +static ifx_msi_irq_t msi_irqs[IFX_PCIE_CORE_NR] = {
2418 + .msi_pic_p = (const volatile ifx_msi_pic_t)IFX_MSI_PIC_REG_BASE,
2419 + .msi_phy_base = PCIE_MSI_PHY_BASE,
2421 + {IFX_PCIE_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE_MSI_IR1, IFX_PCIE_MSI_IDX1},
2422 + {IFX_PCIE_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE_MSI_IR3, IFX_PCIE_MSI_IDX3},
2423 + {IFX_PCIE_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE_MSI_IR1, IFX_PCIE_MSI_IDX1},
2424 + {IFX_PCIE_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE_MSI_IR3, IFX_PCIE_MSI_IDX3},
2425 + {IFX_PCIE_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE_MSI_IR1, IFX_PCIE_MSI_IDX1},
2426 + {IFX_PCIE_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE_MSI_IR3, IFX_PCIE_MSI_IDX3},
2427 + {IFX_PCIE_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE_MSI_IR1, IFX_PCIE_MSI_IDX1},
2428 + {IFX_PCIE_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE_MSI_IR3, IFX_PCIE_MSI_IDX3},
2430 + .msi_free_irq_bitmask = 0,
2431 + .msi_multiple_irq_bitmask= 0,
2433 +#ifdef CONFIG_IFX_PCIE_2ND_CORE
2435 + .msi_pic_p = (const volatile ifx_msi_pic_t)IFX_MSI1_PIC_REG_BASE,
2436 + .msi_phy_base = PCIE1_MSI_PHY_BASE,
2438 + {IFX_PCIE1_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE1_MSI_IR1, IFX_PCIE_MSI_IDX1},
2439 + {IFX_PCIE1_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE1_MSI_IR3, IFX_PCIE_MSI_IDX3},
2440 + {IFX_PCIE1_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE1_MSI_IR1, IFX_PCIE_MSI_IDX1},
2441 + {IFX_PCIE1_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE1_MSI_IR3, IFX_PCIE_MSI_IDX3},
2442 + {IFX_PCIE1_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE1_MSI_IR1, IFX_PCIE_MSI_IDX1},
2443 + {IFX_PCIE1_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE1_MSI_IR3, IFX_PCIE_MSI_IDX3},
2444 + {IFX_PCIE1_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE1_MSI_IR1, IFX_PCIE_MSI_IDX1},
2445 + {IFX_PCIE1_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE1_MSI_IR3, IFX_PCIE_MSI_IDX3},
2447 + .msi_free_irq_bitmask = 0,
2448 + .msi_multiple_irq_bitmask= 0,
2451 +#endif /* CONFIG_IFX_PCIE_2ND_CORE */
2455 + * This lock controls updates to msi_free_irq_bitmask,
2456 + * msi_multiple_irq_bitmask and pic register settting
2458 +static DEFINE_SPINLOCK(ifx_pcie_msi_lock);
2460 +void pcie_msi_pic_init(int pcie_port)
2462 + spin_lock(&ifx_pcie_msi_lock);
2463 + msi_irqs[pcie_port].msi_pic_p->pic_endian = IFX_MSI_PIC_BIG_ENDIAN;
2464 + spin_unlock(&ifx_pcie_msi_lock);
2468 + * \fn int arch_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
2469 + * \brief Called when a driver request MSI interrupts instead of the
2470 + * legacy INT A-D. This routine will allocate multiple interrupts
2471 + * for MSI devices that support them. A device can override this by
2472 + * programming the MSI control bits [6:4] before calling
2473 + * pci_enable_msi().
2475 + * \param[in] pdev Device requesting MSI interrupts
2476 + * \param[in] desc MSI descriptor
2478 + * \return -EINVAL Invalid pcie root port or invalid msi bit
2480 + * \ingroup IFX_PCIE_MSI
2483 +arch_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
2489 + int configured_private_bits;
2490 + int request_private_bits;
2491 + struct msi_msg msg;
2493 + struct ifx_pci_controller *ctrl = pdev->bus->sysdata;
2494 + int pcie_port = ctrl->port;
2496 + IFX_PCIE_PRINT(PCIE_MSG_MSI, "%s %s enter\n", __func__, pci_name(pdev));
2498 + /* XXX, skip RC MSI itself */
2499 + if (pdev->pcie_type == PCI_EXP_TYPE_ROOT_PORT) {
2500 + IFX_PCIE_PRINT(PCIE_MSG_MSI, "%s RC itself doesn't use MSI interrupt\n", __func__);
2505 + * Read the MSI config to figure out how many IRQs this device
2506 + * wants. Most devices only want 1, which will give
2507 + * configured_private_bits and request_private_bits equal 0.
2509 + pci_read_config_word(pdev, desc->msi_attrib.pos + PCI_MSI_FLAGS, &control);
2512 + * If the number of private bits has been configured then use
2513 + * that value instead of the requested number. This gives the
2514 + * driver the chance to override the number of interrupts
2515 + * before calling pci_enable_msi().
2517 + configured_private_bits = (control & PCI_MSI_FLAGS_QSIZE) >> 4;
2518 + if (configured_private_bits == 0) {
2519 + /* Nothing is configured, so use the hardware requested size */
2520 + request_private_bits = (control & PCI_MSI_FLAGS_QMASK) >> 1;
2524 + * Use the number of configured bits, assuming the
2525 + * driver wanted to override the hardware request
2528 + request_private_bits = configured_private_bits;
2532 + * The PCI 2.3 spec mandates that there are at most 32
2533 + * interrupts. If this device asks for more, only give it one.
2535 + if (request_private_bits > 5) {
2536 + request_private_bits = 0;
2540 + * The IRQs have to be aligned on a power of two based on the
2541 + * number being requested.
2543 + irq_step = (1 << request_private_bits);
2545 + /* Mask with one bit for each IRQ */
2546 + search_mask = (1 << irq_step) - 1;
2549 + * We're going to search msi_free_irq_bitmask_lock for zero
2550 + * bits. This represents an MSI interrupt number that isn't in
2553 + spin_lock(&ifx_pcie_msi_lock);
2554 + for (pos = 0; pos < IFX_MSI_IRQ_NUM; pos += irq_step) {
2555 + if ((msi_irqs[pcie_port].msi_free_irq_bitmask & (search_mask << pos)) == 0) {
2556 + msi_irqs[pcie_port].msi_free_irq_bitmask |= search_mask << pos;
2557 + msi_irqs[pcie_port].msi_multiple_irq_bitmask |= (search_mask >> 1) << pos;
2561 + spin_unlock(&ifx_pcie_msi_lock);
2563 + /* Make sure the search for available interrupts didn't fail */
2564 + if (pos >= IFX_MSI_IRQ_NUM) {
2565 + if (request_private_bits) {
2566 + IFX_PCIE_PRINT(PCIE_MSG_MSI, "%s: Unable to find %d free "
2567 + "interrupts, trying just one", __func__, 1 << request_private_bits);
2568 + request_private_bits = 0;
2572 + printk(KERN_ERR "%s: Unable to find a free MSI interrupt\n", __func__);
2576 + irq = msi_irqs[pcie_port].msi_irq_idx[pos].irq;
2577 + irq_idx = msi_irqs[pcie_port].msi_irq_idx[pos].idx;
2579 + IFX_PCIE_PRINT(PCIE_MSG_MSI, "pos %d, irq %d irq_idx %d\n", pos, irq, irq_idx);
2582 + * Initialize MSI. This has to match the memory-write endianess from the device
2583 + * Address bits [23:12]
2585 + spin_lock(&ifx_pcie_msi_lock);
2586 + msi_irqs[pcie_port].msi_pic_p->pic_table[pos] = SM(irq_idx, IFX_MSI_PIC_INT_LINE) |
2587 + SM((msi_irqs[pcie_port].msi_phy_base >> 12), IFX_MSI_PIC_MSG_ADDR) |
2588 + SM((1 << pos), IFX_MSI_PIC_MSG_DATA);
2590 + /* Enable this entry */
2591 + msi_irqs[pcie_port].msi_pic_p->pic_table[pos] &= ~IFX_MSI_PCI_INT_DISABLE;
2592 + spin_unlock(&ifx_pcie_msi_lock);
2594 + IFX_PCIE_PRINT(PCIE_MSG_MSI, "pic_table[%d]: 0x%08x\n",
2595 + pos, msi_irqs[pcie_port].msi_pic_p->pic_table[pos]);
2597 + /* Update the number of IRQs the device has available to it */
2598 + control &= ~PCI_MSI_FLAGS_QSIZE;
2599 + control |= (request_private_bits << 4);
2600 + pci_write_config_word(pdev, desc->msi_attrib.pos + PCI_MSI_FLAGS, control);
2602 + set_irq_msi(irq, desc);
2603 + msg.address_hi = 0x0;
2604 + msg.address_lo = msi_irqs[pcie_port].msi_phy_base;
2605 + msg.data = SM((1 << pos), IFX_MSI_PIC_MSG_DATA);
2606 + IFX_PCIE_PRINT(PCIE_MSG_MSI, "msi_data: pos %d 0x%08x\n", pos, msg.data);
2608 + write_msi_msg(irq, &msg);
2609 + IFX_PCIE_PRINT(PCIE_MSG_MSI, "%s exit\n", __func__);
2614 +pcie_msi_irq_to_port(unsigned int irq, int *port)
2618 + if (irq == IFX_PCIE_MSI_IR0 || irq == IFX_PCIE_MSI_IR1 ||
2619 + irq == IFX_PCIE_MSI_IR2 || irq == IFX_PCIE_MSI_IR3) {
2620 + *port = IFX_PCIE_PORT0;
2622 +#ifdef CONFIG_IFX_PCIE_2ND_CORE
2623 + else if (irq == IFX_PCIE1_MSI_IR0 || irq == IFX_PCIE1_MSI_IR1 ||
2624 + irq == IFX_PCIE1_MSI_IR2 || irq == IFX_PCIE1_MSI_IR3) {
2625 + *port = IFX_PCIE_PORT1;
2627 +#endif /* CONFIG_IFX_PCIE_2ND_CORE */
2629 + printk(KERN_ERR "%s: Attempted to teardown illegal "
2630 + "MSI interrupt (%d)\n", __func__, irq);
2637 + * \fn void arch_teardown_msi_irq(unsigned int irq)
2638 + * \brief Called when a device no longer needs its MSI interrupts. All
2639 + * MSI interrupts for the device are freed.
2641 + * \param irq The devices first irq number. There may be multple in sequence.
2643 + * \ingroup IFX_PCIE_MSI
2646 +arch_teardown_msi_irq(unsigned int irq)
2653 + IFX_PCIE_PRINT(PCIE_MSG_MSI, "%s enter\n", __func__);
2655 + BUG_ON(irq > INT_NUM_IM4_IRL31);
2657 + if (pcie_msi_irq_to_port(irq, &pcie_port) != 0) {
2661 + /* Shift the mask to the correct bit location, not always correct
2662 + * Probally, the first match will be chosen.
2664 + for (pos = 0; pos < IFX_MSI_IRQ_NUM; pos++) {
2665 + if ((msi_irqs[pcie_port].msi_irq_idx[pos].irq == irq)
2666 + && (msi_irqs[pcie_port].msi_free_irq_bitmask & ( 1 << pos))) {
2670 + if (pos >= IFX_MSI_IRQ_NUM) {
2671 + printk(KERN_ERR "%s: Unable to find a matched MSI interrupt\n", __func__);
2674 + spin_lock(&ifx_pcie_msi_lock);
2675 + /* Disable this entry */
2676 + msi_irqs[pcie_port].msi_pic_p->pic_table[pos] |= IFX_MSI_PCI_INT_DISABLE;
2677 + msi_irqs[pcie_port].msi_pic_p->pic_table[pos] &= ~(IFX_MSI_PIC_INT_LINE | IFX_MSI_PIC_MSG_ADDR | IFX_MSI_PIC_MSG_DATA);
2678 + spin_unlock(&ifx_pcie_msi_lock);
2680 + * Count the number of IRQs we need to free by looking at the
2681 + * msi_multiple_irq_bitmask. Each bit set means that the next
2682 + * IRQ is also owned by this device.
2685 + while (((pos + number_irqs) < IFX_MSI_IRQ_NUM) &&
2686 + (msi_irqs[pcie_port].msi_multiple_irq_bitmask & (1 << (pos + number_irqs)))) {
2691 + /* Mask with one bit for each IRQ */
2692 + bitmask = (1 << number_irqs) - 1;
2695 + if ((msi_irqs[pcie_port].msi_free_irq_bitmask & bitmask) != bitmask) {
2696 + printk(KERN_ERR "%s: Attempted to teardown MSI "
2697 + "interrupt (%d) not in use\n", __func__, irq);
2700 + /* Checks are done, update the in use bitmask */
2701 + spin_lock(&ifx_pcie_msi_lock);
2702 + msi_irqs[pcie_port].msi_free_irq_bitmask &= ~bitmask;
2703 + msi_irqs[pcie_port].msi_multiple_irq_bitmask &= ~(bitmask >> 1);
2704 + spin_unlock(&ifx_pcie_msi_lock);
2705 + IFX_PCIE_PRINT(PCIE_MSG_MSI, "%s exit\n", __func__);
2708 +MODULE_LICENSE("GPL");
2709 +MODULE_AUTHOR("Chuanhua.Lei@infineon.com");
2710 +MODULE_SUPPORTED_DEVICE("Infineon PCIe IP builtin MSI PIC module");
2711 +MODULE_DESCRIPTION("Infineon PCIe IP builtin MSI PIC driver");
2713 diff --git a/arch/mips/pci/ifxmips_pcie_phy.c b/arch/mips/pci/ifxmips_pcie_phy.c
2714 new file mode 100644
2715 index 0000000..f5b0f13
2717 +++ b/arch/mips/pci/ifxmips_pcie_phy.c
2719 +/******************************************************************************
2721 +** FILE NAME : ifxmips_pcie_phy.c
2722 +** PROJECT : IFX UEIP for VRX200
2723 +** MODULES : PCIe PHY sub module
2725 +** DATE : 14 May 2009
2726 +** AUTHOR : Lei Chuanhua
2727 +** DESCRIPTION : PCIe Root Complex Driver
2728 +** COPYRIGHT : Copyright (c) 2009
2729 +** Infineon Technologies AG
2730 +** Am Campeon 1-12, 85579 Neubiberg, Germany
2732 +** This program is free software; you can redistribute it and/or modify
2733 +** it under the terms of the GNU General Public License as published by
2734 +** the Free Software Foundation; either version 2 of the License, or
2735 +** (at your option) any later version.
2737 +** $Version $Date $Author $Comment
2738 +** 0.0.1 14 May,2009 Lei Chuanhua Initial version
2739 +*******************************************************************************/
2741 + \file ifxmips_pcie_phy.c
2743 + \brief PCIe PHY PLL register programming source file
2745 +#include <linux/types.h>
2746 +#include <linux/kernel.h>
2747 +#include <asm/paccess.h>
2748 +#include <linux/delay.h>
2750 +#include "ifxmips_pcie_reg.h"
2751 +#include "ifxmips_pcie.h"
2753 +/* PCIe PDI only supports 16 bit operation */
2755 +#define IFX_PCIE_PHY_REG_WRITE16(__addr, __data) \
2756 + ((*(volatile u16 *) (__addr)) = (__data))
2758 +#define IFX_PCIE_PHY_REG_READ16(__addr) \
2759 + (*(volatile u16 *) (__addr))
2761 +#define IFX_PCIE_PHY_REG16(__addr) \
2762 + (*(volatile u16 *) (__addr))
2764 +#define IFX_PCIE_PHY_REG(__reg, __value, __mask) do { \
2767 + read_data = IFX_PCIE_PHY_REG_READ16((__reg)); \
2768 + write_data = (read_data & ((u16)~(__mask))) | (((u16)(__value)) & ((u16)(__mask)));\
2769 + IFX_PCIE_PHY_REG_WRITE16((__reg), write_data); \
2772 +#define IFX_PCIE_PLL_TIMEOUT 1000 /* Tunnable */
2774 +//#define IFX_PCI_PHY_REG_DUMP
2776 +#ifdef IFX_PCI_PHY_REG_DUMP
2778 +pcie_phy_reg_dump(int pcie_port)
2780 + printk("PLL REGFILE\n");
2781 + printk("PCIE_PHY_PLL_CTRL1 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_PLL_CTRL1(pcie_port)));
2782 + printk("PCIE_PHY_PLL_CTRL2 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_PLL_CTRL2(pcie_port)));
2783 + printk("PCIE_PHY_PLL_CTRL3 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_PLL_CTRL3(pcie_port)));
2784 + printk("PCIE_PHY_PLL_CTRL4 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_PLL_CTRL4(pcie_port)));
2785 + printk("PCIE_PHY_PLL_CTRL5 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_PLL_CTRL5(pcie_port)));
2786 + printk("PCIE_PHY_PLL_CTRL6 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_PLL_CTRL6(pcie_port)));
2787 + printk("PCIE_PHY_PLL_CTRL7 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_PLL_CTRL7(pcie_port)));
2788 + printk("PCIE_PHY_PLL_A_CTRL1 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_PLL_A_CTRL1(pcie_port)));
2789 + printk("PCIE_PHY_PLL_A_CTRL2 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_PLL_A_CTRL2(pcie_port)));
2790 + printk("PCIE_PHY_PLL_A_CTRL3 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_PLL_A_CTRL3(pcie_port)));
2791 + printk("PCIE_PHY_PLL_STATUS 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_PLL_STATUS(pcie_port)));
2793 + printk("TX1 REGFILE\n");
2794 + printk("PCIE_PHY_TX1_CTRL1 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX1_CTRL1(pcie_port)));
2795 + printk("PCIE_PHY_TX1_CTRL2 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX1_CTRL2(pcie_port)));
2796 + printk("PCIE_PHY_TX1_CTRL3 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX1_CTRL3(pcie_port)));
2797 + printk("PCIE_PHY_TX1_A_CTRL1 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX1_A_CTRL1(pcie_port)));
2798 + printk("PCIE_PHY_TX1_A_CTRL2 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX1_A_CTRL2(pcie_port)));
2799 + printk("PCIE_PHY_TX1_MOD1 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX1_MOD1(pcie_port)));
2800 + printk("PCIE_PHY_TX1_MOD2 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX1_MOD2(pcie_port)));
2801 + printk("PCIE_PHY_TX1_MOD3 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX1_MOD3(pcie_port)));
2803 + printk("TX2 REGFILE\n");
2804 + printk("PCIE_PHY_TX2_CTRL1 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX2_CTRL1(pcie_port)));
2805 + printk("PCIE_PHY_TX2_CTRL2 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX2_CTRL2(pcie_port)));
2806 + printk("PCIE_PHY_TX2_A_CTRL1 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX2_A_CTRL1(pcie_port)));
2807 + printk("PCIE_PHY_TX2_A_CTRL2 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX2_A_CTRL2(pcie_port)));
2808 + printk("PCIE_PHY_TX2_MOD1 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX2_MOD1(pcie_port)));
2809 + printk("PCIE_PHY_TX2_MOD2 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX2_MOD2(pcie_port)));
2810 + printk("PCIE_PHY_TX2_MOD3 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX2_MOD3(pcie_port)));
2812 + printk("RX1 REGFILE\n");
2813 + printk("PCIE_PHY_RX1_CTRL1 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_RX1_CTRL1(pcie_port)));
2814 + printk("PCIE_PHY_RX1_CTRL2 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_RX1_CTRL2(pcie_port)));
2815 + printk("PCIE_PHY_RX1_CDR 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_RX1_CDR(pcie_port)));
2816 + printk("PCIE_PHY_RX1_EI 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_RX1_EI(pcie_port)));
2817 + printk("PCIE_PHY_RX1_A_CTRL 0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_RX1_A_CTRL(pcie_port)));
2819 +#endif /* IFX_PCI_PHY_REG_DUMP */
2822 +pcie_phy_comm_setup(int pcie_port)
2825 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL1(pcie_port), 0x120e, 0xFFFF);
2827 + /* increase the bias reference voltage */
2828 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL2(pcie_port), 0x39D7, 0xFFFF);
2829 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL3(pcie_port), 0x0900, 0xFFFF);
2832 + IFX_PCIE_PHY_REG(PCIE_PHY_RX1_EI(pcie_port), 0x0004, 0xFFFF);
2833 + IFX_PCIE_PHY_REG(PCIE_PHY_RX1_A_CTRL(pcie_port), 0x6803, 0xFFFF);
2836 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL1(pcie_port), 0x0008, 0x0008);
2838 + /* predrv_ser_en */
2839 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_A_CTRL2(pcie_port), 0x0706, 0xFFFF);
2842 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL3(pcie_port), 0x1FFF, 0xFFFF);
2845 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_A_CTRL1(pcie_port), 0x0800, 0xFF00);
2847 + /* predrv_ser_en */
2848 + IFX_PCIE_PHY_REG(PCIE_PHY_TX2_A_CTRL2(pcie_port), 0x4702, 0x7F00);
2851 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL2(pcie_port), 0x2e00, 0xFFFF);
2853 + /* Improved 100MHz clock output */
2854 + IFX_PCIE_PHY_REG(PCIE_PHY_TX2_CTRL2(pcie_port), 0x3096, 0xFFFF);
2855 + IFX_PCIE_PHY_REG(PCIE_PHY_TX2_A_CTRL2(pcie_port), 0x4707, 0xFFFF);
2857 + /* Reduced CDR BW to avoid glitches */
2858 + IFX_PCIE_PHY_REG(PCIE_PHY_RX1_CDR(pcie_port), 0x0235, 0xFFFF);
2861 +#ifdef CONFIG_IFX_PCIE_PHY_36MHZ_MODE
2863 +pcie_phy_36mhz_mode_setup(int pcie_port)
2865 + IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d enter\n", __func__, pcie_port);
2866 +#ifdef IFX_PCI_PHY_REG_DUMP
2867 + IFX_PCIE_PRINT(PCIE_MSG_PHY, "Initial PHY register dump\n");
2868 + pcie_phy_reg_dump(pcie_port);
2871 + /* en_ext_mmd_div_ratio */
2872 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0000, 0x0002);
2874 + /* ext_mmd_div_ratio*/
2875 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0000, 0x0070);
2878 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0200, 0x0200);
2880 + /* en_const_sdm */
2881 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0100, 0x0100);
2884 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL3(pcie_port), 0x2000, 0xe000);
2887 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL2(pcie_port), 0x0000, 0x4000);
2890 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL1(pcie_port), 0x38e4, 0xFFFF);
2893 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x00ee, 0x00FF);
2896 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL7(pcie_port), 0x0002, 0xFFFF);
2897 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL6(pcie_port), 0x3a04, 0xFFFF);
2898 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL5(pcie_port), 0xfae3, 0xFFFF);
2899 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL4(pcie_port), 0x1b72, 0xFFFF);
2901 + IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d exit\n", __func__, pcie_port);
2903 +#endif /* CONFIG_IFX_PCIE_PHY_36MHZ_MODE */
2905 +#ifdef CONFIG_IFX_PCIE_PHY_36MHZ_SSC_MODE
2907 +pcie_phy_36mhz_ssc_mode_setup(int pcie_port)
2909 + IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d enter\n", __func__, pcie_port);
2910 +#ifdef IFX_PCI_PHY_REG_DUMP
2911 + IFX_PCIE_PRINT(PCIE_MSG_PHY, "Initial PHY register dump\n");
2912 + pcie_phy_reg_dump(pcie_port);
2916 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL1(pcie_port), 0x120e, 0xFFFF);
2918 + /* Increase the bias reference voltage */
2919 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL2(pcie_port), 0x39D7, 0xFFFF);
2920 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL3(pcie_port), 0x0900, 0xFFFF);
2923 + IFX_PCIE_PHY_REG(PCIE_PHY_RX1_EI(pcie_port), 0x0004, 0xFFFF);
2924 + IFX_PCIE_PHY_REG(PCIE_PHY_RX1_A_CTRL(pcie_port), 0x6803, 0xFFFF);
2927 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL1(pcie_port), 0x0008, 0x0008);
2929 + /* Predrv_ser_en */
2930 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_A_CTRL2(pcie_port), 0x0706, 0xFFFF);
2933 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL3(pcie_port), 0x1FFF, 0xFFFF);
2936 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_A_CTRL1(pcie_port), 0x0800, 0xFF00);
2938 + /* predrv_ser_en */
2939 + IFX_PCIE_PHY_REG(PCIE_PHY_TX2_A_CTRL2(pcie_port), 0x4702, 0x7F00);
2942 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL2(pcie_port), 0x2e00, 0xFFFF);
2944 + /* en_ext_mmd_div_ratio */
2945 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0000, 0x0002);
2947 + /* ext_mmd_div_ratio*/
2948 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0000, 0x0070);
2951 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0400, 0x0400);
2953 + /* en_const_sdm */
2954 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0200, 0x0200);
2957 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL3(pcie_port), 0x2000, 0xe000);
2960 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL2(pcie_port), 0x0000, 0x4000);
2963 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL1(pcie_port), 0x38e4, 0xFFFF);
2965 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0000, 0x0100);
2967 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x00ee, 0x00FF);
2970 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL7(pcie_port), 0x0002, 0xFFFF);
2971 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL6(pcie_port), 0x3a04, 0xFFFF);
2972 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL5(pcie_port), 0xfae3, 0xFFFF);
2973 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL4(pcie_port), 0x1c72, 0xFFFF);
2975 + /* improved 100MHz clock output */
2976 + IFX_PCIE_PHY_REG(PCIE_PHY_TX2_CTRL2(pcie_port), 0x3096, 0xFFFF);
2977 + IFX_PCIE_PHY_REG(PCIE_PHY_TX2_A_CTRL2(pcie_port), 0x4707, 0xFFFF);
2979 + /* reduced CDR BW to avoid glitches */
2980 + IFX_PCIE_PHY_REG(PCIE_PHY_RX1_CDR(pcie_port), 0x0235, 0xFFFF);
2982 + IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d exit\n", __func__, pcie_port);
2984 +#endif /* CONFIG_IFX_PCIE_PHY_36MHZ_SSC_MODE */
2986 +#ifdef CONFIG_IFX_PCIE_PHY_25MHZ_MODE
2988 +pcie_phy_25mhz_mode_setup(int pcie_port)
2990 + IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d enter\n", __func__, pcie_port);
2991 +#ifdef IFX_PCI_PHY_REG_DUMP
2992 + IFX_PCIE_PRINT(PCIE_MSG_PHY, "Initial PHY register dump\n");
2993 + pcie_phy_reg_dump(pcie_port);
2995 + /* en_const_sdm */
2996 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0100, 0x0100);
2999 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0000, 0x0200);
3001 + /* en_ext_mmd_div_ratio*/
3002 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0002, 0x0002);
3004 + /* ext_mmd_div_ratio*/
3005 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0040, 0x0070);
3008 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL3(pcie_port), 0x6000, 0xe000);
3011 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL2(pcie_port), 0x4000, 0x4000);
3013 + IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d exit\n", __func__, pcie_port);
3015 +#endif /* CONFIG_IFX_PCIE_PHY_25MHZ_MODE */
3017 +#ifdef CONFIG_IFX_PCIE_PHY_100MHZ_MODE
3019 +pcie_phy_100mhz_mode_setup(int pcie_port)
3021 + IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d enter\n", __func__, pcie_port);
3022 +#ifdef IFX_PCI_PHY_REG_DUMP
3023 + IFX_PCIE_PRINT(PCIE_MSG_PHY, "Initial PHY register dump\n");
3024 + pcie_phy_reg_dump(pcie_port);
3026 + /* en_ext_mmd_div_ratio */
3027 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0000, 0x0002);
3029 + /* ext_mmd_div_ratio*/
3030 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0000, 0x0070);
3033 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0200, 0x0200);
3035 + /* en_const_sdm */
3036 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0100, 0x0100);
3039 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL3(pcie_port), 0x2000, 0xe000);
3042 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL2(pcie_port), 0x0000, 0x4000);
3045 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL1(pcie_port), 0x38e4, 0xFFFF);
3048 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x00ee, 0x00FF);
3051 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL7(pcie_port), 0x0002, 0xFFFF);
3052 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL6(pcie_port), 0x3a04, 0xFFFF);
3053 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL5(pcie_port), 0xfae3, 0xFFFF);
3054 + IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL4(pcie_port), 0x1b72, 0xFFFF);
3056 + IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d exit\n", __func__, pcie_port);
3058 +#endif /* CONFIG_IFX_PCIE_PHY_100MHZ_MODE */
3061 +pcie_phy_wait_startup_ready(int pcie_port)
3065 + for (i = 0; i < IFX_PCIE_PLL_TIMEOUT; i++) {
3066 + if ((IFX_PCIE_PHY_REG16(PCIE_PHY_PLL_STATUS(pcie_port)) & 0x0040) != 0) {
3071 + if (i >= IFX_PCIE_PLL_TIMEOUT) {
3072 + printk(KERN_ERR "%s PLL Link timeout\n", __func__);
3079 +pcie_phy_load_enable(int pcie_port, int slice)
3081 + /* Set the load_en of tx/rx slice to '1' */
3084 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL1(pcie_port), 0x0010, 0x0010);
3087 + IFX_PCIE_PHY_REG(PCIE_PHY_TX2_CTRL1(pcie_port), 0x0010, 0x0010);
3090 + IFX_PCIE_PHY_REG(PCIE_PHY_RX1_CTRL1(pcie_port), 0x0002, 0x0002);
3096 +pcie_phy_load_disable(int pcie_port, int slice)
3098 + /* set the load_en of tx/rx slice to '0' */
3101 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL1(pcie_port), 0x0000, 0x0010);
3104 + IFX_PCIE_PHY_REG(PCIE_PHY_TX2_CTRL1(pcie_port), 0x0000, 0x0010);
3107 + IFX_PCIE_PHY_REG(PCIE_PHY_RX1_CTRL1(pcie_port), 0x0000, 0x0002);
3113 +pcie_phy_load_war(int pcie_port)
3117 + for (slice = 1; slice < 4; slice++) {
3118 + pcie_phy_load_enable(pcie_port, slice);
3120 + pcie_phy_load_disable(pcie_port, slice);
3125 +pcie_phy_tx2_modulation(int pcie_port)
3127 + IFX_PCIE_PHY_REG(PCIE_PHY_TX2_MOD1(pcie_port), 0x1FFE, 0xFFFF);
3128 + IFX_PCIE_PHY_REG(PCIE_PHY_TX2_MOD2(pcie_port), 0xFFFE, 0xFFFF);
3129 + IFX_PCIE_PHY_REG(PCIE_PHY_TX2_MOD3(pcie_port), 0x0601, 0xFFFF);
3131 + IFX_PCIE_PHY_REG(PCIE_PHY_TX2_MOD3(pcie_port), 0x0001, 0xFFFF);
3135 +pcie_phy_tx1_modulation(int pcie_port)
3137 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_MOD1(pcie_port), 0x1FFE, 0xFFFF);
3138 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_MOD2(pcie_port), 0xFFFE, 0xFFFF);
3139 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_MOD3(pcie_port), 0x0601, 0xFFFF);
3141 + IFX_PCIE_PHY_REG(PCIE_PHY_TX1_MOD3(pcie_port), 0x0001, 0xFFFF);
3145 +pcie_phy_tx_modulation_war(int pcie_port)
3149 +#define PCIE_PHY_MODULATION_NUM 5
3150 + for (i = 0; i < PCIE_PHY_MODULATION_NUM; i++) {
3151 + pcie_phy_tx2_modulation(pcie_port);
3152 + pcie_phy_tx1_modulation(pcie_port);
3154 +#undef PCIE_PHY_MODULATION_NUM
3158 +pcie_phy_clock_mode_setup(int pcie_port)
3160 + pcie_pdi_big_endian(pcie_port);
3162 + /* Enable PDI to access PCIe PHY register */
3163 + pcie_pdi_pmu_enable(pcie_port);
3165 + /* Configure PLL and PHY clock */
3166 + pcie_phy_comm_setup(pcie_port);
3168 +#ifdef CONFIG_IFX_PCIE_PHY_36MHZ_MODE
3169 + pcie_phy_36mhz_mode_setup(pcie_port);
3170 +#elif defined(CONFIG_IFX_PCIE_PHY_36MHZ_SSC_MODE)
3171 + pcie_phy_36mhz_ssc_mode_setup(pcie_port);
3172 +#elif defined(CONFIG_IFX_PCIE_PHY_25MHZ_MODE)
3173 + pcie_phy_25mhz_mode_setup(pcie_port);
3174 +#elif defined (CONFIG_IFX_PCIE_PHY_100MHZ_MODE)
3175 + pcie_phy_100mhz_mode_setup(pcie_port);
3177 + #error "PCIE PHY Clock Mode must be chosen first!!!!"
3178 +#endif /* CONFIG_IFX_PCIE_PHY_36MHZ_MODE */
3180 + /* Enable PCIe PHY and make PLL setting take effect */
3181 + pcie_phy_pmu_enable(pcie_port);
3183 + /* Check if we are in startup_ready status */
3184 + pcie_phy_wait_startup_ready(pcie_port);
3186 + pcie_phy_load_war(pcie_port);
3188 + /* Apply TX modulation workarounds */
3189 + pcie_phy_tx_modulation_war(pcie_port);
3191 +#ifdef IFX_PCI_PHY_REG_DUMP
3192 + IFX_PCIE_PRINT(PCIE_MSG_PHY, "Modified PHY register dump\n");
3193 + pcie_phy_reg_dump(pcie_port);
3197 diff --git a/arch/mips/pci/ifxmips_pcie_pm.c b/arch/mips/pci/ifxmips_pcie_pm.c
3198 new file mode 100644
3199 index 0000000..a10ecad
3201 +++ b/arch/mips/pci/ifxmips_pcie_pm.c
3203 +/******************************************************************************
3205 +** FILE NAME : ifxmips_pcie_pm.c
3206 +** PROJECT : IFX UEIP
3207 +** MODULES : PCIE Root Complex Driver
3209 +** DATE : 21 Dec 2009
3210 +** AUTHOR : Lei Chuanhua
3211 +** DESCRIPTION : PCIE Root Complex Driver Power Managment
3212 +** COPYRIGHT : Copyright (c) 2009
3213 +** Lantiq Deutschland GmbH
3214 +** Am Campeon 3, 85579 Neubiberg, Germany
3216 +** This program is free software; you can redistribute it and/or modify
3217 +** it under the terms of the GNU General Public License as published by
3218 +** the Free Software Foundation; either version 2 of the License, or
3219 +** (at your option) any later version.
3222 +** $Date $Author $Comment
3223 +** 21 Dec,2009 Lei Chuanhua First UEIP release
3224 +*******************************************************************************/
3226 + \defgroup IFX_PCIE_PM Power Management functions
3228 + \brief IFX PCIE Root Complex Driver power management functions
3232 + \file ifxmips_pcie_pm.c
3234 + \brief source file for PCIE Root Complex Driver Power Management
3237 +#ifndef EXPORT_SYMTAB
3238 +#define EXPORT_SYMTAB
3240 +#ifndef AUTOCONF_INCLUDED
3241 +#include <linux/config.h>
3242 +#endif /* AUTOCONF_INCLUDED */
3243 +#include <linux/version.h>
3244 +#include <linux/module.h>
3245 +#include <linux/types.h>
3246 +#include <linux/kernel.h>
3247 +#include <asm/system.h>
3249 +/* Project header */
3250 +#include <asm/ifx/ifx_types.h>
3251 +#include <asm/ifx/ifx_regs.h>
3252 +#include <asm/ifx/common_routines.h>
3253 +#include <asm/ifx/ifx_pmcu.h>
3254 +#include "ifxmips_pcie_pm.h"
3257 + * \fn static IFX_PMCU_RETURN_t ifx_pcie_pmcu_state_change(IFX_PMCU_STATE_t pmcuState)
3258 + * \brief the callback function to request pmcu state in the power management hardware-dependent module
3260 + * \param pmcuState This parameter is a PMCU state.
3262 + * \return IFX_PMCU_RETURN_SUCCESS Set Power State successfully
3263 + * \return IFX_PMCU_RETURN_ERROR Failed to set power state.
3264 + * \return IFX_PMCU_RETURN_DENIED Not allowed to operate power state
3265 + * \ingroup IFX_PCIE_PM
3267 +static IFX_PMCU_RETURN_t
3268 +ifx_pcie_pmcu_state_change(IFX_PMCU_STATE_t pmcuState)
3272 + case IFX_PMCU_STATE_D0:
3273 + return IFX_PMCU_RETURN_SUCCESS;
3274 + case IFX_PMCU_STATE_D1: // Not Applicable
3275 + return IFX_PMCU_RETURN_DENIED;
3276 + case IFX_PMCU_STATE_D2: // Not Applicable
3277 + return IFX_PMCU_RETURN_DENIED;
3278 + case IFX_PMCU_STATE_D3: // Module clock gating and Power gating
3279 + return IFX_PMCU_RETURN_SUCCESS;
3281 + return IFX_PMCU_RETURN_DENIED;
3286 + * \fn static IFX_PMCU_RETURN_t ifx_pcie_pmcu_state_get(IFX_PMCU_STATE_t *pmcuState)
3287 + * \brief the callback function to get pmcu state in the power management hardware-dependent module
3289 + * \param pmcuState Pointer to return power state.
3291 + * \return IFX_PMCU_RETURN_SUCCESS Set Power State successfully
3292 + * \return IFX_PMCU_RETURN_ERROR Failed to set power state.
3293 + * \return IFX_PMCU_RETURN_DENIED Not allowed to operate power state
3294 + * \ingroup IFX_PCIE_PM
3296 +static IFX_PMCU_RETURN_t
3297 +ifx_pcie_pmcu_state_get(IFX_PMCU_STATE_t *pmcuState)
3299 + return IFX_PMCU_RETURN_SUCCESS;
3303 + * \fn IFX_PMCU_RETURN_t ifx_pcie_pmcu_prechange(IFX_PMCU_MODULE_t pmcuModule, IFX_PMCU_STATE_t newState, IFX_PMCU_STATE_t oldState)
3304 + * \brief Apply all callbacks registered to be executed before a state change for pmcuModule
3306 + * \param pmcuModule Module
3307 + * \param newState New state
3308 + * \param oldState Old state
3309 + * \return IFX_PMCU_RETURN_SUCCESS Set Power State successfully
3310 + * \return IFX_PMCU_RETURN_ERROR Failed to set power state.
3311 + * \ingroup IFX_PCIE_PM
3313 +static IFX_PMCU_RETURN_t
3314 +ifx_pcie_pmcu_prechange(IFX_PMCU_MODULE_t pmcuModule, IFX_PMCU_STATE_t newState, IFX_PMCU_STATE_t oldState)
3316 + return IFX_PMCU_RETURN_SUCCESS;
3320 + * \fn IFX_PMCU_RETURN_t ifx_pcie_pmcu_postchange(IFX_PMCU_MODULE_t pmcuModule, IFX_PMCU_STATE_t newState, IFX_PMCU_STATE_t oldState)
3321 + * \brief Apply all callbacks registered to be executed before a state change for pmcuModule
3323 + * \param pmcuModule Module
3324 + * \param newState New state
3325 + * \param oldState Old state
3326 + * \return IFX_PMCU_RETURN_SUCCESS Set Power State successfully
3327 + * \return IFX_PMCU_RETURN_ERROR Failed to set power state.
3328 + * \ingroup IFX_PCIE_PM
3330 +static IFX_PMCU_RETURN_t
3331 +ifx_pcie_pmcu_postchange(IFX_PMCU_MODULE_t pmcuModule, IFX_PMCU_STATE_t newState, IFX_PMCU_STATE_t oldState)
3333 + return IFX_PMCU_RETURN_SUCCESS;
3337 + * \fn static void ifx_pcie_pmcu_init(void)
3338 + * \brief Register with central PMCU module
3340 + * \ingroup IFX_PCIE_PM
3343 +ifx_pcie_pmcu_init(void)
3345 + IFX_PMCU_REGISTER_t pmcuRegister;
3347 + /* XXX, hook driver context */
3349 + /* State function register */
3350 + memset(&pmcuRegister, 0, sizeof(IFX_PMCU_REGISTER_t));
3351 + pmcuRegister.pmcuModule = IFX_PMCU_MODULE_PCIE;
3352 + pmcuRegister.pmcuModuleNr = 0;
3353 + pmcuRegister.ifx_pmcu_state_change = ifx_pcie_pmcu_state_change;
3354 + pmcuRegister.ifx_pmcu_state_get = ifx_pcie_pmcu_state_get;
3355 + pmcuRegister.pre = ifx_pcie_pmcu_prechange;
3356 + pmcuRegister.post= ifx_pcie_pmcu_postchange;
3357 + ifx_pmcu_register(&pmcuRegister);
3361 + * \fn static void ifx_pcie_pmcu_exit(void)
3362 + * \brief Unregister with central PMCU module
3365 + * \ingroup IFX_PCIE_PM
3368 +ifx_pcie_pmcu_exit(void)
3370 + IFX_PMCU_REGISTER_t pmcuUnRegister;
3372 + /* XXX, hook driver context */
3374 + pmcuUnRegister.pmcuModule = IFX_PMCU_MODULE_PCIE;
3375 + pmcuUnRegister.pmcuModuleNr = 0;
3376 + ifx_pmcu_unregister(&pmcuUnRegister);
3379 diff --git a/arch/mips/pci/ifxmips_pcie_pm.h b/arch/mips/pci/ifxmips_pcie_pm.h
3380 new file mode 100644
3381 index 0000000..6ece20d
3383 +++ b/arch/mips/pci/ifxmips_pcie_pm.h
3385 +/******************************************************************************
3387 +** FILE NAME : ifxmips_pcie_pm.h
3388 +** PROJECT : IFX UEIP
3389 +** MODULES : PCIe Root Complex Driver
3391 +** DATE : 21 Dec 2009
3392 +** AUTHOR : Lei Chuanhua
3393 +** DESCRIPTION : PCIe Root Complex Driver Power Managment
3394 +** COPYRIGHT : Copyright (c) 2009
3395 +** Lantiq Deutschland GmbH
3396 +** Am Campeon 3, 85579 Neubiberg, Germany
3398 +** This program is free software; you can redistribute it and/or modify
3399 +** it under the terms of the GNU General Public License as published by
3400 +** the Free Software Foundation; either version 2 of the License, or
3401 +** (at your option) any later version.
3404 +** $Date $Author $Comment
3405 +** 21 Dec,2009 Lei Chuanhua First UEIP release
3406 +*******************************************************************************/
3408 + \file ifxmips_pcie_pm.h
3410 + \brief header file for PCIe Root Complex Driver Power Management
3413 +#ifndef IFXMIPS_PCIE_PM_H
3414 +#define IFXMIPS_PCIE_PM_H
3416 +void ifx_pcie_pmcu_init(void);
3417 +void ifx_pcie_pmcu_exit(void);
3419 +#endif /* IFXMIPS_PCIE_PM_H */
3421 diff --git a/arch/mips/pci/ifxmips_pcie_reg.h b/arch/mips/pci/ifxmips_pcie_reg.h
3422 new file mode 100644
3423 index 0000000..e7e4b6c
3425 +++ b/arch/mips/pci/ifxmips_pcie_reg.h
3427 +/******************************************************************************
3429 +** FILE NAME : ifxmips_pcie_reg.h
3430 +** PROJECT : IFX UEIP for VRX200
3431 +** MODULES : PCIe module
3433 +** DATE : 02 Mar 2009
3434 +** AUTHOR : Lei Chuanhua
3435 +** DESCRIPTION : PCIe Root Complex Driver
3436 +** COPYRIGHT : Copyright (c) 2009
3437 +** Infineon Technologies AG
3438 +** Am Campeon 1-12, 85579 Neubiberg, Germany
3440 +** This program is free software; you can redistribute it and/or modify
3441 +** it under the terms of the GNU General Public License as published by
3442 +** the Free Software Foundation; either version 2 of the License, or
3443 +** (at your option) any later version.
3445 +** $Version $Date $Author $Comment
3446 +** 0.0.1 17 Mar,2009 Lei Chuanhua Initial version
3447 +*******************************************************************************/
3448 +#ifndef IFXMIPS_PCIE_REG_H
3449 +#define IFXMIPS_PCIE_REG_H
3451 + \file ifxmips_pcie_reg.h
3453 + \brief header file for PCIe module register definition
3455 +/* PCIe Address Mapping Base */
3456 +#define PCIE_CFG_PHY_BASE 0x1D000000UL
3457 +#define PCIE_CFG_BASE (KSEG1 + PCIE_CFG_PHY_BASE)
3458 +#define PCIE_CFG_SIZE (8 * 1024 * 1024)
3460 +#define PCIE_MEM_PHY_BASE 0x1C000000UL
3461 +#define PCIE_MEM_BASE (KSEG1 + PCIE_MEM_PHY_BASE)
3462 +#define PCIE_MEM_SIZE (16 * 1024 * 1024)
3463 +#define PCIE_MEM_PHY_END (PCIE_MEM_PHY_BASE + PCIE_MEM_SIZE - 1)
3465 +#define PCIE_IO_PHY_BASE 0x1D800000UL
3466 +#define PCIE_IO_BASE (KSEG1 + PCIE_IO_PHY_BASE)
3467 +#define PCIE_IO_SIZE (1 * 1024 * 1024)
3468 +#define PCIE_IO_PHY_END (PCIE_IO_PHY_BASE + PCIE_IO_SIZE - 1)
3470 +#define PCIE_RC_CFG_BASE (KSEG1 + 0x1D900000)
3471 +#define PCIE_APP_LOGIC_REG (KSEG1 + 0x1E100900)
3472 +#define PCIE_MSI_PHY_BASE 0x1F600000UL
3474 +#define PCIE_PDI_PHY_BASE 0x1F106800UL
3475 +#define PCIE_PDI_BASE (KSEG1 + PCIE_PDI_PHY_BASE)
3476 +#define PCIE_PDI_SIZE 0x400
3478 +#define PCIE1_CFG_PHY_BASE 0x19000000UL
3479 +#define PCIE1_CFG_BASE (KSEG1 + PCIE1_CFG_PHY_BASE)
3480 +#define PCIE1_CFG_SIZE (8 * 1024 * 1024)
3482 +#define PCIE1_MEM_PHY_BASE 0x18000000UL
3483 +#define PCIE1_MEM_BASE (KSEG1 + PCIE1_MEM_PHY_BASE)
3484 +#define PCIE1_MEM_SIZE (16 * 1024 * 1024)
3485 +#define PCIE1_MEM_PHY_END (PCIE1_MEM_PHY_BASE + PCIE1_MEM_SIZE - 1)
3487 +#define PCIE1_IO_PHY_BASE 0x19800000UL
3488 +#define PCIE1_IO_BASE (KSEG1 + PCIE1_IO_PHY_BASE)
3489 +#define PCIE1_IO_SIZE (1 * 1024 * 1024)
3490 +#define PCIE1_IO_PHY_END (PCIE1_IO_PHY_BASE + PCIE1_IO_SIZE - 1)
3492 +#define PCIE1_RC_CFG_BASE (KSEG1 + 0x19900000)
3493 +#define PCIE1_APP_LOGIC_REG (KSEG1 + 0x1E100700)
3494 +#define PCIE1_MSI_PHY_BASE 0x1F400000UL
3496 +#define PCIE1_PDI_PHY_BASE 0x1F700400UL
3497 +#define PCIE1_PDI_BASE (KSEG1 + PCIE1_PDI_PHY_BASE)
3498 +#define PCIE1_PDI_SIZE 0x400
3500 +#define PCIE_CFG_PORT_TO_BASE(X) ((X) > 0 ? (PCIE1_CFG_BASE) : (PCIE_CFG_BASE))
3501 +#define PCIE_MEM_PORT_TO_BASE(X) ((X) > 0 ? (PCIE1_MEM_BASE) : (PCIE_MEM_BASE))
3502 +#define PCIE_IO_PORT_TO_BASE(X) ((X) > 0 ? (PCIE1_IO_BASE) : (PCIE_IO_BASE))
3503 +#define PCIE_MEM_PHY_PORT_TO_BASE(X) ((X) > 0 ? (PCIE1_MEM_PHY_BASE) : (PCIE_MEM_PHY_BASE))
3504 +#define PCIE_MEM_PHY_PORT_TO_END(X) ((X) > 0 ? (PCIE1_MEM_PHY_END) : (PCIE_MEM_PHY_END))
3505 +#define PCIE_IO_PHY_PORT_TO_BASE(X) ((X) > 0 ? (PCIE1_IO_PHY_BASE) : (PCIE_IO_PHY_BASE))
3506 +#define PCIE_IO_PHY_PORT_TO_END(X) ((X) > 0 ? (PCIE1_IO_PHY_END) : (PCIE_IO_PHY_END))
3507 +#define PCIE_APP_PORT_TO_BASE(X) ((X) > 0 ? (PCIE1_APP_LOGIC_REG) : (PCIE_APP_LOGIC_REG))
3508 +#define PCIE_RC_PORT_TO_BASE(X) ((X) > 0 ? (PCIE1_RC_CFG_BASE) : (PCIE_RC_CFG_BASE))
3509 +#define PCIE_PHY_PORT_TO_BASE(X) ((X) > 0 ? (PCIE1_PDI_BASE) : (PCIE_PDI_BASE))
3511 +/* PCIe Application Logic Register */
3512 +/* RC Core Control Register */
3513 +#define PCIE_RC_CCR(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x10)
3514 +/* This should be enabled after initializing configuratin registers
3515 + * Also should check link status retraining bit
3517 +#define PCIE_RC_CCR_LTSSM_ENABLE 0x00000001 /* Enable LTSSM to continue link establishment */
3519 +/* RC Core Debug Register */
3520 +#define PCIE_RC_DR(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x14)
3521 +#define PCIE_RC_DR_DLL_UP 0x00000001 /* Data Link Layer Up */
3522 +#define PCIE_RC_DR_CURRENT_POWER_STATE 0x0000000E /* Current Power State */
3523 +#define PCIE_RC_DR_CURRENT_POWER_STATE_S 1
3524 +#define PCIE_RC_DR_CURRENT_LTSSM_STATE 0x000001F0 /* Current LTSSM State */
3525 +#define PCIE_RC_DR_CURRENT_LTSSM_STATE_S 4
3527 +#define PCIE_RC_DR_PM_DEV_STATE 0x00000E00 /* Power Management D-State */
3528 +#define PCIE_RC_DR_PM_DEV_STATE_S 9
3530 +#define PCIE_RC_DR_PM_ENABLED 0x00001000 /* Power Management State from PMU */
3531 +#define PCIE_RC_DR_PME_EVENT_ENABLED 0x00002000 /* Power Management Event Enable State */
3532 +#define PCIE_RC_DR_AUX_POWER_ENABLED 0x00004000 /* Auxiliary Power Enable */
3534 +/* Current Power State Definition */
3536 + PCIE_RC_DR_D0 = 0,
3537 + PCIE_RC_DR_D1, /* Not supported */
3538 + PCIE_RC_DR_D2, /* Not supported */
3543 +/* PHY Link Status Register */
3544 +#define PCIE_PHY_SR(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x18)
3545 +#define PCIE_PHY_SR_PHY_LINK_UP 0x00000001 /* PHY Link Up/Down Indicator */
3547 +/* Electromechanical Control Register */
3548 +#define PCIE_EM_CR(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x1C)
3549 +#define PCIE_EM_CR_CARD_IS_PRESENT 0x00000001 /* Card Presence Detect State */
3550 +#define PCIE_EM_CR_MRL_OPEN 0x00000002 /* MRL Sensor State */
3551 +#define PCIE_EM_CR_POWER_FAULT_SET 0x00000004 /* Power Fault Detected */
3552 +#define PCIE_EM_CR_MRL_SENSOR_SET 0x00000008 /* MRL Sensor Changed */
3553 +#define PCIE_EM_CR_PRESENT_DETECT_SET 0x00000010 /* Card Presense Detect Changed */
3554 +#define PCIE_EM_CR_CMD_CPL_INT_SET 0x00000020 /* Command Complete Interrupt */
3555 +#define PCIE_EM_CR_SYS_INTERLOCK_SET 0x00000040 /* System Electromechanical IterLock Engaged */
3556 +#define PCIE_EM_CR_ATTENTION_BUTTON_SET 0x00000080 /* Attention Button Pressed */
3558 +/* Interrupt Status Register */
3559 +#define PCIE_IR_SR(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x20)
3560 +#define PCIE_IR_SR_PME_CAUSE_MSI 0x00000002 /* MSI caused by PME */
3561 +#define PCIE_IR_SR_HP_PME_WAKE_GEN 0x00000004 /* Hotplug PME Wake Generation */
3562 +#define PCIE_IR_SR_HP_MSI 0x00000008 /* Hotplug MSI */
3563 +#define PCIE_IR_SR_AHB_LU_ERR 0x00000030 /* AHB Bridge Lookup Error Signals */
3564 +#define PCIE_IR_SR_AHB_LU_ERR_S 4
3565 +#define PCIE_IR_SR_INT_MSG_NUM 0x00003E00 /* Interrupt Message Number */
3566 +#define PCIE_IR_SR_INT_MSG_NUM_S 9
3567 +#define PCIE_IR_SR_AER_INT_MSG_NUM 0xF8000000 /* Advanced Error Interrupt Message Number */
3568 +#define PCIE_IR_SR_AER_INT_MSG_NUM_S 27
3570 +/* Message Control Register */
3571 +#define PCIE_MSG_CR(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x30)
3572 +#define PCIE_MSG_CR_GEN_PME_TURN_OFF_MSG 0x00000001 /* Generate PME Turn Off Message */
3573 +#define PCIE_MSG_CR_GEN_UNLOCK_MSG 0x00000002 /* Generate Unlock Message */
3575 +#define PCIE_VDM_DR(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x34)
3577 +/* Vendor-Defined Message Requester ID Register */
3578 +#define PCIE_VDM_RID(X) (PCIE_APP_PORT_TO_BASE (X) + 0x38)
3579 +#define PCIE_VDM_RID_VENROR_MSG_REQ_ID 0x0000FFFF
3580 +#define PCIE_VDM_RID_VDMRID_S 0
3582 +/* ASPM Control Register */
3583 +#define PCIE_ASPM_CR(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x40)
3584 +#define PCIE_ASPM_CR_HOT_RST 0x00000001 /* Hot Reset Request to the downstream device */
3585 +#define PCIE_ASPM_CR_REQ_EXIT_L1 0x00000002 /* Request to Exit L1 */
3586 +#define PCIE_ASPM_CR_REQ_ENTER_L1 0x00000004 /* Request to Enter L1 */
3588 +/* Vendor Message DW0 Register */
3589 +#define PCIE_VM_MSG_DW0(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x50)
3590 +#define PCIE_VM_MSG_DW0_TYPE 0x0000001F /* Message type */
3591 +#define PCIE_VM_MSG_DW0_TYPE_S 0
3592 +#define PCIE_VM_MSG_DW0_FORMAT 0x00000060 /* Format */
3593 +#define PCIE_VM_MSG_DW0_FORMAT_S 5
3594 +#define PCIE_VM_MSG_DW0_TC 0x00007000 /* Traffic Class */
3595 +#define PCIE_VM_MSG_DW0_TC_S 12
3596 +#define PCIE_VM_MSG_DW0_ATTR 0x000C0000 /* Atrributes */
3597 +#define PCIE_VM_MSG_DW0_ATTR_S 18
3598 +#define PCIE_VM_MSG_DW0_EP_TLP 0x00100000 /* Poisoned TLP */
3599 +#define PCIE_VM_MSG_DW0_TD 0x00200000 /* TLP Digest */
3600 +#define PCIE_VM_MSG_DW0_LEN 0xFFC00000 /* Length */
3601 +#define PCIE_VM_MSG_DW0_LEN_S 22
3603 +/* Format Definition */
3605 + PCIE_VM_MSG_FORMAT_00 = 0, /* 3DW Hdr, no data*/
3606 + PCIE_VM_MSG_FORMAT_01, /* 4DW Hdr, no data */
3607 + PCIE_VM_MSG_FORMAT_10, /* 3DW Hdr, with data */
3608 + PCIE_VM_MSG_FORMAT_11, /* 4DW Hdr, with data */
3611 +/* Traffic Class Definition */
3613 + PCIE_VM_MSG_TC0 = 0,
3623 +/* Attributes Definition */
3625 + PCIE_VM_MSG_ATTR_00 = 0, /* RO and No Snoop cleared */
3626 + PCIE_VM_MSG_ATTR_01, /* RO cleared , No Snoop set */
3627 + PCIE_VM_MSG_ATTR_10, /* RO set, No Snoop cleared*/
3628 + PCIE_VM_MSG_ATTR_11, /* RO and No Snoop set */
3631 +/* Payload Size Definition */
3632 +#define PCIE_VM_MSG_LEN_MIN 0
3633 +#define PCIE_VM_MSG_LEN_MAX 1024
3635 +/* Vendor Message DW1 Register */
3636 +#define PCIE_VM_MSG_DW1(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x54)
3637 +#define PCIE_VM_MSG_DW1_FUNC_NUM 0x00000070 /* Function Number */
3638 +#define PCIE_VM_MSG_DW1_FUNC_NUM_S 8
3639 +#define PCIE_VM_MSG_DW1_CODE 0x00FF0000 /* Message Code */
3640 +#define PCIE_VM_MSG_DW1_CODE_S 16
3641 +#define PCIE_VM_MSG_DW1_TAG 0xFF000000 /* Tag */
3642 +#define PCIE_VM_MSG_DW1_TAG_S 24
3644 +#define PCIE_VM_MSG_DW2(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x58)
3645 +#define PCIE_VM_MSG_DW3(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x5C)
3647 +/* Vendor Message Request Register */
3648 +#define PCIE_VM_MSG_REQR(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x60)
3649 +#define PCIE_VM_MSG_REQR_REQ 0x00000001 /* Vendor Message Request */
3652 +/* AHB Slave Side Band Control Register */
3653 +#define PCIE_AHB_SSB(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x70)
3654 +#define PCIE_AHB_SSB_REQ_BCM 0x00000001 /* Slave Reques BCM filed */
3655 +#define PCIE_AHB_SSB_REQ_EP 0x00000002 /* Slave Reques EP filed */
3656 +#define PCIE_AHB_SSB_REQ_TD 0x00000004 /* Slave Reques TD filed */
3657 +#define PCIE_AHB_SSB_REQ_ATTR 0x00000018 /* Slave Reques Attribute number */
3658 +#define PCIE_AHB_SSB_REQ_ATTR_S 3
3659 +#define PCIE_AHB_SSB_REQ_TC 0x000000E0 /* Slave Request TC Field */
3660 +#define PCIE_AHB_SSB_REQ_TC_S 5
3662 +/* AHB Master SideBand Ctrl Register */
3663 +#define PCIE_AHB_MSB(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x74)
3664 +#define PCIE_AHB_MSB_RESP_ATTR 0x00000003 /* Master Response Attribute number */
3665 +#define PCIE_AHB_MSB_RESP_ATTR_S 0
3666 +#define PCIE_AHB_MSB_RESP_BAD_EOT 0x00000004 /* Master Response Badeot filed */
3667 +#define PCIE_AHB_MSB_RESP_BCM 0x00000008 /* Master Response BCM filed */
3668 +#define PCIE_AHB_MSB_RESP_EP 0x00000010 /* Master Response EP filed */
3669 +#define PCIE_AHB_MSB_RESP_TD 0x00000020 /* Master Response TD filed */
3670 +#define PCIE_AHB_MSB_RESP_FUN_NUM 0x000003C0 /* Master Response Function number */
3671 +#define PCIE_AHB_MSB_RESP_FUN_NUM_S 6
3673 +/* AHB Control Register, fixed bus enumeration exception */
3674 +#define PCIE_AHB_CTRL(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x78)
3675 +#define PCIE_AHB_CTRL_BUS_ERROR_SUPPRESS 0x00000001
3677 +/* Interrupt Enalbe Register */
3678 +#define PCIE_IRNEN(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0xF4)
3679 +#define PCIE_IRNCR(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0xF8)
3680 +#define PCIE_IRNICR(X) (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0xFC)
3682 +/* PCIe interrupt enable/control/capture register definition */
3683 +#define PCIE_IRN_AER_REPORT 0x00000001 /* AER Interrupt */
3684 +#define PCIE_IRN_AER_MSIX 0x00000002 /* Advanced Error MSI-X Interrupt */
3685 +#define PCIE_IRN_PME 0x00000004 /* PME Interrupt */
3686 +#define PCIE_IRN_HOTPLUG 0x00000008 /* Hotplug Interrupt */
3687 +#define PCIE_IRN_RX_VDM_MSG 0x00000010 /* Vendor-Defined Message Interrupt */
3688 +#define PCIE_IRN_RX_CORRECTABLE_ERR_MSG 0x00000020 /* Correctable Error Message Interrupt */
3689 +#define PCIE_IRN_RX_NON_FATAL_ERR_MSG 0x00000040 /* Non-fatal Error Message */
3690 +#define PCIE_IRN_RX_FATAL_ERR_MSG 0x00000080 /* Fatal Error Message */
3691 +#define PCIE_IRN_RX_PME_MSG 0x00000100 /* PME Message Interrupt */
3692 +#define PCIE_IRN_RX_PME_TURNOFF_ACK 0x00000200 /* PME Turnoff Ack Message Interrupt */
3693 +#define PCIE_IRN_AHB_BR_FATAL_ERR 0x00000400 /* AHB Fatal Error Interrupt */
3694 +#define PCIE_IRN_LINK_AUTO_BW_STATUS 0x00000800 /* Link Auto Bandwidth Status Interrupt */
3695 +#define PCIE_IRN_BW_MGT 0x00001000 /* Bandwidth Managment Interrupt */
3696 +#define PCIE_IRN_INTA 0x00002000 /* INTA */
3697 +#define PCIE_IRN_INTB 0x00004000 /* INTB */
3698 +#define PCIE_IRN_INTC 0x00008000 /* INTC */
3699 +#define PCIE_IRN_INTD 0x00010000 /* INTD */
3700 +#define PCIE_IRN_WAKEUP 0x00020000 /* Wake up Interrupt */
3702 +#define PCIE_RC_CORE_COMBINED_INT (PCIE_IRN_AER_REPORT | PCIE_IRN_AER_MSIX | PCIE_IRN_PME | \
3703 + PCIE_IRN_HOTPLUG | PCIE_IRN_RX_VDM_MSG | PCIE_IRN_RX_CORRECTABLE_ERR_MSG |\
3704 + PCIE_IRN_RX_NON_FATAL_ERR_MSG | PCIE_IRN_RX_FATAL_ERR_MSG | \
3705 + PCIE_IRN_RX_PME_MSG | PCIE_IRN_RX_PME_TURNOFF_ACK | PCIE_IRN_AHB_BR_FATAL_ERR | \
3706 + PCIE_IRN_LINK_AUTO_BW_STATUS | PCIE_IRN_BW_MGT)
3707 +/* PCIe RC Configuration Register */
3708 +#define PCIE_VDID(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x00)
3710 +/* Bit definition from pci_reg.h */
3711 +#define PCIE_PCICMDSTS(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x04)
3712 +#define PCIE_CCRID(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x08)
3713 +#define PCIE_CLSLTHTBR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x0C) /* EP only */
3714 +/* BAR0, BAR1,Only necessary if the bridges implements a device-specific register set or memory buffer */
3715 +#define PCIE_BAR0(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x10) /* Not used*/
3716 +#define PCIE_BAR1(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x14) /* Not used */
3718 +#define PCIE_BNR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x18) /* Mandatory */
3719 +/* Bus Number Register bits */
3720 +#define PCIE_BNR_PRIMARY_BUS_NUM 0x000000FF
3721 +#define PCIE_BNR_PRIMARY_BUS_NUM_S 0
3722 +#define PCIE_PNR_SECONDARY_BUS_NUM 0x0000FF00
3723 +#define PCIE_PNR_SECONDARY_BUS_NUM_S 8
3724 +#define PCIE_PNR_SUB_BUS_NUM 0x00FF0000
3725 +#define PCIE_PNR_SUB_BUS_NUM_S 16
3727 +/* IO Base/Limit Register bits */
3728 +#define PCIE_IOBLSECS(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x1C) /* RC only */
3729 +#define PCIE_IOBLSECS_32BIT_IO_ADDR 0x00000001
3730 +#define PCIE_IOBLSECS_IO_BASE_ADDR 0x000000F0
3731 +#define PCIE_IOBLSECS_IO_BASE_ADDR_S 4
3732 +#define PCIE_IOBLSECS_32BIT_IOLIMT 0x00000100
3733 +#define PCIE_IOBLSECS_IO_LIMIT_ADDR 0x0000F000
3734 +#define PCIE_IOBLSECS_IO_LIMIT_ADDR_S 12
3736 +/* Non-prefetchable Memory Base/Limit Register bit */
3737 +#define PCIE_MBML(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x20) /* RC only */
3738 +#define PCIE_MBML_MEM_BASE_ADDR 0x0000FFF0
3739 +#define PCIE_MBML_MEM_BASE_ADDR_S 4
3740 +#define PCIE_MBML_MEM_LIMIT_ADDR 0xFFF00000
3741 +#define PCIE_MBML_MEM_LIMIT_ADDR_S 20
3743 +/* Prefetchable Memory Base/Limit Register bit */
3744 +#define PCIE_PMBL(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x24) /* RC only */
3745 +#define PCIE_PMBL_64BIT_ADDR 0x00000001
3746 +#define PCIE_PMBL_UPPER_12BIT 0x0000FFF0
3747 +#define PCIE_PMBL_UPPER_12BIT_S 4
3748 +#define PCIE_PMBL_E64MA 0x00010000
3749 +#define PCIE_PMBL_END_ADDR 0xFFF00000
3750 +#define PCIE_PMBL_END_ADDR_S 20
3751 +#define PCIE_PMBU32(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x28) /* RC only */
3752 +#define PCIE_PMLU32(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x2C) /* RC only */
3754 +/* I/O Base/Limit Upper 16 bits register */
3755 +#define PCIE_IO_BANDL(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x30) /* RC only */
3756 +#define PCIE_IO_BANDL_UPPER_16BIT_IO_BASE 0x0000FFFF
3757 +#define PCIE_IO_BANDL_UPPER_16BIT_IO_BASE_S 0
3758 +#define PCIE_IO_BANDL_UPPER_16BIT_IO_LIMIT 0xFFFF0000
3759 +#define PCIE_IO_BANDL_UPPER_16BIT_IO_LIMIT_S 16
3761 +#define PCIE_CPR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x34)
3762 +#define PCIE_EBBAR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x38)
3764 +/* Interrupt and Secondary Bridge Control Register */
3765 +#define PCIE_INTRBCTRL(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x3C)
3767 +#define PCIE_INTRBCTRL_INT_LINE 0x000000FF
3768 +#define PCIE_INTRBCTRL_INT_LINE_S 0
3769 +#define PCIE_INTRBCTRL_INT_PIN 0x0000FF00
3770 +#define PCIE_INTRBCTRL_INT_PIN_S 8
3771 +#define PCIE_INTRBCTRL_PARITY_ERR_RESP_ENABLE 0x00010000 /* #PERR */
3772 +#define PCIE_INTRBCTRL_SERR_ENABLE 0x00020000 /* #SERR */
3773 +#define PCIE_INTRBCTRL_ISA_ENABLE 0x00040000 /* ISA enable, IO 64KB only */
3774 +#define PCIE_INTRBCTRL_VGA_ENABLE 0x00080000 /* VGA enable */
3775 +#define PCIE_INTRBCTRL_VGA_16BIT_DECODE 0x00100000 /* VGA 16bit decode */
3776 +#define PCIE_INTRBCTRL_RST_SECONDARY_BUS 0x00400000 /* Secondary bus rest, hot rest, 1ms */
3777 +/* Others are read only */
3779 + PCIE_INTRBCTRL_INT_NON = 0,
3780 + PCIE_INTRBCTRL_INTA,
3781 + PCIE_INTRBCTRL_INTB,
3782 + PCIE_INTRBCTRL_INTC,
3783 + PCIE_INTRBCTRL_INTD,
3786 +#define PCIE_PM_CAPR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x40)
3788 +/* Power Management Control and Status Register */
3789 +#define PCIE_PM_CSR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x44)
3791 +#define PCIE_PM_CSR_POWER_STATE 0x00000003 /* Power State */
3792 +#define PCIE_PM_CSR_POWER_STATE_S 0
3793 +#define PCIE_PM_CSR_SW_RST 0x00000008 /* Soft Reset Enabled */
3794 +#define PCIE_PM_CSR_PME_ENABLE 0x00000100 /* PME Enable */
3795 +#define PCIE_PM_CSR_PME_STATUS 0x00008000 /* PME status */
3797 +/* MSI Capability Register for EP */
3798 +#define PCIE_MCAPR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x50)
3800 +#define PCIE_MCAPR_MSI_CAP_ID 0x000000FF /* MSI Capability ID */
3801 +#define PCIE_MCAPR_MSI_CAP_ID_S 0
3802 +#define PCIE_MCAPR_MSI_NEXT_CAP_PTR 0x0000FF00 /* Next Capability Pointer */
3803 +#define PCIE_MCAPR_MSI_NEXT_CAP_PTR_S 8
3804 +#define PCIE_MCAPR_MSI_ENABLE 0x00010000 /* MSI Enable */
3805 +#define PCIE_MCAPR_MULTI_MSG_CAP 0x000E0000 /* Multiple Message Capable */
3806 +#define PCIE_MCAPR_MULTI_MSG_CAP_S 17
3807 +#define PCIE_MCAPR_MULTI_MSG_ENABLE 0x00700000 /* Multiple Message Enable */
3808 +#define PCIE_MCAPR_MULTI_MSG_ENABLE_S 20
3809 +#define PCIE_MCAPR_ADDR64_CAP 0X00800000 /* 64-bit Address Capable */
3811 +/* MSI Message Address Register */
3812 +#define PCIE_MA(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x54)
3814 +#define PCIE_MA_ADDR_MASK 0xFFFFFFFC /* Message Address */
3816 +/* MSI Message Upper Address Register */
3817 +#define PCIE_MUA(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x58)
3819 +/* MSI Message Data Register */
3820 +#define PCIE_MD(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x5C)
3822 +#define PCIE_MD_DATA 0x0000FFFF /* Message Data */
3823 +#define PCIE_MD_DATA_S 0
3825 +/* PCI Express Capability Register */
3826 +#define PCIE_XCAP(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x70)
3828 +#define PCIE_XCAP_ID 0x000000FF /* PCI Express Capability ID */
3829 +#define PCIE_XCAP_ID_S 0
3830 +#define PCIE_XCAP_NEXT_CAP 0x0000FF00 /* Next Capability Pointer */
3831 +#define PCIE_XCAP_NEXT_CAP_S 8
3832 +#define PCIE_XCAP_VER 0x000F0000 /* PCI Express Capability Version */
3833 +#define PCIE_XCAP_VER_S 16
3834 +#define PCIE_XCAP_DEV_PORT_TYPE 0x00F00000 /* Device Port Type */
3835 +#define PCIE_XCAP_DEV_PORT_TYPE_S 20
3836 +#define PCIE_XCAP_SLOT_IMPLEMENTED 0x01000000 /* Slot Implemented */
3837 +#define PCIE_XCAP_MSG_INT_NUM 0x3E000000 /* Interrupt Message Number */
3838 +#define PCIE_XCAP_MSG_INT_NUM_S 25
3840 +/* Device Capability Register */
3841 +#define PCIE_DCAP(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x74)
3843 +#define PCIE_DCAP_MAX_PAYLOAD_SIZE 0x00000007 /* Max Payload size */
3844 +#define PCIE_DCAP_MAX_PAYLOAD_SIZE_S 0
3845 +#define PCIE_DCAP_PHANTOM_FUNC 0x00000018 /* Phanton Function, not supported */
3846 +#define PCIE_DCAP_PHANTOM_FUNC_S 3
3847 +#define PCIE_DCAP_EXT_TAG 0x00000020 /* Extended Tag Field */
3848 +#define PCIE_DCAP_EP_L0S_LATENCY 0x000001C0 /* EP L0s latency only */
3849 +#define PCIE_DCAP_EP_L0S_LATENCY_S 6
3850 +#define PCIE_DCAP_EP_L1_LATENCY 0x00000E00 /* EP L1 latency only */
3851 +#define PCIE_DCAP_EP_L1_LATENCY_S 9
3852 +#define PCIE_DCAP_ROLE_BASE_ERR_REPORT 0x00008000 /* Role Based ERR */
3854 +/* Maximum payload size supported */
3856 + PCIE_MAX_PAYLOAD_128 = 0,
3857 + PCIE_MAX_PAYLOAD_256,
3858 + PCIE_MAX_PAYLOAD_512,
3859 + PCIE_MAX_PAYLOAD_1024,
3860 + PCIE_MAX_PAYLOAD_2048,
3861 + PCIE_MAX_PAYLOAD_4096,
3864 +/* Device Control and Status Register */
3865 +#define PCIE_DCTLSTS(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x78)
3867 +#define PCIE_DCTLSTS_CORRECTABLE_ERR_EN 0x00000001 /* COR-ERR */
3868 +#define PCIE_DCTLSTS_NONFATAL_ERR_EN 0x00000002 /* Non-fatal ERR */
3869 +#define PCIE_DCTLSTS_FATAL_ERR_EN 0x00000004 /* Fatal ERR */
3870 +#define PCIE_DCTLSYS_UR_REQ_EN 0x00000008 /* UR ERR */
3871 +#define PCIE_DCTLSTS_RELAXED_ORDERING_EN 0x00000010 /* Enable relaxing ordering */
3872 +#define PCIE_DCTLSTS_MAX_PAYLOAD_SIZE 0x000000E0 /* Max payload mask */
3873 +#define PCIE_DCTLSTS_MAX_PAYLOAD_SIZE_S 5
3874 +#define PCIE_DCTLSTS_EXT_TAG_EN 0x00000100 /* Extended tag field */
3875 +#define PCIE_DCTLSTS_PHANTOM_FUNC_EN 0x00000200 /* Phantom Function Enable */
3876 +#define PCIE_DCTLSTS_AUX_PM_EN 0x00000400 /* AUX Power PM Enable */
3877 +#define PCIE_DCTLSTS_NO_SNOOP_EN 0x00000800 /* Enable no snoop, except root port*/
3878 +#define PCIE_DCTLSTS_MAX_READ_SIZE 0x00007000 /* Max Read Request size*/
3879 +#define PCIE_DCTLSTS_MAX_READ_SIZE_S 12
3880 +#define PCIE_DCTLSTS_CORRECTABLE_ERR 0x00010000 /* COR-ERR Detected */
3881 +#define PCIE_DCTLSTS_NONFATAL_ERR 0x00020000 /* Non-Fatal ERR Detected */
3882 +#define PCIE_DCTLSTS_FATAL_ER 0x00040000 /* Fatal ERR Detected */
3883 +#define PCIE_DCTLSTS_UNSUPPORTED_REQ 0x00080000 /* UR Detected */
3884 +#define PCIE_DCTLSTS_AUX_POWER 0x00100000 /* Aux Power Detected */
3885 +#define PCIE_DCTLSTS_TRANSACT_PENDING 0x00200000 /* Transaction pending */
3887 +#define PCIE_DCTLSTS_ERR_EN (PCIE_DCTLSTS_CORRECTABLE_ERR_EN | \
3888 + PCIE_DCTLSTS_NONFATAL_ERR_EN | PCIE_DCTLSTS_FATAL_ERR_EN | \
3889 + PCIE_DCTLSYS_UR_REQ_EN)
3891 +/* Link Capability Register */
3892 +#define PCIE_LCAP(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x7C)
3893 +#define PCIE_LCAP_MAX_LINK_SPEED 0x0000000F /* Max link speed, 0x1 by default */
3894 +#define PCIE_LCAP_MAX_LINK_SPEED_S 0
3895 +#define PCIE_LCAP_MAX_LENGTH_WIDTH 0x000003F0 /* Maxium Length Width */
3896 +#define PCIE_LCAP_MAX_LENGTH_WIDTH_S 4
3897 +#define PCIE_LCAP_ASPM_LEVEL 0x00000C00 /* Active State Link PM Support */
3898 +#define PCIE_LCAP_ASPM_LEVEL_S 10
3899 +#define PCIE_LCAP_L0S_EIXT_LATENCY 0x00007000 /* L0s Exit Latency */
3900 +#define PCIE_LCAP_L0S_EIXT_LATENCY_S 12
3901 +#define PCIE_LCAP_L1_EXIT_LATENCY 0x00038000 /* L1 Exit Latency */
3902 +#define PCIE_LCAP_L1_EXIT_LATENCY_S 15
3903 +#define PCIE_LCAP_CLK_PM 0x00040000 /* Clock Power Management */
3904 +#define PCIE_LCAP_SDER 0x00080000 /* Surprise Down Error Reporting */
3905 +#define PCIE_LCAP_DLL_ACTIVE_REPROT 0x00100000 /* Data Link Layer Active Reporting Capable */
3906 +#define PCIE_LCAP_PORT_NUM 0xFF0000000 /* Port number */
3907 +#define PCIE_LCAP_PORT_NUM_S 24
3909 +/* Maximum Length width definition */
3910 +#define PCIE_MAX_LENGTH_WIDTH_RES 0x00
3911 +#define PCIE_MAX_LENGTH_WIDTH_X1 0x01 /* Default */
3912 +#define PCIE_MAX_LENGTH_WIDTH_X2 0x02
3913 +#define PCIE_MAX_LENGTH_WIDTH_X4 0x04
3914 +#define PCIE_MAX_LENGTH_WIDTH_X8 0x08
3915 +#define PCIE_MAX_LENGTH_WIDTH_X12 0x0C
3916 +#define PCIE_MAX_LENGTH_WIDTH_X16 0x10
3917 +#define PCIE_MAX_LENGTH_WIDTH_X32 0x20
3919 +/* Active State Link PM definition */
3921 + PCIE_ASPM_RES0 = 0,
3922 + PCIE_ASPM_L0S_ENTRY_SUPPORT, /* L0s */
3924 + PCIE_ASPM_L0S_L1_ENTRY_SUPPORT, /* L0s and L1, default */
3927 +/* L0s Exit Latency definition */
3929 + PCIE_L0S_EIXT_LATENCY_L64NS = 0, /* < 64 ns */
3930 + PCIE_L0S_EIXT_LATENCY_B64A128, /* > 64 ns < 128 ns */
3931 + PCIE_L0S_EIXT_LATENCY_B128A256, /* > 128 ns < 256 ns */
3932 + PCIE_L0S_EIXT_LATENCY_B256A512, /* > 256 ns < 512 ns */
3933 + PCIE_L0S_EIXT_LATENCY_B512TO1U, /* > 512 ns < 1 us */
3934 + PCIE_L0S_EIXT_LATENCY_B1A2U, /* > 1 us < 2 us */
3935 + PCIE_L0S_EIXT_LATENCY_B2A4U, /* > 2 us < 4 us */
3936 + PCIE_L0S_EIXT_LATENCY_M4US, /* > 4 us */
3939 +/* L1 Exit Latency definition */
3941 + PCIE_L1_EXIT_LATENCY_L1US = 0, /* < 1 us */
3942 + PCIE_L1_EXIT_LATENCY_B1A2, /* > 1 us < 2 us */
3943 + PCIE_L1_EXIT_LATENCY_B2A4, /* > 2 us < 4 us */
3944 + PCIE_L1_EXIT_LATENCY_B4A8, /* > 4 us < 8 us */
3945 + PCIE_L1_EXIT_LATENCY_B8A16, /* > 8 us < 16 us */
3946 + PCIE_L1_EXIT_LATENCY_B16A32, /* > 16 us < 32 us */
3947 + PCIE_L1_EXIT_LATENCY_B32A64, /* > 32 us < 64 us */
3948 + PCIE_L1_EXIT_LATENCY_M64US, /* > 64 us */
3951 +/* Link Control and Status Register */
3952 +#define PCIE_LCTLSTS(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x80)
3953 +#define PCIE_LCTLSTS_ASPM_ENABLE 0x00000003 /* Active State Link PM Control */
3954 +#define PCIE_LCTLSTS_ASPM_ENABLE_S 0
3955 +#define PCIE_LCTLSTS_RCB128 0x00000008 /* Read Completion Boundary 128*/
3956 +#define PCIE_LCTLSTS_LINK_DISABLE 0x00000010 /* Link Disable */
3957 +#define PCIE_LCTLSTS_RETRIAN_LINK 0x00000020 /* Retrain Link */
3958 +#define PCIE_LCTLSTS_COM_CLK_CFG 0x00000040 /* Common Clock Configuration */
3959 +#define PCIE_LCTLSTS_EXT_SYNC 0x00000080 /* Extended Synch */
3960 +#define PCIE_LCTLSTS_CLK_PM_EN 0x00000100 /* Enable Clock Powerm Management */
3961 +#define PCIE_LCTLSTS_LINK_SPEED 0x000F0000 /* Link Speed */
3962 +#define PCIE_LCTLSTS_LINK_SPEED_S 16
3963 +#define PCIE_LCTLSTS_NEGOTIATED_LINK_WIDTH 0x03F00000 /* Negotiated Link Width */
3964 +#define PCIE_LCTLSTS_NEGOTIATED_LINK_WIDTH_S 20
3965 +#define PCIE_LCTLSTS_RETRAIN_PENDING 0x08000000 /* Link training is ongoing */
3966 +#define PCIE_LCTLSTS_SLOT_CLK_CFG 0x10000000 /* Slot Clock Configuration */
3967 +#define PCIE_LCTLSTS_DLL_ACTIVE 0x20000000 /* Data Link Layer Active */
3969 +/* Slot Capabilities Register */
3970 +#define PCIE_SLCAP(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x84)
3972 +/* Slot Capabilities */
3973 +#define PCIE_SLCTLSTS(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x88)
3975 +/* Root Control and Capability Register */
3976 +#define PCIE_RCTLCAP(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x8C)
3977 +#define PCIE_RCTLCAP_SERR_ON_CORRECTABLE_ERR 0x00000001 /* #SERR on COR-ERR */
3978 +#define PCIE_RCTLCAP_SERR_ON_NONFATAL_ERR 0x00000002 /* #SERR on Non-Fatal ERR */
3979 +#define PCIE_RCTLCAP_SERR_ON_FATAL_ERR 0x00000004 /* #SERR on Fatal ERR */
3980 +#define PCIE_RCTLCAP_PME_INT_EN 0x00000008 /* PME Interrupt Enable */
3981 +#define PCIE_RCTLCAP_SERR_ENABLE (PCIE_RCTLCAP_SERR_ON_CORRECTABLE_ERR | \
3982 + PCIE_RCTLCAP_SERR_ON_NONFATAL_ERR | PCIE_RCTLCAP_SERR_ON_FATAL_ERR)
3983 +/* Root Status Register */
3984 +#define PCIE_RSTS(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x90)
3985 +#define PCIE_RSTS_PME_REQ_ID 0x0000FFFF /* PME Request ID */
3986 +#define PCIE_RSTS_PME_REQ_ID_S 0
3987 +#define PCIE_RSTS_PME_STATUS 0x00010000 /* PME Status */
3988 +#define PCIE_RSTS_PME_PENDING 0x00020000 /* PME Pending */
3990 +/* PCI Express Enhanced Capability Header */
3991 +#define PCIE_ENHANCED_CAP(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x100)
3992 +#define PCIE_ENHANCED_CAP_ID 0x0000FFFF /* PCI Express Extended Capability ID */
3993 +#define PCIE_ENHANCED_CAP_ID_S 0
3994 +#define PCIE_ENHANCED_CAP_VER 0x000F0000 /* Capability Version */
3995 +#define PCIE_ENHANCED_CAP_VER_S 16
3996 +#define PCIE_ENHANCED_CAP_NEXT_OFFSET 0xFFF00000 /* Next Capability Offset */
3997 +#define PCIE_ENHANCED_CAP_NEXT_OFFSET_S 20
3999 +/* Uncorrectable Error Status Register */
4000 +#define PCIE_UES_R(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x104)
4001 +#define PCIE_DATA_LINK_PROTOCOL_ERR 0x00000010 /* Data Link Protocol Error Status */
4002 +#define PCIE_SURPRISE_DOWN_ERROR 0x00000020 /* Surprise Down Error Status */
4003 +#define PCIE_POISONED_TLP 0x00001000 /* Poisoned TLP Status */
4004 +#define PCIE_FC_PROTOCOL_ERR 0x00002000 /* Flow Control Protocol Error Status */
4005 +#define PCIE_COMPLETION_TIMEOUT 0x00004000 /* Completion Timeout Status */
4006 +#define PCIE_COMPLETOR_ABORT 0x00008000 /* Completer Abort Error */
4007 +#define PCIE_UNEXPECTED_COMPLETION 0x00010000 /* Unexpected Completion Status */
4008 +#define PCIE_RECEIVER_OVERFLOW 0x00020000 /* Receive Overflow Status */
4009 +#define PCIE_MALFORNED_TLP 0x00040000 /* Malformed TLP Stauts */
4010 +#define PCIE_ECRC_ERR 0x00080000 /* ECRC Error Stauts */
4011 +#define PCIE_UR_REQ 0x00100000 /* Unsupported Request Error Status */
4012 +#define PCIE_ALL_UNCORRECTABLE_ERR (PCIE_DATA_LINK_PROTOCOL_ERR | PCIE_SURPRISE_DOWN_ERROR | \
4013 + PCIE_POISONED_TLP | PCIE_FC_PROTOCOL_ERR | PCIE_COMPLETION_TIMEOUT | \
4014 + PCIE_COMPLETOR_ABORT | PCIE_UNEXPECTED_COMPLETION | PCIE_RECEIVER_OVERFLOW |\
4015 + PCIE_MALFORNED_TLP | PCIE_ECRC_ERR | PCIE_UR_REQ)
4017 +/* Uncorrectable Error Mask Register, Mask means no report */
4018 +#define PCIE_UEMR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x108)
4020 +/* Uncorrectable Error Severity Register */
4021 +#define PCIE_UESR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x10C)
4023 +/* Correctable Error Status Register */
4024 +#define PCIE_CESR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x110)
4025 +#define PCIE_RX_ERR 0x00000001 /* Receive Error Status */
4026 +#define PCIE_BAD_TLP 0x00000040 /* Bad TLP Status */
4027 +#define PCIE_BAD_DLLP 0x00000080 /* Bad DLLP Status */
4028 +#define PCIE_REPLAY_NUM_ROLLOVER 0x00000100 /* Replay Number Rollover Status */
4029 +#define PCIE_REPLAY_TIMER_TIMEOUT_ERR 0x00001000 /* Reply Timer Timeout Status */
4030 +#define PCIE_ADVISORY_NONFTAL_ERR 0x00002000 /* Advisory Non-Fatal Error Status */
4031 +#define PCIE_CORRECTABLE_ERR (PCIE_RX_ERR | PCIE_BAD_TLP | PCIE_BAD_DLLP | PCIE_REPLAY_NUM_ROLLOVER |\
4032 + PCIE_REPLAY_TIMER_TIMEOUT_ERR | PCIE_ADVISORY_NONFTAL_ERR)
4034 +/* Correctable Error Mask Register */
4035 +#define PCIE_CEMR(X) (volatile u32*)(PCIE_RC_CFG_BASE + 0x114)
4037 +/* Advanced Error Capabilities and Control Register */
4038 +#define PCIE_AECCR(X) (volatile u32*)(PCIE_RC_CFG_BASE + 0x118)
4039 +#define PCIE_AECCR_FIRST_ERR_PTR 0x0000001F /* First Error Pointer */
4040 +#define PCIE_AECCR_FIRST_ERR_PTR_S 0
4041 +#define PCIE_AECCR_ECRC_GEN_CAP 0x00000020 /* ECRC Generation Capable */
4042 +#define PCIE_AECCR_ECRC_GEN_EN 0x00000040 /* ECRC Generation Enable */
4043 +#define PCIE_AECCR_ECRC_CHECK_CAP 0x00000080 /* ECRC Check Capable */
4044 +#define PCIE_AECCR_ECRC_CHECK_EN 0x00000100 /* ECRC Check Enable */
4046 +/* Header Log Register 1 */
4047 +#define PCIE_HLR1(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x11C)
4049 +/* Header Log Register 2 */
4050 +#define PCIE_HLR2(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x120)
4052 +/* Header Log Register 3 */
4053 +#define PCIE_HLR3(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x124)
4055 +/* Header Log Register 4 */
4056 +#define PCIE_HLR4(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x128)
4058 +/* Root Error Command Register */
4059 +#define PCIE_RECR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x12C)
4060 +#define PCIE_RECR_CORRECTABLE_ERR_REPORT_EN 0x00000001 /* COR-ERR */
4061 +#define PCIE_RECR_NONFATAL_ERR_REPORT_EN 0x00000002 /* Non-Fatal ERR */
4062 +#define PCIE_RECR_FATAL_ERR_REPORT_EN 0x00000004 /* Fatal ERR */
4063 +#define PCIE_RECR_ERR_REPORT_EN (PCIE_RECR_CORRECTABLE_ERR_REPORT_EN | \
4064 + PCIE_RECR_NONFATAL_ERR_REPORT_EN | PCIE_RECR_FATAL_ERR_REPORT_EN)
4066 +/* Root Error Status Register */
4067 +#define PCIE_RESR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x130)
4068 +#define PCIE_RESR_CORRECTABLE_ERR 0x00000001 /* COR-ERR Receveid */
4069 +#define PCIE_RESR_MULTI_CORRECTABLE_ERR 0x00000002 /* Multiple COR-ERR Received */
4070 +#define PCIE_RESR_FATAL_NOFATAL_ERR 0x00000004 /* ERR Fatal/Non-Fatal Received */
4071 +#define PCIE_RESR_MULTI_FATAL_NOFATAL_ERR 0x00000008 /* Multiple ERR Fatal/Non-Fatal Received */
4072 +#define PCIE_RESR_FIRST_UNCORRECTABLE_FATAL_ERR 0x00000010 /* First UN-COR Fatal */
4073 +#define PCIR_RESR_NON_FATAL_ERR 0x00000020 /* Non-Fatal Error Message Received */
4074 +#define PCIE_RESR_FATAL_ERR 0x00000040 /* Fatal Message Received */
4075 +#define PCIE_RESR_AER_INT_MSG_NUM 0xF8000000 /* Advanced Error Interrupt Message Number */
4076 +#define PCIE_RESR_AER_INT_MSG_NUM_S 27
4078 +/* Error Source Indentification Register */
4079 +#define PCIE_ESIR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x134)
4080 +#define PCIE_ESIR_CORRECTABLE_ERR_SRC_ID 0x0000FFFF
4081 +#define PCIE_ESIR_CORRECTABLE_ERR_SRC_ID_S 0
4082 +#define PCIE_ESIR_FATAL_NON_FATAL_SRC_ID 0xFFFF0000
4083 +#define PCIE_ESIR_FATAL_NON_FATAL_SRC_ID_S 16
4085 +/* VC Enhanced Capability Header */
4086 +#define PCIE_VC_ECH(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x140)
4088 +/* Port VC Capability Register */
4089 +#define PCIE_PVC1(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x144)
4090 +#define PCIE_PVC1_EXT_VC_CNT 0x00000007 /* Extended VC Count */
4091 +#define PCIE_PVC1_EXT_VC_CNT_S 0
4092 +#define PCIE_PVC1_LOW_PRI_EXT_VC_CNT 0x00000070 /* Low Priority Extended VC Count */
4093 +#define PCIE_PVC1_LOW_PRI_EXT_VC_CNT_S 4
4094 +#define PCIE_PVC1_REF_CLK 0x00000300 /* Reference Clock */
4095 +#define PCIE_PVC1_REF_CLK_S 8
4096 +#define PCIE_PVC1_PORT_ARB_TAB_ENTRY_SIZE 0x00000C00 /* Port Arbitration Table Entry Size */
4097 +#define PCIE_PVC1_PORT_ARB_TAB_ENTRY_SIZE_S 10
4099 +/* Extended Virtual Channel Count Defintion */
4100 +#define PCIE_EXT_VC_CNT_MIN 0
4101 +#define PCIE_EXT_VC_CNT_MAX 7
4103 +/* Port Arbitration Table Entry Size Definition */
4105 + PCIE_PORT_ARB_TAB_ENTRY_SIZE_S1BIT = 0,
4106 + PCIE_PORT_ARB_TAB_ENTRY_SIZE_S2BIT,
4107 + PCIE_PORT_ARB_TAB_ENTRY_SIZE_S4BIT,
4108 + PCIE_PORT_ARB_TAB_ENTRY_SIZE_S8BIT,
4111 +/* Port VC Capability Register 2 */
4112 +#define PCIE_PVC2(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x148)
4113 +#define PCIE_PVC2_VC_ARB_16P_FIXED_WRR 0x00000001 /* HW Fixed arbitration, 16 phase WRR */
4114 +#define PCIE_PVC2_VC_ARB_32P_WRR 0x00000002 /* 32 phase WRR */
4115 +#define PCIE_PVC2_VC_ARB_64P_WRR 0x00000004 /* 64 phase WRR */
4116 +#define PCIE_PVC2_VC_ARB_128P_WRR 0x00000008 /* 128 phase WRR */
4117 +#define PCIE_PVC2_VC_ARB_WRR 0x0000000F
4118 +#define PCIE_PVC2_VC_ARB_TAB_OFFSET 0xFF000000 /* VC arbitration table offset, not support */
4119 +#define PCIE_PVC2_VC_ARB_TAB_OFFSET_S 24
4121 +/* Port VC Control and Status Register */
4122 +#define PCIE_PVCCRSR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x14C)
4123 +#define PCIE_PVCCRSR_LOAD_VC_ARB_TAB 0x00000001 /* Load VC Arbitration Table */
4124 +#define PCIE_PVCCRSR_VC_ARB_SEL 0x0000000E /* VC Arbitration Select */
4125 +#define PCIE_PVCCRSR_VC_ARB_SEL_S 1
4126 +#define PCIE_PVCCRSR_VC_ARB_TAB_STATUS 0x00010000 /* Arbitration Status */
4128 +/* VC0 Resource Capability Register */
4129 +#define PCIE_VC0_RC(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x150)
4130 +#define PCIE_VC0_RC_PORT_ARB_HW_FIXED 0x00000001 /* HW Fixed arbitration */
4131 +#define PCIE_VC0_RC_PORT_ARB_32P_WRR 0x00000002 /* 32 phase WRR */
4132 +#define PCIE_VC0_RC_PORT_ARB_64P_WRR 0x00000004 /* 64 phase WRR */
4133 +#define PCIE_VC0_RC_PORT_ARB_128P_WRR 0x00000008 /* 128 phase WRR */
4134 +#define PCIE_VC0_RC_PORT_ARB_TM_128P_WRR 0x00000010 /* Time-based 128 phase WRR */
4135 +#define PCIE_VC0_RC_PORT_ARB_TM_256P_WRR 0x00000020 /* Time-based 256 phase WRR */
4136 +#define PCIE_VC0_RC_PORT_ARB (PCIE_VC0_RC_PORT_ARB_HW_FIXED | PCIE_VC0_RC_PORT_ARB_32P_WRR |\
4137 + PCIE_VC0_RC_PORT_ARB_64P_WRR | PCIE_VC0_RC_PORT_ARB_128P_WRR | \
4138 + PCIE_VC0_RC_PORT_ARB_TM_128P_WRR | PCIE_VC0_RC_PORT_ARB_TM_256P_WRR)
4140 +#define PCIE_VC0_RC_REJECT_SNOOP 0x00008000 /* Reject Snoop Transactioin */
4141 +#define PCIE_VC0_RC_MAX_TIMESLOTS 0x007F0000 /* Maximum time Slots */
4142 +#define PCIE_VC0_RC_MAX_TIMESLOTS_S 16
4143 +#define PCIE_VC0_RC_PORT_ARB_TAB_OFFSET 0xFF000000 /* Port Arbitration Table Offset */
4144 +#define PCIE_VC0_RC_PORT_ARB_TAB_OFFSET_S 24
4146 +/* VC0 Resource Control Register */
4147 +#define PCIE_VC0_RC0(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x154)
4148 +#define PCIE_VC0_RC0_TVM0 0x00000001 /* TC0 and VC0 */
4149 +#define PCIE_VC0_RC0_TVM1 0x00000002 /* TC1 and VC1 */
4150 +#define PCIE_VC0_RC0_TVM2 0x00000004 /* TC2 and VC2 */
4151 +#define PCIE_VC0_RC0_TVM3 0x00000008 /* TC3 and VC3 */
4152 +#define PCIE_VC0_RC0_TVM4 0x00000010 /* TC4 and VC4 */
4153 +#define PCIE_VC0_RC0_TVM5 0x00000020 /* TC5 and VC5 */
4154 +#define PCIE_VC0_RC0_TVM6 0x00000040 /* TC6 and VC6 */
4155 +#define PCIE_VC0_RC0_TVM7 0x00000080 /* TC7 and VC7 */
4156 +#define PCIE_VC0_RC0_TC_VC 0x000000FF /* TC/VC mask */
4158 +#define PCIE_VC0_RC0_LOAD_PORT_ARB_TAB 0x00010000 /* Load Port Arbitration Table */
4159 +#define PCIE_VC0_RC0_PORT_ARB_SEL 0x000E0000 /* Port Arbitration Select */
4160 +#define PCIE_VC0_RC0_PORT_ARB_SEL_S 17
4161 +#define PCIE_VC0_RC0_VC_ID 0x07000000 /* VC ID */
4162 +#define PCIE_VC0_RC0_VC_ID_S 24
4163 +#define PCIE_VC0_RC0_VC_EN 0x80000000 /* VC Enable */
4165 +/* VC0 Resource Status Register */
4166 +#define PCIE_VC0_RSR0(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x158)
4167 +#define PCIE_VC0_RSR0_PORT_ARB_TAB_STATUS 0x00010000 /* Port Arbitration Table Status,not used */
4168 +#define PCIE_VC0_RSR0_VC_NEG_PENDING 0x00020000 /* VC Negotiation Pending */
4170 +/* Ack Latency Timer and Replay Timer Register */
4171 +#define PCIE_ALTRT(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x700)
4172 +#define PCIE_ALTRT_ROUND_TRIP_LATENCY_LIMIT 0x0000FFFF /* Round Trip Latency Time Limit */
4173 +#define PCIE_ALTRT_ROUND_TRIP_LATENCY_LIMIT_S 0
4174 +#define PCIE_ALTRT_REPLAY_TIME_LIMIT 0xFFFF0000 /* Replay Time Limit */
4175 +#define PCIE_ALTRT_REPLAY_TIME_LIMIT_S 16
4177 +/* Other Message Register */
4178 +#define PCIE_OMR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x704)
4180 +/* Port Force Link Register */
4181 +#define PCIE_PFLR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x708)
4182 +#define PCIE_PFLR_LINK_NUM 0x000000FF /* Link Number */
4183 +#define PCIE_PFLR_LINK_NUM_S 0
4184 +#define PCIE_PFLR_FORCE_LINK 0x00008000 /* Force link */
4185 +#define PCIE_PFLR_LINK_STATE 0x003F0000 /* Link State */
4186 +#define PCIE_PFLR_LINK_STATE_S 16
4187 +#define PCIE_PFLR_LOW_POWER_ENTRY_CNT 0xFF000000 /* Low Power Entrance Count, only for EP */
4188 +#define PCIE_PFLR_LOW_POWER_ENTRY_CNT_S 24
4190 +/* Ack Frequency Register */
4191 +#define PCIE_AFR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x70C)
4192 +#define PCIE_AFR_AF 0x000000FF /* Ack Frequency */
4193 +#define PCIE_AFR_AF_S 0
4194 +#define PCIE_AFR_FTS_NUM 0x0000FF00 /* The number of Fast Training Sequence from L0S to L0 */
4195 +#define PCIE_AFR_FTS_NUM_S 8
4196 +#define PCIE_AFR_COM_FTS_NUM 0x00FF0000 /* N_FTS; when common clock is used*/
4197 +#define PCIE_AFR_COM_FTS_NUM_S 16
4198 +#define PCIE_AFR_L0S_ENTRY_LATENCY 0x07000000 /* L0s Entrance Latency */
4199 +#define PCIE_AFR_L0S_ENTRY_LATENCY_S 24
4200 +#define PCIE_AFR_L1_ENTRY_LATENCY 0x38000000 /* L1 Entrance Latency */
4201 +#define PCIE_AFR_L1_ENTRY_LATENCY_S 27
4202 +#define PCIE_AFR_FTS_NUM_DEFAULT 32
4203 +#define PCIE_AFR_L0S_ENTRY_LATENCY_DEFAULT 7
4204 +#define PCIE_AFR_L1_ENTRY_LATENCY_DEFAULT 5
4206 +/* Port Link Control Register */
4207 +#define PCIE_PLCR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x710)
4208 +#define PCIE_PLCR_OTHER_MSG_REQ 0x00000001 /* Other Message Request */
4209 +#define PCIE_PLCR_SCRAMBLE_DISABLE 0x00000002 /* Scramble Disable */
4210 +#define PCIE_PLCR_LOOPBACK_EN 0x00000004 /* Loopback Enable */
4211 +#define PCIE_PLCR_LTSSM_HOT_RST 0x00000008 /* Force LTSSM to the hot reset */
4212 +#define PCIE_PLCR_DLL_LINK_EN 0x00000020 /* Enable Link initialization */
4213 +#define PCIE_PLCR_FAST_LINK_SIM_EN 0x00000080 /* Sets all internal timers to fast mode for simulation purposes */
4214 +#define PCIE_PLCR_LINK_MODE 0x003F0000 /* Link Mode Enable Mask */
4215 +#define PCIE_PLCR_LINK_MODE_S 16
4216 +#define PCIE_PLCR_CORRUPTED_CRC_EN 0x02000000 /* Enabled Corrupt CRC */
4218 +/* Lane Skew Register */
4219 +#define PCIE_LSR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x714)
4220 +#define PCIE_LSR_LANE_SKEW_NUM 0x00FFFFFF /* Insert Lane Skew for Transmit, not applicable */
4221 +#define PCIE_LSR_LANE_SKEW_NUM_S 0
4222 +#define PCIE_LSR_FC_DISABLE 0x01000000 /* Disable of Flow Control */
4223 +#define PCIE_LSR_ACKNAK_DISABLE 0x02000000 /* Disable of Ack/Nak */
4224 +#define PCIE_LSR_LANE_DESKEW_DISABLE 0x80000000 /* Disable of Lane-to-Lane Skew */
4226 +/* Symbol Number Register */
4227 +#define PCIE_SNR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x718)
4228 +#define PCIE_SNR_TS 0x0000000F /* Number of TS Symbol */
4229 +#define PCIE_SNR_TS_S 0
4230 +#define PCIE_SNR_SKP 0x00000700 /* Number of SKP Symbol */
4231 +#define PCIE_SNR_SKP_S 8
4232 +#define PCIE_SNR_REPLAY_TIMER 0x0007C000 /* Timer Modifier for Replay Timer */
4233 +#define PCIE_SNR_REPLAY_TIMER_S 14
4234 +#define PCIE_SNR_ACKNAK_LATENCY_TIMER 0x00F80000 /* Timer Modifier for Ack/Nak Latency Timer */
4235 +#define PCIE_SNR_ACKNAK_LATENCY_TIMER_S 19
4236 +#define PCIE_SNR_FC_TIMER 0x1F000000 /* Timer Modifier for Flow Control Watchdog Timer */
4237 +#define PCIE_SNR_FC_TIMER_S 28
4239 +/* Symbol Timer Register and Filter Mask Register 1 */
4240 +#define PCIE_STRFMR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x71C)
4241 +#define PCIE_STRFMR_SKP_INTERVAL 0x000007FF /* SKP lnterval Value */
4242 +#define PCIE_STRFMR_SKP_INTERVAL_S 0
4243 +#define PCIE_STRFMR_FC_WDT_DISABLE 0x00008000 /* Disable of FC Watchdog Timer */
4244 +#define PCIE_STRFMR_TLP_FUNC_MISMATCH_OK 0x00010000 /* Mask Function Mismatch Filtering for Incoming Requests */
4245 +#define PCIE_STRFMR_POISONED_TLP_OK 0x00020000 /* Mask Poisoned TLP Filtering */
4246 +#define PCIE_STRFMR_BAR_MATCH_OK 0x00040000 /* Mask BAR Match Filtering */
4247 +#define PCIE_STRFMR_TYPE1_CFG_REQ_OK 0x00080000 /* Mask Type 1 Configuration Request Filtering */
4248 +#define PCIE_STRFMR_LOCKED_REQ_OK 0x00100000 /* Mask Locked Request Filtering */
4249 +#define PCIE_STRFMR_CPL_TAG_ERR_RULES_OK 0x00200000 /* Mask Tag Error Rules for Received Completions */
4250 +#define PCIE_STRFMR_CPL_REQUESTOR_ID_MISMATCH_OK 0x00400000 /* Mask Requester ID Mismatch Error for Received Completions */
4251 +#define PCIE_STRFMR_CPL_FUNC_MISMATCH_OK 0x00800000 /* Mask Function Mismatch Error for Received Completions */
4252 +#define PCIE_STRFMR_CPL_TC_MISMATCH_OK 0x01000000 /* Mask Traffic Class Mismatch Error for Received Completions */
4253 +#define PCIE_STRFMR_CPL_ATTR_MISMATCH_OK 0x02000000 /* Mask Attribute Mismatch Error for Received Completions */
4254 +#define PCIE_STRFMR_CPL_LENGTH_MISMATCH_OK 0x04000000 /* Mask Length Mismatch Error for Received Completions */
4255 +#define PCIE_STRFMR_TLP_ECRC_ERR_OK 0x08000000 /* Mask ECRC Error Filtering */
4256 +#define PCIE_STRFMR_CPL_TLP_ECRC_OK 0x10000000 /* Mask ECRC Error Filtering for Completions */
4257 +#define PCIE_STRFMR_RX_TLP_MSG_NO_DROP 0x20000000 /* Send Message TLPs */
4258 +#define PCIE_STRFMR_RX_IO_TRANS_ENABLE 0x40000000 /* Mask Filtering of received I/O Requests */
4259 +#define PCIE_STRFMR_RX_CFG_TRANS_ENABLE 0x80000000 /* Mask Filtering of Received Configuration Requests */
4261 +#define PCIE_DEF_SKP_INTERVAL 700 /* 1180 ~1538 , 125MHz * 2, 250MHz * 1 */
4263 +/* Filter Masker Register 2 */
4264 +#define PCIE_FMR2(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x720)
4265 +#define PCIE_FMR2_VENDOR_MSG0_PASSED_TO_TRGT1 0x00000001 /* Mask RADM Filtering and Error Handling Rules */
4266 +#define PCIE_FMR2_VENDOR_MSG1_PASSED_TO_TRGT1 0x00000002 /* Mask RADM Filtering and Error Handling Rules */
4268 +/* Debug Register 0 */
4269 +#define PCIE_DBR0(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x728)
4271 +/* Debug Register 1 */
4272 +#define PCIE_DBR1(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x72C)
4274 +/* Transmit Posted FC Credit Status Register */
4275 +#define PCIE_TPFCS(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x730)
4276 +#define PCIE_TPFCS_TX_P_DATA_FC_CREDITS 0x00000FFF /* Transmit Posted Data FC Credits */
4277 +#define PCIE_TPFCS_TX_P_DATA_FC_CREDITS_S 0
4278 +#define PCIE_TPFCS_TX_P_HDR_FC_CREDITS 0x000FF000 /* Transmit Posted Header FC Credits */
4279 +#define PCIE_TPFCS_TX_P_HDR_FC_CREDITS_S 12
4281 +/* Transmit Non-Posted FC Credit Status */
4282 +#define PCIE_TNPFCS(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x734)
4283 +#define PCIE_TNPFCS_TX_NP_DATA_FC_CREDITS 0x00000FFF /* Transmit Non-Posted Data FC Credits */
4284 +#define PCIE_TNPFCS_TX_NP_DATA_FC_CREDITS_S 0
4285 +#define PCIE_TNPFCS_TX_NP_HDR_FC_CREDITS 0x000FF000 /* Transmit Non-Posted Header FC Credits */
4286 +#define PCIE_TNPFCS_TX_NP_HDR_FC_CREDITS_S 12
4288 +/* Transmit Complete FC Credit Status Register */
4289 +#define PCIE_TCFCS(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x738)
4290 +#define PCIE_TCFCS_TX_CPL_DATA_FC_CREDITS 0x00000FFF /* Transmit Completion Data FC Credits */
4291 +#define PCIE_TCFCS_TX_CPL_DATA_FC_CREDITS_S 0
4292 +#define PCIE_TCFCS_TX_CPL_HDR_FC_CREDITS 0x000FF000 /* Transmit Completion Header FC Credits */
4293 +#define PCIE_TCFCS_TX_CPL_HDR_FC_CREDITS_S 12
4295 +/* Queue Status Register */
4296 +#define PCIE_QSR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x73C)
4297 +#define PCIE_QSR_WAIT_UPDATE_FC_DLL 0x00000001 /* Received TLP FC Credits Not Returned */
4298 +#define PCIE_QSR_TX_RETRY_BUF_NOT_EMPTY 0x00000002 /* Transmit Retry Buffer Not Empty */
4299 +#define PCIE_QSR_RX_QUEUE_NOT_EMPTY 0x00000004 /* Received Queue Not Empty */
4301 +/* VC Transmit Arbitration Register 1 */
4302 +#define PCIE_VCTAR1(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x740)
4303 +#define PCIE_VCTAR1_WRR_WEIGHT_VC0 0x000000FF /* WRR Weight for VC0 */
4304 +#define PCIE_VCTAR1_WRR_WEIGHT_VC1 0x0000FF00 /* WRR Weight for VC1 */
4305 +#define PCIE_VCTAR1_WRR_WEIGHT_VC2 0x00FF0000 /* WRR Weight for VC2 */
4306 +#define PCIE_VCTAR1_WRR_WEIGHT_VC3 0xFF000000 /* WRR Weight for VC3 */
4308 +/* VC Transmit Arbitration Register 2 */
4309 +#define PCIE_VCTAR2(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x744)
4310 +#define PCIE_VCTAR2_WRR_WEIGHT_VC4 0x000000FF /* WRR Weight for VC4 */
4311 +#define PCIE_VCTAR2_WRR_WEIGHT_VC5 0x0000FF00 /* WRR Weight for VC5 */
4312 +#define PCIE_VCTAR2_WRR_WEIGHT_VC6 0x00FF0000 /* WRR Weight for VC6 */
4313 +#define PCIE_VCTAR2_WRR_WEIGHT_VC7 0xFF000000 /* WRR Weight for VC7 */
4315 +/* VC0 Posted Receive Queue Control Register */
4316 +#define PCIE_VC0_PRQCR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x748)
4317 +#define PCIE_VC0_PRQCR_P_DATA_CREDITS 0x00000FFF /* VC0 Posted Data Credits */
4318 +#define PCIE_VC0_PRQCR_P_DATA_CREDITS_S 0
4319 +#define PCIE_VC0_PRQCR_P_HDR_CREDITS 0x000FF000 /* VC0 Posted Header Credits */
4320 +#define PCIE_VC0_PRQCR_P_HDR_CREDITS_S 12
4321 +#define PCIE_VC0_PRQCR_P_TLP_QUEUE_MODE 0x00E00000 /* VC0 Posted TLP Queue Mode */
4322 +#define PCIE_VC0_PRQCR_P_TLP_QUEUE_MODE_S 20
4323 +#define PCIE_VC0_PRQCR_TLP_RELAX_ORDER 0x40000000 /* TLP Type Ordering for VC0 */
4324 +#define PCIE_VC0_PRQCR_VC_STRICT_ORDER 0x80000000 /* VC0 Ordering for Receive Queues */
4326 +/* VC0 Non-Posted Receive Queue Control */
4327 +#define PCIE_VC0_NPRQCR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x74C)
4328 +#define PCIE_VC0_NPRQCR_NP_DATA_CREDITS 0x00000FFF /* VC0 Non-Posted Data Credits */
4329 +#define PCIE_VC0_NPRQCR_NP_DATA_CREDITS_S 0
4330 +#define PCIE_VC0_NPRQCR_NP_HDR_CREDITS 0x000FF000 /* VC0 Non-Posted Header Credits */
4331 +#define PCIE_VC0_NPRQCR_NP_HDR_CREDITS_S 12
4332 +#define PCIE_VC0_NPRQCR_NP_TLP_QUEUE_MODE 0x00E00000 /* VC0 Non-Posted TLP Queue Mode */
4333 +#define PCIE_VC0_NPRQCR_NP_TLP_QUEUE_MODE_S 20
4335 +/* VC0 Completion Receive Queue Control */
4336 +#define PCIE_VC0_CRQCR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x750)
4337 +#define PCIE_VC0_CRQCR_CPL_DATA_CREDITS 0x00000FFF /* VC0 Completion TLP Queue Mode */
4338 +#define PCIE_VC0_CRQCR_CPL_DATA_CREDITS_S 0
4339 +#define PCIE_VC0_CRQCR_CPL_HDR_CREDITS 0x000FF000 /* VC0 Completion Header Credits */
4340 +#define PCIE_VC0_CRQCR_CPL_HDR_CREDITS_S 12
4341 +#define PCIE_VC0_CRQCR_CPL_TLP_QUEUE_MODE 0x00E00000 /* VC0 Completion Data Credits */
4342 +#define PCIE_VC0_CRQCR_CPL_TLP_QUEUE_MODE_S 21
4344 +/* Applicable to the above three registers */
4346 + PCIE_VC0_TLP_QUEUE_MODE_STORE_FORWARD = 1,
4347 + PCIE_VC0_TLP_QUEUE_MODE_CUT_THROUGH = 2,
4348 + PCIE_VC0_TLP_QUEUE_MODE_BYPASS = 4,
4351 +/* VC0 Posted Buffer Depth Register */
4352 +#define PCIE_VC0_PBD(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x7A8)
4353 +#define PCIE_VC0_PBD_P_DATA_QUEUE_ENTRIES 0x00003FFF /* VC0 Posted Data Queue Depth */
4354 +#define PCIE_VC0_PBD_P_DATA_QUEUE_ENTRIES_S 0
4355 +#define PCIE_VC0_PBD_P_HDR_QUEUE_ENTRIES 0x03FF0000 /* VC0 Posted Header Queue Depth */
4356 +#define PCIE_VC0_PBD_P_HDR_QUEUE_ENTRIES_S 16
4358 +/* VC0 Non-Posted Buffer Depth Register */
4359 +#define PCIE_VC0_NPBD(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x7AC)
4360 +#define PCIE_VC0_NPBD_NP_DATA_QUEUE_ENTRIES 0x00003FFF /* VC0 Non-Posted Data Queue Depth */
4361 +#define PCIE_VC0_NPBD_NP_DATA_QUEUE_ENTRIES_S 0
4362 +#define PCIE_VC0_NPBD_NP_HDR_QUEUE_ENTRIES 0x03FF0000 /* VC0 Non-Posted Header Queue Depth */
4363 +#define PCIE_VC0_NPBD_NP_HDR_QUEUE_ENTRIES_S 16
4365 +/* VC0 Completion Buffer Depth Register */
4366 +#define PCIE_VC0_CBD(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x7B0)
4367 +#define PCIE_VC0_CBD_CPL_DATA_QUEUE_ENTRIES 0x00003FFF /* C0 Completion Data Queue Depth */
4368 +#define PCIE_VC0_CBD_CPL_DATA_QUEUE_ENTRIES_S 0
4369 +#define PCIE_VC0_CBD_CPL_HDR_QUEUE_ENTRIES 0x03FF0000 /* VC0 Completion Header Queue Depth */
4370 +#define PCIE_VC0_CBD_CPL_HDR_QUEUE_ENTRIES_S 16
4372 +/* PHY Status Register, all zeros in VR9 */
4373 +#define PCIE_PHYSR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x810)
4375 +/* PHY Control Register, all zeros in VR9 */
4376 +#define PCIE_PHYCR(X) (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x814)
4379 + * PCIe PDI PHY register definition, suppose all the following
4380 + * stuff is confidential.
4381 + * XXX, detailed bit definition
4383 +#define PCIE_PHY_PLL_CTRL1(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x22 << 1))
4384 +#define PCIE_PHY_PLL_CTRL2(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x23 << 1))
4385 +#define PCIE_PHY_PLL_CTRL3(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x24 << 1))
4386 +#define PCIE_PHY_PLL_CTRL4(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x25 << 1))
4387 +#define PCIE_PHY_PLL_CTRL5(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x26 << 1))
4388 +#define PCIE_PHY_PLL_CTRL6(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x27 << 1))
4389 +#define PCIE_PHY_PLL_CTRL7(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x28 << 1))
4390 +#define PCIE_PHY_PLL_A_CTRL1(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x29 << 1))
4391 +#define PCIE_PHY_PLL_A_CTRL2(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x2A << 1))
4392 +#define PCIE_PHY_PLL_A_CTRL3(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x2B << 1))
4393 +#define PCIE_PHY_PLL_STATUS(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x2C << 1))
4395 +#define PCIE_PHY_TX1_CTRL1(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x30 << 1))
4396 +#define PCIE_PHY_TX1_CTRL2(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x31 << 1))
4397 +#define PCIE_PHY_TX1_CTRL3(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x32 << 1))
4398 +#define PCIE_PHY_TX1_A_CTRL1(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x33 << 1))
4399 +#define PCIE_PHY_TX1_A_CTRL2(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x34 << 1))
4400 +#define PCIE_PHY_TX1_MOD1(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x35 << 1))
4401 +#define PCIE_PHY_TX1_MOD2(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x36 << 1))
4402 +#define PCIE_PHY_TX1_MOD3(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x37 << 1))
4404 +#define PCIE_PHY_TX2_CTRL1(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x38 << 1))
4405 +#define PCIE_PHY_TX2_CTRL2(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x39 << 1))
4406 +#define PCIE_PHY_TX2_A_CTRL1(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x3B << 1))
4407 +#define PCIE_PHY_TX2_A_CTRL2(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x3C << 1))
4408 +#define PCIE_PHY_TX2_MOD1(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x3D << 1))
4409 +#define PCIE_PHY_TX2_MOD2(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x3E << 1))
4410 +#define PCIE_PHY_TX2_MOD3(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x3F << 1))
4412 +#define PCIE_PHY_RX1_CTRL1(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x50 << 1))
4413 +#define PCIE_PHY_RX1_CTRL2(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x51 << 1))
4414 +#define PCIE_PHY_RX1_CDR(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x52 << 1))
4415 +#define PCIE_PHY_RX1_EI(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x53 << 1))
4416 +#define PCIE_PHY_RX1_A_CTRL(X) (PCIE_PHY_PORT_TO_BASE(X) + (0x55 << 1))
4418 +/* Interrupt related stuff */
4419 +#define PCIE_LEGACY_DISABLE 0
4420 +#define PCIE_LEGACY_INTA 1
4421 +#define PCIE_LEGACY_INTB 2
4422 +#define PCIE_LEGACY_INTC 3
4423 +#define PCIE_LEGACY_INTD 4
4424 +#define PCIE_LEGACY_INT_MAX PCIE_LEGACY_INTD
4426 +#endif /* IFXMIPS_PCIE_REG_H */
4428 diff --git a/arch/mips/pci/ifxmips_pcie_vr9.h b/arch/mips/pci/ifxmips_pcie_vr9.h
4429 new file mode 100644
4430 index 0000000..57d9368
4432 +++ b/arch/mips/pci/ifxmips_pcie_vr9.h
4434 +/****************************************************************************
4435 + Copyright (c) 2010
4436 + Lantiq Deutschland GmbH
4437 + Am Campeon 3; 85579 Neubiberg, Germany
4439 + For licensing information, see the file 'LICENSE' in the root folder of
4440 + this software module.
4442 + *****************************************************************************/
4444 + \file ifxmips_pcie_vr9.h
4446 + \brief PCIe RC driver vr9 specific file
4449 +#ifndef IFXMIPS_PCIE_VR9_H
4450 +#define IFXMIPS_PCIE_VR9_H
4452 +#include <linux/types.h>
4453 +#include <linux/delay.h>
4455 +#include <linux/gpio.h>
4456 +#include <lantiq_soc.h>
4458 +#define IFX_PCIE_GPIO_RESET 238
4460 +#define IFX_REG_R32 ltq_r32
4461 +#define IFX_REG_W32 ltq_w32
4462 +#define CONFIG_IFX_PCIE_HW_SWAP
4463 +#define IFX_RCU_AHB_ENDIAN ((volatile u32*)(IFX_RCU + 0x004C))
4464 +#define IFX_RCU_RST_REQ ((volatile u32*)(IFX_RCU + 0x0010))
4465 +#define IFX_RCU_AHB_BE_PCIE_PDI 0x00000080 /* Configure PCIE PDI module in big endian*/
4467 +#define IFX_RCU (KSEG1 | 0x1F203000)
4468 +#define IFX_RCU_AHB_BE_PCIE_M 0x00000001 /* Configure AHB master port that connects to PCIe RC in big endian */
4469 +#define IFX_RCU_AHB_BE_PCIE_S 0x00000010 /* Configure AHB slave port that connects to PCIe RC in little endian */
4470 +#define IFX_RCU_AHB_BE_XBAR_M 0x00000002 /* Configure AHB master port that connects to XBAR in big endian */
4471 +#define CONFIG_IFX_PCIE_PHY_36MHZ_MODE
4473 +#define IFX_PMU1_MODULE_PCIE_PHY (0)
4474 +#define IFX_PMU1_MODULE_PCIE_CTRL (1)
4475 +#define IFX_PMU1_MODULE_PDI (4)
4476 +#define IFX_PMU1_MODULE_MSI (5)
4478 +#define IFX_PMU_MODULE_PCIE_L0_CLK (31)
4481 +#define IFX_GPIO (KSEG1 | 0x1E100B00)
4482 +#define ALT0 ((volatile u32*)(IFX_GPIO + 0x007c))
4483 +#define ALT1 ((volatile u32*)(IFX_GPIO + 0x0080))
4484 +#define OD ((volatile u32*)(IFX_GPIO + 0x0084))
4485 +#define DIR ((volatile u32*)(IFX_GPIO + 0x0078))
4486 +#define OUT ((volatile u32*)(IFX_GPIO + 0x0070))
4489 +static inline void pcie_ep_gpio_rst_init(int pcie_port)
4492 + gpio_request(IFX_PCIE_GPIO_RESET, "pcie-reset");
4493 + gpio_direction_output(IFX_PCIE_GPIO_RESET, 1);
4494 + gpio_set_value(IFX_PCIE_GPIO_RESET, 1);
4496 +/* ifx_gpio_pin_reserve(IFX_PCIE_GPIO_RESET, ifx_pcie_gpio_module_id);
4497 + ifx_gpio_output_set(IFX_PCIE_GPIO_RESET, ifx_pcie_gpio_module_id);
4498 + ifx_gpio_dir_out_set(IFX_PCIE_GPIO_RESET, ifx_pcie_gpio_module_id);
4499 + ifx_gpio_altsel0_clear(IFX_PCIE_GPIO_RESET, ifx_pcie_gpio_module_id);
4500 + ifx_gpio_altsel1_clear(IFX_PCIE_GPIO_RESET, ifx_pcie_gpio_module_id);
4501 + ifx_gpio_open_drain_set(IFX_PCIE_GPIO_RESET, ifx_pcie_gpio_module_id);*/
4504 +static inline void pcie_ahb_pmu_setup(void)
4506 + /* Enable AHB bus master/slave */
4508 + clk = clk_get_sys("1d900000.pcie", "ahb");
4511 + //AHBM_PMU_SETUP(IFX_PMU_ENABLE);
4512 + //AHBS_PMU_SETUP(IFX_PMU_ENABLE);
4515 +static inline void pcie_rcu_endian_setup(int pcie_port)
4519 + reg = IFX_REG_R32(IFX_RCU_AHB_ENDIAN);
4520 +#ifdef CONFIG_IFX_PCIE_HW_SWAP
4521 + reg |= IFX_RCU_AHB_BE_PCIE_M;
4522 + reg |= IFX_RCU_AHB_BE_PCIE_S;
4523 + reg &= ~IFX_RCU_AHB_BE_XBAR_M;
4525 + reg |= IFX_RCU_AHB_BE_PCIE_M;
4526 + reg &= ~IFX_RCU_AHB_BE_PCIE_S;
4527 + reg &= ~IFX_RCU_AHB_BE_XBAR_M;
4528 +#endif /* CONFIG_IFX_PCIE_HW_SWAP */
4529 + IFX_REG_W32(reg, IFX_RCU_AHB_ENDIAN);
4530 + IFX_PCIE_PRINT(PCIE_MSG_REG, "%s IFX_RCU_AHB_ENDIAN: 0x%08x\n", __func__, IFX_REG_R32(IFX_RCU_AHB_ENDIAN));
4533 +static inline void pcie_phy_pmu_enable(int pcie_port)
4536 + clk = clk_get_sys("1d900000.pcie", "phy");
4539 + //PCIE_PHY_PMU_SETUP(IFX_PMU_ENABLE);
4542 +static inline void pcie_phy_pmu_disable(int pcie_port)
4545 + clk = clk_get_sys("1d900000.pcie", "phy");
4548 +// PCIE_PHY_PMU_SETUP(IFX_PMU_DISABLE);
4551 +static inline void pcie_pdi_big_endian(int pcie_port)
4555 + /* SRAM2PDI endianness control. */
4556 + reg = IFX_REG_R32(IFX_RCU_AHB_ENDIAN);
4557 + /* Config AHB->PCIe and PDI endianness */
4558 + reg |= IFX_RCU_AHB_BE_PCIE_PDI;
4559 + IFX_REG_W32(reg, IFX_RCU_AHB_ENDIAN);
4562 +static inline void pcie_pdi_pmu_enable(int pcie_port)
4564 + /* Enable PDI to access PCIe PHY register */
4566 + clk = clk_get_sys("1d900000.pcie", "pdi");
4568 + //PDI_PMU_SETUP(IFX_PMU_ENABLE);
4571 +static inline void pcie_core_rst_assert(int pcie_port)
4575 + reg = IFX_REG_R32(IFX_RCU_RST_REQ);
4577 + /* Reset PCIe PHY & Core, bit 22, bit 26 may be affected if write it directly */
4578 + reg |= 0x00400000;
4579 + IFX_REG_W32(reg, IFX_RCU_RST_REQ);
4582 +static inline void pcie_core_rst_deassert(int pcie_port)
4586 + /* Make sure one micro-second delay */
4589 + /* Reset PCIe PHY & Core, bit 22 */
4590 + reg = IFX_REG_R32(IFX_RCU_RST_REQ);
4591 + reg &= ~0x00400000;
4592 + IFX_REG_W32(reg, IFX_RCU_RST_REQ);
4595 +static inline void pcie_phy_rst_assert(int pcie_port)
4599 + reg = IFX_REG_R32(IFX_RCU_RST_REQ);
4600 + reg |= 0x00001000; /* Bit 12 */
4601 + IFX_REG_W32(reg, IFX_RCU_RST_REQ);
4604 +static inline void pcie_phy_rst_deassert(int pcie_port)
4608 + /* Make sure one micro-second delay */
4611 + reg = IFX_REG_R32(IFX_RCU_RST_REQ);
4612 + reg &= ~0x00001000; /* Bit 12 */
4613 + IFX_REG_W32(reg, IFX_RCU_RST_REQ);
4616 +static inline void pcie_device_rst_assert(int pcie_port)
4618 + printk("%s:%s[%d]\n", __FILE__, __func__, __LINE__);
4619 + gpio_set_value(IFX_PCIE_GPIO_RESET, 0);
4620 +// ifx_gpio_output_clear(IFX_PCIE_GPIO_RESET, ifx_pcie_gpio_module_id);
4623 +static inline void pcie_device_rst_deassert(int pcie_port)
4626 + printk("%s:%s[%d]\n", __FILE__, __func__, __LINE__);
4627 + gpio_direction_output(IFX_PCIE_GPIO_RESET, 1);
4628 +// gpio_set_value(IFX_PCIE_GPIO_RESET, 1);
4629 + //ifx_gpio_output_set(IFX_PCIE_GPIO_RESET, ifx_pcie_gpio_module_id);
4632 +static inline void pcie_core_pmu_setup(int pcie_port)
4635 + clk = clk_get_sys("1d900000.pcie", "ctl");
4637 + clk = clk_get_sys("1d900000.pcie", "bus");
4640 + /* PCIe Core controller enabled */
4641 +// PCIE_CTRL_PMU_SETUP(IFX_PMU_ENABLE);
4643 + /* Enable PCIe L0 Clock */
4644 +// PCIE_L0_CLK_PMU_SETUP(IFX_PMU_ENABLE);
4647 +static inline void pcie_msi_init(int pcie_port)
4650 + pcie_msi_pic_init(pcie_port);
4651 + clk = clk_get_sys("ltq_pcie", "msi");
4653 +// MSI_PMU_SETUP(IFX_PMU_ENABLE);
4657 +ifx_pcie_bus_nr_deduct(u32 bus_number, int pcie_port)
4659 + u32 tbus_number = bus_number;
4661 +#ifdef CONFIG_IFX_PCI
4662 + if (pcibios_host_nr() > 1) {
4663 + tbus_number -= pcibios_1st_host_bus_nr();
4665 +#endif /* CONFIG_IFX_PCI */
4666 + return tbus_number;
4670 +ifx_pcie_bus_enum_hack(struct pci_bus *bus, u32 devfn, int where, u32 value, int pcie_port, int read)
4672 + struct pci_dev *pdev;
4673 + u32 tvalue = value;
4675 + /* Sanity check */
4676 + pdev = pci_get_slot(bus, devfn);
4677 + if (pdev == NULL) {
4681 + /* Only care about PCI bridge */
4682 + if (pdev->hdr_type != PCI_HEADER_TYPE_BRIDGE) {
4686 + if (read) { /* Read hack */
4687 + #ifdef CONFIG_IFX_PCI
4688 + if (pcibios_host_nr() > 1) {
4689 + tvalue = ifx_pcie_bus_enum_read_hack(where, tvalue);
4691 + #endif /* CONFIG_IFX_PCI */
4693 + else { /* Write hack */
4694 + #ifdef CONFIG_IFX_PCI
4695 + if (pcibios_host_nr() > 1) {
4696 + tvalue = ifx_pcie_bus_enum_write_hack(where, tvalue);
4703 +#endif /* IFXMIPS_PCIE_VR9_H */
4705 diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c
4706 index a184344..35ca57f 100644
4707 --- a/arch/mips/pci/pci.c
4708 +++ b/arch/mips/pci/pci.c
4709 @@ -249,6 +249,31 @@ static int __init pcibios_init(void)
4711 subsys_initcall(pcibios_init);
4713 +int pcibios_host_nr(void)
4716 + struct pci_controller *hose;
4717 + for (count = 0, hose = hose_head; hose; hose = hose->next, count++) {
4722 +EXPORT_SYMBOL(pcibios_host_nr);
4724 +int pcibios_1st_host_bus_nr(void)
4727 + struct pci_controller *hose = hose_head;
4729 + if (hose != NULL) {
4730 + if (hose->bus != NULL) {
4731 + bus_nr = hose->bus->number + 1;
4736 +EXPORT_SYMBOL(pcibios_1st_host_bus_nr);
4738 static int pcibios_enable_resources(struct pci_dev *dev, int mask)
4741 diff --git a/drivers/pci/pcie/aer/Kconfig b/drivers/pci/pcie/aer/Kconfig
4742 index 50e94e0..4bf848f 100644
4743 --- a/drivers/pci/pcie/aer/Kconfig
4744 +++ b/drivers/pci/pcie/aer/Kconfig
4747 boolean "Root Port Advanced Error Reporting support"
4748 depends on PCIEPORTBUS
4752 This enables PCI Express Root Port Advanced Error Reporting
4753 (AER) driver support. Error reporting messages sent to Root
4754 diff --git a/include/linux/pci.h b/include/linux/pci.h
4755 index 15472d6..73b6926 100644
4756 --- a/include/linux/pci.h
4757 +++ b/include/linux/pci.h
4758 @@ -1059,6 +1059,8 @@ void pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *),
4759 int pci_cfg_space_size_ext(struct pci_dev *dev);
4760 int pci_cfg_space_size(struct pci_dev *dev);
4761 unsigned char pci_bus_max_busnr(struct pci_bus *bus);
4762 +int pcibios_host_nr(void);
4763 +int pcibios_1st_host_bus_nr(void);
4764 void pci_setup_bridge(struct pci_bus *bus);
4765 resource_size_t pcibios_window_alignment(struct pci_bus *bus,
4766 unsigned long type);
4767 diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
4768 index 0eb6579..81adb58 100644
4769 --- a/include/linux/pci_ids.h
4770 +++ b/include/linux/pci_ids.h
4771 @@ -1040,6 +1040,12 @@
4772 #define PCI_DEVICE_ID_SGI_LITHIUM 0x1002
4773 #define PCI_DEVICE_ID_SGI_IOC4 0x100a
4775 +#define PCI_VENDOR_ID_INFINEON 0x15D1
4776 +#define PCI_DEVICE_ID_INFINEON_DANUBE 0x000F
4777 +#define PCI_DEVICE_ID_INFINEON_PCIE 0x0011
4778 +#define PCI_VENDOR_ID_LANTIQ 0x1BEF
4779 +#define PCI_DEVICE_ID_LANTIQ_PCIE 0x00
4781 #define PCI_VENDOR_ID_WINBOND 0x10ad
4782 #define PCI_DEVICE_ID_WINBOND_82C105 0x0105
4783 #define PCI_DEVICE_ID_WINBOND_83C553 0x0565