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