10a6e7e3bSLouis Mayencourt /* 2*27f0b734SManish 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 /* 28*27f0b734SManish V Badarkhe * - With ARM_GPT_SUPPORT and BL1: a fixed FIP offset within the GPT image is used. 29*27f0b734SManish V Badarkhe * - With ARM_GPT_SUPPORT and BL2: the FIP offset is derived from 30*27f0b734SManish V Badarkhe * the partition table entries at runtime. 31*27f0b734SManish 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 34*27f0b734SManish V Badarkhe #if IMAGE_BL1 35ef1daa42SManish V Badarkhe .offset = PLAT_ARM_FLASH_IMAGE_BASE + PLAT_ARM_FIP_OFFSET_IN_GPT, 36*27f0b734SManish 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 }, 1500a6e7e3bSLouis Mayencourt [BL2_IMAGE_ID] = { 1510a6e7e3bSLouis Mayencourt &fip_dev_handle, 1520a6e7e3bSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL2_IMAGE_ID], 1530a6e7e3bSLouis Mayencourt open_fip 1540a6e7e3bSLouis Mayencourt }, 1550a6e7e3bSLouis Mayencourt [TB_FW_CONFIG_ID] = { 1560a6e7e3bSLouis Mayencourt &fip_dev_handle, 1570a6e7e3bSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TB_FW_CONFIG_ID], 1580a6e7e3bSLouis Mayencourt open_fip 1590a6e7e3bSLouis Mayencourt }, 160243875eaSLouis Mayencourt [FW_CONFIG_ID] = { 161243875eaSLouis Mayencourt &fip_dev_handle, 162243875eaSLouis Mayencourt (uintptr_t)&arm_uuid_spec[FW_CONFIG_ID], 163243875eaSLouis Mayencourt open_fip 164243875eaSLouis Mayencourt }, 165a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB 166a6de824fSLouis Mayencourt [SCP_BL2_IMAGE_ID] = { 167a6de824fSLouis Mayencourt &fip_dev_handle, 168a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SCP_BL2_IMAGE_ID], 169a6de824fSLouis Mayencourt open_fip 170a6de824fSLouis Mayencourt }, 171a6de824fSLouis Mayencourt [BL31_IMAGE_ID] = { 172a6de824fSLouis Mayencourt &fip_dev_handle, 173a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL31_IMAGE_ID], 174a6de824fSLouis Mayencourt open_fip 175a6de824fSLouis Mayencourt }, 176a6de824fSLouis Mayencourt [BL32_IMAGE_ID] = { 177a6de824fSLouis Mayencourt &fip_dev_handle, 178a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL32_IMAGE_ID], 179a6de824fSLouis Mayencourt open_fip 180a6de824fSLouis Mayencourt }, 181a6de824fSLouis Mayencourt [BL32_EXTRA1_IMAGE_ID] = { 182a6de824fSLouis Mayencourt &fip_dev_handle, 183a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL32_EXTRA1_IMAGE_ID], 184a6de824fSLouis Mayencourt open_fip 185a6de824fSLouis Mayencourt }, 186a6de824fSLouis Mayencourt [BL32_EXTRA2_IMAGE_ID] = { 187a6de824fSLouis Mayencourt &fip_dev_handle, 188a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL32_EXTRA2_IMAGE_ID], 189a6de824fSLouis Mayencourt open_fip 190a6de824fSLouis Mayencourt }, 191a6de824fSLouis Mayencourt [BL33_IMAGE_ID] = { 192a6de824fSLouis Mayencourt &fip_dev_handle, 193a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[BL33_IMAGE_ID], 194a6de824fSLouis Mayencourt open_fip 195a6de824fSLouis Mayencourt }, 1969d870b79SZelalem Aweke [RMM_IMAGE_ID] = { 1979d870b79SZelalem Aweke &fip_dev_handle, 1989d870b79SZelalem Aweke (uintptr_t)&arm_uuid_spec[RMM_IMAGE_ID], 1999d870b79SZelalem Aweke open_fip 2009d870b79SZelalem Aweke }, 201a6de824fSLouis Mayencourt [HW_CONFIG_ID] = { 202a6de824fSLouis Mayencourt &fip_dev_handle, 203a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[HW_CONFIG_ID], 204a6de824fSLouis Mayencourt open_fip 205a6de824fSLouis Mayencourt }, 206a6de824fSLouis Mayencourt [SOC_FW_CONFIG_ID] = { 207a6de824fSLouis Mayencourt &fip_dev_handle, 208a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SOC_FW_CONFIG_ID], 209a6de824fSLouis Mayencourt open_fip 210a6de824fSLouis Mayencourt }, 211a6de824fSLouis Mayencourt [TOS_FW_CONFIG_ID] = { 212a6de824fSLouis Mayencourt &fip_dev_handle, 213a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TOS_FW_CONFIG_ID], 214a6de824fSLouis Mayencourt open_fip 215a6de824fSLouis Mayencourt }, 216a6de824fSLouis Mayencourt [NT_FW_CONFIG_ID] = { 217a6de824fSLouis Mayencourt &fip_dev_handle, 218a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[NT_FW_CONFIG_ID], 219a6de824fSLouis Mayencourt open_fip 220a6de824fSLouis Mayencourt }, 221352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 222352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_IMAGE_ID] = { 22333bcaed1SRob Hughes &fip_dev_handle, 224352366edSRajasekaran Kalidoss (uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_IMAGE_ID], 22533bcaed1SRob Hughes open_fip 22633bcaed1SRob Hughes }, 227352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 228a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */ 2290a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT 2300a6e7e3bSLouis Mayencourt [TRUSTED_BOOT_FW_CERT_ID] = { 2310a6e7e3bSLouis Mayencourt &fip_dev_handle, 2320a6e7e3bSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TRUSTED_BOOT_FW_CERT_ID], 2330a6e7e3bSLouis Mayencourt open_fip 2340a6e7e3bSLouis Mayencourt }, 235a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB 236d5de70ceSlaurenw-arm [CCA_CONTENT_CERT_ID] = { 237d5de70ceSlaurenw-arm &fip_dev_handle, 238d5de70ceSlaurenw-arm (uintptr_t)&arm_uuid_spec[CCA_CONTENT_CERT_ID], 239d5de70ceSlaurenw-arm open_fip 240d5de70ceSlaurenw-arm }, 241d5de70ceSlaurenw-arm [CORE_SWD_KEY_CERT_ID] = { 242d5de70ceSlaurenw-arm &fip_dev_handle, 243d5de70ceSlaurenw-arm (uintptr_t)&arm_uuid_spec[CORE_SWD_KEY_CERT_ID], 244d5de70ceSlaurenw-arm open_fip 245d5de70ceSlaurenw-arm }, 246d5de70ceSlaurenw-arm [PLAT_KEY_CERT_ID] = { 247d5de70ceSlaurenw-arm &fip_dev_handle, 248d5de70ceSlaurenw-arm (uintptr_t)&arm_uuid_spec[PLAT_KEY_CERT_ID], 249d5de70ceSlaurenw-arm open_fip 250d5de70ceSlaurenw-arm }, 251a6de824fSLouis Mayencourt [TRUSTED_KEY_CERT_ID] = { 252a6de824fSLouis Mayencourt &fip_dev_handle, 253a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TRUSTED_KEY_CERT_ID], 254a6de824fSLouis Mayencourt open_fip 255a6de824fSLouis Mayencourt }, 256a6de824fSLouis Mayencourt [SCP_FW_KEY_CERT_ID] = { 257a6de824fSLouis Mayencourt &fip_dev_handle, 258a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SCP_FW_KEY_CERT_ID], 259a6de824fSLouis Mayencourt open_fip 260a6de824fSLouis Mayencourt }, 261a6de824fSLouis Mayencourt [SOC_FW_KEY_CERT_ID] = { 262a6de824fSLouis Mayencourt &fip_dev_handle, 263a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SOC_FW_KEY_CERT_ID], 264a6de824fSLouis Mayencourt open_fip 265a6de824fSLouis Mayencourt }, 266a6de824fSLouis Mayencourt [TRUSTED_OS_FW_KEY_CERT_ID] = { 267a6de824fSLouis Mayencourt &fip_dev_handle, 268a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_KEY_CERT_ID], 269a6de824fSLouis Mayencourt open_fip 270a6de824fSLouis Mayencourt }, 271a6de824fSLouis Mayencourt [NON_TRUSTED_FW_KEY_CERT_ID] = { 272a6de824fSLouis Mayencourt &fip_dev_handle, 273a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_KEY_CERT_ID], 274a6de824fSLouis Mayencourt open_fip 275a6de824fSLouis Mayencourt }, 276a6de824fSLouis Mayencourt [SCP_FW_CONTENT_CERT_ID] = { 277a6de824fSLouis Mayencourt &fip_dev_handle, 278a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SCP_FW_CONTENT_CERT_ID], 279a6de824fSLouis Mayencourt open_fip 280a6de824fSLouis Mayencourt }, 281a6de824fSLouis Mayencourt [SOC_FW_CONTENT_CERT_ID] = { 282a6de824fSLouis Mayencourt &fip_dev_handle, 283a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[SOC_FW_CONTENT_CERT_ID], 284a6de824fSLouis Mayencourt open_fip 285a6de824fSLouis Mayencourt }, 286a6de824fSLouis Mayencourt [TRUSTED_OS_FW_CONTENT_CERT_ID] = { 287a6de824fSLouis Mayencourt &fip_dev_handle, 288a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_CONTENT_CERT_ID], 289a6de824fSLouis Mayencourt open_fip 290a6de824fSLouis Mayencourt }, 291a6de824fSLouis Mayencourt [NON_TRUSTED_FW_CONTENT_CERT_ID] = { 292a6de824fSLouis Mayencourt &fip_dev_handle, 293a6de824fSLouis Mayencourt (uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_CONTENT_CERT_ID], 294a6de824fSLouis Mayencourt open_fip 295a6de824fSLouis Mayencourt }, 29644f1aa8eSManish Pandey #if defined(SPD_spmd) 29703a5225cSManish Pandey [SIP_SP_CONTENT_CERT_ID] = { 29844f1aa8eSManish Pandey &fip_dev_handle, 29903a5225cSManish Pandey (uintptr_t)&arm_uuid_spec[SIP_SP_CONTENT_CERT_ID], 30044f1aa8eSManish Pandey open_fip 30144f1aa8eSManish Pandey }, 302990d972fSManish Pandey [PLAT_SP_CONTENT_CERT_ID] = { 303990d972fSManish Pandey &fip_dev_handle, 304990d972fSManish Pandey (uintptr_t)&arm_uuid_spec[PLAT_SP_CONTENT_CERT_ID], 305990d972fSManish Pandey open_fip 306990d972fSManish Pandey }, 30744f1aa8eSManish Pandey #endif 308352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 309352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_KEY_CERT_ID] = { 31033bcaed1SRob Hughes &fip_dev_handle, 311352366edSRajasekaran Kalidoss (uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_KEY_CERT_ID], 31233bcaed1SRob Hughes open_fip 31333bcaed1SRob Hughes }, 314352366edSRajasekaran Kalidoss [ETHOSN_NPU_FW_CONTENT_CERT_ID] = { 31533bcaed1SRob Hughes &fip_dev_handle, 316352366edSRajasekaran Kalidoss (uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_CONTENT_CERT_ID], 31733bcaed1SRob Hughes open_fip 31833bcaed1SRob Hughes }, 319352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 320a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */ 3210a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */ 3220a6e7e3bSLouis Mayencourt }; 3230a6e7e3bSLouis Mayencourt 3240a6e7e3bSLouis Mayencourt #ifdef IMAGE_BL2 3250a6e7e3bSLouis Mayencourt 326e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_BASE U(10) 327e208f324SRob Hughes 328352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 32933bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU U(1) 33033bcaed1SRob Hughes #else 33133bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU U(0) 332352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 33333bcaed1SRob Hughes 3340a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT 335e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_TBB U(12) 3360a6e7e3bSLouis Mayencourt #else 337e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_TBB U(0) 338e208f324SRob Hughes #endif /* TRUSTED_BOARD_BOOT */ 339e208f324SRob Hughes 340e208f324SRob Hughes #if TRUSTED_BOARD_BOOT && defined(SPD_spmd) 341e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_SPD U(2) 342e208f324SRob Hughes #else 343e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_SPD U(0) 344e208f324SRob Hughes #endif /* TRUSTED_BOARD_BOOT && defined(SPD_spmd) */ 345e208f324SRob Hughes 346352366edSRajasekaran Kalidoss #if TRUSTED_BOARD_BOOT && ETHOSN_NPU_TZMP1 34733bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU_TBB U(2) 34833bcaed1SRob Hughes #else 34933bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU_TBB U(0) 350352366edSRajasekaran Kalidoss #endif /* TRUSTED_BOARD_BOOT && ETHOSN_NPU_TZMP1 */ 35133bcaed1SRob Hughes 352e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUMBER FCONF_ARM_IO_UUID_NUM_BASE + \ 35333bcaed1SRob Hughes FCONF_ARM_IO_UUID_NUM_NPU + \ 35433bcaed1SRob Hughes FCONF_ARM_IO_UUID_NUM_TBB + \ 35533bcaed1SRob Hughes FCONF_ARM_IO_UUID_NUM_SPD + \ 35633bcaed1SRob Hughes FCONF_ARM_IO_UUID_NUM_NPU_TBB 3570a6e7e3bSLouis Mayencourt 3580a6e7e3bSLouis Mayencourt static io_uuid_spec_t fconf_arm_uuids[FCONF_ARM_IO_UUID_NUMBER]; 3590a6e7e3bSLouis Mayencourt static OBJECT_POOL_ARRAY(fconf_arm_uuids_pool, fconf_arm_uuids); 3600a6e7e3bSLouis Mayencourt 3610a6e7e3bSLouis Mayencourt struct policies_load_info { 3620a6e7e3bSLouis Mayencourt unsigned int image_id; 3630a6e7e3bSLouis Mayencourt const char *name; 3640a6e7e3bSLouis Mayencourt }; 3650a6e7e3bSLouis Mayencourt 3660a6e7e3bSLouis Mayencourt /* image id to property name table */ 3670a6e7e3bSLouis Mayencourt static const struct policies_load_info load_info[FCONF_ARM_IO_UUID_NUMBER] = { 3680a6e7e3bSLouis Mayencourt {SCP_BL2_IMAGE_ID, "scp_bl2_uuid"}, 3690a6e7e3bSLouis Mayencourt {BL31_IMAGE_ID, "bl31_uuid"}, 3700a6e7e3bSLouis Mayencourt {BL32_IMAGE_ID, "bl32_uuid"}, 3710a6e7e3bSLouis Mayencourt {BL32_EXTRA1_IMAGE_ID, "bl32_extra1_uuid"}, 3720a6e7e3bSLouis Mayencourt {BL32_EXTRA2_IMAGE_ID, "bl32_extra2_uuid"}, 3730a6e7e3bSLouis Mayencourt {BL33_IMAGE_ID, "bl33_uuid"}, 3740a6e7e3bSLouis Mayencourt {HW_CONFIG_ID, "hw_cfg_uuid"}, 3750a6e7e3bSLouis Mayencourt {SOC_FW_CONFIG_ID, "soc_fw_cfg_uuid"}, 3760a6e7e3bSLouis Mayencourt {TOS_FW_CONFIG_ID, "tos_fw_cfg_uuid"}, 3770a6e7e3bSLouis Mayencourt {NT_FW_CONFIG_ID, "nt_fw_cfg_uuid"}, 378352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 379352366edSRajasekaran Kalidoss {ETHOSN_NPU_FW_IMAGE_ID, "ethosn_npu_fw_uuid"}, 380352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 3810a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT 382d5de70ceSlaurenw-arm {CCA_CONTENT_CERT_ID, "cca_cert_uuid"}, 383d5de70ceSlaurenw-arm {CORE_SWD_KEY_CERT_ID, "core_swd_cert_uuid"}, 384d5de70ceSlaurenw-arm {PLAT_KEY_CERT_ID, "plat_cert_uuid"}, 3850a6e7e3bSLouis Mayencourt {TRUSTED_KEY_CERT_ID, "t_key_cert_uuid"}, 3860a6e7e3bSLouis Mayencourt {SCP_FW_KEY_CERT_ID, "scp_fw_key_uuid"}, 3870a6e7e3bSLouis Mayencourt {SOC_FW_KEY_CERT_ID, "soc_fw_key_uuid"}, 3880a6e7e3bSLouis Mayencourt {TRUSTED_OS_FW_KEY_CERT_ID, "tos_fw_key_cert_uuid"}, 3890a6e7e3bSLouis Mayencourt {NON_TRUSTED_FW_KEY_CERT_ID, "nt_fw_key_cert_uuid"}, 3900a6e7e3bSLouis Mayencourt {SCP_FW_CONTENT_CERT_ID, "scp_fw_content_cert_uuid"}, 3910a6e7e3bSLouis Mayencourt {SOC_FW_CONTENT_CERT_ID, "soc_fw_content_cert_uuid"}, 3920a6e7e3bSLouis Mayencourt {TRUSTED_OS_FW_CONTENT_CERT_ID, "tos_fw_content_cert_uuid"}, 3930a6e7e3bSLouis Mayencourt {NON_TRUSTED_FW_CONTENT_CERT_ID, "nt_fw_content_cert_uuid"}, 39444f1aa8eSManish Pandey #if defined(SPD_spmd) 39503a5225cSManish Pandey {SIP_SP_CONTENT_CERT_ID, "sip_sp_content_cert_uuid"}, 396990d972fSManish Pandey {PLAT_SP_CONTENT_CERT_ID, "plat_sp_content_cert_uuid"}, 39744f1aa8eSManish Pandey #endif 398352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1 399352366edSRajasekaran Kalidoss {ETHOSN_NPU_FW_KEY_CERT_ID, "ethosn_npu_fw_key_cert_uuid"}, 400352366edSRajasekaran Kalidoss {ETHOSN_NPU_FW_CONTENT_CERT_ID, "ethosn_npu_fw_content_cert_uuid"}, 401352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */ 4020a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */ 4030a6e7e3bSLouis Mayencourt }; 4040a6e7e3bSLouis Mayencourt 4050a6e7e3bSLouis Mayencourt int fconf_populate_arm_io_policies(uintptr_t config) 4060a6e7e3bSLouis Mayencourt { 4070a6e7e3bSLouis Mayencourt int err, node; 4080a6e7e3bSLouis Mayencourt unsigned int i; 4090a6e7e3bSLouis Mayencourt 4100a6e7e3bSLouis Mayencourt union uuid_helper_t uuid_helper; 4110a6e7e3bSLouis Mayencourt io_uuid_spec_t *uuid_ptr; 4120a6e7e3bSLouis Mayencourt 4130a6e7e3bSLouis Mayencourt /* As libfdt uses void *, we can't avoid this cast */ 4140a6e7e3bSLouis Mayencourt const void *dtb = (void *)config; 4150a6e7e3bSLouis Mayencourt 4160a6e7e3bSLouis Mayencourt /* Assert the node offset point to "arm,io-fip-handle" compatible property */ 4170a6e7e3bSLouis Mayencourt const char *compatible_str = "arm,io-fip-handle"; 4180a6e7e3bSLouis Mayencourt node = fdt_node_offset_by_compatible(dtb, -1, compatible_str); 4190a6e7e3bSLouis Mayencourt if (node < 0) { 4200a6e7e3bSLouis Mayencourt ERROR("FCONF: Can't find %s compatible in dtb\n", compatible_str); 4210a6e7e3bSLouis Mayencourt return node; 4220a6e7e3bSLouis Mayencourt } 4230a6e7e3bSLouis Mayencourt 4240a6e7e3bSLouis Mayencourt /* Locate the uuid cells and read the value for all the load info uuid */ 4250a6e7e3bSLouis Mayencourt for (i = 0; i < FCONF_ARM_IO_UUID_NUMBER; i++) { 4260a6e7e3bSLouis Mayencourt uuid_ptr = pool_alloc(&fconf_arm_uuids_pool); 4277d111d99SDavid Horstmann err = fdtw_read_uuid(dtb, node, load_info[i].name, 16, 4287d111d99SDavid Horstmann (uint8_t *)&uuid_helper); 4290a6e7e3bSLouis Mayencourt if (err < 0) { 4300a6e7e3bSLouis Mayencourt WARN("FCONF: Read cell failed for %s\n", load_info[i].name); 4310a6e7e3bSLouis Mayencourt return err; 4320a6e7e3bSLouis Mayencourt } 4330a6e7e3bSLouis Mayencourt 4347d111d99SDavid Horstmann VERBOSE("FCONF: arm-io_policies.%s cell found with value = " 4357d111d99SDavid Horstmann "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", 4360a6e7e3bSLouis Mayencourt load_info[i].name, 4377d111d99SDavid Horstmann uuid_helper.uuid_struct.time_low[0], uuid_helper.uuid_struct.time_low[1], 4387d111d99SDavid Horstmann uuid_helper.uuid_struct.time_low[2], uuid_helper.uuid_struct.time_low[3], 4397d111d99SDavid Horstmann uuid_helper.uuid_struct.time_mid[0], uuid_helper.uuid_struct.time_mid[1], 4407d111d99SDavid Horstmann uuid_helper.uuid_struct.time_hi_and_version[0], 4417d111d99SDavid Horstmann uuid_helper.uuid_struct.time_hi_and_version[1], 4427d111d99SDavid Horstmann uuid_helper.uuid_struct.clock_seq_hi_and_reserved, 4437d111d99SDavid Horstmann uuid_helper.uuid_struct.clock_seq_low, 4447d111d99SDavid Horstmann uuid_helper.uuid_struct.node[0], uuid_helper.uuid_struct.node[1], 4457d111d99SDavid Horstmann uuid_helper.uuid_struct.node[2], uuid_helper.uuid_struct.node[3], 4467d111d99SDavid Horstmann uuid_helper.uuid_struct.node[4], uuid_helper.uuid_struct.node[5]); 4470a6e7e3bSLouis Mayencourt 4480a6e7e3bSLouis Mayencourt uuid_ptr->uuid = uuid_helper.uuid_struct; 4490a6e7e3bSLouis Mayencourt policies[load_info[i].image_id].image_spec = (uintptr_t)uuid_ptr; 4500a6e7e3bSLouis Mayencourt policies[load_info[i].image_id].dev_handle = &fip_dev_handle; 4510a6e7e3bSLouis Mayencourt policies[load_info[i].image_id].check = open_fip; 4520a6e7e3bSLouis Mayencourt } 4530a6e7e3bSLouis Mayencourt return 0; 4540a6e7e3bSLouis Mayencourt } 4550a6e7e3bSLouis Mayencourt 456a6de824fSLouis Mayencourt #if ARM_IO_IN_DTB 45725d740c4SMadhukar Pappireddy FCONF_REGISTER_POPULATOR(TB_FW, arm_io, fconf_populate_arm_io_policies); 458a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */ 4590a6e7e3bSLouis Mayencourt 4600a6e7e3bSLouis Mayencourt #endif /* IMAGE_BL2 */ 461