bootcount_ext.c 1.2 KB

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