• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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