[PATCH] bootcount_ext: Add flag to enable/disable bootcount

Frédéric Danis frederic.danis at collabora.com
Wed Mar 11 11:59:49 CET 2020


After a successful upgrade, multiple problem during boot sequence may
trigger the altbootcmd process.
This patch adds a 3rd byte to the bootcount file to enable/disable the
bootcount check.
When reading old bootcount file, 2 bytes long, it will consider that
bootcount is enabled, 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 at collabora.com>
---
 drivers/bootcount/bootcount_ext.c | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/drivers/bootcount/bootcount_ext.c b/drivers/bootcount/bootcount_ext.c
index 075e590896..740bce0296 100644
--- a/drivers/bootcount/bootcount_ext.c
+++ b/drivers/bootcount/bootcount_ext.c
@@ -9,6 +9,8 @@
 
 #define BC_MAGIC	0xbc
 
+static u8 upgrade_available = 1;
+
 void bootcount_store(ulong a)
 {
 	u8 *buf;
@@ -21,13 +23,18 @@ void bootcount_store(ulong a)
 		return;
 	}
 
-	buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, 2);
+	/* Only update bootcount during upgrade process */
+	if (!upgrade_available)
+		return;
+
+	buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, 3);
 	buf[0] = BC_MAGIC;
 	buf[1] = (a & 0xff);
+	buf[2] = 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, 3, &len);
 	if (ret != 0)
 		puts("Error storing bootcount\n");
 }
@@ -45,15 +52,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, 3, &len_read);
+	if (ret != 0 || len_read < 2 || len_read > 3) {
 		puts("Error loading bootcount\n");
 		return 0;
 	}
 
 	buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, 2);
-	if (buf[0] == BC_MAGIC)
-		ret = buf[1];
+	/* Use the 3rd byte to enable/disable bootcount */
+	if (buf[0] == BC_MAGIC) {
+		if (len_read == 3)
+			upgrade_available = buf[2];
+		if (upgrade_available)
+			ret = buf[1];
+	}
 
 	unmap_sysmem(buf);
 
-- 
2.18.0



More information about the U-Boot mailing list