1 /*
2 * Copyright 2020-2021,2023 NXP
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8 #include "fsl_iee_apc.h"
9
10 /*******************************************************************************
11 * Definitions
12 ******************************************************************************/
13
14 /* Component ID definition, used by tools. */
15 #ifndef FSL_COMPONENT_ID
16 #define FSL_COMPONENT_ID "platform.drivers.iee_apc"
17 #endif
18
19 #define IOMUXC_LPSR_GPR_APC_ADDR_MASK 0xFFFFFFF8U
20
21 /*******************************************************************************
22 * Code
23 ******************************************************************************/
24
25 /*!
26 * brief Enable the APC IEE Region setting.
27 *
28 * This function enables IOMUXC LPSR GPR and APC IEE for setting the region.
29 *
30 * param base APC IEE peripheral address.
31 */
IEE_APC_GlobalEnable(IEE_APC_Type * base)32 void IEE_APC_GlobalEnable(IEE_APC_Type *base)
33 {
34 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
35 /* APC_x bits in GPR2 to GPR25 only take effect when this bit is set high */
36 IOMUXC_LPSR_GPR->GPR25 |= IOMUXC_LPSR_GPR_GPR25_APC_VALID_MASK;
37 __DSB();
38 #else
39 for(uint32_t i = (uint32_t)kIEE_APC_Region0; i <= (uint32_t)kIEE_APC_Region7; i++)
40 {
41 IEE_APC_RegionEnable(base, (iee_apc_region_t)i);
42 }
43 #endif
44 return;
45 }
46
47 /*!
48 * brief Disables the APC IEE Region setting.
49 *
50 * This function disables IOMUXC LPSR GPR and APC IEE for setting the region.
51 *
52 * param base APC IEE peripheral address.
53 */
IEE_APC_GlobalDisable(IEE_APC_Type * base)54 void IEE_APC_GlobalDisable(IEE_APC_Type *base)
55 {
56 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
57 /* APC_x bits in GPR2 to GPR25 only take effect when this bit is set high */
58 IOMUXC_LPSR_GPR->GPR25 &= ~IOMUXC_LPSR_GPR_GPR25_APC_VALID_MASK;
59 __DSB();
60 return;
61 #else
62 for(uint32_t i = (uint32_t)kIEE_APC_Region0; i <= (uint32_t)kIEE_APC_Region7; i++)
63 {
64 IEE_APC_RegionDisable(base, (iee_apc_region_t)i);
65 }
66 #endif
67 }
68
69 /*!
70 * brief Sets the APC IEE Memory Region setting.
71 *
72 * This function configure IOMUXC LPSR GPR and APC IEE for the encryption region.
73 *
74 * param base APC IEE peripheral address.
75 * param region Selection of the APC IEE region to be configured.
76 * param startAddr Start encryption adress for the selected APC IEE region.
77 * param endAddr End encryption adress for the selected APC IEE region.
78 */
IEE_APC_SetRegionConfig(IEE_APC_Type * base,iee_apc_region_t region,uint32_t startAddr,uint32_t endAddr)79 status_t IEE_APC_SetRegionConfig(IEE_APC_Type *base, iee_apc_region_t region, uint32_t startAddr, uint32_t endAddr)
80 {
81 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
82 /* bit[2:0] of adress must be zero
83 *
84 * Note: For i.MXRT1170, region is [bot:top), the end is open interval. So the bit[2:0] of the end address must
85 * be zero.
86 * Note: from design's aspect, 'top' means the top of the space, the higher address which is the end
87 * address.
88 */
89 if ((startAddr & (~IOMUXC_LPSR_GPR_GPR3_APC_AC_R0_TOP_MASK)) != 0U ||
90 (endAddr & (~IOMUXC_LPSR_GPR_GPR2_APC_AC_R0_BOT_MASK)) != 0U)
91 {
92 return kStatus_InvalidArgument;
93 }
94 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) */
95
96 if (region == kIEE_APC_Region0)
97 {
98 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
99 IOMUXC_LPSR_GPR->GPR2 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
100 IOMUXC_LPSR_GPR->GPR3 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
101
102 base->REGION0_BOT_ADDR = startAddr >> 3u;
103 base->REGION0_TOP_ADDR = endAddr >> 3u;
104 #else
105 base->REGION0_BOT_ADDR = startAddr;
106 base->REGION0_TOP_ADDR = endAddr;
107 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) */
108 }
109 if (region == kIEE_APC_Region1)
110 {
111 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
112 IOMUXC_LPSR_GPR->GPR4 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
113 IOMUXC_LPSR_GPR->GPR5 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
114 base->REGION1_BOT_ADDR = startAddr >> 3u;
115 base->REGION1_TOP_ADDR = endAddr >> 3u;
116 #else
117 base->REGION1_BOT_ADDR = startAddr;
118 base->REGION1_TOP_ADDR = endAddr;
119 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) */
120 }
121 if (region == kIEE_APC_Region2)
122 {
123 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
124 IOMUXC_LPSR_GPR->GPR6 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
125 IOMUXC_LPSR_GPR->GPR7 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
126 base->REGION2_BOT_ADDR = startAddr >> 3;
127 base->REGION2_TOP_ADDR = endAddr >> 3;
128 #else
129 base->REGION2_BOT_ADDR = startAddr;
130 base->REGION2_TOP_ADDR = endAddr;
131 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) */
132 }
133 if (region == kIEE_APC_Region3)
134 {
135 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
136 IOMUXC_LPSR_GPR->GPR8 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
137 IOMUXC_LPSR_GPR->GPR9 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
138 base->REGION3_BOT_ADDR = startAddr >> 3;
139 base->REGION3_TOP_ADDR = endAddr >> 3;
140 #else
141 base->REGION3_BOT_ADDR = startAddr;
142 base->REGION3_TOP_ADDR = endAddr;
143 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) */
144 }
145 if (region == kIEE_APC_Region4)
146 {
147 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
148 IOMUXC_LPSR_GPR->GPR10 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
149 IOMUXC_LPSR_GPR->GPR11 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
150 base->REGION4_BOT_ADDR = startAddr >> 3;
151 base->REGION4_TOP_ADDR = endAddr >> 3;
152 #else
153 base->REGION4_BOT_ADDR = startAddr;
154 base->REGION4_TOP_ADDR = endAddr;
155 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) */
156 }
157 if (region == kIEE_APC_Region5)
158 {
159 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
160 IOMUXC_LPSR_GPR->GPR12 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
161 IOMUXC_LPSR_GPR->GPR13 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
162 base->REGION5_BOT_ADDR = startAddr >> 3;
163 base->REGION5_TOP_ADDR = endAddr >> 3;
164 #else
165 base->REGION5_BOT_ADDR = startAddr;
166 base->REGION5_TOP_ADDR = endAddr;
167 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) */
168 }
169 if (region == kIEE_APC_Region6)
170 {
171 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
172 IOMUXC_LPSR_GPR->GPR14 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
173 IOMUXC_LPSR_GPR->GPR15 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
174 base->REGION6_BOT_ADDR = startAddr >> 3;
175 base->REGION6_TOP_ADDR = endAddr >> 3;
176 #else
177 base->REGION6_BOT_ADDR = startAddr;
178 base->REGION6_TOP_ADDR = endAddr;
179 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) */
180 }
181 if (region == kIEE_APC_Region7)
182 {
183 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
184 IOMUXC_LPSR_GPR->GPR16 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
185 IOMUXC_LPSR_GPR->GPR17 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
186 base->REGION7_BOT_ADDR = startAddr >> 3;
187 base->REGION7_TOP_ADDR = endAddr >> 3;
188 #else
189 base->REGION7_BOT_ADDR = startAddr;
190 base->REGION7_TOP_ADDR = endAddr;
191 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) */
192 }
193
194 return kStatus_Success;
195 }
196
197 #if !(defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u))
198 /*!
199 * brief Lock the LPSR GPR and APC IEE configuration.
200 *
201 * This function locks writting to IOMUXC LPSR GPR and APC IEE encryption region setting registers.
202 * Only system reset can clear the LPSR GPR and APC IEE-RDC_D0/1 Lock bit
203 *
204 * param base APC IEE peripheral address.
205 * param region Selection of the APC IEE region to be locked.
206 * param domain Domain ID to access the IEE APC registers of this region. The ID is drivn by TRDC.
207 */
IEE_APC_LockRegionConfig(IEE_APC_Type * base,iee_apc_region_t region,uint8_t domain)208 status_t IEE_APC_LockRegionConfig(IEE_APC_Type *base, iee_apc_region_t region, uint8_t domain)
209 {
210 uint32_t didVal = 0u;
211
212 if (region == kIEE_APC_Region0)
213 {
214 /* Set allowed domain ID to access the IEE APC registers of this region. */
215 didVal = base->REGION0_ACC_CTL ;
216 /* Clear ALLOW_DID */
217 didVal = didVal & (~IEE_APC_REGION0_ACC_CTL_ALLOW_DID_MASK);
218 /* Set new acces control value */
219 base->REGION0_ACC_CTL = didVal | IEE_APC_REGION0_ACC_CTL_ALLOW_DID(domain);
220
221 /* Once this bit is set, the value of the lower half word can't be changed
222 * until next system reset. The access check against domain ID will only
223 * take effect once this bit is set. */
224 base->REGION0_ACC_CTL |= IEE_APC_REGION0_ACC_CTL_LOCK_L_MASK;
225 base->REGION0_ACC_CTL |= IEE_APC_REGION0_ACC_CTL_LOCK_H_MASK;
226 }
227 if (region == kIEE_APC_Region1)
228 {
229 /* Set allowed domain ID to access the IEE APC registers of this region. */
230 didVal = base->REGION1_ACC_CTL ;
231 didVal = didVal & (~IEE_APC_REGION1_ACC_CTL_ALLOW_DID_MASK);
232 base->REGION1_ACC_CTL = didVal | IEE_APC_REGION1_ACC_CTL_ALLOW_DID(domain);
233
234 base->REGION1_ACC_CTL |= IEE_APC_REGION1_ACC_CTL_LOCK_L_MASK;
235 base->REGION1_ACC_CTL |= IEE_APC_REGION1_ACC_CTL_LOCK_H_MASK;
236 }
237 if (region == kIEE_APC_Region2)
238 {
239 /* Set allowed domain ID to access the IEE APC registers of this region. */
240 didVal = base->REGION2_ACC_CTL ;
241 didVal = didVal & (~IEE_APC_REGION2_ACC_CTL_ALLOW_DID_MASK);
242 base->REGION2_ACC_CTL = didVal | IEE_APC_REGION2_ACC_CTL_ALLOW_DID(domain);
243
244 base->REGION2_ACC_CTL |= IEE_APC_REGION2_ACC_CTL_LOCK_L_MASK;
245 base->REGION2_ACC_CTL |= IEE_APC_REGION2_ACC_CTL_LOCK_H_MASK;
246 }
247 if (region == kIEE_APC_Region3)
248 {
249 /* Set allowed domain ID to access the IEE APC registers of this region. */
250 didVal = base->REGION3_ACC_CTL ;
251 didVal = didVal & (~IEE_APC_REGION3_ACC_CTL_ALLOW_DID_MASK);
252 base->REGION3_ACC_CTL = didVal | IEE_APC_REGION3_ACC_CTL_ALLOW_DID(domain);
253
254 base->REGION3_ACC_CTL |= IEE_APC_REGION3_ACC_CTL_LOCK_L_MASK;
255 base->REGION3_ACC_CTL |= IEE_APC_REGION3_ACC_CTL_LOCK_H_MASK;
256 }
257 if (region == kIEE_APC_Region4)
258 {
259 /* Set allowed domain ID to access the IEE APC registers of this region. */
260 didVal = base->REGION4_ACC_CTL ;
261 didVal = didVal & (~IEE_APC_REGION4_ACC_CTL_ALLOW_DID_MASK);
262 base->REGION4_ACC_CTL = didVal | IEE_APC_REGION4_ACC_CTL_ALLOW_DID(domain);
263
264
265 base->REGION4_ACC_CTL |= IEE_APC_REGION4_ACC_CTL_LOCK_L_MASK;
266 base->REGION4_ACC_CTL |= IEE_APC_REGION4_ACC_CTL_LOCK_H_MASK;
267 }
268 if (region == kIEE_APC_Region5)
269 {
270 /* Set allowed domain ID to access the IEE APC registers of this region. */
271 didVal = base->REGION5_ACC_CTL ;
272 didVal = didVal & (~IEE_APC_REGION5_ACC_CTL_ALLOW_DID_MASK);
273 base->REGION5_ACC_CTL = didVal | IEE_APC_REGION5_ACC_CTL_ALLOW_DID(domain);
274
275 base->REGION5_ACC_CTL |= IEE_APC_REGION5_ACC_CTL_LOCK_L_MASK;
276 base->REGION5_ACC_CTL |= IEE_APC_REGION5_ACC_CTL_LOCK_H_MASK;
277 }
278 if (region == kIEE_APC_Region6)
279 {
280 /* Set allowed domain ID to access the IEE APC registers of this region. */
281 didVal = base->REGION6_ACC_CTL ;
282 didVal = didVal & (~IEE_APC_REGION6_ACC_CTL_ALLOW_DID_MASK);
283 base->REGION6_ACC_CTL = didVal | IEE_APC_REGION6_ACC_CTL_ALLOW_DID(domain);
284
285 base->REGION6_ACC_CTL |= IEE_APC_REGION6_ACC_CTL_LOCK_L_MASK;
286 base->REGION6_ACC_CTL |= IEE_APC_REGION6_ACC_CTL_LOCK_H_MASK;
287 }
288 if (region == kIEE_APC_Region7)
289 {
290 /* Set allowed domain ID to access the IEE APC registers of this region. */
291 didVal = base->REGION7_ACC_CTL ;
292 didVal = didVal & (~IEE_APC_REGION7_ACC_CTL_ALLOW_DID_MASK);
293 base->REGION7_ACC_CTL = didVal | IEE_APC_REGION7_ACC_CTL_ALLOW_DID(domain);
294
295 base->REGION7_ACC_CTL |= IEE_APC_REGION7_ACC_CTL_LOCK_L_MASK;
296 base->REGION7_ACC_CTL |= IEE_APC_REGION7_ACC_CTL_LOCK_H_MASK;
297 }
298
299 return kStatus_Success;
300 }
301 #endif /* !(defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)) */
302
303 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
304 /*!
305 * brief Lock the LPSR GPR and APC IEE configuration.
306 *
307 * This function locks writting to IOMUXC LPSR GPR and APC IEE encryption region setting registers.
308 * Only system reset can clear the LPSR GPR and APC IEE-RDC_D0/1 Lock bit
309 *
310 * param base APC IEE peripheral address.
311 * param region Selection of the APC IEE region to be locked.
312 * param domain Core domain ID
313 */
IEE_APC_LockRegionConfig(IEE_APC_Type * base,iee_apc_region_t region,iee_apc_domain_t domain)314 status_t IEE_APC_LockRegionConfig(IEE_APC_Type *base, iee_apc_region_t region, iee_apc_domain_t domain)
315 {
316 if (region == kIEE_APC_Region0)
317 {
318 /* Locks write into APC Region 0 BOT address */
319 IOMUXC_LPSR_GPR->GPR2 |= IOMUXC_LPSR_GPR_GPR2_LOCK(1);
320 /* Locks write into APC Region 0 TOP address */
321 IOMUXC_LPSR_GPR->GPR3 |= IOMUXC_LPSR_GPR_GPR3_LOCK(1);
322 /* Locks write into APC REGION 0 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
323 IOMUXC_LPSR_GPR->GPR18 |= IOMUXC_LPSR_GPR_GPR18_LOCK(1);
324
325 if (domain == kIEE_APC_Domain0)
326 {
327 base->REGION0_RDC_D0 |= IEE_APC_REGION0_RDC_D0_RDC_D0_WRITE_DIS_MASK;
328 base->REGION0_RDC_D0 |= IEE_APC_REGION0_RDC_D0_RDC_D0_LOCK_MASK;
329 }
330 else if (domain == kIEE_APC_Domain1)
331 {
332 base->REGION0_RDC_D1 |= IEE_APC_REGION0_RDC_D1_RDC_D1_WRITE_DIS_MASK;
333 base->REGION0_RDC_D1 |= IEE_APC_REGION0_RDC_D1_RDC_D1_LOCK_MASK;
334 }
335 else
336 {
337 /* Intentional empty */
338 }
339 }
340 if (region == kIEE_APC_Region1)
341 {
342 /* Locks write into APC Region 1 BOT address */
343 IOMUXC_LPSR_GPR->GPR4 |= IOMUXC_LPSR_GPR_GPR4_LOCK(1);
344 /* Locks write into APC Region 1 TOP address */
345 IOMUXC_LPSR_GPR->GPR5 |= IOMUXC_LPSR_GPR_GPR5_LOCK(1);
346 /* Locks write into APC REGION 1 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
347 IOMUXC_LPSR_GPR->GPR19 |= IOMUXC_LPSR_GPR_GPR19_LOCK(1);
348
349 if (domain == kIEE_APC_Domain0)
350 {
351 base->REGION1_RDC_D0 |= IEE_APC_REGION1_RDC_D0_RDC_D0_WRITE_DIS_MASK;
352 base->REGION1_RDC_D0 |= IEE_APC_REGION1_RDC_D0_RDC_D0_LOCK_MASK;
353 }
354 else if (domain == kIEE_APC_Domain1)
355 {
356 base->REGION1_RDC_D1 |= IEE_APC_REGION1_RDC_D1_RDC_D1_WRITE_DIS_MASK;
357 base->REGION1_RDC_D1 |= IEE_APC_REGION1_RDC_D1_RDC_D1_LOCK_MASK;
358 }
359 else
360 {
361 /* Intentional empty */
362 }
363 }
364 if (region == kIEE_APC_Region2)
365 {
366 /* Locks write into APC Region 2 BOT address */
367 IOMUXC_LPSR_GPR->GPR6 |= IOMUXC_LPSR_GPR_GPR6_LOCK(1);
368 /* Locks write into APC Region 2 TOP address */
369 IOMUXC_LPSR_GPR->GPR7 |= IOMUXC_LPSR_GPR_GPR7_LOCK(1);
370 /* Locks write into APC REGION 2 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
371 IOMUXC_LPSR_GPR->GPR20 |= IOMUXC_LPSR_GPR_GPR20_LOCK(1);
372
373 if (domain == kIEE_APC_Domain0)
374 {
375 base->REGION2_RDC_D0 |= IEE_APC_REGION2_RDC_D0_RDC_D0_WRITE_DIS_MASK;
376 base->REGION2_RDC_D0 |= IEE_APC_REGION2_RDC_D0_RDC_D0_LOCK_MASK;
377 }
378 else if (domain == kIEE_APC_Domain1)
379 {
380 base->REGION2_RDC_D1 |= IEE_APC_REGION2_RDC_D1_RDC_D1_WRITE_DIS_MASK;
381 base->REGION2_RDC_D1 |= IEE_APC_REGION2_RDC_D1_RDC_D1_LOCK_MASK;
382 }
383 else
384 {
385 /* Intentional empty */
386 }
387 }
388 if (region == kIEE_APC_Region3)
389 {
390 /* Locks write into APC Region 3 BOT address */
391 IOMUXC_LPSR_GPR->GPR8 |= IOMUXC_LPSR_GPR_GPR8_LOCK(1);
392 /* Locks write into APC Region 3 TOP address */
393 IOMUXC_LPSR_GPR->GPR9 |= IOMUXC_LPSR_GPR_GPR9_LOCK(1);
394 /* Locks write into APC REGION 3 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
395 IOMUXC_LPSR_GPR->GPR21 |= IOMUXC_LPSR_GPR_GPR21_LOCK(1);
396
397 if (domain == kIEE_APC_Domain0)
398 {
399 base->REGION3_RDC_D0 |= IEE_APC_REGION3_RDC_D0_RDC_D0_WRITE_DIS_MASK;
400 base->REGION3_RDC_D0 |= IEE_APC_REGION3_RDC_D0_RDC_D0_LOCK_MASK;
401 }
402 else if (domain == kIEE_APC_Domain1)
403 {
404 base->REGION3_RDC_D1 |= IEE_APC_REGION3_RDC_D1_RDC_D1_WRITE_DIS_MASK;
405 base->REGION3_RDC_D1 |= IEE_APC_REGION3_RDC_D1_RDC_D1_LOCK_MASK;
406 }
407 else
408 {
409 /* Intentional empty */
410 }
411 }
412 if (region == kIEE_APC_Region4)
413 {
414 /* Locks write into APC Region 4 BOT address */
415 IOMUXC_LPSR_GPR->GPR10 |= IOMUXC_LPSR_GPR_GPR10_LOCK(1);
416 /* Locks write into APC Region 4 TOP address */
417 IOMUXC_LPSR_GPR->GPR11 |= IOMUXC_LPSR_GPR_GPR11_LOCK(1);
418 /* Locks write into APC REGION 4 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
419 IOMUXC_LPSR_GPR->GPR22 |= IOMUXC_LPSR_GPR_GPR22_LOCK(1);
420
421 if (domain == kIEE_APC_Domain0)
422 {
423 base->REGION4_RDC_D0 |= IEE_APC_REGION4_RDC_D0_RDC_D0_WRITE_DIS_MASK;
424 base->REGION4_RDC_D0 |= IEE_APC_REGION4_RDC_D0_RDC_D0_LOCK_MASK;
425 }
426 else if (domain == kIEE_APC_Domain1)
427 {
428 base->REGION4_RDC_D1 |= IEE_APC_REGION4_RDC_D1_RDC_D1_WRITE_DIS_MASK;
429 base->REGION4_RDC_D1 |= IEE_APC_REGION4_RDC_D1_RDC_D1_LOCK_MASK;
430 }
431 else
432 {
433 /* Intentional empty */
434 }
435 }
436 if (region == kIEE_APC_Region5)
437 {
438 /* Locks write into APC Region 5 BOT address */
439 IOMUXC_LPSR_GPR->GPR12 |= IOMUXC_LPSR_GPR_GPR12_LOCK(1);
440 /* Locks write into APC Region 5 TOP address */
441 IOMUXC_LPSR_GPR->GPR13 |= IOMUXC_LPSR_GPR_GPR13_LOCK(1);
442 /* Locks write into APC REGION 5 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
443 IOMUXC_LPSR_GPR->GPR23 |= IOMUXC_LPSR_GPR_GPR23_LOCK(1);
444
445 if (domain == kIEE_APC_Domain0)
446 {
447 base->REGION5_RDC_D0 |= IEE_APC_REGION5_RDC_D0_RDC_D0_WRITE_DIS_MASK;
448 base->REGION5_RDC_D0 |= IEE_APC_REGION5_RDC_D0_RDC_D0_LOCK_MASK;
449 }
450 else if (domain == kIEE_APC_Domain1)
451 {
452 base->REGION5_RDC_D1 |= IEE_APC_REGION5_RDC_D1_RDC_D1_WRITE_DIS_MASK;
453 base->REGION5_RDC_D1 |= IEE_APC_REGION5_RDC_D1_RDC_D1_LOCK_MASK;
454 }
455 else
456 {
457 /* Intentional empty */
458 }
459 }
460 if (region == kIEE_APC_Region6)
461 {
462 /* Locks write into APC Region 6 BOT address */
463 IOMUXC_LPSR_GPR->GPR14 |= IOMUXC_LPSR_GPR_GPR14_LOCK(1);
464 /* Locks write into APC Region 6 TOP address */
465 IOMUXC_LPSR_GPR->GPR15 |= IOMUXC_LPSR_GPR_GPR15_LOCK(1);
466 /* Locks write into APC REGION 6 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
467 IOMUXC_LPSR_GPR->GPR24 |= IOMUXC_LPSR_GPR_GPR24_LOCK(1);
468
469 if (domain == kIEE_APC_Domain0)
470 {
471 base->REGION6_RDC_D0 |= IEE_APC_REGION6_RDC_D0_RDC_D0_WRITE_DIS_MASK;
472 base->REGION6_RDC_D0 |= IEE_APC_REGION6_RDC_D0_RDC_D0_LOCK_MASK;
473 }
474 else if (domain == kIEE_APC_Domain1)
475 {
476 base->REGION6_RDC_D1 |= IEE_APC_REGION6_RDC_D1_RDC_D1_WRITE_DIS_MASK;
477 base->REGION6_RDC_D1 |= IEE_APC_REGION6_RDC_D1_RDC_D1_LOCK_MASK;
478 }
479 else
480 {
481 /* Intentional empty */
482 }
483 }
484 if (region == kIEE_APC_Region7)
485 {
486 /* Locks write into APC Region 7 BOT address */
487 IOMUXC_LPSR_GPR->GPR16 |= IOMUXC_LPSR_GPR_GPR15_LOCK(1);
488 /* Locks write into APC Region 7 TOP address */
489 IOMUXC_LPSR_GPR->GPR17 |= IOMUXC_LPSR_GPR_GPR16_LOCK(1);
490 /* Locks write into APC REGION 7 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
491 IOMUXC_LPSR_GPR->GPR25 |= IOMUXC_LPSR_GPR_GPR25_LOCK(1);
492
493 if (domain == kIEE_APC_Domain0)
494 {
495 base->REGION7_RDC_D0 |= IEE_APC_REGION7_RDC_D0_RDC_D0_WRITE_DIS_MASK;
496 base->REGION7_RDC_D0 |= IEE_APC_REGION7_RDC_D0_RDC_D0_LOCK_MASK;
497 }
498 else if (domain == kIEE_APC_Domain1)
499 {
500 base->REGION7_RDC_D1 |= IEE_APC_REGION7_RDC_D1_RDC_D1_WRITE_DIS_MASK;
501 base->REGION7_RDC_D1 |= IEE_APC_REGION7_RDC_D1_RDC_D1_LOCK_MASK;
502 }
503 else
504 {
505 /* Intentional empty */
506 }
507 }
508
509 return kStatus_Success;
510 }
511 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u) */
512
513 #if !(defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u))
514 /*!
515 * brief Set access control of the APC IEE.
516 *
517 * This function configure APC IEE encryption region access control settings.
518 *
519 * param base APC IEE peripheral address.
520 * param region Selection of the APC IEE region to be locked.
521 * param allowNonSecure Allow nonsecure mode access
522 * param allowUser Allow user mode access
523 */
IEE_APC_SetAccessControl(IEE_APC_Type * base,iee_apc_region_t region,bool allowNonSecure,bool allowUser)524 status_t IEE_APC_SetAccessControl(IEE_APC_Type *base, iee_apc_region_t region, bool allowNonSecure, bool allowUser)
525 {
526 uint32_t allowCltVal = 0u;
527
528 if (region == kIEE_APC_Region0)
529 {
530 /* Set allowed domain ID to access the IEE APC registers of this region. */
531 allowCltVal = base->REGION0_ACC_CTL;
532 /* Clear allow user and ns */
533 allowCltVal = allowCltVal & (~IEE_APC_REGION0_ACC_CTL_ALLOW_NS_MASK);
534 allowCltVal = allowCltVal & (~IEE_APC_REGION0_ACC_CTL_ALLOW_USER_MASK);
535 /* Set new acces control value */
536 base->REGION0_ACC_CTL = allowCltVal | IEE_APC_REGION0_ACC_CTL_ALLOW_NS(allowNonSecure) |
537 IEE_APC_REGION0_ACC_CTL_ALLOW_USER(allowUser);
538
539 }
540 if (region == kIEE_APC_Region1)
541 {
542 /* Set allowed domain ID to access the IEE APC registers of this region. */
543 allowCltVal = base->REGION1_ACC_CTL;
544 /* Clear allow user and ns */
545 allowCltVal = allowCltVal & (~IEE_APC_REGION1_ACC_CTL_ALLOW_NS_MASK);
546 allowCltVal = allowCltVal & (~IEE_APC_REGION1_ACC_CTL_ALLOW_USER_MASK);
547 /* Set new acces control value */
548 base->REGION1_ACC_CTL = allowCltVal | IEE_APC_REGION1_ACC_CTL_ALLOW_NS(allowNonSecure) |
549 IEE_APC_REGION1_ACC_CTL_ALLOW_USER(allowUser);
550 }
551 if (region == kIEE_APC_Region2)
552 {
553 /* Set allowed domain ID to access the IEE APC registers of this region. */
554 allowCltVal = base->REGION2_ACC_CTL;
555 /* Clear allow user and ns */
556 allowCltVal = allowCltVal & (~IEE_APC_REGION2_ACC_CTL_ALLOW_NS_MASK);
557 allowCltVal = allowCltVal & (~IEE_APC_REGION2_ACC_CTL_ALLOW_USER_MASK);
558 /* Set new acces control value */
559 base->REGION2_ACC_CTL = allowCltVal | IEE_APC_REGION2_ACC_CTL_ALLOW_NS(allowNonSecure) |
560 IEE_APC_REGION2_ACC_CTL_ALLOW_USER(allowUser);
561 }
562 if (region == kIEE_APC_Region3)
563 {
564 /* Set allowed domain ID to access the IEE APC registers of this region. */
565 allowCltVal = base->REGION3_ACC_CTL;
566 /* Clear allow user and ns */
567 allowCltVal = allowCltVal & (~IEE_APC_REGION3_ACC_CTL_ALLOW_NS_MASK);
568 allowCltVal = allowCltVal & (~IEE_APC_REGION3_ACC_CTL_ALLOW_USER_MASK);
569 /* Set new acces control value */
570 base->REGION3_ACC_CTL = allowCltVal | IEE_APC_REGION3_ACC_CTL_ALLOW_NS(allowNonSecure) |
571 IEE_APC_REGION3_ACC_CTL_ALLOW_USER(allowUser);
572 }
573 if (region == kIEE_APC_Region4)
574 {
575 /* Set allowed domain ID to access the IEE APC registers of this region. */
576 allowCltVal = base->REGION4_ACC_CTL;
577 /* Clear allow user and ns */
578 allowCltVal = allowCltVal & (~IEE_APC_REGION4_ACC_CTL_ALLOW_NS_MASK);
579 allowCltVal = allowCltVal & (~IEE_APC_REGION4_ACC_CTL_ALLOW_USER_MASK);
580 /* Set new acces control value */
581 base->REGION4_ACC_CTL = allowCltVal | IEE_APC_REGION4_ACC_CTL_ALLOW_NS(allowNonSecure) |
582 IEE_APC_REGION4_ACC_CTL_ALLOW_USER(allowUser);
583 }
584 if (region == kIEE_APC_Region5)
585 {
586 /* Set allowed domain ID to access the IEE APC registers of this region. */
587 allowCltVal = base->REGION5_ACC_CTL;
588 /* Clear allow user and ns */
589 allowCltVal = allowCltVal & (~IEE_APC_REGION5_ACC_CTL_ALLOW_NS_MASK);
590 allowCltVal = allowCltVal & (~IEE_APC_REGION5_ACC_CTL_ALLOW_USER_MASK);
591 /* Set new acces control value */
592 base->REGION5_ACC_CTL = allowCltVal | IEE_APC_REGION5_ACC_CTL_ALLOW_NS(allowNonSecure) |
593 IEE_APC_REGION5_ACC_CTL_ALLOW_USER(allowUser);
594 }
595 if (region == kIEE_APC_Region6)
596 {
597 /* Set allowed domain ID to access the IEE APC registers of this region. */
598 allowCltVal = base->REGION6_ACC_CTL;
599 /* Clear allow user and ns */
600 allowCltVal = allowCltVal & (~IEE_APC_REGION6_ACC_CTL_ALLOW_NS_MASK);
601 allowCltVal = allowCltVal & (~IEE_APC_REGION6_ACC_CTL_ALLOW_USER_MASK);
602 /* Set new acces control value */
603 base->REGION6_ACC_CTL = allowCltVal | IEE_APC_REGION6_ACC_CTL_ALLOW_NS(allowNonSecure) |
604 IEE_APC_REGION6_ACC_CTL_ALLOW_USER(allowUser);
605 }
606 if (region == kIEE_APC_Region7)
607 {
608 /* Set allowed domain ID to access the IEE APC registers of this region. */
609 allowCltVal = base->REGION6_ACC_CTL;
610 /* Clear allow user and ns */
611 allowCltVal = allowCltVal & (~IEE_APC_REGION6_ACC_CTL_ALLOW_NS_MASK);
612 allowCltVal = allowCltVal & (~IEE_APC_REGION6_ACC_CTL_ALLOW_USER_MASK);
613 /* Set new acces control value */
614 base->REGION6_ACC_CTL = allowCltVal | IEE_APC_REGION6_ACC_CTL_ALLOW_NS(allowNonSecure) |
615 IEE_APC_REGION6_ACC_CTL_ALLOW_USER(allowUser);
616 }
617 return kStatus_Success;
618 }
619 #endif /* !(defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)) */
620
621 /*!
622 * brief Enable the IEE encryption/decryption for specific region.
623 *
624 * This function enables encryption/decryption by writting to IOMUXC LPSR GPR.
625 *
626 * param base APC IEE peripheral address.
627 * param region Selection of the APC IEE region to be enabled.
628 */
IEE_APC_RegionEnable(IEE_APC_Type * base,iee_apc_region_t region)629 void IEE_APC_RegionEnable(IEE_APC_Type *base, iee_apc_region_t region)
630 {
631
632 if (region == kIEE_APC_Region0)
633 {
634 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
635 IOMUXC_LPSR_GPR->GPR18 |= IOMUXC_LPSR_GPR_GPR18_APC_R0_ENCRYPT_ENABLE_MASK;
636 #else
637 base->REGION0_ENA |= IEE_APC_REGION0_ENA_ENCRYPT_ENABLE_MASK;
638 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u) */
639 }
640 if (region == kIEE_APC_Region1)
641 {
642 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
643 IOMUXC_LPSR_GPR->GPR19 |= IOMUXC_LPSR_GPR_GPR19_APC_R1_ENCRYPT_ENABLE_MASK;
644 #else
645 base->REGION1_ENA |= IEE_APC_REGION1_ENA_ENCRYPT_ENABLE_MASK;
646 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u) */
647 }
648 if (region == kIEE_APC_Region2)
649 {
650 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
651 IOMUXC_LPSR_GPR->GPR20 |= IOMUXC_LPSR_GPR_GPR20_APC_R2_ENCRYPT_ENABLE_MASK;
652 #else
653 base->REGION2_ENA |= IEE_APC_REGION2_ENA_ENCRYPT_ENABLE_MASK;
654 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u) */
655 }
656 if (region == kIEE_APC_Region3)
657 {
658 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
659
660 IOMUXC_LPSR_GPR->GPR21 |= IOMUXC_LPSR_GPR_GPR21_APC_R3_ENCRYPT_ENABLE_MASK;
661 #else
662 base->REGION3_ENA |= IEE_APC_REGION3_ENA_ENCRYPT_ENABLE_MASK;
663 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u) */
664 }
665 if (region == kIEE_APC_Region4)
666 {
667 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
668 IOMUXC_LPSR_GPR->GPR22 |= IOMUXC_LPSR_GPR_GPR22_APC_R4_ENCRYPT_ENABLE_MASK;
669 #else
670 base->REGION4_ENA |= IEE_APC_REGION4_ENA_ENCRYPT_ENABLE_MASK;
671 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u) */
672 }
673 if (region == kIEE_APC_Region5)
674 {
675 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
676 IOMUXC_LPSR_GPR->GPR23 |= IOMUXC_LPSR_GPR_GPR23_APC_R5_ENCRYPT_ENABLE_MASK;
677 #else
678 base->REGION5_ENA |= IEE_APC_REGION5_ENA_ENCRYPT_ENABLE_MASK;
679 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u) */
680 }
681 if (region == kIEE_APC_Region6)
682 {
683 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
684 IOMUXC_LPSR_GPR->GPR24 |= IOMUXC_LPSR_GPR_GPR24_APC_R6_ENCRYPT_ENABLE_MASK;
685 #else
686 base->REGION6_ENA |= IEE_APC_REGION6_ENA_ENCRYPT_ENABLE_MASK;
687 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u) */
688 }
689 if (region == kIEE_APC_Region7)
690 {
691 #if defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)
692 IOMUXC_LPSR_GPR->GPR25 |= IOMUXC_LPSR_GPR_GPR25_APC_R7_ENCRYPT_ENABLE_MASK;
693 #else
694 base->REGION7_ENA |= IEE_APC_REGION7_ENA_ENCRYPT_ENABLE_MASK;
695 #endif /* defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u) */
696 }
697
698 return;
699 }
700
701 #if !(defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u))
702 /*!
703 * brief Disable the IEE encryption/decryption for specific region.
704 *
705 * This function disables encryption/decryption by writting to IOMUXC LPSR GPR.
706 *
707 * param base APC IEE peripheral address.
708 * param region Selection of the APC IEE region to be enabled.
709 */
IEE_APC_RegionDisable(IEE_APC_Type * base,iee_apc_region_t region)710 void IEE_APC_RegionDisable(IEE_APC_Type *base, iee_apc_region_t region)
711 {
712 if (region == kIEE_APC_Region0)
713 {
714 base->REGION0_ENA = 0u;
715 }
716 if (region == kIEE_APC_Region1)
717 {
718 base->REGION1_ENA = 0u;
719 }
720 if (region == kIEE_APC_Region2)
721 {
722 base->REGION2_ENA = 0u;
723 }
724 if (region == kIEE_APC_Region3)
725 {
726 base->REGION3_ENA = 0u;
727 }
728 if (region == kIEE_APC_Region4)
729 {
730 base->REGION4_ENA = 0u;
731 }
732 if (region == kIEE_APC_Region5)
733 {
734 base->REGION5_ENA = 0u;
735 }
736 if (region == kIEE_APC_Region6)
737 {
738 base->REGION6_ENA = 0u;
739 }
740 if (region == kIEE_APC_Region7)
741 {
742 base->REGION7_ENA = 0u;
743 }
744
745 return;
746 }
747 #endif /* !(defined(FSL_FEATURE_IEE_APC_USE_GPR) && (FSL_FEATURE_IEE_APC_USE_GPR > 0u)) */