powerpc/mpc85xx: Workaround for erratum CPU_A011
authorYork Sun <yorksun@freescale.com>
Mon, 7 May 2012 07:26:47 +0000 (07:26 +0000)
committerAndy Fleming <afleming@freescale.com>
Fri, 6 Jul 2012 22:30:33 +0000 (17:30 -0500)
Erratum NMG_CPU_A011 applies to P4080 rev 1.0, 2.0, fixed in rev 3.0.
It also applies to P3041 rev 1.0, 1.1, P2041 rev 1.0, 1.1. It shares the
same workaround as erratum CPU22. Rearrange registers usage in assembly
code to avoid accidental overwriting.

Signed-off-by: York Sun <yorksun@freescale.com>
arch/powerpc/cpu/mpc85xx/cmd_errata.c
arch/powerpc/cpu/mpc85xx/cpu_init.c
arch/powerpc/cpu/mpc85xx/release.S
arch/powerpc/include/asm/config_mpc85xx.h

index 35c2b1abd1430d2e4982fbde07ee685b1b539f26..4e1a54ad0c546bae30398189b8d0b458cb2ad908 100644 (file)
@@ -52,6 +52,14 @@ static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        if (SVR_MAJ(svr) < 3)
                puts("Work-around for Erratum CPU22 enabled\n");
 #endif
+#ifdef CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011
+       /*
+        * NMG_CPU_A011 applies to P4080 rev 1.0, 2.0, fixed in 3.0
+        * also applies to P3041 rev 1.0, 1.1, P2041 rev 1.0, 1.1
+        */
+       if (SVR_SOC_VER(svr) != SVR_P4080 || SVR_MAJ(svr) < 3)
+               puts("Work-around for Erratum CPU-A011 enabled\n");
+#endif
 #if defined(CONFIG_SYS_FSL_ERRATUM_CPU_A003999)
        puts("Work-around for Erratum CPU-A003999 enabled\n");
 #endif
index d7e80fc5122e364bef7380ce72eb1819e4f9be8b..fc6c2877d253bde572fcf7dec8660b39e91479aa 100644 (file)
@@ -308,8 +308,14 @@ int cpu_init_r(void)
        volatile fsl_lbc_t *lbc = LBC_BASE_ADDR;
 #endif
 
-#if defined(CONFIG_SYS_P4080_ERRATUM_CPU22)
-       if (SVR_MAJ(svr) < 3) {
+#if defined(CONFIG_SYS_P4080_ERRATUM_CPU22) || \
+       defined(CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011)
+       /*
+        * CPU22 applies to P4080 rev 1.0, 2.0, fixed in 3.0
+        * NMG_CPU_A011 applies to P4080 rev 1.0, 2.0, fixed in 3.0
+        * also applies to P3041 rev 1.0, 1.1, P2041 rev 1.0, 1.1
+        */
+       if (SVR_SOC_VER(svr) != SVR_P4080 || SVR_MAJ(svr) < 3) {
                flush_dcache();
                mtspr(L1CSR2, (mfspr(L1CSR2) | L1CSR2_DCWS));
                sync();
index fe3b6d6cbcd411586af72496bd87e40cc57b41d8..36c79d3638f25c7c31e5798b1bd294eaac76c151 100644 (file)
@@ -143,17 +143,29 @@ __secondary_start_page:
        mtspr   L1CSR2,r8
 #endif
 
-#if defined(CONFIG_SYS_P4080_ERRATUM_CPU22)
-       /* apply to P4080 rev 1 and rev 2 */
+#if defined(CONFIG_SYS_P4080_ERRATUM_CPU22) || \
+       defined(CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011)
+       /*
+        * CPU22 applies to P4080 rev 1.0, 2.0, fixed in 3.0
+        * NMG_CPU_A011 applies to P4080 rev 1.0, 2.0, fixed in 3.0
+        * also appleis to P3041 rev 1.0, 1.1, P2041 rev 1.0, 1.1
+        */
        mfspr   r3,SPRN_SVR
+       rlwinm  r6,r3,24,~0x800         /* clear E bit */
+
+       lis     r5,SVR_P4080@h
+       ori     r5,r5,SVR_P4080@l
+       cmpw    r6,r5
+       bne     1f
+
        rlwinm  r3,r3,0,0xf0
-       li      r4,0x30
-       cmpw    r3,r4
+       li      r5,0x30
+       cmpw    r3,r5
        bge     2f
-
-       mfspr   r8,L1CSR2
-       oris    r8,r8,(L1CSR2_DCWS)@h
-       mtspr   L1CSR2,r8
+1:
+       mfspr   r3,L1CSR2
+       oris    r3,r3,(L1CSR2_DCWS)@h
+       mtspr   L1CSR2,r3
 2:
 #endif
 
index f93ab62df8ba5832abdfec200e853cf4ea188083..b6c44bb11d1a6c8e8e54b5ccd32681ba2af35719 100644 (file)
 #define CONFIG_SYS_FSL_USB2_PHY_ENABLE
 #define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY
 #define CONFIG_SYS_FSL_ERRATUM_ESDHC111
+#define CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011
 #define CONFIG_SYS_FSL_ERRATUM_CPU_A003999
 #define CONFIG_SYS_FSL_ERRATUM_DDR_A003474
 #define CONFIG_SYS_FSL_SRIO_MAX_PORTS  2
 #define CONFIG_SYS_FSL_USB2_PHY_ENABLE
 #define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY
 #define CONFIG_SYS_FSL_ERRATUM_ESDHC111
+#define CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011
 #define CONFIG_SYS_FSL_ERRATUM_CPU_A003999
 #define CONFIG_SYS_FSL_ERRATUM_DDR_A003474
 #define CONFIG_SYS_FSL_SRIO_MAX_PORTS  2
 #define CONFIG_SYS_FSL_ERRATUM_ESDHC135
 #define CONFIG_SYS_FSL_ERRATUM_ESDHC136
 #define CONFIG_SYS_P4080_ERRATUM_CPU22
+#define CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011
 #define CONFIG_SYS_P4080_ERRATUM_SERDES8
 #define CONFIG_SYS_P4080_ERRATUM_SERDES9
 #define CONFIG_SYS_P4080_ERRATUM_SERDES_A001