summaryrefslogtreecommitdiff
path: root/drivers/bootcount/bootcount_fs.c
diff options
context:
space:
mode:
authorVasileios Amoiridis <vassilisamir@gmail.com>2024-06-28 19:35:41 +0200
committerTom Rini <trini@konsulko.com>2024-07-16 12:46:34 -0600
commit1d7e2120af8ddf1abbdb6f34e3a39174cf54736f (patch)
tree621ccea85f76b461f3fd0744bc3988fae27b8088 /drivers/bootcount/bootcount_fs.c
parentc53b344475734d0d29f522b7b1d80c5b8204442d (diff)
drivers: bootcount: Add support for ANY filesystem
Add support to save boot count variable in ANY filesystem. Tested with FAT and EXT. Reviewed-by: Tom Rini <trini@konsulko.com> Reviewed-by: Heiko Schocher <hs@denx.de> Reviewed-by: Philip Oberfichtner <pro@denx.de> Signed-off-by: Vasileios Amoiridis <vasileios.amoiridis@cern.ch>
Diffstat (limited to 'drivers/bootcount/bootcount_fs.c')
-rw-r--r--drivers/bootcount/bootcount_fs.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/drivers/bootcount/bootcount_fs.c b/drivers/bootcount/bootcount_fs.c
new file mode 100644
index 00000000000..569592d8aad
--- /dev/null
+++ b/drivers/bootcount/bootcount_fs.c
@@ -0,0 +1,83 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2017 General Electric Company. All rights reserved.
+ */
+
+#include <bootcount.h>
+#include <fs.h>
+#include <mapmem.h>
+
+#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)
+{
+ bootcount_ext_t *buf;
+ loff_t len;
+ int ret;
+
+ if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_FS_INTERFACE,
+ CONFIG_SYS_BOOTCOUNT_FS_DEVPART, FS_TYPE_ANY)) {
+ puts("Error selecting device\n");
+ return;
+ }
+
+ /* 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_FS_NAME,
+ CONFIG_SYS_BOOTCOUNT_ADDR, 0, sizeof(bootcount_ext_t),
+ &len);
+ if (ret != 0)
+ puts("Error storing bootcount\n");
+}
+
+ulong bootcount_load(void)
+{
+ bootcount_ext_t *buf;
+ loff_t len_read;
+ int ret;
+
+ if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_FS_INTERFACE,
+ CONFIG_SYS_BOOTCOUNT_FS_DEVPART, FS_TYPE_ANY)) {
+ puts("Error selecting device\n");
+ return 0;
+ }
+
+ ret = fs_read(CONFIG_SYS_BOOTCOUNT_FS_NAME, CONFIG_SYS_BOOTCOUNT_ADDR,
+ 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, 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);
+
+ return ret;
+}