]> git.sur5r.net Git - u-boot/blobdiff - include/asm-ppc/4xx_pcie.h
Blackfin: bf537-stamp: increase monitor size
[u-boot] / include / asm-ppc / 4xx_pcie.h
index 17ac57b23bcd6a014de9eeb88de75926875b12c6..a0e88de11d4390bb38b2b2fb06f81ada33804223 100644 (file)
@@ -8,17 +8,19 @@
  * option) any later version.
  */
 
-#include <ppc4xx.h>
 #ifndef __4XX_PCIE_H
 #define __4XX_PCIE_H
 
+#include <ppc4xx.h>
+#include <pci.h>
+
 #define DCRN_SDR0_CFGADDR      0x00e
 #define DCRN_SDR0_CFGDATA      0x00f
 
 #if defined(CONFIG_440SPE)
-#define CFG_PCIE_NR_PORTS      3
+#define CONFIG_SYS_PCIE_NR_PORTS       3
 
-#define CFG_PCIE_ADDR_HIGH     0x0000000d
+#define CONFIG_SYS_PCIE_ADDR_HIGH      0x0000000d
 
 #define DCRN_PCIE0_BASE                0x100
 #define DCRN_PCIE1_BASE                0x120
 #define PCIE2_SDR              0x370
 #endif
 
+#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
+#define CONFIG_SYS_PCIE_NR_PORTS       2
+
+#define CONFIG_SYS_PCIE_ADDR_HIGH      0x0000000d
+
+#define DCRN_PCIE0_BASE                0x100
+#define DCRN_PCIE1_BASE                0x120
+
+#define PCIE0_SDR              0x300
+#define PCIE1_SDR              0x340
+#endif
+
 #if defined(CONFIG_405EX)
-#define CFG_PCIE_NR_PORTS      2
+#define CONFIG_SYS_PCIE_NR_PORTS       2
 
-#define CFG_PCIE_ADDR_HIGH     0x00000000
+#define CONFIG_SYS_PCIE_ADDR_HIGH      0x00000000
 
 #define        DCRN_PCIE0_BASE         0x040
 #define        DCRN_PCIE1_BASE         0x060
@@ -68,7 +82,7 @@
 #define PESDR0_PLLLCT2         0x03a1
 #define PESDR0_PLLLCT3         0x03a2
 
-/* common regs, at least for 405EX and 440SPe */
+/* common regs, at for all 4xx with PCIe core */
 #define SDRN_PESDR_UTLSET1(n)          (sdr_base(n) + 0x00)
 #define SDRN_PESDR_UTLSET2(n)          (sdr_base(n) + 0x01)
 #define SDRN_PESDR_DLPSET(n)           (sdr_base(n) + 0x02)
 #define PESDR1_LPB             0x044B
 #define PESDR1_PHYSTA          0x044C
 
+#elif defined(CONFIG_460EX) || defined(CONFIG_460GT)
+
+#define PESDR0_L0BIST          0x0308  /* PE0 L0 built in self test */
+#define PESDR0_L0BISTSTS       0x0309  /* PE0 L0 built in self test status */
+#define PESDR0_L0CDRCTL                0x030A  /* PE0 L0 CDR control */
+#define PESDR0_L0DRV           0x030B  /* PE0 L0 drive */
+#define PESDR0_L0REC           0x030C  /* PE0 L0 receiver */
+#define PESDR0_L0LPB           0x030D  /* PE0 L0 loopback */
+#define PESDR0_L0CLK           0x030E  /* PE0 L0 clocking */
+#define PESDR0_PHY_CTL_RST     0x030F  /* PE0 PHY control reset */
+#define PESDR0_RSTSTA          0x0310  /* PE0 reset status */
+#define PESDR0_OBS             0x0311  /* PE0 observation register */
+#define PESDR0_L0ERRC          0x0320  /* PE0 L0 error counter */
+
+#define PESDR1_L0BIST          0x0348  /* PE1 L0 built in self test */
+#define PESDR1_L1BIST          0x0349  /* PE1 L1 built in self test */
+#define PESDR1_L2BIST          0x034A  /* PE1 L2 built in self test */
+#define PESDR1_L3BIST          0x034B  /* PE1 L3 built in self test */
+#define PESDR1_L0BISTSTS       0x034C  /* PE1 L0 built in self test status */
+#define PESDR1_L1BISTSTS       0x034D  /* PE1 L1 built in self test status */
+#define PESDR1_L2BISTSTS       0x034E  /* PE1 L2 built in self test status */
+#define PESDR1_L3BISTSTS       0x034F  /* PE1 L3 built in self test status */
+#define PESDR1_L0CDRCTL                0x0350  /* PE1 L0 CDR control */
+#define PESDR1_L1CDRCTL                0x0351  /* PE1 L1 CDR control */
+#define PESDR1_L2CDRCTL                0x0352  /* PE1 L2 CDR control */
+#define PESDR1_L3CDRCTL                0x0353  /* PE1 L3 CDR control */
+#define PESDR1_L0DRV           0x0354  /* PE1 L0 drive */
+#define PESDR1_L1DRV           0x0355  /* PE1 L1 drive */
+#define PESDR1_L2DRV           0x0356  /* PE1 L2 drive */
+#define PESDR1_L3DRV           0x0357  /* PE1 L3 drive */
+#define PESDR1_L0REC           0x0358  /* PE1 L0 receiver */
+#define PESDR1_L1REC           0x0359  /* PE1 L1 receiver */
+#define PESDR1_L2REC           0x035A  /* PE1 L2 receiver */
+#define PESDR1_L3REC           0x035B  /* PE1 L3 receiver */
+#define PESDR1_L0LPB           0x035C  /* PE1 L0 loopback */
+#define PESDR1_L1LPB           0x035D  /* PE1 L1 loopback */
+#define PESDR1_L2LPB           0x035E  /* PE1 L2 loopback */
+#define PESDR1_L3LPB           0x035F  /* PE1 L3 loopback */
+#define PESDR1_L0CLK           0x0360  /* PE1 L0 clocking */
+#define PESDR1_L1CLK           0x0361  /* PE1 L1 clocking */
+#define PESDR1_L2CLK           0x0362  /* PE1 L2 clocking */
+#define PESDR1_L3CLK           0x0363  /* PE1 L3 clocking */
+#define PESDR1_PHY_CTL_RST     0x0364  /* PE1 PHY control reset */
+#define PESDR1_RSTSTA          0x0365  /* PE1 reset status */
+#define PESDR1_OBS             0x0366  /* PE1 observation register */
+#define PESDR1_L0ERRC          0x0368  /* PE1 L0 error counter */
+#define PESDR1_L1ERRC          0x0369  /* PE1 L1 error counter */
+#define PESDR1_L2ERRC          0x036A  /* PE1 L2 error counter */
+#define PESDR1_L3ERRC          0x036B  /* PE1 L3 error counter */
+#define PESDR0_IHS1            0x036C  /* PE interrupt handler interfact setting 1 */
+#define PESDR0_IHS2            0x036D  /* PE interrupt handler interfact setting 2 */
+
 #endif
 
