8360, kmeter1: added bootcount feature.
authorHeiko Schocher <hs@denx.de>
Tue, 24 Feb 2009 10:30:51 +0000 (11:30 +0100)
committerKim Phillips <kim.phillips@freescale.com>
Fri, 6 Mar 2009 00:21:30 +0000 (18:21 -0600)
add CONFIG_BOOTCOUNT_LIMIT feature for 8360 CPU.

The bootcounter uses 8 bytes from the muram,
because no other memory was found on this
CPU for the bootcount feature. So we must
correct the muram size in DTS before booting
Linux.

This feature is actual only implemented for
MPC8360, because not all 83xx CPU have qe,
and therefore no muram, which this feature
uses.

Signed-off-by: Heiko Schocher <hs@denx.de>
Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
cpu/mpc83xx/cpu.c
cpu/mpc83xx/fdt.c

index 9e0a05d61516853c99ccf3233056e4f92a7c4910..876f5c731a8595620588078b57274ff18b2979b2 100644 (file)
 #include <tsec.h>
 #include <netdev.h>
 #include <fsl_esdhc.h>
+#ifdef CONFIG_BOOTCOUNT_LIMIT
+#include <asm/immap_qe.h>
+#include <asm/io.h>
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -399,3 +403,33 @@ int cpu_mmc_init(bd_t *bis)
        return 0;
 #endif
 }
+
+#ifdef CONFIG_BOOTCOUNT_LIMIT
+
+#if !defined(CONFIG_MPC8360)
+#error "CONFIG_BOOTCOUNT_LIMIT only for MPC8360 implemented"
+#endif
+
+#if !defined(CONFIG_BOOTCOUNT_ADDR)
+#define CONFIG_BOOTCOUNT_ADDR  (0x110000 + QE_MURAM_SIZE - 2 * sizeof(unsigned long))
+#endif
+
+#include <asm/io.h>
+
+void bootcount_store (ulong a)
+{
+       void *reg = (void *)(CONFIG_SYS_IMMR + CONFIG_BOOTCOUNT_ADDR);
+       out_be32 (reg, a);
+       out_be32 (reg + 4, BOOTCOUNT_MAGIC);
+}
+
+ulong bootcount_load (void)
+{
+       void *reg = (void *)(CONFIG_SYS_IMMR + CONFIG_BOOTCOUNT_ADDR);
+
+       if (in_be32 (reg + 4) != BOOTCOUNT_MAGIC)
+               return 0;
+       else
+               return in_be32 (reg);
+}
+#endif /* CONFIG_BOOTCOUNT_LIMIT */
index f89077588f28b4762b67430b24f035575de7e81d..4cc90473727ba65a77cec1aaae90b14bf964e390 100644 (file)
@@ -32,6 +32,20 @@ extern void ft_qe_setup(void *blob);
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#if defined(CONFIG_BOOTCOUNT_LIMIT) && defined(CONFIG_MPC8360)
+#include <asm/immap_qe.h>
+
+void fdt_fixup_muram (void *blob)
+{
+       ulong data[2];
+
+       data[0] = 0;
+       data[1] = QE_MURAM_SIZE - 2 * sizeof(unsigned long);
+       do_fixup_by_path(blob, "/qe/muram/data-only", "reg",
+                     data, sizeof (data), 0);
+}
+#endif
+
 void ft_cpu_setup(void *blob, bd_t *bd)
 {
        immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
@@ -83,4 +97,8 @@ void ft_cpu_setup(void *blob, bd_t *bd)
 #endif
 
        fdt_fixup_memory(blob, (u64)bd->bi_memstart, (u64)bd->bi_memsize);
+
+#if defined(CONFIG_BOOTCOUNT_LIMIT)
+       fdt_fixup_muram (blob);
+#endif
 }