10a6e7e3bSLouis Mayencourt /* 2e208f324SRob Hughes * Copyright (c) 2019-2023, ARM Limited. All rights reserved. 30a6e7e3bSLouis Mayencourt * 40a6e7e3bSLouis Mayencourt * SPDX-License-Identifier: BSD-3-Clause 50a6e7e3bSLouis Mayencourt */ 60a6e7e3bSLouis Mayencourt 70a6e7e3bSLouis Mayencourt #include <assert.h> 80a6e7e3bSLouis Mayencourt 90a6e7e3bSLouis Mayencourt #include <common/debug.h> 100a6e7e3bSLouis Mayencourt #include <common/fdt_wrappers.h> 110a6e7e3bSLouis Mayencourt #include <drivers/io/io_storage.h> 12ef1daa42SManish V Badarkhe #include <drivers/partition/partition.h> 130a6e7e3bSLouis Mayencourt #include <lib/object_pool.h> 140a6e7e3bSLouis Mayencourt #include <libfdt.h> 150a6e7e3bSLouis Mayencourt #include <tools_share/firmware_image_package.h> 160a6e7e3bSLouis Mayencourt 170a6e7e3bSLouis Mayencourt #include <plat/arm/common/arm_fconf_getter.h> 180a6e7e3bSLouis Mayencourt #include <plat/arm/common/arm_fconf_io_storage.h> 190a6e7e3bSLouis Mayencourt #include <platform_def.h> 200a6e7e3bSLouis Mayencourt 212f1177b2SManish V Badarkhe #if PSA_FWU_SUPPORT 222f1177b2SManish V Badarkhe /* metadata entry details */ 232f1177b2SManish V Badarkhe static io_block_spec_t fwu_metadata_spec; 242f1177b2SManish V Badarkhe #endif /* PSA_FWU_SUPPORT */ 252f1177b2SManish V Badarkhe 26ef1daa42SManish V Badarkhe io_block_spec_t fip_block_spec = { 27ef1daa42SManish V Badarkhe /* 28ef1daa42SManish V Badarkhe * This is fixed FIP address used by BL1, BL2 loads partition table 29ef1daa42SManish V Badarkhe * to get FIP address. 30ef1daa42SManish V Badarkhe */ 31ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT 32ef1daa42SManish V Badarkhe .offset = PLAT_ARM_FLASH_IMAGE_BASE + PLAT_ARM_FIP_OFFSET_IN_GPT, 33ef1daa42SManish V Badarkhe #else 3449e9ac28SManish V Badarkhe .offset = PLAT_ARM_FLASH_IMAGE_BASE, 35ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */ 3649e9ac28SManish V Badarkhe .length = PLAT_ARM_FLASH_IMAGE_MAX_SIZE 370a6e7e3bSLouis Mayencourt }; 380a6e7e3bSLouis Mayencourt 39ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT 40ef1daa42SManish V Badarkhe static const io_block_spec_t gpt_spec = { 41ef1daa42SManish V Badarkhe .offset = PLAT_ARM_FLASH_IMAGE_BASE, 42ef1daa42SManish V Badarkhe /* 43ef1daa42SManish V Badarkhe * PLAT_PARTITION_BLOCK_SIZE = 512 44ef1daa42SManish V Badarkhe * PLAT_PARTITION_MAX_ENTRIES = 128 45ef1daa42SManish V Badarkhe * each sector has 4 partition entries, and there are 46ef1daa42SManish V Badarkhe * 2 reserved sectors i.e. protective MBR and primary 47ef1daa42SManish V Badarkhe * GPT header hence length gets calculated as, 48ef1daa42SManish V Badarkhe * length = 512 * (128/4 + 2) 49ef1daa42SManish V Badarkhe */ 50ef1daa42SManish V Badarkhe .length = PLAT_PARTITION_BLOCK_SIZE * 51ef1daa42SManish V Badarkhe (PLAT_PARTITION_MAX_ENTRIES / 4 + 2), 52ef1daa42SManish V Badarkhe }; 53ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */ 54ef1daa42SManish V Badarkhe 550a6e7e3bSLouis Mayencourt const io_uuid_spec_t arm_uuid_spec[MAX_NUMBER_IDS] = { 560a6e7e3bSLouis Mayencourt [BL2_IMAGE_ID] = {UUID_TRUSTED_BOOT_FIRMWARE_BL2}, 570a6e7e3bSLouis Mayencourt [TB_FW_CONFIG_ID] = {UUID_TB_FW_CONFIG}, 58243875eaSLouis Mayencourt [FW_CONFIG_ID] = {UUID_FW_CONFIG}, 59a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB 60a6de824fSLouis Mayencourt [SCP_BL2_IMAGE_ID] = {UUID_SCP_FIRMWARE_SCP_BL2}, 61a6de824fSLouis Mayencourt [BL31_IMAGE_ID] = {UUID_EL3_RUNTIME_FIRMWARE_BL31}, 62a6de824fSLouis Mayencourt [BL32_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32}, 63a6de824fSLouis Mayencourt [BL32_EXTRA1_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA1}, 64a6de824fSLouis Mayencourt [BL32_EXTRA2_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA2}, 65a6de824fSLouis Mayencourt [BL33_IMAGE_ID] = {UUID_NON_TRUSTED_FIRMWARE_BL33}, 66a6de824fSLouis Mayencourt [HW_CONFIG_ID] = {UUID_HW_CONFIG}, 67a6de824fSLouis Mayencourt [SOC_FW_CONFIG_ID] = {UUID_SOC_FW_CONFIG}, 68a6de824fSLouis Mayencourt [TOS_FW_CONFIG_ID] = {UUID_TOS_FW_CONFIG}, 69a6de824fSLouis Mayencourt [NT_FW_CONFIG_ID] = {UUID_NT_FW_CONFIG}, 709d870b79SZelalem Aweke [RMM_IMAGE_ID] = {UUID_REALM_MONITOR_MGMT_FIRMWARE}, 71*352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 72*352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_IMAGE_ID] = {UUID_ETHOSN_FW}, 73*352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 74a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */ 750a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT 760a6e7e3bSLouis Mayencourt [TRUSTED_BOOT_FW_CERT_ID] = {UUID_TRUSTED_BOOT_FW_CERT}, 77a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB 78d5de70ceSlaurenw-arm [CCA_CONTENT_CERT_ID] = {UUID_CCA_CONTENT_CERT}, 79d5de70ceSlaurenw-arm [CORE_SWD_KEY_CERT_ID] = {UUID_CORE_SWD_KEY_CERT}, 80d5de70ceSlaurenw-arm [PLAT_KEY_CERT_ID] = {UUID_PLAT_KEY_CERT}, 81a6de824fSLouis Mayencourt [TRUSTED_KEY_CERT_ID] = {UUID_TRUSTED_KEY_CERT}, 82a6de824fSLouis Mayencourt [SCP_FW_KEY_CERT_ID] = {UUID_SCP_FW_KEY_CERT}, 83a6de824fSLouis Mayencourt [SOC_FW_KEY_CERT_ID] = {UUID_SOC_FW_KEY_CERT}, 84a6de824fSLouis Mayencourt [TRUSTED_OS_FW_KEY_CERT_ID] = {UUID_TRUSTED_OS_FW_KEY_CERT}, 85a6de824fSLouis Mayencourt [NON_TRUSTED_FW_KEY_CERT_ID] = {UUID_NON_TRUSTED_FW_KEY_CERT}, 86a6de824fSLouis Mayencourt [SCP_FW_CONTENT_CERT_ID] = {UUID_SCP_FW_CONTENT_CERT}, 87a6de824fSLouis Mayencourt [SOC_FW_CONTENT_CERT_ID] = {UUID_SOC_FW_CONTENT_CERT}, 88a6de824fSLouis Mayencourt [TRUSTED_OS_FW_CONTENT_CERT_ID] = {UUID_TRUSTED_OS_FW_CONTENT_CERT}, 89a6de824fSLouis Mayencourt [NON_TRUSTED_FW_CONTENT_CERT_ID] = {UUID_NON_TRUSTED_FW_CONTENT_CERT}, 9044f1aa8eSManish Pandey #if defined(SPD_spmd) 9103a5225cSManish Pandey [SIP_SP_CONTENT_CERT_ID] = {UUID_SIP_SECURE_PARTITION_CONTENT_CERT}, 92990d972fSManish Pandey [PLAT_SP_CONTENT_CERT_ID] = {UUID_PLAT_SECURE_PARTITION_CONTENT_CERT}, 9344f1aa8eSManish Pandey #endif 94*352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 95*352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_KEY_CERT_ID] = {UUID_ETHOSN_FW_KEY_CERTIFICATE}, 96*352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_CONTENT_CERT_ID] = {UUID_ETHOSN_FW_CONTENT_CERTIFICATE}, 97*352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 98a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */ 990a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */ 1000a6e7e3bSLouis Mayencourt }; 1010a6e7e3bSLouis Mayencourt 1020a6e7e3bSLouis Mayencourt /* By default, ARM platforms load images from the FIP */ 1030a6e7e3bSLouis Mayencourt struct plat_io_policy policies[MAX_NUMBER_IDS] = { 104ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT 105ef1daa42SManish V Badarkhe [GPT_IMAGE_ID] = { 106ef1daa42SManish V Badarkhe &memmap_dev_handle, 107ef1daa42SManish V Badarkhe (uintptr_t)&gpt_spec, 108ef1daa42SManish V Badarkhe open_memmap 109ef1daa42SManish V Badarkhe }, 110ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */ 1112f1177b2SManish V Badarkhe #if PSA_FWU_SUPPORT 1122f1177b2SManish V Badarkhe [FWU_METADATA_IMAGE_ID] = { 1132f1177b2SManish V Badarkhe &memmap_dev_handle, 1142f1177b2SManish V Badarkhe /* filled runtime from partition information */ 1152f1177b2SManish V Badarkhe (uintptr_t)&fwu_metadata_spec, 1162f1177b2SManish V Badarkhe open_memmap 1172f1177b2SManish V Badarkhe }, 1182f1177b2SManish V Badarkhe [BKUP_FWU_METADATA_IMAGE_ID] = { 1192f1177b2SManish V Badarkhe &memmap_dev_handle, 1202f1177b2SManish V Badarkhe /* filled runtime from partition information */ 1212f1177b2SManish V Badarkhe (uintptr_t)&fwu_metadata_spec, 1222f1177b2SManish V Badarkhe open_memmap 1232f1177b2SManish V Badarkhe }, 1242f1177b2SManish V Badarkhe #endif /* PSA_FWU_SUPPORT */ 1250a6e7e3bSLouis Mayencourt [FIP_IMAGE_ID] = { 1260a6e7e3bSLouis Mayencourt &memmap_dev_handle, 1270a6e7e3bSLouis Mayencourt (uintptr_t)&fip_block_spec, 1280a6e7e3bSLouis Mayencourt open_memmap 1290a6e7e3bSLouis Mayencourt }, 1300a6e7e3bSLouis Mayencourt [BL2_IMAGE_ID] = { 1310a6e7e3bSLouis Mayencourt &fip_dev_handle, 1320a6e7e3bSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL2_IMAGE_ID], 1330a6e7e3bSLouis Mayencourt open_fip 1340a6e7e3bSLouis Mayencourt }, 1350a6e7e3bSLouis Mayencourt [TB_FW_CONFIG_ID] = { 1360a6e7e3bSLouis Mayencourt &fip_dev_handle, 1370a6e7e3bSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TB_FW_CONFIG_ID], 1380a6e7e3bSLouis Mayencourt open_fip 1390a6e7e3bSLouis Mayencourt }, 140243875eaSLouis Mayencourt [FW_CONFIG_ID] = { 141243875eaSLouis Mayencourt &fip_dev_handle, 142243875eaSLouis Mayencourt (uintptr_t)&arm_uuid_spec[FW_CONFIG_ID], 143243875eaSLouis Mayencourt open_fip 144243875eaSLouis Mayencourt }, 145a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB 146a6de824fSLouis Mayencourt [SCP_BL2_IMAGE_ID] = { 147a6de824fSLouis Mayencourt &fip_dev_handle, 148a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SCP_BL2_IMAGE_ID], 149a6de824fSLouis Mayencourt open_fip 150a6de824fSLouis Mayencourt }, 151a6de824fSLouis Mayencourt [BL31_IMAGE_ID] = { 152a6de824fSLouis Mayencourt &fip_dev_handle, 153a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL31_IMAGE_ID], 154a6de824fSLouis Mayencourt open_fip 155a6de824fSLouis Mayencourt }, 156a6de824fSLouis Mayencourt [BL32_IMAGE_ID] = { 157a6de824fSLouis Mayencourt &fip_dev_handle, 158a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL32_IMAGE_ID], 159a6de824fSLouis Mayencourt open_fip 160a6de824fSLouis Mayencourt }, 161a6de824fSLouis Mayencourt [BL32_EXTRA1_IMAGE_ID] = { 162a6de824fSLouis Mayencourt &fip_dev_handle, 163a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL32_EXTRA1_IMAGE_ID], 164a6de824fSLouis Mayencourt open_fip 165a6de824fSLouis Mayencourt }, 166a6de824fSLouis Mayencourt [BL32_EXTRA2_IMAGE_ID] = { 167a6de824fSLouis Mayencourt &fip_dev_handle, 168a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL32_EXTRA2_IMAGE_ID], 169a6de824fSLouis Mayencourt open_fip 170a6de824fSLouis Mayencourt }, 171a6de824fSLouis Mayencourt [BL33_IMAGE_ID] = { 172a6de824fSLouis Mayencourt &fip_dev_handle, 173a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL33_IMAGE_ID], 174a6de824fSLouis Mayencourt open_fip 175a6de824fSLouis Mayencourt }, 1769d870b79SZelalem Aweke [RMM_IMAGE_ID] = { 1779d870b79SZelalem Aweke &fip_dev_handle, 1789d870b79SZelalem Aweke (uintptr_t)&arm_uuid_spec[RMM_IMAGE_ID], 1799d870b79SZelalem Aweke open_fip 1809d870b79SZelalem Aweke }, 181a6de824fSLouis Mayencourt [HW_CONFIG_ID] = { 182a6de824fSLouis Mayencourt &fip_dev_handle, 183a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[HW_CONFIG_ID], 184a6de824fSLouis Mayencourt open_fip 185a6de824fSLouis Mayencourt }, 186a6de824fSLouis Mayencourt [SOC_FW_CONFIG_ID] = { 187a6de824fSLouis Mayencourt &fip_dev_handle, 188a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SOC_FW_CONFIG_ID], 189a6de824fSLouis Mayencourt open_fip 190a6de824fSLouis Mayencourt }, 191a6de824fSLouis Mayencourt [TOS_FW_CONFIG_ID] = { 192a6de824fSLouis Mayencourt &fip_dev_handle, 193a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TOS_FW_CONFIG_ID], 194a6de824fSLouis Mayencourt open_fip 195a6de824fSLouis Mayencourt }, 196a6de824fSLouis Mayencourt [NT_FW_CONFIG_ID] = { 197a6de824fSLouis Mayencourt &fip_dev_handle, 198a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[NT_FW_CONFIG_ID], 199a6de824fSLouis Mayencourt open_fip 200a6de824fSLouis Mayencourt }, 201*352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 202*352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_IMAGE_ID] = { 20333bcaed1SRob Hughes &fip_dev_handle, 204*352366edSRajasekaran Kalidoss (uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_IMAGE_ID], 20533bcaed1SRob Hughes open_fip 20633bcaed1SRob Hughes }, 207*352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 208a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */ 2090a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT 2100a6e7e3bSLouis Mayencourt [TRUSTED_BOOT_FW_CERT_ID] = { 2110a6e7e3bSLouis Mayencourt &fip_dev_handle, 2120a6e7e3bSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TRUSTED_BOOT_FW_CERT_ID], 2130a6e7e3bSLouis Mayencourt open_fip 2140a6e7e3bSLouis Mayencourt }, 215a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB 216d5de70ceSlaurenw-arm [CCA_CONTENT_CERT_ID] = { 217d5de70ceSlaurenw-arm &fip_dev_handle, 218d5de70ceSlaurenw-arm (uintptr_t)&arm_uuid_spec[CCA_CONTENT_CERT_ID], 219d5de70ceSlaurenw-arm open_fip 220d5de70ceSlaurenw-arm }, 221d5de70ceSlaurenw-arm [CORE_SWD_KEY_CERT_ID] = { 222d5de70ceSlaurenw-arm &fip_dev_handle, 223d5de70ceSlaurenw-arm (uintptr_t)&arm_uuid_spec[CORE_SWD_KEY_CERT_ID], 224d5de70ceSlaurenw-arm open_fip 225d5de70ceSlaurenw-arm }, 226d5de70ceSlaurenw-arm [PLAT_KEY_CERT_ID] = { 227d5de70ceSlaurenw-arm &fip_dev_handle, 228d5de70ceSlaurenw-arm (uintptr_t)&arm_uuid_spec[PLAT_KEY_CERT_ID], 229d5de70ceSlaurenw-arm open_fip 230d5de70ceSlaurenw-arm }, 231a6de824fSLouis Mayencourt [TRUSTED_KEY_CERT_ID] = { 232a6de824fSLouis Mayencourt &fip_dev_handle, 233a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TRUSTED_KEY_CERT_ID], 234a6de824fSLouis Mayencourt open_fip 235a6de824fSLouis Mayencourt }, 236a6de824fSLouis Mayencourt [SCP_FW_KEY_CERT_ID] = { 237a6de824fSLouis Mayencourt &fip_dev_handle, 238a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SCP_FW_KEY_CERT_ID], 239a6de824fSLouis Mayencourt open_fip 240a6de824fSLouis Mayencourt }, 241a6de824fSLouis Mayencourt [SOC_FW_KEY_CERT_ID] = { 242a6de824fSLouis Mayencourt &fip_dev_handle, 243a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SOC_FW_KEY_CERT_ID], 244a6de824fSLouis Mayencourt open_fip 245a6de824fSLouis Mayencourt }, 246a6de824fSLouis Mayencourt [TRUSTED_OS_FW_KEY_CERT_ID] = { 247a6de824fSLouis Mayencourt &fip_dev_handle, 248a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_KEY_CERT_ID], 249a6de824fSLouis Mayencourt open_fip 250a6de824fSLouis Mayencourt }, 251a6de824fSLouis Mayencourt [NON_TRUSTED_FW_KEY_CERT_ID] = { 252a6de824fSLouis Mayencourt &fip_dev_handle, 253a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_KEY_CERT_ID], 254a6de824fSLouis Mayencourt open_fip 255a6de824fSLouis Mayencourt }, 256a6de824fSLouis Mayencourt [SCP_FW_CONTENT_CERT_ID] = { 257a6de824fSLouis Mayencourt &fip_dev_handle, 258a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SCP_FW_CONTENT_CERT_ID], 259a6de824fSLouis Mayencourt open_fip 260a6de824fSLouis Mayencourt }, 261a6de824fSLouis Mayencourt [SOC_FW_CONTENT_CERT_ID] = { 262a6de824fSLouis Mayencourt &fip_dev_handle, 263a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SOC_FW_CONTENT_CERT_ID], 264a6de824fSLouis Mayencourt open_fip 265a6de824fSLouis Mayencourt }, 266a6de824fSLouis Mayencourt [TRUSTED_OS_FW_CONTENT_CERT_ID] = { 267a6de824fSLouis Mayencourt &fip_dev_handle, 268a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_CONTENT_CERT_ID], 269a6de824fSLouis Mayencourt open_fip 270a6de824fSLouis Mayencourt }, 271a6de824fSLouis Mayencourt [NON_TRUSTED_FW_CONTENT_CERT_ID] = { 272a6de824fSLouis Mayencourt &fip_dev_handle, 273a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_CONTENT_CERT_ID], 274a6de824fSLouis Mayencourt open_fip 275a6de824fSLouis Mayencourt }, 27644f1aa8eSManish Pandey #if defined(SPD_spmd) 27703a5225cSManish Pandey [SIP_SP_CONTENT_CERT_ID] = { 27844f1aa8eSManish Pandey &fip_dev_handle, 27903a5225cSManish Pandey (uintptr_t)&arm_uuid_spec[SIP_SP_CONTENT_CERT_ID], 28044f1aa8eSManish Pandey open_fip 28144f1aa8eSManish Pandey }, 282990d972fSManish Pandey [PLAT_SP_CONTENT_CERT_ID] = { 283990d972fSManish Pandey &fip_dev_handle, 284990d972fSManish Pandey (uintptr_t)&arm_uuid_spec[PLAT_SP_CONTENT_CERT_ID], 285990d972fSManish Pandey open_fip 286990d972fSManish Pandey }, 28744f1aa8eSManish Pandey #endif 288*352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 289*352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_KEY_CERT_ID] = { 29033bcaed1SRob Hughes &fip_dev_handle, 291*352366edSRajasekaran Kalidoss (uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_KEY_CERT_ID], 29233bcaed1SRob Hughes open_fip 29333bcaed1SRob Hughes }, 294*352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_CONTENT_CERT_ID] = { 29533bcaed1SRob Hughes &fip_dev_handle, 296*352366edSRajasekaran Kalidoss (uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_CONTENT_CERT_ID], 29733bcaed1SRob Hughes open_fip 29833bcaed1SRob Hughes }, 299*352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 300a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */ 3010a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */ 3020a6e7e3bSLouis Mayencourt }; 3030a6e7e3bSLouis Mayencourt 3040a6e7e3bSLouis Mayencourt #ifdef IMAGE_BL2 3050a6e7e3bSLouis Mayencourt 306e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_BASE U(10) 307e208f324SRob Hughes 308*352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 30933bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU U(1) 31033bcaed1SRob Hughes #else 31133bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU U(0) 312*352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 31333bcaed1SRob Hughes 3140a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT 315e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_TBB U(12) 3160a6e7e3bSLouis Mayencourt #else 317e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_TBB U(0) 318e208f324SRob Hughes #endif /* TRUSTED_BOARD_BOOT */ 319e208f324SRob Hughes 320e208f324SRob Hughes #if TRUSTED_BOARD_BOOT && defined(SPD_spmd) 321e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_SPD U(2) 322e208f324SRob Hughes #else 323e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_SPD U(0) 324e208f324SRob Hughes #endif /* TRUSTED_BOARD_BOOT && defined(SPD_spmd) */ 325e208f324SRob Hughes 326*352366edSRajasekaran Kalidoss #if TRUSTED_BOARD_BOOT && ETHOSN_NPU_TZMP1 32733bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU_TBB U(2) 32833bcaed1SRob Hughes #else 32933bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU_TBB U(0) 330*352366edSRajasekaran Kalidoss #endif /* TRUSTED_BOARD_BOOT && ETHOSN_NPU_TZMP1 */ 33133bcaed1SRob Hughes 332e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUMBER FCONF_ARM_IO_UUID_NUM_BASE + \ 33333bcaed1SRob Hughes FCONF_ARM_IO_UUID_NUM_NPU + \ 33433bcaed1SRob Hughes FCONF_ARM_IO_UUID_NUM_TBB + \ 33533bcaed1SRob Hughes FCONF_ARM_IO_UUID_NUM_SPD + \ 33633bcaed1SRob Hughes FCONF_ARM_IO_UUID_NUM_NPU_TBB 3370a6e7e3bSLouis Mayencourt 3380a6e7e3bSLouis Mayencourt static io_uuid_spec_t fconf_arm_uuids[FCONF_ARM_IO_UUID_NUMBER]; 3390a6e7e3bSLouis Mayencourt static OBJECT_POOL_ARRAY(fconf_arm_uuids_pool, fconf_arm_uuids); 3400a6e7e3bSLouis Mayencourt 3410a6e7e3bSLouis Mayencourt struct policies_load_info { 3420a6e7e3bSLouis Mayencourt unsigned int image_id; 3430a6e7e3bSLouis Mayencourt const char *name; 3440a6e7e3bSLouis Mayencourt }; 3450a6e7e3bSLouis Mayencourt 3460a6e7e3bSLouis Mayencourt /* image id to property name table */ 3470a6e7e3bSLouis Mayencourt static const struct policies_load_info load_info[FCONF_ARM_IO_UUID_NUMBER] = { 3480a6e7e3bSLouis Mayencourt {SCP_BL2_IMAGE_ID, "scp_bl2_uuid"}, 3490a6e7e3bSLouis Mayencourt {BL31_IMAGE_ID, "bl31_uuid"}, 3500a6e7e3bSLouis Mayencourt {BL32_IMAGE_ID, "bl32_uuid"}, 3510a6e7e3bSLouis Mayencourt {BL32_EXTRA1_IMAGE_ID, "bl32_extra1_uuid"}, 3520a6e7e3bSLouis Mayencourt {BL32_EXTRA2_IMAGE_ID, "bl32_extra2_uuid"}, 3530a6e7e3bSLouis Mayencourt {BL33_IMAGE_ID, "bl33_uuid"}, 3540a6e7e3bSLouis Mayencourt {HW_CONFIG_ID, "hw_cfg_uuid"}, 3550a6e7e3bSLouis Mayencourt {SOC_FW_CONFIG_ID, "soc_fw_cfg_uuid"}, 3560a6e7e3bSLouis Mayencourt {TOS_FW_CONFIG_ID, "tos_fw_cfg_uuid"}, 3570a6e7e3bSLouis Mayencourt {NT_FW_CONFIG_ID, "nt_fw_cfg_uuid"}, 358*352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 359*352366edSRajasekaran Kalidoss {ETHOSN_NPU_FW_IMAGE_ID, "ethosn_npu_fw_uuid"}, 360*352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 3610a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT 362d5de70ceSlaurenw-arm {CCA_CONTENT_CERT_ID, "cca_cert_uuid"}, 363d5de70ceSlaurenw-arm {CORE_SWD_KEY_CERT_ID, "core_swd_cert_uuid"}, 364d5de70ceSlaurenw-arm {PLAT_KEY_CERT_ID, "plat_cert_uuid"}, 3650a6e7e3bSLouis Mayencourt {TRUSTED_KEY_CERT_ID, "t_key_cert_uuid"}, 3660a6e7e3bSLouis Mayencourt {SCP_FW_KEY_CERT_ID, "scp_fw_key_uuid"}, 3670a6e7e3bSLouis Mayencourt {SOC_FW_KEY_CERT_ID, "soc_fw_key_uuid"}, 3680a6e7e3bSLouis Mayencourt {TRUSTED_OS_FW_KEY_CERT_ID, "tos_fw_key_cert_uuid"}, 3690a6e7e3bSLouis Mayencourt {NON_TRUSTED_FW_KEY_CERT_ID, "nt_fw_key_cert_uuid"}, 3700a6e7e3bSLouis Mayencourt {SCP_FW_CONTENT_CERT_ID, "scp_fw_content_cert_uuid"}, 3710a6e7e3bSLouis Mayencourt {SOC_FW_CONTENT_CERT_ID, "soc_fw_content_cert_uuid"}, 3720a6e7e3bSLouis Mayencourt {TRUSTED_OS_FW_CONTENT_CERT_ID, "tos_fw_content_cert_uuid"}, 3730a6e7e3bSLouis Mayencourt {NON_TRUSTED_FW_CONTENT_CERT_ID, "nt_fw_content_cert_uuid"}, 37444f1aa8eSManish Pandey #if defined(SPD_spmd) 37503a5225cSManish Pandey {SIP_SP_CONTENT_CERT_ID, "sip_sp_content_cert_uuid"}, 376990d972fSManish Pandey {PLAT_SP_CONTENT_CERT_ID, "plat_sp_content_cert_uuid"}, 37744f1aa8eSManish Pandey #endif 378*352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 379*352366edSRajasekaran Kalidoss {ETHOSN_NPU_FW_KEY_CERT_ID, "ethosn_npu_fw_key_cert_uuid"}, 380*352366edSRajasekaran Kalidoss {ETHOSN_NPU_FW_CONTENT_CERT_ID, "ethosn_npu_fw_content_cert_uuid"}, 381*352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 3820a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */ 3830a6e7e3bSLouis Mayencourt }; 3840a6e7e3bSLouis Mayencourt 3850a6e7e3bSLouis Mayencourt int fconf_populate_arm_io_policies(uintptr_t config) 3860a6e7e3bSLouis Mayencourt { 3870a6e7e3bSLouis Mayencourt int err, node; 3880a6e7e3bSLouis Mayencourt unsigned int i; 3890a6e7e3bSLouis Mayencourt 3900a6e7e3bSLouis Mayencourt union uuid_helper_t uuid_helper; 3910a6e7e3bSLouis Mayencourt io_uuid_spec_t *uuid_ptr; 3920a6e7e3bSLouis Mayencourt 3930a6e7e3bSLouis Mayencourt /* As libfdt uses void *, we can't avoid this cast */ 3940a6e7e3bSLouis Mayencourt const void *dtb = (void *)config; 3950a6e7e3bSLouis Mayencourt 3960a6e7e3bSLouis Mayencourt /* Assert the node offset point to "arm,io-fip-handle" compatible property */ 3970a6e7e3bSLouis Mayencourt const char *compatible_str = "arm,io-fip-handle"; 3980a6e7e3bSLouis Mayencourt node = fdt_node_offset_by_compatible(dtb, -1, compatible_str); 3990a6e7e3bSLouis Mayencourt if (node < 0) { 4000a6e7e3bSLouis Mayencourt ERROR("FCONF: Can't find %s compatible in dtb\n", compatible_str); 4010a6e7e3bSLouis Mayencourt return node; 4020a6e7e3bSLouis Mayencourt } 4030a6e7e3bSLouis Mayencourt 4040a6e7e3bSLouis Mayencourt /* Locate the uuid cells and read the value for all the load info uuid */ 4050a6e7e3bSLouis Mayencourt for (i = 0; i < FCONF_ARM_IO_UUID_NUMBER; i++) { 4060a6e7e3bSLouis Mayencourt uuid_ptr = pool_alloc(&fconf_arm_uuids_pool); 4077d111d99SDavid Horstmann err = fdtw_read_uuid(dtb, node, load_info[i].name, 16, 4087d111d99SDavid Horstmann (uint8_t *)&uuid_helper); 4090a6e7e3bSLouis Mayencourt if (err < 0) { 4100a6e7e3bSLouis Mayencourt WARN("FCONF: Read cell failed for %s\n", load_info[i].name); 4110a6e7e3bSLouis Mayencourt return err; 4120a6e7e3bSLouis Mayencourt } 4130a6e7e3bSLouis Mayencourt 4147d111d99SDavid Horstmann VERBOSE("FCONF: arm-io_policies.%s cell found with value = " 4157d111d99SDavid Horstmann "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", 4160a6e7e3bSLouis Mayencourt load_info[i].name, 4177d111d99SDavid Horstmann uuid_helper.uuid_struct.time_low[0], uuid_helper.uuid_struct.time_low[1], 4187d111d99SDavid Horstmann uuid_helper.uuid_struct.time_low[2], uuid_helper.uuid_struct.time_low[3], 4197d111d99SDavid Horstmann uuid_helper.uuid_struct.time_mid[0], uuid_helper.uuid_struct.time_mid[1], 4207d111d99SDavid Horstmann uuid_helper.uuid_struct.time_hi_and_version[0], 4217d111d99SDavid Horstmann uuid_helper.uuid_struct.time_hi_and_version[1], 4227d111d99SDavid Horstmann uuid_helper.uuid_struct.clock_seq_hi_and_reserved, 4237d111d99SDavid Horstmann uuid_helper.uuid_struct.clock_seq_low, 4247d111d99SDavid Horstmann uuid_helper.uuid_struct.node[0], uuid_helper.uuid_struct.node[1], 4257d111d99SDavid Horstmann uuid_helper.uuid_struct.node[2], uuid_helper.uuid_struct.node[3], 4267d111d99SDavid Horstmann uuid_helper.uuid_struct.node[4], uuid_helper.uuid_struct.node[5]); 4270a6e7e3bSLouis Mayencourt 4280a6e7e3bSLouis Mayencourt uuid_ptr->uuid = uuid_helper.uuid_struct; 4290a6e7e3bSLouis Mayencourt policies[load_info[i].image_id].image_spec = (uintptr_t)uuid_ptr; 4300a6e7e3bSLouis Mayencourt policies[load_info[i].image_id].dev_handle = &fip_dev_handle; 4310a6e7e3bSLouis Mayencourt policies[load_info[i].image_id].check = open_fip; 4320a6e7e3bSLouis Mayencourt } 4330a6e7e3bSLouis Mayencourt return 0; 4340a6e7e3bSLouis Mayencourt } 4350a6e7e3bSLouis Mayencourt 436a6de824fSLouis Mayencourt #if ARM_IO_IN_DTB 43725d740c4SMadhukar Pappireddy FCONF_REGISTER_POPULATOR(TB_FW, arm_io, fconf_populate_arm_io_policies); 438a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */ 4390a6e7e3bSLouis Mayencourt 4400a6e7e3bSLouis Mayencourt #endif /* IMAGE_BL2 */ 441