summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeiko Schocher <hs@denx.de>2013-11-04 14:04:59 +0100
committerTom Rini <trini@ti.com>2013-11-11 12:16:28 -0500
commiteda0ba38a8dfd2572089bd229a027d497c340158 (patch)
treeacb728760f98bd58b15a0d8d6b36b296ae1fbfe3
parent85b8c5c4bf80025de4632ae6c9a8a606e51508a4 (diff)
bootcount: store bootcount var in environment
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>
-rw-r--r--README16
-rw-r--r--drivers/bootcount/Makefile1
-rw-r--r--drivers/bootcount/bootcount_env.c29
3 files changed, 46 insertions, 0 deletions
diff --git a/README b/README
index a70475fb05..39b3fe6697 100644
--- 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
diff --git a/drivers/bootcount/Makefile b/drivers/bootcount/Makefile
index 8256ed0f46..d9c5695853 100644
--- a/drivers/bootcount/Makefile
+++ b/drivers/bootcount/Makefile
@@ -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
index 0000000000..2d6e8db126
--- /dev/null
+++ b/drivers/bootcount/bootcount_env.c
@@ -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;
+}