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)) */