Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:22:59

0001 /*
0002  * Copyright 2020-2021, NXP
0003  * All rights reserved.
0004  *
0005  * SPDX-License-Identifier: BSD-3-Clause
0006  */
0007 
0008 #include "fsl_iee_apc.h"
0009 
0010 /*******************************************************************************
0011  * Definitions
0012  ******************************************************************************/
0013 
0014 /* Component ID definition, used by tools. */
0015 #ifndef FSL_COMPONENT_ID
0016 #define FSL_COMPONENT_ID "platform.drivers.iee_apc"
0017 #endif
0018 
0019 #define IOMUXC_LPSR_GPR_APC_ADDR_MASK 0xFFFFFFF8U
0020 
0021 /*******************************************************************************
0022  * Code
0023  ******************************************************************************/
0024 
0025 /*!
0026  * brief Enable the APC IEE Region setting.
0027  *
0028  * This function enables IOMUXC LPSR GPR and APC IEE for setting the region.
0029  *
0030  * param base APC IEE peripheral address.
0031  */
0032 void IEE_APC_GlobalEnable(IEE_APC_Type *base)
0033 {
0034     /* APC_x bits in GPR2 to GPR25 only take effect when this bit is set high */
0035     IOMUXC_LPSR_GPR->GPR25 |= IOMUXC_LPSR_GPR_GPR25_APC_VALID_MASK;
0036     __DSB();
0037     return;
0038 }
0039 
0040 /*!
0041  * brief Disables the APC IEE Region setting.
0042  *
0043  * This function disables IOMUXC LPSR GPR and APC IEE for setting the region.
0044  *
0045  * param base APC IEE peripheral address.
0046  */
0047 void IEE_APC_GlobalDisable(IEE_APC_Type *base)
0048 {
0049     /* APC_x bits in GPR2 to GPR25 only take effect when this bit is set high */
0050     IOMUXC_LPSR_GPR->GPR25 &= ~IOMUXC_LPSR_GPR_GPR25_APC_VALID_MASK;
0051     __DSB();
0052     return;
0053 }
0054 
0055 /*!
0056  * brief Sets the APC IEE Memory Region setting.
0057  *
0058  * This function configure IOMUXC LPSR GPR and APC IEE for the encryption region.
0059  *
0060  * param base APC IEE peripheral address.
0061  * param region Selection of the APC IEE region to be configured.
0062  * param startAddr Start encryption adress for the selected APC IEE region.
0063  * param endAddr End encryption adress for the selected APC IEE region.
0064  */
0065 status_t IEE_APC_SetRegionConfig(IEE_APC_Type *base, iee_apc_region_t region, uint32_t startAddr, uint32_t endAddr)
0066 {
0067     /* bit[2:0] of adress must be zero
0068      *
0069      * Note: For i.MXRT1170, region is [bot:top), the end is open interval. So the bit[2:0] of the end address must
0070      * be zero.
0071      * Note: from design's aspect, 'top' means the top of the space, the higher address which is the end
0072      * address.
0073      */
0074     if ((startAddr & (~IOMUXC_LPSR_GPR_GPR3_APC_AC_R0_TOP_MASK)) != 0U ||
0075         (endAddr & (~IOMUXC_LPSR_GPR_GPR2_APC_AC_R0_BOT_MASK)) != 0U)
0076     {
0077         return kStatus_InvalidArgument;
0078     }
0079 
0080     if (region == kIEE_APC_Region0)
0081     {
0082         IOMUXC_LPSR_GPR->GPR2 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0083         IOMUXC_LPSR_GPR->GPR3 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0084         IEE_APC->REGION0_BOT_ADDR = startAddr >> 3;
0085         IEE_APC->REGION0_TOP_ADDR = endAddr >> 3;
0086     }
0087     if (region == kIEE_APC_Region1)
0088     {
0089         IOMUXC_LPSR_GPR->GPR4 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0090         IOMUXC_LPSR_GPR->GPR5 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0091         IEE_APC->REGION1_BOT_ADDR = startAddr >> 3;
0092         IEE_APC->REGION1_TOP_ADDR = endAddr >> 3;
0093     }
0094     if (region == kIEE_APC_Region2)
0095     {
0096         IOMUXC_LPSR_GPR->GPR6 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0097         IOMUXC_LPSR_GPR->GPR7 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0098         IEE_APC->REGION2_BOT_ADDR = startAddr >> 3;
0099         IEE_APC->REGION2_TOP_ADDR = endAddr >> 3;
0100     }
0101     if (region == kIEE_APC_Region3)
0102     {
0103         IOMUXC_LPSR_GPR->GPR8 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0104         IOMUXC_LPSR_GPR->GPR9 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0105         IEE_APC->REGION3_BOT_ADDR = startAddr >> 3;
0106         IEE_APC->REGION3_TOP_ADDR = endAddr >> 3;
0107     }
0108     if (region == kIEE_APC_Region4)
0109     {
0110         IOMUXC_LPSR_GPR->GPR10 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0111         IOMUXC_LPSR_GPR->GPR11 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0112         IEE_APC->REGION4_BOT_ADDR = startAddr >> 3;
0113         IEE_APC->REGION4_TOP_ADDR = endAddr >> 3;
0114     }
0115     if (region == kIEE_APC_Region5)
0116     {
0117         IOMUXC_LPSR_GPR->GPR12 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0118         IOMUXC_LPSR_GPR->GPR13 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0119         IEE_APC->REGION5_BOT_ADDR = startAddr >> 3;
0120         IEE_APC->REGION5_TOP_ADDR = endAddr >> 3;
0121     }
0122     if (region == kIEE_APC_Region6)
0123     {
0124         IOMUXC_LPSR_GPR->GPR14 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0125         IOMUXC_LPSR_GPR->GPR15 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0126         IEE_APC->REGION6_BOT_ADDR = startAddr >> 3;
0127         IEE_APC->REGION6_TOP_ADDR = endAddr >> 3;
0128     }
0129     if (region == kIEE_APC_Region7)
0130     {
0131         IOMUXC_LPSR_GPR->GPR16 |= startAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0132         IOMUXC_LPSR_GPR->GPR17 |= endAddr & IOMUXC_LPSR_GPR_APC_ADDR_MASK;
0133         IEE_APC->REGION7_BOT_ADDR = startAddr >> 3;
0134         IEE_APC->REGION7_TOP_ADDR = endAddr >> 3;
0135     }
0136 
0137     return kStatus_Success;
0138 }
0139 
0140 /*!
0141  * brief Lock the LPSR GPR and APC IEE configuration.
0142  *
0143  * This function locks writting to IOMUXC LPSR GPR and APC IEE encryption region setting registers.
0144  * Only system reset can clear the LPSR GPR and APC IEE-RDC_D0/1 Lock bit
0145  *
0146  * param base APC IEE peripheral address.
0147  * param region Selection of the APC IEE region to be locked.
0148  */
0149 status_t IEE_APC_LockRegionConfig(IEE_APC_Type *base, iee_apc_region_t region, iee_apc_domain_t domain)
0150 {
0151     if (region == kIEE_APC_Region0)
0152     {
0153         /* Locks write into APC Region 0 BOT address */
0154         IOMUXC_LPSR_GPR->GPR2 |= IOMUXC_LPSR_GPR_GPR2_LOCK(1);
0155         /* Locks write into APC Region 0 TOP address */
0156         IOMUXC_LPSR_GPR->GPR3 |= IOMUXC_LPSR_GPR_GPR3_LOCK(1);
0157         /* Locks write into APC REGION 0 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
0158         IOMUXC_LPSR_GPR->GPR18 |= IOMUXC_LPSR_GPR_GPR18_LOCK(1);
0159 
0160         if (domain == kIEE_APC_Domain0)
0161         {
0162             IEE_APC->REGION0_RDC_D0 |= IEE_APC_REGION0_RDC_D0_RDC_D0_WRITE_DIS_MASK;
0163             IEE_APC->REGION0_RDC_D0 |= IEE_APC_REGION0_RDC_D0_RDC_D0_LOCK_MASK;
0164         }
0165         else if (domain == kIEE_APC_Domain1)
0166         {
0167             IEE_APC->REGION0_RDC_D1 |= IEE_APC_REGION0_RDC_D1_RDC_D1_WRITE_DIS_MASK;
0168             IEE_APC->REGION0_RDC_D1 |= IEE_APC_REGION0_RDC_D1_RDC_D1_LOCK_MASK;
0169         }
0170         else
0171         {
0172             /* Intentional empty */
0173         }
0174     }
0175     if (region == kIEE_APC_Region1)
0176     {
0177         /* Locks write into APC Region 1 BOT address */
0178         IOMUXC_LPSR_GPR->GPR4 |= IOMUXC_LPSR_GPR_GPR4_LOCK(1);
0179         /* Locks write into APC Region 1 TOP address */
0180         IOMUXC_LPSR_GPR->GPR5 |= IOMUXC_LPSR_GPR_GPR5_LOCK(1);
0181         /* Locks write into APC REGION 1 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
0182         IOMUXC_LPSR_GPR->GPR19 |= IOMUXC_LPSR_GPR_GPR19_LOCK(1);
0183 
0184         if (domain == kIEE_APC_Domain0)
0185         {
0186             IEE_APC->REGION1_RDC_D0 |= IEE_APC_REGION1_RDC_D0_RDC_D0_WRITE_DIS_MASK;
0187             IEE_APC->REGION1_RDC_D0 |= IEE_APC_REGION1_RDC_D0_RDC_D0_LOCK_MASK;
0188         }
0189         else if (domain == kIEE_APC_Domain1)
0190         {
0191             IEE_APC->REGION1_RDC_D1 |= IEE_APC_REGION1_RDC_D1_RDC_D1_WRITE_DIS_MASK;
0192             IEE_APC->REGION1_RDC_D1 |= IEE_APC_REGION1_RDC_D1_RDC_D1_LOCK_MASK;
0193         }
0194         else
0195         {
0196             /* Intentional empty */
0197         }
0198     }
0199     if (region == kIEE_APC_Region2)
0200     {
0201         /* Locks write into APC Region 2 BOT address */
0202         IOMUXC_LPSR_GPR->GPR6 |= IOMUXC_LPSR_GPR_GPR6_LOCK(1);
0203         /* Locks write into APC Region 2 TOP address */
0204         IOMUXC_LPSR_GPR->GPR7 |= IOMUXC_LPSR_GPR_GPR7_LOCK(1);
0205         /* Locks write into APC REGION 2 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
0206         IOMUXC_LPSR_GPR->GPR20 |= IOMUXC_LPSR_GPR_GPR20_LOCK(1);
0207 
0208         if (domain == kIEE_APC_Domain0)
0209         {
0210             IEE_APC->REGION2_RDC_D0 |= IEE_APC_REGION2_RDC_D0_RDC_D0_WRITE_DIS_MASK;
0211             IEE_APC->REGION2_RDC_D0 |= IEE_APC_REGION2_RDC_D0_RDC_D0_LOCK_MASK;
0212         }
0213         else if (domain == kIEE_APC_Domain1)
0214         {
0215             IEE_APC->REGION2_RDC_D1 |= IEE_APC_REGION2_RDC_D1_RDC_D1_WRITE_DIS_MASK;
0216             IEE_APC->REGION2_RDC_D1 |= IEE_APC_REGION2_RDC_D1_RDC_D1_LOCK_MASK;
0217         }
0218         else
0219         {
0220             /* Intentional empty */
0221         }
0222     }
0223     if (region == kIEE_APC_Region3)
0224     {
0225         /* Locks write into APC Region 3 BOT address */
0226         IOMUXC_LPSR_GPR->GPR8 |= IOMUXC_LPSR_GPR_GPR8_LOCK(1);
0227         /* Locks write into APC Region 3 TOP address */
0228         IOMUXC_LPSR_GPR->GPR9 |= IOMUXC_LPSR_GPR_GPR9_LOCK(1);
0229         /* Locks write into APC REGION 3 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
0230         IOMUXC_LPSR_GPR->GPR21 |= IOMUXC_LPSR_GPR_GPR21_LOCK(1);
0231 
0232         if (domain == kIEE_APC_Domain0)
0233         {
0234             IEE_APC->REGION3_RDC_D0 |= IEE_APC_REGION3_RDC_D0_RDC_D0_WRITE_DIS_MASK;
0235             IEE_APC->REGION3_RDC_D0 |= IEE_APC_REGION3_RDC_D0_RDC_D0_LOCK_MASK;
0236         }
0237         else if (domain == kIEE_APC_Domain1)
0238         {
0239             IEE_APC->REGION3_RDC_D1 |= IEE_APC_REGION3_RDC_D1_RDC_D1_WRITE_DIS_MASK;
0240             IEE_APC->REGION3_RDC_D1 |= IEE_APC_REGION3_RDC_D1_RDC_D1_LOCK_MASK;
0241         }
0242         else
0243         {
0244             /* Intentional empty */
0245         }
0246     }
0247     if (region == kIEE_APC_Region4)
0248     {
0249         /* Locks write into APC Region 4 BOT address */
0250         IOMUXC_LPSR_GPR->GPR10 |= IOMUXC_LPSR_GPR_GPR10_LOCK(1);
0251         /* Locks write into APC Region 4 TOP address */
0252         IOMUXC_LPSR_GPR->GPR11 |= IOMUXC_LPSR_GPR_GPR11_LOCK(1);
0253         /* Locks write into APC REGION 4 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
0254         IOMUXC_LPSR_GPR->GPR22 |= IOMUXC_LPSR_GPR_GPR22_LOCK(1);
0255 
0256         if (domain == kIEE_APC_Domain0)
0257         {
0258             IEE_APC->REGION4_RDC_D0 |= IEE_APC_REGION4_RDC_D0_RDC_D0_WRITE_DIS_MASK;
0259             IEE_APC->REGION4_RDC_D0 |= IEE_APC_REGION4_RDC_D0_RDC_D0_LOCK_MASK;
0260         }
0261         else if (domain == kIEE_APC_Domain1)
0262         {
0263             IEE_APC->REGION4_RDC_D1 |= IEE_APC_REGION4_RDC_D1_RDC_D1_WRITE_DIS_MASK;
0264             IEE_APC->REGION4_RDC_D1 |= IEE_APC_REGION4_RDC_D1_RDC_D1_LOCK_MASK;
0265         }
0266         else
0267         {
0268             /* Intentional empty */
0269         }
0270     }
0271     if (region == kIEE_APC_Region5)
0272     {
0273         /* Locks write into APC Region 5 BOT address */
0274         IOMUXC_LPSR_GPR->GPR12 |= IOMUXC_LPSR_GPR_GPR12_LOCK(1);
0275         /* Locks write into APC Region 5 TOP address */
0276         IOMUXC_LPSR_GPR->GPR13 |= IOMUXC_LPSR_GPR_GPR13_LOCK(1);
0277         /* Locks write into APC REGION 5 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
0278         IOMUXC_LPSR_GPR->GPR23 |= IOMUXC_LPSR_GPR_GPR23_LOCK(1);
0279 
0280         if (domain == kIEE_APC_Domain0)
0281         {
0282             IEE_APC->REGION5_RDC_D0 |= IEE_APC_REGION5_RDC_D0_RDC_D0_WRITE_DIS_MASK;
0283             IEE_APC->REGION5_RDC_D0 |= IEE_APC_REGION5_RDC_D0_RDC_D0_LOCK_MASK;
0284         }
0285         else if (domain == kIEE_APC_Domain1)
0286         {
0287             IEE_APC->REGION5_RDC_D1 |= IEE_APC_REGION5_RDC_D1_RDC_D1_WRITE_DIS_MASK;
0288             IEE_APC->REGION5_RDC_D1 |= IEE_APC_REGION5_RDC_D1_RDC_D1_LOCK_MASK;
0289         }
0290         else
0291         {
0292             /* Intentional empty */
0293         }
0294     }
0295     if (region == kIEE_APC_Region6)
0296     {
0297         /* Locks write into APC Region 6 BOT address */
0298         IOMUXC_LPSR_GPR->GPR14 |= IOMUXC_LPSR_GPR_GPR14_LOCK(1);
0299         /* Locks write into APC Region 6 TOP address */
0300         IOMUXC_LPSR_GPR->GPR15 |= IOMUXC_LPSR_GPR_GPR15_LOCK(1);
0301         /* Locks write into APC REGION 6 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
0302         IOMUXC_LPSR_GPR->GPR24 |= IOMUXC_LPSR_GPR_GPR24_LOCK(1);
0303 
0304         if (domain == kIEE_APC_Domain0)
0305         {
0306             IEE_APC->REGION6_RDC_D0 |= IEE_APC_REGION6_RDC_D0_RDC_D0_WRITE_DIS_MASK;
0307             IEE_APC->REGION6_RDC_D0 |= IEE_APC_REGION6_RDC_D0_RDC_D0_LOCK_MASK;
0308         }
0309         else if (domain == kIEE_APC_Domain1)
0310         {
0311             IEE_APC->REGION6_RDC_D1 |= IEE_APC_REGION6_RDC_D1_RDC_D1_WRITE_DIS_MASK;
0312             IEE_APC->REGION6_RDC_D1 |= IEE_APC_REGION6_RDC_D1_RDC_D1_LOCK_MASK;
0313         }
0314         else
0315         {
0316             /* Intentional empty */
0317         }
0318     }
0319     if (region == kIEE_APC_Region7)
0320     {
0321         /* Locks write into APC Region 7 BOT address */
0322         IOMUXC_LPSR_GPR->GPR16 |= IOMUXC_LPSR_GPR_GPR15_LOCK(1);
0323         /* Locks write into APC Region 7 TOP address */
0324         IOMUXC_LPSR_GPR->GPR17 |= IOMUXC_LPSR_GPR_GPR16_LOCK(1);
0325         /* Locks write into APC REGION 7 Valid, Debug, Sand box, Safe box, Execute only and Encrytp enable bits */
0326         IOMUXC_LPSR_GPR->GPR25 |= IOMUXC_LPSR_GPR_GPR25_LOCK(1);
0327 
0328         if (domain == kIEE_APC_Domain0)
0329         {
0330             IEE_APC->REGION7_RDC_D0 |= IEE_APC_REGION7_RDC_D0_RDC_D0_WRITE_DIS_MASK;
0331             IEE_APC->REGION7_RDC_D0 |= IEE_APC_REGION7_RDC_D0_RDC_D0_LOCK_MASK;
0332         }
0333         else if (domain == kIEE_APC_Domain1)
0334         {
0335             IEE_APC->REGION7_RDC_D1 |= IEE_APC_REGION7_RDC_D1_RDC_D1_WRITE_DIS_MASK;
0336             IEE_APC->REGION7_RDC_D1 |= IEE_APC_REGION7_RDC_D1_RDC_D1_LOCK_MASK;
0337         }
0338         else
0339         {
0340             /* Intentional empty */
0341         }
0342     }
0343 
0344     return kStatus_Success;
0345 }
0346 
0347 /*!
0348  * brief Enable the IEE encryption/decryption for specific region.
0349  *
0350  * This function enables encryption/decryption by writting to IOMUXC LPSR GPR.
0351  *
0352  * param base APC IEE peripheral address.
0353  * param region Selection of the APC IEE region to be enabled.
0354  */
0355 void IEE_APC_RegionEnable(IEE_APC_Type *base, iee_apc_region_t region)
0356 {
0357     if (region == kIEE_APC_Region0)
0358     {
0359         IOMUXC_LPSR_GPR->GPR18 |= IOMUXC_LPSR_GPR_GPR18_APC_R0_ENCRYPT_ENABLE_MASK;
0360     }
0361     if (region == kIEE_APC_Region1)
0362     {
0363         IOMUXC_LPSR_GPR->GPR19 |= IOMUXC_LPSR_GPR_GPR19_APC_R1_ENCRYPT_ENABLE_MASK;
0364     }
0365     if (region == kIEE_APC_Region2)
0366     {
0367         IOMUXC_LPSR_GPR->GPR20 |= IOMUXC_LPSR_GPR_GPR20_APC_R2_ENCRYPT_ENABLE_MASK;
0368     }
0369     if (region == kIEE_APC_Region3)
0370     {
0371         IOMUXC_LPSR_GPR->GPR21 |= IOMUXC_LPSR_GPR_GPR21_APC_R3_ENCRYPT_ENABLE_MASK;
0372     }
0373     if (region == kIEE_APC_Region4)
0374     {
0375         IOMUXC_LPSR_GPR->GPR22 |= IOMUXC_LPSR_GPR_GPR22_APC_R4_ENCRYPT_ENABLE_MASK;
0376     }
0377     if (region == kIEE_APC_Region5)
0378     {
0379         IOMUXC_LPSR_GPR->GPR23 |= IOMUXC_LPSR_GPR_GPR23_APC_R5_ENCRYPT_ENABLE_MASK;
0380     }
0381     if (region == kIEE_APC_Region6)
0382     {
0383         IOMUXC_LPSR_GPR->GPR24 |= IOMUXC_LPSR_GPR_GPR24_APC_R6_ENCRYPT_ENABLE_MASK;
0384     }
0385     if (region == kIEE_APC_Region7)
0386     {
0387         IOMUXC_LPSR_GPR->GPR25 |= IOMUXC_LPSR_GPR_GPR25_APC_R7_ENCRYPT_ENABLE_MASK;
0388     }
0389 
0390     return;
0391 }