summaryrefslogtreecommitdiffstats
path: root/bsps/arm/imxrt/mcux-sdk/drivers/key_manager
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--bsps/arm/imxrt/mcux-sdk/drivers/key_manager/fsl_key_manager.c218
-rw-r--r--bsps/arm/imxrt/mcux-sdk/drivers/key_manager/fsl_key_manager.h181
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_ */