bootcount_ext.c 1.2 KB

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