diff mbox

[U-Boot] MX35: Added bootcounter to mx35

Message ID 1301826170-27873-1-git-send-email-sbabic@denx.de
State Accepted
Headers show

Commit Message

Stefano Babic April 3, 2011, 10:22 a.m. UTC
Added bootcount_load() and bootcount_store(). The
bootcounter is stored in the internal RAM at the address
defined in the configuration file (CONFIG_BOOTCOUNT_ADDRESS).

Signed-off-by: Stefano Babic <sbabic@denx.de>
---
 arch/arm/cpu/arm1136/mx35/generic.c       |   33 +++++++++++++++++++++++++++++
 arch/arm/include/asm/arch-mx35/imx-regs.h |    8 +++++++
 include/configs/mx35pdk.h                 |   11 ++++++++-
 3 files changed, 50 insertions(+), 2 deletions(-)
diff mbox

Patch

diff --git a/arch/arm/cpu/arm1136/mx35/generic.c b/arch/arm/cpu/arm1136/mx35/generic.c
index 1b4ab75..bb47328 100644
--- a/arch/arm/cpu/arm1136/mx35/generic.c
+++ b/arch/arm/cpu/arm1136/mx35/generic.c
@@ -461,3 +461,36 @@  void reset_cpu(ulong addr)
 	struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;
 	writew(4, &wdog->wcr);
 }
+
+#ifdef CONFIG_BOOTCOUNT_LIMIT
+/*
+ * We write the bootcounter as single 32bit
+ * in the IRAM at the address set in configuration
+ * file
+ */
+void bootcount_store(ulong a)
+{
+	int i;
+	u32 *bootcnt = (u32 *) CONFIG_BOOTCOUNT_ADDRESS;
+
+	/*
+	 * Experience shows that the bootcounter
+	 * must be written at least twice
+	 */
+	for (i = 0; i < 3; i++)
+		writel((BOOTCOUNT_MAGIC & 0xffff0000) | (a & 0x0000ffff),
+			bootcnt);
+}
+
+ulong bootcount_load(void)
+{
+	u32 *bootcnt = (u32 *) CONFIG_BOOTCOUNT_ADDRESS;
+
+	ulong val = readl(bootcnt);
+	if ((val & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000))
+		return 0;
+	else
+		return val & 0x0000ffff;
+}
+
+#endif /* CONFIG_BOOTCOUNT_LIMIT */
diff --git a/arch/arm/include/asm/arch-mx35/imx-regs.h b/arch/arm/include/asm/arch-mx35/imx-regs.h
index e741fb0..8fd8888 100644
--- a/arch/arm/include/asm/arch-mx35/imx-regs.h
+++ b/arch/arm/include/asm/arch-mx35/imx-regs.h
@@ -32,6 +32,14 @@ 
 #define IRAM_SIZE		0x00020000	/* 128 KB */
 
 /*
+ * Part of IRAM is used by ROM Bootloader
+ * define IRAM not changed by RBL
+ * (ofssets 0x01B00 : 0x1E000)
+ */
+#define IRAM_USER_BASE_ADDR	(IRAM_BASE_ADDR + 0x1B00)
+#define IRAM_USER_SIZE		0x1C500
+
+/*
  * AIPS 1
  */
 #define AIPS1_BASE_ADDR         0x43F00000
diff --git a/include/configs/mx35pdk.h b/include/configs/mx35pdk.h
index 086355b..02601b3 100644
--- a/include/configs/mx35pdk.h
+++ b/include/configs/mx35pdk.h
@@ -178,10 +178,11 @@ 
 #define PHYS_SDRAM_1_SIZE	(128 * 1024 * 1024)
 #define iomem_valid_addr(addr, size) \
 	(addr >= PHYS_SDRAM_1 && addr <= (PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE))
+#define IRAM_PERS_SIZE	256
 
 #define CONFIG_SYS_SDRAM_BASE		CSD0_BASE_ADDR
-#define CONFIG_SYS_INIT_RAM_ADDR	(IRAM_BASE_ADDR + 0x10000)
-#define CONFIG_SYS_INIT_RAM_SIZE		(IRAM_SIZE / 2)
+#define CONFIG_SYS_INIT_RAM_ADDR	IRAM_USER_BASE_ADDR
+#define CONFIG_SYS_INIT_RAM_SIZE	(IRAM_USER_SIZE - IRAM_PERS_SIZE)
 #define CONFIG_SYS_GBL_DATA_OFFSET	(CONFIG_SYS_INIT_RAM_SIZE - \
 					GENERATED_GBL_DATA_SIZE)
 #define CONFIG_SYS_INIT_SP_ADDR		(CONFIG_SYS_INIT_RAM_ADDR + \
@@ -249,6 +250,12 @@ 
 #define CONFIG_SYS_NAND_LARGEPAGE
 
 /*
+ * Bootcounter
+ */
+#define CONFIG_BOOTCOUNT_LIMIT
+#define CONFIG_BOOTCOUNT_ADDRESS (CONFIG_SYS_INIT_RAM_ADDR + \
+		CONFIG_SYS_INIT_RAM_SIZE)
+/*
  * Default environment and default scripts
  * to update uboot and load kernel
  */