]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
feat(ethos-n)!: load NPU firmware at BL2
authorRob Hughes <robert.hughes@arm.com>
Tue, 17 Jan 2023 16:10:26 +0000 (16:10 +0000)
committerJoanna Farley <joanna.farley@arm.com>
Tue, 4 Apr 2023 09:37:00 +0000 (11:37 +0200)
BL2 on Juno now loads the Arm(R) Ethos(TM)-N NPU firmware into a fixed
address, using the existing image loading framework.

Includes support for TRUSTED_BOARD_BOOT, if enabled, using the firmware
content and key certificates from the FIP.

Supports the ARM_IO_IN_DTB option so can specify the firmware location
from the dtb rather than it being hardcoded to the FIP

Update makefile to automatically embed the appropriate images into the
FIP.

BREAKING CHANGE: Building the FIP when TZMP1 support is enabled in the
NPU driver now requires a parameter to specify the NPU firmware file.

Signed-off-by: Rob Hughes <robert.hughes@arm.com>
Signed-off-by: Mikael Olsson <mikael.olsson@arm.com>
Change-Id: I8cd64fb20d58f8bd539facb085606213d6cead06

docs/getting_started/porting-guide.rst
docs/plat/arm/arm-build-options.rst
plat/arm/board/juno/fdts/juno_tb_fw_config.dts
plat/arm/board/juno/include/plat_tbbr_img_def.h [new file with mode: 0644]
plat/arm/board/juno/include/platform_def.h
plat/arm/board/juno/juno_common.c
plat/arm/board/juno/juno_tbbr_cot_bl2.c [new file with mode: 0644]
plat/arm/board/juno/platform.mk
plat/arm/common/aarch64/arm_bl2_mem_params_desc.c
plat/arm/common/arm_common.mk
plat/arm/common/fconf/arm_fconf_io.c

index b3092c790b345b87df972bdbafd46eb2e026f7a6..5b88fcb38e492d785cbee08052038b2b3834dbbd 100644 (file)
@@ -587,6 +587,21 @@ enabled, the following constants must also be defined.
   Defines the Non-secure Access IDentity (NSAID) that the NPU shall use to
   access the protected memory that contains inference data.
 
+- **ARM_ETHOSN_NPU_FW_IMAGE_BASE** and **ARM_ETHOSN_NPU_FW_IMAGE_LIMIT**
+
+- Provide FCONF entries to configure the image source for NPU firmware (and certificates).
+
+- Add MMU mappings such that:
+
+ - BL2 can write the NPU firmware into the region defined by
+   ``ARM_ETHOSN_NPU_FW_IMAGE_BASE`` and ``ARM_ETHOSN_NPU_FW_IMAGE_LIMIT``
+ - BL31 (SiP service) can read the NPU firmware from the same region
+
+- Add the firmware image ID ``ARM_ETHOSN_NPU_FW_IMAGE_ID`` to the list of images loaded by BL2
+
+Please see the reference implementation code for the Juno platform as an example.
+
+
 The following constant is optional. It should be defined to override the default
 behaviour of the ``assert()`` function (for example, to save memory).
 
index dda2aa0a9af3711caeba35db410aaa7419654ee0..83212c6dcacfcfb67ce0aec9c761c9c3fd207477 100644 (file)
@@ -102,7 +102,11 @@ Arm Platform Build Options
    only loads the ``HW_CONFIG`` in AArch64 builds. Default is 0.
 
 -  ``ARM_ETHOSN_NPU_TZMP1``: boolean option to enable TZMP1 support for the
-   Arm® Ethos™-N NPU. Requires ``ARM_ETHOSN_NPU_DRIVER`` to be enabled.
+   Arm® Ethos™-N NPU. Requires ``ARM_ETHOSN_NPU_DRIVER`` and
+   ``TRUSTED_BOARD_BOOT`` to be enabled.
+
+-  ``ARM_ETHOSN_NPU_FW``: location of the NPU firmware binary (ethosn.bin).
+   This firmware image will be included in the FIP and loaded at runtime.
 
 -  ``ARM_SPMC_MANIFEST_DTS`` : path to an alternate manifest file used as the
    SPMC Core manifest. Valid when ``SPD=spmd`` is selected.
index bdff805a3f5352bb90623dc610118c5d9e5600f5..986299ee3712c7fdbd821afa2ae4feb283abf2dc 100644 (file)
                        tos_fw_content_cert_uuid = "a49f4411-5e63-e411-8728-3f05722af33d";
                        nt_fw_content_cert_uuid = "8ec4c1f3-5d63-e411-a7a9-87ee40b23fa7";
                        plat_sp_content_cert_uuid = "776dfd44-8697-4c3b-91eb-c13e025a2a6f";
+#if ARM_ETHOSN_NPU_TZMP1
+                       arm_ethosn_npu_fw_uuid = "cfd499b5-a3bc-4a7e-98cb-48a41cb8dae1";
+                       arm_ethosn_npu_fw_key_cert_uuid = "5666d004-ab98-40aa-8988-b72a03a256e2";
+                       arm_ethosn_npu_fw_content_cert_uuid = "a5c418da-430f-48b1-88cd-93f67889d9ed";
+#endif
                };
        };
 #endif /* ARM_IO_IN_DTB */
diff --git a/plat/arm/board/juno/include/plat_tbbr_img_def.h b/plat/arm/board/juno/include/plat_tbbr_img_def.h
new file mode 100644 (file)
index 0000000..3e17ed3
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2023, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef JUNO_IMG_DEF_H
+#define JUNO_IMG_DEF_H
+
+#if ARM_ETHOSN_NPU_TZMP1
+/* Arm(R) Ethos(TM)-N NPU images */
+#define ARM_ETHOSN_NPU_FW_KEY_CERT_ID          U(MAX_IMG_IDS_WITH_SPMDS + 1)
+#define ARM_ETHOSN_NPU_FW_CONTENT_CERT_ID      U(MAX_IMG_IDS_WITH_SPMDS + 2)
+#define ARM_ETHOSN_NPU_FW_IMAGE_ID             U(MAX_IMG_IDS_WITH_SPMDS + 3)
+#define MAX_NUMBER_IDS                         U(MAX_IMG_IDS_WITH_SPMDS + 4)
+#endif
+
+#endif /* JUNO_IMG_DEF_H */
index 1ccaf5cf743b3024a59382ff0ab0f7282d575ce3..ef37104e93fca453b6b45677cc02d01d9f505d4c 100644 (file)
                                        JUNO_DTB_DRAM_MAP_SIZE,         \
                                        MT_MEMORY | MT_RO | MT_NS)
 
