1 /* 2 * Copyright (c) 2019-2020, ARM Limited. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <assert.h> 8 9 #include <common/debug.h> 10 #include <common/fdt_wrappers.h> 11 #include <drivers/io/io_storage.h> 12 #include <lib/object_pool.h> 13 #include <libfdt.h> 14 #include <tools_share/firmware_image_package.h> 15 16 #include <plat/arm/common/arm_fconf_getter.h> 17 #include <plat/arm/common/arm_fconf_io_storage.h> 18 #include <platform_def.h> 19 20 const io_block_spec_t fip_block_spec = { 21 .offset = PLAT_ARM_FIP_BASE, 22 .length = PLAT_ARM_FIP_MAX_SIZE 23 }; 24 25 const io_uuid_spec_t arm_uuid_spec[MAX_NUMBER_IDS] = { 26 [BL2_IMAGE_ID] = {UUID_TRUSTED_BOOT_FIRMWARE_BL2}, 27 [TB_FW_CONFIG_ID] = {UUID_TB_FW_CONFIG}, 28 #if !ARM_IO_IN_DTB 29 [SCP_BL2_IMAGE_ID] = {UUID_SCP_FIRMWARE_SCP_BL2}, 30 [BL31_IMAGE_ID] = {UUID_EL3_RUNTIME_FIRMWARE_BL31}, 31 [BL32_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32}, 32 [BL32_EXTRA1_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA1}, 33 [BL32_EXTRA2_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA2}, 34 [BL33_IMAGE_ID] = {UUID_NON_TRUSTED_FIRMWARE_BL33}, 35 [HW_CONFIG_ID] = {UUID_HW_CONFIG}, 36 [SOC_FW_CONFIG_ID] = {UUID_SOC_FW_CONFIG}, 37 [TOS_FW_CONFIG_ID] = {UUID_TOS_FW_CONFIG}, 38 [NT_FW_CONFIG_ID] = {UUID_NT_FW_CONFIG}, 39 #endif /* ARM_IO_IN_DTB */ 40 #if TRUSTED_BOARD_BOOT 41 [TRUSTED_BOOT_FW_CERT_ID] = {UUID_TRUSTED_BOOT_FW_CERT}, 42 #if !ARM_IO_IN_DTB 43 [TRUSTED_KEY_CERT_ID] = {UUID_TRUSTED_KEY_CERT}, 44 [SCP_FW_KEY_CERT_ID] = {UUID_SCP_FW_KEY_CERT}, 45 [SOC_FW_KEY_CERT_ID] = {UUID_SOC_FW_KEY_CERT}, 46 [TRUSTED_OS_FW_KEY_CERT_ID] = {UUID_TRUSTED_OS_FW_KEY_CERT}, 47 [NON_TRUSTED_FW_KEY_CERT_ID] = {UUID_NON_TRUSTED_FW_KEY_CERT}, 48 [SCP_FW_CONTENT_CERT_ID] = {UUID_SCP_FW_CONTENT_CERT}, 49 [SOC_FW_CONTENT_CERT_ID] = {UUID_SOC_FW_CONTENT_CERT}, 50 [TRUSTED_OS_FW_CONTENT_CERT_ID] = {UUID_TRUSTED_OS_FW_CONTENT_CERT}, 51 [NON_TRUSTED_FW_CONTENT_CERT_ID] = {UUID_NON_TRUSTED_FW_CONTENT_CERT}, 52 #if defined(SPD_spmd) 53 [SP_CONTENT_CERT_ID] = {UUID_SIP_SECURE_PARTITION_CONTENT_CERT}, 54 #endif 55 #endif /* ARM_IO_IN_DTB */ 56 #endif /* TRUSTED_BOARD_BOOT */ 57 }; 58 59 /* By default, ARM platforms load images from the FIP */ 60 struct plat_io_policy policies[MAX_NUMBER_IDS] = { 61 [FIP_IMAGE_ID] = { 62 &memmap_dev_handle, 63 (uintptr_t)&fip_block_spec, 64 open_memmap 65 }, 66 [BL2_IMAGE_ID] = { 67 &fip_dev_handle, 68 (uintptr_t)&arm_uuid_spec[BL2_IMAGE_ID], 69 open_fip 70 }, 71 [TB_FW_CONFIG_ID] = { 72 &fip_dev_handle, 73 (uintptr_t)&arm_uuid_spec[TB_FW_CONFIG_ID], 74 open_fip 75 }, 76 #if !ARM_IO_IN_DTB 77 [SCP_BL2_IMAGE_ID] = { 78 &fip_dev_handle, 79 (uintptr_t)&arm_uuid_spec[SCP_BL2_IMAGE_ID], 80 open_fip 81 }, 82 [BL31_IMAGE_ID] = { 83 &fip_dev_handle, 84 (uintptr_t)&arm_uuid_spec[BL31_IMAGE_ID], 85 open_fip 86 }, 87 [BL32_IMAGE_ID] = { 88 &fip_dev_handle, 89 (uintptr_t)&arm_uuid_spec[BL32_IMAGE_ID], 90 open_fip 91 }, 92 [BL32_EXTRA1_IMAGE_ID] = { 93 &fip_dev_handle, 94 (uintptr_t)&arm_uuid_spec[BL32_EXTRA1_IMAGE_ID], 95 open_fip 96 }, 97 [BL32_EXTRA2_IMAGE_ID] = { 98 &fip_dev_handle, 99 (uintptr_t)&arm_uuid_spec[BL32_EXTRA2_IMAGE_ID], 100 open_fip 101 }, 102 [BL33_IMAGE_ID] = { 103 &fip_dev_handle, 104 (uintptr_t)&arm_uuid_spec[BL33_IMAGE_ID], 105 open_fip 106 }, 107 [HW_CONFIG_ID] = { 108 &fip_dev_handle, 109 (uintptr_t)&arm_uuid_spec[HW_CONFIG_ID], 110 open_fip 111 }, 112 [SOC_FW_CONFIG_ID] = { 113 &fip_dev_handle, 114 (uintptr_t)&arm_uuid_spec[SOC_FW_CONFIG_ID], 115 open_fip 116 }, 117 [TOS_FW_CONFIG_ID] = { 118 &fip_dev_handle, 119 (uintptr_t)&arm_uuid_spec[TOS_FW_CONFIG_ID], 120 open_fip 121 }, 122 [NT_FW_CONFIG_ID] = { 123 &fip_dev_handle, 124 (uintptr_t)&arm_uuid_spec[NT_FW_CONFIG_ID], 125 open_fip 126 }, 127 #endif /* ARM_IO_IN_DTB */ 128 #if TRUSTED_BOARD_BOOT 129 [TRUSTED_BOOT_FW_CERT_ID] = { 130 &fip_dev_handle, 131 (uintptr_t)&arm_uuid_spec[TRUSTED_BOOT_FW_CERT_ID], 132 open_fip 133 }, 134 #if !ARM_IO_IN_DTB 135 [TRUSTED_KEY_CERT_ID] = { 136 &fip_dev_handle, 137 (uintptr_t)&arm_uuid_spec[TRUSTED_KEY_CERT_ID], 138 open_fip 139 }, 140 [SCP_FW_KEY_CERT_ID] = { 141 &fip_dev_handle, 142 (uintptr_t)&arm_uuid_spec[SCP_FW_KEY_CERT_ID], 143 open_fip 144 }, 145 [SOC_FW_KEY_CERT_ID] = { 146 &fip_dev_handle, 147 (uintptr_t)&arm_uuid_spec[SOC_FW_KEY_CERT_ID], 148 open_fip 149 }, 150 [TRUSTED_OS_FW_KEY_CERT_ID] = { 151 &fip_dev_handle, 152 (uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_KEY_CERT_ID], 153 open_fip 154 }, 155 [NON_TRUSTED_FW_KEY_CERT_ID] = { 156 &fip_dev_handle, 157 (uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_KEY_CERT_ID], 158 open_fip 159 }, 160 [SCP_FW_CONTENT_CERT_ID] = { 161 &fip_dev_handle, 162 (uintptr_t)&arm_uuid_spec[SCP_FW_CONTENT_CERT_ID], 163 open_fip 164 }, 165 [SOC_FW_CONTENT_CERT_ID] = { 166 &fip_dev_handle, 167 (uintptr_t)&arm_uuid_spec[SOC_FW_CONTENT_CERT_ID], 168 open_fip 169 }, 170 [TRUSTED_OS_FW_CONTENT_CERT_ID] = { 171 &fip_dev_handle, 172 (uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_CONTENT_CERT_ID], 173 open_fip 174 }, 175 [NON_TRUSTED_FW_CONTENT_CERT_ID] = { 176 &fip_dev_handle, 177 (uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_CONTENT_CERT_ID], 178 open_fip 179 }, 180 #if defined(SPD_spmd) 181 [SP_CONTENT_CERT_ID] = { 182 &fip_dev_handle, 183 (uintptr_t)&arm_uuid_spec[SP_CONTENT_CERT_ID], 184 open_fip 185 }, 186 #endif 187 #endif /* ARM_IO_IN_DTB */ 188 #endif /* TRUSTED_BOARD_BOOT */ 189 }; 190 191 #ifdef IMAGE_BL2 192 193 #if TRUSTED_BOARD_BOOT 194 #define FCONF_ARM_IO_UUID_NUMBER U(20) 195 #else 196 #define FCONF_ARM_IO_UUID_NUMBER U(10) 197 #endif 198 199 static io_uuid_spec_t fconf_arm_uuids[FCONF_ARM_IO_UUID_NUMBER]; 200 static OBJECT_POOL_ARRAY(fconf_arm_uuids_pool, fconf_arm_uuids); 201 202 struct policies_load_info { 203 unsigned int image_id; 204 const char *name; 205 }; 206 207 /* image id to property name table */ 208 static const struct policies_load_info load_info[FCONF_ARM_IO_UUID_NUMBER] = { 209 {SCP_BL2_IMAGE_ID, "scp_bl2_uuid"}, 210 {BL31_IMAGE_ID, "bl31_uuid"}, 211 {BL32_IMAGE_ID, "bl32_uuid"}, 212 {BL32_EXTRA1_IMAGE_ID, "bl32_extra1_uuid"}, 213 {BL32_EXTRA2_IMAGE_ID, "bl32_extra2_uuid"}, 214 {BL33_IMAGE_ID, "bl33_uuid"}, 215 {HW_CONFIG_ID, "hw_cfg_uuid"}, 216 {SOC_FW_CONFIG_ID, "soc_fw_cfg_uuid"}, 217 {TOS_FW_CONFIG_ID, "tos_fw_cfg_uuid"}, 218 {NT_FW_CONFIG_ID, "nt_fw_cfg_uuid"}, 219 #if TRUSTED_BOARD_BOOT 220 {TRUSTED_KEY_CERT_ID, "t_key_cert_uuid"}, 221 {SCP_FW_KEY_CERT_ID, "scp_fw_key_uuid"}, 222 {SOC_FW_KEY_CERT_ID, "soc_fw_key_uuid"}, 223 {TRUSTED_OS_FW_KEY_CERT_ID, "tos_fw_key_cert_uuid"}, 224 {NON_TRUSTED_FW_KEY_CERT_ID, "nt_fw_key_cert_uuid"}, 225 {SCP_FW_CONTENT_CERT_ID, "scp_fw_content_cert_uuid"}, 226 {SOC_FW_CONTENT_CERT_ID, "soc_fw_content_cert_uuid"}, 227 {TRUSTED_OS_FW_CONTENT_CERT_ID, "tos_fw_content_cert_uuid"}, 228 {NON_TRUSTED_FW_CONTENT_CERT_ID, "nt_fw_content_cert_uuid"}, 229 #if defined(SPD_spmd) 230 {SP_CONTENT_CERT_ID, "sp_content_cert_uuid"}, 231 #endif 232 #endif /* TRUSTED_BOARD_BOOT */ 233 }; 234 235 int fconf_populate_arm_io_policies(uintptr_t config) 236 { 237 int err, node; 238 unsigned int i; 239 240 union uuid_helper_t uuid_helper; 241 io_uuid_spec_t *uuid_ptr; 242 243 /* As libfdt uses void *, we can't avoid this cast */ 244 const void *dtb = (void *)config; 245 246 /* Assert the node offset point to "arm,io-fip-handle" compatible property */ 247 const char *compatible_str = "arm,io-fip-handle"; 248 node = fdt_node_offset_by_compatible(dtb, -1, compatible_str); 249 if (node < 0) { 250 ERROR("FCONF: Can't find %s compatible in dtb\n", compatible_str); 251 return node; 252 } 253 254 /* Locate the uuid cells and read the value for all the load info uuid */ 255 for (i = 0; i < FCONF_ARM_IO_UUID_NUMBER; i++) { 256 uuid_ptr = pool_alloc(&fconf_arm_uuids_pool); 257 err = fdt_read_uint32_array(dtb, node, load_info[i].name, 258 4, uuid_helper.word); 259 if (err < 0) { 260 WARN("FCONF: Read cell failed for %s\n", load_info[i].name); 261 return err; 262 } 263 264 VERBOSE("FCONF: arm-io_policies.%s cell found with value = 0x%x 0x%x 0x%x 0x%x\n", 265 load_info[i].name, 266 uuid_helper.word[0], uuid_helper.word[1], 267 uuid_helper.word[2], uuid_helper.word[3]); 268 269 uuid_ptr->uuid = uuid_helper.uuid_struct; 270 policies[load_info[i].image_id].image_spec = (uintptr_t)uuid_ptr; 271 policies[load_info[i].image_id].dev_handle = &fip_dev_handle; 272 policies[load_info[i].image_id].check = open_fip; 273 } 274 return 0; 275 } 276 277 #if ARM_IO_IN_DTB 278 FCONF_REGISTER_POPULATOR(TB_FW, arm_io, fconf_populate_arm_io_policies); 279 #endif /* ARM_IO_IN_DTB */ 280 281 #endif /* IMAGE_BL2 */ 282