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 }
63