+#ifdef JUNO_ETHOSN_TZMP1
+#define JUNO_ETHOSN_PROT_FW_RW MAP_REGION_FLAT(     \
+               JUNO_ETHOSN_FW_TZC_PROT_DRAM2_BASE, \
+               JUNO_ETHOSN_FW_TZC_PROT_DRAM2_SIZE, \
+               MT_MEMORY | MT_RW | MT_SECURE)
+#endif
+
 /* virtual address used by dynamic mem_protect for chunk_base */
 #define PLAT_ARM_MEM_PROTEC_VA_FRAME   UL(0xc0000000)
 
 
 #ifdef IMAGE_BL2
 #ifdef SPD_opteed
-# define PLAT_ARM_MMAP_ENTRIES         11
+# define PLAT_ARM_MMAP_ENTRIES         13
 # define MAX_XLAT_TABLES               5
 #else
-# define PLAT_ARM_MMAP_ENTRIES         10
-# define MAX_XLAT_TABLES               4
+# define PLAT_ARM_MMAP_ENTRIES         11
+# define MAX_XLAT_TABLES               5
 #endif
 #endif
 
 /* Number of SCMI channels on the platform */
 #define PLAT_ARM_SCMI_CHANNEL_COUNT    U(1)
 
-/* Protected memory NSAIDs for the Arm(R) Ethos(TM)-N NPU driver */
+/* Protected NSAIDs and memory regions for the Arm(R) Ethos(TM)-N NPU driver */
 #ifdef JUNO_ETHOSN_TZMP1
-#define ARM_ETHOSN_NPU_PROT_FW_NSAID JUNO_ETHOSN_TZC400_NSAID_FW_PROT
-#define ARM_ETHOSN_NPU_PROT_DATA_NSAID JUNO_ETHOSN_TZC400_NSAID_DATA_PROT
+#define ARM_ETHOSN_NPU_PROT_FW_NSAID   JUNO_ETHOSN_TZC400_NSAID_FW_PROT
+#define ARM_ETHOSN_NPU_PROT_DATA_NSAID JUNO_ETHOSN_TZC400_NSAID_DATA_PROT
+#define ARM_ETHOSN_NPU_FW_IMAGE_BASE   JUNO_ETHOSN_FW_TZC_PROT_DRAM2_BASE
+#define ARM_ETHOSN_NPU_FW_IMAGE_LIMIT \
+       (JUNO_ETHOSN_FW_TZC_PROT_DRAM2_BASE + JUNO_ETHOSN_FW_TZC_PROT_DRAM2_SIZE)
 #endif
 
 #endif /* PLATFORM_DEF_H */
index 451c7df3799cb258153dca4f41237ee7886e50df..584b2ed72c8c784d0c8a151ec0115899ff61fe15 100644 (file)
@@ -52,6 +52,9 @@ const mmap_region_t plat_arm_mmap[] = {
 #endif
 #if TRUSTED_BOARD_BOOT && !RESET_TO_BL2
        ARM_MAP_BL1_RW,
+#endif
+#ifdef JUNO_ETHOSN_TZMP1
+       JUNO_ETHOSN_PROT_FW_RW,
 #endif
        {0}
 };
