This patch adds bootcount for Freescale MCF5445x. Two registers of
eDMA transfer control descriptors (TCD[1]) are used because these
are unused by linux kernel (freescale LTIB linux-2.6.25) and were
tested to keep their contents across resets.

Signed-off-by: Wolfgang Wegner <w.weg...@astro-kom.de>
---
I implemented and tested this bootcount on a custom MCF54455 board.
According to the data sheet, the internal SRAM is not supposed to be
useful for data storage across resets. There is no explicit statement
concerning the TCD registers, but in tests on our board the values
did always survive reset. TCD[1] is currently unused by the linux
drivers, so using its registers should be safe up to application start,
where re-setting the bootcount would probably be done anyways.

 arch/m68k/cpu/mcf5445x/cpu.c        |   29 +++++++++++++++++++++++++++++
 arch/m68k/include/asm/immap_5445x.h |    1 +
 2 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/arch/m68k/cpu/mcf5445x/cpu.c b/arch/m68k/cpu/mcf5445x/cpu.c
index 6238bc0..70007c1 100644
--- a/arch/m68k/cpu/mcf5445x/cpu.c
+++ b/arch/m68k/cpu/mcf5445x/cpu.c
@@ -110,3 +110,32 @@ int cpu_eth_init(bd_t *bis)
        return mcffec_initialize(bis);
 }
 #endif
+
+#ifdef CONFIG_BOOTCOUNT_LIMIT
+/*
+ * We use transfer descriptor registers as a persistent storage
+ * across resets. This was tested on a MCF54455.
+ * Neither U-Boot nor the stock LTIB kernel seem to use
+ * TCD[1], so it should be safe at least until application
+ * start.
+ */
+#include <asm/io.h>
+
+void bootcount_store(ulong a)
+{
+       tcd_st *tcd = (tcd_st *)MMAP_TCD;
+
+       __raw_writel(a, &(tcd[1].saddr));
+       __raw_writel(BOOTCOUNT_MAGIC, &(tcd[1].daddr));
+}
+
+ulong bootcount_load(void)
+{
+       tcd_st *tcd = (tcd_st *)MMAP_TCD;
+
+       if (__raw_readl(&(tcd[1].daddr)) != BOOTCOUNT_MAGIC)
+               return 0;
+       else
+               return __raw_readl(&(tcd[1].saddr));
+}
+#endif /* CONFIG_BOOTCOUNT_LIMIT */
diff --git a/arch/m68k/include/asm/immap_5445x.h 
b/arch/m68k/include/asm/immap_5445x.h
index 57cf3ec..d6e416a 100644
--- a/arch/m68k/include/asm/immap_5445x.h
+++ b/arch/m68k/include/asm/immap_5445x.h
@@ -37,6 +37,7 @@
 #define MMAP_EDMA      0xFC044000
 #define MMAP_INTC0     0xFC048000
 #define MMAP_INTC1     0xFC04C000
+#define MMAP_TCD       0xFC045000
 #define MMAP_IACK      0xFC054000
 #define MMAP_I2C       0xFC058000
 #define MMAP_DSPI      0xFC05C000
-- 
1.5.6.5

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to