diff options
Diffstat (limited to '')
-rw-r--r-- | bsps/arm/imxrt/mcux-sdk/drivers/key_manager/fsl_key_manager.c | 218 | ||||
-rw-r--r-- | bsps/arm/imxrt/mcux-sdk/drivers/key_manager/fsl_key_manager.h | 181 |
2 files changed, 399 insertions, 0 deletions
diff --git a/bsps/arm/imxrt/mcux-sdk/drivers/key_manager/fsl_key_manager.c b/bsps/arm/imxrt/mcux-sdk/drivers/key_manager/fsl_key_manager.c new file mode 100644 index 0000000000..b7b0c03d45 --- /dev/null +++ b/bsps/arm/imxrt/mcux-sdk/drivers/key_manager/fsl_key_manager.c @@ -0,0 +1,218 @@ +/* + * Copyright 2020-2021, NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_key_manager.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.key_manager" +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * brief Configures Master key settings. + * + * This function configures Key Manager's setting for Master key. + * + * param base Key Manager peripheral address. + * param select select source for Master key. + * param lock setting for lock Master key. + * return status of Master key control operation + */ +status_t KEYMGR_MasterKeyControll(KEY_MANAGER_Type *base, keymgr_select_t select, keymgr_lock_t lock) +{ + if ((select != (uint8_t)(KEYMGR_SEL_UDF)) && (select != (uint8_t)(KEYMGR_SEL_PUF))) + { + return kStatus_InvalidArgument; + } + + /* Clear KEY_CTRL_SELECT bitfield */ + base->MASTER_KEY_CTRL &= ~KEY_MANAGER_MASTER_KEY_CTRL_SELECT_MASK; + + /* Write new setting in MASTER_KEY_CTRL register */ + base->MASTER_KEY_CTRL |= KEY_MANAGER_MASTER_KEY_CTRL_SELECT(select) | KEY_MANAGER_MASTER_KEY_CTRL_LOCK(lock); + + return kStatus_Success; +} + +/*! + * brief Configures OTFAD1 key settings. + * + * This function configures Key Manager's setting for OTFAD1 key. + * + * param base Key Manager peripheral address. + * param select select source for OTFAD1 key. + * param lock setting for lock OTFAD1 key. + * return status of OTFAD1 key control operation + */ +status_t KEYMGR_OTFAD1KeyControll(KEY_MANAGER_Type *base, keymgr_select_t select, keymgr_lock_t lock) +{ + if ((select != (uint8_t)(KEYMGR_SEL_OCOTP)) && (select != (uint8_t)(KEYMGR_SEL_PUF))) + { + return kStatus_InvalidArgument; + } + + /* Clear KEY_CTRL_SELECT bitfield */ + base->OTFAD1_KEY_CTRL &= ~KEY_MANAGER_OTFAD1_KEY_CTRL_SELECT_MASK; + + /* Write new setting in OTFAD1_KEY_CTRL register */ + base->OTFAD1_KEY_CTRL |= KEY_MANAGER_OTFAD1_KEY_CTRL_SELECT(select) | KEY_MANAGER_OTFAD1_KEY_CTRL_LOCK(lock); + + return kStatus_Success; +} + +/*! + * brief Configures OTFAD2 key settings. + * + * This function configures Key Manager's setting for OTFAD2 key. + * + * param base Key Manager peripheral address. + * param select select source for OTFAD2 key. + * param lock setting for lock OTFAD2 key. + * return status of OTFAD2 key control operation + */ +status_t KEYMGR_OTFAD2KeyControll(KEY_MANAGER_Type *base, keymgr_select_t select, keymgr_lock_t lock) +{ + if ((select != (uint8_t)(KEYMGR_SEL_OCOTP)) && (select != (uint8_t)(KEYMGR_SEL_PUF))) + { + return kStatus_InvalidArgument; + } + + /* Clear KEY_CTRL_SELECT bitfield */ + base->OTFAD2_KEY_CTRL &= ~KEY_MANAGER_OTFAD2_KEY_CTRL_SELECT_MASK; + + /* Write new setting in OTFAD2_KEY_CTRL register */ + base->OTFAD2_KEY_CTRL |= KEY_MANAGER_OTFAD2_KEY_CTRL_SELECT(select) | KEY_MANAGER_OTFAD2_KEY_CTRL_LOCK(lock); + + return kStatus_Success; +} + +/*! + * brief Restart load key signal for IEE. + * + * This function genrates Key Manager's restart signal for IEE key. + * + * param base Key Manager peripheral address. + */ +void KEYMGR_IEEKeyReload(KEY_MANAGER_Type *base) +{ + base->IEE_KEY_CTRL |= KEYMGR_IEE_RELOAD; +} + +/*! + * brief Lock the key select from PUF. + * + * This function locks selection of key for PUF. + * + * param base Key Manager peripheral address. + */ +void KEYMGR_PUFKeyLock(KEY_MANAGER_Type *base, keymgr_lock_t lock) +{ + base->PUF_KEY_CTRL |= KEY_MANAGER_PUF_KEY_CTRL_LOCK(lock); +} + +/*! + * brief Sets the default configuration of Key manager slot. + * + * This function initialize Key Manager slot config structure to default values. + * + * param config Pointer to slot configuration structure. + */ +status_t KEYMGR_GetDefaultConfig(domain_slot_config_t *config) +{ + if (config == NULL) + { + return kStatus_InvalidArgument; + } + + config->lockControl = kKEYMGR_Unlock; + config->allowUser = kKEYMGR_Allow; + config->allowNonSecure = kKEYMGR_Allow; + config->lockList = kKEYMGR_Unlock; + config->whiteList = 0u; + + return kStatus_Success; +} + +/*! + * brief Configures Slot Domain control. + * + * This function configures domain slot control which locks and allows writes. + * + * param base Key Manager peripheral address. + * param config Pointer to slot configuration structure. + * param slot Select slot to be configured. + */ +status_t KEYMGR_SlotControl(KEY_MANAGER_Type *base, domain_slot_config_t *config, keymgr_slot_t slot) +{ + if (slot == kKEYMGR_Slot0) + { + base->SLOT0_CTRL |= + KEY_MANAGER_SLOT0_CTRL_WHITE_LIST(config->whiteList) | KEY_MANAGER_SLOT0_CTRL_LOCK_LIST(config->lockList) | + KEY_MANAGER_SLOT0_CTRL_TZ_NS(config->allowNonSecure) | KEY_MANAGER_SLOT0_CTRL_TZ_USER(config->allowUser) | + KEY_MANAGER_SLOT0_CTRL_LOCK_CONTROL(config->lockControl); + } + else if (slot == kKEYMGR_Slot1) + { + base->SLOT1_CTRL |= + KEY_MANAGER_SLOT0_CTRL_WHITE_LIST(config->whiteList) | KEY_MANAGER_SLOT0_CTRL_LOCK_LIST(config->lockList) | + KEY_MANAGER_SLOT0_CTRL_TZ_NS(config->allowNonSecure) | KEY_MANAGER_SLOT0_CTRL_TZ_USER(config->allowUser) | + KEY_MANAGER_SLOT1_CTRL_LOCK_CONTROL(config->lockControl); + } + else if (slot == kKEYMGR_Slot2) + { + base->SLOT2_CTRL |= + KEY_MANAGER_SLOT0_CTRL_WHITE_LIST(config->whiteList) | KEY_MANAGER_SLOT0_CTRL_LOCK_LIST(config->lockList) | + KEY_MANAGER_SLOT0_CTRL_TZ_NS(config->allowNonSecure) | KEY_MANAGER_SLOT0_CTRL_TZ_USER(config->allowUser) | + KEY_MANAGER_SLOT2_CTRL_LOCK_CONTROL(config->lockControl); + } + else if (slot == kKEYMGR_Slot3) + { + base->SLOT3_CTRL |= + KEY_MANAGER_SLOT0_CTRL_WHITE_LIST(config->whiteList) | KEY_MANAGER_SLOT0_CTRL_LOCK_LIST(config->lockList) | + KEY_MANAGER_SLOT0_CTRL_TZ_NS(config->allowNonSecure) | KEY_MANAGER_SLOT0_CTRL_TZ_USER(config->allowUser) | + KEY_MANAGER_SLOT3_CTRL_LOCK_CONTROL(config->lockControl); + } + else if (slot == kKEYMGR_Slot4) + { + base->SLOT4_CTRL |= + KEY_MANAGER_SLOT0_CTRL_WHITE_LIST(config->whiteList) | KEY_MANAGER_SLOT0_CTRL_LOCK_LIST(config->lockList) | + KEY_MANAGER_SLOT0_CTRL_TZ_NS(config->allowNonSecure) | KEY_MANAGER_SLOT0_CTRL_TZ_USER(config->allowUser) | + KEY_MANAGER_SLOT4_CTRL_LOCK_CONTROL(config->lockControl); + } + else + { + return kStatus_InvalidArgument; + } + + return kStatus_Success; +} + +/*! + * brief Enables clock for Key Manager module. + * + * This function enables clocks for Key Manager module. + * + * param base Key Manager peripheral address. + */ +void KEYMGR_Init(KEY_MANAGER_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + CLOCK_EnableClock(kCLOCK_Key_Manager); +#endif +} diff --git a/bsps/arm/imxrt/mcux-sdk/drivers/key_manager/fsl_key_manager.h b/bsps/arm/imxrt/mcux-sdk/drivers/key_manager/fsl_key_manager.h new file mode 100644 index 0000000000..03e3af3f46 --- /dev/null +++ b/bsps/arm/imxrt/mcux-sdk/drivers/key_manager/fsl_key_manager.h @@ -0,0 +1,181 @@ +/* + * Copyright 2020-2021, NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _FSL_KEYMGR_H_ +#define _FSL_KEYMGR_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup key_manager + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*@{*/ +/*! @brief Key Manager driver version. Version 2.0.2. + * + * Current version: 2.0.2 + * + * Change log: + * + * - Version 2.0.2 + * - Fix MISRA-2012 issues + * + * - Version 2.0.1 + * - Fix MISRA-2012 issues + * + * - Version 2.0.0 + * - Initial version + */ +#define FSL_KEYMGR_DRIVER_VERSION (MAKE_VERSION(2, 0, 2)) +/*@}*/ + +typedef enum _keymgr_lock +{ + kKEYMGR_Unlock = 0u, + kKEYMGR_Lock = 1u, +} keymgr_lock_t; + +typedef enum _keymgr_allow +{ + kKEYMGR_Disallow = 0u, + kKEYMGR_Allow = 1u, +} keymgr_allow_t; + +typedef enum _keymgr_slot +{ + kKEYMGR_Slot0 = 0u, + kKEYMGR_Slot1 = 1u, + kKEYMGR_Slot2 = 2u, + kKEYMGR_Slot3 = 3u, + kKEYMGR_Slot4 = 4u, +} keymgr_slot_t; + +#define KEYMGR_IEE_RELOAD 1u +#define KEYMGR_SEL_OCOTP 0u +#define KEYMGR_SEL_UDF 0u +#define KEYMGR_SEL_PUF 1u + +#define keymgr_select_t uint8_t + +/*! @brief Key Manager slot configuration structure. */ +typedef struct _domain_slot_config +{ + keymgr_lock_t lockControl; /*!< Lock control register of slot. */ + keymgr_allow_t allowUser; /*!< Allow user write access to domain control register or domain register. */ + keymgr_allow_t allowNonSecure; /*!< Allow non-secure write access to domain control register or domain register. */ + keymgr_lock_t lockList; /*!< Lock whitelist. SLOTx_CTRL[WHITE_LIST] cannot be changed. */ + uint8_t whiteList; /*!< Domains that on the Whitelist can change given slot. */ + /*!< Each field represents one domain. Bit0~Bit3 represent DOMAIN0~DOMAIN3 respectively. */ +} domain_slot_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Configures Master key settings. + * + * This function configures Key Manager's setting for Master key. + * + * @param base Key Manager peripheral address. + * @param select select source for Master key. + * @param lock setting for lock Master key. + * @return status of Master key control operation + */ +status_t KEYMGR_MasterKeyControll(KEY_MANAGER_Type *base, keymgr_select_t select, keymgr_lock_t lock); + +/*! + * @brief Configures OTFAD1 key settings. + * + * This function configures Key Manager's setting for OTFAD1 key. + * + * @param base Key Manager peripheral address. + * @param select select source for OTFAD1 key. + * @param lock setting for lock OTFAD1 key. + * @return status of OTFAD1 key control operation + */ +status_t KEYMGR_OTFAD1KeyControll(KEY_MANAGER_Type *base, keymgr_select_t select, keymgr_lock_t lock); + +/*! + * @brief Configures OTFAD2 key settings. + * + * This function configures Key Manager's setting for OTFAD2 key. + * + * @param base Key Manager peripheral address. + * @param select select source for OTFAD2 key. + * @param lock setting for lock OTFAD2 key. + * @return status of OTFAD2 key control operation + */ +status_t KEYMGR_OTFAD2KeyControll(KEY_MANAGER_Type *base, keymgr_select_t select, keymgr_lock_t lock); + +/*! + * @brief Restart load key signal for IEE. + * + * This function genrates Key Manager's restart signal for IEE key. + * + * @param base Key Manager peripheral address. + */ +void KEYMGR_IEEKeyReload(KEY_MANAGER_Type *base); + +/*! + * @brief Lock the key select from PUF. + * + * This function locks selection of key for PUF. + * + * @param base Key Manager peripheral address. + * @param lock Setting for selection of key for PUF. + */ +void KEYMGR_PUFKeyLock(KEY_MANAGER_Type *base, keymgr_lock_t lock); + +/*! + * @brief Configures Slot Domain control. + * + * This function configures domain slot control which locks and allows writes. + * + * @param base Key Manager peripheral address. + * @param config Pointer to slot configuration structure. + * @param slot Select slot to be configured. + * @return status of slot control operation + */ +status_t KEYMGR_SlotControl(KEY_MANAGER_Type *base, domain_slot_config_t *config, keymgr_slot_t slot); + +/*! + * @brief Resets Key Manager module to factory default values. + * + * This function performs hardware reset of Key Manager module. + * + * @param base Key Manager peripheral address. + */ +void KEYMGR_Init(KEY_MANAGER_Type *base); + +/*! + * @brief Sets the default configuration of Key manager slot. + * + * This function initialize Key Manager slot config structure to default values. + * + * @param config Pointer to slot configuration structure. + */ +status_t KEYMGR_GetDefaultConfig(domain_slot_config_t *config); + +#if defined(__cplusplus) +} +#endif + +/*! + *@} + */ + +#endif /* _FSL_IEE_H_ */ |