diff --git a/plat/arm/board/juno/juno_tbbr_cot_bl2.c b/plat/arm/board/juno/juno_tbbr_cot_bl2.c
new file mode 100644 (file)
index 0000000..d48d2e6
--- /dev/null
@@ -0,0 +1,789 @@
+/*
+ * Copyright (c) 2015-2023, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stddef.h>
+
+#include <mbedtls/version.h>
+
+#include <drivers/auth/auth_mod.h>
+#include <drivers/auth/tbbr_cot_common.h>
+
+#if USE_TBBR_DEFS
+#include <tools_share/tbbr_oid.h>
+#else
+#include <platform_oid.h>
+#endif
+
+#include <platform_def.h>
+
+static unsigned char soc_fw_hash_buf[HASH_DER_LEN];
+static unsigned char tos_fw_hash_buf[HASH_DER_LEN];
+static unsigned char tos_fw_extra1_hash_buf[HASH_DER_LEN];
+static unsigned char tos_fw_extra2_hash_buf[HASH_DER_LEN];
+static unsigned char trusted_world_pk_buf[PK_DER_LEN];
+static unsigned char non_trusted_world_pk_buf[PK_DER_LEN];
+static unsigned char content_pk_buf[PK_DER_LEN];
+static unsigned char soc_fw_config_hash_buf[HASH_DER_LEN];
+static unsigned char tos_fw_config_hash_buf[HASH_DER_LEN];
+static unsigned char nt_fw_config_hash_buf[HASH_DER_LEN];
+#if defined(SPD_spmd)
+static unsigned char sp_pkg_hash_buf[MAX_SP_IDS][HASH_DER_LEN];
+#endif /* SPD_spmd */
+#if ARM_ETHOSN_NPU_TZMP1
+static unsigned char npu_fw_image_hash_buf[HASH_DER_LEN];
+#endif /* ARM_ETHOSN_NPU_TZMP1 */
+
+
+static auth_param_type_desc_t non_trusted_nv_ctr = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_NV_CTR, NON_TRUSTED_FW_NVCOUNTER_OID);
+static auth_param_type_desc_t trusted_world_pk = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_PUB_KEY, TRUSTED_WORLD_PK_OID);
+static auth_param_type_desc_t non_trusted_world_pk = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_PUB_KEY, NON_TRUSTED_WORLD_PK_OID);
+static auth_param_type_desc_t scp_fw_content_pk = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_PUB_KEY, SCP_FW_CONTENT_CERT_PK_OID);
+static auth_param_type_desc_t soc_fw_content_pk = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_PUB_KEY, SOC_FW_CONTENT_CERT_PK_OID);
+static auth_param_type_desc_t tos_fw_content_pk = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_PUB_KEY, TRUSTED_OS_FW_CONTENT_CERT_PK_OID);
+static auth_param_type_desc_t nt_fw_content_pk = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_PUB_KEY, NON_TRUSTED_FW_CONTENT_CERT_PK_OID);
+static auth_param_type_desc_t scp_fw_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, SCP_FW_HASH_OID);
+static auth_param_type_desc_t soc_fw_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, SOC_AP_FW_HASH_OID);
+static auth_param_type_desc_t soc_fw_config_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, SOC_FW_CONFIG_HASH_OID);
+static auth_param_type_desc_t tos_fw_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, TRUSTED_OS_FW_HASH_OID);
+static auth_param_type_desc_t tos_fw_config_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, TRUSTED_OS_FW_CONFIG_HASH_OID);
+static auth_param_type_desc_t tos_fw_extra1_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, TRUSTED_OS_FW_EXTRA1_HASH_OID);
+static auth_param_type_desc_t tos_fw_extra2_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, TRUSTED_OS_FW_EXTRA2_HASH_OID);
+static auth_param_type_desc_t nt_world_bl_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, NON_TRUSTED_WORLD_BOOTLOADER_HASH_OID);
+static auth_param_type_desc_t nt_fw_config_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, NON_TRUSTED_FW_CONFIG_HASH_OID);
+#if defined(SPD_spmd)
+static auth_param_type_desc_t sp_pkg1_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, SP_PKG1_HASH_OID);
+static auth_param_type_desc_t sp_pkg2_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, SP_PKG2_HASH_OID);
+static auth_param_type_desc_t sp_pkg3_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, SP_PKG3_HASH_OID);
+static auth_param_type_desc_t sp_pkg4_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, SP_PKG4_HASH_OID);
+static auth_param_type_desc_t sp_pkg5_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, SP_PKG5_HASH_OID);
+static auth_param_type_desc_t sp_pkg6_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, SP_PKG6_HASH_OID);
+static auth_param_type_desc_t sp_pkg7_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, SP_PKG7_HASH_OID);
+static auth_param_type_desc_t sp_pkg8_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, SP_PKG8_HASH_OID);
+#endif /* SPD_spmd */
+#if ARM_ETHOSN_NPU_TZMP1
+static auth_param_type_desc_t npu_fw_cert_pk = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_PUB_KEY, ETHOSN_NPU_FW_CONTENT_CERT_PK_OID);
+static auth_param_type_desc_t npu_fw_image_hash = AUTH_PARAM_TYPE_DESC(
+               AUTH_PARAM_HASH, ETHOSN_NPU_FW_BINARY_OID);
+#endif /* ARM_ETHOSN_NPU_TZMP1 */
+
+/*
+ * Trusted key certificate
+ */
+static const auth_img_desc_t trusted_key_cert = {
+       .img_id = TRUSTED_KEY_CERT_ID,
+       .img_type = IMG_CERT,
+       .parent = NULL,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_SIG,
+                       .param.sig = {
+                               .pk = &subject_pk,
+                               .sig = &sig,
+                               .alg = &sig_alg,
+                               .data = &raw_data
+                       }
+               },
+               [1] = {
+                       .type = AUTH_METHOD_NV_CTR,
+                       .param.nv_ctr = {
+                               .cert_nv_ctr = &trusted_nv_ctr,
+                               .plat_nv_ctr = &trusted_nv_ctr
+                       }
+               }
+       },
+       .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
+               [0] = {
+                       .type_desc = &trusted_world_pk,
+                       .data = {
+                               .ptr = (void *)trusted_world_pk_buf,
+                               .len = (unsigned int)PK_DER_LEN
+                       }
+               },
+               [1] = {
+                       .type_desc = &non_trusted_world_pk,
+                       .data = {
+                               .ptr = (void *)non_trusted_world_pk_buf,
+                               .len = (unsigned int)PK_DER_LEN
+                       }
+               }
+       }
+};
+/*
+ * SCP Firmware
+ */
+static const auth_img_desc_t scp_fw_key_cert = {
+       .img_id = SCP_FW_KEY_CERT_ID,
+       .img_type = IMG_CERT,
+       .parent = &trusted_key_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_SIG,
+                       .param.sig = {
+                               .pk = &trusted_world_pk,
+                               .sig = &sig,
+                               .alg = &sig_alg,
+                               .data = &raw_data
+                       }
+               },
+               [1] = {
+                       .type = AUTH_METHOD_NV_CTR,
+                       .param.nv_ctr = {
+                               .cert_nv_ctr = &trusted_nv_ctr,
+                               .plat_nv_ctr = &trusted_nv_ctr
+                       }
+               }
+       },
+       .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
+               [0] = {
+                       .type_desc = &scp_fw_content_pk,
+                       .data = {
+                               .ptr = (void *)content_pk_buf,
+                               .len = (unsigned int)PK_DER_LEN
+                       }
+               }
+       }
+};
+static const auth_img_desc_t scp_fw_content_cert = {
+       .img_id = SCP_FW_CONTENT_CERT_ID,
+       .img_type = IMG_CERT,
+       .parent = &scp_fw_key_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_SIG,
+                       .param.sig = {
+                               .pk = &scp_fw_content_pk,
+                               .sig = &sig,
+                               .alg = &sig_alg,
+                               .data = &raw_data
+                       }
+               },
+               [1] = {
+                       .type = AUTH_METHOD_NV_CTR,
+                       .param.nv_ctr = {
+                               .cert_nv_ctr = &trusted_nv_ctr,
+                               .plat_nv_ctr = &trusted_nv_ctr
+                       }
+               }
+       },
+       .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
+               [0] = {
+                       .type_desc = &scp_fw_hash,
+                       .data = {
+                               .ptr = (void *)scp_fw_hash_buf,
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               }
+       }
+};
+static const auth_img_desc_t scp_bl2_image = {
+       .img_id = SCP_BL2_IMAGE_ID,
+       .img_type = IMG_RAW,
+       .parent = &scp_fw_content_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_HASH,
+                       .param.hash = {
+                               .data = &raw_data,
+                               .hash = &scp_fw_hash
+                       }
+               }
+       }
+};
+/*
+ * SoC Firmware
+ */
+static const auth_img_desc_t soc_fw_key_cert = {
+       .img_id = SOC_FW_KEY_CERT_ID,
+       .img_type = IMG_CERT,
+       .parent = &trusted_key_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_SIG,
+                       .param.sig = {
+                               .pk = &trusted_world_pk,
+                               .sig = &sig,
+                               .alg = &sig_alg,
+                               .data = &raw_data
+                       }
+               },
+               [1] = {
+                       .type = AUTH_METHOD_NV_CTR,
+                       .param.nv_ctr = {
+                               .cert_nv_ctr = &trusted_nv_ctr,
+                               .plat_nv_ctr = &trusted_nv_ctr
+                       }
+               }
+       },
+       .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
+               [0] = {
+                       .type_desc = &soc_fw_content_pk,
+                       .data = {
+                               .ptr = (void *)content_pk_buf,
+                               .len = (unsigned int)PK_DER_LEN
+                       }
+               }
+       }
+};
+static const auth_img_desc_t soc_fw_content_cert = {
+       .img_id = SOC_FW_CONTENT_CERT_ID,
+       .img_type = IMG_CERT,
+       .parent = &soc_fw_key_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_SIG,
+                       .param.sig = {
+                               .pk = &soc_fw_content_pk,
+                               .sig = &sig,
+                               .alg = &sig_alg,
+                               .data = &raw_data
+                       }
+               },
+               [1] = {
+                       .type = AUTH_METHOD_NV_CTR,
+                       .param.nv_ctr = {
+                               .cert_nv_ctr = &trusted_nv_ctr,
+                               .plat_nv_ctr = &trusted_nv_ctr
+                       }
+               }
+       },
+       .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
+               [0] = {
+                       .type_desc = &soc_fw_hash,
+                       .data = {
+                               .ptr = (void *)soc_fw_hash_buf,
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               },
+               [1] = {
+                       .type_desc = &soc_fw_config_hash,
+                       .data = {
+                               .ptr = (void *)soc_fw_config_hash_buf,
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               }
+       }
+};
+static const auth_img_desc_t bl31_image = {
+       .img_id = BL31_IMAGE_ID,
+       .img_type = IMG_RAW,
+       .parent = &soc_fw_content_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_HASH,
+                       .param.hash = {
+                               .data = &raw_data,
+                               .hash = &soc_fw_hash
+                       }
+               }
+       }
+};
+/* SOC FW Config */
+static const auth_img_desc_t soc_fw_config = {
+       .img_id = SOC_FW_CONFIG_ID,
+       .img_type = IMG_RAW,
+       .parent = &soc_fw_content_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_HASH,
+                       .param.hash = {
+                               .data = &raw_data,
+                               .hash = &soc_fw_config_hash
+                       }
+               }
+       }
+};
+/*
+ * Trusted OS Firmware
+ */
+static const auth_img_desc_t trusted_os_fw_key_cert = {
+       .img_id = TRUSTED_OS_FW_KEY_CERT_ID,
+       .img_type = IMG_CERT,
+       .parent = &trusted_key_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_SIG,
+                       .param.sig = {
+                               .pk = &trusted_world_pk,
+                               .sig = &sig,
+                               .alg = &sig_alg,
+                               .data = &raw_data
+                       }
+               },
+               [1] = {
+                       .type = AUTH_METHOD_NV_CTR,
+                       .param.nv_ctr = {
+                               .cert_nv_ctr = &trusted_nv_ctr,
+                               .plat_nv_ctr = &trusted_nv_ctr
+                       }
+               }
+       },
+       .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
+               [0] = {
+                       .type_desc = &tos_fw_content_pk,
+                       .data = {
+                               .ptr = (void *)content_pk_buf,
+                               .len = (unsigned int)PK_DER_LEN
+                       }
+               }
+       }
+};
+static const auth_img_desc_t trusted_os_fw_content_cert = {
+       .img_id = TRUSTED_OS_FW_CONTENT_CERT_ID,
+       .img_type = IMG_CERT,
+       .parent = &trusted_os_fw_key_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_SIG,
+                       .param.sig = {
+                               .pk = &tos_fw_content_pk,
+                               .sig = &sig,
+                               .alg = &sig_alg,
+                               .data = &raw_data
+                       }
+               },
+               [1] = {
+                       .type = AUTH_METHOD_NV_CTR,
+                       .param.nv_ctr = {
+                               .cert_nv_ctr = &trusted_nv_ctr,
+                               .plat_nv_ctr = &trusted_nv_ctr
+                       }
+               }
+       },
+       .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
+               [0] = {
+                       .type_desc = &tos_fw_hash,
+                       .data = {
+                               .ptr = (void *)tos_fw_hash_buf,
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               },
+               [1] = {
+                       .type_desc = &tos_fw_extra1_hash,
+                       .data = {
+                               .ptr = (void *)tos_fw_extra1_hash_buf,
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               },
+               [2] = {
+                       .type_desc = &tos_fw_extra2_hash,
+                       .data = {
+                               .ptr = (void *)tos_fw_extra2_hash_buf,
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               },
+               [3] = {
+                       .type_desc = &tos_fw_config_hash,
+                       .data = {
+                               .ptr = (void *)tos_fw_config_hash_buf,
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               }
+       }
+};
+static const auth_img_desc_t bl32_image = {
+       .img_id = BL32_IMAGE_ID,
+       .img_type = IMG_RAW,
+       .parent = &trusted_os_fw_content_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_HASH,
+                       .param.hash = {
+                               .data = &raw_data,
+                               .hash = &tos_fw_hash
+                       }
+               }
+       }
+};
+static const auth_img_desc_t bl32_extra1_image = {
+       .img_id = BL32_EXTRA1_IMAGE_ID,
+       .img_type = IMG_RAW,
+       .parent = &trusted_os_fw_content_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_HASH,
+                       .param.hash = {
+                               .data = &raw_data,
+                               .hash = &tos_fw_extra1_hash
+                       }
+               }
+       }
+};
+static const auth_img_desc_t bl32_extra2_image = {
+       .img_id = BL32_EXTRA2_IMAGE_ID,
+       .img_type = IMG_RAW,
+       .parent = &trusted_os_fw_content_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_HASH,
+                       .param.hash = {
+                               .data = &raw_data,
+                               .hash = &tos_fw_extra2_hash
+                       }
+               }
+       }
+};
+/* TOS FW Config */
+static const auth_img_desc_t tos_fw_config = {
+       .img_id = TOS_FW_CONFIG_ID,
+       .img_type = IMG_RAW,
+       .parent = &trusted_os_fw_content_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_HASH,
+                       .param.hash = {
+                               .data = &raw_data,
+                               .hash = &tos_fw_config_hash
+                       }
+               }
+       }
+};
+/*
+ * Non-Trusted Firmware
+ */
+static const auth_img_desc_t non_trusted_fw_key_cert = {
+       .img_id = NON_TRUSTED_FW_KEY_CERT_ID,
+       .img_type = IMG_CERT,
+       .parent = &trusted_key_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_SIG,
+                       .param.sig = {
+                               .pk = &non_trusted_world_pk,
+                               .sig = &sig,
+                               .alg = &sig_alg,
+                               .data = &raw_data
+                       }
+               },
+               [1] = {
+                       .type = AUTH_METHOD_NV_CTR,
+                       .param.nv_ctr = {
+                               .cert_nv_ctr = &non_trusted_nv_ctr,
+                               .plat_nv_ctr = &non_trusted_nv_ctr
+                       }
+               }
+       },
+       .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
+               [0] = {
+                       .type_desc = &nt_fw_content_pk,
+                       .data = {
+                               .ptr = (void *)content_pk_buf,
+                               .len = (unsigned int)PK_DER_LEN
+                       }
+               }
+       }
+};
+static const auth_img_desc_t non_trusted_fw_content_cert = {
+       .img_id = NON_TRUSTED_FW_CONTENT_CERT_ID,
+       .img_type = IMG_CERT,
+       .parent = &non_trusted_fw_key_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_SIG,
+                       .param.sig = {
+                               .pk = &nt_fw_content_pk,
+                               .sig = &sig,
+                               .alg = &sig_alg,
+                               .data = &raw_data
+                       }
+               },
+               [1] = {
+                       .type = AUTH_METHOD_NV_CTR,
+                       .param.nv_ctr = {
+                               .cert_nv_ctr = &non_trusted_nv_ctr,
+                               .plat_nv_ctr = &non_trusted_nv_ctr
+                       }
+               }
+       },
+       .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
+               [0] = {
+                       .type_desc = &nt_world_bl_hash,
+                       .data = {
+                               .ptr = (void *)nt_world_bl_hash_buf,
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               },
+               [1] = {
+                       .type_desc = &nt_fw_config_hash,
+                       .data = {
+                               .ptr = (void *)nt_fw_config_hash_buf,
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               }
+       }
+};
+static const auth_img_desc_t bl33_image = {
+       .img_id = BL33_IMAGE_ID,
+       .img_type = IMG_RAW,
+       .parent = &non_trusted_fw_content_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_HASH,
+                       .param.hash = {
+                               .data = &raw_data,
+                               .hash = &nt_world_bl_hash
+                       }
+               }
+       }
+};
+/* NT FW Config */
+static const auth_img_desc_t nt_fw_config = {
+       .img_id = NT_FW_CONFIG_ID,
+       .img_type = IMG_RAW,
+       .parent = &non_trusted_fw_content_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_HASH,
+                       .param.hash = {
+                               .data = &raw_data,
+                               .hash = &nt_fw_config_hash
+                       }
+               }
+       }
+};
+/* Secure Partitions */
+#if defined(SPD_spmd)
+static const auth_img_desc_t sip_sp_content_cert = {
+       .img_id = SIP_SP_CONTENT_CERT_ID,
+       .img_type = IMG_CERT,
+       .parent = &trusted_key_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_SIG,
+                       .param.sig = {
+                               .pk = &trusted_world_pk,
+                               .sig = &sig,
+                               .alg = &sig_alg,
+                               .data = &raw_data
+                       }
+               },
+               [1] = {
+                       .type = AUTH_METHOD_NV_CTR,
+                       .param.nv_ctr = {
+                               .cert_nv_ctr = &trusted_nv_ctr,
+                               .plat_nv_ctr = &trusted_nv_ctr
+                       }
+               }
+       },
+       .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
+               [0] = {
+                       .type_desc = &sp_pkg1_hash,
+                       .data = {
+                               .ptr = (void *)sp_pkg_hash_buf[0],
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               },
+               [1] = {
+                       .type_desc = &sp_pkg2_hash,
+                       .data = {
+                               .ptr = (void *)sp_pkg_hash_buf[1],
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               },
+               [2] = {
+                       .type_desc = &sp_pkg3_hash,
+                       .data = {
+                               .ptr = (void *)sp_pkg_hash_buf[2],
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               },
+               [3] = {
+                       .type_desc = &sp_pkg4_hash,
+                       .data = {
+                               .ptr = (void *)sp_pkg_hash_buf[3],
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               },
+               [4] = {
+                       .type_desc = &sp_pkg5_hash,
+                       .data = {
+                               .ptr = (void *)sp_pkg_hash_buf[4],
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               },
+               [5] = {
+                       .type_desc = &sp_pkg6_hash,
+                       .data = {
+                               .ptr = (void *)sp_pkg_hash_buf[5],
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               },
+               [6] = {
+                       .type_desc = &sp_pkg7_hash,
+                       .data = {
+                               .ptr = (void *)sp_pkg_hash_buf[6],
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               },
+               [7] = {
+                       .type_desc = &sp_pkg8_hash,
+                       .data = {
+                               .ptr = (void *)sp_pkg_hash_buf[7],
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               }
+       }
+};
+
+DEFINE_SIP_SP_PKG(1);
+DEFINE_SIP_SP_PKG(2);
+DEFINE_SIP_SP_PKG(3);
+DEFINE_SIP_SP_PKG(4);
+DEFINE_SIP_SP_PKG(5);
+DEFINE_SIP_SP_PKG(6);
+DEFINE_SIP_SP_PKG(7);
+DEFINE_SIP_SP_PKG(8);
+#endif /* SPD_spmd */
+
+#if ARM_ETHOSN_NPU_TZMP1
+static const auth_img_desc_t npu_fw_key_cert = {
+       .img_id = ARM_ETHOSN_NPU_FW_KEY_CERT_ID,
+       .img_type = IMG_CERT,
+       .parent = &trusted_key_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_SIG,
+                       .param.sig = {
+                               .pk = &non_trusted_world_pk,
+                               .sig = &sig,
+                               .alg = &sig_alg,
+                               .data = &raw_data
+                       }
+               },
+               [1] = {
+                       .type = AUTH_METHOD_NV_CTR,
+                       .param.nv_ctr = {
+                               .cert_nv_ctr = &non_trusted_nv_ctr,
+                               .plat_nv_ctr = &non_trusted_nv_ctr
+                       }
+               }
+       },
+       .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
+               [0] = {
+                       .type_desc = &npu_fw_cert_pk,
+                       .data = {
+                               .ptr = (void *)content_pk_buf,
+                               .len = (unsigned int)PK_DER_LEN
+                       }
+               }
+       }
+};
+
+static const auth_img_desc_t npu_fw_content_cert = {
+       .img_id = ARM_ETHOSN_NPU_FW_CONTENT_CERT_ID,
+       .img_type = IMG_CERT,
+       .parent = &npu_fw_key_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_SIG,
+                       .param.sig = {
+                               .pk = &npu_fw_cert_pk,
+                               .sig = &sig,
+                               .alg = &sig_alg,
+                               .data = &raw_data
+                       }
+               },
+               [1] = {
+                       .type = AUTH_METHOD_NV_CTR,
+                       .param.nv_ctr = {
+                               .cert_nv_ctr = &non_trusted_nv_ctr,
+                               .plat_nv_ctr = &non_trusted_nv_ctr
+                       }
+               }
+       },
+       .authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {
+               [0] = {
+                       .type_desc = &npu_fw_image_hash,
+                       .data = {
+                               .ptr = (void *)npu_fw_image_hash_buf,
+                               .len = (unsigned int)HASH_DER_LEN
+                       }
+               },
+       }
+};
+
+static const auth_img_desc_t npu_fw_image = {
+       .img_id = ARM_ETHOSN_NPU_FW_IMAGE_ID,
+       .img_type = IMG_RAW,
+       .parent = &npu_fw_content_cert,
+       .img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {
+               [0] = {
+                       .type = AUTH_METHOD_HASH,
+                       .param.hash = {
+                               .data = &raw_data,
+                               .hash = &npu_fw_image_hash
+                       }
+               }
+       }
+};
+#endif /* ARM_ETHOSN_NPU_TZMP1 */
+
+
+static const auth_img_desc_t * const cot_desc[] = {
+       [TRUSTED_BOOT_FW_CERT_ID]               =       &trusted_boot_fw_cert,
+       [HW_CONFIG_ID]                          =       &hw_config,
+       [TRUSTED_KEY_CERT_ID]                   =       &trusted_key_cert,
+       [SCP_FW_KEY_CERT_ID]                    =       &scp_fw_key_cert,
+       [SCP_FW_CONTENT_CERT_ID]                =       &scp_fw_content_cert,
+       [SCP_BL2_IMAGE_ID]                      =       &scp_bl2_image,
+       [SOC_FW_KEY_CERT_ID]                    =       &soc_fw_key_cert,
+       [SOC_FW_CONTENT_CERT_ID]                =       &soc_fw_content_cert,
+       [BL31_IMAGE_ID]                         =       &bl31_image,
+       [SOC_FW_CONFIG_ID]                      =       &soc_fw_config,
+       [TRUSTED_OS_FW_KEY_CERT_ID]             =       &trusted_os_fw_key_cert,
+       [TRUSTED_OS_FW_CONTENT_CERT_ID]         =       &trusted_os_fw_content_cert,
+       [BL32_IMAGE_ID]                         =       &bl32_image,
+       [BL32_EXTRA1_IMAGE_ID]                  =       &bl32_extra1_image,
+       [BL32_EXTRA2_IMAGE_ID]                  =       &bl32_extra2_image,
+       [TOS_FW_CONFIG_ID]                      =       &tos_fw_config,
+       [NON_TRUSTED_FW_KEY_CERT_ID]            =       &non_trusted_fw_key_cert,
+       [NON_TRUSTED_FW_CONTENT_CERT_ID]        =       &non_trusted_fw_content_cert,
+       [BL33_IMAGE_ID]                         =       &bl33_image,
+       [NT_FW_CONFIG_ID]                       =       &nt_fw_config,
+#if defined(SPD_spmd)
+       [SIP_SP_CONTENT_CERT_ID]                =       &sip_sp_content_cert,
+       [SP_PKG1_ID]                            =       &sp_pkg1,
+       [SP_PKG2_ID]                            =       &sp_pkg2,
+       [SP_PKG3_ID]                            =       &sp_pkg3,
+       [SP_PKG4_ID]                            =       &sp_pkg4,
+       [SP_PKG5_ID]                            =       &sp_pkg5,
+       [SP_PKG6_ID]                            =       &sp_pkg6,
+       [SP_PKG7_ID]                            =       &sp_pkg7,
+       [SP_PKG8_ID]                            =       &sp_pkg8,
+#endif
+#if ARM_ETHOSN_NPU_TZMP1
+       [ARM_ETHOSN_NPU_FW_KEY_CERT_ID]         =       &npu_fw_key_cert,
+       [ARM_ETHOSN_NPU_FW_CONTENT_CERT_ID]     =       &npu_fw_content_cert,
+       [ARM_ETHOSN_NPU_FW_IMAGE_ID]            =       &npu_fw_image,
+#endif /* ARM_ETHOSN_NPU_TZMP1 */
+};
+
+/* Register the CoT in the authentication module */
+REGISTER_COT(cot_desc);
index d99b16c829cf83732b7cdefb2ac2be06ba3247ec..a4e64077158e21600de2f5fe05891a5e915e2e97 100644 (file)
@@ -106,8 +106,16 @@ BL1_SOURCES                +=      drivers/arm/css/sds/sds.c
 endif
 
 ifeq (${TRUSTED_BOARD_BOOT}, 1)
-BL1_SOURCES            +=      plat/arm/board/juno/juno_trusted_boot.c
-BL2_SOURCES            +=      plat/arm/board/juno/juno_trusted_boot.c
+   # Enable Juno specific TBBR images
+   $(eval $(call add_define,PLAT_TBBR_IMG_DEF))
+   DTC_CPPFLAGS += ${PLAT_INCLUDES}
+
+   BL1_SOURCES         +=      plat/arm/board/juno/juno_trusted_boot.c
+   BL2_SOURCES         +=      plat/arm/board/juno/juno_trusted_boot.c
+
+   ifeq (${COT_DESC_IN_DTB},0)
+      BL2_SOURCES      +=      plat/arm/board/juno/juno_tbbr_cot_bl2.c
+   endif
 endif
 
 endif
index 3d7b3613e1ea6b45aaa92cc8d2c611803f7bb842..e512192444c0e8cd03e67dc09bbbea754b859106 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2021, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2016-2023, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -220,8 +220,20 @@ static bl_mem_params_node_t bl2_mem_params_descs[] = {
                SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY,
                        VERSION_2, image_info_t, IMAGE_ATTRIB_SKIP_LOADING),
                .next_handoff_image_id = INVALID_IMAGE_ID,
-       }
+       },
 #endif /* EL3_PAYLOAD_BASE */
