summaryrefslogtreecommitdiff
path: root/drivers/bootcount
diff options
context:
space:
mode:
authorFrédéric Danis <frederic.danis@collabora.com>2020-03-17 17:59:09 +0100
committerTom Rini <trini@konsulko.com>2020-04-24 10:10:00 -0400
commitdf928f8549ab4470b45bdf3ca2a1b45c9ffd4317 (patch)
tree58fda0e7dd1d9591f2bd415aed652a9833bd526f /drivers/bootcount
parent080019b86c997a9b7e13bc7b8f476fbf9a0e5f3c (diff)
bootcount_ext: Add flag to enable/disable bootcount
After a successful upgrade, multiple problem during boot sequence may trigger the altbootcmd process. This patch adds a version and an upgrade_available entries to the bootcount file to enable/disable the bootcount check. When failing to read the bootcount file it will consider that bootcount is enabled, acting as previously, and update the file accordingly. The bootcount file is only saved when `upgrade_available` is true, this allows to save writes to the filesystem. Signed-off-by: Frédéric Danis <frederic.danis@collabora.com> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/bootcount')
-rw-r--r--drivers/bootcount/bootcount_ext.c46
1 files changed, 34 insertions, 12 deletions
diff --git a/drivers/bootcount/bootcount_ext.c b/drivers/bootcount/bootcount_ext.c
index 075e590896..9639e638e9 100644
--- a/drivers/bootcount/bootcount_ext.c
+++ b/drivers/bootcount/bootcount_ext.c
@@ -7,11 +7,21 @@
#include <fs.h>
#include <mapmem.h>
-#define BC_MAGIC 0xbc
+#define BC_MAGIC 0xbd
+#define BC_VERSION 1
+
+typedef struct {
+ u8 magic;
+ u8 version;
+ u8 bootcount;
+ u8 upgrade_available;
+} bootcount_ext_t;
+
+static u8 upgrade_available = 1;
void bootcount_store(ulong a)
{
- u8 *buf;
+ bootcount_ext_t *buf;
loff_t len;
int ret;
@@ -21,20 +31,27 @@ void bootcount_store(ulong a)
return;
}
- buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, 2);
- buf[0] = BC_MAGIC;
- buf[1] = (a & 0xff);
+ /* Only update bootcount during upgrade process */
+ if (!upgrade_available)
+ return;
+
+ buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, sizeof(bootcount_ext_t));
+ buf->magic = BC_MAGIC;
+ buf->version = BC_VERSION;
+ buf->bootcount = (a & 0xff);
+ buf->upgrade_available = upgrade_available;
unmap_sysmem(buf);
ret = fs_write(CONFIG_SYS_BOOTCOUNT_EXT_NAME,
- CONFIG_SYS_BOOTCOUNT_ADDR, 0, 2, &len);
+ CONFIG_SYS_BOOTCOUNT_ADDR, 0, sizeof(bootcount_ext_t),
+ &len);
if (ret != 0)
puts("Error storing bootcount\n");
}
ulong bootcount_load(void)
{
- u8 *buf;
+ bootcount_ext_t *buf;
loff_t len_read;
int ret;
@@ -45,15 +62,20 @@ ulong bootcount_load(void)
}
ret = fs_read(CONFIG_SYS_BOOTCOUNT_EXT_NAME, CONFIG_SYS_BOOTCOUNT_ADDR,
- 0, 2, &len_read);
- if (ret != 0 || len_read != 2) {
+ 0, sizeof(bootcount_ext_t), &len_read);
+ if (ret != 0 || len_read != sizeof(bootcount_ext_t)) {
puts("Error loading bootcount\n");
return 0;
}
- buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, 2);
- if (buf[0] == BC_MAGIC)
- ret = buf[1];
+ buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, sizeof(bootcount_ext_t));
+ if (buf->magic == BC_MAGIC && buf->version == BC_VERSION) {
+ upgrade_available = buf->upgrade_available;
+ if (upgrade_available)
+ ret = buf->bootcount;
+ } else {
+ puts("Incorrect bootcount file\n");
+ }
unmap_sysmem(buf);