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