+
+# if ARM_ETHOSN_NPU_TZMP1
+       {
+               .image_id = ARM_ETHOSN_NPU_FW_IMAGE_ID,
+               SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY,
+                                     VERSION_2, image_info_t, 0),
+               .image_info.image_base = ARM_ETHOSN_NPU_FW_IMAGE_BASE,
+               .image_info.image_max_size = ARM_ETHOSN_NPU_FW_IMAGE_LIMIT -
+                       ARM_ETHOSN_NPU_FW_IMAGE_BASE,
+               .next_handoff_image_id = INVALID_IMAGE_ID,
+       },
+# endif
 };
 
 REGISTER_BL_IMAGE_DESCS(bl2_mem_params_descs)
index dc875e526dcc7138c803ac061c5ed15a7a7c6a19..e424ec07cde818a7c34b1791ff41a47493ef525c 100644 (file)
@@ -132,7 +132,29 @@ ifeq (${ARM_ETHOSN_NPU_TZMP1},1)
   else
     $(error ARM_ETHOSN_NPU_TZMP1 only supported on Juno platform, not ${PLAT})
   endif
-endif
+
+  ifeq (${TRUSTED_BOARD_BOOT},0)
+    # We rely on TRUSTED_BOARD_BOOT to prevent the firmware code from being
+    # tampered with, which is required to protect the confidentiality of protected
+    # inference data.
+    $(error ARM_ETHOSN_NPU_TZMP1 is only available if TRUSTED_BOARD_BOOT is enabled)
+  endif
+
+  # We need the FW certificate and key certificate
+  $(eval $(call TOOL_ADD_PAYLOAD,${BUILD_PLAT}/npu_fw_key.crt,--npu-fw-key-cert))
+  $(eval $(call TOOL_ADD_PAYLOAD,${BUILD_PLAT}/npu_fw_content.crt,--npu-fw-cert))
+  # Needed for our OIDs to be available in tbbr_cot_bl2.c
+  $(eval $(call add_define, PLAT_DEF_OID))
+  PLAT_INCLUDES        +=      -I${PLAT_DIR}certificate/include
+  PLAT_INCLUDES        +=      -Iinclude/drivers/arm/
+
+  # We need the firmware to be built into the FIP
+  $(eval $(call TOOL_ADD_IMG,ARM_ETHOSN_NPU_FW,--npu-fw))
+
+  # Needed so that UUIDs from the FIP are available in BL2
+  $(eval $(call add_define,PLAT_DEF_FIP_UUID))
+  PLAT_INCLUDES                +=      -I${PLAT_DIR}fip
+endif # ARM_ETHOSN_NPU_TZMP1
 
 # Use an implementation of SHA-256 with a smaller memory footprint but reduced
 # speed.
