1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (c) 2017 General Electric Company. All rights reserved. 4 */ 5 6 #include <bootcount.h> 7 #include <fs.h> 8 #include <mapmem.h> 9 10 #define BC_MAGIC 0xbc 11 12 void 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 35 ulong 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 } 62