+/* SDR Bit Mappings */
+#define PESDRx_RCSSET_HLDPLB   0x10000000
+#define PESDRx_RCSSET_RSTGU    0x01000000
+#define PESDRx_RCSSET_RDY       0x00100000
+#define PESDRx_RCSSET_RSTDL     0x00010000
+#define PESDRx_RCSSET_RSTPYN    0x00001000
+
+#define PESDRx_RCSSTS_PLBIDL   0x10000000
+#define PESDRx_RCSSTS_HRSTRQ   0x01000000
+#define PESDRx_RCSSTS_PGRST    0x00100000
+#define PESDRx_RCSSTS_VC0ACT   0x00010000
+#define PESDRx_RCSSTS_BMEN     0x00000100
+
 /*
  * UTL register offsets
  */
+#define        PEUTL_PBCTL             0x00
 #define PEUTL_PBBSZ            0x20
 #define PEUTL_OPDBSZ           0x68
 #define PEUTL_IPHBSZ           0x70
 #define PEUTL_OUTTR            0x90
 #define PEUTL_INTR             0x98
 #define PEUTL_PCTL             0xa0
+#define        PEUTL_RCSTA             0xb0
 #define PEUTL_RCIRQEN          0xb8
 
 /*
 #define PECFG_BAR0LMPA         0x210
 #define PECFG_BAR0HMPA         0x214
 #define PECFG_BAR1MPA          0x218
-#define PECFG_BAR2MPA          0x220
+#define PECFG_BAR2LMPA         0x220
+#define PECFG_BAR2HMPA         0x224
 
 #define PECFG_PIMEN            0x33c
 #define PECFG_PIM0LAL          0x340
 #define U64_TO_U32_LOW(val)    ((u32)((val) & 0x00000000ffffffffULL))
 #define U64_TO_U32_HIGH(val)   ((u32)((val) >> 32))
 
+/*
+ * Prototypes
+ */
 int ppc4xx_init_pcie(void);
 int ppc4xx_init_pcie_rootport(int port);
 int ppc4xx_init_pcie_endport(int port);
@@ -251,6 +336,59 @@ void ppc4xx_setup_pcie_rootpoint(struct pci_controller *hose, int port);
 int ppc4xx_setup_pcie_endpoint(struct pci_controller *hose, int port);
 int pcie_hose_scan(struct pci_controller *hose, int bus);
 
+/*
+ * Function to determine root port or endport from env variable.
+ */
+static inline int is_end_point(int port)
+{
+       char s[10], *tk;
+       char *pcie_mode = getenv("pcie_mode");
+
+       if (pcie_mode == NULL)
+               return 0;
+
+       strcpy(s, pcie_mode);
+       tk = strtok(s, ":");
+
+       switch (port) {
+       case 0:
+               if (tk != NULL) {
+                       if (!(strcmp(tk, "ep") && strcmp(tk, "EP")))
+                               return 1;
+                       else
+                               return 0;
+               }
+               else
+                       return 0;
+
+       case 1:
+               tk = strtok(NULL, ":");
+               if (tk != NULL) {
+                       if (!(strcmp(tk, "ep") && strcmp(tk, "EP")))
+                               return 1;
+                       else
+                               return 0;
+               }
+               else
+                       return 0;
+
+       case 2:
+               tk = strtok(NULL, ":");
+               if (tk != NULL)
+                       tk = strtok(NULL, ":");
+               if (tk != NULL) {
+                       if (!(strcmp(tk, "ep") && strcmp(tk, "EP")))
+                               return 1;
+                       else
+                               return 0;
+               }
+               else
+                       return 0;
+       }
+
+       return 0;
+}
+
 static inline void mdelay(int n)
 {
        u32 ms = n;
@@ -259,6 +397,7 @@ static inline void mdelay(int n)
                udelay(1000);
 }
 
+#if defined(PCIE0_SDR)
 static inline u32 sdr_base(int port)
 {
        switch (port) {
@@ -267,11 +406,12 @@ static inline u32 sdr_base(int port)
                return PCIE0_SDR;
        case 1:
                return PCIE1_SDR;
-#if CFG_PCIE_NR_PORTS > 2
+#if CONFIG_SYS_PCIE_NR_PORTS > 2
        case 2:
                return PCIE2_SDR;
 #endif
        }
 }
+#endif /* defined(PCIE0_SDR) */
 
 #endif /* __4XX_PCIE_H */