[lantiq] add phy-reset gpio handling to xrx200-net
[openwrt.git] / target / linux / lantiq / patches-3.7 / 0122-MIPS-lantiq-adds-pcie-driver.patch
1 From b0b68cd5b5da72950863af882c368f28f65690e8 Mon Sep 17 00:00:00 2001
2 From: John Crispin <blogic@openwrt.org>
3 Date: Thu, 6 Dec 2012 11:43:53 +0100
4 Subject: [PATCH 122/123] MIPS: lantiq: adds pcie driver
5
6 ---
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 100755 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
38
39 diff --git a/arch/mips/lantiq/Kconfig b/arch/mips/lantiq/Kconfig
40 index edeb58c..116765a 100644
41 --- a/arch/mips/lantiq/Kconfig
42 +++ b/arch/mips/lantiq/Kconfig
43 @@ -17,6 +17,7 @@ config SOC_XWAY
44         bool "XWAY"
45         select SOC_TYPE_XWAY
46         select HW_HAS_PCI
47 +       select ARCH_SUPPORTS_MSI
48  
49  config SOC_FALCON
50         bool "FALCON"
51 @@ -40,6 +41,15 @@ config PCI_LANTIQ
52         bool "PCI Support"
53         depends on SOC_XWAY && PCI
54  
55 +config PCIE_LANTIQ
56 +       bool "PCIE Support"
57 +       depends on SOC_XWAY && PCI
58 +
59 +config PCIE_LANTIQ_MSI
60 +       bool
61 +       depends on PCIE_LANTIQ && PCI_MSI
62 +       default y
63 +
64  config XRX200_PHY_FW
65         bool "XRX200 PHY firmware loader"
66         depends on SOC_XWAY
67 diff --git a/arch/mips/lantiq/xway/sysctrl.c b/arch/mips/lantiq/xway/sysctrl.c
68 index 75e1b7d..b077d49 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 e13a71c..46d7096 100644
82 --- a/arch/mips/pci/Makefile
83 +++ b/arch/mips/pci/Makefile
84 @@ -44,6 +44,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
94 new file mode 100644
95 index 0000000..50a1c3b
96 --- /dev/null
97 +++ b/arch/mips/pci/fixup-lantiq-pcie.c
98 @@ -0,0 +1,82 @@
99 +/******************************************************************************
100 +**
101 +** FILE NAME    : ifxmips_fixup_pcie.c
102 +** PROJECT      : IFX UEIP for VRX200
103 +** MODULES      : PCIe 
104 +**
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
111 +**
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.
116 +** HISTORY
117 +** $Version $Date        $Author         $Comment
118 +** 0.0.1    17 Mar,2009  Lei Chuanhua    Initial version
119 +*******************************************************************************/
120 +/*!
121 + \file ifxmips_fixup_pcie.c
122 + \ingroup IFX_PCIE  
123 + \brief PCIe Fixup functions source file
124 +*/
125 +#include <linux/pci.h>
126 +#include <linux/pci_regs.h>
127 +#include <linux/pci_ids.h>
128 +
129 +#include <lantiq_soc.h>
130 +
131 +#include "pcie-lantiq.h"
132 +
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
138 +
139 +
140 +
141 +static void __devinit
142 +ifx_pcie_fixup_resource(struct pci_dev *dev)
143 +{
144 +    u32 reg;
145 +
146 +    IFX_PCIE_PRINT(PCIE_MSG_FIXUP, "%s dev %s: enter\n", __func__, pci_name(dev));
147 +
148 +    printk("%s: fixup host controller %s (%04x:%04x)\n", 
149 +        __func__, pci_name(dev), dev->vendor, dev->device); 
150 +
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));
156 +}
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);
159 +
160 +static void __devinit
161 +ifx_pcie_rc_class_early_fixup(struct pci_dev *dev)
162 +{
163 +    IFX_PCIE_PRINT(PCIE_MSG_FIXUP, "%s dev %s: enter\n", __func__, pci_name(dev));
164 +
165 +    if (dev->devfn == PCI_DEVFN(0, 0) &&
166 +        (dev->class >> 8) == PCI_CLASS_BRIDGE_HOST) {
167 +
168 +        dev->class = (PCI_CLASS_BRIDGE_PCI << 8) | (dev->class & 0xff);
169 +
170 +        printk(KERN_INFO "%s: fixed pcie host bridge to pci-pci bridge\n", __func__);
171 +    }
172 +    IFX_PCIE_PRINT(PCIE_MSG_FIXUP, "%s dev %s: exit\n", __func__, pci_name(dev));
173 +    mdelay(10);
174 +}
175 +
176 +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INFINEON, PCI_DEVICE_ID_INFINEON_PCIE,
177 +     ifx_pcie_rc_class_early_fixup);
178 +
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
185 @@ -11,6 +11,7 @@
186  
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);
190  
191  int pcibios_plat_dev_init(struct pci_dev *dev)
192  {
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;
195         int irq;
196  
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",
201                         slot, pin);
202 diff --git a/arch/mips/pci/ifxmips_pci_common.h b/arch/mips/pci/ifxmips_pci_common.h
203 new file mode 100755
204 index 0000000..5f6ab83
205 --- /dev/null
206 +++ b/arch/mips/pci/ifxmips_pci_common.h
207 @@ -0,0 +1,57 @@
208 +/******************************************************************************\r
209 +**\r
210 +** FILE NAME    : ifxmips_pci_common.h\r
211 +** PROJECT      : IFX UEIP\r
212 +** MODULES      : PCI subsystem\r
213 +**\r
214 +** DATE         : 30 June 2009\r
215 +** AUTHOR       : Lei Chuanhua\r
216 +** DESCRIPTION  : PCIe Root Complex Driver\r
217 +** COPYRIGHT    :       Copyright (c) 2009\r
218 +**                      Infineon Technologies AG\r
219 +**                      Am Campeon 1-12, 85579 Neubiberg, Germany\r
220 +**\r
221 +**    This program is free software; you can redistribute it and/or modify\r
222 +**    it under the terms of the GNU General Public License as published by\r
223 +**    the Free Software Foundation; either version 2 of the License, or\r
224 +**    (at your option) any later version.\r
225 +** HISTORY\r
226 +** $Version $Date        $Author         $Comment\r
227 +** 0.0.1    30 June,2009  Lei Chuanhua    Initial version\r
228 +*******************************************************************************/\r
229 +\r
230 +#ifndef IFXMIPS_PCI_COMMON_H\r
231 +#define IFXMIPS_PCI_COMMON_H\r
232 +#include <linux/version.h>\r
233 +/*!\r
234 + \defgroup IFX_PCI_COM  IFX PCI/PCIe common parts for OS integration  \r
235 + \brief  PCI/PCIe common parts\r
236 +*/\r
237 +\r
238 +/*!\r
239 + \defgroup IFX_PCI_COM_OS OS APIs\r
240 + \ingroup IFX_PCI_COM\r
241 + \brief PCI/PCIe bus driver OS interface functions\r
242 +*/\r
243 +/*!\r
244 +  \file ifxmips_pci_common.h\r
245 +  \ingroup IFX_PCI_COM\r
246 +  \brief PCI/PCIe bus driver common OS header file\r
247 +*/\r
248 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)\r
249 +#define IFX_PCI_CONST\r
250 +#else\r
251 +#define IFX_PCI_CONST const\r
252 +#endif\r
253 +#ifdef CONFIG_IFX_PCI\r
254 +extern int ifx_pci_bios_map_irq(IFX_PCI_CONST struct pci_dev *dev, u8 slot, u8 pin);\r
255 +extern int ifx_pci_bios_plat_dev_init(struct pci_dev *dev);\r
256 +#endif /* COFNIG_IFX_PCI */\r
257 +\r
258 +#ifdef CONFIG_IFX_PCIE\r
259 +extern int ifx_pcie_bios_map_irq(IFX_PCI_CONST struct pci_dev *dev, u8 slot, u8 pin);\r
260 +extern int ifx_pcie_bios_plat_dev_init(struct pci_dev *dev);\r
261 +#endif\r
262 +\r
263 +#endif /* IFXMIPS_PCI_COMMON_H */\r
264 +\r
265 diff --git a/arch/mips/pci/ifxmips_pcie.c b/arch/mips/pci/ifxmips_pcie.c
266 new file mode 100644
267 index 0000000..de6e2fa
268 --- /dev/null
269 +++ b/arch/mips/pci/ifxmips_pcie.c
270 @@ -0,0 +1,1607 @@
271 +/******************************************************************************\r
272 +**\r
273 +** FILE NAME    : ifxmips_pcie.c\r
274 +** PROJECT      : IFX UEIP for VRX200\r
275 +** MODULES      : PCI MSI sub module\r
276 +**\r
277 +** DATE         : 02 Mar 2009\r
278 +** AUTHOR       : Lei Chuanhua\r
279 +** DESCRIPTION  : PCIe Root Complex Driver\r
280 +** COPYRIGHT    :       Copyright (c) 2009\r
281 +**                      Infineon Technologies AG\r
282 +**                      Am Campeon 1-12, 85579 Neubiberg, Germany\r
283 +**\r
284 +**    This program is free software; you can redistribute it and/or modify\r
285 +**    it under the terms of the GNU General Public License as published by\r
286 +**    the Free Software Foundation; either version 2 of the License, or\r
287 +**    (at your option) any later version.\r
288 +** HISTORY\r
289 +** $Version $Date        $Author         $Comment\r
290 +** 0.0.1    02 Mar,2009  Lei Chuanhua    Initial version\r
291 +*******************************************************************************/\r
292 + /*!\r
293 +  \file ifxmips_pcie.c\r
294 +  \ingroup IFX_PCIE\r
295 +  \brief PCI express bus driver source file\r
296 +*/\r
297 +#include <linux/types.h>\r
298 +#include <linux/pci.h>\r
299 +#include <linux/kernel.h>\r
300 +#include <linux/init.h>\r
301 +#include <linux/delay.h>\r
302 +#include <linux/mm.h>\r
303 +#include <asm/paccess.h>\r
304 +#include <linux/pci.h>\r
305 +#include <linux/pci_regs.h>\r
306 +#include <linux/module.h>\r
307 +\r
308 +#include "ifxmips_pcie.h"\r
309 +#include "ifxmips_pcie_reg.h"\r
310 +\r
311 +#define IFX_PCIE_VER_MAJOR          1\r
312 +#define IFX_PCIE_VER_MID            5\r
313 +#define IFX_PCIE_VER_MINOR          3\r
314 +\r
315 +/* Enable 32bit io due to its mem mapped io nature */\r
316 +#define IFX_PCIE_ERROR_INT\r
317 +#define CONFIG_IFX_PCIE_1ST_CORE\r
318 +#define IFX_PCIE_IO_32BIT\r
319 +\r
320 +#define IFX_PCIE_IR                     (INT_NUM_IM4_IRL0 + 25)\r
321 +#define IFX_PCIE_INTA                   (INT_NUM_IM4_IRL0 + 8)\r
322 +#define IFX_PCIE_INTB                   (INT_NUM_IM4_IRL0 + 9)\r
323 +#define IFX_PCIE_INTC                   (INT_NUM_IM4_IRL0 + 10)\r
324 +#define IFX_PCIE_INTD                   (INT_NUM_IM4_IRL0 + 11)\r
325 +#define MS(_v, _f)  (((_v) & (_f)) >> _f##_S)\r
326 +#define SM(_v, _f)  (((_v) << _f##_S) & (_f))\r
327 +#define IFX_REG_SET_BIT(_f, _r) \\r
328 +       IFX_REG_W32((IFX_REG_R32((_r)) &~ (_f)) | (_f), (_r))\r
329 +\r
330 +static DEFINE_SPINLOCK(ifx_pcie_lock);\r
331 +\r
332 +u32 g_pcie_debug_flag = PCIE_MSG_ANY & (~PCIE_MSG_CFG);\r
333 +\r
334 +static ifx_pcie_irq_t pcie_irqs[IFX_PCIE_CORE_NR] = {\r
335 +    {\r
336 +        .ir_irq = {\r
337 +            .irq  = IFX_PCIE_IR,\r
338 +            .name = "ifx_pcie_rc0",\r
339 +        },\r
340 +\r
341 +        .legacy_irq = {\r
342 +            {\r
343 +                .irq_bit = PCIE_IRN_INTA,\r
344 +                .irq     = IFX_PCIE_INTA,\r
345 +            },\r
346 +            {\r
347 +                .irq_bit = PCIE_IRN_INTB,\r
348 +                .irq     = IFX_PCIE_INTB,\r
349 +            },\r
350 +            {\r
351 +                .irq_bit = PCIE_IRN_INTC,\r
352 +                .irq     = IFX_PCIE_INTC,\r
353 +            },\r
354 +            {\r
355 +                .irq_bit = PCIE_IRN_INTD,\r
356 +                .irq     = IFX_PCIE_INTD,\r
357 +            },\r
358 +        },\r
359 +    },\r
360 +\r
361 +#ifdef CONFIG_IFX_PCIE_2ND_CORE\r
362 +    {\r
363 +        .ir_irq = {\r
364 +            .irq  = IFX_PCIE1_IR,\r
365 +            .name = "ifx_pcie_rc1",\r
366 +        },\r
367 +\r
368 +        .legacy_irq = {\r
369 +            {\r
370 +                .irq_bit = PCIE_IRN_INTA,\r
371 +                .irq     = IFX_PCIE1_INTA,\r
372 +            },\r
373 +            {\r
374 +                .irq_bit = PCIE_IRN_INTB,\r
375 +                .irq     = IFX_PCIE1_INTB,\r
376 +            },\r
377 +            {\r
378 +                .irq_bit = PCIE_IRN_INTC,\r
379 +                .irq     = IFX_PCIE1_INTC,\r
380 +            },\r
381 +            {\r
382 +                .irq_bit = PCIE_IRN_INTD,\r
383 +                .irq     = IFX_PCIE1_INTD,\r
384 +            },\r
385 +        },\r
386 +\r
387 +    },\r
388 +#endif /* CONFIG_IFX_PCIE_2ND_CORE */\r
389 +};\r
390 +\r
391 +void \r
392 +ifx_pcie_debug(const char *fmt, ...)\r
393 +{\r
394 +    static char buf[256] = {0};      /* XXX */\r
395 +    va_list ap;\r
396 +\r
397 +    va_start(ap, fmt);\r
398 +    vsnprintf(buf, sizeof(buf), fmt, ap);\r
399 +    va_end(ap); \r
400 +\r
401 +    printk("%s", buf);\r
402 +}\r
403 +\r
404 +#ifdef IFX_PCI_PHY_DBG\r
405 +/* Generate hot reset, XXX must catpure to verify */\r
406 +static INLINE void \r
407 +pcie_secondary_bus_reset(int pcie_port)\r
408 +{\r
409 +    int i;\r
410 +    u32 reg;\r
411 +#define IFX_PCIE_RESET_TIME   20\r
412 +\r
413 +    /* Assert Secondary Bus Reset */\r
414 +    reg = IFX_REG_R32(PCIE_INTRBCTRL(pcie_port));\r
415 +    reg |= PCIE_INTRBCTRL_RST_SECONDARY_BUS;\r
416 +    IFX_REG_W32(reg, PCIE_INTRBCTRL(pcie_port));\r
417 +\r
418 +    /* De-assert Secondary Bus Reset */\r
419 +    reg &= ~PCIE_INTRBCTRL_RST_SECONDARY_BUS;\r
420 +    IFX_REG_W32(reg, PCIE_INTRBCTRL(pcie_port));\r
421 +\r
422 +    /* XXX, wait at least 100 ms, then restore again */\r
423 +    for (i = 0; i < IFX_PCIE_RESET_TIME; i++) {\r
424 +        mdelay(10);\r
425 +    }\r
426 +#undef IFX_PCIE_RESET_TIME\r
427 +}\r
428 +\r
429 +/* Error or L0s to L0 */\r
430 +static INLINE int \r
431 +pcie_retrain_link(int pcie_port)\r
432 +{\r
433 +    int i;\r
434 +    u32 reg;\r
435 +#define IFX_PCIE_RETRAIN_TIME  1000\r
436 +\r
437 +    reg = IFX_REG_R32(PCIE_LCTLSTS(pcie_port));\r
438 +    reg |= PCIE_LCTLSTS_RETRIAN_LINK;\r
439 +    IFX_REG_W32(reg, PCIE_LCTLSTS(pcie_port));\r
440 +\r
441 +    /* Wait for the link to come up */\r
442 +    for (i = 0; i < IFX_PCIE_RETRAIN_TIME; i++) {\r
443 +        if (!(IFX_REG_R32(PCIE_LCTLSTS(pcie_port)) & PCIE_LCTLSTS_RETRAIN_PENDING)) {\r
444 +            break;\r
445 +        }\r
446 +        udelay(100);\r
447 +    }\r
448 +    if (i >= IFX_PCIE_RETRAIN_TIME) {\r
449 +        IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s retrain timeout\n", __func__);\r
450 +        return -1;\r
451 +    }\r
452 +    return 0;\r
453 +#undef IFX_PCIE_RETRAIN_TIME\r
454 +}\r
455 +\r
456 +static INLINE void \r
457 +pcie_disable_scrambling(int pcie_port)\r
458 +{\r
459 +    u32 reg;\r
460 +\r
461 +    reg = IFX_REG_R32(PCIE_PLCR(pcie_port));\r
462 +    reg |= PCIE_PLCR_SCRAMBLE_DISABLE;\r
463 +    IFX_REG_W32(reg, PCIE_PLCR(pcie_port));\r
464 +}\r
465 +#endif /* IFX_PCI_PHY_DBG */\r
466 +\r
467 +static INLINE int \r
468 +pcie_ltssm_enable(int pcie_port) \r
469 +{\r
470 +    int i;\r
471 +#define IFX_PCIE_LTSSM_ENABLE_TIMEOUT 10\r
472 +\r
473 +    IFX_REG_W32(PCIE_RC_CCR_LTSSM_ENABLE, PCIE_RC_CCR(pcie_port)); /* Enable LTSSM */\r
474 +\r
475 +    /* Wait for the link to come up */\r
476 +    for (i = 0; i < IFX_PCIE_LTSSM_ENABLE_TIMEOUT; i++) {\r
477 +        if (!(IFX_REG_R32(PCIE_LCTLSTS(pcie_port)) & PCIE_LCTLSTS_RETRAIN_PENDING)) {\r
478 +            break;\r
479 +        }\r
480 +        udelay(10);\r
481 +    }\r
482 +    if (i >= IFX_PCIE_LTSSM_ENABLE_TIMEOUT) {\r
483 +        IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s link timeout!!!!!\n", __func__);\r
484 +        return -1;\r
485 +    }\r
486 +    return 0;\r
487 +#undef IFX_PCIE_LTSSM_ENABLE_TIMEOUT\r
488 +}\r
489 +\r
490 +static INLINE void \r
491 +pcie_ltssm_disable(int pcie_port) \r
492 +{\r
493 +    IFX_REG_W32(0, PCIE_RC_CCR(pcie_port)); /* Disable LTSSM */\r
494 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_RC_CCR 0x%08x\n", \r
495 +        __func__, IFX_REG_R32(PCIE_RC_CCR(pcie_port)));\r
496 +}\r
497 +\r
498 +static INLINE void\r
499 +pcie_ahb_bus_error_suppress(int pcie_port)\r
500 +{\r
501 +    IFX_REG_W32(PCIE_AHB_CTRL_BUS_ERROR_SUPPRESS, PCIE_AHB_CTRL(pcie_port));\r
502 +}\r
503 +\r
504 +static INLINE void \r
505 +pcie_status_register_clear(int pcie_port)\r
506 +{\r
507 +   /* Clear the status register, XXX, seperate function */\r
508 +    IFX_REG_W32(0, PCIE_RC_DR(pcie_port));\r
509 +    IFX_REG_W32(0, PCIE_PCICMDSTS(pcie_port));\r
510 +    IFX_REG_W32(0, PCIE_DCTLSTS(pcie_port));\r
511 +    IFX_REG_W32(0, PCIE_LCTLSTS(pcie_port));\r
512 +    IFX_REG_W32(0, PCIE_SLCTLSTS(pcie_port));\r
513 +    IFX_REG_W32(0, PCIE_RSTS(pcie_port));\r
514 +    IFX_REG_W32(0, PCIE_UES_R(pcie_port));\r
515 +    IFX_REG_W32(0, PCIE_UEMR(pcie_port));\r
516 +    IFX_REG_W32(0, PCIE_UESR(pcie_port));\r
517 +    IFX_REG_W32(0, PCIE_CESR(pcie_port));\r
518 +    IFX_REG_W32(0, PCIE_CEMR(pcie_port));\r
519 +    IFX_REG_W32(0, PCIE_RESR(pcie_port));\r
520 +    IFX_REG_W32(0, PCIE_PVCCRSR(pcie_port));\r
521 +    IFX_REG_W32(0, PCIE_VC0_RSR0(pcie_port));\r
522 +    IFX_REG_W32(0, PCIE_TPFCS(pcie_port));\r
523 +    IFX_REG_W32(0, PCIE_TNPFCS(pcie_port));\r
524 +    IFX_REG_W32(0, PCIE_TCFCS(pcie_port));\r
525 +    IFX_REG_W32(0, PCIE_QSR(pcie_port));\r
526 +    IFX_REG_W32(0, PCIE_IOBLSECS(pcie_port));\r
527 +}\r
528 +\r
529 +static inline int \r
530 +ifx_pcie_link_up(int pcie_port)\r
531 +{\r
532 +    return (IFX_REG_R32(PCIE_PHY_SR(pcie_port)) & PCIE_PHY_SR_PHY_LINK_UP) ? 1 : 0;\r
533 +}\r
534 +\r
535 +#ifdef IFX_PCIE_DBG\r
536 +static void \r
537 +pcie_status_registers_dump(int pcie_port)\r
538 +{\r
539 +    printk(KERN_INFO "PCIe_PCICMDSTS: 0x%08x\n", IFX_REG_R32(PCIE_PCICMDSTS(pcie_port)));\r
540 +    printk(KERN_INFO "PCIe_RC_DR:     0x%08x\n", IFX_REG_R32(PCIE_RC_DR(pcie_port)));\r
541 +    printk(KERN_INFO "PCIe_DCTLSTS:   0x%08x\n", IFX_REG_R32(PCIE_DCTLSTS(pcie_port)));\r
542 +    printk(KERN_INFO "PCIe_LCTLSTS:   0x%08x\n", IFX_REG_R32(PCIE_LCTLSTS(pcie_port)));\r
543 +    printk(KERN_INFO "PCIe_SLCTLSTS:  0x%08x\n", IFX_REG_R32(PCIE_SLCTLSTS(pcie_port)));\r
544 +    printk(KERN_INFO "PCIe_RSTS:      0x%08x\n", IFX_REG_R32(PCIE_RSTS(pcie_port)));\r
545 +    printk(KERN_INFO "PCIe_UES_R:     0x%08x\n", IFX_REG_R32(PCIE_UES_R(pcie_port)));\r
546 +    printk(KERN_INFO "PCIe_UEMR:      0x%08x\n", IFX_REG_R32(PCIE_UEMR(pcie_port)));\r
547 +    printk(KERN_INFO "PCIe_UESR:      0x%08x\n", IFX_REG_R32(PCIE_UESR(pcie_port)));\r
548 +    printk(KERN_INFO "PCIe_CESR:      0x%08x\n", IFX_REG_R32(PCIE_CESR(pcie_port)));\r
549 +    printk(KERN_INFO "PCIe_CEMR:      0x%08x\n", IFX_REG_R32(PCIE_CEMR(pcie_port)));\r
550 +    printk(KERN_INFO "PCIe_RESR:      0x%08x\n", IFX_REG_R32(PCIE_RESR(pcie_port)));\r
551 +    printk(KERN_INFO "PCIe_ESIR:      0x%08x\n", IFX_REG_R32(PCIE_ESIR(pcie_port)));\r
552 +    printk(KERN_INFO "PCIe_PVCCRSR:   0x%08x\n", IFX_REG_R32(PCIE_PVCCRSR(pcie_port)));\r
553 +    printk(KERN_INFO "PCIe_VC0_RSR0:  0x%08x\n", IFX_REG_R32(PCIE_VC0_RSR0(pcie_port)));\r
554 +    printk(KERN_INFO "PCIe_TPFCS:     0x%08x\n", IFX_REG_R32(PCIE_TPFCS(pcie_port)));\r
555 +    printk(KERN_INFO "PCIe_TNPFCS:    0x%08x\n", IFX_REG_R32(PCIE_TNPFCS(pcie_port)));\r
556 +    printk(KERN_INFO "PCIe_TCFCS:     0x%08x\n", IFX_REG_R32(PCIE_TCFCS(pcie_port)));\r
557 +    printk(KERN_INFO "PCIe_QSR:       0x%08x\n", IFX_REG_R32(PCIE_QSR(pcie_port)));\r
558 +    printk(KERN_INFO "PCIe_VCTAR1:    0x%08x\n", IFX_REG_R32(PCIE_VCTAR1(pcie_port)));\r
559 +    printk(KERN_INFO "PCIe_VCTAR2:    0x%08x\n", IFX_REG_R32(PCIE_VCTAR2(pcie_port)));\r
560 +    printk(KERN_INFO "PCIe_IOBLSECS:  0x%08x\n", IFX_REG_R32(PCIE_IOBLSECS(pcie_port)));\r
561 +    printk(KERN_INFO "PCIe_ALTRT:     0x%08x\n", IFX_REG_R32(PCIE_ALTRT(pcie_port)));\r
562 +    printk(KERN_INFO "PCIe_SNR:       0x%08x\n", IFX_REG_R32(PCIE_SNR(pcie_port)));\r
563 +    printk(KERN_INFO "PCIe_DBR0:      0x%08x\n", IFX_REG_R32(PCIE_DBR0(pcie_port)));\r
564 +    printk(KERN_INFO "PCIe_DBR1:      0x%08x\n", IFX_REG_R32(PCIE_DBR1(pcie_port)));\r
565 +}\r
566 +\r
567 +static void \r
568 +pcie_post_dump(int pcie_port)\r
569 +{\r
570 +    printk(KERN_INFO "PCIe_PCICMDSTS:  0x%08x\n", IFX_REG_R32(PCIE_PCICMDSTS(pcie_port)));\r
571 +    printk(KERN_INFO "PCIe_MBML:       0x%08x\n", IFX_REG_R32(PCIE_MBML(pcie_port)));\r
572 +    printk(KERN_INFO "PCIe_PBML:       0x%08x\n", IFX_REG_R32(PCIE_PMBL(pcie_port)));\r
573 +    printk(KERN_INFO "PCIe_IOBLSECS:   0x%08x\n", IFX_REG_R32(PCIE_IOBLSECS(pcie_port)));\r
574 +    printk(KERN_INFO "PCIe_IO_BANDL:   0x%08x\n", IFX_REG_R32(PCIE_IO_BANDL(pcie_port)));\r
575 +    printk(KERN_INFO "PCIe_INTRBCTRL:  0x%08x\n", IFX_REG_R32(PCIE_INTRBCTRL(pcie_port)));\r
576 +    printk(KERN_INFO "Power State:     D%1d\n", IFX_REG_R32(PCIE_PM_CSR(pcie_port)) & PCIE_PM_CSR_POWER_STATE);\r
577 +    printk(KERN_INFO "Negotiated Link Width: %d\n", MS(IFX_REG_R32(PCIE_LCTLSTS(pcie_port)), PCIE_LCTLSTS_NEGOTIATED_LINK_WIDTH));\r
578 +    printk(KERN_INFO "Number of VCs:    %d\n", IFX_REG_R32(PCIE_PVC1(pcie_port)) & PCIE_PVC1_EXT_VC_CNT);\r
579 +    printk(KERN_INFO "Low-priority VCs: %d\n", MS(IFX_REG_R32(PCIE_PVC1(pcie_port)), PCIE_PVC1_LOW_PRI_EXT_VC_CNT));\r
580 +    printk(KERN_INFO "VC Arbitration:   0x%08x\n", IFX_REG_R32(PCIE_PVC2(pcie_port)) & PCIE_PVC2_VC_ARB_WRR);\r
581 +    printk(KERN_INFO "Port Arbitration: 0x%08x\n", IFX_REG_R32(PCIE_VC0_RC(pcie_port)) & PCIE_VC0_RC_PORT_ARB);\r
582 +\r
583 +    if (ifx_pcie_link_up(pcie_port)) {\r
584 +        printk(KERN_INFO "PCIe PHY Link is UP\n");\r
585 +    }\r
586 +    else {\r
587 +        printk(KERN_INFO "PCIe PHY Link is DOWN!\n");\r
588 +    }\r
589 +    if ((IFX_REG_R32(PCIE_RC_DR(pcie_port)) & PCIE_RC_DR_DLL_UP)) {\r
590 +        printk(KERN_INFO "PCIe DLL is UP\n");\r
591 +    }\r
592 +    else {\r
593 +        printk(KERN_INFO "PCIe DLL is DOWN!\n");\r
594 +    }\r
595 +\r
596 +    if ((IFX_REG_R32(PCIE_LCTLSTS(pcie_port)) & PCIE_LCTLSTS_DLL_ACTIVE)) {\r
597 +        printk(KERN_INFO "PCIE_LCTLSTS in DL_Active state!\n");\r
598 +    }\r
599 +    else {\r
600 +        printk(KERN_INFO "PCIE_LCTLSTS NOT in DL_Active state!\n");\r
601 +    }\r
602 + }\r
603 +#endif /* IFX_PCIE_DBG */\r
604 +\r
605 +/* XXX, this function is not needed in fact */\r
606 +static INLINE void\r
607 +pcie_mem_io_setup(int pcie_port)\r
608 +{\r
609 +    u32 reg;\r
610 +    /*\r
611 +     * BAR[0:1] readonly register \r
612 +     * RC contains only minimal BARs for packets mapped to this device \r
613 +     * Mem/IO filters defines a range of memory occupied by memory mapped IO devices that\r
614 +     * reside on the downstream side fo the bridge.\r
615 +     */\r
616 +    reg = SM((PCIE_MEM_PHY_PORT_TO_END(pcie_port) >> 20), PCIE_MBML_MEM_LIMIT_ADDR)\r
617 +        | SM((PCIE_MEM_PHY_PORT_TO_BASE(pcie_port) >> 20), PCIE_MBML_MEM_BASE_ADDR);\r
618 +\r
619 +    IFX_REG_W32(reg, PCIE_MBML(pcie_port));\r
620 +\r
621 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_MBML: 0x%08x\n", \r
622 +        __func__, IFX_REG_R32(PCIE_MBML(pcie_port)));\r
623 +\r
624 +#ifdef IFX_PCIE_PREFETCH_MEM_64BIT\r
625 +    reg = SM((PCIE_MEM_PHY_PORT_TO_END(pcie_port) >> 20), PCIE_PMBL_END_ADDR)\r
626 +        | SM((PCIE_MEM_PHY_PORT_TO_BASE(pcie_port) >> 20), PCIE_PMBL_UPPER_12BIT)\r
627 +        | PCIE_PMBL_64BIT_ADDR;\r
628 +    IFX_REG_W32(reg, PCIE_PMBL(pcie_port));\r
629 +\r
630 +    /* Must configure upper 32bit */\r
631 +    IFX_REG_W32(0, PCIE_PMBU32(pcie_port));\r
632 +    IFX_REG_W32(0, PCIE_PMLU32(pcie_port));\r
633 +#else\r
634 +    /* PCIe_PBML, same as MBML */\r
635 +    IFX_REG_W32(IFX_REG_R32(PCIE_MBML(pcie_port)), PCIE_PMBL(pcie_port));\r
636 +#endif \r
637 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_PMBL: 0x%08x\n",\r
638 +    __func__, IFX_REG_R32(PCIE_PMBL(pcie_port)));\r
639 +\r
640 +    /* IO Address Range */\r
641 +    reg = SM((PCIE_IO_PHY_PORT_TO_END(pcie_port) >> 12), PCIE_IOBLSECS_IO_LIMIT_ADDR)\r
642 +        | SM((PCIE_IO_PHY_PORT_TO_BASE(pcie_port) >> 12), PCIE_IOBLSECS_IO_BASE_ADDR);\r
643 +#ifdef IFX_PCIE_IO_32BIT    \r
644 +    reg |= PCIE_IOBLSECS_32BIT_IO_ADDR;\r
645 +#endif /* IFX_PCIE_IO_32BIT */\r
646 +    IFX_REG_W32(reg, PCIE_IOBLSECS(pcie_port));\r
647 +\r
648 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_IOBLSECS: 0x%08x\n",\r
649 +        __func__, IFX_REG_R32(PCIE_IOBLSECS(pcie_port)));\r
650 +#ifdef IFX_PCIE_IO_32BIT\r
651 +    reg = SM((PCIE_IO_PHY_PORT_TO_END(pcie_port) >> 16), PCIE_IO_BANDL_UPPER_16BIT_IO_LIMIT)\r
652 +        | SM((PCIE_IO_PHY_PORT_TO_BASE(pcie_port) >> 16), PCIE_IO_BANDL_UPPER_16BIT_IO_BASE);\r
653 +    IFX_REG_W32(reg, PCIE_IO_BANDL(pcie_port));\r
654 +\r
655 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_IO_BANDL: 0x%08x\n",\r
656 +        __func__, IFX_REG_R32(PCIE_IO_BANDL(pcie_port)));\r
657 +#endif /* IFX_PCIE_IO_32BIT */\r
658 +}\r
659 +\r
660 +static INLINE void\r
661 +pcie_msi_setup(int pcie_port)\r
662 +{\r
663 +    u32 reg;\r
664 +\r
665 +    /* XXX, MSI stuff should only apply to EP */\r
666 +    /* MSI Capability: Only enable 32-bit addresses */\r
667 +    reg = IFX_REG_R32(PCIE_MCAPR(pcie_port));\r
668 +    reg &= ~PCIE_MCAPR_ADDR64_CAP;\r
669 +\r
670 +    reg |= PCIE_MCAPR_MSI_ENABLE;\r
671 +\r
672 +    /* Disable multiple message */\r
673 +    reg &= ~(PCIE_MCAPR_MULTI_MSG_CAP | PCIE_MCAPR_MULTI_MSG_ENABLE);\r
674 +    IFX_REG_W32(reg, PCIE_MCAPR(pcie_port));\r
675 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_MCAPR: 0x%08x\n", \r
676 +        __func__, IFX_REG_R32(PCIE_MCAPR(pcie_port)));\r
677 +}\r
678 +\r
679 +static INLINE void\r
680 +pcie_pm_setup(int pcie_port)\r
681 +{\r
682 +    u32 reg;\r
683 +\r
684 +    /* Enable PME, Soft reset enabled */\r
685 +    reg = IFX_REG_R32(PCIE_PM_CSR(pcie_port));\r
686 +    reg |= PCIE_PM_CSR_PME_ENABLE | PCIE_PM_CSR_SW_RST;\r
687 +    IFX_REG_W32(reg, PCIE_PM_CSR(pcie_port));\r
688 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_PM_CSR: 0x%08x\n", \r
689 +        __func__, IFX_REG_R32(PCIE_PM_CSR(pcie_port)));\r
690 +}\r
691 +\r
692 +static INLINE void\r
693 +pcie_bus_setup(int pcie_port) \r
694 +{\r
695 +    u32 reg;\r
696 +\r
697 +    reg = SM(0, PCIE_BNR_PRIMARY_BUS_NUM) | SM(1, PCIE_PNR_SECONDARY_BUS_NUM) | SM(0xFF, PCIE_PNR_SUB_BUS_NUM);\r
698 +    IFX_REG_W32(reg, PCIE_BNR(pcie_port));\r
699 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_BNR: 0x%08x\n", \r
700 +        __func__, IFX_REG_R32(PCIE_BNR(pcie_port)));\r
701 +}\r
702 +\r
703 +static INLINE void\r
704 +pcie_device_setup(int pcie_port)\r
705 +{\r
706 +    u32 reg;\r
707 +\r
708 +    /* Device capability register, set up Maximum payload size */\r
709 +    reg = IFX_REG_R32(PCIE_DCAP(pcie_port));\r
710 +    reg |= PCIE_DCAP_ROLE_BASE_ERR_REPORT;\r
711 +    reg |= SM(PCIE_MAX_PAYLOAD_128, PCIE_DCAP_MAX_PAYLOAD_SIZE);\r
712 +\r
713 +    /* Only available for EP */\r
714 +    reg &= ~(PCIE_DCAP_EP_L0S_LATENCY | PCIE_DCAP_EP_L1_LATENCY);\r
715 +    IFX_REG_W32(reg, PCIE_DCAP(pcie_port));\r
716 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_DCAP: 0x%08x\n",\r
717 +        __func__, IFX_REG_R32(PCIE_DCAP(pcie_port)));\r
718 +\r
719 +    /* Device control and status register */\r
720 +    /* Set Maximum Read Request size for the device as a Requestor */\r
721 +    reg = IFX_REG_R32(PCIE_DCTLSTS(pcie_port));\r
722 +\r
723 +    /* \r
724 +     * Request size can be larger than the MPS used, but the completions returned \r
725 +     * for the read will be bounded by the MPS size.\r
726 +     * In our system, Max request size depends on AHB burst size. It is 64 bytes.\r
727 +     * but we set it as 128 as minimum one.\r
728 +     */\r
729 +    reg |= SM(PCIE_MAX_PAYLOAD_128, PCIE_DCTLSTS_MAX_READ_SIZE)\r
730 +            | SM(PCIE_MAX_PAYLOAD_128, PCIE_DCTLSTS_MAX_PAYLOAD_SIZE);\r
731 +\r
732 +    /* Enable relaxed ordering, no snoop, and all kinds of errors */\r
733 +    reg |= PCIE_DCTLSTS_RELAXED_ORDERING_EN | PCIE_DCTLSTS_ERR_EN | PCIE_DCTLSTS_NO_SNOOP_EN;\r
734 +\r
735 +    IFX_REG_W32(reg, PCIE_DCTLSTS(pcie_port));\r
736 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_DCTLSTS: 0x%08x\n",\r
737 +        __func__, IFX_REG_R32(PCIE_DCTLSTS(pcie_port)));\r
738 +}\r
739 +\r
740 +static INLINE void\r
741 +pcie_link_setup(int pcie_port)\r
742 +{\r
743 +    u32 reg;\r
744 +\r
745 +    /*\r
746 +     * XXX, Link capability register, bit 18 for EP CLKREQ# dynamic clock management for L1, L2/3 CPM \r
747 +     * L0s is reported during link training via TS1 order set by N_FTS\r
748 +     */\r
749 +    reg = IFX_REG_R32(PCIE_LCAP(pcie_port));\r
750 +    reg &= ~PCIE_LCAP_L0S_EIXT_LATENCY;\r
751 +    reg |= SM(3, PCIE_LCAP_L0S_EIXT_LATENCY);\r
752 +    IFX_REG_W32(reg, PCIE_LCAP(pcie_port));\r
753 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_LCAP: 0x%08x\n",\r
754 +        __func__, IFX_REG_R32(PCIE_LCAP(pcie_port)));\r
755 +\r
756 +    /* Link control and status register */\r
757 +    reg = IFX_REG_R32(PCIE_LCTLSTS(pcie_port));\r
758 +\r
759 +    /* Link Enable, ASPM enabled  */\r
760 +    reg &= ~PCIE_LCTLSTS_LINK_DISABLE;\r
761 +\r
762 +#ifdef CONFIG_PCIEASPM\r
763 +    /*  \r
764 +     * We use the same physical reference clock that the platform provides on the connector \r
765 +     * It paved the way for ASPM to calculate the new exit Latency\r
766 +     */\r
767 +    reg |= PCIE_LCTLSTS_SLOT_CLK_CFG;\r
768 +    reg |= PCIE_LCTLSTS_COM_CLK_CFG;\r
769 +    /*\r
770 +     * We should disable ASPM by default except that we have dedicated power management support\r
771 +     * Enable ASPM will cause the system hangup/instability, performance degration\r
772 +     */\r
773 +    reg |= PCIE_LCTLSTS_ASPM_ENABLE;\r
774 +#else\r
775 +    reg &= ~PCIE_LCTLSTS_ASPM_ENABLE;\r
776 +#endif /* CONFIG_PCIEASPM */\r
777 +\r
778 +    /* \r
779 +     * The maximum size of any completion with data packet is bounded by the MPS setting \r
780 +     * in  device control register \r
781 +     */\r
782 +\r
783 +    /* RCB may cause multiple split transactions, two options available, we use 64 byte RCB */\r
784 +    reg &= ~ PCIE_LCTLSTS_RCB128;\r
785 +\r
786 +    IFX_REG_W32(reg, PCIE_LCTLSTS(pcie_port));\r
787 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_LCTLSTS: 0x%08x\n",\r
788 +        __func__, IFX_REG_R32(PCIE_LCTLSTS(pcie_port)));\r
789 +}\r
790 +\r
791 +static INLINE void\r
792 +pcie_error_setup(int pcie_port)\r
793 +{\r
794 +    u32 reg;\r
795 +\r
796 +    /* \r
797 +     * Forward ERR_COR, ERR_NONFATAL, ERR_FATAL to the backbone \r
798 +     * Poisoned write TLPs and completions indicating poisoned TLPs will set the PCIe_PCICMDSTS.MDPE \r
799 +     */\r
800 +    reg = IFX_REG_R32(PCIE_INTRBCTRL(pcie_port));\r
801 +    reg |= PCIE_INTRBCTRL_SERR_ENABLE | PCIE_INTRBCTRL_PARITY_ERR_RESP_ENABLE;\r
802 +\r
803 +    IFX_REG_W32(reg, PCIE_INTRBCTRL(pcie_port));\r
804 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_INTRBCTRL: 0x%08x\n",\r
805 +        __func__, IFX_REG_R32(PCIE_INTRBCTRL(pcie_port)));\r
806 +\r
807 +    /* Uncorrectable Error Mask Register, Unmask <enable> all bits in PCIE_UESR */\r
808 +    reg = IFX_REG_R32(PCIE_UEMR(pcie_port));\r
809 +    reg &= ~PCIE_ALL_UNCORRECTABLE_ERR;\r
810 +    IFX_REG_W32(reg, PCIE_UEMR(pcie_port));\r
811 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_UEMR: 0x%08x\n",\r
812 +        __func__, IFX_REG_R32(PCIE_UEMR(pcie_port)));\r
813 +\r
814 +    /* Uncorrectable Error Severity Register, ALL errors are FATAL */\r
815 +    IFX_REG_W32(PCIE_ALL_UNCORRECTABLE_ERR, PCIE_UESR(pcie_port));\r
816 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_UESR: 0x%08x\n",\r
817 +        __func__, IFX_REG_R32(PCIE_UESR(pcie_port)));\r
818 +\r
819 +    /* Correctable Error Mask Register, unmask <enable> all bits */\r
820 +    reg = IFX_REG_R32(PCIE_CEMR(pcie_port));\r
821 +    reg &= ~PCIE_CORRECTABLE_ERR;\r
822 +    IFX_REG_W32(reg, PCIE_CEMR(pcie_port));\r
823 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_CEMR: 0x%08x\n",\r
824 +        __func__, IFX_REG_R32(PCIE_CEMR(pcie_port)));\r
825 +\r
826 +    /* Advanced Error Capabilities and Control Registr */\r
827 +    reg = IFX_REG_R32(PCIE_AECCR(pcie_port));\r
828 +    reg |= PCIE_AECCR_ECRC_CHECK_EN | PCIE_AECCR_ECRC_GEN_EN;\r
829 +    IFX_REG_W32(reg, PCIE_AECCR(pcie_port));\r
830 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_AECCR: 0x%08x\n",\r
831 +        __func__, IFX_REG_R32(PCIE_AECCR(pcie_port)));\r
832 +\r
833 +    /* Root Error Command Register, Report all types of errors */\r
834 +    reg = IFX_REG_R32(PCIE_RECR(pcie_port));\r
835 +    reg |= PCIE_RECR_ERR_REPORT_EN;\r
836 +    IFX_REG_W32(reg, PCIE_RECR(pcie_port));\r
837 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_RECR: 0x%08x\n",\r
838 +        __func__, IFX_REG_R32(PCIE_RECR(pcie_port)));\r
839 +\r
840 +    /* Clear the Root status register */ \r
841 +    reg = IFX_REG_R32(PCIE_RESR(pcie_port));\r
842 +    IFX_REG_W32(reg, PCIE_RESR(pcie_port));\r
843 +}\r
844 +\r
845 +static INLINE void\r
846 +pcie_root_setup(int pcie_port)\r
847 +{\r
848 +    u32 reg;\r
849 +\r
850 +    /* Root control and capabilities register */\r
851 +    reg = IFX_REG_R32(PCIE_RCTLCAP(pcie_port));\r
852 +    reg |= PCIE_RCTLCAP_SERR_ENABLE | PCIE_RCTLCAP_PME_INT_EN;\r
853 +    IFX_REG_W32(reg, PCIE_RCTLCAP(pcie_port));\r
854 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_RCTLCAP: 0x%08x\n",\r
855 +        __func__, IFX_REG_R32(PCIE_RCTLCAP(pcie_port)));\r
856 +}\r
857 +\r
858 +static INLINE void\r
859 +pcie_vc_setup(int pcie_port)\r
860 +{\r
861 +    u32 reg;\r
862 +\r
863 +    /* Port VC Capability Register 2 */\r
864 +    reg = IFX_REG_R32(PCIE_PVC2(pcie_port));\r
865 +    reg &= ~PCIE_PVC2_VC_ARB_WRR;\r
866 +    reg |= PCIE_PVC2_VC_ARB_16P_FIXED_WRR;\r
867 +    IFX_REG_W32(reg, PCIE_PVC2(pcie_port));\r
868 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_PVC2: 0x%08x\n",\r
869 +        __func__, IFX_REG_R32(PCIE_PVC2(pcie_port)));\r
870 +\r
871 +    /* VC0 Resource Capability Register */\r
872 +    reg = IFX_REG_R32(PCIE_VC0_RC(pcie_port));\r
873 +    reg &= ~PCIE_VC0_RC_REJECT_SNOOP;\r
874 +    IFX_REG_W32(reg, PCIE_VC0_RC(pcie_port));\r
875 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_VC0_RC: 0x%08x\n",\r
876 +        __func__, IFX_REG_R32(PCIE_VC0_RC(pcie_port)));\r
877 +}\r
878 +\r
879 +static INLINE void\r
880 +pcie_port_logic_setup(int pcie_port)\r
881 +{\r
882 +    u32 reg;\r
883 +\r
884 +    /* FTS number, default 12, increase to 63, may increase time from/to L0s to L0  */\r
885 +    reg = IFX_REG_R32(PCIE_AFR(pcie_port));\r
886 +    reg &= ~(PCIE_AFR_FTS_NUM | PCIE_AFR_COM_FTS_NUM);\r
887 +    reg |= SM(PCIE_AFR_FTS_NUM_DEFAULT, PCIE_AFR_FTS_NUM)\r
888 +        | SM(PCIE_AFR_FTS_NUM_DEFAULT, PCIE_AFR_COM_FTS_NUM);\r
889 +    /* L0s and L1 entry latency */\r
890 +    reg &= ~(PCIE_AFR_L0S_ENTRY_LATENCY | PCIE_AFR_L1_ENTRY_LATENCY);\r
891 +    reg |= SM(PCIE_AFR_L0S_ENTRY_LATENCY_DEFAULT, PCIE_AFR_L0S_ENTRY_LATENCY)\r
892 +        | SM(PCIE_AFR_L1_ENTRY_LATENCY_DEFAULT, PCIE_AFR_L1_ENTRY_LATENCY);\r
893 +    IFX_REG_W32(reg, PCIE_AFR(pcie_port));\r
894 +\r
895 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_AFR: 0x%08x\n",\r
896 +        __func__, IFX_REG_R32(PCIE_AFR(pcie_port)));\r
897 +\r
898 +    /* Port Link Control Register */\r
899 +    reg = IFX_REG_R32(PCIE_PLCR(pcie_port));\r
900 +    reg |= PCIE_PLCR_DLL_LINK_EN;  /* Enable the DLL link */\r
901 +    IFX_REG_W32(reg, PCIE_PLCR(pcie_port));\r
902 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_PLCR: 0x%08x\n",\r
903 +        __func__, IFX_REG_R32(PCIE_PLCR(pcie_port)));\r
904 +\r
905 +    /* Lane Skew Register */\r
906 +    reg = IFX_REG_R32(PCIE_LSR(pcie_port));\r
907 +    /* Enable ACK/NACK and FC */\r
908 +    reg &= ~(PCIE_LSR_ACKNAK_DISABLE | PCIE_LSR_FC_DISABLE); \r
909 +    IFX_REG_W32(reg, PCIE_LSR(pcie_port));\r
910 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_LSR: 0x%08x\n",\r
911 +        __func__, IFX_REG_R32(PCIE_LSR(pcie_port)));\r
912 +\r
913 +    /* Symbol Timer Register and Filter Mask Register 1 */\r
914 +    reg = IFX_REG_R32(PCIE_STRFMR(pcie_port));\r
915 +\r
916 +    /* Default SKP interval is very accurate already, 5us */\r
917 +    /* Enable IO/CFG transaction */\r
918 +    reg |= PCIE_STRFMR_RX_CFG_TRANS_ENABLE | PCIE_STRFMR_RX_IO_TRANS_ENABLE;\r
919 +    /* Disable FC WDT */\r
920 +    reg &= ~PCIE_STRFMR_FC_WDT_DISABLE;\r
921 +    IFX_REG_W32(reg, PCIE_STRFMR(pcie_port));\r
922 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_STRFMR: 0x%08x\n",\r
923 +        __func__, IFX_REG_R32(PCIE_STRFMR(pcie_port)));\r
924 +\r
925 +    /* Filter Masker Register 2 */\r
926 +    reg = IFX_REG_R32(PCIE_FMR2(pcie_port));\r
927 +    reg |= PCIE_FMR2_VENDOR_MSG1_PASSED_TO_TRGT1 | PCIE_FMR2_VENDOR_MSG0_PASSED_TO_TRGT1;\r
928 +    IFX_REG_W32(reg, PCIE_FMR2(pcie_port));\r
929 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_FMR2: 0x%08x\n",\r
930 +        __func__, IFX_REG_R32(PCIE_FMR2(pcie_port)));\r
931 +\r
932 +    /* VC0 Completion Receive Queue Control Register */\r
933 +    reg = IFX_REG_R32(PCIE_VC0_CRQCR(pcie_port));\r
934 +    reg &= ~PCIE_VC0_CRQCR_CPL_TLP_QUEUE_MODE;\r
935 +    reg |= SM(PCIE_VC0_TLP_QUEUE_MODE_BYPASS, PCIE_VC0_CRQCR_CPL_TLP_QUEUE_MODE);\r
936 +    IFX_REG_W32(reg, PCIE_VC0_CRQCR(pcie_port));\r
937 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_VC0_CRQCR: 0x%08x\n",\r
938 +        __func__, IFX_REG_R32(PCIE_VC0_CRQCR(pcie_port)));\r
939 +}\r
940 +\r
941 +static INLINE void \r
942 +pcie_rc_cfg_reg_setup(int pcie_port)\r
943 +{\r
944 +    pcie_ltssm_disable(pcie_port);\r
945 +    pcie_mem_io_setup(pcie_port);\r
946 +    pcie_msi_setup(pcie_port);\r
947 +    pcie_pm_setup(pcie_port);\r
948 +    pcie_bus_setup(pcie_port);\r
949 +    pcie_device_setup(pcie_port);\r
950 +    pcie_link_setup(pcie_port);\r
951 +    pcie_error_setup(pcie_port);\r
952 +    pcie_root_setup(pcie_port);\r
953 +    pcie_vc_setup(pcie_port);\r
954 +    pcie_port_logic_setup(pcie_port);\r
955 +}\r
956 +\r
957 +static int \r
958 +ifx_pcie_wait_phy_link_up(int pcie_port)\r
959 +{\r
960 +#define IFX_PCIE_PHY_LINK_UP_TIMEOUT  1000 /* XXX, tunable */\r
961 +    int i;\r
962 +\r
963 +    /* Wait for PHY link is up */\r
964 +    for (i = 0; i < IFX_PCIE_PHY_LINK_UP_TIMEOUT; i++) {\r
965 +        if (ifx_pcie_link_up(pcie_port)) {\r
966 +            break;\r
967 +        }\r
968 +        udelay(100);\r
969 +    }\r
970 +    if (i >= IFX_PCIE_PHY_LINK_UP_TIMEOUT) {\r
971 +        printk(KERN_ERR "%s timeout\n", __func__);\r
972 +        return -1;\r
973 +    }\r
974 +\r
975 +    /* Check data link up or not */\r
976 +    if (!(IFX_REG_R32(PCIE_RC_DR(pcie_port)) & PCIE_RC_DR_DLL_UP)) {\r
977 +        printk(KERN_ERR "%s DLL link is still down\n", __func__);\r
978 +        return -1;\r
979 +    }\r
980 +\r
981 +    /* Check Data link active or not */\r
982 +    if (!(IFX_REG_R32(PCIE_LCTLSTS(pcie_port)) & PCIE_LCTLSTS_DLL_ACTIVE)) {\r
983 +        printk(KERN_ERR "%s DLL is not active\n", __func__);\r
984 +        return -1;\r
985 +    }\r
986 +    return 0;\r
987 +#undef IFX_PCIE_PHY_LINK_UP_TIMEOUT\r
988 +}\r
989 +\r
990 +static INLINE int\r
991 +pcie_app_loigc_setup(int pcie_port)\r
992 +{\r
993 +#ifdef IFX_PCIE_PHY_DBG\r
994 +    pcie_disable_scrambling(pcie_port);\r
995 +#endif /* IFX_PCIE_PHY_DBG */\r
996 +    pcie_ahb_bus_error_suppress(pcie_port);\r
997 +\r
998 +    /* Pull PCIe EP out of reset */\r
999 +    pcie_device_rst_deassert(pcie_port);\r
1000 +\r
1001 +    /* Start LTSSM training between RC and EP */\r
1002 +    pcie_ltssm_enable(pcie_port);\r
1003 +\r
1004 +    /* Check PHY status after enabling LTSSM */\r
1005 +    if (ifx_pcie_wait_phy_link_up(pcie_port) != 0) {\r
1006 +        return -1;\r
1007 +    }\r
1008 +    return 0;\r
1009 +}\r
1010 +\r
1011 +/* \r
1012 + * Must be done after ltssm due to based on negotiated link \r
1013 + * width and payload size\r
1014 + * Update the Replay Time Limit. Empirically, some PCIe \r
1015 + * devices take a little longer to respond than expected under \r
1016 + * load. As a workaround for this we configure the Replay Time \r
1017 + * Limit to the value expected for a 512 byte MPS instead of \r
1018 + * our actual 128 byte MPS. The numbers below are directly \r
1019 + * from the PCIe spec table 3-4/5. \r
1020 + */ \r
1021 +static INLINE void\r
1022 +pcie_replay_time_update(int pcie_port)\r
1023 +{\r
1024 +    u32 reg;\r
1025 +    int nlw;\r
1026 +    int rtl;\r
1027 +\r
1028 +    reg = IFX_REG_R32(PCIE_LCTLSTS(pcie_port));\r
1029 +\r
1030 +    nlw = MS(reg, PCIE_LCTLSTS_NEGOTIATED_LINK_WIDTH);\r
1031 +    switch (nlw) {\r
1032 +        case PCIE_MAX_LENGTH_WIDTH_X1:\r
1033 +            rtl = 1677;\r
1034 +            break;\r
1035 +        case PCIE_MAX_LENGTH_WIDTH_X2:\r
1036 +            rtl = 867;\r
1037 +            break;\r
1038 +        case PCIE_MAX_LENGTH_WIDTH_X4:\r
1039 +            rtl = 462;\r
1040 +            break;\r
1041 +        case PCIE_MAX_LENGTH_WIDTH_X8:\r
1042 +            rtl = 258;\r
1043 +            break;\r
1044 +        default:\r
1045 +            rtl = 1677;\r
1046 +            break;\r
1047 +    }\r
1048 +    reg = IFX_REG_R32(PCIE_ALTRT(pcie_port));\r
1049 +    reg &= ~PCIE_ALTRT_REPLAY_TIME_LIMIT;\r
1050 +    reg |= SM(rtl, PCIE_ALTRT_REPLAY_TIME_LIMIT);\r
1051 +    IFX_REG_W32(reg, PCIE_ALTRT(pcie_port));\r
1052 +\r
1053 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_ALTRT 0x%08x\n",\r
1054 +        __func__, IFX_REG_R32(PCIE_ALTRT(pcie_port)));\r
1055 +}\r
1056 +\r
1057 +/*\r
1058 + * Table 359 Enhanced Configuration Address Mapping1)\r
1059 + * 1) This table is defined in Table 7-1, page 341, PCI Express Base Specification v1.1\r
1060 + * Memory Address PCI Express Configuration Space\r
1061 + * A[(20+n-1):20] Bus Number 1 < n < 8\r
1062 + * A[19:15] Device Number\r
1063 + * A[14:12] Function Number\r
1064 + * A[11:8] Extended Register Number\r
1065 + * A[7:2] Register Number\r
1066 + * A[1:0] Along with size of the access, used to generate Byte Enables\r
1067 + * For VR9, only the address bits [22:0] are mapped to the configuration space:\r
1068 + * . Address bits [22:20] select the target bus (1-of-8)1)\r
1069 + * . Address bits [19:15] select the target device (1-of-32) on the bus\r
1070 + * . Address bits [14:12] select the target function (1-of-8) within the device.\r
1071 + * . Address bits [11:2] selects the target dword (1-of-1024) within the selected function.s configuration space\r
1072 + * . Address bits [1:0] define the start byte location within the selected dword.\r
1073 + */\r
1074 +static inline u32\r
1075 +pcie_bus_addr(u8 bus_num, u16 devfn, int where)\r
1076 +{\r
1077 +    u32 addr;\r
1078 +    u8  bus;\r
1079 +\r
1080 +    if (!bus_num) {\r
1081 +        /* type 0 */\r
1082 +        addr = ((PCI_SLOT(devfn) & 0x1F) << 15) | ((PCI_FUNC(devfn) & 0x7) << 12) | ((where & 0xFFF)& ~3);\r
1083 +    } \r
1084 +    else {\r
1085 +        bus = bus_num;\r
1086 +        /* type 1, only support 8 buses  */\r
1087 +        addr = ((bus & 0x7) << 20) | ((PCI_SLOT(devfn) & 0x1F) << 15) |\r
1088 +                ((PCI_FUNC(devfn) & 0x7) << 12) | ((where & 0xFFF) & ~3);\r
1089 +    }\r
1090 +    IFX_PCIE_PRINT(PCIE_MSG_CFG, "%s: bus addr : %02x:%02x.%01x/%02x, addr=%08x\n",\r
1091 +        __func__, bus_num, PCI_SLOT(devfn), PCI_FUNC(devfn), where, addr);\r
1092 +    return addr;\r
1093 +}\r
1094 +\r
1095 +static int \r
1096 +pcie_valid_config(int pcie_port, int bus, int dev)\r
1097 +{\r
1098 +    /* RC itself */\r
1099 +    if ((bus == 0) && (dev == 0)) {\r
1100 +         return 1;\r
1101 +    }\r
1102 +\r
1103 +    /* No physical link */\r
1104 +    if (!ifx_pcie_link_up(pcie_port)) {\r
1105 +        return 0;\r
1106 +    }\r
1107 +\r
1108 +    /* Bus zero only has RC itself\r
1109 +     * XXX, check if EP will be integrated \r
1110 +     */\r
1111 +    if ((bus == 0) && (dev != 0)) {\r
1112 +        return 0;\r
1113 +    }\r
1114 +\r
1115 +    /* Maximum 8 buses supported for VRX */\r
1116 +    if (bus > 9) {\r
1117 +        return 0;\r
1118 +    }\r
1119 +\r
1120 +    /* \r
1121 +     * PCIe is PtP link, one bus only supports only one device \r
1122 +     * except bus zero and PCIe switch which is virtual bus device\r
1123 +     * The following two conditions really depends on the system design\r
1124 +     * and attached the device.\r
1125 +     * XXX, how about more new switch\r
1126 +     */\r
1127 +    if ((bus == 1) && (dev != 0)) {\r
1128 +        return 0;\r
1129 +    }\r
1130 +\r
1131 +    if ((bus >= 3) && (dev != 0)) {\r
1132 +        return 0;\r
1133 +    }\r
1134 +    return 1;\r
1135 +}\r
1136 +\r
1137 +static INLINE u32 \r
1138 +ifx_pcie_cfg_rd(int pcie_port, u32 reg)\r
1139 +{\r
1140 +    return IFX_REG_R32((volatile u32 *)(PCIE_CFG_PORT_TO_BASE(pcie_port) + reg));\r
1141 +}\r
1142 +\r
1143 +static INLINE void \r
1144 +ifx_pcie_cfg_wr(int pcie_port, unsigned int reg, u32 val)\r
1145 +{\r
1146 +    IFX_REG_W32( val, (volatile u32 *)(PCIE_CFG_PORT_TO_BASE(pcie_port) + reg));\r
1147 +}\r
1148 +\r
1149 +static INLINE u32 \r
1150 +ifx_pcie_rc_cfg_rd(int pcie_port, u32 reg)\r
1151 +{\r
1152 +    return IFX_REG_R32((volatile u32 *)(PCIE_RC_PORT_TO_BASE(pcie_port) + reg));\r
1153 +}\r
1154 +\r
1155 +static INLINE void \r
1156 +ifx_pcie_rc_cfg_wr(int pcie_port, unsigned int reg, u32 val)\r
1157 +{\r
1158 +    IFX_REG_W32(val, (volatile u32 *)(PCIE_RC_PORT_TO_BASE(pcie_port) + reg));\r
1159 +}\r
1160 +\r
1161 +u32 \r
1162 +ifx_pcie_bus_enum_read_hack(int where, u32 value)\r
1163 +{\r
1164 +    u32 tvalue = value;\r
1165 +\r
1166 +    if (where == PCI_PRIMARY_BUS) {\r
1167 +        u8 primary, secondary, subordinate;\r
1168 +\r
1169 +        primary = tvalue & 0xFF;\r
1170 +        secondary = (tvalue >> 8) & 0xFF;\r
1171 +        subordinate = (tvalue >> 16) & 0xFF;\r
1172 +        primary += pcibios_1st_host_bus_nr();\r
1173 +        secondary += pcibios_1st_host_bus_nr();\r
1174 +        subordinate += pcibios_1st_host_bus_nr();\r
1175 +        tvalue = (tvalue & 0xFF000000) | (u32)primary | (u32)(secondary << 8) | (u32)(subordinate << 16);\r
1176 +    }\r
1177 +    return tvalue;\r
1178 +}\r
1179 +\r
1180 +u32 \r
1181 +ifx_pcie_bus_enum_write_hack(int where, u32 value)\r
1182 +{\r
1183 +    u32 tvalue = value;\r
1184 +\r
1185 +    if (where == PCI_PRIMARY_BUS) {\r
1186 +        u8 primary, secondary, subordinate;\r
1187 +\r
1188 +        primary = tvalue & 0xFF;\r
1189 +        secondary = (tvalue >> 8) & 0xFF;\r
1190 +        subordinate = (tvalue >> 16) & 0xFF;\r
1191 +        if (primary > 0 && primary != 0xFF) {\r
1192 +            primary -= pcibios_1st_host_bus_nr();\r
1193 +        }\r
1194 +\r
1195 +        if (secondary > 0 && secondary != 0xFF) {\r
1196 +            secondary -= pcibios_1st_host_bus_nr();\r
1197 +        }\r
1198 +        if (subordinate > 0 && subordinate != 0xFF) {\r
1199 +            subordinate -= pcibios_1st_host_bus_nr();\r
1200 +        }\r
1201 +        tvalue = (tvalue & 0xFF000000) | (u32)primary | (u32)(secondary << 8) | (u32)(subordinate << 16);\r
1202 +    }\r
1203 +    else if (where == PCI_SUBORDINATE_BUS) {\r
1204 +        u8 subordinate = tvalue & 0xFF;\r
1205 +\r
1206 +        subordinate = subordinate > 0 ? subordinate - pcibios_1st_host_bus_nr() : 0;\r
1207 +        tvalue = subordinate;\r
1208 +    }\r
1209 +    return tvalue;\r
1210 +}\r
1211 +\r
1212 +/** \r
1213 + * \fn static int ifx_pcie_read_config(struct pci_bus *bus, u32 devfn, \r
1214 + *                   int where, int size, u32 *value)\r
1215 + * \brief Read a value from configuration space \r
1216 + * \r
1217 + * \param[in] bus    Pointer to pci bus\r
1218 + * \param[in] devfn  PCI device function number\r
1219 + * \param[in] where  PCI register number \r
1220 + * \param[in] size   Register read size\r
1221 + * \param[out] value    Pointer to return value\r
1222 + * \return  PCIBIOS_BAD_REGISTER_NUMBER Invalid register number\r
1223 + * \return  PCIBIOS_FUNC_NOT_SUPPORTED  PCI function not supported\r
1224 + * \return  PCIBIOS_DEVICE_NOT_FOUND    PCI device not found\r
1225 + * \return  PCIBIOS_SUCCESSFUL          OK\r
1226 + * \ingroup IFX_PCIE_OS\r
1227 + */ \r
1228 +static int \r
1229 +ifx_pcie_read_config(struct pci_bus *bus, u32 devfn, \r
1230 +                    int where, int size, u32 *value)\r
1231 +{\r
1232 +    u32 data = 0;\r
1233 +    int bus_number = bus->number;\r
1234 +    static const u32 mask[8] = {0, 0xff, 0xffff, 0, 0xffffffff, 0, 0, 0};    \r
1235 +    int ret = PCIBIOS_SUCCESSFUL;\r
1236 +    struct ifx_pci_controller *ctrl = bus->sysdata;\r
1237 +    int pcie_port = ctrl->port;\r
1238 +\r
1239 +    if (unlikely(size != 1 && size != 2 && size != 4)){\r
1240 +        ret = PCIBIOS_BAD_REGISTER_NUMBER;\r
1241 +        goto out;\r
1242 +    }\r
1243 +\r
1244 +    /* Make sure the address is aligned to natural boundary */\r
1245 +    if (unlikely(((size - 1) & where))) {\r
1246 +        ret = PCIBIOS_BAD_REGISTER_NUMBER;\r
1247 +        goto out;\r
1248 +    }\r
1249 +\r
1250 +    /* \r
1251 +     * If we are second controller, we have to cheat OS so that it assume \r
1252 +     * its bus number starts from 0 in host controller\r
1253 +     */\r
1254 +    bus_number = ifx_pcie_bus_nr_deduct(bus_number, pcie_port);\r
1255 +\r
1256 +    /* \r
1257 +     * We need to force the bus number to be zero on the root \r
1258 +     * bus. Linux numbers the 2nd root bus to start after all \r
1259 +     * busses on root 0. \r
1260 +     */ \r
1261 +    if (bus->parent == NULL) {\r
1262 +        bus_number = 0; \r
1263 +    }\r
1264 +\r
1265 +    /* \r
1266 +     * PCIe only has a single device connected to it. It is \r
1267 +     * always device ID 0. Don't bother doing reads for other \r
1268 +     * device IDs on the first segment. \r
1269 +     */ \r
1270 +    if ((bus_number == 0) && (PCI_SLOT(devfn) != 0)) {\r
1271 +        ret = PCIBIOS_FUNC_NOT_SUPPORTED;\r
1272 +        goto out; \r
1273 +    }\r
1274 +\r
1275 +    if (pcie_valid_config(pcie_port, bus_number, PCI_SLOT(devfn)) == 0) {\r
1276 +        *value = 0xffffffff;\r
1277 +        ret = PCIBIOS_DEVICE_NOT_FOUND;\r
1278 +        goto out;\r
1279 +    }\r
1280 +\r
1281 +    IFX_PCIE_PRINT(PCIE_MSG_READ_CFG, "%s: %02x:%02x.%01x/%02x:%01d\n", __func__, bus_number,\r
1282 +        PCI_SLOT(devfn), PCI_FUNC(devfn), where, size);\r
1283 +\r
1284 +    PCIE_IRQ_LOCK(ifx_pcie_lock);\r
1285 +    if (bus_number == 0) { /* RC itself */\r
1286 +        u32 t;\r
1287 +\r
1288 +        t = (where & ~3);\r
1289 +        data = ifx_pcie_rc_cfg_rd(pcie_port, t);\r
1290 +        IFX_PCIE_PRINT(PCIE_MSG_READ_CFG, "%s: rd local cfg, offset:%08x, data:%08x\n",\r
1291 +            __func__, t, data);\r
1292 +    }\r
1293 +    else {\r
1294 +        u32 addr = pcie_bus_addr(bus_number, devfn, where);\r
1295 +\r
1296 +        data = ifx_pcie_cfg_rd(pcie_port, addr);\r
1297 +        if (pcie_port == IFX_PCIE_PORT0) {\r
1298 +    #ifdef CONFIG_IFX_PCIE_HW_SWAP\r
1299 +            data = le32_to_cpu(data);\r
1300 +    #endif /* CONFIG_IFX_PCIE_HW_SWAP */\r
1301 +        }\r
1302 +        else {\r
1303 +    #ifdef CONFIG_IFX_PCIE1_HW_SWAP\r
1304 +            data = le32_to_cpu(data);\r
1305 +    #endif /* CONFIG_IFX_PCIE_HW_SWAP */\r
1306 +        } \r
1307 +    }\r
1308 +    /* To get a correct PCI topology, we have to restore the bus number to OS */\r
1309 +    data = ifx_pcie_bus_enum_hack(bus, devfn, where, data, pcie_port, 1);\r
1310 +\r
1311 +    PCIE_IRQ_UNLOCK(ifx_pcie_lock);\r
1312 +    IFX_PCIE_PRINT(PCIE_MSG_READ_CFG, "%s: read config: data=%08x raw=%08x\n",\r
1313 +        __func__, (data >> (8 * (where & 3))) & mask[size & 7], data); \r
1314 +\r
1315 +    *value = (data >> (8 * (where & 3))) & mask[size & 7];\r
1316 +out:\r
1317 +    return ret;\r
1318 +}\r
1319 +\r
1320 +static u32 \r
1321 +ifx_pcie_size_to_value(int where, int size, u32 data, u32 value)\r
1322 +{\r
1323 +    u32 shift;\r
1324 +    u32 tdata = data;\r
1325 +\r
1326 +    switch (size) {\r
1327 +        case 1:\r
1328 +            shift = (where & 0x3) << 3;\r
1329 +            tdata &= ~(0xffU << shift);\r
1330 +            tdata |= ((value & 0xffU) << shift);\r
1331 +            break;\r
1332 +        case 2:\r
1333 +            shift = (where & 3) << 3;\r
1334 +            tdata &= ~(0xffffU << shift);\r
1335 +            tdata |= ((value & 0xffffU) << shift);\r
1336 +            break;\r
1337 +        case 4:\r
1338 +            tdata = value;\r
1339 +            break;\r
1340 +    }\r
1341 +    return tdata;\r
1342 +}\r
1343 +\r
1344 +/** \r
1345 + * \fn static static int ifx_pcie_write_config(struct pci_bus *bus, u32 devfn,\r
1346 + *                 int where, int size, u32 value)\r
1347 + * \brief Write a value to PCI configuration space \r
1348 + * \r
1349 + * \param[in] bus    Pointer to pci bus\r
1350 + * \param[in] devfn  PCI device function number\r
1351 + * \param[in] where  PCI register number \r
1352 + * \param[in] size   The register size to be written\r
1353 + * \param[in] value  The valule to be written\r
1354 + * \return PCIBIOS_BAD_REGISTER_NUMBER Invalid register number\r
1355 + * \return PCIBIOS_DEVICE_NOT_FOUND    PCI device not found\r
1356 + * \return PCIBIOS_SUCCESSFUL          OK\r
1357 + * \ingroup IFX_PCIE_OS\r
1358 + */ \r
1359 +static int \r
1360 +ifx_pcie_write_config(struct pci_bus *bus, u32 devfn,\r
1361 +                  int where, int size, u32 value)\r
1362 +{\r
1363 +    int bus_number = bus->number;\r
1364 +    int ret = PCIBIOS_SUCCESSFUL;\r
1365 +    struct ifx_pci_controller *ctrl = bus->sysdata;\r
1366 +    int pcie_port = ctrl->port;\r
1367 +    u32 tvalue = value;\r
1368 +    u32 data;\r
1369 +\r
1370 +    /* Make sure the address is aligned to natural boundary */\r
1371 +    if (unlikely(((size - 1) & where))) {\r
1372 +        ret = PCIBIOS_BAD_REGISTER_NUMBER;\r
1373 +        goto out;\r
1374 +    }\r
1375 +    /* \r
1376 +     * If we are second controller, we have to cheat OS so that it assume \r
1377 +     * its bus number starts from 0 in host controller\r
1378 +     */\r
1379 +    bus_number = ifx_pcie_bus_nr_deduct(bus_number, pcie_port);\r
1380 +\r
1381 +    /* \r
1382 +     * We need to force the bus number to be zero on the root \r
1383 +     * bus. Linux numbers the 2nd root bus to start after all \r
1384 +     * busses on root 0. \r
1385 +     */ \r
1386 +    if (bus->parent == NULL) {\r
1387 +        bus_number = 0; \r
1388 +    }\r
1389 +\r
1390 +    if (pcie_valid_config(pcie_port, bus_number, PCI_SLOT(devfn)) == 0) {\r
1391 +        ret = PCIBIOS_DEVICE_NOT_FOUND;\r
1392 +        goto out;\r
1393 +    }\r
1394 +\r
1395 +    IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG, "%s: %02x:%02x.%01x/%02x:%01d value=%08x\n", __func__, \r
1396 +        bus_number, PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, value);\r
1397 +\r
1398 +    /* XXX, some PCIe device may need some delay */\r
1399 +    PCIE_IRQ_LOCK(ifx_pcie_lock);\r
1400 +\r
1401 +    /* \r
1402 +     * To configure the correct bus topology using native way, we have to cheat Os so that\r
1403 +     * it can configure the PCIe hardware correctly.\r
1404 +     */\r
1405 +    tvalue = ifx_pcie_bus_enum_hack(bus, devfn, where, value, pcie_port, 0);\r
1406 +\r
1407 +    if (bus_number == 0) { /* RC itself */\r
1408 +        u32 t;\r
1409 +\r
1410 +        t = (where & ~3);\r
1411 +        IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG,"%s: wr local cfg, offset:%08x, fill:%08x\n", __func__, t, value);\r
1412 +        data = ifx_pcie_rc_cfg_rd(pcie_port, t);\r
1413 +        IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG,"%s: rd local cfg, offset:%08x, data:%08x\n", __func__, t, data);\r
1414 +\r
1415 +        data = ifx_pcie_size_to_value(where, size, data, tvalue);\r
1416 +\r
1417 +        IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG,"%s: wr local cfg, offset:%08x, value:%08x\n", __func__, t, data);\r
1418 +        ifx_pcie_rc_cfg_wr(pcie_port, t, data);     \r
1419 +        IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG,"%s: rd local cfg, offset:%08x, value:%08x\n", \r
1420 +            __func__, t, ifx_pcie_rc_cfg_rd(pcie_port, t));\r
1421 +    }\r
1422 +    else {\r
1423 +        u32 addr = pcie_bus_addr(bus_number, devfn, where);\r
1424 +\r
1425 +        IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG,"%s: wr cfg, offset:%08x, fill:%08x\n", __func__, addr, value);\r
1426 +        data = ifx_pcie_cfg_rd(pcie_port, addr);\r
1427 +        if (pcie_port == IFX_PCIE_PORT0) {\r
1428 +    #ifdef CONFIG_IFX_PCIE_HW_SWAP\r
1429 +            data = le32_to_cpu(data);    \r
1430 +    #endif /* CONFIG_IFX_PCIE_HW_SWAP */\r
1431 +        }\r
1432 +        else {\r
1433 +    #ifdef CONFIG_IFX_PCIE1_HW_SWAP\r
1434 +            data = le32_to_cpu(data);    \r
1435 +    #endif /* CONFIG_IFX_PCIE_HW_SWAP */\r
1436 +        }\r
1437 +        IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG,"%s: rd cfg, offset:%08x, data:%08x\n", __func__, addr, data);\r
1438 +\r
1439 +        data = ifx_pcie_size_to_value(where, size, data, tvalue);\r
1440 +        if (pcie_port == IFX_PCIE_PORT0) {\r
1441 +    #ifdef CONFIG_IFX_PCIE_HW_SWAP\r
1442 +            data = cpu_to_le32(data);\r
1443 +    #endif /* CONFIG_IFX_PCIE_HW_SWAP */\r
1444 +        }\r
1445 +        else {\r
1446 +    #ifdef CONFIG_IFX_PCIE1_HW_SWAP\r
1447 +            data = cpu_to_le32(data);\r
1448 +    #endif /* CONFIG_IFX_PCIE_HW_SWAP */\r
1449 +        }\r
1450 +        IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG, "%s: wr cfg, offset:%08x, value:%08x\n", __func__, addr, data);\r
1451 +        ifx_pcie_cfg_wr(pcie_port, addr, data);\r
1452 +        IFX_PCIE_PRINT(PCIE_MSG_WRITE_CFG, "%s: rd cfg, offset:%08x, value:%08x\n", \r
1453 +            __func__, addr, ifx_pcie_cfg_rd(pcie_port, addr));\r
1454 +    }\r
1455 +    PCIE_IRQ_UNLOCK(ifx_pcie_lock);\r
1456 +out:\r
1457 +    return ret;\r
1458 +}\r
1459 +\r
1460 +static struct resource ifx_pcie_io_resource = {\r
1461 +    .name   = "PCIe0 I/O space",\r
1462 +    .start  = PCIE_IO_PHY_BASE,\r
1463 +    .end    = PCIE_IO_PHY_END,\r
1464 +    .flags  = IORESOURCE_IO,\r
1465 +};\r
1466 +\r
1467 +static struct resource ifx_pcie_mem_resource = {\r
1468 +    .name   = "PCIe0 Memory space",\r
1469 +    .start  = PCIE_MEM_PHY_BASE,\r
1470 +    .end    = PCIE_MEM_PHY_END,\r
1471 +    .flags  = IORESOURCE_MEM,\r
1472 +};\r
1473 +\r
1474 +static struct pci_ops ifx_pcie_ops = {\r
1475 +    .read  = ifx_pcie_read_config,\r
1476 +    .write = ifx_pcie_write_config,\r
1477 +};\r
1478 +\r
1479 +#ifdef CONFIG_IFX_PCIE_2ND_CORE\r
1480 +static struct resource ifx_pcie1_io_resource = {\r
1481 +    .name   = "PCIe1 I/O space",\r
1482 +    .start  = PCIE1_IO_PHY_BASE,\r
1483 +    .end    = PCIE1_IO_PHY_END,\r
1484 +    .flags  = IORESOURCE_IO,\r
1485 +};\r
1486 +\r
1487 +static struct resource ifx_pcie1_mem_resource = {\r
1488 +    .name   = "PCIe1 Memory space",\r
1489 +    .start  = PCIE1_MEM_PHY_BASE,\r
1490 +    .end    = PCIE1_MEM_PHY_END,\r
1491 +    .flags  = IORESOURCE_MEM,\r
1492 +};\r
1493 +#endif /* CONFIG_IFX_PCIE_2ND_CORE */\r
1494 +\r
1495 +static struct ifx_pci_controller ifx_pcie_controller[IFX_PCIE_CORE_NR] = {\r
1496 +    {\r
1497 +        .pcic = {\r
1498 +            .pci_ops      = &ifx_pcie_ops,\r
1499 +            .mem_resource = &ifx_pcie_mem_resource,\r
1500 +            .io_resource  = &ifx_pcie_io_resource,\r
1501 +         },\r
1502 +         .port = IFX_PCIE_PORT0,\r
1503 +    },\r
1504 +#ifdef CONFIG_IFX_PCIE_2ND_CORE\r
1505 +    {\r
1506 +         .pcic = {\r
1507 +            .pci_ops      = &ifx_pcie_ops,\r
1508 +            .mem_resource = &ifx_pcie1_mem_resource,\r
1509 +            .io_resource  = &ifx_pcie1_io_resource,\r
1510 +         },\r
1511 +         .port = IFX_PCIE_PORT1,\r
1512 +    },\r
1513 +#endif /* CONFIG_IFX_PCIE_2ND_CORE */\r
1514 +};\r
1515 +\r
1516 +#ifdef IFX_PCIE_ERROR_INT\r
1517 +static INLINE void \r
1518 +pcie_core_int_clear_all(int pcie_port)\r
1519 +{\r
1520 +    u32 reg;\r
1521 +\r
1522 +    reg = IFX_REG_R32(PCIE_IRNCR(pcie_port));\r
1523 +    IFX_PCIE_PRINT(PCIE_MSG_ISR, "%s PCIE_IRNCR: 0x%08x\n", \r
1524 +        __func__, IFX_REG_R32(PCIE_IRNCR(pcie_port)));\r
1525 +    reg &= PCIE_RC_CORE_COMBINED_INT;\r
1526 +    IFX_REG_W32(reg, PCIE_IRNCR(pcie_port));\r
1527 +}\r
1528 +\r
1529 +static irqreturn_t\r
1530 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)\r
1531 +pcie_rc_core_isr(int irq, void *dev_id)\r
1532 +#else\r
1533 +pcie_rc_core_isr(int irq, void *dev_id, struct pt_regs *regs)\r
1534 +#endif\r
1535 +{\r
1536 +    struct ifx_pci_controller *ctrl = (struct ifx_pci_controller *)dev_id;\r
1537 +    int pcie_port = ctrl->port;\r
1538 +\r
1539 +    IFX_PCIE_PRINT(PCIE_MSG_ISR, "PCIe RC error intr %d\n", irq);\r
1540 +    pcie_core_int_clear_all(pcie_port);\r
1541 +    return IRQ_HANDLED;\r
1542 +}\r
1543 +\r
1544 +static int\r
1545 +pcie_rc_core_int_init(int pcie_port)\r
1546 +{\r
1547 +    int ret;\r
1548 +\r
1549 +    IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s enter \n", __func__);\r
1550 +\r
1551 +    /* Enable core interrupt */\r
1552 +    IFX_REG_SET_BIT(PCIE_RC_CORE_COMBINED_INT, PCIE_IRNEN(pcie_port));\r
1553 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_IRNEN: 0x%08x\n", \r
1554 +        __func__, IFX_REG_R32(PCIE_IRNEN(pcie_port)));\r
1555 +\r
1556 +    /* Clear it first */\r
1557 +    IFX_REG_SET_BIT(PCIE_RC_CORE_COMBINED_INT, PCIE_IRNCR(pcie_port));\r
1558 +    IFX_PCIE_PRINT(PCIE_MSG_REG, "%s PCIE_IRNCR: 0x%08x\n",\r
1559 +        __func__, IFX_REG_R32(PCIE_IRNCR(pcie_port)));\r
1560 +    ret = request_irq(pcie_irqs[pcie_port].ir_irq.irq, pcie_rc_core_isr, IRQF_DISABLED,\r
1561 +                pcie_irqs[pcie_port].ir_irq.name, &ifx_pcie_controller[pcie_port]);\r
1562 +    if (ret) {\r
1563 +        printk(KERN_ERR "%s request irq %d failed\n", __func__, IFX_PCIE_IR);\r
1564 +    }\r
1565 +    IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s exit \n", __func__);\r
1566 +\r
1567 +    return ret;\r
1568 +}\r
1569 +#endif /* IFX_PCIE_ERROR_INT */\r
1570 +\r
1571 +/** \r
1572 + * \fn int ifx_pcie_bios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)\r
1573 + * \brief Map a PCI device to the appropriate interrupt line \r
1574 + * \r
1575 + * \param[in] dev    The Linux PCI device structure for the device to map \r
1576 + * \param[in] slot   The slot number for this device on __BUS 0__. Linux \r
1577 + *                   enumerates through all the bridges and figures out the \r
1578 + *                   slot on Bus 0 where this device eventually hooks to. \r
1579 + * \param[in] pin    The PCI interrupt pin read from the device, then swizzled \r
1580 + *                   as it goes through each bridge. \r
1581 + * \return Interrupt number for the device\r
1582 + * \ingroup IFX_PCIE_OS\r
1583 + */ \r
1584 +int \r
1585 +ifx_pcie_bios_map_irq(IFX_PCI_CONST struct pci_dev *dev, u8 slot, u8 pin)\r
1586 +{\r
1587 +    u32 irq_bit = 0;\r
1588 +    int irq = 0;\r
1589 +    struct ifx_pci_controller *ctrl = dev->bus->sysdata;\r
1590 +    int pcie_port = ctrl->port;\r
1591 +\r
1592 +    printk("%s port %d dev %s slot %d pin %d \n", __func__, pcie_port, pci_name(dev), slot, pin);\r
1593 +\r
1594 +    if ((pin == PCIE_LEGACY_DISABLE) || (pin > PCIE_LEGACY_INT_MAX)) {\r
1595 +        printk(KERN_WARNING "WARNING: dev %s: invalid interrupt pin %d\n", pci_name(dev), pin);\r
1596 +        return -1;\r
1597 +    }\r
1598 +    /* Pin index so minus one */\r
1599 +    irq_bit = pcie_irqs[pcie_port].legacy_irq[pin - 1].irq_bit;\r
1600 +    irq = pcie_irqs[pcie_port].legacy_irq[pin - 1].irq;\r
1601 +    IFX_REG_SET_BIT(irq_bit, PCIE_IRNEN(pcie_port));\r
1602 +//     printk("%s PCIE_IRNEN: 0x%08x\n", __func__, IFX_REG_R32(PCIE_IRNEN(pcie_port)));\r
1603 +    IFX_REG_SET_BIT(irq_bit, PCIE_IRNCR(pcie_port));\r
1604 +  //  printk("%s PCIE_IRNCR: 0x%08x\n", __func__, IFX_REG_R32(PCIE_IRNCR(pcie_port)));\r
1605 +    printk("%s dev %s irq %d assigned\n", __func__, pci_name(dev), irq);\r
1606 +//    printk("%s dev %s: exit\n", __func__, pci_name(dev));\r
1607 +    return irq;\r
1608 +}\r
1609 +\r
1610 +/** \r
1611 + * \fn int ifx_pcie_bios_plat_dev_init(struct pci_dev *dev)\r
1612 + * \brief Called to perform platform specific PCI setup \r
1613 + * \r
1614 + * \param[in] dev The Linux PCI device structure for the device to map\r
1615 + * \return OK\r
1616 + * \ingroup IFX_PCIE_OS\r
1617 + */ \r
1618 +int \r
1619 +ifx_pcie_bios_plat_dev_init(struct pci_dev *dev)\r
1620 +{\r
1621 +    u16 config;\r
1622 +#ifdef IFX_PCIE_ERROR_INT\r
1623 +    u32 dconfig; \r
1624 +    int pos;\r
1625 +#endif /* IFX_PCIE_ERROR_INT */\r
1626 +\r
1627 +    IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s enter \n", __func__);\r
1628 +    /* Enable reporting System errors and parity errors on all devices */ \r
1629 +    /* Enable parity checking and error reporting */ \r
1630 +    pci_read_config_word(dev, PCI_COMMAND, &config);\r
1631 +    config |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR /*| PCI_COMMAND_INVALIDATE |\r
1632 +          PCI_COMMAND_FAST_BACK*/;\r
1633 +    pci_write_config_word(dev, PCI_COMMAND, config);\r
1634 +\r
1635 +    if (dev->subordinate) {\r
1636 +        /* Set latency timers on sub bridges */\r
1637 +        pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER, 0x40); /* XXX, */\r
1638 +        /* More bridge error detection */\r
1639 +        pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &config);\r
1640 +        config |= PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR;\r
1641 +        pci_write_config_word(dev, PCI_BRIDGE_CONTROL, config);\r
1642 +    }\r
1643 +#ifdef IFX_PCIE_ERROR_INT\r
1644 +    /* Enable the PCIe normal error reporting */\r
1645 +    pos = pci_find_capability(dev, PCI_CAP_ID_EXP);\r
1646 +    if (pos) {\r
1647 +\r
1648 +        /* Disable system error generation in response to error messages */\r
1649 +        pci_read_config_word(dev, pos + PCI_EXP_RTCTL, &config);\r
1650 +        config &= ~(PCI_EXP_RTCTL_SECEE | PCI_EXP_RTCTL_SENFEE | PCI_EXP_RTCTL_SEFEE);\r
1651 +        pci_write_config_word(dev, pos + PCI_EXP_RTCTL, config);\r
1652 +\r
1653 +        /* Clear PCIE Capability's Device Status */\r
1654 +        pci_read_config_word(dev, pos + PCI_EXP_DEVSTA, &config);\r
1655 +        pci_write_config_word(dev, pos + PCI_EXP_DEVSTA, config);\r
1656 +\r
1657 +        /* Update Device Control */ \r
1658 +        pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &config);\r
1659 +        /* Correctable Error Reporting */\r
1660 +        config |= PCI_EXP_DEVCTL_CERE;\r
1661 +        /* Non-Fatal Error Reporting */\r
1662 +        config |= PCI_EXP_DEVCTL_NFERE;\r
1663 +        /* Fatal Error Reporting */\r
1664 +        config |= PCI_EXP_DEVCTL_FERE;\r
1665 +        /* Unsupported Request */\r
1666 +        config |= PCI_EXP_DEVCTL_URRE;\r
1667 +        pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, config);\r
1668 +    }\r
1669 +\r
1670 +    /* Find the Advanced Error Reporting capability */\r
1671 +    pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);\r
1672 +    if (pos) {\r
1673 +        /* Clear Uncorrectable Error Status */ \r
1674 +        pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, &dconfig);\r
1675 +        pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, dconfig);\r
1676 +        /* Enable reporting of all uncorrectable errors */\r
1677 +        /* Uncorrectable Error Mask - turned on bits disable errors */\r
1678 +        pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_MASK, 0);\r
1679 +        /* \r
1680 +        * Leave severity at HW default. This only controls if \r
1681 +        * errors are reported as uncorrectable or \r
1682 +        * correctable, not if the error is reported. \r
1683 +        */ \r
1684 +        /* PCI_ERR_UNCOR_SEVER - Uncorrectable Error Severity */\r
1685 +        /* Clear Correctable Error Status */\r
1686 +        pci_read_config_dword(dev, pos + PCI_ERR_COR_STATUS, &dconfig);\r
1687 +        pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS, dconfig);\r
1688 +        /* Enable reporting of all correctable errors */\r
1689 +        /* Correctable Error Mask - turned on bits disable errors */\r
1690 +        pci_write_config_dword(dev, pos + PCI_ERR_COR_MASK, 0);\r
1691 +        /* Advanced Error Capabilities */ \r
1692 +        pci_read_config_dword(dev, pos + PCI_ERR_CAP, &dconfig);\r
1693 +        /* ECRC Generation Enable */\r
1694 +        if (dconfig & PCI_ERR_CAP_ECRC_GENC) {\r
1695 +            dconfig |= PCI_ERR_CAP_ECRC_GENE;\r
1696 +        }\r
1697 +        /* ECRC Check Enable */\r
1698 +        if (dconfig & PCI_ERR_CAP_ECRC_CHKC) {\r
1699 +            dconfig |= PCI_ERR_CAP_ECRC_CHKE;\r
1700 +        }\r
1701 +        pci_write_config_dword(dev, pos + PCI_ERR_CAP, dconfig);\r
1702 +\r
1703 +        /* PCI_ERR_HEADER_LOG - Header Log Register (16 bytes) */\r
1704 +        /* Enable Root Port's interrupt in response to error messages */\r
1705 +        pci_write_config_dword(dev, pos + PCI_ERR_ROOT_COMMAND,\r
1706 +              PCI_ERR_ROOT_CMD_COR_EN |\r
1707 +              PCI_ERR_ROOT_CMD_NONFATAL_EN |\r
1708 +              PCI_ERR_ROOT_CMD_FATAL_EN); \r
1709 +        /* Clear the Root status register */\r
1710 +        pci_read_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, &dconfig);\r
1711 +        pci_write_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, dconfig);\r
1712 +    }\r
1713 +#endif /* IFX_PCIE_ERROR_INT */\r
1714 +    /* WAR, only 128 MRRS is supported, force all EPs to support this value */\r
1715 +    pcie_set_readrq(dev, 128);\r
1716 +    IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s exit \n", __func__);\r
1717 +    return 0;\r
1718 +}\r
1719 +\r
1720 +static void\r
1721 +pcie_phy_rst(int pcie_port)\r
1722 +{\r
1723 +     pcie_phy_rst_assert(pcie_port);\r
1724 +     pcie_phy_rst_deassert(pcie_port);\r
1725 +\r
1726 +     /* Make sure PHY PLL is stable */\r
1727 +     udelay(20);\r
1728 +}\r
1729 +\r
1730 +static int\r
1731 +pcie_rc_initialize(int pcie_port)\r
1732 +{\r
1733 +    int i;\r
1734 +#define IFX_PCIE_PHY_LOOP_CNT  5\r
1735 +\r
1736 +    pcie_rcu_endian_setup(pcie_port);\r
1737 +\r
1738 +    pcie_ep_gpio_rst_init(pcie_port);\r
1739 +\r
1740 +    /* \r
1741 +     * XXX, PCIe elastic buffer bug will cause not to be detected. One more \r
1742 +     * reset PCIe PHY will solve this issue \r
1743 +     */\r
1744 +    for (i = 0; i < IFX_PCIE_PHY_LOOP_CNT; i++) {\r
1745 +        /* Disable PCIe PHY Analog part for sanity check */\r
1746 +       pcie_phy_pmu_disable(pcie_port);\r
1747 +\r
1748 +       pcie_phy_rst(pcie_port);\r
1749 +\r
1750 +        /* PCIe Core reset enabled, low active, sw programmed */\r
1751 +       pcie_core_rst_assert(pcie_port);\r
1752 +\r
1753 +        /* Put PCIe EP in reset status */\r
1754 +       pcie_device_rst_assert(pcie_port);\r
1755 +\r
1756 +        /* PCI PHY & Core reset disabled, high active, sw programmed */\r
1757 +       pcie_core_rst_deassert(pcie_port);\r
1758 +\r
1759 +        /* Already in a quiet state, program PLL, enable PHY, check ready bit */\r
1760 +       pcie_phy_clock_mode_setup(pcie_port);\r
1761 +\r
1762 +        /* Enable PCIe PHY and Clock */\r
1763 +       pcie_core_pmu_setup(pcie_port);\r
1764 +\r
1765 +       /* Clear status registers */\r
1766 +        pcie_status_register_clear(pcie_port);\r
1767 +\r
1768 +    #ifdef CONFIG_PCI_MSI\r
1769 +        pcie_msi_init(pcie_port);\r
1770 +    #endif /* CONFIG_PCI_MSI */\r
1771 +       pcie_rc_cfg_reg_setup(pcie_port);\r
1772 +\r
1773 +       /* Once link is up, break out */\r
1774 +        if (pcie_app_loigc_setup(pcie_port) == 0) {\r
1775 +           break;\r
1776 +        }\r
1777 +    }\r
1778 +    if (i >= IFX_PCIE_PHY_LOOP_CNT) {\r
1779 +        printk(KERN_ERR "%s link up failed!!!!!\n", __func__);\r
1780 +        return -EIO;\r
1781 +    }\r
1782 +    /* NB, don't increase ACK/NACK timer timeout value, which will cause a lot of COR errors */\r
1783 +    pcie_replay_time_update(pcie_port);\r
1784 +#ifdef IFX_PCIE_DBG\r
1785 +    pcie_post_dump(pcie_port);\r
1786 +    pcie_status_registers_dump(pcie_port);\r
1787 +#endif /* IFX_PCIE_DBG */\r
1788 +    return 0;\r
1789 +}\r
1790 +\r
1791 +static int inline\r
1792 +ifx_pcie_startup_port_nr(void)\r
1793 +{\r
1794 +    int pcie_port = IFX_PCIE_PORT0;\r
1795 +\r
1796 +#if defined (CONFIG_IFX_PCIE_1ST_CORE) && defined (CONFIG_IFX_PCIE_2ND_CORE)\r
1797 +    pcie_port = IFX_PCIE_PORT0;\r
1798 +#elif defined (CONFIG_IFX_PCIE_1ST_CORE)\r
1799 +    pcie_port = IFX_PCIE_PORT0;\r
1800 +#elif defined (CONFIG_IFX_PCIE_2ND_CORE)\r
1801 +    pcie_port = IFX_PCIE_PORT1;\r
1802 +#else\r
1803 +    #error "Please choose valid PCIe Core"\r
1804 +#endif\r
1805 +    return pcie_port;\r
1806 +}\r
1807 +\r
1808 +/** \r
1809 + * \fn static int __init ifx_pcie_bios_init(void)\r
1810 + * \brief Initialize the IFX PCIe controllers\r
1811 + *\r
1812 + * \return -EIO    PCIe PHY link is not up\r
1813 + * \return -ENOMEM Configuration/IO space failed to map\r
1814 + * \return 0       OK\r
1815 + * \ingroup IFX_PCIE_OS\r
1816 + */ \r
1817 +extern int (*ltq_pci_plat_arch_init)(struct pci_dev *dev);\r
1818 +extern int (*ltq_pci_map_irq)(const struct pci_dev *dev, u8 slot, u8 pin);\r
1819 +\r
1820 +static int __init \r
1821 +ifx_pcie_bios_init(void)\r
1822 +{\r
1823 +    char ver_str[128] = {0};\r
1824 +    void __iomem *io_map_base;\r
1825 +    int pcie_port;\r
1826 +    int startup_port;\r
1827 +\r
1828 +    IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s enter \n", __func__);\r
1829 +\r
1830 +       ltq_pci_map_irq = ifx_pcie_bios_map_irq;\r
1831 +       ltq_pci_plat_arch_init = ifx_pcie_bios_plat_dev_init;\r
1832 +\r
1833 +    /* Enable AHB Master/ Slave */\r
1834 +    pcie_ahb_pmu_setup();\r
1835 +\r
1836 +    startup_port = ifx_pcie_startup_port_nr();\r
1837 +    \r
1838 +    for (pcie_port = startup_port; pcie_port < IFX_PCIE_CORE_NR; pcie_port++){\r
1839 +       if (pcie_rc_initialize(pcie_port) == 0) {\r
1840 +           IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s: ifx_pcie_cfg_base 0x%p\n", \r
1841 +                 __func__, PCIE_CFG_PORT_TO_BASE(pcie_port));\r
1842 +            /* Otherwise, warning will pop up */\r
1843 +            io_map_base = ioremap(PCIE_IO_PHY_PORT_TO_BASE(pcie_port), PCIE_IO_SIZE);\r
1844 +            if (io_map_base == NULL) {\r
1845 +                IFX_PCIE_PRINT(PCIE_MSG_ERR, "%s io space ioremap failed\n", __func__);\r
1846 +                return -ENOMEM;\r
1847 +            }\r
1848 +            ifx_pcie_controller[pcie_port].pcic.io_map_base = (unsigned long)io_map_base;\r
1849 +\r
1850 +            register_pci_controller(&ifx_pcie_controller[pcie_port].pcic);\r
1851 +            /* XXX, clear error status */\r
1852 +\r
1853 +            IFX_PCIE_PRINT(PCIE_MSG_INIT, "%s: mem_resource 0x%p, io_resource 0x%p\n", \r
1854 +                              __func__, &ifx_pcie_controller[pcie_port].pcic.mem_resource, \r
1855 +                              &ifx_pcie_controller[pcie_port].pcic.io_resource);\r
1856 +\r
1857 +        #ifdef IFX_PCIE_ERROR_INT\r
1858 +            pcie_rc_core_int_init(pcie_port);\r
1859 +        #endif /* IFX_PCIE_ERROR_INT */\r
1860 +        }\r
1861 +    }\r
1862 +#ifdef CONFIG_IFX_PMCU\r
1863 +    ifx_pcie_pmcu_init();\r
1864 +#endif /* CONFIG_IFX_PMCU */\r
1865 +\r
1866 +    sprintf(ver_str, "PCIe Root Complex %d.%d.%d", IFX_PCIE_VER_MAJOR, IFX_PCIE_VER_MID, IFX_PCIE_VER_MINOR);\r
1867 +    printk(KERN_INFO "%s", ver_str);\r
1868 +    return 0;\r
1869 +#undef IFX_PCIE_PHY_LOOP_CNT\r
1870 +}\r
1871 +arch_initcall(ifx_pcie_bios_init);\r
1872 +\r
1873 +MODULE_LICENSE("GPL");\r
1874 +MODULE_AUTHOR("Chuanhua.Lei@infineon.com");\r
1875 +MODULE_SUPPORTED_DEVICE("Infineon builtin PCIe RC module");\r
1876 +MODULE_DESCRIPTION("Infineon builtin PCIe RC driver");\r
1877 +\r
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..49a4d2f
1881 --- /dev/null
1882 +++ b/arch/mips/pci/ifxmips_pcie.h
1883 @@ -0,0 +1,135 @@
1884 +/******************************************************************************\r
1885 +**\r
1886 +** FILE NAME    : ifxmips_pcie.h\r
1887 +** PROJECT      : IFX UEIP for VRX200\r
1888 +** MODULES      : PCIe module\r
1889 +**\r
1890 +** DATE         : 02 Mar 2009\r
1891 +** AUTHOR       : Lei Chuanhua\r
1892 +** DESCRIPTION  : PCIe Root Complex Driver\r
1893 +** COPYRIGHT    :       Copyright (c) 2009\r
1894 +**                      Infineon Technologies AG\r
1895 +**                      Am Campeon 1-12, 85579 Neubiberg, Germany\r
1896 +**\r
1897 +**    This program is free software; you can redistribute it and/or modify\r
1898 +**    it under the terms of the GNU General Public License as published by\r
1899 +**    the Free Software Foundation; either version 2 of the License, or\r
1900 +**    (at your option) any later version.\r
1901 +** HISTORY\r
1902 +** $Version $Date        $Author         $Comment\r
1903 +** 0.0.1    17 Mar,2009  Lei Chuanhua    Initial version\r
1904 +*******************************************************************************/\r
1905 +#ifndef IFXMIPS_PCIE_H\r
1906 +#define IFXMIPS_PCIE_H\r
1907 +#include <linux/version.h>\r
1908 +#include <linux/types.h>\r
1909 +#include <linux/pci.h>\r
1910 +#include <linux/interrupt.h>\r
1911 +#include "ifxmips_pci_common.h"\r
1912 +#include "ifxmips_pcie_reg.h"\r
1913 +\r
1914 +/*!\r
1915 + \defgroup IFX_PCIE  PCI Express bus driver module   \r
1916 + \brief  PCI Express IP module support VRX200 \r
1917 +*/\r
1918 +\r
1919 +/*!\r
1920 + \defgroup IFX_PCIE_OS OS APIs\r
1921 + \ingroup IFX_PCIE\r
1922 + \brief PCIe bus driver OS interface functions\r
1923 +*/\r
1924 +\r
1925 +/*!\r
1926 + \file ifxmips_pcie.h\r
1927 + \ingroup IFX_PCIE  \r
1928 + \brief header file for PCIe module common header file\r
1929 +*/\r
1930 +#define PCIE_IRQ_LOCK(lock) do {             \\r
1931 +    unsigned long flags;                     \\r
1932 +    spin_lock_irqsave(&(lock), flags);\r
1933 +#define PCIE_IRQ_UNLOCK(lock)                \\r
1934 +    spin_unlock_irqrestore(&(lock), flags);  \\r
1935 +} while (0)\r
1936 +\r
1937 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)\r
1938 +#define IRQF_SHARED SA_SHIRQ\r
1939 +#endif\r
1940 +\r
1941 +#define PCIE_MSG_MSI        0x00000001\r
1942 +#define PCIE_MSG_ISR        0x00000002\r
1943 +#define PCIE_MSG_FIXUP      0x00000004\r
1944 +#define PCIE_MSG_READ_CFG   0x00000008\r
1945 +#define PCIE_MSG_WRITE_CFG  0x00000010\r
1946 +#define PCIE_MSG_CFG        (PCIE_MSG_READ_CFG | PCIE_MSG_WRITE_CFG)\r
1947 +#define PCIE_MSG_REG        0x00000020\r
1948 +#define PCIE_MSG_INIT       0x00000040\r
1949 +#define PCIE_MSG_ERR        0x00000080\r
1950 +#define PCIE_MSG_PHY        0x00000100\r
1951 +#define PCIE_MSG_ANY        0x000001ff\r
1952 +\r
1953 +#define IFX_PCIE_PORT0      0\r
1954 +#define IFX_PCIE_PORT1      1\r
1955 +\r
1956 +#ifdef CONFIG_IFX_PCIE_2ND_CORE\r
1957 +#define IFX_PCIE_CORE_NR    2\r
1958 +#else\r
1959 +#define IFX_PCIE_CORE_NR    1\r
1960 +#endif\r
1961 +\r
1962 +#define IFX_PCIE_ERROR_INT\r
1963 +\r
1964 +//#define IFX_PCIE_DBG\r
1965 +\r
1966 +#if defined(IFX_PCIE_DBG)\r
1967 +#define IFX_PCIE_PRINT(_m, _fmt, args...) do {   \\r
1968 +        ifx_pcie_debug((_fmt), ##args);          \\r
1969 +} while (0)\r
1970 +\r
1971 +#define INLINE \r
1972 +#else\r
1973 +#define IFX_PCIE_PRINT(_m, _fmt, args...)   \\r
1974 +    do {} while(0)\r
1975 +#define INLINE inline\r
1976 +#endif\r
1977 +\r
1978 +struct ifx_pci_controller {\r
1979 +       struct pci_controller   pcic;\r
1980 +    \r
1981 +       /* RC specific, per host bus information */\r
1982 +       u32   port;  /* Port index, 0 -- 1st core, 1 -- 2nd core */\r
1983 +};\r
1984 +\r
1985 +typedef struct ifx_pcie_ir_irq {\r
1986 +    const unsigned int irq;\r
1987 +    const char name[16];\r
1988 +}ifx_pcie_ir_irq_t;\r
1989 +\r
1990 +typedef struct ifx_pcie_legacy_irq{\r
1991 +    const u32 irq_bit;\r
1992 +    const int irq;\r
1993 +}ifx_pcie_legacy_irq_t;\r
1994 +\r
1995 +typedef struct ifx_pcie_irq {\r
1996 +    ifx_pcie_ir_irq_t ir_irq;\r
1997 +    ifx_pcie_legacy_irq_t legacy_irq[PCIE_LEGACY_INT_MAX];\r
1998 +}ifx_pcie_irq_t;\r
1999 +\r
2000 +extern u32 g_pcie_debug_flag;\r
2001 +extern void ifx_pcie_debug(const char *fmt, ...);\r
2002 +extern void pcie_phy_clock_mode_setup(int pcie_port);\r
2003 +extern void pcie_msi_pic_init(int pcie_port);\r
2004 +extern u32 ifx_pcie_bus_enum_read_hack(int where, u32 value);\r
2005 +extern u32 ifx_pcie_bus_enum_write_hack(int where, u32 value);\r
2006 +\r
2007 +#define CONFIG_VR9\r
2008 +\r
2009 +#ifdef CONFIG_VR9\r
2010 +#include "ifxmips_pcie_vr9.h"\r
2011 +#elif defined (CONFIG_AR10)\r
2012 +#include "ifxmips_pcie_ar10.h"\r
2013 +#else\r
2014 +#error "PCIE: platform not defined"\r
2015 +#endif /* CONFIG_VR9 */\r
2016 +\r
2017 +#endif  /* IFXMIPS_PCIE_H */\r
2018 +\r
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
2022 --- /dev/null
2023 +++ b/arch/mips/pci/ifxmips_pcie_ar10.h
2024 @@ -0,0 +1,290 @@
2025 +/****************************************************************************
2026 +                              Copyright (c) 2010
2027 +                            Lantiq Deutschland GmbH
2028 +                     Am Campeon 3; 85579 Neubiberg, Germany
2029 +
2030 +  For licensing information, see the file 'LICENSE' in the root folder of
2031 +  this software module.
2032 +
2033 + *****************************************************************************/
2034 +/*!
2035 +  \file ifxmips_pcie_ar10.h
2036 +  \ingroup IFX_PCIE
2037 +  \brief PCIe RC driver ar10 specific file
2038 +*/
2039 +
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>
2047 +
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>
2053 +
2054 +static inline void pcie_ep_gpio_rst_init(int pcie_port)
2055 +{
2056 +    ifx_ebu_led_enable();
2057 +    if (pcie_port == 0) {
2058 +        ifx_ebu_led_set_data(11, 1);        
2059 +    }
2060 +    else {
2061 +        ifx_ebu_led_set_data(12, 1);  
2062 +    }
2063 +}
2064 +
2065 +static inline void pcie_ahb_pmu_setup(void) 
2066 +{
2067 +    /* XXX, moved to CGU to control AHBM */
2068 +}
2069 +
2070 +static inline void pcie_rcu_endian_setup(int pcie_port)
2071 +{
2072 +    u32 reg;
2073 +
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;
2079 +
2080 +    #ifdef CONFIG_IFX_PCIE_HW_SWAP
2081 +        /* Outbound, software swap needed */
2082 +        reg |= IFX_RCU_BE_AHB3M;
2083 +        reg &= ~IFX_RCU_BE_PCIE0S;
2084 +    #else
2085 +        /* Outbound little endian  */
2086 +        reg &= ~IFX_RCU_BE_AHB3M;
2087 +        reg &= ~IFX_RCU_BE_PCIE0S;
2088 +    #endif
2089 +    }
2090 +    else {
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;
2096 +    #else
2097 +        /* Outbound little endian  */
2098 +        reg &= ~IFX_RCU_BE_AHB3M;
2099 +        reg &= ~IFX_RCU_BE_PCIE1S;
2100 +    #endif
2101 +    }
2102 +
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));
2105 +}
2106 +
2107 +static inline void pcie_phy_pmu_enable(int pcie_port)
2108 +{
2109 +    if (pcie_port == 0) { /* XXX, should use macro*/
2110 +        PCIE0_PHY_PMU_SETUP(IFX_PMU_ENABLE);
2111 +    }
2112 +    else {
2113 +        PCIE1_PHY_PMU_SETUP(IFX_PMU_ENABLE);
2114 +    }
2115 +}
2116 +
2117 +static inline void pcie_phy_pmu_disable(int pcie_port)
2118 +{
2119 +    if (pcie_port == 0) { /* XXX, should use macro*/
2120 +        PCIE0_PHY_PMU_SETUP(IFX_PMU_DISABLE);
2121 +    }
2122 +    else {
2123 +        PCIE1_PHY_PMU_SETUP(IFX_PMU_DISABLE);
2124 +    }
2125 +}
2126 +
2127 +static inline void pcie_pdi_big_endian(int pcie_port)
2128 +{
2129 +    u32 reg;
2130 +
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;
2135 +    }
2136 +    else {
2137 +        /* Config AHB->PCIe and PDI endianness */
2138 +        reg |= IFX_RCU_BE_PCIE1_PDI;
2139 +    }
2140 +    IFX_REG_W32(reg, IFX_RCU_AHB_ENDIAN);
2141 +}
2142 +
2143 +static inline void pcie_pdi_pmu_enable(int pcie_port)
2144 +{
2145 +    if (pcie_port == 0) {
2146 +        /* Enable PDI to access PCIe PHY register */
2147 +        PDI0_PMU_SETUP(IFX_PMU_ENABLE);
2148 +    }
2149 +    else {
2150 +        PDI1_PMU_SETUP(IFX_PMU_ENABLE);
2151 +    }
2152 +}
2153 +
2154 +static inline void pcie_core_rst_assert(int pcie_port)
2155 +{
2156 +    u32 reg;
2157 +
2158 +    reg = IFX_REG_R32(IFX_RCU_RST_REQ);
2159 +
2160 +    /* Reset Core, bit 22 */
2161 +    if (pcie_port == 0) {
2162 +        reg |= 0x00400000;
2163 +    }
2164 +    else {
2165 +        reg |= 0x08000000; /* Bit 27 */
2166 +    }
2167 +    IFX_REG_W32(reg, IFX_RCU_RST_REQ);
2168 +}
2169 +
2170 +static inline void pcie_core_rst_deassert(int pcie_port)
2171 +{
2172 +    u32 reg;
2173 +
2174 +    /* Make sure one micro-second delay */
2175 +    udelay(1);
2176 +
2177 +    reg = IFX_REG_R32(IFX_RCU_RST_REQ);
2178 +    if (pcie_port == 0) {
2179 +        reg &= ~0x00400000; /* bit 22 */
2180 +    }
2181 +    else {
2182 +        reg &= ~0x08000000; /* Bit 27 */
2183 +    }
2184 +    IFX_REG_W32(reg, IFX_RCU_RST_REQ);
2185 +}
2186 +
2187 +static inline void pcie_phy_rst_assert(int pcie_port)
2188 +{
2189 +    u32 reg;
2190 +
2191 +    reg = IFX_REG_R32(IFX_RCU_RST_REQ);
2192 +    if (pcie_port == 0) {
2193 +        reg |= 0x00001000; /* Bit 12 */
2194 +    }
2195 +    else {
2196 +        reg |= 0x00002000; /* Bit 13 */
2197 +    }
2198 +    IFX_REG_W32(reg, IFX_RCU_RST_REQ);
2199 +}
2200 +
2201 +static inline void pcie_phy_rst_deassert(int pcie_port)
2202 +{
2203 +    u32 reg;
2204 +
2205 +    /* Make sure one micro-second delay */
2206 +    udelay(1);
2207 +
2208 +    reg = IFX_REG_R32(IFX_RCU_RST_REQ);
2209 +    if (pcie_port == 0) {
2210 +        reg &= ~0x00001000; /* Bit 12 */
2211 +    }
2212 +    else {
2213 +        reg &= ~0x00002000; /* Bit 13 */
2214 +    }
2215 +    IFX_REG_W32(reg, IFX_RCU_RST_REQ);
2216 +}
2217 +
2218 +static inline void pcie_device_rst_assert(int pcie_port)
2219 +{
2220 +    if (pcie_port == 0) {
2221 +        ifx_ebu_led_set_data(11, 0);
2222 +    }
2223 +    else {
2224 +        ifx_ebu_led_set_data(12, 0);
2225 +    }
2226 +}
2227 +
2228 +static inline void pcie_device_rst_deassert(int pcie_port)
2229 +{
2230 +    mdelay(100);
2231 +    if (pcie_port == 0) {
2232 +        ifx_ebu_led_set_data(11, 1);
2233 +    }
2234 +    else {
2235 +        ifx_ebu_led_set_data(12, 1);
2236 +    }
2237 +    ifx_ebu_led_disable();
2238 +}
2239 +
2240 +static inline void pcie_core_pmu_setup(int pcie_port)
2241 +{
2242 +    if (pcie_port == 0) {
2243 +        PCIE0_CTRL_PMU_SETUP(IFX_PMU_ENABLE);
2244 +    }
2245 +    else {
2246 +        PCIE1_CTRL_PMU_SETUP(IFX_PMU_ENABLE); 
2247 +    }
2248 +}
2249 +
2250 +static inline void pcie_msi_init(int pcie_port)
2251 +{
2252 +    pcie_msi_pic_init(pcie_port);
2253 +    if (pcie_port == 0) {
2254 +        MSI0_PMU_SETUP(IFX_PMU_ENABLE);
2255 +    }
2256 +    else {
2257 +        MSI1_PMU_SETUP(IFX_PMU_ENABLE);
2258 +    }
2259 +}
2260 +
2261 +static inline u32
2262 +ifx_pcie_bus_nr_deduct(u32 bus_number, int pcie_port)
2263 +{
2264 +    u32 tbus_number = bus_number;
2265 +
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();
2270 +        }        
2271 +    }
2272 +#endif /* CONFIG_IFX_PCI */
2273 +    return tbus_number;
2274 +}
2275 +
2276 +static inline u32
2277 +ifx_pcie_bus_enum_hack(struct pci_bus *bus, u32 devfn, int where, u32 value, int pcie_port, int read)
2278 +{
2279 +    struct pci_dev *pdev;
2280 +    u32 tvalue = value;
2281 +
2282 +    /* Sanity check */
2283 +    pdev = pci_get_slot(bus, devfn);
2284 +    if (pdev == NULL) {
2285 +        return tvalue;
2286 +    }
2287 +
2288 +    /* Only care about PCI bridge */
2289 +    if (pdev->hdr_type != PCI_HEADER_TYPE_BRIDGE) {
2290 +        return tvalue;
2291 +    }
2292 +
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);
2298 +            }
2299 +        }
2300 +    #endif /* CONFIG_IFX_PCIE_2ND_CORE */
2301 +    }
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);
2307 +            }
2308 +        }
2309 +    #endif
2310 +    }
2311 +    return tvalue;
2312 +}
2313 +
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..5bee7f8
2318 --- /dev/null
2319 +++ b/arch/mips/pci/ifxmips_pcie_msi.c
2320 @@ -0,0 +1,392 @@
2321 +/******************************************************************************\r
2322 +**\r
2323 +** FILE NAME    : ifxmips_pcie_msi.c\r
2324 +** PROJECT      : IFX UEIP for VRX200\r
2325 +** MODULES      : PCI MSI sub module\r
2326 +**\r
2327 +** DATE         : 02 Mar 2009\r
2328 +** AUTHOR       : Lei Chuanhua\r
2329 +** DESCRIPTION  : PCIe MSI Driver\r
2330 +** COPYRIGHT    :       Copyright (c) 2009\r
2331 +**                      Infineon Technologies AG\r
2332 +**                      Am Campeon 1-12, 85579 Neubiberg, Germany\r
2333 +**\r
2334 +**    This program is free software; you can redistribute it and/or modify\r
2335 +**    it under the terms of the GNU General Public License as published by\r
2336 +**    the Free Software Foundation; either version 2 of the License, or\r
2337 +**    (at your option) any later version.\r
2338 +** HISTORY\r
2339 +** $Date        $Author         $Comment\r
2340 +** 02 Mar,2009  Lei Chuanhua    Initial version\r
2341 +*******************************************************************************/\r
2342 +/*!\r
2343 + \defgroup IFX_PCIE_MSI MSI OS APIs\r
2344 + \ingroup IFX_PCIE\r
2345 + \brief PCIe bus driver OS interface functions\r
2346 +*/\r
2347 +\r
2348 +/*!\r
2349 + \file ifxmips_pcie_msi.c\r
2350 + \ingroup IFX_PCIE \r
2351 + \brief PCIe MSI OS interface file\r
2352 +*/\r
2353 +\r
2354 +#ifndef AUTOCONF_INCLUDED\r
2355 +#include <linux/config.h>\r
2356 +#endif /* AUTOCONF_INCLUDED */\r
2357 +#include <linux/init.h>\r
2358 +#include <linux/sched.h>\r
2359 +#include <linux/slab.h>\r
2360 +#include <linux/interrupt.h>\r
2361 +#include <linux/kernel_stat.h>\r
2362 +#include <linux/pci.h>\r
2363 +#include <linux/msi.h>\r
2364 +#include <linux/module.h>\r
2365 +#include <asm/bootinfo.h>\r
2366 +#include <asm/irq.h>\r
2367 +#include <asm/traps.h>\r
2368 +\r
2369 +#include <asm/ifx/ifx_types.h>\r
2370 +#include <asm/ifx/ifx_regs.h>\r
2371 +#include <asm/ifx/common_routines.h>\r
2372 +#include <asm/ifx/irq.h>\r
2373 +\r
2374 +#include "ifxmips_pcie_reg.h"\r
2375 +#include "ifxmips_pcie.h"\r
2376 +\r
2377 +#define IFX_MSI_IRQ_NUM    16\r
2378 +\r
2379 +enum {\r
2380 +    IFX_PCIE_MSI_IDX0 = 0,\r
2381 +    IFX_PCIE_MSI_IDX1,\r
2382 +    IFX_PCIE_MSI_IDX2,\r
2383 +    IFX_PCIE_MSI_IDX3,\r
2384 +};\r
2385 +\r
2386 +typedef struct ifx_msi_irq_idx {\r
2387 +    const int irq;\r
2388 +    const int idx;\r
2389 +}ifx_msi_irq_idx_t;\r
2390 +\r
2391 +struct ifx_msi_pic {\r
2392 +    volatile u32  pic_table[IFX_MSI_IRQ_NUM];\r
2393 +    volatile u32  pic_endian;    /* 0x40  */\r
2394 +};\r
2395 +typedef struct ifx_msi_pic *ifx_msi_pic_t;\r
2396 +\r
2397 +typedef struct ifx_msi_irq {\r
2398 +    const volatile ifx_msi_pic_t msi_pic_p;\r
2399 +    const u32 msi_phy_base;\r
2400 +    const ifx_msi_irq_idx_t msi_irq_idx[IFX_MSI_IRQ_NUM];\r
2401 +    /*\r
2402 +     * Each bit in msi_free_irq_bitmask represents a MSI interrupt that is \r
2403 +     * in use.\r
2404 +     */\r
2405 +    u16 msi_free_irq_bitmask;\r
2406 +\r
2407 +    /*\r
2408 +     * Each bit in msi_multiple_irq_bitmask tells that the device using \r
2409 +     * this bit in msi_free_irq_bitmask is also using the next bit. This \r
2410 +     * is used so we can disable all of the MSI interrupts when a device \r
2411 +     * uses multiple.\r
2412 +     */\r
2413 +    u16 msi_multiple_irq_bitmask;\r
2414 +}ifx_msi_irq_t;\r
2415 +\r
2416 +static ifx_msi_irq_t msi_irqs[IFX_PCIE_CORE_NR] = {\r
2417 +    {\r
2418 +        .msi_pic_p = (const volatile ifx_msi_pic_t)IFX_MSI_PIC_REG_BASE,\r
2419 +        .msi_phy_base = PCIE_MSI_PHY_BASE,\r
2420 +        .msi_irq_idx = {\r
2421 +            {IFX_PCIE_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE_MSI_IR1, IFX_PCIE_MSI_IDX1},\r
2422 +            {IFX_PCIE_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE_MSI_IR3, IFX_PCIE_MSI_IDX3},\r
2423 +            {IFX_PCIE_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE_MSI_IR1, IFX_PCIE_MSI_IDX1},\r
2424 +            {IFX_PCIE_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE_MSI_IR3, IFX_PCIE_MSI_IDX3},\r
2425 +            {IFX_PCIE_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE_MSI_IR1, IFX_PCIE_MSI_IDX1},\r
2426 +            {IFX_PCIE_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE_MSI_IR3, IFX_PCIE_MSI_IDX3},\r
2427 +            {IFX_PCIE_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE_MSI_IR1, IFX_PCIE_MSI_IDX1},\r
2428 +            {IFX_PCIE_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE_MSI_IR3, IFX_PCIE_MSI_IDX3},\r
2429 +        },\r
2430 +        .msi_free_irq_bitmask = 0,\r
2431 +        .msi_multiple_irq_bitmask= 0,\r
2432 +    },\r
2433 +#ifdef CONFIG_IFX_PCIE_2ND_CORE\r
2434 +    {\r
2435 +        .msi_pic_p = (const volatile ifx_msi_pic_t)IFX_MSI1_PIC_REG_BASE,\r
2436 +        .msi_phy_base = PCIE1_MSI_PHY_BASE,\r
2437 +        .msi_irq_idx = {\r
2438 +            {IFX_PCIE1_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE1_MSI_IR1, IFX_PCIE_MSI_IDX1},\r
2439 +            {IFX_PCIE1_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE1_MSI_IR3, IFX_PCIE_MSI_IDX3},\r
2440 +            {IFX_PCIE1_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE1_MSI_IR1, IFX_PCIE_MSI_IDX1},\r
2441 +            {IFX_PCIE1_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE1_MSI_IR3, IFX_PCIE_MSI_IDX3},\r
2442 +            {IFX_PCIE1_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE1_MSI_IR1, IFX_PCIE_MSI_IDX1},\r
2443 +            {IFX_PCIE1_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE1_MSI_IR3, IFX_PCIE_MSI_IDX3},\r
2444 +            {IFX_PCIE1_MSI_IR0, IFX_PCIE_MSI_IDX0}, {IFX_PCIE1_MSI_IR1, IFX_PCIE_MSI_IDX1},\r
2445 +            {IFX_PCIE1_MSI_IR2, IFX_PCIE_MSI_IDX2}, {IFX_PCIE1_MSI_IR3, IFX_PCIE_MSI_IDX3},\r
2446 +        },\r
2447 +        .msi_free_irq_bitmask = 0,\r
2448 +        .msi_multiple_irq_bitmask= 0,\r
2449 +\r
2450 +    },\r
2451 +#endif /* CONFIG_IFX_PCIE_2ND_CORE */\r
2452 +};\r
2453 +\r
2454 +/* \r
2455 + * This lock controls updates to msi_free_irq_bitmask, \r
2456 + * msi_multiple_irq_bitmask and pic register settting\r
2457 + */ \r
2458 +static DEFINE_SPINLOCK(ifx_pcie_msi_lock);\r
2459 +\r
2460 +void pcie_msi_pic_init(int pcie_port)\r
2461 +{\r
2462 +    spin_lock(&ifx_pcie_msi_lock);\r
2463 +    msi_irqs[pcie_port].msi_pic_p->pic_endian = IFX_MSI_PIC_BIG_ENDIAN;\r
2464 +    spin_unlock(&ifx_pcie_msi_lock);\r
2465 +}\r
2466 +\r
2467 +/** \r
2468 + * \fn int arch_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)\r
2469 + * \brief Called when a driver request MSI interrupts instead of the \r
2470 + * legacy INT A-D. This routine will allocate multiple interrupts \r
2471 + * for MSI devices that support them. A device can override this by \r
2472 + * programming the MSI control bits [6:4] before calling \r
2473 + * pci_enable_msi(). \r
2474 + * \r
2475 + * \param[in] pdev   Device requesting MSI interrupts \r
2476 + * \param[in] desc   MSI descriptor \r
2477 + * \r
2478 + * \return   -EINVAL Invalid pcie root port or invalid msi bit\r
2479 + * \return    0        OK\r
2480 + * \ingroup IFX_PCIE_MSI\r
2481 + */\r
2482 +int \r
2483 +arch_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)\r
2484 +{\r
2485 +    int  irq, pos;\r
2486 +    u16  control;\r
2487 +    int  irq_idx;\r
2488 +    int  irq_step;\r
2489 +    int configured_private_bits;\r
2490 +    int request_private_bits;\r
2491 +    struct msi_msg msg;\r
2492 +    u16 search_mask;\r
2493 +    struct ifx_pci_controller *ctrl = pdev->bus->sysdata;\r
2494 +    int pcie_port = ctrl->port;\r
2495 +\r
2496 +    IFX_PCIE_PRINT(PCIE_MSG_MSI, "%s %s enter\n", __func__, pci_name(pdev));\r
2497 +\r
2498 +    /* XXX, skip RC MSI itself */\r
2499 +    if (pdev->pcie_type == PCI_EXP_TYPE_ROOT_PORT) {\r
2500 +        IFX_PCIE_PRINT(PCIE_MSG_MSI, "%s RC itself doesn't use MSI interrupt\n", __func__);\r
2501 +        return -EINVAL;\r
2502 +    }\r
2503 +\r
2504 +    /*\r
2505 +     * Read the MSI config to figure out how many IRQs this device \r
2506 +     * wants.  Most devices only want 1, which will give \r
2507 +     * configured_private_bits and request_private_bits equal 0. \r
2508 +     */\r
2509 +    pci_read_config_word(pdev, desc->msi_attrib.pos + PCI_MSI_FLAGS, &control);\r
2510 +\r
2511 +    /*\r
2512 +     * If the number of private bits has been configured then use \r
2513 +     * that value instead of the requested number. This gives the \r
2514 +     * driver the chance to override the number of interrupts \r
2515 +     * before calling pci_enable_msi(). \r
2516 +     */\r
2517 +    configured_private_bits = (control & PCI_MSI_FLAGS_QSIZE) >> 4; \r
2518 +    if (configured_private_bits == 0) {\r
2519 +        /* Nothing is configured, so use the hardware requested size */\r
2520 +        request_private_bits = (control & PCI_MSI_FLAGS_QMASK) >> 1;\r
2521 +    }\r
2522 +    else {\r
2523 +        /*\r
2524 +         * Use the number of configured bits, assuming the \r
2525 +         * driver wanted to override the hardware request \r
2526 +         * value.\r
2527 +         */\r
2528 +        request_private_bits = configured_private_bits;\r
2529 +    }\r
2530 +\r
2531 +    /*\r
2532 +     * The PCI 2.3 spec mandates that there are at most 32\r
2533 +     * interrupts. If this device asks for more, only give it one.\r
2534 +     */\r
2535 +    if (request_private_bits > 5) {\r
2536 +        request_private_bits = 0;\r
2537 +    }\r
2538 +again:\r
2539 +    /*\r
2540 +     * The IRQs have to be aligned on a power of two based on the\r
2541 +     * number being requested.\r
2542 +     */\r
2543 +    irq_step = (1 << request_private_bits);\r
2544 +\r
2545 +    /* Mask with one bit for each IRQ */\r
2546 +    search_mask = (1 << irq_step) - 1;\r
2547 +\r
2548 +    /*\r
2549 +     * We're going to search msi_free_irq_bitmask_lock for zero \r
2550 +     * bits. This represents an MSI interrupt number that isn't in \r
2551 +     * use.\r
2552 +     */\r
2553 +    spin_lock(&ifx_pcie_msi_lock);\r
2554 +    for (pos = 0; pos < IFX_MSI_IRQ_NUM; pos += irq_step) {\r
2555 +        if ((msi_irqs[pcie_port].msi_free_irq_bitmask & (search_mask << pos)) == 0) {\r
2556 +            msi_irqs[pcie_port].msi_free_irq_bitmask |= search_mask << pos; \r
2557 +            msi_irqs[pcie_port].msi_multiple_irq_bitmask |= (search_mask >> 1) << pos;\r
2558 +            break; \r
2559 +        }\r
2560 +    }\r
2561 +    spin_unlock(&ifx_pcie_msi_lock); \r
2562 +\r
2563 +    /* Make sure the search for available interrupts didn't fail */ \r
2564 +    if (pos >= IFX_MSI_IRQ_NUM) {\r
2565 +        if (request_private_bits) {\r
2566 +            IFX_PCIE_PRINT(PCIE_MSG_MSI, "%s: Unable to find %d free "\r
2567 +                  "interrupts, trying just one", __func__, 1 << request_private_bits);\r
2568 +            request_private_bits = 0;\r
2569 +            goto again;\r
2570 +        }\r
2571 +        else {\r
2572 +            printk(KERN_ERR "%s: Unable to find a free MSI interrupt\n", __func__);\r
2573 +            return -EINVAL;\r
2574 +        }\r
2575 +    } \r
2576 +    irq = msi_irqs[pcie_port].msi_irq_idx[pos].irq;\r
2577 +    irq_idx = msi_irqs[pcie_port].msi_irq_idx[pos].idx;\r
2578 +\r
2579 +    IFX_PCIE_PRINT(PCIE_MSG_MSI, "pos %d, irq %d irq_idx %d\n", pos, irq, irq_idx);\r
2580 +\r
2581 +    /*\r
2582 +     * Initialize MSI. This has to match the memory-write endianess from the device \r
2583 +     * Address bits [23:12]\r
2584 +     */\r
2585 +    spin_lock(&ifx_pcie_msi_lock); \r
2586 +    msi_irqs[pcie_port].msi_pic_p->pic_table[pos] = SM(irq_idx, IFX_MSI_PIC_INT_LINE) |\r
2587 +                    SM((msi_irqs[pcie_port].msi_phy_base >> 12), IFX_MSI_PIC_MSG_ADDR) |\r
2588 +                    SM((1 << pos), IFX_MSI_PIC_MSG_DATA);\r
2589 +\r
2590 +    /* Enable this entry */\r
2591 +    msi_irqs[pcie_port].msi_pic_p->pic_table[pos] &= ~IFX_MSI_PCI_INT_DISABLE;\r
2592 +    spin_unlock(&ifx_pcie_msi_lock);\r
2593 +\r
2594 +    IFX_PCIE_PRINT(PCIE_MSG_MSI, "pic_table[%d]: 0x%08x\n",\r
2595 +        pos, msi_irqs[pcie_port].msi_pic_p->pic_table[pos]);\r
2596 +\r
2597 +    /* Update the number of IRQs the device has available to it */\r
2598 +    control &= ~PCI_MSI_FLAGS_QSIZE;\r
2599 +    control |= (request_private_bits << 4);\r
2600 +    pci_write_config_word(pdev, desc->msi_attrib.pos + PCI_MSI_FLAGS, control);\r
2601 +\r
2602 +    set_irq_msi(irq, desc);\r
2603 +    msg.address_hi = 0x0;\r
2604 +    msg.address_lo = msi_irqs[pcie_port].msi_phy_base;\r
2605 +    msg.data = SM((1 << pos), IFX_MSI_PIC_MSG_DATA);\r
2606 +    IFX_PCIE_PRINT(PCIE_MSG_MSI, "msi_data: pos %d 0x%08x\n", pos, msg.data);\r
2607 +\r
2608 +    write_msi_msg(irq, &msg);\r
2609 +    IFX_PCIE_PRINT(PCIE_MSG_MSI, "%s exit\n", __func__);\r
2610 +    return 0;\r
2611 +}\r
2612 +\r
2613 +static int\r
2614 +pcie_msi_irq_to_port(unsigned int irq, int *port)\r
2615 +{\r
2616 +    int ret = 0;\r
2617 +\r
2618 +    if (irq == IFX_PCIE_MSI_IR0 || irq == IFX_PCIE_MSI_IR1 ||\r
2619 +        irq == IFX_PCIE_MSI_IR2 || irq == IFX_PCIE_MSI_IR3) {\r
2620 +        *port = IFX_PCIE_PORT0;\r
2621 +    }\r
2622 +#ifdef CONFIG_IFX_PCIE_2ND_CORE\r
2623 +    else if (irq == IFX_PCIE1_MSI_IR0 || irq == IFX_PCIE1_MSI_IR1 ||\r
2624 +        irq == IFX_PCIE1_MSI_IR2 || irq == IFX_PCIE1_MSI_IR3) {\r
2625 +        *port = IFX_PCIE_PORT1;\r
2626 +    }\r
2627 +#endif /* CONFIG_IFX_PCIE_2ND_CORE */\r
2628 +    else {\r
2629 +        printk(KERN_ERR "%s: Attempted to teardown illegal " \r
2630 +            "MSI interrupt (%d)\n", __func__, irq);\r
2631 +        ret = -EINVAL;\r
2632 +    }\r
2633 +    return ret;\r
2634 +}\r
2635 +\r
2636 +/** \r
2637 + * \fn void arch_teardown_msi_irq(unsigned int irq)\r
2638 + * \brief Called when a device no longer needs its MSI interrupts. All \r
2639 + * MSI interrupts for the device are freed. \r
2640 + * \r
2641 + * \param irq   The devices first irq number. There may be multple in sequence.\r
2642 + * \return none\r
2643 + * \ingroup IFX_PCIE_MSI\r
2644 + */\r
2645 +void \r
2646 +arch_teardown_msi_irq(unsigned int irq)\r
2647 +{\r
2648 +    int pos;\r
2649 +    int number_irqs; \r
2650 +    u16 bitmask;\r
2651 +    int pcie_port;\r
2652 +\r
2653 +    IFX_PCIE_PRINT(PCIE_MSG_MSI, "%s enter\n", __func__);\r
2654 +\r
2655 +    BUG_ON(irq > INT_NUM_IM4_IRL31);\r
2656 +\r
2657 +    if (pcie_msi_irq_to_port(irq, &pcie_port) != 0) {\r
2658 +        return;\r
2659 +    }\r
2660 +\r
2661 +    /* Shift the mask to the correct bit location, not always correct \r
2662 +     * Probally, the first match will be chosen.\r
2663 +     */\r
2664 +    for (pos = 0; pos < IFX_MSI_IRQ_NUM; pos++) {\r
2665 +        if ((msi_irqs[pcie_port].msi_irq_idx[pos].irq == irq) \r
2666 +            && (msi_irqs[pcie_port].msi_free_irq_bitmask & ( 1 << pos))) {\r
2667 +            break;\r
2668 +        }\r
2669 +    }\r
2670 +    if (pos >= IFX_MSI_IRQ_NUM) {\r
2671 +        printk(KERN_ERR "%s: Unable to find a matched MSI interrupt\n", __func__);\r
2672 +        return;\r
2673 +    }\r
2674 +    spin_lock(&ifx_pcie_msi_lock);\r
2675 +    /* Disable this entry */\r
2676 +    msi_irqs[pcie_port].msi_pic_p->pic_table[pos] |= IFX_MSI_PCI_INT_DISABLE;\r
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);\r
2678 +    spin_unlock(&ifx_pcie_msi_lock); \r
2679 +    /*\r
2680 +     * Count the number of IRQs we need to free by looking at the\r
2681 +     * msi_multiple_irq_bitmask. Each bit set means that the next\r
2682 +     * IRQ is also owned by this device.\r
2683 +     */ \r
2684 +    number_irqs = 0; \r
2685 +    while (((pos + number_irqs) < IFX_MSI_IRQ_NUM) && \r
2686 +        (msi_irqs[pcie_port].msi_multiple_irq_bitmask & (1 << (pos + number_irqs)))) {\r
2687 +        number_irqs++;\r
2688 +    }\r
2689 +    number_irqs++;\r
2690 +\r
2691 +    /* Mask with one bit for each IRQ */\r
2692 +    bitmask = (1 << number_irqs) - 1;\r
2693 +\r
2694 +    bitmask <<= pos;\r
2695 +    if ((msi_irqs[pcie_port].msi_free_irq_bitmask & bitmask) != bitmask) {\r
2696 +        printk(KERN_ERR "%s: Attempted to teardown MSI "\r
2697 +             "interrupt (%d) not in use\n", __func__, irq);\r
2698 +        return;\r
2699 +    }\r
2700 +    /* Checks are done, update the in use bitmask */\r
2701 +    spin_lock(&ifx_pcie_msi_lock);\r
2702 +    msi_irqs[pcie_port].msi_free_irq_bitmask &= ~bitmask;\r
2703 +    msi_irqs[pcie_port].msi_multiple_irq_bitmask &= ~(bitmask >> 1);\r
2704 +    spin_unlock(&ifx_pcie_msi_lock);\r
2705 +    IFX_PCIE_PRINT(PCIE_MSG_MSI, "%s exit\n", __func__);\r
2706 +}\r
2707 +\r
2708 +MODULE_LICENSE("GPL");\r
2709 +MODULE_AUTHOR("Chuanhua.Lei@infineon.com");\r
2710 +MODULE_SUPPORTED_DEVICE("Infineon PCIe IP builtin MSI PIC module");\r
2711 +MODULE_DESCRIPTION("Infineon PCIe IP builtin MSI PIC driver");\r
2712 +\r
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..a4171a7
2716 --- /dev/null
2717 +++ b/arch/mips/pci/ifxmips_pcie_phy.c
2718 @@ -0,0 +1,478 @@
2719 +/******************************************************************************\r
2720 +**
2721 +** FILE NAME    : ifxmips_pcie_phy.c
2722 +** PROJECT      : IFX UEIP for VRX200
2723 +** MODULES      : PCIe PHY sub module
2724 +**
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
2731 +**
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.
2736 +** HISTORY
2737 +** $Version $Date        $Author         $Comment
2738 +** 0.0.1    14 May,2009  Lei Chuanhua    Initial version
2739 +*******************************************************************************/
2740 +/*!\r
2741 + \file ifxmips_pcie_phy.c\r
2742 + \ingroup IFX_PCIE  \r
2743 + \brief PCIe PHY PLL register programming source file\r
2744 +*/\r
2745 +#include <linux/types.h>
2746 +#include <linux/kernel.h>
2747 +#include <asm/paccess.h>
2748 +#include <linux/delay.h>\r
2749 +
2750 +#include "ifxmips_pcie_reg.h"
2751 +#include "ifxmips_pcie.h"
2752 +
2753 +/* PCIe PDI only supports 16 bit operation */
2754 +
2755 +#define IFX_PCIE_PHY_REG_WRITE16(__addr, __data) \
2756 +    ((*(volatile u16 *) (__addr)) = (__data))
2757 +    
2758 +#define IFX_PCIE_PHY_REG_READ16(__addr)  \
2759 +    (*(volatile u16 *) (__addr))
2760 +
2761 +#define IFX_PCIE_PHY_REG16(__addr)   \
2762 +    (*(volatile u16 *) (__addr))
2763 +\r
2764 +#define IFX_PCIE_PHY_REG(__reg, __value, __mask) do { \\r
2765 +    u16 read_data;                                    \\r
2766 +    u16 write_data;                                   \\r
2767 +    read_data = IFX_PCIE_PHY_REG_READ16((__reg));      \\r
2768 +    write_data = (read_data & ((u16)~(__mask))) | (((u16)(__value)) & ((u16)(__mask)));\\r
2769 +    IFX_PCIE_PHY_REG_WRITE16((__reg), write_data);               \\r
2770 +} while (0)\r
2771 +\r
2772 +#define IFX_PCIE_PLL_TIMEOUT 1000 /* Tunnable */\r
2773 +\r
2774 +//#define IFX_PCI_PHY_REG_DUMP
2775 +
2776 +#ifdef IFX_PCI_PHY_REG_DUMP
2777 +static void
2778 +pcie_phy_reg_dump(int pcie_port) 
2779 +{
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)));
2792 +
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)));\r
2800 +    printk("PCIE_PHY_TX1_MOD2     0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX1_MOD2(pcie_port)));\r
2801 +    printk("PCIE_PHY_TX1_MOD3     0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX1_MOD3(pcie_port)));\r
2802 +
2803 +    printk("TX2 REGFILE\n");
2804 +    printk("PCIE_PHY_TX2_CTRL1    0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX2_CTRL1(pcie_port)));\r
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)));\r
2809 +    printk("PCIE_PHY_TX2_MOD2     0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX2_MOD2(pcie_port)));\r
2810 +    printk("PCIE_PHY_TX2_MOD3     0x%04x\n", IFX_PCIE_PHY_REG16(PCIE_PHY_TX2_MOD3(pcie_port)));\r
2811 +
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)));\r
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)));\r
2818 +}
2819 +#endif /* IFX_PCI_PHY_REG_DUMP */
2820 +
2821 +static void
2822 +pcie_phy_comm_setup(int pcie_port)
2823 +{
2824 +   /* PLL Setting */
2825 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL1(pcie_port), 0x120e, 0xFFFF);
2826 +
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);
2830 +
2831 +    /* Endcnt */
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);
2834 +
2835 +    /* force */\r
2836 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL1(pcie_port), 0x0008, 0x0008);\r
2837 +\r
2838 +    /* predrv_ser_en */\r
2839 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_A_CTRL2(pcie_port), 0x0706, 0xFFFF);\r
2840 +
2841 +    /* ctrl_lim */
2842 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL3(pcie_port), 0x1FFF, 0xFFFF);
2843 +
2844 +    /* ctrl */
2845 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_A_CTRL1(pcie_port), 0x0800, 0xFF00);
2846 +
2847 +    /* predrv_ser_en */
2848 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX2_A_CTRL2(pcie_port), 0x4702, 0x7F00);
2849 +
2850 +    /* RTERM*/
2851 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL2(pcie_port), 0x2e00, 0xFFFF);
2852 +\r
2853 +    /* Improved 100MHz clock output  */\r
2854 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX2_CTRL2(pcie_port), 0x3096, 0xFFFF);\r
2855 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX2_A_CTRL2(pcie_port), 0x4707, 0xFFFF);\r
2856 +
2857 +    /* Reduced CDR BW to avoid glitches */\r
2858 +    IFX_PCIE_PHY_REG(PCIE_PHY_RX1_CDR(pcie_port), 0x0235, 0xFFFF);\r
2859 +}\r
2860 +\r
2861 +#ifdef CONFIG_IFX_PCIE_PHY_36MHZ_MODE\r
2862 +static void \r
2863 +pcie_phy_36mhz_mode_setup(int pcie_port) \r
2864 +{\r
2865 +    IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d enter\n", __func__, pcie_port);\r
2866 +#ifdef IFX_PCI_PHY_REG_DUMP\r
2867 +    IFX_PCIE_PRINT(PCIE_MSG_PHY, "Initial PHY register dump\n");\r
2868 +    pcie_phy_reg_dump(pcie_port);\r
2869 +#endif\r
2870 +\r
2871 +    /* en_ext_mmd_div_ratio */
2872 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0000, 0x0002);
2873 +
2874 +    /* ext_mmd_div_ratio*/
2875 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0000, 0x0070);
2876 +
2877 +    /* pll_ensdm */
2878 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0200, 0x0200);
2879 +
2880 +    /* en_const_sdm */
2881 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0100, 0x0100);
2882 +
2883 +    /* mmd */\r
2884 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL3(pcie_port), 0x2000, 0xe000);\r
2885 +\r
2886 +    /* lf_mode */
2887 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL2(pcie_port), 0x0000, 0x4000);
2888 +
2889 +    /* const_sdm */
2890 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL1(pcie_port), 0x38e4, 0xFFFF);
2891 +
2892 +    /* const sdm */
2893 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x00ee, 0x00FF);
2894 +
2895 +    /* pllmod */
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);
2900 +
2901 +    IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d exit\n", __func__, pcie_port);
2902 +}
2903 +#endif /* CONFIG_IFX_PCIE_PHY_36MHZ_MODE */
2904 +
2905 +#ifdef CONFIG_IFX_PCIE_PHY_36MHZ_SSC_MODE\r
2906 +static void \r
2907 +pcie_phy_36mhz_ssc_mode_setup(int pcie_port) \r
2908 +{\r
2909 +    IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d enter\n", __func__, pcie_port);\r
2910 +#ifdef IFX_PCI_PHY_REG_DUMP\r
2911 +    IFX_PCIE_PRINT(PCIE_MSG_PHY, "Initial PHY register dump\n");\r
2912 +    pcie_phy_reg_dump(pcie_port);\r
2913 +#endif\r
2914 +\r
2915 +    /* PLL Setting */\r
2916 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL1(pcie_port), 0x120e, 0xFFFF);\r
2917 +\r
2918 +    /* Increase the bias reference voltage */\r
2919 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL2(pcie_port), 0x39D7, 0xFFFF);\r
2920 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL3(pcie_port), 0x0900, 0xFFFF);\r
2921 +\r
2922 +    /* Endcnt */\r
2923 +    IFX_PCIE_PHY_REG(PCIE_PHY_RX1_EI(pcie_port), 0x0004, 0xFFFF);\r
2924 +    IFX_PCIE_PHY_REG(PCIE_PHY_RX1_A_CTRL(pcie_port), 0x6803, 0xFFFF);\r
2925 +\r
2926 +    /* Force */\r
2927 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL1(pcie_port), 0x0008, 0x0008);\r
2928 +\r
2929 +    /* Predrv_ser_en */\r
2930 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_A_CTRL2(pcie_port), 0x0706, 0xFFFF);\r
2931 +\r
2932 +    /* ctrl_lim */\r
2933 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL3(pcie_port), 0x1FFF, 0xFFFF);\r
2934 +\r
2935 +    /* ctrl */\r
2936 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_A_CTRL1(pcie_port), 0x0800, 0xFF00);\r
2937 +\r
2938 +    /* predrv_ser_en */\r
2939 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX2_A_CTRL2(pcie_port), 0x4702, 0x7F00);\r
2940 +\r
2941 +    /* RTERM*/\r
2942 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL2(pcie_port), 0x2e00, 0xFFFF);\r
2943 +\r
2944 +    /* en_ext_mmd_div_ratio */\r
2945 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0000, 0x0002);\r
2946 +\r
2947 +    /* ext_mmd_div_ratio*/\r
2948 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0000, 0x0070);\r
2949 +\r
2950 +    /* pll_ensdm */\r
2951 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0400, 0x0400);\r
2952 +\r
2953 +    /* en_const_sdm */\r
2954 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0200, 0x0200);\r
2955 +\r
2956 +    /* mmd */\r
2957 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL3(pcie_port), 0x2000, 0xe000);\r
2958 +\r
2959 +    /* lf_mode */\r
2960 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL2(pcie_port), 0x0000, 0x4000);\r
2961 +\r
2962 +    /* const_sdm */\r
2963 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL1(pcie_port), 0x38e4, 0xFFFF);\r
2964 +\r
2965 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0000, 0x0100);\r
2966 +    /* const sdm */\r
2967 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x00ee, 0x00FF);\r
2968 +\r
2969 +    /* pllmod */\r
2970 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL7(pcie_port), 0x0002, 0xFFFF);\r
2971 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL6(pcie_port), 0x3a04, 0xFFFF);\r
2972 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL5(pcie_port), 0xfae3, 0xFFFF);\r
2973 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL4(pcie_port), 0x1c72, 0xFFFF);\r
2974 +\r
2975 +    /* improved 100MHz clock output  */\r
2976 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX2_CTRL2(pcie_port), 0x3096, 0xFFFF);\r
2977 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX2_A_CTRL2(pcie_port), 0x4707, 0xFFFF);\r
2978 +\r
2979 +    /* reduced CDR BW to avoid glitches */\r
2980 +    IFX_PCIE_PHY_REG(PCIE_PHY_RX1_CDR(pcie_port), 0x0235, 0xFFFF);\r
2981 +    \r
2982 +    IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d exit\n", __func__, pcie_port);\r
2983 +}\r
2984 +#endif /* CONFIG_IFX_PCIE_PHY_36MHZ_SSC_MODE */\r
2985 +\r
2986 +#ifdef CONFIG_IFX_PCIE_PHY_25MHZ_MODE
2987 +static void 
2988 +pcie_phy_25mhz_mode_setup(int pcie_port) 
2989 +{
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);
2994 +#endif
2995 +    /* en_const_sdm */\r
2996 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0100, 0x0100);\r
2997 +
2998 +    /* pll_ensdm */    
2999 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0000, 0x0200);
3000 +
3001 +    /* en_ext_mmd_div_ratio*/
3002 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0002, 0x0002);
3003 +
3004 +    /* ext_mmd_div_ratio*/
3005 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0040, 0x0070);
3006 +
3007 +    /* mmd */
3008 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL3(pcie_port), 0x6000, 0xe000);
3009 +
3010 +    /* lf_mode */
3011 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL2(pcie_port), 0x4000, 0x4000);
3012 +
3013 +    IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d exit\n", __func__, pcie_port);\r
3014 +}
3015 +#endif /* CONFIG_IFX_PCIE_PHY_25MHZ_MODE */
3016 +
3017 +#ifdef CONFIG_IFX_PCIE_PHY_100MHZ_MODE\r
3018 +static void 
3019 +pcie_phy_100mhz_mode_setup(int pcie_port) 
3020 +{
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");\r
3024 +    pcie_phy_reg_dump(pcie_port);\r
3025 +#endif 
3026 +    /* en_ext_mmd_div_ratio */
3027 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0000, 0x0002);
3028 +
3029 +    /* ext_mmd_div_ratio*/
3030 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL3(pcie_port), 0x0000, 0x0070);
3031 +
3032 +    /* pll_ensdm */
3033 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0200, 0x0200);
3034 +
3035 +    /* en_const_sdm */
3036 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x0100, 0x0100);
3037 +
3038 +    /* mmd */
3039 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL3(pcie_port), 0x2000, 0xe000);
3040 +
3041 +    /* lf_mode */
3042 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_A_CTRL2(pcie_port), 0x0000, 0x4000);
3043 +
3044 +    /* const_sdm */
3045 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL1(pcie_port), 0x38e4, 0xFFFF);
3046 +
3047 +    /* const sdm */
3048 +    IFX_PCIE_PHY_REG(PCIE_PHY_PLL_CTRL2(pcie_port), 0x00ee, 0x00FF);
3049 +
3050 +    /* pllmod */
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);
3055 +
3056 +    IFX_PCIE_PRINT(PCIE_MSG_PHY, "%s pcie_port %d exit\n", __func__, pcie_port);
3057 +}
3058 +#endif /* CONFIG_IFX_PCIE_PHY_100MHZ_MODE */
3059 +
3060 +static int\r
3061 +pcie_phy_wait_startup_ready(int pcie_port)\r
3062 +{\r
3063 +    int i;\r
3064 +\r
3065 +    for (i = 0; i < IFX_PCIE_PLL_TIMEOUT; i++) {\r
3066 +        if ((IFX_PCIE_PHY_REG16(PCIE_PHY_PLL_STATUS(pcie_port)) & 0x0040) != 0) {\r
3067 +            break;\r
3068 +        }\r
3069 +        udelay(10);\r
3070 +    }\r
3071 +    if (i >= IFX_PCIE_PLL_TIMEOUT) {\r
3072 +        printk(KERN_ERR "%s PLL Link timeout\n", __func__);\r
3073 +        return -1;\r
3074 +    }\r
3075 +    return 0;\r
3076 +}\r
3077 +\r
3078 +static void \r
3079 +pcie_phy_load_enable(int pcie_port, int slice) \r
3080 +{\r
3081 +    /* Set the load_en of tx/rx slice to '1' */\r
3082 +    switch (slice) {\r
3083 +        case 1:\r
3084 +            IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL1(pcie_port), 0x0010, 0x0010);\r
3085 +            break;\r
3086 +        case 2:\r
3087 +            IFX_PCIE_PHY_REG(PCIE_PHY_TX2_CTRL1(pcie_port), 0x0010, 0x0010);\r
3088 +            break;\r
3089 +        case 3:\r
3090 +            IFX_PCIE_PHY_REG(PCIE_PHY_RX1_CTRL1(pcie_port), 0x0002, 0x0002);\r
3091 +            break;\r
3092 +    }\r
3093 +}\r
3094 +\r
3095 +static void \r
3096 +pcie_phy_load_disable(int pcie_port, int slice) \r
3097 +{ \r
3098 +    /* set the load_en of tx/rx slice to '0' */ \r
3099 +    switch (slice) {\r
3100 +        case 1:\r
3101 +            IFX_PCIE_PHY_REG(PCIE_PHY_TX1_CTRL1(pcie_port), 0x0000, 0x0010);\r
3102 +            break;\r
3103 +        case 2:\r
3104 +            IFX_PCIE_PHY_REG(PCIE_PHY_TX2_CTRL1(pcie_port), 0x0000, 0x0010);\r
3105 +            break;\r
3106 +        case 3: \r
3107 +            IFX_PCIE_PHY_REG(PCIE_PHY_RX1_CTRL1(pcie_port), 0x0000, 0x0002);\r
3108 +            break;\r
3109 +    }\r
3110 +}\r
3111 +\r
3112 +static void \r
3113 +pcie_phy_load_war(int pcie_port)\r
3114 +{\r
3115 +    int slice;\r
3116 +\r
3117 +    for (slice = 1; slice < 4; slice++) {\r
3118 +        pcie_phy_load_enable(pcie_port, slice);\r
3119 +        udelay(1);\r
3120 +        pcie_phy_load_disable(pcie_port, slice);\r
3121 +    }\r
3122 +}\r
3123 +\r
3124 +static void \r
3125 +pcie_phy_tx2_modulation(int pcie_port)\r
3126 +{\r
3127 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX2_MOD1(pcie_port), 0x1FFE, 0xFFFF);\r
3128 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX2_MOD2(pcie_port), 0xFFFE, 0xFFFF);\r
3129 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX2_MOD3(pcie_port), 0x0601, 0xFFFF);\r
3130 +    mdelay(1);\r
3131 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX2_MOD3(pcie_port), 0x0001, 0xFFFF);\r
3132 +}\r
3133 +\r
3134 +static void \r
3135 +pcie_phy_tx1_modulation(int pcie_port)\r
3136 +{\r
3137 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_MOD1(pcie_port), 0x1FFE, 0xFFFF);\r
3138 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_MOD2(pcie_port), 0xFFFE, 0xFFFF);\r
3139 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_MOD3(pcie_port), 0x0601, 0xFFFF);\r
3140 +    mdelay(1);\r
3141 +    IFX_PCIE_PHY_REG(PCIE_PHY_TX1_MOD3(pcie_port), 0x0001, 0xFFFF);\r
3142 +}\r
3143 +\r
3144 +static void\r
3145 +pcie_phy_tx_modulation_war(int pcie_port)\r
3146 +{\r
3147 +    int i;\r
3148 +\r
3149 +#define PCIE_PHY_MODULATION_NUM 5 \r
3150 +    for (i = 0; i < PCIE_PHY_MODULATION_NUM; i++) {\r
3151 +        pcie_phy_tx2_modulation(pcie_port);\r
3152 +        pcie_phy_tx1_modulation(pcie_port);\r
3153 +    }\r
3154 +#undef PCIE_PHY_MODULATION_NUM\r
3155 +}\r
3156 +\r
3157 +void
3158 +pcie_phy_clock_mode_setup(int pcie_port)
3159 +{
3160 +    pcie_pdi_big_endian(pcie_port);
3161 +
3162 +    /* Enable PDI to access PCIe PHY register */
3163 +    pcie_pdi_pmu_enable(pcie_port);
3164 +\r
3165 +    /* Configure PLL and PHY clock */\r
3166 +    pcie_phy_comm_setup(pcie_port);\r
3167 +\r
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)\r
3171 +    pcie_phy_36mhz_ssc_mode_setup(pcie_port);\r
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);
3176 +#else
3177 +    #error "PCIE PHY Clock Mode must be chosen first!!!!"
3178 +#endif /* CONFIG_IFX_PCIE_PHY_36MHZ_MODE */
3179 +\r
3180 +    /* Enable PCIe PHY and make PLL setting take effect */\r
3181 +    pcie_phy_pmu_enable(pcie_port);\r
3182 +\r
3183 +    /* Check if we are in startup_ready status */\r
3184 +    pcie_phy_wait_startup_ready(pcie_port);\r
3185 +\r
3186 +    pcie_phy_load_war(pcie_port);\r
3187 +\r
3188 +    /* Apply TX modulation workarounds */\r
3189 +    pcie_phy_tx_modulation_war(pcie_port);\r
3190 +\r
3191 +#ifdef IFX_PCI_PHY_REG_DUMP\r
3192 +    IFX_PCIE_PRINT(PCIE_MSG_PHY, "Modified PHY register dump\n");\r
3193 +    pcie_phy_reg_dump(pcie_port);\r
3194 +#endif\r
3195 +}\r
3196 +\r
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
3200 --- /dev/null
3201 +++ b/arch/mips/pci/ifxmips_pcie_pm.c
3202 @@ -0,0 +1,176 @@
3203 +/******************************************************************************
3204 +**
3205 +** FILE NAME    : ifxmips_pcie_pm.c
3206 +** PROJECT      : IFX UEIP
3207 +** MODULES      : PCIE Root Complex Driver
3208 +**
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
3215 +**
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.
3220 +**
3221 +** HISTORY
3222 +** $Date        $Author         $Comment
3223 +** 21 Dec,2009   Lei Chuanhua    First UEIP release
3224 +*******************************************************************************/
3225 +/*!
3226 +  \defgroup IFX_PCIE_PM Power Management functions
3227 +  \ingroup IFX_PCIE
3228 +  \brief IFX PCIE Root Complex Driver power management functions
3229 +*/
3230 +
3231 +/*!
3232 + \file ifxmips_pcie_pm.c
3233 + \ingroup IFX_PCIE    
3234 + \brief source file for PCIE Root Complex Driver Power Management
3235 +*/
3236 +
3237 +#ifndef EXPORT_SYMTAB
3238 +#define EXPORT_SYMTAB
3239 +#endif
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>
3248 +
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"
3255 +
3256 +/** 
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
3259 + *
3260 + * \param pmcuState This parameter is a PMCU state.
3261 + *
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
3266 + */
3267 +static IFX_PMCU_RETURN_t 
3268 +ifx_pcie_pmcu_state_change(IFX_PMCU_STATE_t pmcuState)
3269 +{
3270 +    switch(pmcuState) 
3271 +    {
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;
3280 +        default:
3281 +            return IFX_PMCU_RETURN_DENIED;
3282 +    }
3283 +}
3284 +
3285 +/** 
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
3288 +
3289 + * \param pmcuState Pointer to return power state.
3290 + *
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
3295 + */
3296 +static IFX_PMCU_RETURN_t 
3297 +ifx_pcie_pmcu_state_get(IFX_PMCU_STATE_t *pmcuState)
3298 +{
3299 +    return IFX_PMCU_RETURN_SUCCESS;
3300 +}
3301 +
3302 +/**
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
3305 + * 
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
3312 + */
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)
3315 +{
3316 +    return IFX_PMCU_RETURN_SUCCESS;
3317 +}
3318 +
3319 +/**
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
3322 + * 
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
3329 + */
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)
3332 +{
3333 +    return IFX_PMCU_RETURN_SUCCESS;
3334 +}
3335 +
3336 +/** 
3337 + * \fn static void ifx_pcie_pmcu_init(void)
3338 + * \brief Register with central PMCU module
3339 + * \return none
3340 + * \ingroup IFX_PCIE_PM
3341 + */
3342 +void
3343 +ifx_pcie_pmcu_init(void)
3344 +{
3345 +    IFX_PMCU_REGISTER_t pmcuRegister;
3346 +
3347 +    /* XXX, hook driver context */
3348 +
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); 
3358 +}
3359 +
3360 +/** 
3361 + * \fn static void ifx_pcie_pmcu_exit(void)
3362 + * \brief Unregister with central PMCU module
3363 + *
3364 + * \return none
3365 + * \ingroup IFX_PCIE_PM
3366 + */
3367 +void
3368 +ifx_pcie_pmcu_exit(void)
3369 +{
3370 +    IFX_PMCU_REGISTER_t pmcuUnRegister;
3371 +
3372 +   /* XXX, hook driver context */
3373 +   
3374 +    pmcuUnRegister.pmcuModule = IFX_PMCU_MODULE_PCIE;
3375 +    pmcuUnRegister.pmcuModuleNr = 0;
3376 +    ifx_pmcu_unregister(&pmcuUnRegister);
3377 +}
3378 +
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
3382 --- /dev/null
3383 +++ b/arch/mips/pci/ifxmips_pcie_pm.h
3384 @@ -0,0 +1,36 @@
3385 +/******************************************************************************
3386 +**
3387 +** FILE NAME    : ifxmips_pcie_pm.h
3388 +** PROJECT      : IFX UEIP
3389 +** MODULES      : PCIe Root Complex Driver
3390 +**
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
3397 +**
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.
3402 +**
3403 +** HISTORY
3404 +** $Date        $Author         $Comment
3405 +** 21 Dec,2009   Lei Chuanhua    First UEIP release
3406 +*******************************************************************************/
3407 +/*!
3408 + \file ifxmips_pcie_pm.h
3409 + \ingroup IFX_PCIE 
3410 + \brief header file for PCIe Root Complex Driver Power Management
3411 +*/
3412 +
3413 +#ifndef IFXMIPS_PCIE_PM_H
3414 +#define IFXMIPS_PCIE_PM_H
3415 +
3416 +void ifx_pcie_pmcu_init(void);
3417 +void ifx_pcie_pmcu_exit(void);
3418 +
3419 +#endif /* IFXMIPS_PCIE_PM_H  */
3420 +
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
3424 --- /dev/null
3425 +++ b/arch/mips/pci/ifxmips_pcie_reg.h
3426 @@ -0,0 +1,1001 @@
3427 +/******************************************************************************
3428 +**
3429 +** FILE NAME    : ifxmips_pcie_reg.h
3430 +** PROJECT      : IFX UEIP for VRX200
3431 +** MODULES      : PCIe module
3432 +**
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
3439 +**
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.
3444 +** HISTORY
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
3450 +/*!
3451 + \file ifxmips_pcie_reg.h
3452 + \ingroup IFX_PCIE  
3453 + \brief header file for PCIe module register definition
3454 +*/
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)
3459 +
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)
3464 +
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)
3469 +
3470 +#define PCIE_RC_CFG_BASE        (KSEG1 + 0x1D900000)
3471 +#define PCIE_APP_LOGIC_REG      (KSEG1 + 0x1E100900)
3472 +#define PCIE_MSI_PHY_BASE        0x1F600000UL
3473 +
3474 +#define PCIE_PDI_PHY_BASE        0x1F106800UL
3475 +#define PCIE_PDI_BASE           (KSEG1 + PCIE_PDI_PHY_BASE)
3476 +#define PCIE_PDI_SIZE            0x400
3477 +
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)
3481 +
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)
3486 +
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)
3491 +
3492 +#define PCIE1_RC_CFG_BASE        (KSEG1 + 0x19900000)
3493 +#define PCIE1_APP_LOGIC_REG      (KSEG1 + 0x1E100700)
3494 +#define PCIE1_MSI_PHY_BASE        0x1F400000UL
3495 +
3496 +#define PCIE1_PDI_PHY_BASE        0x1F700400UL
3497 +#define PCIE1_PDI_BASE           (KSEG1 + PCIE1_PDI_PHY_BASE)
3498 +#define PCIE1_PDI_SIZE            0x400
3499 +
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))
3510 +
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
3516 + */
3517 +#define PCIE_RC_CCR_LTSSM_ENABLE             0x00000001    /* Enable LTSSM to continue link establishment */
3518 +
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
3526 +
3527 +#define PCIE_RC_DR_PM_DEV_STATE              0x00000E00  /* Power Management D-State */
3528 +#define PCIE_RC_DR_PM_DEV_STATE_S            9
3529 +
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 */
3533 +
3534 +/* Current Power State Definition */
3535 +enum {
3536 +    PCIE_RC_DR_D0 = 0,
3537 +    PCIE_RC_DR_D1,   /* Not supported */
3538 +    PCIE_RC_DR_D2,   /* Not supported */
3539 +    PCIE_RC_DR_D3,
3540 +    PCIE_RC_DR_UN,
3541 +};
3542 +
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 */
3546 +
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 */
3557 +
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
3569 +
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 */
3574 +
3575 +#define PCIE_VDM_DR(X)                      (volatile u32*)(PCIE_APP_PORT_TO_BASE(X) + 0x34)
3576 +
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
3581 +
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 */
3587 +
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
3602 +
3603 +/* Format Definition */
3604 +enum {
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 */
3609 +};
3610 +
3611 +/* Traffic Class Definition */
3612 +enum {
3613 +    PCIE_VM_MSG_TC0 = 0,
3614 +    PCIE_VM_MSG_TC1,
3615 +    PCIE_VM_MSG_TC2,
3616 +    PCIE_VM_MSG_TC3,
3617 +    PCIE_VM_MSG_TC4,
3618 +    PCIE_VM_MSG_TC5,
3619 +    PCIE_VM_MSG_TC6,
3620 +    PCIE_VM_MSG_TC7,
3621 +};
3622 +
3623 +/* Attributes Definition */
3624 +enum {
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 */
3629 +};
3630 +
3631 +/* Payload Size Definition */
3632 +#define PCIE_VM_MSG_LEN_MIN  0
3633 +#define PCIE_VM_MSG_LEN_MAX  1024
3634 +
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
3643 +
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)
3646 +
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 */
3650 +
3651 +
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
3661 +
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
3672 +
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 
3676 +
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)
3681 +
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 */
3701 +
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)
3709 +
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 */
3717 +
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
3726 +
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
3735 +
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
3742 +
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 */
3753 +
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
3760 +
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)
3763 +
3764 +/* Interrupt and Secondary Bridge Control Register */
3765 +#define PCIE_INTRBCTRL(X)                      (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x3C)
3766 +
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 */
3778 +enum {
3779 +    PCIE_INTRBCTRL_INT_NON = 0,
3780 +    PCIE_INTRBCTRL_INTA,
3781 +    PCIE_INTRBCTRL_INTB,
3782 +    PCIE_INTRBCTRL_INTC,
3783 +    PCIE_INTRBCTRL_INTD,
3784 +};
3785 +
3786 +#define PCIE_PM_CAPR(X)                  (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x40)
3787 +
3788 +/* Power Management Control and Status Register */
3789 +#define PCIE_PM_CSR(X)                   (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x44)
3790 +
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 */
3796 +
3797 +/* MSI Capability Register for EP */
3798 +#define PCIE_MCAPR(X)                    (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x50)
3799 +
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 */
3810 +
3811 +/* MSI Message Address Register */
3812 +#define PCIE_MA(X)                       (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x54)
3813 +
3814 +#define PCIE_MA_ADDR_MASK                 0xFFFFFFFC  /* Message Address */
3815 +
3816 +/* MSI Message Upper Address Register */
3817 +#define PCIE_MUA(X)                      (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x58)
3818 +
3819 +/* MSI Message Data Register */
3820 +#define PCIE_MD(X)                       (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x5C)
3821 +
3822 +#define PCIE_MD_DATA                      0x0000FFFF  /* Message Data */
3823 +#define PCIE_MD_DATA_S                    0
3824 +
3825 +/* PCI Express Capability Register */
3826 +#define PCIE_XCAP(X)                     (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x70)
3827 +
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
3839 +
3840 +/* Device Capability Register */
3841 +#define PCIE_DCAP(X)                     (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x74)
3842 +
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 */
3853 +
3854 +/* Maximum payload size supported */
3855 +enum {
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,
3862 +};
3863 +
3864 +/* Device Control and Status Register */
3865 +#define PCIE_DCTLSTS(X)                       (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x78)
3866 +
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 */
3886 +
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)
3890 +
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
3908 +
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
3918 +
3919 +/* Active State Link PM definition */
3920 +enum {
3921 +    PCIE_ASPM_RES0                = 0,
3922 +    PCIE_ASPM_L0S_ENTRY_SUPPORT,        /* L0s */
3923 +    PCIE_ASPM_RES1,
3924 +    PCIE_ASPM_L0S_L1_ENTRY_SUPPORT,     /* L0s and L1, default */
3925 +};
3926 +
3927 +/* L0s Exit Latency definition */
3928 +enum {
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  */
3937 +};
3938 +
3939 +/* L1 Exit Latency definition */
3940 +enum {
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 */
3949 +};
3950 +
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 */
3968 +
3969 +/* Slot Capabilities Register */
3970 +#define PCIE_SLCAP(X)                       (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x84)
3971 +
3972 +/* Slot Capabilities */
3973 +#define PCIE_SLCTLSTS(X)                    (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x88)
3974 +
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 */
3989 +
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
3998 +
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)
4016 +
4017 +/* Uncorrectable Error Mask Register, Mask means no report */
4018 +#define PCIE_UEMR(X)                        (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x108)
4019 +
4020 +/* Uncorrectable Error Severity Register */
4021 +#define PCIE_UESR(X)                        (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x10C)
4022 +
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)
4033 +
4034 +/* Correctable Error Mask Register */
4035 +#define PCIE_CEMR(X)                        (volatile u32*)(PCIE_RC_CFG_BASE + 0x114)
4036 +
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 */
4045 +
4046 +/* Header Log Register 1 */
4047 +#define PCIE_HLR1(X)                        (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x11C)
4048 +
4049 +/* Header Log Register 2 */
4050 +#define PCIE_HLR2(X)                        (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x120)
4051 +
4052 +/* Header Log Register 3 */
4053 +#define PCIE_HLR3(X)                        (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x124)
4054 +
4055 +/* Header Log Register 4 */
4056 +#define PCIE_HLR4(X)                        (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x128)
4057 +
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)
4065 +
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
4077 +
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
4084 +
4085 +/* VC Enhanced Capability Header */
4086 +#define PCIE_VC_ECH(X)                          (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x140)
4087 +
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
4098 +
4099 +/* Extended Virtual Channel Count Defintion */
4100 +#define PCIE_EXT_VC_CNT_MIN   0
4101 +#define PCIE_EXT_VC_CNT_MAX   7
4102 +
4103 +/* Port Arbitration Table Entry Size Definition */
4104 +enum {
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,
4109 +};
4110 +
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
4120 +
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 */
4127 +
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)
4139 +
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
4145 +
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 */
4157 +
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 */
4164 +
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 */
4169 +
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
4176 +
4177 +/* Other Message Register */
4178 +#define PCIE_OMR(X)                          (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x704)
4179 +
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
4189 +
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
4205 +
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 */
4217 +
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 */
4225 +
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
4238 +
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 */
4260 +
4261 +#define PCIE_DEF_SKP_INTERVAL    700             /* 1180 ~1538 , 125MHz * 2, 250MHz * 1 */
4262 +
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 */
4267 +
4268 +/* Debug Register 0 */
4269 +#define PCIE_DBR0(X)                              (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x728)
4270 +
4271 +/* Debug Register 1 */
4272 +#define PCIE_DBR1(X)                              (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x72C)
4273 +
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
4280 +
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
4287 +
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
4294 +
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 */
4300 +
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 */
4307 +
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 */
4314 +
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 */
4325 +
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
4334 +
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
4343 +
4344 +/* Applicable to the above three registers */
4345 +enum {
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,
4349 +};
4350 +
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
4357 +
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
4364 +
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
4371 +
4372 +/* PHY Status Register, all zeros in VR9 */
4373 +#define PCIE_PHYSR(X)                           (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x810)
4374 +
4375 +/* PHY Control Register, all zeros in VR9 */
4376 +#define PCIE_PHYCR(X)                           (volatile u32*)(PCIE_RC_PORT_TO_BASE(X) + 0x814)
4377 +
4378 +/* 
4379 + * PCIe PDI PHY register definition, suppose all the following 
4380 + * stuff is confidential. 
4381 + * XXX, detailed bit definition
4382 + */
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))
4394
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))
4403 +
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))
4411 +
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))
4417 +
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
4425 +
4426 +#endif /* IFXMIPS_PCIE_REG_H */
4427 +
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
4431 --- /dev/null
4432 +++ b/arch/mips/pci/ifxmips_pcie_vr9.h
4433 @@ -0,0 +1,271 @@
4434 +/****************************************************************************
4435 +                              Copyright (c) 2010
4436 +                            Lantiq Deutschland GmbH
4437 +                     Am Campeon 3; 85579 Neubiberg, Germany
4438 +
4439 +  For licensing information, see the file 'LICENSE' in the root folder of
4440 +  this software module.
4441 +
4442 + *****************************************************************************/
4443 +/*!
4444 +  \file ifxmips_pcie_vr9.h
4445 +  \ingroup IFX_PCIE
4446 +  \brief PCIe RC driver vr9 specific file
4447 +*/
4448 +
4449 +#ifndef IFXMIPS_PCIE_VR9_H
4450 +#define IFXMIPS_PCIE_VR9_H
4451 +
4452 +#include <linux/types.h>
4453 +#include <linux/delay.h>
4454 +
4455 +#include <linux/gpio.h>
4456 +#include <lantiq_soc.h>
4457 +
4458 +#define IFX_PCIE_GPIO_RESET  238
4459 +
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*/
4466 +
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
4472 +
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)
4477 +
4478 +#define IFX_PMU_MODULE_PCIE_L0_CLK (31)
4479 +
4480 +
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))
4487 +
4488 +
4489 +static inline void pcie_ep_gpio_rst_init(int pcie_port)
4490 +{
4491 +
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);
4495 +
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);*/
4502 +}
4503 +
4504 +static inline void pcie_ahb_pmu_setup(void) 
4505 +{
4506 +       /* Enable AHB bus master/slave */
4507 +       struct clk *clk;
4508 +       clk = clk_get_sys("1d900000.pcie", "ahb");
4509 +       clk_enable(clk);
4510 +
4511 +    //AHBM_PMU_SETUP(IFX_PMU_ENABLE);
4512 +    //AHBS_PMU_SETUP(IFX_PMU_ENABLE);
4513 +}
4514 +
4515 +static inline void pcie_rcu_endian_setup(int pcie_port)
4516 +{
4517 +    u32 reg;
4518 +
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;
4524 +#else 
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));
4531 +}
4532 +
4533 +static inline void pcie_phy_pmu_enable(int pcie_port)
4534 +{
4535 +       struct clk *clk;
4536 +       clk = clk_get_sys("1d900000.pcie", "phy");
4537 +       clk_enable(clk);
4538 +
4539 +       //PCIE_PHY_PMU_SETUP(IFX_PMU_ENABLE);
4540 +}
4541 +
4542 +static inline void pcie_phy_pmu_disable(int pcie_port)
4543 +{
4544 +       struct clk *clk;
4545 +       clk = clk_get_sys("1d900000.pcie", "phy");
4546 +       clk_disable(clk);
4547 +
4548 +//    PCIE_PHY_PMU_SETUP(IFX_PMU_DISABLE);
4549 +}
4550 +
4551 +static inline void pcie_pdi_big_endian(int pcie_port)
4552 +{
4553 +    u32 reg;
4554 +
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);
4560 +}
4561 +
4562 +static inline void pcie_pdi_pmu_enable(int pcie_port)
4563 +{
4564 +    /* Enable PDI to access PCIe PHY register */
4565 +       struct clk *clk;
4566 +       clk = clk_get_sys("1d900000.pcie", "pdi");
4567 +       clk_enable(clk);
4568 +    //PDI_PMU_SETUP(IFX_PMU_ENABLE);
4569 +}
4570 +
4571 +static inline void pcie_core_rst_assert(int pcie_port)
4572 +{
4573 +    u32 reg;
4574 +
4575 +    reg = IFX_REG_R32(IFX_RCU_RST_REQ);
4576 +
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);
4580 +}
4581 +
4582 +static inline void pcie_core_rst_deassert(int pcie_port)
4583 +{
4584 +    u32 reg;
4585 +
4586 +    /* Make sure one micro-second delay */
4587 +    udelay(1);
4588 +
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);
4593 +}
4594 +
4595 +static inline void pcie_phy_rst_assert(int pcie_port)
4596 +{
4597 +    u32 reg;
4598 +
4599 +    reg = IFX_REG_R32(IFX_RCU_RST_REQ);
4600 +    reg |= 0x00001000; /* Bit 12 */
4601 +    IFX_REG_W32(reg, IFX_RCU_RST_REQ);
4602 +}
4603 +
4604 +static inline void pcie_phy_rst_deassert(int pcie_port)
4605 +{
4606 +    u32 reg;
4607 +
4608 +    /* Make sure one micro-second delay */
4609 +    udelay(1);
4610 +
4611 +    reg = IFX_REG_R32(IFX_RCU_RST_REQ);
4612 +    reg &= ~0x00001000; /* Bit 12 */
4613 +    IFX_REG_W32(reg, IFX_RCU_RST_REQ);
4614 +}
4615 +
4616 +static inline void pcie_device_rst_assert(int pcie_port)
4617 +{
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);
4621 +}
4622 +
4623 +static inline void pcie_device_rst_deassert(int pcie_port)
4624 +{
4625 +    mdelay(100);
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);
4630 +}
4631 +
4632 +static inline void pcie_core_pmu_setup(int pcie_port)
4633 +{
4634 +       struct clk *clk;
4635 +       clk = clk_get_sys("1d900000.pcie", "ctl");
4636 +       clk_enable(clk);
4637 +       clk = clk_get_sys("1d900000.pcie", "bus");
4638 +       clk_enable(clk);
4639 +
4640 +    /* PCIe Core controller enabled */
4641 +//    PCIE_CTRL_PMU_SETUP(IFX_PMU_ENABLE);
4642 +
4643 +    /* Enable PCIe L0 Clock */
4644 +//  PCIE_L0_CLK_PMU_SETUP(IFX_PMU_ENABLE);
4645 +}
4646 +
4647 +static inline void pcie_msi_init(int pcie_port)
4648 +{
4649 +       struct clk *clk;
4650 +       pcie_msi_pic_init(pcie_port);
4651 +       clk = clk_get_sys("ltq_pcie", "msi");
4652 +       clk_enable(clk);
4653 +//    MSI_PMU_SETUP(IFX_PMU_ENABLE);
4654 +}
4655 +
4656 +static inline u32
4657 +ifx_pcie_bus_nr_deduct(u32 bus_number, int pcie_port)
4658 +{
4659 +    u32 tbus_number = bus_number;
4660 +
4661 +#ifdef CONFIG_IFX_PCI
4662 +    if (pcibios_host_nr() > 1) {
4663 +        tbus_number -= pcibios_1st_host_bus_nr();
4664 +    }
4665 +#endif /* CONFIG_IFX_PCI */
4666 +    return tbus_number;
4667 +}
4668 +
4669 +static inline u32
4670 +ifx_pcie_bus_enum_hack(struct pci_bus *bus, u32 devfn, int where, u32 value, int pcie_port, int read)
4671 +{
4672 +    struct pci_dev *pdev;
4673 +    u32 tvalue = value;
4674 +
4675 +    /* Sanity check */
4676 +    pdev = pci_get_slot(bus, devfn);
4677 +    if (pdev == NULL) {
4678 +        return tvalue;
4679 +    }
4680 +
4681 +    /* Only care about PCI bridge */
4682 +    if (pdev->hdr_type != PCI_HEADER_TYPE_BRIDGE) {
4683 +        return tvalue;
4684 +    }
4685 +
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);
4690 +        }
4691 +    #endif /* CONFIG_IFX_PCI */  
4692 +    }
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);
4697 +        }
4698 +    #endif
4699 +    }
4700 +    return tvalue;
4701 +}
4702 +
4703 +#endif /* IFXMIPS_PCIE_VR9_H */
4704 +
4705 diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c
4706 index 04e35bc..2e85529 100644
4707 --- a/arch/mips/pci/pci.c
4708 +++ b/arch/mips/pci/pci.c
4709 @@ -250,6 +250,31 @@ static int __init pcibios_init(void)
4710  
4711  subsys_initcall(pcibios_init);
4712  
4713 +int pcibios_host_nr(void)
4714 +{
4715 +    int count;
4716 +    struct pci_controller *hose;
4717 +    for (count = 0, hose = hose_head; hose; hose = hose->next, count++) {
4718 +        ;
4719 +    }
4720 +    return count;
4721 +}
4722 +EXPORT_SYMBOL(pcibios_host_nr);
4723 +
4724 +int pcibios_1st_host_bus_nr(void)
4725 +{
4726 +    int bus_nr = 0;
4727 +    struct pci_controller *hose = hose_head;
4728 +
4729 +    if (hose != NULL) {
4730 +        if (hose->bus != NULL) {
4731 +            bus_nr = hose->bus->number + 1;
4732 +        }
4733 +    }
4734 +    return bus_nr;
4735 +}
4736 +EXPORT_SYMBOL(pcibios_1st_host_bus_nr);
4737 +
4738  static int pcibios_enable_resources(struct pci_dev *dev, int mask)
4739  {
4740         u16 cmd, old_cmd;
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
4745 @@ -5,7 +5,7 @@
4746  config PCIEAER
4747         boolean "Root Port Advanced Error Reporting support"
4748         depends on PCIEPORTBUS
4749 -       default y
4750 +       default n
4751         help
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 ee21795..0d08026 100644
4756 --- a/include/linux/pci.h
4757 +++ b/include/linux/pci.h
4758 @@ -1038,6 +1038,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 9d36b82..493ada4 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
4774  
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
4780 +
4781  #define PCI_VENDOR_ID_WINBOND          0x10ad
4782  #define PCI_DEVICE_ID_WINBOND_82C105   0x0105
4783  #define PCI_DEVICE_ID_WINBOND_83C553   0x0565
4784 -- 
4785 1.7.10.4
4786