bootcount: store bootcount var in environment
authorHeiko Schocher <hs@denx.de>
Mon, 4 Nov 2013 13:04:59 +0000 (14:04 +0100)
committerTom Rini <trini@ti.com>
Mon, 11 Nov 2013 17:16:28 +0000 (12:16 -0500)
If no softreset save registers are found on the hardware
"bootcount" is stored in the environment. To prevent a
saveenv on all reboots, the environment variable
"upgrade_available" is introduced. If "upgrade_available" is
0, "bootcount" is always 0 therefore no need to save the
environment on u-boot boot, if "upgrade_available" is 1 "bootcount"
is incremented in the environment and environment gets written
on u-boot start.
So the Userspace Applikation must set the "upgrade_available"
and "bootcount" variable to 0 (for example with fw_setenv),
if a boot was successfully.

Signed-off-by: Heiko Schocher <hs@denx.de>
README
drivers/bootcount/Makefile
drivers/bootcount/bootcount_env.c [new file with mode: 0644]

diff --git a/README b/README
index a70475fb05f024e1b580317c0e8723ad4a574c73..39b3fe66977aa6f8d5833e4eeddb18c356d6ea0e 100644 (file)
--- a/README
+++ b/README
@@ -784,6 +784,22 @@ The following options need to be configured:
                as a convenience, when switching between booting from
                RAM and NFS.
 
+- Bootcount:
+               CONFIG_BOOTCOUNT_LIMIT
+               Implements a mechanism for detecting a repeating reboot
+               cycle, see:
+               http://www.denx.de/wiki/view/DULG/UBootBootCountLimit
+
+               CONFIG_BOOTCOUNT_ENV
+               If no softreset save registers are found on the hardware
+               "bootcount" is stored in the environment. To prevent a
+               saveenv on all reboots, the environment variable
+               "upgrade_available" is used. If "upgrade_available" is
+               0, "bootcount" is always 0, if "upgrade_available" is
+               1 "bootcount" is incremented in the environment.
+               So the Userspace Applikation must set the "upgrade_available"
+               and "bootcount" variable to 0, if a boot was successfully.
+
 - Pre-Boot Commands:
                CONFIG_PREBOOT
 
index 8256ed0f46b290e1037a1de768e6e16edb4f1a06..d9c56958536021a6f845ad6f309b25e068b93bc5 100644 (file)
@@ -8,3 +8,4 @@ obj-$(CONFIG_BLACKFIN)          += bootcount_blackfin.o
 obj-$(CONFIG_SOC_DA8XX)                += bootcount_davinci.o
 obj-$(CONFIG_AM33XX)           += bootcount_davinci.o
 obj-$(CONFIG_BOOTCOUNT_RAM)    += bootcount_ram.o
+obj-$(CONFIG_BOOTCOUNT_ENV)    += bootcount_env.o
diff --git a/drivers/bootcount/bootcount_env.c b/drivers/bootcount/bootcount_env.c
new file mode 100644 (file)
index 0000000..2d6e8db
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * (C) Copyright 2013
+ * Heiko Schocher, DENX Software Engineering, hs@denx.de.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+
+void bootcount_store(ulong a)
+{
+       int upgrade_available = getenv_ulong("upgrade_available", 10, 0);
+
+       if (upgrade_available) {
+               setenv_ulong("bootcount", a);
+               saveenv();
+       }
+}
+
+ulong bootcount_load(void)
+{
+       int upgrade_available = getenv_ulong("upgrade_available", 10, 0);
+       ulong val = 0;
+
+       if (upgrade_available)
+               val = getenv_ulong("bootcount", 10, 0);
+
+       return val;
+}