1 /*
2 * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #pragma once
8
9 #include <stdbool.h>
10 #include "soc/memprot_defs.h"
11 #include "hal/memprot_types.h"
12
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16
17 /**
18 * ========================================================================================
19 * === PeriBus1 common
20 * ========================================================================================
21 */
memprot_ll_peri1_clear_intr(void)22 static inline void memprot_ll_peri1_clear_intr(void)
23 {
24 DPORT_SET_PERI_REG_MASK(DPORT_PMS_PRO_DPORT_6_REG, DPORT_PMS_PRO_DPORT_ILG_CLR);
25 DPORT_CLEAR_PERI_REG_MASK(DPORT_PMS_PRO_DPORT_6_REG, DPORT_PMS_PRO_DPORT_ILG_CLR);
26 }
27
memprot_ll_peri1_get_intr_source_num(void)28 static inline uint32_t memprot_ll_peri1_get_intr_source_num(void)
29 {
30 return ETS_PMS_PRO_DPORT_ILG_INTR_SOURCE;
31 }
32
memprot_ll_peri1_intr_ena(bool enable)33 static inline void memprot_ll_peri1_intr_ena(bool enable)
34 {
35 if (enable) {
36 DPORT_SET_PERI_REG_MASK(DPORT_PMS_PRO_DPORT_6_REG, DPORT_PMS_PRO_DPORT_ILG_EN);
37 } else {
38 DPORT_CLEAR_PERI_REG_MASK(DPORT_PMS_PRO_DPORT_6_REG, DPORT_PMS_PRO_DPORT_ILG_EN);
39 }
40 }
41
memprot_ll_peri1_get_ctrl_reg(void)42 static inline uint32_t memprot_ll_peri1_get_ctrl_reg(void)
43 {
44 return DPORT_READ_PERI_REG(DPORT_PMS_PRO_DPORT_6_REG);
45 }
46
memprot_ll_peri1_get_fault_reg(void)47 static inline uint32_t memprot_ll_peri1_get_fault_reg(void)
48 {
49 return DPORT_READ_PERI_REG(DPORT_PMS_PRO_DPORT_7_REG);
50 }
51
memprot_ll_peri1_get_fault_op_type(uint32_t * op_type,uint32_t * op_subtype)52 static inline void memprot_ll_peri1_get_fault_op_type(uint32_t *op_type, uint32_t *op_subtype)
53 {
54 uint32_t status_bits = memprot_ll_peri1_get_fault_reg();
55 //*op_type = (uint32_t)status_bits & PERI1_INTR_ST_OP_RW_BIT;
56 *op_type = 0;
57 //! DPORT_PMS_PRO_DPORT_7_REG is missing op_type bit
58 *op_subtype = (uint32_t)status_bits & PERI1_INTR_ST_OP_TYPE_BIT;
59 }
60
memprot_ll_peri1_is_assoc_intr(void)61 static inline bool memprot_ll_peri1_is_assoc_intr(void)
62 {
63 return DPORT_GET_PERI_REG_MASK(DPORT_PMS_PRO_DPORT_7_REG, DPORT_PMS_PRO_DPORT_ILG_INTR) > 0;
64 }
65
memprot_ll_peri1_get_intr_ena_bit(void)66 static inline uint32_t memprot_ll_peri1_get_intr_ena_bit(void)
67 {
68 return DPORT_REG_GET_FIELD(DPORT_PMS_PRO_DPORT_6_REG, DPORT_PMS_PRO_DPORT_ILG_EN);
69 }
70
memprot_ll_peri1_get_intr_on_bit(void)71 static inline uint32_t memprot_ll_peri1_get_intr_on_bit(void)
72 {
73 return DPORT_REG_GET_FIELD(DPORT_PMS_PRO_DPORT_6_REG, DPORT_PMS_PRO_DPORT_ILG_INTR);
74 }
75
memprot_ll_peri1_get_intr_clr_bit(void)76 static inline uint32_t memprot_ll_peri1_get_intr_clr_bit(void)
77 {
78 return DPORT_REG_GET_FIELD(DPORT_PMS_PRO_DPORT_6_REG, DPORT_PMS_PRO_DPORT_ILG_CLR);
79 }
80
memprot_ll_peri1_get_lock_reg(void)81 static inline uint32_t memprot_ll_peri1_get_lock_reg(void)
82 {
83 return DPORT_READ_PERI_REG(DPORT_PMS_PRO_DPORT_0_REG);
84 }
85
86 //resets automatically on CPU restart
memprot_ll_peri1_set_lock(void)87 static inline void memprot_ll_peri1_set_lock(void)
88 {
89 DPORT_WRITE_PERI_REG(DPORT_PMS_PRO_DPORT_0_REG, DPORT_PMS_PRO_DPORT_LOCK);
90 }
91
memprot_ll_peri1_get_lock_bit(void)92 static inline uint32_t memprot_ll_peri1_get_lock_bit(void)
93 {
94 return DPORT_REG_GET_FIELD(DPORT_PMS_PRO_DPORT_0_REG, DPORT_PMS_PRO_DPORT_LOCK);
95 }
96
97 /**
98 * ========================================================================================
99 * === PeriBus1 RTC SLOW
100 * ========================================================================================
101 */
memprot_ll_peri1_rtcslow_get_fault_address(void)102 static inline intptr_t memprot_ll_peri1_rtcslow_get_fault_address(void)
103 {
104 uint32_t status_bits = memprot_ll_peri1_get_fault_reg();
105 uint32_t fault_address = (status_bits & PERI1_INTR_ST_FAULTADDR_M) >> PERI1_INTR_ST_FAULTADDR_S;
106 uint32_t high_bits = (status_bits & PERI1_INTR_ST_OP_HIGH_BITS) ? PERI1_RTCSLOW_INTR_ST_FAULTADDR_HI_0 : 0;
107 return (intptr_t)(fault_address | high_bits);
108 }
109
memprot_ll_peri1_rtcslow_is_intr_mine(void)110 static inline bool memprot_ll_peri1_rtcslow_is_intr_mine(void)
111 {
112 if (memprot_ll_dram0_is_assoc_intr()) {
113 uint32_t faulting_address = (uint32_t)memprot_ll_peri1_rtcslow_get_fault_address();
114 return faulting_address >= PERI1_RTCSLOW_ADDRESS_LOW && faulting_address <= PERI1_RTCSLOW_ADDRESS_HIGH;
115 }
116 return false;
117 }
118
memprot_ll_peri1_rtcslow_set_prot(uint32_t * split_addr,bool lw,bool lr,bool hw,bool hr)119 static inline memprot_hal_err_t memprot_ll_peri1_rtcslow_set_prot(uint32_t *split_addr, bool lw, bool lr, bool hw, bool hr)
120 {
121 uint32_t addr = (uint32_t)split_addr;
122
123 //check corresponding range fit & aligment to 32bit boundaries
124 if (addr < PERI1_RTCSLOW_ADDRESS_LOW || addr > PERI1_RTCSLOW_ADDRESS_HIGH) {
125 return MEMP_HAL_ERR_SPLIT_ADDR_INVALID;
126 }
127 if (addr % 0x4 != 0) {
128 return MEMP_HAL_ERR_SPLIT_ADDR_UNALIGNED;
129 }
130
131 uint32_t reg_split_addr = PERI1_RTCSLOW_ADDR_TO_CONF_REG(addr);
132
133 //prepare high & low permission mask
134 uint32_t permission_mask = 0;
135 if (lw) {
136 permission_mask |= DPORT_PMS_PRO_DPORT_RTCSLOW_L_W;
137 }
138 if (lr) {
139 permission_mask |= DPORT_PMS_PRO_DPORT_RTCSLOW_L_R;
140 }
141 if (hw) {
142 permission_mask |= DPORT_PMS_PRO_DPORT_RTCSLOW_H_W;
143 }
144 if (hr) {
145 permission_mask |= DPORT_PMS_PRO_DPORT_RTCSLOW_H_R;
146 }
147
148 //write PERIBUS1 RTC SLOW cfg register
149 DPORT_WRITE_PERI_REG(DPORT_PMS_PRO_DPORT_1_REG, reg_split_addr | permission_mask);
150
151 return MEMP_HAL_OK;
152 }
153
memprot_ll_peri1_rtcslow_get_split_sgnf_bits(bool * lw,bool * lr,bool * hw,bool * hr)154 static inline void memprot_ll_peri1_rtcslow_get_split_sgnf_bits(bool *lw, bool *lr, bool *hw, bool *hr)
155 {
156 *lw = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_DPORT_1_REG, DPORT_PMS_PRO_DPORT_RTCSLOW_L_W);
157 *lr = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_DPORT_1_REG, DPORT_PMS_PRO_DPORT_RTCSLOW_L_R);
158 *hw = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_DPORT_1_REG, DPORT_PMS_PRO_DPORT_RTCSLOW_H_W);
159 *hr = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_DPORT_1_REG, DPORT_PMS_PRO_DPORT_RTCSLOW_H_R);
160 }
161
memprot_ll_peri1_rtcslow_set_read_perm(bool lr,bool hr)162 static inline void memprot_ll_peri1_rtcslow_set_read_perm(bool lr, bool hr)
163 {
164 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_DPORT_1_REG, DPORT_PMS_PRO_DPORT_RTCSLOW_L_R, lr ? 1 : 0);
165 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_DPORT_1_REG, DPORT_PMS_PRO_DPORT_RTCSLOW_H_R, hr ? 1 : 0);
166 }
167
memprot_ll_peri1_rtcslow_set_write_perm(bool lw,bool hw)168 static inline void memprot_ll_peri1_rtcslow_set_write_perm(bool lw, bool hw)
169 {
170 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_DPORT_1_REG, DPORT_PMS_PRO_DPORT_RTCSLOW_L_W, lw ? 1 : 0);
171 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_DPORT_1_REG, DPORT_PMS_PRO_DPORT_RTCSLOW_H_W, hw ? 1 : 0);
172 }
173
memprot_ll_peri1_rtcslow_get_conf_reg(void)174 static inline uint32_t memprot_ll_peri1_rtcslow_get_conf_reg(void)
175 {
176 return DPORT_READ_PERI_REG(DPORT_PMS_PRO_DPORT_1_REG);
177 }
178
179 /**
180 * ========================================================================================
181 * === PeriBus2 common
182 * ========================================================================================
183 */
memprot_ll_peri2_clear_intr(void)184 static inline void memprot_ll_peri2_clear_intr(void)
185 {
186 DPORT_SET_PERI_REG_MASK(DPORT_PMS_PRO_AHB_3_REG, DPORT_PMS_PRO_AHB_ILG_CLR);
187 DPORT_CLEAR_PERI_REG_MASK(DPORT_PMS_PRO_AHB_3_REG, DPORT_PMS_PRO_AHB_ILG_CLR);
188 }
189
memprot_ll_peri2_get_intr_source_num(void)190 static inline uint32_t memprot_ll_peri2_get_intr_source_num(void)
191 {
192 return ETS_PMS_PRO_AHB_ILG_INTR_SOURCE;
193 }
194
memprot_ll_peri2_intr_ena(bool enable)195 static inline void memprot_ll_peri2_intr_ena(bool enable)
196 {
197 if (enable) {
198 DPORT_SET_PERI_REG_MASK(DPORT_PMS_PRO_AHB_3_REG, DPORT_PMS_PRO_AHB_ILG_EN);
199 } else {
200 DPORT_CLEAR_PERI_REG_MASK(DPORT_PMS_PRO_AHB_3_REG, DPORT_PMS_PRO_AHB_ILG_EN);
201 }
202 }
203
memprot_ll_peri2_get_ctrl_reg(void)204 static inline uint32_t memprot_ll_peri2_get_ctrl_reg(void)
205 {
206 return DPORT_READ_PERI_REG(DPORT_PMS_PRO_AHB_3_REG);
207 }
208
memprot_ll_peri2_get_fault_reg(void)209 static inline uint32_t memprot_ll_peri2_get_fault_reg(void)
210 {
211 return DPORT_READ_PERI_REG(DPORT_PMS_PRO_AHB_4_REG);
212 }
213
memprot_ll_peri2_get_fault_op_type(uint32_t * op_type,uint32_t * op_subtype)214 static inline void memprot_ll_peri2_get_fault_op_type(uint32_t *op_type, uint32_t *op_subtype)
215 {
216 uint32_t status_bits = memprot_ll_peri2_get_fault_reg();
217 *op_type = (uint32_t)status_bits & PERI2_INTR_ST_OP_RW_BIT;
218 *op_subtype = (uint32_t)status_bits & PERI2_INTR_ST_OP_TYPE_BIT;
219 }
220
memprot_ll_peri2_is_assoc_intr(void)221 static inline bool memprot_ll_peri2_is_assoc_intr(void)
222 {
223 return DPORT_GET_PERI_REG_MASK(DPORT_PMS_PRO_AHB_3_REG, DPORT_PMS_PRO_AHB_ILG_INTR) > 0;
224 }
225
memprot_ll_peri2_get_intr_ena_bit(void)226 static inline uint32_t memprot_ll_peri2_get_intr_ena_bit(void)
227 {
228 return DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_3_REG, DPORT_PMS_PRO_AHB_ILG_EN);
229 }
230
memprot_ll_peri2_get_intr_on_bit(void)231 static inline uint32_t memprot_ll_peri2_get_intr_on_bit(void)
232 {
233 return DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_3_REG, DPORT_PMS_PRO_AHB_ILG_INTR);
234 }
235
memprot_ll_peri2_get_intr_clr_bit(void)236 static inline uint32_t memprot_ll_peri2_get_intr_clr_bit(void)
237 {
238 return DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_3_REG, DPORT_PMS_PRO_AHB_ILG_CLR);
239 }
240
memprot_ll_peri2_get_lock_reg(void)241 static inline uint32_t memprot_ll_peri2_get_lock_reg(void)
242 {
243 return DPORT_READ_PERI_REG(DPORT_PMS_PRO_AHB_0_REG);
244 }
245
246 //resets automatically on CPU restart
memprot_ll_peri2_set_lock(void)247 static inline void memprot_ll_peri2_set_lock(void)
248 {
249 DPORT_WRITE_PERI_REG(DPORT_PMS_PRO_AHB_0_REG, DPORT_PMS_PRO_AHB_LOCK);
250 }
251
memprot_ll_peri2_get_lock_bit(void)252 static inline uint32_t memprot_ll_peri2_get_lock_bit(void)
253 {
254 return DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_0_REG, DPORT_PMS_PRO_AHB_LOCK);
255 }
256
memprot_ll_peri2_rtcslow_get_fault_address(void)257 static inline intptr_t memprot_ll_peri2_rtcslow_get_fault_address(void)
258 {
259 uint32_t status_bits = memprot_ll_peri2_get_fault_reg();
260 return (intptr_t)(status_bits & PERI2_INTR_ST_FAULTADDR_M);
261 }
262
263 /**
264 * ========================================================================================
265 * === PeriBus2 RTC SLOW 0 (AHB0)
266 * ========================================================================================
267 */
memprot_ll_peri2_rtcslow_0_is_intr_mine(void)268 static inline bool memprot_ll_peri2_rtcslow_0_is_intr_mine(void)
269 {
270 if (memprot_ll_peri2_is_assoc_intr()) {
271 uint32_t faulting_address = (uint32_t)memprot_ll_peri2_rtcslow_get_fault_address();
272 return faulting_address >= PERI2_RTCSLOW_0_ADDRESS_LOW && faulting_address <= PERI2_RTCSLOW_0_ADDRESS_HIGH;
273 }
274 return false;
275 }
276
memprot_ll_peri2_rtcslow_0_set_prot(uint32_t * split_addr,bool lw,bool lr,bool lx,bool hw,bool hr,bool hx)277 static inline memprot_hal_err_t memprot_ll_peri2_rtcslow_0_set_prot(uint32_t *split_addr, bool lw, bool lr, bool lx, bool hw, bool hr, bool hx)
278 {
279 uint32_t addr = (uint32_t)split_addr;
280
281 //check corresponding range fit & aligment to 32bit boundaries
282 if (addr < PERI2_RTCSLOW_0_ADDRESS_LOW || addr > PERI2_RTCSLOW_0_ADDRESS_HIGH) {
283 return MEMP_HAL_ERR_SPLIT_ADDR_INVALID;
284 }
285 if (addr % 0x4 != 0) {
286 return MEMP_HAL_ERR_SPLIT_ADDR_UNALIGNED;
287 }
288
289 uint32_t reg_split_addr = PERI2_RTCSLOW_0_ADDR_TO_CONF_REG(addr);
290
291 //prepare high & low permission mask
292 uint32_t permission_mask = 0;
293 if (lw) {
294 permission_mask |= DPORT_PMS_PRO_AHB_RTCSLOW_0_L_W;
295 }
296 if (lr) {
297 permission_mask |= DPORT_PMS_PRO_AHB_RTCSLOW_0_L_R;
298 }
299 if (lx) {
300 permission_mask |= DPORT_PMS_PRO_AHB_RTCSLOW_0_L_F;
301 }
302 if (hw) {
303 permission_mask |= DPORT_PMS_PRO_AHB_RTCSLOW_0_H_W;
304 }
305 if (hr) {
306 permission_mask |= DPORT_PMS_PRO_AHB_RTCSLOW_0_H_R;
307 }
308 if (hx) {
309 permission_mask |= DPORT_PMS_PRO_AHB_RTCSLOW_0_H_F;
310 }
311
312 //write PERIBUS1 RTC SLOW cfg register
313 DPORT_WRITE_PERI_REG(DPORT_PMS_PRO_AHB_1_REG, reg_split_addr | permission_mask);
314
315 return MEMP_HAL_OK;
316 }
317
memprot_ll_peri2_rtcslow_0_get_split_sgnf_bits(bool * lw,bool * lr,bool * lx,bool * hw,bool * hr,bool * hx)318 static inline void memprot_ll_peri2_rtcslow_0_get_split_sgnf_bits(bool *lw, bool *lr, bool *lx, bool *hw, bool *hr, bool *hx)
319 {
320 *lw = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_1_REG, DPORT_PMS_PRO_AHB_RTCSLOW_0_L_W);
321 *lr = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_1_REG, DPORT_PMS_PRO_AHB_RTCSLOW_0_L_R);
322 *lx = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_1_REG, DPORT_PMS_PRO_AHB_RTCSLOW_0_L_F);
323 *hw = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_1_REG, DPORT_PMS_PRO_AHB_RTCSLOW_0_H_W);
324 *hr = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_1_REG, DPORT_PMS_PRO_AHB_RTCSLOW_0_H_R);
325 *hx = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_1_REG, DPORT_PMS_PRO_AHB_RTCSLOW_0_H_F);
326 }
327
memprot_ll_peri2_rtcslow_0_set_read_perm(bool lr,bool hr)328 static inline void memprot_ll_peri2_rtcslow_0_set_read_perm(bool lr, bool hr)
329 {
330 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_AHB_1_REG, DPORT_PMS_PRO_AHB_RTCSLOW_0_L_R, lr ? 1 : 0);
331 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_AHB_1_REG, DPORT_PMS_PRO_AHB_RTCSLOW_0_H_R, hr ? 1 : 0);
332 }
333
memprot_ll_peri2_rtcslow_0_set_write_perm(bool lw,bool hw)334 static inline void memprot_ll_peri2_rtcslow_0_set_write_perm(bool lw, bool hw)
335 {
336 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_AHB_1_REG, DPORT_PMS_PRO_AHB_RTCSLOW_0_L_W, lw ? 1 : 0);
337 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_AHB_1_REG, DPORT_PMS_PRO_AHB_RTCSLOW_0_H_W, hw ? 1 : 0);
338 }
339
memprot_ll_peri2_rtcslow_0_set_exec_perm(bool lx,bool hx)340 static inline void memprot_ll_peri2_rtcslow_0_set_exec_perm(bool lx, bool hx)
341 {
342 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_AHB_1_REG, DPORT_PMS_PRO_AHB_RTCSLOW_0_L_F, lx ? 1 : 0);
343 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_AHB_1_REG, DPORT_PMS_PRO_AHB_RTCSLOW_0_H_F, hx ? 1 : 0);
344 }
345
memprot_ll_peri2_rtcslow_0_get_conf_reg(void)346 static inline uint32_t memprot_ll_peri2_rtcslow_0_get_conf_reg(void)
347 {
348 return DPORT_READ_PERI_REG(DPORT_PMS_PRO_DPORT_1_REG);
349 }
350
351 /**
352 * ========================================================================================
353 * === PeriBus2 RTC SLOW 1 (AHB1)
354 * ========================================================================================
355 */
memprot_ll_peri2_rtcslow_1_is_intr_mine(void)356 static inline bool memprot_ll_peri2_rtcslow_1_is_intr_mine(void)
357 {
358 if (memprot_ll_peri2_is_assoc_intr()) {
359 uint32_t faulting_address = (uint32_t)memprot_ll_peri2_rtcslow_get_fault_address();
360 return faulting_address >= PERI2_RTCSLOW_1_ADDRESS_LOW && faulting_address <= PERI2_RTCSLOW_1_ADDRESS_HIGH;
361 }
362 return false;
363 }
364
memprot_ll_peri2_rtcslow_1_set_prot(uint32_t * split_addr,bool lw,bool lr,bool lx,bool hw,bool hr,bool hx)365 static inline memprot_hal_err_t memprot_ll_peri2_rtcslow_1_set_prot(uint32_t *split_addr, bool lw, bool lr, bool lx, bool hw, bool hr, bool hx)
366 {
367 uint32_t addr = (uint32_t)split_addr;
368
369 //check corresponding range fit & aligment to 32bit boundaries
370 if (addr < PERI2_RTCSLOW_1_ADDRESS_LOW || addr > PERI2_RTCSLOW_1_ADDRESS_HIGH) {
371 return MEMP_HAL_ERR_SPLIT_ADDR_INVALID;
372 }
373 if (addr % 0x4 != 0) {
374 return MEMP_HAL_ERR_SPLIT_ADDR_UNALIGNED;
375 }
376
377 uint32_t reg_split_addr = PERI2_RTCSLOW_1_ADDR_TO_CONF_REG(addr);
378
379 //prepare high & low permission mask
380 uint32_t permission_mask = 0;
381 if (lw) {
382 permission_mask |= DPORT_PMS_PRO_AHB_RTCSLOW_1_L_W;
383 }
384 if (lr) {
385 permission_mask |= DPORT_PMS_PRO_AHB_RTCSLOW_1_L_R;
386 }
387 if (lx) {
388 permission_mask |= DPORT_PMS_PRO_AHB_RTCSLOW_1_L_F;
389 }
390 if (hw) {
391 permission_mask |= DPORT_PMS_PRO_AHB_RTCSLOW_1_H_W;
392 }
393 if (hr) {
394 permission_mask |= DPORT_PMS_PRO_AHB_RTCSLOW_1_H_R;
395 }
396 if (hx) {
397 permission_mask |= DPORT_PMS_PRO_AHB_RTCSLOW_1_H_F;
398 }
399
400 //write PERIBUS1 RTC SLOW cfg register
401 DPORT_WRITE_PERI_REG(DPORT_PMS_PRO_AHB_2_REG, reg_split_addr | permission_mask);
402
403 return MEMP_HAL_OK;
404 }
405
memprot_ll_peri2_rtcslow_1_get_split_sgnf_bits(bool * lw,bool * lr,bool * lx,bool * hw,bool * hr,bool * hx)406 static inline void memprot_ll_peri2_rtcslow_1_get_split_sgnf_bits(bool *lw, bool *lr, bool *lx, bool *hw, bool *hr, bool *hx)
407 {
408 *lw = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_2_REG, DPORT_PMS_PRO_AHB_RTCSLOW_1_L_W);
409 *lr = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_2_REG, DPORT_PMS_PRO_AHB_RTCSLOW_1_L_R);
410 *lx = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_2_REG, DPORT_PMS_PRO_AHB_RTCSLOW_1_L_F);
411 *hw = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_2_REG, DPORT_PMS_PRO_AHB_RTCSLOW_1_H_W);
412 *hr = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_2_REG, DPORT_PMS_PRO_AHB_RTCSLOW_1_H_R);
413 *hx = DPORT_REG_GET_FIELD(DPORT_PMS_PRO_AHB_2_REG, DPORT_PMS_PRO_AHB_RTCSLOW_1_H_F);
414 }
415
memprot_ll_peri2_rtcslow_1_set_read_perm(bool lr,bool hr)416 static inline void memprot_ll_peri2_rtcslow_1_set_read_perm(bool lr, bool hr)
417 {
418 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_AHB_2_REG, DPORT_PMS_PRO_AHB_RTCSLOW_1_L_R, lr ? 1 : 0);
419 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_AHB_2_REG, DPORT_PMS_PRO_AHB_RTCSLOW_1_H_R, hr ? 1 : 0);
420 }
421
memprot_ll_peri2_rtcslow_1_set_write_perm(bool lw,bool hw)422 static inline void memprot_ll_peri2_rtcslow_1_set_write_perm(bool lw, bool hw)
423 {
424 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_AHB_2_REG, DPORT_PMS_PRO_AHB_RTCSLOW_1_L_W, lw ? 1 : 0);
425 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_AHB_2_REG, DPORT_PMS_PRO_AHB_RTCSLOW_1_H_W, hw ? 1 : 0);
426 }
427
memprot_ll_peri2_rtcslow_1_set_exec_perm(bool lx,bool hx)428 static inline void memprot_ll_peri2_rtcslow_1_set_exec_perm(bool lx, bool hx)
429 {
430 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_AHB_2_REG, DPORT_PMS_PRO_AHB_RTCSLOW_1_L_F, lx ? 1 : 0);
431 DPORT_REG_SET_FIELD(DPORT_PMS_PRO_AHB_2_REG, DPORT_PMS_PRO_AHB_RTCSLOW_1_H_F, hx ? 1 : 0);
432 }
433
memprot_ll_peri2_rtcslow_1_get_conf_reg(void)434 static inline uint32_t memprot_ll_peri2_rtcslow_1_get_conf_reg(void)
435 {
436 return DPORT_READ_PERI_REG(DPORT_PMS_PRO_DPORT_2_REG);
437 }
438
439 #ifdef __cplusplus
440 }
441 #endif
442