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_key_manager.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.key_manager"
0017 #endif
0018 
0019 /*******************************************************************************
0020  * Prototypes
0021  ******************************************************************************/
0022 
0023 /*******************************************************************************
0024  * Code
0025  ******************************************************************************/
0026 
0027 /*!
0028  * brief Configures Master key settings.
0029  *
0030  * This function configures Key Manager's setting for Master key.
0031  *
0032  * param base Key Manager peripheral address.
0033  * param select select source for Master key.
0034  * param lock setting for lock Master key.
0035  * return  status of Master key control operation
0036  */
0037 status_t KEYMGR_MasterKeyControll(KEY_MANAGER_Type *base, keymgr_select_t select, keymgr_lock_t lock)
0038 {
0039     if ((select != (uint8_t)(KEYMGR_SEL_UDF)) && (select != (uint8_t)(KEYMGR_SEL_PUF)))
0040     {
0041         return kStatus_InvalidArgument;
0042     }
0043 
0044     /* Clear KEY_CTRL_SELECT bitfield */
0045     base->MASTER_KEY_CTRL &= ~KEY_MANAGER_MASTER_KEY_CTRL_SELECT_MASK;
0046 
0047     /* Write new setting in MASTER_KEY_CTRL register */
0048     base->MASTER_KEY_CTRL |= KEY_MANAGER_MASTER_KEY_CTRL_SELECT(select) | KEY_MANAGER_MASTER_KEY_CTRL_LOCK(lock);
0049 
0050     return kStatus_Success;
0051 }
0052 
0053 /*!
0054  * brief Configures OTFAD1 key settings.
0055  *
0056  * This function configures Key Manager's setting for OTFAD1 key.
0057  *
0058  * param base Key Manager peripheral address.
0059  * param select select source for OTFAD1 key.
0060  * param lock setting for lock OTFAD1 key.
0061  * return  status of OTFAD1 key control operation
0062  */
0063 status_t KEYMGR_OTFAD1KeyControll(KEY_MANAGER_Type *base, keymgr_select_t select, keymgr_lock_t lock)
0064 {
0065     if ((select != (uint8_t)(KEYMGR_SEL_OCOTP)) && (select != (uint8_t)(KEYMGR_SEL_PUF)))
0066     {
0067         return kStatus_InvalidArgument;
0068     }
0069 
0070     /* Clear KEY_CTRL_SELECT bitfield */
0071     base->OTFAD1_KEY_CTRL &= ~KEY_MANAGER_OTFAD1_KEY_CTRL_SELECT_MASK;
0072 
0073     /* Write new setting in OTFAD1_KEY_CTRL register */
0074     base->OTFAD1_KEY_CTRL |= KEY_MANAGER_OTFAD1_KEY_CTRL_SELECT(select) | KEY_MANAGER_OTFAD1_KEY_CTRL_LOCK(lock);
0075 
0076     return kStatus_Success;
0077 }
0078 
0079 /*!
0080  * brief Configures OTFAD2 key settings.
0081  *
0082  * This function configures Key Manager's setting for OTFAD2 key.
0083  *
0084  * param base Key Manager peripheral address.
0085  * param select select source for OTFAD2 key.
0086  * param lock setting for lock OTFAD2 key.
0087  * return  status of OTFAD2 key control operation
0088  */
0089 status_t KEYMGR_OTFAD2KeyControll(KEY_MANAGER_Type *base, keymgr_select_t select, keymgr_lock_t lock)
0090 {
0091     if ((select != (uint8_t)(KEYMGR_SEL_OCOTP)) && (select != (uint8_t)(KEYMGR_SEL_PUF)))
0092     {
0093         return kStatus_InvalidArgument;
0094     }
0095 
0096     /* Clear KEY_CTRL_SELECT bitfield */
0097     base->OTFAD2_KEY_CTRL &= ~KEY_MANAGER_OTFAD2_KEY_CTRL_SELECT_MASK;
0098 
0099     /* Write new setting in OTFAD2_KEY_CTRL register */
0100     base->OTFAD2_KEY_CTRL |= KEY_MANAGER_OTFAD2_KEY_CTRL_SELECT(select) | KEY_MANAGER_OTFAD2_KEY_CTRL_LOCK(lock);
0101 
0102     return kStatus_Success;
0103 }
0104 
0105 /*!
0106  * brief Restart load key signal for IEE.
0107  *
0108  * This function genrates Key Manager's restart signal for IEE key.
0109  *
0110  * param base Key Manager peripheral address.
0111  */
0112 void KEYMGR_IEEKeyReload(KEY_MANAGER_Type *base)
0113 {
0114     base->IEE_KEY_CTRL |= KEYMGR_IEE_RELOAD;
0115 }
0116 
0117 /*!
0118  * brief Lock the key select from PUF.
0119  *
0120  * This function locks selection of key for PUF.
0121  *
0122  * param base Key Manager peripheral address.
0123  */
0124 void KEYMGR_PUFKeyLock(KEY_MANAGER_Type *base, keymgr_lock_t lock)
0125 {
0126     base->PUF_KEY_CTRL |= KEY_MANAGER_PUF_KEY_CTRL_LOCK(lock);
0127 }
0128 
0129 /*!
0130  * brief Sets the default configuration of Key manager slot.
0131  *
0132  * This function initialize Key Manager slot config structure to default values.
0133  *
0134  * param config Pointer to slot configuration structure.
0135  */
0136 status_t KEYMGR_GetDefaultConfig(domain_slot_config_t *config)
0137 {
0138     if (config == NULL)
0139     {
0140         return kStatus_InvalidArgument;
0141     }
0142 
0143     config->lockControl    = kKEYMGR_Unlock;
0144     config->allowUser      = kKEYMGR_Allow;
0145     config->allowNonSecure = kKEYMGR_Allow;
0146     config->lockList       = kKEYMGR_Unlock;
0147     config->whiteList      = 0u;
0148 
0149     return kStatus_Success;
0150 }
0151 
0152 /*!
0153  * brief Configures Slot Domain control.
0154  *
0155  * This function configures domain slot control which locks and allows writes.
0156  *
0157  * param base Key Manager peripheral address.
0158  * param config Pointer to slot configuration structure.
0159  * param slot Select slot to be configured.
0160  */
0161 status_t KEYMGR_SlotControl(KEY_MANAGER_Type *base, domain_slot_config_t *config, keymgr_slot_t slot)
0162 {
0163     if (slot == kKEYMGR_Slot0)
0164     {
0165         base->SLOT0_CTRL |=
0166             KEY_MANAGER_SLOT0_CTRL_WHITE_LIST(config->whiteList) | KEY_MANAGER_SLOT0_CTRL_LOCK_LIST(config->lockList) |
0167             KEY_MANAGER_SLOT0_CTRL_TZ_NS(config->allowNonSecure) | KEY_MANAGER_SLOT0_CTRL_TZ_USER(config->allowUser) |
0168             KEY_MANAGER_SLOT0_CTRL_LOCK_CONTROL(config->lockControl);
0169     }
0170     else if (slot == kKEYMGR_Slot1)
0171     {
0172         base->SLOT1_CTRL |=
0173             KEY_MANAGER_SLOT0_CTRL_WHITE_LIST(config->whiteList) | KEY_MANAGER_SLOT0_CTRL_LOCK_LIST(config->lockList) |
0174             KEY_MANAGER_SLOT0_CTRL_TZ_NS(config->allowNonSecure) | KEY_MANAGER_SLOT0_CTRL_TZ_USER(config->allowUser) |
0175             KEY_MANAGER_SLOT1_CTRL_LOCK_CONTROL(config->lockControl);
0176     }
0177     else if (slot == kKEYMGR_Slot2)
0178     {
0179         base->SLOT2_CTRL |=
0180             KEY_MANAGER_SLOT0_CTRL_WHITE_LIST(config->whiteList) | KEY_MANAGER_SLOT0_CTRL_LOCK_LIST(config->lockList) |
0181             KEY_MANAGER_SLOT0_CTRL_TZ_NS(config->allowNonSecure) | KEY_MANAGER_SLOT0_CTRL_TZ_USER(config->allowUser) |
0182             KEY_MANAGER_SLOT2_CTRL_LOCK_CONTROL(config->lockControl);
0183     }
0184     else if (slot == kKEYMGR_Slot3)
0185     {
0186         base->SLOT3_CTRL |=
0187             KEY_MANAGER_SLOT0_CTRL_WHITE_LIST(config->whiteList) | KEY_MANAGER_SLOT0_CTRL_LOCK_LIST(config->lockList) |
0188             KEY_MANAGER_SLOT0_CTRL_TZ_NS(config->allowNonSecure) | KEY_MANAGER_SLOT0_CTRL_TZ_USER(config->allowUser) |
0189             KEY_MANAGER_SLOT3_CTRL_LOCK_CONTROL(config->lockControl);
0190     }
0191     else if (slot == kKEYMGR_Slot4)
0192     {
0193         base->SLOT4_CTRL |=
0194             KEY_MANAGER_SLOT0_CTRL_WHITE_LIST(config->whiteList) | KEY_MANAGER_SLOT0_CTRL_LOCK_LIST(config->lockList) |
0195             KEY_MANAGER_SLOT0_CTRL_TZ_NS(config->allowNonSecure) | KEY_MANAGER_SLOT0_CTRL_TZ_USER(config->allowUser) |
0196             KEY_MANAGER_SLOT4_CTRL_LOCK_CONTROL(config->lockControl);
0197     }
0198     else
0199     {
0200         return kStatus_InvalidArgument;
0201     }
0202 
0203     return kStatus_Success;
0204 }
0205 
0206 /*!
0207  * brief Enables clock for Key Manager module.
0208  *
0209  * This function enables clocks for Key Manager module.
0210  *
0211  * param base Key Manager peripheral address.
0212  */
0213 void KEYMGR_Init(KEY_MANAGER_Type *base)
0214 {
0215 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0216     CLOCK_EnableClock(kCLOCK_Key_Manager);
0217 #endif
0218 }