stm32mp_fuse.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
  4. */
  5. #include <common.h>
  6. #include <command.h>
  7. #include <misc.h>
  8. #include <errno.h>
  9. #include <dm/device.h>
  10. #include <dm/uclass.h>
  11. #define STM32MP_OTP_BANK 0
  12. /*
  13. * The 'fuse' command API
  14. */
  15. int fuse_read(u32 bank, u32 word, u32 *val)
  16. {
  17. int ret = 0;
  18. struct udevice *dev;
  19. switch (bank) {
  20. case STM32MP_OTP_BANK:
  21. ret = uclass_get_device_by_driver(UCLASS_MISC,
  22. DM_GET_DRIVER(stm32mp_bsec),
  23. &dev);
  24. if (ret)
  25. return ret;
  26. ret = misc_read(dev, word * 4 + STM32_BSEC_SHADOW_OFFSET,
  27. val, 4);
  28. if (ret < 0)
  29. return ret;
  30. ret = 0;
  31. break;
  32. default:
  33. printf("stm32mp %s: wrong value for bank %i\n", __func__, bank);
  34. ret = -EINVAL;
  35. break;
  36. }
  37. return ret;
  38. }
  39. int fuse_prog(u32 bank, u32 word, u32 val)
  40. {
  41. struct udevice *dev;
  42. int ret;
  43. switch (bank) {
  44. case STM32MP_OTP_BANK:
  45. ret = uclass_get_device_by_driver(UCLASS_MISC,
  46. DM_GET_DRIVER(stm32mp_bsec),
  47. &dev);
  48. if (ret)
  49. return ret;
  50. ret = misc_write(dev, word * 4 + STM32_BSEC_OTP_OFFSET,
  51. &val, 4);
  52. if (ret < 0)
  53. return ret;
  54. ret = 0;
  55. break;
  56. default:
  57. printf("stm32mp %s: wrong value for bank %i\n", __func__, bank);
  58. ret = -EINVAL;
  59. break;
  60. }
  61. return ret;
  62. }
  63. int fuse_sense(u32 bank, u32 word, u32 *val)
  64. {
  65. struct udevice *dev;
  66. int ret;
  67. switch (bank) {
  68. case STM32MP_OTP_BANK:
  69. ret = uclass_get_device_by_driver(UCLASS_MISC,
  70. DM_GET_DRIVER(stm32mp_bsec),
  71. &dev);
  72. if (ret)
  73. return ret;
  74. ret = misc_read(dev, word * 4 + STM32_BSEC_OTP_OFFSET, val, 4);
  75. if (ret < 0)
  76. return ret;
  77. ret = 0;
  78. break;
  79. default:
  80. printf("stm32mp %s: wrong value for bank %i\n", __func__, bank);
  81. ret = -EINVAL;
  82. break;
  83. }
  84. return ret;
  85. }
  86. int fuse_override(u32 bank, u32 word, u32 val)
  87. {
  88. struct udevice *dev;
  89. int ret;
  90. switch (bank) {
  91. case STM32MP_OTP_BANK:
  92. ret = uclass_get_device_by_driver(UCLASS_MISC,
  93. DM_GET_DRIVER(stm32mp_bsec),
  94. &dev);
  95. if (ret)
  96. return ret;
  97. ret = misc_write(dev, word * 4 + STM32_BSEC_SHADOW_OFFSET,
  98. &val, 4);
  99. if (ret < 0)
  100. return ret;
  101. ret = 0;
  102. break;
  103. default:
  104. printf("stm32mp %s: wrong value for bank %i\n",
  105. __func__, bank);
  106. ret = -EINVAL;
  107. break;
  108. }
  109. return ret;
  110. }