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