]> git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/bootcount/bootcount_ext.c
bootcount: add support for bootcounter on EXT filesystem
[people/ms/u-boot.git] / drivers / bootcount / bootcount_ext.c
1 /*
2 * Copyright (c) 2017 General Electric Company. All rights reserved.
3 *
4 * SPDX-License-Identifier: GPL-2.0+
5 */
6
7 #include <bootcount.h>
8 #include <fs.h>
9 #include <mapmem.h>
10
11 #define BC_MAGIC 0xbc
12
13 void bootcount_store(ulong a)
14 {
15 u8 *buf;
16 loff_t len;
17 int ret;
18
19 if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_EXT_INTERFACE,
20 CONFIG_SYS_BOOTCOUNT_EXT_DEVPART, FS_TYPE_EXT)) {
21 puts("Error selecting device\n");
22 return;
23 }
24
25 buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, 2);
26 buf[0] = BC_MAGIC;
27 buf[1] = (a & 0xff);
28 unmap_sysmem(buf);
29
30 ret = fs_write(CONFIG_SYS_BOOTCOUNT_EXT_NAME,
31 CONFIG_SYS_BOOTCOUNT_ADDR, 0, 2, &len);
32 if (ret != 0)
33 puts("Error storing bootcount\n");
34 }
35
36 ulong bootcount_load(void)
37 {
38 u8 *buf;
39 loff_t len_read;
40 int ret;
41
42 if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_EXT_INTERFACE,
43 CONFIG_SYS_BOOTCOUNT_EXT_DEVPART, FS_TYPE_EXT)) {
44 puts("Error selecting device\n");
45 return 0;
46 }
47
48 ret = fs_read(CONFIG_SYS_BOOTCOUNT_EXT_NAME, CONFIG_SYS_BOOTCOUNT_ADDR,
49 0, 2, &len_read);
50 if (ret != 0 || len_read != 2) {
51 puts("Error loading bootcount\n");
52 return 0;
53 }
54
55 buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, 2);
56 if (buf[0] == BC_MAGIC)
57 ret = buf[1];
58
59 unmap_sysmem(buf);
60
61 return ret;
62 }