diff mbox

[U-Boot,v2] arm/ls1021a: Add workaround for DDR erratum A008378

Message ID 1421268367-27117-1-git-send-email-yorksun@freescale.com
State Accepted
Delegated to: York Sun
Headers show

Commit Message

York Sun Jan. 14, 2015, 8:46 p.m. UTC
Internal memory controller counters can reach a bad state after
training in DDR4 mode if accumulated ECC or DBI mode is eanbled.

Signed-off-by: York Sun <yorksun@freescale.com>
---
Change log
 v2: Add access macros to handle big- and little-endian. These macros were
     added by other patches, but not yet merged.
     Add parentheses for logic in macro, as suggested by compiling warning

 arch/arm/include/asm/arch-ls102xa/config.h |    1 +
 drivers/ddr/fsl/fsl_ddr_gen4.c             |    8 ++++++++
 include/fsl_ddr.h                          |    6 ++++++
 3 files changed, 15 insertions(+)

Comments

Albert ARIBAUD Feb. 1, 2015, 2:12 a.m. UTC | #1
Hello York Sun,

On Wed, 14 Jan 2015 12:46:07 -0800, York Sun <yorksun@freescale.com>
wrote:
> Internal memory controller counters can reach a bad state after
> training in DDR4 mode if accumulated ECC or DBI mode is eanbled.

typo: eanbled -> enabled.

Amicalement,
York Sun Feb. 2, 2015, 2:40 p.m. UTC | #2
On 01/31/2015 08:12 PM, Albert ARIBAUD wrote:
> Hello York Sun,
> 
> On Wed, 14 Jan 2015 12:46:07 -0800, York Sun <yorksun@freescale.com>
> wrote:
>> Internal memory controller counters can reach a bad state after
>> training in DDR4 mode if accumulated ECC or DBI mode is eanbled.
> 
> typo: eanbled -> enabled.
> 

Thanks for catching it.

York
diff mbox

Patch

diff --git a/arch/arm/include/asm/arch-ls102xa/config.h b/arch/arm/include/asm/arch-ls102xa/config.h
index 5e934da..a06ef9d 100644
--- a/arch/arm/include/asm/arch-ls102xa/config.h
+++ b/arch/arm/include/asm/arch-ls102xa/config.h
@@ -97,6 +97,7 @@ 
 #define CONFIG_SYS_FSL_DDR_VER			FSL_DDR_VER_5_0
 #define CONFIG_SYS_FSL_SEC_COMPAT		5
 #define CONFIG_USB_MAX_CONTROLLER_COUNT		1
+#define CONFIG_SYS_FSL_ERRATUM_A008378
 #else
 #error SoC not defined
 #endif
diff --git a/drivers/ddr/fsl/fsl_ddr_gen4.c b/drivers/ddr/fsl/fsl_ddr_gen4.c
index a3c01e7..4eef047 100644
--- a/drivers/ddr/fsl/fsl_ddr_gen4.c
+++ b/drivers/ddr/fsl/fsl_ddr_gen4.c
@@ -171,6 +171,14 @@  void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,
 			ddr_out32(&ddr->debug[i], regs->debug[i]);
 		}
 	}
+#ifdef CONFIG_SYS_FSL_ERRATUM_A008378
+	/* Erratum applies when accumulated ECC is used, or DBI is enabled */
+#define IS_ACC_ECC_EN(v) ((v) & 0x4)
+#define IS_DBI(v) ((((v) >> 12) & 0x3) == 0x2)
+	if (IS_ACC_ECC_EN(regs->ddr_sdram_cfg) ||
+	    IS_DBI(regs->ddr_sdram_cfg_3))
+		ddr_setbits32(ddr->debug[28], 0x9 << 20);
+#endif
 
 	/*
 	 * For RDIMMs, JEDEC spec requires clocks to be stable before reset is
diff --git a/include/fsl_ddr.h b/include/fsl_ddr.h
index 675557a..3286c95 100644
--- a/include/fsl_ddr.h
+++ b/include/fsl_ddr.h
@@ -23,9 +23,15 @@ 
 #ifdef CONFIG_SYS_FSL_DDR_LE
 #define ddr_in32(a)	in_le32(a)
 #define ddr_out32(a, v)	out_le32(a, v)
+#define ddr_setbits32(a, v)	setbits_le32(a, v)
+#define ddr_clrbits32(a, v)	clrbits_le32(a, v)
+#define ddr_clrsetbits32(a, clear, set)	clrsetbits_le32(a, clear, set)
 #else
 #define ddr_in32(a)	in_be32(a)
 #define ddr_out32(a, v)	out_be32(a, v)
+#define ddr_setbits32(a, v)	setbits_be32(a, v)
+#define ddr_clrbits32(a, v)	clrbits_be32(a, v)
+#define ddr_clrsetbits32(a, clear, set)	clrsetbits_be32(a, clear, set)
 #endif
 
 #define _DDR_ADDR CONFIG_SYS_FSL_DDR_ADDR