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