[PATCH] mpc83xx: initialize ECC SDRAM with CPU

Ira W. Snyder iws at ovro.caltech.edu
Thu Jul 9 17:45:09 CEST 2009


Signed-off-by: Ira W. Snyder <iws at ovro.caltech.edu>
---
 cpu/mpc83xx/spd_sdram.c |   58 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 58 insertions(+), 0 deletions(-)

diff --git a/cpu/mpc83xx/spd_sdram.c b/cpu/mpc83xx/spd_sdram.c
index ab6a2bb..7e093ae 100644
--- a/cpu/mpc83xx/spd_sdram.c
+++ b/cpu/mpc83xx/spd_sdram.c
@@ -1,3 +1,4 @@
+#define DEBUG 1
 /*
  * (C) Copyright 2006-2007 Freescale Semiconductor, Inc.
  *
@@ -825,18 +826,75 @@ long int spd_sdram()
 
 #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
 /*
+ * Use timebase counter, get_timer() is not availabe
+ * at this point of initialization yet.
+ */
+static unsigned long get_tbms (void)
+{
+	unsigned long tbl;
+	unsigned long tbu1, tbu2;
+	unsigned long ms;
+	unsigned long long tmp;
+
+	ulong tbclk = get_tbclk();
+
+	/* get the timebase ticks */
+	do {
+		asm volatile ("mftbu %0":"=r" (tbu1):);
+		asm volatile ("mftb %0":"=r" (tbl):);
+		asm volatile ("mftbu %0":"=r" (tbu2):);
+	} while (tbu1 != tbu2);
+
+	/* convert ticks to ms */
+	tmp = (unsigned long long)(tbu1);
+	tmp = (tmp << 32);
+	tmp += (unsigned long long)(tbl);
+	ms = tmp/(tbclk/1000);
+
+	return ms;
+}
+
+void cpu_meminit(uint val, uint size)
+{
+	register u64 *p;
+	unsigned int pattern[2];
+
+	icache_enable();
+
+	pattern[0] = val;
+	pattern[1] = val;
+
+	for (p = 0; p < (u64*)(size); p++)
+		ppcDWstore((u32*)p, pattern);
+
+	asm volatile ("sync");
+
+	icache_disable();
+}
+
+/*
  * Initialize all of memory for ECC, then enable errors.
  */
 void ddr_enable_ecc(unsigned int dram_size)
 {
 	volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR;
 	volatile ddr83xx_t *ddr= &immap->ddr;
+	unsigned long s, e;
 
 	debug("\nInitializing ECC!\n");
 
+	s = get_tbms();
+#if 0
+	debug("\nInitializing ECC (using DMA)!\n");
 	dma_meminit(CONFIG_MEM_INIT_VALUE, dram_size);
+#else
+	debug("\nInitializing ECC (using CPU)!\n");
+	cpu_meminit(CONFIG_MEM_INIT_VALUE, dram_size);
+#endif
+	e = get_tbms();
 
 	debug("\nREADY!\n");
+	debug("ddr init duration: %ld ms\n", e - s);
 
 	/* Clear All ECC Errors */
 	if ((ddr->err_detect & ECC_ERROR_DETECT_MME) == ECC_ERROR_DETECT_MME)
-- 
1.5.4.3



More information about the U-Boot mailing list