bootcount_ext: Add flag to enable/disable bootcount
[oweals/u-boot.git] / drivers / bootcount / bootcount_ext.c
index 075e5908960d88c0eca1ba78d150549086363d09..9639e638e953e4426a6557836a69fe0c62c36153 100644 (file)
@@ -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);