@@ -396,8 +418,11 @@ ifneq (${TRUSTED_BOARD_BOOT},0)
         ifneq (${COT_DESC_IN_DTB},0)
             BL2_SOURCES        +=      lib/fconf/fconf_cot_getter.c
         else
-            BL2_SOURCES        +=      drivers/auth/tbbr/tbbr_cot_common.c     \
-                               drivers/auth/tbbr/tbbr_cot_bl2.c
+            BL2_SOURCES        +=      drivers/auth/tbbr/tbbr_cot_common.c
+           # Juno has its own TBBR CoT file for BL2
+            ifneq (${PLAT},juno)
+                BL2_SOURCES    +=      drivers/auth/tbbr/tbbr_cot_bl2.c
+            endif
         endif
     else ifeq (${COT},dualroot)
         AUTH_SOURCES   +=      drivers/auth/dualroot/cot.c
index dfaaaae074b8f62d93b429647f14bab079c11eb0..743cc90d9e10b7c9b1657b6bea0d30138f7c0a3f 100644 (file)
@@ -68,6 +68,9 @@ const io_uuid_spec_t arm_uuid_spec[MAX_NUMBER_IDS] = {
        [TOS_FW_CONFIG_ID] = {UUID_TOS_FW_CONFIG},
        [NT_FW_CONFIG_ID] = {UUID_NT_FW_CONFIG},
        [RMM_IMAGE_ID] = {UUID_REALM_MONITOR_MGMT_FIRMWARE},
+#if ARM_ETHOSN_NPU_TZMP1
+       [ARM_ETHOSN_NPU_FW_IMAGE_ID] = {UUID_ETHOSN_FW},
+#endif /* ARM_ETHOSN_NPU_TZMP1 */
 #endif /* ARM_IO_IN_DTB */
 #if TRUSTED_BOARD_BOOT
        [TRUSTED_BOOT_FW_CERT_ID] = {UUID_TRUSTED_BOOT_FW_CERT},
@@ -88,6 +91,10 @@ const io_uuid_spec_t arm_uuid_spec[MAX_NUMBER_IDS] = {
        [SIP_SP_CONTENT_CERT_ID] = {UUID_SIP_SECURE_PARTITION_CONTENT_CERT},
        [PLAT_SP_CONTENT_CERT_ID] = {UUID_PLAT_SECURE_PARTITION_CONTENT_CERT},
 #endif
+#if ARM_ETHOSN_NPU_TZMP1
+       [ARM_ETHOSN_NPU_FW_KEY_CERT_ID] = {UUID_ETHOSN_FW_KEY_CERTIFICATE},
+       [ARM_ETHOSN_NPU_FW_CONTENT_CERT_ID] = {UUID_ETHOSN_FW_CONTENT_CERTIFICATE},
+#endif /* ARM_ETHOSN_NPU_TZMP1 */
 #endif /* ARM_IO_IN_DTB */
 #endif /* TRUSTED_BOARD_BOOT */
 };
@@ -191,6 +198,13 @@ struct plat_io_policy policies[MAX_NUMBER_IDS] = {
                (uintptr_t)&arm_uuid_spec[NT_FW_CONFIG_ID],
                open_fip
        },
+#if ARM_ETHOSN_NPU_TZMP1
+       [ARM_ETHOSN_NPU_FW_IMAGE_ID] = {
+               &fip_dev_handle,
+               (uintptr_t)&arm_uuid_spec[ARM_ETHOSN_NPU_FW_IMAGE_ID],
+               open_fip
+       },
+#endif /* ARM_ETHOSN_NPU_TZMP1 */
 #endif /* ARM_IO_IN_DTB */
 #if TRUSTED_BOARD_BOOT
        [TRUSTED_BOOT_FW_CERT_ID] = {
@@ -271,6 +285,18 @@ struct plat_io_policy policies[MAX_NUMBER_IDS] = {
                open_fip
        },
 #endif
+#if ARM_ETHOSN_NPU_TZMP1
+       [ARM_ETHOSN_NPU_FW_KEY_CERT_ID] = {
+               &fip_dev_handle,
+               (uintptr_t)&arm_uuid_spec[ARM_ETHOSN_NPU_FW_KEY_CERT_ID],
+               open_fip
+       },
+       [ARM_ETHOSN_NPU_FW_CONTENT_CERT_ID] = {
+               &fip_dev_handle,
+               (uintptr_t)&arm_uuid_spec[ARM_ETHOSN_NPU_FW_CONTENT_CERT_ID],
+               open_fip
+       },
+#endif /* ARM_ETHOSN_NPU_TZMP1 */
 #endif /* ARM_IO_IN_DTB */
 #endif /* TRUSTED_BOARD_BOOT */
 };
@@ -279,6 +305,12 @@ struct plat_io_policy policies[MAX_NUMBER_IDS] = {
 
 #define FCONF_ARM_IO_UUID_NUM_BASE     U(10)
 
+#if ARM_ETHOSN_NPU_TZMP1
+#define FCONF_ARM_IO_UUID_NUM_NPU      U(1)
+#else
+#define FCONF_ARM_IO_UUID_NUM_NPU      U(0)
+#endif
+
 #if TRUSTED_BOARD_BOOT
 #define FCONF_ARM_IO_UUID_NUM_TBB      U(12)
 #else
@@ -291,8 +323,17 @@ struct plat_io_policy policies[MAX_NUMBER_IDS] = {
 #define FCONF_ARM_IO_UUID_NUM_SPD      U(0)
 #endif /* TRUSTED_BOARD_BOOT && defined(SPD_spmd) */
 
+#if TRUSTED_BOARD_BOOT && ARM_ETHOSN_NPU_TZMP1
+#define FCONF_ARM_IO_UUID_NUM_NPU_TBB  U(2)
+#else
+#define FCONF_ARM_IO_UUID_NUM_NPU_TBB  U(0)
+#endif /* TRUSTED_BOARD_BOOT && ARM_ETHOSN_NPU_TZMP1 */
+
 #define FCONF_ARM_IO_UUID_NUMBER       FCONF_ARM_IO_UUID_NUM_BASE + \
-                                       FCONF_ARM_IO_UUID_NUM_TBB + FCONF_ARM_IO_UUID_NUM_SPD
+                                       FCONF_ARM_IO_UUID_NUM_NPU + \
+                                       FCONF_ARM_IO_UUID_NUM_TBB + \
+                                       FCONF_ARM_IO_UUID_NUM_SPD + \
+                                       FCONF_ARM_IO_UUID_NUM_NPU_TBB
 
 static io_uuid_spec_t fconf_arm_uuids[FCONF_ARM_IO_UUID_NUMBER];
 static OBJECT_POOL_ARRAY(fconf_arm_uuids_pool, fconf_arm_uuids);
@@ -314,6 +355,9 @@ static const struct policies_load_info load_info[FCONF_ARM_IO_UUID_NUMBER] = {
        {SOC_FW_CONFIG_ID, "soc_fw_cfg_uuid"},
        {TOS_FW_CONFIG_ID, "tos_fw_cfg_uuid"},
        {NT_FW_CONFIG_ID, "nt_fw_cfg_uuid"},
+#if ARM_ETHOSN_NPU_TZMP1
+       {ARM_ETHOSN_NPU_FW_IMAGE_ID, "arm_ethosn_npu_fw_uuid"},
+#endif /* ARM_ETHOSN_NPU_TZMP1 */
 #if TRUSTED_BOARD_BOOT
        {CCA_CONTENT_CERT_ID, "cca_cert_uuid"},
        {CORE_SWD_KEY_CERT_ID, "core_swd_cert_uuid"},
@@ -331,6 +375,10 @@ static const struct policies_load_info load_info[FCONF_ARM_IO_UUID_NUMBER] = {
        {SIP_SP_CONTENT_CERT_ID, "sip_sp_content_cert_uuid"},
        {PLAT_SP_CONTENT_CERT_ID, "plat_sp_content_cert_uuid"},
 #endif
+#if ARM_ETHOSN_NPU_TZMP1
+       {ARM_ETHOSN_NPU_FW_KEY_CERT_ID, "arm_ethosn_npu_fw_key_cert_uuid"},
+       {ARM_ETHOSN_NPU_FW_CONTENT_CERT_ID, "arm_ethosn_npu_fw_content_cert_uuid"},
+#endif /* ARM_ETHOSN_NPU_TZMP1 */
 #endif /* TRUSTED_BOARD_BOOT */
 };