ppc4xx: Fix 460EX errata with CPU lockup upon high AHB traffic
[oweals/u-boot.git] / cpu / ppc4xx / cpu.c
index d376f52a608f0365f79964d51a8a6f9f55474ba0..39f439df9881dabc3d85196bc9892cf87c919009 100644 (file)
@@ -54,7 +54,8 @@ static int pci_async_enabled(void)
 #endif
 
 #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
-    defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
+    defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
+    defined(CONFIG_460EX) || defined(CONFIG_460GT)
        unsigned long val;
 
        mfsdr(sdr_sdstp1, val);
@@ -86,7 +87,8 @@ static int pci_arbiter_enabled(void)
        return (val & 0x80000000);
 #endif
 #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
-    defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
+    defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
+    defined(CONFIG_460EX) || defined(CONFIG_460GT)
        unsigned long val;
 
        mfsdr(sdr_pci0, val);
@@ -167,6 +169,21 @@ static char *bootstrap_str[] = {
 static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
 #endif
 
+#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
+#define SDR0_PINSTP_SHIFT      29
+static char *bootstrap_str[] = {
+       "EBC (8 bits)",
+       "EBC (16 bits)",
+       "PCI",
+       "PCI",
+       "EBC (16 bits)",
+       "NAND (8 bits)",
+       "I2C (Addr 0x54)",      /* A8 */
+       "I2C (Addr 0x52)",      /* A4 */
+};
+static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
+#endif
+
 #if defined(CONFIG_405EZ)
 #define SDR0_PINSTP_SHIFT      28
 static char *bootstrap_str[] = {
@@ -257,7 +274,11 @@ int checkcpu (void)
        puts("05");
 #endif
 #if defined(CONFIG_440)
+#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
+       puts("60");
+#else
        puts("40");
+#endif
 #endif
 
        switch (pvr) {
@@ -325,6 +346,26 @@ int checkcpu (void)
                strcpy(addstr, "No Security support");
                break;
 
+       case PVR_405EX1_RC:
+               puts("EX Rev. C");
+               strcpy(addstr, "Security support");
+               break;
+
+       case PVR_405EX2_RC:
+               puts("EX Rev. C");
+               strcpy(addstr, "No Security support");
+               break;
+
+       case PVR_405EXR1_RC:
+               puts("EXr Rev. C");
+               strcpy(addstr, "Security support");
+               break;
+
+       case PVR_405EXR2_RC:
+               puts("EXr Rev. C");
+               strcpy(addstr, "No Security support");
+               break;
+
 #if defined(CONFIG_440)
        case PVR_440GP_RB:
                puts("GP Rev. B");
@@ -448,6 +489,26 @@ int checkcpu (void)
                strcpy(addstr, "No RAID 6 support");
                break;
 
+       case PVR_460EX_RA:
+               puts("EX Rev. A");
+               strcpy(addstr, "No Security/Kasumi support");
+               break;
+
+       case PVR_460EX_SE_RA:
+               puts("EX Rev. A");
+               strcpy(addstr, "Security/Kasumi support");
+               break;
+
+       case PVR_460GT_RA:
+               puts("GT Rev. A");
+               strcpy(addstr, "No Security/Kasumi support");
+               break;
+
+       case PVR_460GT_SE_RA:
+               puts("GT Rev. A");
+               strcpy(addstr, "Security/Kasumi support");
+               break;
+
        default:
                printf (" UNKNOWN (PVR=%08x)", pvr);
                break;
@@ -510,7 +571,6 @@ int checkcpu (void)
        return 0;
 }
 
-#if defined (CONFIG_440SPE)
 int ppc440spe_revB() {
        unsigned int pvr;
 
@@ -520,7 +580,6 @@ int ppc440spe_revB() {
        else
                return 0;
 }
-#endif
 
 /* ------------------------------------------------------------------------- */