10a6e7e3bSLouis Mayencourt /* 227f0b734SManish V Badarkhe * Copyright (c) 2019-2025, 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 /* 2827f0b734SManish V Badarkhe * - With ARM_GPT_SUPPORT and BL1: a fixed FIP offset within the GPT image is used. 2927f0b734SManish V Badarkhe * - With ARM_GPT_SUPPORT and BL2: the FIP offset is derived from 3027f0b734SManish V Badarkhe * the partition table entries at runtime. 3127f0b734SManish V Badarkhe * - Without ARM_GPT_SUPPORT: both BL1 and BL2 use the fixed FIP base address. 32ef1daa42SManish V Badarkhe */ 33ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT 3427f0b734SManish V Badarkhe #if IMAGE_BL1 35ef1daa42SManish V Badarkhe .offset = PLAT_ARM_FLASH_IMAGE_BASE + PLAT_ARM_FIP_OFFSET_IN_GPT, 3627f0b734SManish V Badarkhe #endif /* IMAGE_BL1 */ 37ef1daa42SManish V Badarkhe #else 3849e9ac28SManish V Badarkhe .offset = PLAT_ARM_FLASH_IMAGE_BASE, 39ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */ 4049e9ac28SManish V Badarkhe .length = PLAT_ARM_FLASH_IMAGE_MAX_SIZE 410a6e7e3bSLouis Mayencourt }; 420a6e7e3bSLouis Mayencourt 43ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT 44ef1daa42SManish V Badarkhe static const io_block_spec_t gpt_spec = { 45ef1daa42SManish V Badarkhe .offset = PLAT_ARM_FLASH_IMAGE_BASE, 46ef1daa42SManish V Badarkhe /* 47ef1daa42SManish V Badarkhe * PLAT_PARTITION_BLOCK_SIZE = 512 48ef1daa42SManish V Badarkhe * PLAT_PARTITION_MAX_ENTRIES = 128 49ef1daa42SManish V Badarkhe * each sector has 4 partition entries, and there are 50ef1daa42SManish V Badarkhe * 2 reserved sectors i.e. protective MBR and primary 51ef1daa42SManish V Badarkhe * GPT header hence length gets calculated as, 52ad2dd658SGovindraj Raja * length = PLAT_PARTITION_BLOCK_SIZE * (128/4 + 2) 53ef1daa42SManish V Badarkhe */ 54ad2dd658SGovindraj Raja .length = LBA(PLAT_PARTITION_MAX_ENTRIES / 4 + 2), 55ef1daa42SManish V Badarkhe }; 563e6d2457SGovindraj Raja 573e6d2457SGovindraj Raja /* 583e6d2457SGovindraj Raja * length will be assigned at runtime based on MBR header data. 593e6d2457SGovindraj Raja * Backup GPT Header is present in Last LBA-1 and its entries 603e6d2457SGovindraj Raja * are last 32 blocks starts at LBA-33, On runtime update these 613e6d2457SGovindraj Raja * before device usage. Update offset to beginning LBA-33 and 623e6d2457SGovindraj Raja * length to LBA-33. 633e6d2457SGovindraj Raja */ 643e6d2457SGovindraj Raja static io_block_spec_t bkup_gpt_spec = { 653e6d2457SGovindraj Raja .offset = PLAT_ARM_FLASH_IMAGE_BASE, 663e6d2457SGovindraj Raja .length = 0, 673e6d2457SGovindraj Raja }; 68ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */ 69ef1daa42SManish V Badarkhe 700a6e7e3bSLouis Mayencourt const io_uuid_spec_t arm_uuid_spec[MAX_NUMBER_IDS] = { 710a6e7e3bSLouis Mayencourt [BL2_IMAGE_ID] = {UUID_TRUSTED_BOOT_FIRMWARE_BL2}, 720a6e7e3bSLouis Mayencourt [TB_FW_CONFIG_ID] = {UUID_TB_FW_CONFIG}, 73243875eaSLouis Mayencourt [FW_CONFIG_ID] = {UUID_FW_CONFIG}, 74a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB 75a6de824fSLouis Mayencourt [SCP_BL2_IMAGE_ID] = {UUID_SCP_FIRMWARE_SCP_BL2}, 76a6de824fSLouis Mayencourt [BL31_IMAGE_ID] = {UUID_EL3_RUNTIME_FIRMWARE_BL31}, 77a6de824fSLouis Mayencourt [BL32_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32}, 78a6de824fSLouis Mayencourt [BL32_EXTRA1_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA1}, 79a6de824fSLouis Mayencourt [BL32_EXTRA2_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA2}, 80a6de824fSLouis Mayencourt [BL33_IMAGE_ID] = {UUID_NON_TRUSTED_FIRMWARE_BL33}, 81a6de824fSLouis Mayencourt [HW_CONFIG_ID] = {UUID_HW_CONFIG}, 82a6de824fSLouis Mayencourt [SOC_FW_CONFIG_ID] = {UUID_SOC_FW_CONFIG}, 83a6de824fSLouis Mayencourt [TOS_FW_CONFIG_ID] = {UUID_TOS_FW_CONFIG}, 84a6de824fSLouis Mayencourt [NT_FW_CONFIG_ID] = {UUID_NT_FW_CONFIG}, 859d870b79SZelalem Aweke [RMM_IMAGE_ID] = {UUID_REALM_MONITOR_MGMT_FIRMWARE}, 86352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 87352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_IMAGE_ID] = {UUID_ETHOSN_FW}, 88352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 89a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */ 900a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT 910a6e7e3bSLouis Mayencourt [TRUSTED_BOOT_FW_CERT_ID] = {UUID_TRUSTED_BOOT_FW_CERT}, 92a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB 93d5de70ceSlaurenw-arm [CCA_CONTENT_CERT_ID] = {UUID_CCA_CONTENT_CERT}, 94d5de70ceSlaurenw-arm [CORE_SWD_KEY_CERT_ID] = {UUID_CORE_SWD_KEY_CERT}, 95d5de70ceSlaurenw-arm [PLAT_KEY_CERT_ID] = {UUID_PLAT_KEY_CERT}, 96a6de824fSLouis Mayencourt [TRUSTED_KEY_CERT_ID] = {UUID_TRUSTED_KEY_CERT}, 97a6de824fSLouis Mayencourt [SCP_FW_KEY_CERT_ID] = {UUID_SCP_FW_KEY_CERT}, 98a6de824fSLouis Mayencourt [SOC_FW_KEY_CERT_ID] = {UUID_SOC_FW_KEY_CERT}, 99a6de824fSLouis Mayencourt [TRUSTED_OS_FW_KEY_CERT_ID] = {UUID_TRUSTED_OS_FW_KEY_CERT}, 100a6de824fSLouis Mayencourt [NON_TRUSTED_FW_KEY_CERT_ID] = {UUID_NON_TRUSTED_FW_KEY_CERT}, 101a6de824fSLouis Mayencourt [SCP_FW_CONTENT_CERT_ID] = {UUID_SCP_FW_CONTENT_CERT}, 102a6de824fSLouis Mayencourt [SOC_FW_CONTENT_CERT_ID] = {UUID_SOC_FW_CONTENT_CERT}, 103a6de824fSLouis Mayencourt [TRUSTED_OS_FW_CONTENT_CERT_ID] = {UUID_TRUSTED_OS_FW_CONTENT_CERT}, 104a6de824fSLouis Mayencourt [NON_TRUSTED_FW_CONTENT_CERT_ID] = {UUID_NON_TRUSTED_FW_CONTENT_CERT}, 10544f1aa8eSManish Pandey #if defined(SPD_spmd) 10603a5225cSManish Pandey [SIP_SP_CONTENT_CERT_ID] = {UUID_SIP_SECURE_PARTITION_CONTENT_CERT}, 107990d972fSManish Pandey [PLAT_SP_CONTENT_CERT_ID] = {UUID_PLAT_SECURE_PARTITION_CONTENT_CERT}, 10844f1aa8eSManish Pandey #endif 109352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 110352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_KEY_CERT_ID] = {UUID_ETHOSN_FW_KEY_CERTIFICATE}, 111352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_CONTENT_CERT_ID] = {UUID_ETHOSN_FW_CONTENT_CERTIFICATE}, 112352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 113a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */ 1140a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */ 1150a6e7e3bSLouis Mayencourt }; 1160a6e7e3bSLouis Mayencourt 1170a6e7e3bSLouis Mayencourt /* By default, ARM platforms load images from the FIP */ 1180a6e7e3bSLouis Mayencourt struct plat_io_policy policies[MAX_NUMBER_IDS] = { 119ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT 120ef1daa42SManish V Badarkhe [GPT_IMAGE_ID] = { 121ef1daa42SManish V Badarkhe &memmap_dev_handle, 122ef1daa42SManish V Badarkhe (uintptr_t)&gpt_spec, 123ef1daa42SManish V Badarkhe open_memmap 124ef1daa42SManish V Badarkhe }, 1253e6d2457SGovindraj Raja [BKUP_GPT_IMAGE_ID] = { 1263e6d2457SGovindraj Raja &memmap_dev_handle, 1273e6d2457SGovindraj Raja (uintptr_t)&bkup_gpt_spec, 1283e6d2457SGovindraj Raja open_memmap 1293e6d2457SGovindraj Raja }, 130ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */ 1312f1177b2SManish V Badarkhe #if PSA_FWU_SUPPORT 1322f1177b2SManish V Badarkhe [FWU_METADATA_IMAGE_ID] = { 1332f1177b2SManish V Badarkhe &memmap_dev_handle, 1342f1177b2SManish V Badarkhe /* filled runtime from partition information */ 1352f1177b2SManish V Badarkhe (uintptr_t)&fwu_metadata_spec, 1362f1177b2SManish V Badarkhe open_memmap 1372f1177b2SManish V Badarkhe }, 1382f1177b2SManish V Badarkhe [BKUP_FWU_METADATA_IMAGE_ID] = { 1392f1177b2SManish V Badarkhe &memmap_dev_handle, 1402f1177b2SManish V Badarkhe /* filled runtime from partition information */ 1412f1177b2SManish V Badarkhe (uintptr_t)&fwu_metadata_spec, 1422f1177b2SManish V Badarkhe open_memmap 1432f1177b2SManish V Badarkhe }, 1442f1177b2SManish V Badarkhe #endif /* PSA_FWU_SUPPORT */ 1450a6e7e3bSLouis Mayencourt [FIP_IMAGE_ID] = { 1460a6e7e3bSLouis Mayencourt &memmap_dev_handle, 1470a6e7e3bSLouis Mayencourt (uintptr_t)&fip_block_spec, 1480a6e7e3bSLouis Mayencourt open_memmap 1490a6e7e3bSLouis Mayencourt }, 150*d81b3bc1SLauren Wehrmeister #if !defined(DECRYPTION_SUPPORT_none) 151*d81b3bc1SLauren Wehrmeister [ENC_IMAGE_ID] = { 152*d81b3bc1SLauren Wehrmeister &fip_dev_handle, 153*d81b3bc1SLauren Wehrmeister (uintptr_t)NULL, 154*d81b3bc1SLauren Wehrmeister open_fip 155*d81b3bc1SLauren Wehrmeister }, 156*d81b3bc1SLauren Wehrmeister #endif 1570a6e7e3bSLouis Mayencourt [BL2_IMAGE_ID] = { 1580a6e7e3bSLouis Mayencourt &fip_dev_handle, 1590a6e7e3bSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL2_IMAGE_ID], 1600a6e7e3bSLouis Mayencourt open_fip 1610a6e7e3bSLouis Mayencourt }, 1620a6e7e3bSLouis Mayencourt [TB_FW_CONFIG_ID] = { 1630a6e7e3bSLouis Mayencourt &fip_dev_handle, 1640a6e7e3bSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TB_FW_CONFIG_ID], 1650a6e7e3bSLouis Mayencourt open_fip 1660a6e7e3bSLouis Mayencourt }, 167243875eaSLouis Mayencourt [FW_CONFIG_ID] = { 168243875eaSLouis Mayencourt &fip_dev_handle, 169243875eaSLouis Mayencourt (uintptr_t)&arm_uuid_spec[FW_CONFIG_ID], 170243875eaSLouis Mayencourt open_fip 171243875eaSLouis Mayencourt }, 172a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB 173a6de824fSLouis Mayencourt [SCP_BL2_IMAGE_ID] = { 174a6de824fSLouis Mayencourt &fip_dev_handle, 175a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SCP_BL2_IMAGE_ID], 176a6de824fSLouis Mayencourt open_fip 177a6de824fSLouis Mayencourt }, 178*d81b3bc1SLauren Wehrmeister #if ENCRYPT_BL31 && !defined(DECRYPTION_SUPPORT_none) 179*d81b3bc1SLauren Wehrmeister [BL31_IMAGE_ID] = { 180*d81b3bc1SLauren Wehrmeister &enc_dev_handle, 181*d81b3bc1SLauren Wehrmeister (uintptr_t)&arm_uuid_spec[BL31_IMAGE_ID], 182*d81b3bc1SLauren Wehrmeister open_enc_fip 183*d81b3bc1SLauren Wehrmeister }, 184*d81b3bc1SLauren Wehrmeister #else 185a6de824fSLouis Mayencourt [BL31_IMAGE_ID] = { 186a6de824fSLouis Mayencourt &fip_dev_handle, 187a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL31_IMAGE_ID], 188a6de824fSLouis Mayencourt open_fip 189a6de824fSLouis Mayencourt }, 190*d81b3bc1SLauren Wehrmeister #endif 191*d81b3bc1SLauren Wehrmeister #if ENCRYPT_BL32 && !defined(DECRYPTION_SUPPORT_none) 192*d81b3bc1SLauren Wehrmeister [BL32_IMAGE_ID] = { 193*d81b3bc1SLauren Wehrmeister &enc_dev_handle, 194*d81b3bc1SLauren Wehrmeister (uintptr_t)&arm_uuid_spec[BL32_IMAGE_ID], 195*d81b3bc1SLauren Wehrmeister open_enc_fip 196*d81b3bc1SLauren Wehrmeister }, 197*d81b3bc1SLauren Wehrmeister [BL32_EXTRA1_IMAGE_ID] = { 198*d81b3bc1SLauren Wehrmeister &enc_dev_handle, 199*d81b3bc1SLauren Wehrmeister (uintptr_t)&arm_uuid_spec[BL32_EXTRA1_IMAGE_ID], 200*d81b3bc1SLauren Wehrmeister open_enc_fip 201*d81b3bc1SLauren Wehrmeister }, 202*d81b3bc1SLauren Wehrmeister [BL32_EXTRA2_IMAGE_ID] = { 203*d81b3bc1SLauren Wehrmeister &enc_dev_handle, 204*d81b3bc1SLauren Wehrmeister (uintptr_t)&arm_uuid_spec[BL32_EXTRA2_IMAGE_ID], 205*d81b3bc1SLauren Wehrmeister open_enc_fip 206*d81b3bc1SLauren Wehrmeister }, 207*d81b3bc1SLauren Wehrmeister #else 208a6de824fSLouis Mayencourt [BL32_IMAGE_ID] = { 209a6de824fSLouis Mayencourt &fip_dev_handle, 210a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL32_IMAGE_ID], 211a6de824fSLouis Mayencourt open_fip 212a6de824fSLouis Mayencourt }, 213a6de824fSLouis Mayencourt [BL32_EXTRA1_IMAGE_ID] = { 214a6de824fSLouis Mayencourt &fip_dev_handle, 215a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL32_EXTRA1_IMAGE_ID], 216a6de824fSLouis Mayencourt open_fip 217a6de824fSLouis Mayencourt }, 218a6de824fSLouis Mayencourt [BL32_EXTRA2_IMAGE_ID] = { 219a6de824fSLouis Mayencourt &fip_dev_handle, 220a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL32_EXTRA2_IMAGE_ID], 221a6de824fSLouis Mayencourt open_fip 222a6de824fSLouis Mayencourt }, 223*d81b3bc1SLauren Wehrmeister #endif 224a6de824fSLouis Mayencourt [BL33_IMAGE_ID] = { 225a6de824fSLouis Mayencourt &fip_dev_handle, 226a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL33_IMAGE_ID], 227a6de824fSLouis Mayencourt open_fip 228a6de824fSLouis Mayencourt }, 2299d870b79SZelalem Aweke [RMM_IMAGE_ID] = { 2309d870b79SZelalem Aweke &fip_dev_handle, 2319d870b79SZelalem Aweke (uintptr_t)&arm_uuid_spec[RMM_IMAGE_ID], 2329d870b79SZelalem Aweke open_fip 2339d870b79SZelalem Aweke }, 234a6de824fSLouis Mayencourt [HW_CONFIG_ID] = { 235a6de824fSLouis Mayencourt &fip_dev_handle, 236a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[HW_CONFIG_ID], 237a6de824fSLouis Mayencourt open_fip 238a6de824fSLouis Mayencourt }, 239a6de824fSLouis Mayencourt [SOC_FW_CONFIG_ID] = { 240a6de824fSLouis Mayencourt &fip_dev_handle, 241a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SOC_FW_CONFIG_ID], 242a6de824fSLouis Mayencourt open_fip 243a6de824fSLouis Mayencourt }, 244a6de824fSLouis Mayencourt [TOS_FW_CONFIG_ID] = { 245a6de824fSLouis Mayencourt &fip_dev_handle, 246a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TOS_FW_CONFIG_ID], 247a6de824fSLouis Mayencourt open_fip 248a6de824fSLouis Mayencourt }, 249a6de824fSLouis Mayencourt [NT_FW_CONFIG_ID] = { 250a6de824fSLouis Mayencourt &fip_dev_handle, 251a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[NT_FW_CONFIG_ID], 252a6de824fSLouis Mayencourt open_fip 253a6de824fSLouis Mayencourt }, 254352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 255352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_IMAGE_ID] = { 25633bcaed1SRob Hughes &fip_dev_handle, 257352366edSRajasekaran Kalidoss (uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_IMAGE_ID], 25833bcaed1SRob Hughes open_fip 25933bcaed1SRob Hughes }, 260352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 261a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */ 2620a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT 2630a6e7e3bSLouis Mayencourt [TRUSTED_BOOT_FW_CERT_ID] = { 2640a6e7e3bSLouis Mayencourt &fip_dev_handle, 2650a6e7e3bSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TRUSTED_BOOT_FW_CERT_ID], 2660a6e7e3bSLouis Mayencourt open_fip 2670a6e7e3bSLouis Mayencourt }, 268a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB 269d5de70ceSlaurenw-arm [CCA_CONTENT_CERT_ID] = { 270d5de70ceSlaurenw-arm &fip_dev_handle, 271d5de70ceSlaurenw-arm (uintptr_t)&arm_uuid_spec[CCA_CONTENT_CERT_ID], 272d5de70ceSlaurenw-arm open_fip 273d5de70ceSlaurenw-arm }, 274d5de70ceSlaurenw-arm [CORE_SWD_KEY_CERT_ID] = { 275d5de70ceSlaurenw-arm &fip_dev_handle, 276d5de70ceSlaurenw-arm (uintptr_t)&arm_uuid_spec[CORE_SWD_KEY_CERT_ID], 277d5de70ceSlaurenw-arm open_fip 278d5de70ceSlaurenw-arm }, 279d5de70ceSlaurenw-arm [PLAT_KEY_CERT_ID] = { 280d5de70ceSlaurenw-arm &fip_dev_handle, 281d5de70ceSlaurenw-arm (uintptr_t)&arm_uuid_spec[PLAT_KEY_CERT_ID], 282d5de70ceSlaurenw-arm open_fip 283d5de70ceSlaurenw-arm }, 284a6de824fSLouis Mayencourt [TRUSTED_KEY_CERT_ID] = { 285a6de824fSLouis Mayencourt &fip_dev_handle, 286a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TRUSTED_KEY_CERT_ID], 287a6de824fSLouis Mayencourt open_fip 288a6de824fSLouis Mayencourt }, 289a6de824fSLouis Mayencourt [SCP_FW_KEY_CERT_ID] = { 290a6de824fSLouis Mayencourt &fip_dev_handle, 291a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SCP_FW_KEY_CERT_ID], 292a6de824fSLouis Mayencourt open_fip 293a6de824fSLouis Mayencourt }, 294a6de824fSLouis Mayencourt [SOC_FW_KEY_CERT_ID] = { 295a6de824fSLouis Mayencourt &fip_dev_handle, 296a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SOC_FW_KEY_CERT_ID], 297a6de824fSLouis Mayencourt open_fip 298a6de824fSLouis Mayencourt }, 299a6de824fSLouis Mayencourt [TRUSTED_OS_FW_KEY_CERT_ID] = { 300a6de824fSLouis Mayencourt &fip_dev_handle, 301a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_KEY_CERT_ID], 302a6de824fSLouis Mayencourt open_fip 303a6de824fSLouis Mayencourt }, 304a6de824fSLouis Mayencourt [NON_TRUSTED_FW_KEY_CERT_ID] = { 305a6de824fSLouis Mayencourt &fip_dev_handle, 306a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_KEY_CERT_ID], 307a6de824fSLouis Mayencourt open_fip 308a6de824fSLouis Mayencourt }, 309a6de824fSLouis Mayencourt [SCP_FW_CONTENT_CERT_ID] = { 310a6de824fSLouis Mayencourt &fip_dev_handle, 311a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SCP_FW_CONTENT_CERT_ID], 312a6de824fSLouis Mayencourt open_fip 313a6de824fSLouis Mayencourt }, 314a6de824fSLouis Mayencourt [SOC_FW_CONTENT_CERT_ID] = { 315a6de824fSLouis Mayencourt &fip_dev_handle, 316a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SOC_FW_CONTENT_CERT_ID], 317a6de824fSLouis Mayencourt open_fip 318a6de824fSLouis Mayencourt }, 319a6de824fSLouis Mayencourt [TRUSTED_OS_FW_CONTENT_CERT_ID] = { 320a6de824fSLouis Mayencourt &fip_dev_handle, 321a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_CONTENT_CERT_ID], 322a6de824fSLouis Mayencourt open_fip 323a6de824fSLouis Mayencourt }, 324a6de824fSLouis Mayencourt [NON_TRUSTED_FW_CONTENT_CERT_ID] = { 325a6de824fSLouis Mayencourt &fip_dev_handle, 326a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_CONTENT_CERT_ID], 327a6de824fSLouis Mayencourt open_fip 328a6de824fSLouis Mayencourt }, 32944f1aa8eSManish Pandey #if defined(SPD_spmd) 33003a5225cSManish Pandey [SIP_SP_CONTENT_CERT_ID] = { 33144f1aa8eSManish Pandey &fip_dev_handle, 33203a5225cSManish Pandey (uintptr_t)&arm_uuid_spec[SIP_SP_CONTENT_CERT_ID], 33344f1aa8eSManish Pandey open_fip 33444f1aa8eSManish Pandey }, 335990d972fSManish Pandey [PLAT_SP_CONTENT_CERT_ID] = { 336990d972fSManish Pandey &fip_dev_handle, 337990d972fSManish Pandey (uintptr_t)&arm_uuid_spec[PLAT_SP_CONTENT_CERT_ID], 338990d972fSManish Pandey open_fip 339990d972fSManish Pandey }, 34044f1aa8eSManish Pandey #endif 341352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 342352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_KEY_CERT_ID] = { 34333bcaed1SRob Hughes &fip_dev_handle, 344352366edSRajasekaran Kalidoss (uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_KEY_CERT_ID], 34533bcaed1SRob Hughes open_fip 34633bcaed1SRob Hughes }, 347352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_CONTENT_CERT_ID] = { 34833bcaed1SRob Hughes &fip_dev_handle, 349352366edSRajasekaran Kalidoss (uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_CONTENT_CERT_ID], 35033bcaed1SRob Hughes open_fip 35133bcaed1SRob Hughes }, 352352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 353a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */ 3540a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */ 3550a6e7e3bSLouis Mayencourt }; 3560a6e7e3bSLouis Mayencourt 3570a6e7e3bSLouis Mayencourt #ifdef IMAGE_BL2 3580a6e7e3bSLouis Mayencourt 359e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_BASE U(10) 360e208f324SRob Hughes 361352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 36233bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU U(1) 36333bcaed1SRob Hughes #else 36433bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU U(0) 365352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 36633bcaed1SRob Hughes 3670a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT 368e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_TBB U(12) 3690a6e7e3bSLouis Mayencourt #else 370e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_TBB U(0) 371e208f324SRob Hughes #endif /* TRUSTED_BOARD_BOOT */ 372e208f324SRob Hughes 373e208f324SRob Hughes #if TRUSTED_BOARD_BOOT && defined(SPD_spmd) 374e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_SPD U(2) 375e208f324SRob Hughes #else 376e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_SPD U(0) 377e208f324SRob Hughes #endif /* TRUSTED_BOARD_BOOT && defined(SPD_spmd) */ 378e208f324SRob Hughes 379352366edSRajasekaran Kalidoss #if TRUSTED_BOARD_BOOT && ETHOSN_NPU_TZMP1 38033bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU_TBB U(2) 38133bcaed1SRob Hughes #else 38233bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU_TBB U(0) 383352366edSRajasekaran Kalidoss #endif /* TRUSTED_BOARD_BOOT && ETHOSN_NPU_TZMP1 */ 38433bcaed1SRob Hughes 385e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUMBER FCONF_ARM_IO_UUID_NUM_BASE + \ 38633bcaed1SRob Hughes FCONF_ARM_IO_UUID_NUM_NPU + \ 38733bcaed1SRob Hughes FCONF_ARM_IO_UUID_NUM_TBB + \ 38833bcaed1SRob Hughes FCONF_ARM_IO_UUID_NUM_SPD + \ 38933bcaed1SRob Hughes FCONF_ARM_IO_UUID_NUM_NPU_TBB 3900a6e7e3bSLouis Mayencourt 3910a6e7e3bSLouis Mayencourt static io_uuid_spec_t fconf_arm_uuids[FCONF_ARM_IO_UUID_NUMBER]; 3920a6e7e3bSLouis Mayencourt static OBJECT_POOL_ARRAY(fconf_arm_uuids_pool, fconf_arm_uuids); 3930a6e7e3bSLouis Mayencourt 3940a6e7e3bSLouis Mayencourt struct policies_load_info { 3950a6e7e3bSLouis Mayencourt unsigned int image_id; 3960a6e7e3bSLouis Mayencourt const char *name; 3970a6e7e3bSLouis Mayencourt }; 3980a6e7e3bSLouis Mayencourt 3990a6e7e3bSLouis Mayencourt /* image id to property name table */ 4000a6e7e3bSLouis Mayencourt static const struct policies_load_info load_info[FCONF_ARM_IO_UUID_NUMBER] = { 4010a6e7e3bSLouis Mayencourt {SCP_BL2_IMAGE_ID, "scp_bl2_uuid"}, 4020a6e7e3bSLouis Mayencourt {BL31_IMAGE_ID, "bl31_uuid"}, 4030a6e7e3bSLouis Mayencourt {BL32_IMAGE_ID, "bl32_uuid"}, 4040a6e7e3bSLouis Mayencourt {BL32_EXTRA1_IMAGE_ID, "bl32_extra1_uuid"}, fconf_populate_arm_io_policies(uintptr_t config)4050a6e7e3bSLouis Mayencourt {BL32_EXTRA2_IMAGE_ID, "bl32_extra2_uuid"}, 4060a6e7e3bSLouis Mayencourt {BL33_IMAGE_ID, "bl33_uuid"}, 4070a6e7e3bSLouis Mayencourt {HW_CONFIG_ID, "hw_cfg_uuid"}, 4080a6e7e3bSLouis Mayencourt {SOC_FW_CONFIG_ID, "soc_fw_cfg_uuid"}, 4090a6e7e3bSLouis Mayencourt {TOS_FW_CONFIG_ID, "tos_fw_cfg_uuid"}, 4100a6e7e3bSLouis Mayencourt {NT_FW_CONFIG_ID, "nt_fw_cfg_uuid"}, 411352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 412352366edSRajasekaran Kalidoss {ETHOSN_NPU_FW_IMAGE_ID, "ethosn_npu_fw_uuid"}, 413352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 4140a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT 415d5de70ceSlaurenw-arm {CCA_CONTENT_CERT_ID, "cca_cert_uuid"}, 416d5de70ceSlaurenw-arm {CORE_SWD_KEY_CERT_ID, "core_swd_cert_uuid"}, 417d5de70ceSlaurenw-arm {PLAT_KEY_CERT_ID, "plat_cert_uuid"}, 4180a6e7e3bSLouis Mayencourt {TRUSTED_KEY_CERT_ID, "t_key_cert_uuid"}, 4190a6e7e3bSLouis Mayencourt {SCP_FW_KEY_CERT_ID, "scp_fw_key_uuid"}, 4200a6e7e3bSLouis Mayencourt {SOC_FW_KEY_CERT_ID, "soc_fw_key_uuid"}, 4210a6e7e3bSLouis Mayencourt {TRUSTED_OS_FW_KEY_CERT_ID, "tos_fw_key_cert_uuid"}, 4220a6e7e3bSLouis Mayencourt {NON_TRUSTED_FW_KEY_CERT_ID, "nt_fw_key_cert_uuid"}, 4230a6e7e3bSLouis Mayencourt {SCP_FW_CONTENT_CERT_ID, "scp_fw_content_cert_uuid"}, 4240a6e7e3bSLouis Mayencourt {SOC_FW_CONTENT_CERT_ID, "soc_fw_content_cert_uuid"}, 4250a6e7e3bSLouis Mayencourt {TRUSTED_OS_FW_CONTENT_CERT_ID, "tos_fw_content_cert_uuid"}, 4260a6e7e3bSLouis Mayencourt {NON_TRUSTED_FW_CONTENT_CERT_ID, "nt_fw_content_cert_uuid"}, 42744f1aa8eSManish Pandey #if defined(SPD_spmd) 42803a5225cSManish Pandey {SIP_SP_CONTENT_CERT_ID, "sip_sp_content_cert_uuid"}, 429990d972fSManish Pandey {PLAT_SP_CONTENT_CERT_ID, "plat_sp_content_cert_uuid"}, 43044f1aa8eSManish Pandey #endif 431352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 432352366edSRajasekaran Kalidoss {ETHOSN_NPU_FW_KEY_CERT_ID, "ethosn_npu_fw_key_cert_uuid"}, 433352366edSRajasekaran Kalidoss {ETHOSN_NPU_FW_CONTENT_CERT_ID, "ethosn_npu_fw_content_cert_uuid"}, 434352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 4350a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */ 4360a6e7e3bSLouis Mayencourt }; 4370a6e7e3bSLouis Mayencourt 4380a6e7e3bSLouis Mayencourt int fconf_populate_arm_io_policies(uintptr_t config) 4390a6e7e3bSLouis Mayencourt { 4400a6e7e3bSLouis Mayencourt int err, node; 4410a6e7e3bSLouis Mayencourt unsigned int i; 4420a6e7e3bSLouis Mayencourt 4430a6e7e3bSLouis Mayencourt union uuid_helper_t uuid_helper; 4440a6e7e3bSLouis Mayencourt io_uuid_spec_t *uuid_ptr; 4450a6e7e3bSLouis Mayencourt 4460a6e7e3bSLouis Mayencourt /* As libfdt uses void *, we can't avoid this cast */ 4470a6e7e3bSLouis Mayencourt const void *dtb = (void *)config; 4480a6e7e3bSLouis Mayencourt 4490a6e7e3bSLouis Mayencourt /* Assert the node offset point to "arm,io-fip-handle" compatible property */ 4500a6e7e3bSLouis Mayencourt const char *compatible_str = "arm,io-fip-handle"; 4510a6e7e3bSLouis Mayencourt node = fdt_node_offset_by_compatible(dtb, -1, compatible_str); 4520a6e7e3bSLouis Mayencourt if (node < 0) { 4530a6e7e3bSLouis Mayencourt ERROR("FCONF: Can't find %s compatible in dtb\n", compatible_str); 4540a6e7e3bSLouis Mayencourt return node; 4550a6e7e3bSLouis Mayencourt } 4560a6e7e3bSLouis Mayencourt 4570a6e7e3bSLouis Mayencourt /* Locate the uuid cells and read the value for all the load info uuid */ 4580a6e7e3bSLouis Mayencourt for (i = 0; i < FCONF_ARM_IO_UUID_NUMBER; i++) { 4590a6e7e3bSLouis Mayencourt uuid_ptr = pool_alloc(&fconf_arm_uuids_pool); 4607d111d99SDavid Horstmann err = fdtw_read_uuid(dtb, node, load_info[i].name, 16, 4617d111d99SDavid Horstmann (uint8_t *)&uuid_helper); 4620a6e7e3bSLouis Mayencourt if (err < 0) { 4630a6e7e3bSLouis Mayencourt WARN("FCONF: Read cell failed for %s\n", load_info[i].name); 4640a6e7e3bSLouis Mayencourt return err; 4650a6e7e3bSLouis Mayencourt } 4660a6e7e3bSLouis Mayencourt 4677d111d99SDavid Horstmann VERBOSE("FCONF: arm-io_policies.%s cell found with value = " 4687d111d99SDavid Horstmann "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", 4690a6e7e3bSLouis Mayencourt load_info[i].name, 4707d111d99SDavid Horstmann uuid_helper.uuid_struct.time_low[0], uuid_helper.uuid_struct.time_low[1], 4717d111d99SDavid Horstmann uuid_helper.uuid_struct.time_low[2], uuid_helper.uuid_struct.time_low[3], 4727d111d99SDavid Horstmann uuid_helper.uuid_struct.time_mid[0], uuid_helper.uuid_struct.time_mid[1], 4737d111d99SDavid Horstmann uuid_helper.uuid_struct.time_hi_and_version[0], 4747d111d99SDavid Horstmann uuid_helper.uuid_struct.time_hi_and_version[1], 4757d111d99SDavid Horstmann uuid_helper.uuid_struct.clock_seq_hi_and_reserved, 4767d111d99SDavid Horstmann uuid_helper.uuid_struct.clock_seq_low, 4777d111d99SDavid Horstmann uuid_helper.uuid_struct.node[0], uuid_helper.uuid_struct.node[1], 4787d111d99SDavid Horstmann uuid_helper.uuid_struct.node[2], uuid_helper.uuid_struct.node[3], 4797d111d99SDavid Horstmann uuid_helper.uuid_struct.node[4], uuid_helper.uuid_struct.node[5]); 4800a6e7e3bSLouis Mayencourt 4810a6e7e3bSLouis Mayencourt uuid_ptr->uuid = uuid_helper.uuid_struct; 4820a6e7e3bSLouis Mayencourt policies[load_info[i].image_id].image_spec = (uintptr_t)uuid_ptr; 4830a6e7e3bSLouis Mayencourt policies[load_info[i].image_id].dev_handle = &fip_dev_handle; 4840a6e7e3bSLouis Mayencourt policies[load_info[i].image_id].check = open_fip; 4850a6e7e3bSLouis Mayencourt } 4860a6e7e3bSLouis Mayencourt return 0; 4870a6e7e3bSLouis Mayencourt } 4880a6e7e3bSLouis Mayencourt 489a6de824fSLouis Mayencourt #if ARM_IO_IN_DTB 49025d740c4SMadhukar Pappireddy FCONF_REGISTER_POPULATOR(TB_FW, arm_io, fconf_populate_arm_io_policies); 491a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */ 4920a6e7e3bSLouis Mayencourt 4930a6e7e3bSLouis Mayencourt #endif /* IMAGE_BL2 */ 494