driver/ddr/fsl: Add workaround for erratum A-010165
authorShengzhou Liu <Shengzhou.Liu@nxp.com>
Tue, 10 May 2016 08:03:47 +0000 (16:03 +0800)
committerYork Sun <york.sun@nxp.com>
Wed, 18 May 2016 15:51:47 +0000 (08:51 -0700)
During DDR-2133 operation, the transmit data eye margins determined
during the memory controller initialization may be sub-optimal, set
DEBUG_29[12] and DEBUG_29[13:16] = 4'b0100 before MEM_EN is set.

Signed-off-by: Shengzhou Liu <Shengzhou.Liu@nxp.com>
Reviewed-by: York Sun <york.sun@nxp.com>
arch/arm/include/asm/arch-fsl-layerscape/config.h
drivers/ddr/fsl/fsl_ddr_gen4.c

index 34b15007ea5e9f534345b915b1c901fa491b807f..fbdaa52c32943144139f68c7061cd80a7491ff6d 100644 (file)
 #define CONFIG_SYS_FSL_ERRATUM_A009801
 #define CONFIG_SYS_FSL_ERRATUM_A009803
 #define CONFIG_SYS_FSL_ERRATUM_A009942
+#define CONFIG_SYS_FSL_ERRATUM_A010165
 
 /* ARM A57 CORE ERRATA */
 #define CONFIG_ARM_ERRATA_826974
index 1dc06314409efa97a605e5ea7ddeaaa700a3fc0d..5039f5de0a9063b1aa25e252e2e4a33ea37f557e 100644 (file)
@@ -56,7 +56,8 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,
        u32 vref_seq2[3] = {0xc0, 0xf0, 0x70};  /* for range 2 */
        u32 *vref_seq = vref_seq1;
 #endif
-#ifdef CONFIG_SYS_FSL_ERRATUM_A009942
+#if defined(CONFIG_SYS_FSL_ERRATUM_A009942) | \
+       defined(CONFIG_SYS_FSL_ERRATUM_A010165)
        ulong ddr_freq;
        u32 tmp;
 #endif
@@ -271,6 +272,13 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,
                ddr_out32(&ddr->debug[28], tmp | 0x0060007b);
 #endif
 
+#ifdef CONFIG_SYS_FSL_ERRATUM_A010165
+       ddr_freq = get_ddr_freq(ctrl_num) / 1000000;
+       if ((ddr_freq > 1900) && (ddr_freq < 2300)) {
+               tmp = ddr_in32(&ddr->debug[28]);
+               ddr_out32(&ddr->debug[28], tmp | 0x000a0000);
+       }
+#endif
        /*
         * For RDIMMs, JEDEC spec requires clocks to be stable before reset is
         * deasserted. Clocks start when any chip select is enabled and clock