bootcount_ext.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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 0xbd
  9. #define BC_VERSION 1
  10. typedef struct {
  11. u8 magic;
  12. u8 version;
  13. u8 bootcount;
  14. u8 upgrade_available;
  15. } bootcount_ext_t;
  16. static u8 upgrade_available = 1;
  17. void bootcount_store(ulong a)
  18. {
  19. bootcount_ext_t *buf;
  20. loff_t len;
  21. int ret;
  22. if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_EXT_INTERFACE,
  23. CONFIG_SYS_BOOTCOUNT_EXT_DEVPART, FS_TYPE_EXT)) {
  24. puts("Error selecting device\n");
  25. return;
  26. }
  27. /* Only update bootcount during upgrade process */
  28. if (!upgrade_available)
  29. return;
  30. buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, sizeof(bootcount_ext_t));
  31. buf->magic = BC_MAGIC;
  32. buf->version = BC_VERSION;
  33. buf->bootcount = (a & 0xff);
  34. buf->upgrade_available = upgrade_available;
  35. unmap_sysmem(buf);
  36. ret = fs_write(CONFIG_SYS_BOOTCOUNT_EXT_NAME,
  37. CONFIG_SYS_BOOTCOUNT_ADDR, 0, sizeof(bootcount_ext_t),
  38. &len);
  39. if (ret != 0)
  40. puts("Error storing bootcount\n");
  41. }
  42. ulong bootcount_load(void)
  43. {
  44. bootcount_ext_t *buf;
  45. loff_t len_read;
  46. int ret;
  47. if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_EXT_INTERFACE,
  48. CONFIG_SYS_BOOTCOUNT_EXT_DEVPART, FS_TYPE_EXT)) {
  49. puts("Error selecting device\n");
  50. return 0;
  51. }
  52. ret = fs_read(CONFIG_SYS_BOOTCOUNT_EXT_NAME, CONFIG_SYS_BOOTCOUNT_ADDR,
  53. 0, sizeof(bootcount_ext_t), &len_read);
  54. if (ret != 0 || len_read != sizeof(bootcount_ext_t)) {
  55. puts("Error loading bootcount\n");
  56. return 0;
  57. }
  58. buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, sizeof(bootcount_ext_t));
  59. if (buf->magic == BC_MAGIC && buf->version == BC_VERSION) {
  60. upgrade_available = buf->upgrade_available;
  61. if (upgrade_available)
  62. ret = buf->bootcount;
  63. } else {
  64. puts("Incorrect bootcount file\n");
  65. }
  66. unmap_sysmem(buf);
  67. return ret;
  68. }