hpm_psec_drv.h 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. /*
  2. * Copyright (c) 2021 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_PSEC_DRV_H
  8. #define HPM_PSEC_DRV_H
  9. #include "hpm_common.h"
  10. #include "hpm_psec_regs.h"
  11. typedef enum psec_lifecycle {
  12. psec_lifecycle_unknown = 1 << 0,
  13. psec_lifecycle_create = 1 << 1,
  14. psec_lifecycle_nonsecucre = 1 << 2,
  15. psec_lifecycle_secucre = 1 << 3,
  16. psec_lifecycle_return = 1 << 4,
  17. psec_lifecycle_no_return = 1 << 5,
  18. psec_lifecycle_scribe = 1 << 6,
  19. psec_lifecycle_debate = 1 << 7,
  20. } psec_lifecycle_t;
  21. typedef enum batt_sec_state {
  22. batt_sec_state_ins = 0,
  23. batt_sec_state_secure = 1,
  24. batt_sec_state_non_secure = 2,
  25. batt_sec_state_fail = 3,
  26. } batt_sec_state_t;
  27. typedef enum psec_state {
  28. psec_state_ins = 0,
  29. psec_state_secure = 1,
  30. psec_state_non_secure = 2,
  31. psec_state_fail = 3,
  32. } psec_state_t;
  33. enum {
  34. status_psec_switch_state_not_allowed = MAKE_STATUS(status_group_psec, 1),
  35. };
  36. #define PSEC_PSECURE_STATE_MASK \
  37. (0xFU << PSEC_SECURE_STATE_PMIC_INS_SHIFT)
  38. #define PSEC_BATT_SECURE_STATE_MASK \
  39. (0xFU << PSEC_SECURE_STATE_BATT_INS_SHIFT)
  40. #ifdef __cplusplus
  41. extern "C" {
  42. #endif
  43. static inline psec_lifecycle_t psec_get_pmic_lifecycle(PSEC_Type *ptr)
  44. {
  45. return (psec_lifecycle_t) PSEC_LIFECYCLE_LIFECYCLE_GET(ptr->LIFECYCLE);
  46. }
  47. static inline hpm_stat_t psec_switch_pmic_state(PSEC_Type *ptr, psec_state_t state)
  48. {
  49. if (state == psec_state_secure) {
  50. if (!PSEC_SECURE_STATE_ALLOW_SEC_GET(ptr->SECURE_STATE)) {
  51. return status_psec_switch_state_not_allowed;
  52. }
  53. } else if (state == psec_state_non_secure) {
  54. if (!PSEC_SECURE_STATE_ALLOW_NSC_GET(ptr->SECURE_STATE)) {
  55. return status_psec_switch_state_not_allowed;
  56. }
  57. }
  58. ptr->SECURE_STATE = (ptr->SECURE_STATE & ~PSEC_PSECURE_STATE_MASK)
  59. | (1U << (PSEC_SECURE_STATE_PMIC_INS_SHIFT + state));
  60. return status_success;
  61. }
  62. static inline void psec_allow_psecure_state_restart(PSEC_Type *ptr, bool allow)
  63. {
  64. ptr->SECURE_STATE_CONFIG = (ptr->SECURE_STATE_CONFIG
  65. & ~PSEC_SECURE_STATE_CONFIG_ALLOW_RESTART_MASK)
  66. | PSEC_SECURE_STATE_CONFIG_ALLOW_RESTART_SET(allow);
  67. }
  68. static inline void psec_lock_psecure_state_restart(PSEC_Type *ptr, bool lock)
  69. {
  70. ptr->SECURE_STATE_CONFIG = (ptr->SECURE_STATE_CONFIG
  71. & ~PSEC_SECURE_STATE_CONFIG_LOCK_MASK)
  72. | PSEC_SECURE_STATE_CONFIG_LOCK_SET(lock);
  73. }
  74. static inline void psec_pmic_rom_secrets_present(PSEC_Type *ptr, bool presented)
  75. {
  76. ptr->SECURE_STATE_CONFIG = (ptr->SECURE_STATE_CONFIG
  77. & ~PSEC_SECURE_STATE_CONFIG_ROM_SECRETS_MASK)
  78. | PSEC_SECURE_STATE_CONFIG_ROM_SECRETS_SET(presented);
  79. }
  80. static inline void psec_psec_secure_state_config(PSEC_Type *ptr,
  81. bool rom_secrets_presented,
  82. bool allow_secure_state_restart,
  83. bool lock_secure_state_restart)
  84. {
  85. ptr->SECURE_STATE_CONFIG = PSEC_SECURE_STATE_CONFIG_ROM_SECRETS_SET(rom_secrets_presented)
  86. | PSEC_SECURE_STATE_CONFIG_ALLOW_RESTART_SET(allow_secure_state_restart)
  87. | PSEC_SECURE_STATE_CONFIG_LOCK_SET(lock_secure_state_restart);
  88. }
  89. static inline void psec_pmic_non_secure_violation_config(PSEC_Type *ptr,
  90. uint32_t violation_setting,
  91. bool lock)
  92. {
  93. ptr->VIOLATION_CONFIG = (ptr->VIOLATION_CONFIG
  94. & ~(PSEC_VIOLATION_CONFIG_LOCK_NSC_MASK
  95. | PSEC_VIOLATION_CONFIG_NSC_VIO_CFG_MASK))
  96. | PSEC_VIOLATION_CONFIG_LOCK_NSC_SET(lock)
  97. | PSEC_VIOLATION_CONFIG_NSC_VIO_CFG_SET(violation_setting);
  98. }
  99. static inline void psec_psecure_violation_config(PSEC_Type *ptr,
  100. uint32_t violation_setting,
  101. bool lock)
  102. {
  103. ptr->VIOLATION_CONFIG = (ptr->VIOLATION_CONFIG
  104. & ~(PSEC_VIOLATION_CONFIG_LOCK_SEC_MASK
  105. | PSEC_VIOLATION_CONFIG_SEC_VIO_CFG_MASK))
  106. | PSEC_VIOLATION_CONFIG_LOCK_SEC_SET(lock)
  107. | PSEC_VIOLATION_CONFIG_SEC_VIO_CFG_SET(violation_setting);
  108. }
  109. static inline void psec_pmic_non_secure_escalate_config(PSEC_Type *ptr,
  110. uint32_t violation_setting,
  111. bool lock)
  112. {
  113. ptr->ESCALATE_CONFIG = (ptr->ESCALATE_CONFIG
  114. & ~(PSEC_ESCALATE_CONFIG_LOCK_NSC_MASK
  115. | PSEC_ESCALATE_CONFIG_NSC_VIO_CFG_MASK))
  116. | PSEC_ESCALATE_CONFIG_LOCK_NSC_SET(lock)
  117. | PSEC_ESCALATE_CONFIG_NSC_VIO_CFG_SET(violation_setting);
  118. }
  119. static inline void psec_psecure_escalate_config(PSEC_Type *ptr,
  120. uint32_t violation_setting,
  121. bool lock)
  122. {
  123. ptr->ESCALATE_CONFIG = (ptr->ESCALATE_CONFIG
  124. & ~(PSEC_ESCALATE_CONFIG_LOCK_SEC_MASK
  125. | PSEC_ESCALATE_CONFIG_SEC_VIO_CFG_MASK))
  126. | PSEC_ESCALATE_CONFIG_LOCK_SEC_SET(lock)
  127. | PSEC_ESCALATE_CONFIG_SEC_VIO_CFG_SET(violation_setting);
  128. }
  129. static inline uint32_t psec_get_pmic_status(PSEC_Type *ptr)
  130. {
  131. return ptr->EVENT;
  132. }
  133. static inline psec_lifecycle_t psec_get_batt_lifecycle(PSEC_Type *ptr)
  134. {
  135. return (psec_lifecycle_t) PSEC_LIFECYCLE_LIFECYCLE_GET(ptr->LIFECYCLE);
  136. }
  137. static inline hpm_stat_t psec_switch_batt_state(PSEC_Type *ptr, batt_sec_state_t state)
  138. {
  139. if (state == batt_sec_state_secure) {
  140. if (!PSEC_SECURE_STATE_ALLOW_SEC_GET(ptr->SECURE_STATE)) {
  141. return status_psec_switch_state_not_allowed;
  142. }
  143. } else if (state == batt_sec_state_non_secure) {
  144. if (!PSEC_SECURE_STATE_ALLOW_NSC_GET(ptr->SECURE_STATE)) {
  145. return status_psec_switch_state_not_allowed;
  146. }
  147. }
  148. ptr->SECURE_STATE = (ptr->SECURE_STATE & ~PSEC_BATT_SECURE_STATE_MASK)
  149. | (1U << (PSEC_SECURE_STATE_BATT_INS_SHIFT + state));
  150. return status_success;
  151. }
  152. static inline void psec_allow_batt_secure_state_restart(PSEC_Type *ptr, bool allow)
  153. {
  154. ptr->SECURE_STATE_CONFIG = (ptr->SECURE_STATE_CONFIG
  155. & ~PSEC_SECURE_STATE_CONFIG_ALLOW_RESTART_MASK)
  156. | PSEC_SECURE_STATE_CONFIG_ALLOW_RESTART_SET(allow);
  157. }
  158. static inline void psec_lock_batt_secure_state_restart(PSEC_Type *ptr, bool lock)
  159. {
  160. ptr->SECURE_STATE_CONFIG = (ptr->SECURE_STATE_CONFIG
  161. & ~PSEC_SECURE_STATE_CONFIG_LOCK_MASK)
  162. | PSEC_SECURE_STATE_CONFIG_LOCK_SET(lock);
  163. }
  164. static inline void psec_batt_rom_secrets_present(PSEC_Type *ptr, bool presented)
  165. {
  166. ptr->SECURE_STATE_CONFIG = (ptr->SECURE_STATE_CONFIG
  167. & ~PSEC_SECURE_STATE_CONFIG_ROM_SECRETS_MASK)
  168. | PSEC_SECURE_STATE_CONFIG_ROM_SECRETS_SET(presented);
  169. }
  170. static inline void psec_batt_set_secure_state_config(PSEC_Type *ptr,
  171. bool rom_secrets_presented,
  172. bool allow_secure_state_restart,
  173. bool lock_secure_state_restart)
  174. {
  175. ptr->SECURE_STATE_CONFIG = PSEC_SECURE_STATE_CONFIG_ROM_SECRETS_SET(rom_secrets_presented)
  176. | PSEC_SECURE_STATE_CONFIG_ALLOW_RESTART_SET(allow_secure_state_restart)
  177. | PSEC_SECURE_STATE_CONFIG_LOCK_SET(lock_secure_state_restart);
  178. }
  179. static inline void psec_batt_non_secure_violation_config(PSEC_Type *ptr,
  180. uint32_t violation_setting,
  181. bool lock)
  182. {
  183. ptr->VIOLATION_CONFIG = (ptr->VIOLATION_CONFIG
  184. & ~(PSEC_VIOLATION_CONFIG_LOCK_NSC_MASK
  185. | PSEC_VIOLATION_CONFIG_NSC_VIO_CFG_MASK))
  186. | PSEC_VIOLATION_CONFIG_LOCK_NSC_SET(lock)
  187. | PSEC_VIOLATION_CONFIG_NSC_VIO_CFG_SET(violation_setting);
  188. }
  189. static inline void psec_batt_secure_violation_config(PSEC_Type *ptr,
  190. uint32_t violation_setting,
  191. bool lock)
  192. {
  193. ptr->VIOLATION_CONFIG = (ptr->VIOLATION_CONFIG
  194. & ~(PSEC_VIOLATION_CONFIG_LOCK_SEC_MASK
  195. | PSEC_VIOLATION_CONFIG_SEC_VIO_CFG_MASK))
  196. | PSEC_VIOLATION_CONFIG_LOCK_SEC_SET(lock)
  197. | PSEC_VIOLATION_CONFIG_SEC_VIO_CFG_SET(violation_setting);
  198. }
  199. static inline void psec_batt_non_secure_escalate_config(PSEC_Type *ptr,
  200. uint32_t violation_setting,
  201. bool lock)
  202. {
  203. ptr->ESCALATE_CONFIG = (ptr->ESCALATE_CONFIG
  204. & ~(PSEC_ESCALATE_CONFIG_LOCK_NSC_MASK
  205. | PSEC_ESCALATE_CONFIG_NSC_VIO_CFG_MASK))
  206. | PSEC_ESCALATE_CONFIG_LOCK_NSC_SET(lock)
  207. | PSEC_ESCALATE_CONFIG_NSC_VIO_CFG_SET(violation_setting);
  208. }
  209. static inline void psec_batt_secure_escalate_config(PSEC_Type *ptr,
  210. uint32_t violation_setting,
  211. bool lock)
  212. {
  213. ptr->ESCALATE_CONFIG = (ptr->ESCALATE_CONFIG
  214. & ~(PSEC_ESCALATE_CONFIG_LOCK_SEC_MASK
  215. | PSEC_ESCALATE_CONFIG_SEC_VIO_CFG_MASK))
  216. | PSEC_ESCALATE_CONFIG_LOCK_SEC_SET(lock)
  217. | PSEC_ESCALATE_CONFIG_SEC_VIO_CFG_SET(violation_setting);
  218. }
  219. static inline uint32_t psec_get_batt_status(PSEC_Type *ptr)
  220. {
  221. return ptr->EVENT;
  222. }
  223. #ifdef __cplusplus
  224. }
  225. #endif
  226. #endif /* HPM_PSEC_DRV_H */