1*717448d6SSheetal Tigadoli /* 2*717448d6SSheetal Tigadoli * Copyright (c) 2019-2020, ARM Limited and Contributors. All rights reserved. 3*717448d6SSheetal Tigadoli * 4*717448d6SSheetal Tigadoli * SPDX-License-Identifier: BSD-3-Clause 5*717448d6SSheetal Tigadoli */ 6*717448d6SSheetal Tigadoli 7*717448d6SSheetal Tigadoli #include <assert.h> 8*717448d6SSheetal Tigadoli #include <string.h> 9*717448d6SSheetal Tigadoli 10*717448d6SSheetal Tigadoli #include <common/debug.h> 11*717448d6SSheetal Tigadoli #include <drivers/io/io_driver.h> 12*717448d6SSheetal Tigadoli #include <drivers/io/io_fip.h> 13*717448d6SSheetal Tigadoli #include <drivers/io/io_memmap.h> 14*717448d6SSheetal Tigadoli #include <drivers/io/io_storage.h> 15*717448d6SSheetal Tigadoli #include <tools_share/firmware_image_package.h> 16*717448d6SSheetal Tigadoli 17*717448d6SSheetal Tigadoli #include <cmn_plat_def.h> 18*717448d6SSheetal Tigadoli #include <cmn_plat_util.h> 19*717448d6SSheetal Tigadoli #include <plat_brcm.h> 20*717448d6SSheetal Tigadoli #include <platform_def.h> 21*717448d6SSheetal Tigadoli 22*717448d6SSheetal Tigadoli /* IO devices */ 23*717448d6SSheetal Tigadoli static const io_dev_connector_t *fip_dev_con; 24*717448d6SSheetal Tigadoli static uintptr_t fip_dev_handle; 25*717448d6SSheetal Tigadoli static const io_dev_connector_t *memmap_dev_con; 26*717448d6SSheetal Tigadoli static uintptr_t memmap_dev_handle; 27*717448d6SSheetal Tigadoli 28*717448d6SSheetal Tigadoli static const io_block_spec_t fip_block_spec = { 29*717448d6SSheetal Tigadoli .offset = PLAT_BRCM_FIP_BASE, 30*717448d6SSheetal Tigadoli .length = PLAT_BRCM_FIP_MAX_SIZE 31*717448d6SSheetal Tigadoli }; 32*717448d6SSheetal Tigadoli 33*717448d6SSheetal Tigadoli static const io_block_spec_t qspi_fip_block_spec = { 34*717448d6SSheetal Tigadoli .offset = PLAT_BRCM_FIP_QSPI_BASE, 35*717448d6SSheetal Tigadoli .length = PLAT_BRCM_FIP_MAX_SIZE 36*717448d6SSheetal Tigadoli }; 37*717448d6SSheetal Tigadoli 38*717448d6SSheetal Tigadoli static const io_block_spec_t nand_fip_block_spec = { 39*717448d6SSheetal Tigadoli .offset = PLAT_BRCM_FIP_NAND_BASE, 40*717448d6SSheetal Tigadoli .length = PLAT_BRCM_FIP_MAX_SIZE 41*717448d6SSheetal Tigadoli }; 42*717448d6SSheetal Tigadoli 43*717448d6SSheetal Tigadoli static const io_uuid_spec_t bl2_uuid_spec = { 44*717448d6SSheetal Tigadoli .uuid = UUID_TRUSTED_BOOT_FIRMWARE_BL2, 45*717448d6SSheetal Tigadoli }; 46*717448d6SSheetal Tigadoli 47*717448d6SSheetal Tigadoli static const io_uuid_spec_t scp_bl2_uuid_spec = { 48*717448d6SSheetal Tigadoli .uuid = UUID_SCP_FIRMWARE_SCP_BL2, 49*717448d6SSheetal Tigadoli }; 50*717448d6SSheetal Tigadoli 51*717448d6SSheetal Tigadoli static const io_uuid_spec_t bl31_uuid_spec = { 52*717448d6SSheetal Tigadoli .uuid = UUID_EL3_RUNTIME_FIRMWARE_BL31, 53*717448d6SSheetal Tigadoli }; 54*717448d6SSheetal Tigadoli 55*717448d6SSheetal Tigadoli static const io_uuid_spec_t bl32_uuid_spec = { 56*717448d6SSheetal Tigadoli .uuid = UUID_SECURE_PAYLOAD_BL32, 57*717448d6SSheetal Tigadoli }; 58*717448d6SSheetal Tigadoli 59*717448d6SSheetal Tigadoli static const io_uuid_spec_t bl32_extra1_uuid_spec = { 60*717448d6SSheetal Tigadoli .uuid = UUID_SECURE_PAYLOAD_BL32_EXTRA1, 61*717448d6SSheetal Tigadoli }; 62*717448d6SSheetal Tigadoli 63*717448d6SSheetal Tigadoli static const io_uuid_spec_t bl32_extra2_uuid_spec = { 64*717448d6SSheetal Tigadoli .uuid = UUID_SECURE_PAYLOAD_BL32_EXTRA2, 65*717448d6SSheetal Tigadoli }; 66*717448d6SSheetal Tigadoli 67*717448d6SSheetal Tigadoli static const io_uuid_spec_t bl33_uuid_spec = { 68*717448d6SSheetal Tigadoli .uuid = UUID_NON_TRUSTED_FIRMWARE_BL33, 69*717448d6SSheetal Tigadoli }; 70*717448d6SSheetal Tigadoli 71*717448d6SSheetal Tigadoli static const io_uuid_spec_t tb_fw_config_uuid_spec = { 72*717448d6SSheetal Tigadoli .uuid = UUID_TB_FW_CONFIG, 73*717448d6SSheetal Tigadoli }; 74*717448d6SSheetal Tigadoli 75*717448d6SSheetal Tigadoli static const io_uuid_spec_t hw_config_uuid_spec = { 76*717448d6SSheetal Tigadoli .uuid = UUID_HW_CONFIG, 77*717448d6SSheetal Tigadoli }; 78*717448d6SSheetal Tigadoli 79*717448d6SSheetal Tigadoli static const io_uuid_spec_t soc_fw_config_uuid_spec = { 80*717448d6SSheetal Tigadoli .uuid = UUID_SOC_FW_CONFIG, 81*717448d6SSheetal Tigadoli }; 82*717448d6SSheetal Tigadoli 83*717448d6SSheetal Tigadoli static const io_uuid_spec_t tos_fw_config_uuid_spec = { 84*717448d6SSheetal Tigadoli .uuid = UUID_TOS_FW_CONFIG, 85*717448d6SSheetal Tigadoli }; 86*717448d6SSheetal Tigadoli 87*717448d6SSheetal Tigadoli static const io_uuid_spec_t nt_fw_config_uuid_spec = { 88*717448d6SSheetal Tigadoli .uuid = UUID_NT_FW_CONFIG, 89*717448d6SSheetal Tigadoli }; 90*717448d6SSheetal Tigadoli 91*717448d6SSheetal Tigadoli #if TRUSTED_BOARD_BOOT 92*717448d6SSheetal Tigadoli static const io_uuid_spec_t tb_fw_cert_uuid_spec = { 93*717448d6SSheetal Tigadoli .uuid = UUID_TRUSTED_BOOT_FW_CERT, 94*717448d6SSheetal Tigadoli }; 95*717448d6SSheetal Tigadoli 96*717448d6SSheetal Tigadoli static const io_uuid_spec_t trusted_key_cert_uuid_spec = { 97*717448d6SSheetal Tigadoli .uuid = UUID_TRUSTED_KEY_CERT, 98*717448d6SSheetal Tigadoli }; 99*717448d6SSheetal Tigadoli 100*717448d6SSheetal Tigadoli static const io_uuid_spec_t scp_fw_key_cert_uuid_spec = { 101*717448d6SSheetal Tigadoli .uuid = UUID_SCP_FW_KEY_CERT, 102*717448d6SSheetal Tigadoli }; 103*717448d6SSheetal Tigadoli 104*717448d6SSheetal Tigadoli static const io_uuid_spec_t soc_fw_key_cert_uuid_spec = { 105*717448d6SSheetal Tigadoli .uuid = UUID_SOC_FW_KEY_CERT, 106*717448d6SSheetal Tigadoli }; 107*717448d6SSheetal Tigadoli 108*717448d6SSheetal Tigadoli static const io_uuid_spec_t tos_fw_key_cert_uuid_spec = { 109*717448d6SSheetal Tigadoli .uuid = UUID_TRUSTED_OS_FW_KEY_CERT, 110*717448d6SSheetal Tigadoli }; 111*717448d6SSheetal Tigadoli 112*717448d6SSheetal Tigadoli static const io_uuid_spec_t nt_fw_key_cert_uuid_spec = { 113*717448d6SSheetal Tigadoli .uuid = UUID_NON_TRUSTED_FW_KEY_CERT, 114*717448d6SSheetal Tigadoli }; 115*717448d6SSheetal Tigadoli 116*717448d6SSheetal Tigadoli static const io_uuid_spec_t scp_fw_cert_uuid_spec = { 117*717448d6SSheetal Tigadoli .uuid = UUID_SCP_FW_CONTENT_CERT, 118*717448d6SSheetal Tigadoli }; 119*717448d6SSheetal Tigadoli 120*717448d6SSheetal Tigadoli static const io_uuid_spec_t soc_fw_cert_uuid_spec = { 121*717448d6SSheetal Tigadoli .uuid = UUID_SOC_FW_CONTENT_CERT, 122*717448d6SSheetal Tigadoli }; 123*717448d6SSheetal Tigadoli 124*717448d6SSheetal Tigadoli static const io_uuid_spec_t tos_fw_cert_uuid_spec = { 125*717448d6SSheetal Tigadoli .uuid = UUID_TRUSTED_OS_FW_CONTENT_CERT, 126*717448d6SSheetal Tigadoli }; 127*717448d6SSheetal Tigadoli 128*717448d6SSheetal Tigadoli static const io_uuid_spec_t nt_fw_cert_uuid_spec = { 129*717448d6SSheetal Tigadoli .uuid = UUID_NON_TRUSTED_FW_CONTENT_CERT, 130*717448d6SSheetal Tigadoli }; 131*717448d6SSheetal Tigadoli #endif /* TRUSTED_BOARD_BOOT */ 132*717448d6SSheetal Tigadoli 133*717448d6SSheetal Tigadoli static int open_fip(const uintptr_t spec); 134*717448d6SSheetal Tigadoli static int open_memmap(const uintptr_t spec); 135*717448d6SSheetal Tigadoli static int open_qspi(const uintptr_t spec); 136*717448d6SSheetal Tigadoli static int open_nand(const uintptr_t spec); 137*717448d6SSheetal Tigadoli 138*717448d6SSheetal Tigadoli struct plat_io_policy { 139*717448d6SSheetal Tigadoli uintptr_t *dev_handle; 140*717448d6SSheetal Tigadoli uintptr_t image_spec; 141*717448d6SSheetal Tigadoli int (*check)(const uintptr_t spec); 142*717448d6SSheetal Tigadoli }; 143*717448d6SSheetal Tigadoli 144*717448d6SSheetal Tigadoli /* By default, BRCM platforms load images from the FIP */ 145*717448d6SSheetal Tigadoli static const struct plat_io_policy policies[] = { 146*717448d6SSheetal Tigadoli [FIP_IMAGE_ID] = { 147*717448d6SSheetal Tigadoli &memmap_dev_handle, 148*717448d6SSheetal Tigadoli (uintptr_t)&fip_block_spec, 149*717448d6SSheetal Tigadoli open_memmap 150*717448d6SSheetal Tigadoli }, 151*717448d6SSheetal Tigadoli [BL2_IMAGE_ID] = { 152*717448d6SSheetal Tigadoli &fip_dev_handle, 153*717448d6SSheetal Tigadoli (uintptr_t)&bl2_uuid_spec, 154*717448d6SSheetal Tigadoli open_fip 155*717448d6SSheetal Tigadoli }, 156*717448d6SSheetal Tigadoli [SCP_BL2_IMAGE_ID] = { 157*717448d6SSheetal Tigadoli &fip_dev_handle, 158*717448d6SSheetal Tigadoli (uintptr_t)&scp_bl2_uuid_spec, 159*717448d6SSheetal Tigadoli open_fip 160*717448d6SSheetal Tigadoli }, 161*717448d6SSheetal Tigadoli [BL31_IMAGE_ID] = { 162*717448d6SSheetal Tigadoli &fip_dev_handle, 163*717448d6SSheetal Tigadoli (uintptr_t)&bl31_uuid_spec, 164*717448d6SSheetal Tigadoli open_fip 165*717448d6SSheetal Tigadoli }, 166*717448d6SSheetal Tigadoli [BL32_IMAGE_ID] = { 167*717448d6SSheetal Tigadoli &fip_dev_handle, 168*717448d6SSheetal Tigadoli (uintptr_t)&bl32_uuid_spec, 169*717448d6SSheetal Tigadoli open_fip 170*717448d6SSheetal Tigadoli }, 171*717448d6SSheetal Tigadoli [BL32_EXTRA1_IMAGE_ID] = { 172*717448d6SSheetal Tigadoli &fip_dev_handle, 173*717448d6SSheetal Tigadoli (uintptr_t)&bl32_extra1_uuid_spec, 174*717448d6SSheetal Tigadoli open_fip 175*717448d6SSheetal Tigadoli }, 176*717448d6SSheetal Tigadoli [BL32_EXTRA2_IMAGE_ID] = { 177*717448d6SSheetal Tigadoli &fip_dev_handle, 178*717448d6SSheetal Tigadoli (uintptr_t)&bl32_extra2_uuid_spec, 179*717448d6SSheetal Tigadoli open_fip 180*717448d6SSheetal Tigadoli }, 181*717448d6SSheetal Tigadoli [BL33_IMAGE_ID] = { 182*717448d6SSheetal Tigadoli &fip_dev_handle, 183*717448d6SSheetal Tigadoli (uintptr_t)&bl33_uuid_spec, 184*717448d6SSheetal Tigadoli open_fip 185*717448d6SSheetal Tigadoli }, 186*717448d6SSheetal Tigadoli [TB_FW_CONFIG_ID] = { 187*717448d6SSheetal Tigadoli &fip_dev_handle, 188*717448d6SSheetal Tigadoli (uintptr_t)&tb_fw_config_uuid_spec, 189*717448d6SSheetal Tigadoli open_fip 190*717448d6SSheetal Tigadoli }, 191*717448d6SSheetal Tigadoli [HW_CONFIG_ID] = { 192*717448d6SSheetal Tigadoli &fip_dev_handle, 193*717448d6SSheetal Tigadoli (uintptr_t)&hw_config_uuid_spec, 194*717448d6SSheetal Tigadoli open_fip 195*717448d6SSheetal Tigadoli }, 196*717448d6SSheetal Tigadoli [SOC_FW_CONFIG_ID] = { 197*717448d6SSheetal Tigadoli &fip_dev_handle, 198*717448d6SSheetal Tigadoli (uintptr_t)&soc_fw_config_uuid_spec, 199*717448d6SSheetal Tigadoli open_fip 200*717448d6SSheetal Tigadoli }, 201*717448d6SSheetal Tigadoli [TOS_FW_CONFIG_ID] = { 202*717448d6SSheetal Tigadoli &fip_dev_handle, 203*717448d6SSheetal Tigadoli (uintptr_t)&tos_fw_config_uuid_spec, 204*717448d6SSheetal Tigadoli open_fip 205*717448d6SSheetal Tigadoli }, 206*717448d6SSheetal Tigadoli [NT_FW_CONFIG_ID] = { 207*717448d6SSheetal Tigadoli &fip_dev_handle, 208*717448d6SSheetal Tigadoli (uintptr_t)&nt_fw_config_uuid_spec, 209*717448d6SSheetal Tigadoli open_fip 210*717448d6SSheetal Tigadoli }, 211*717448d6SSheetal Tigadoli #if TRUSTED_BOARD_BOOT 212*717448d6SSheetal Tigadoli [TRUSTED_BOOT_FW_CERT_ID] = { 213*717448d6SSheetal Tigadoli &fip_dev_handle, 214*717448d6SSheetal Tigadoli (uintptr_t)&tb_fw_cert_uuid_spec, 215*717448d6SSheetal Tigadoli open_fip 216*717448d6SSheetal Tigadoli }, 217*717448d6SSheetal Tigadoli [TRUSTED_KEY_CERT_ID] = { 218*717448d6SSheetal Tigadoli &fip_dev_handle, 219*717448d6SSheetal Tigadoli (uintptr_t)&trusted_key_cert_uuid_spec, 220*717448d6SSheetal Tigadoli open_fip 221*717448d6SSheetal Tigadoli }, 222*717448d6SSheetal Tigadoli [SCP_FW_KEY_CERT_ID] = { 223*717448d6SSheetal Tigadoli &fip_dev_handle, 224*717448d6SSheetal Tigadoli (uintptr_t)&scp_fw_key_cert_uuid_spec, 225*717448d6SSheetal Tigadoli open_fip 226*717448d6SSheetal Tigadoli }, 227*717448d6SSheetal Tigadoli [SOC_FW_KEY_CERT_ID] = { 228*717448d6SSheetal Tigadoli &fip_dev_handle, 229*717448d6SSheetal Tigadoli (uintptr_t)&soc_fw_key_cert_uuid_spec, 230*717448d6SSheetal Tigadoli open_fip 231*717448d6SSheetal Tigadoli }, 232*717448d6SSheetal Tigadoli [TRUSTED_OS_FW_KEY_CERT_ID] = { 233*717448d6SSheetal Tigadoli &fip_dev_handle, 234*717448d6SSheetal Tigadoli (uintptr_t)&tos_fw_key_cert_uuid_spec, 235*717448d6SSheetal Tigadoli open_fip 236*717448d6SSheetal Tigadoli }, 237*717448d6SSheetal Tigadoli [NON_TRUSTED_FW_KEY_CERT_ID] = { 238*717448d6SSheetal Tigadoli &fip_dev_handle, 239*717448d6SSheetal Tigadoli (uintptr_t)&nt_fw_key_cert_uuid_spec, 240*717448d6SSheetal Tigadoli open_fip 241*717448d6SSheetal Tigadoli }, 242*717448d6SSheetal Tigadoli [SCP_FW_CONTENT_CERT_ID] = { 243*717448d6SSheetal Tigadoli &fip_dev_handle, 244*717448d6SSheetal Tigadoli (uintptr_t)&scp_fw_cert_uuid_spec, 245*717448d6SSheetal Tigadoli open_fip 246*717448d6SSheetal Tigadoli }, 247*717448d6SSheetal Tigadoli [SOC_FW_CONTENT_CERT_ID] = { 248*717448d6SSheetal Tigadoli &fip_dev_handle, 249*717448d6SSheetal Tigadoli (uintptr_t)&soc_fw_cert_uuid_spec, 250*717448d6SSheetal Tigadoli open_fip 251*717448d6SSheetal Tigadoli }, 252*717448d6SSheetal Tigadoli [TRUSTED_OS_FW_CONTENT_CERT_ID] = { 253*717448d6SSheetal Tigadoli &fip_dev_handle, 254*717448d6SSheetal Tigadoli (uintptr_t)&tos_fw_cert_uuid_spec, 255*717448d6SSheetal Tigadoli open_fip 256*717448d6SSheetal Tigadoli }, 257*717448d6SSheetal Tigadoli [NON_TRUSTED_FW_CONTENT_CERT_ID] = { 258*717448d6SSheetal Tigadoli &fip_dev_handle, 259*717448d6SSheetal Tigadoli (uintptr_t)&nt_fw_cert_uuid_spec, 260*717448d6SSheetal Tigadoli open_fip 261*717448d6SSheetal Tigadoli }, 262*717448d6SSheetal Tigadoli #endif /* TRUSTED_BOARD_BOOT */ 263*717448d6SSheetal Tigadoli }; 264*717448d6SSheetal Tigadoli 265*717448d6SSheetal Tigadoli /* By default, BRCM platforms load images from the FIP */ 266*717448d6SSheetal Tigadoli static const struct plat_io_policy boot_source_policies[] = { 267*717448d6SSheetal Tigadoli [BOOT_SOURCE_QSPI] = { 268*717448d6SSheetal Tigadoli &memmap_dev_handle, 269*717448d6SSheetal Tigadoli (uintptr_t)&qspi_fip_block_spec, 270*717448d6SSheetal Tigadoli open_qspi 271*717448d6SSheetal Tigadoli }, 272*717448d6SSheetal Tigadoli [BOOT_SOURCE_NAND] = { 273*717448d6SSheetal Tigadoli &memmap_dev_handle, 274*717448d6SSheetal Tigadoli (uintptr_t)&nand_fip_block_spec, 275*717448d6SSheetal Tigadoli open_nand 276*717448d6SSheetal Tigadoli }, 277*717448d6SSheetal Tigadoli }; 278*717448d6SSheetal Tigadoli 279*717448d6SSheetal Tigadoli /* Weak definitions may be overridden in specific brcm platform */ 280*717448d6SSheetal Tigadoli #pragma weak plat_brcm_io_setup 281*717448d6SSheetal Tigadoli #pragma weak plat_brcm_process_flags 282*717448d6SSheetal Tigadoli 283*717448d6SSheetal Tigadoli static int open_fip(const uintptr_t spec) 284*717448d6SSheetal Tigadoli { 285*717448d6SSheetal Tigadoli int result; 286*717448d6SSheetal Tigadoli uintptr_t local_image_handle; 287*717448d6SSheetal Tigadoli 288*717448d6SSheetal Tigadoli /* See if a Firmware Image Package is available */ 289*717448d6SSheetal Tigadoli result = io_dev_init(fip_dev_handle, (uintptr_t)FIP_IMAGE_ID); 290*717448d6SSheetal Tigadoli if (result == 0) { 291*717448d6SSheetal Tigadoli result = io_open(fip_dev_handle, spec, &local_image_handle); 292*717448d6SSheetal Tigadoli if (result == 0) { 293*717448d6SSheetal Tigadoli VERBOSE("Using FIP\n"); 294*717448d6SSheetal Tigadoli io_close(local_image_handle); 295*717448d6SSheetal Tigadoli } 296*717448d6SSheetal Tigadoli } 297*717448d6SSheetal Tigadoli return result; 298*717448d6SSheetal Tigadoli } 299*717448d6SSheetal Tigadoli 300*717448d6SSheetal Tigadoli 301*717448d6SSheetal Tigadoli static int open_memmap(const uintptr_t spec) 302*717448d6SSheetal Tigadoli { 303*717448d6SSheetal Tigadoli int result; 304*717448d6SSheetal Tigadoli uintptr_t local_image_handle; 305*717448d6SSheetal Tigadoli 306*717448d6SSheetal Tigadoli result = io_dev_init(memmap_dev_handle, (uintptr_t)NULL); 307*717448d6SSheetal Tigadoli if (result == 0) { 308*717448d6SSheetal Tigadoli result = io_open(memmap_dev_handle, spec, &local_image_handle); 309*717448d6SSheetal Tigadoli if (result == 0) { 310*717448d6SSheetal Tigadoli VERBOSE("Using Memmap\n"); 311*717448d6SSheetal Tigadoli io_close(local_image_handle); 312*717448d6SSheetal Tigadoli } 313*717448d6SSheetal Tigadoli } 314*717448d6SSheetal Tigadoli return result; 315*717448d6SSheetal Tigadoli } 316*717448d6SSheetal Tigadoli 317*717448d6SSheetal Tigadoli static int open_qspi(const uintptr_t spec) 318*717448d6SSheetal Tigadoli { 319*717448d6SSheetal Tigadoli return open_memmap(spec); 320*717448d6SSheetal Tigadoli } 321*717448d6SSheetal Tigadoli 322*717448d6SSheetal Tigadoli static int open_nand(const uintptr_t spec) 323*717448d6SSheetal Tigadoli { 324*717448d6SSheetal Tigadoli return open_memmap(spec); 325*717448d6SSheetal Tigadoli } 326*717448d6SSheetal Tigadoli 327*717448d6SSheetal Tigadoli 328*717448d6SSheetal Tigadoli void brcm_io_setup(void) 329*717448d6SSheetal Tigadoli { 330*717448d6SSheetal Tigadoli int io_result; 331*717448d6SSheetal Tigadoli uint32_t boot_source; 332*717448d6SSheetal Tigadoli 333*717448d6SSheetal Tigadoli io_result = register_io_dev_fip(&fip_dev_con); 334*717448d6SSheetal Tigadoli assert(io_result == 0); 335*717448d6SSheetal Tigadoli 336*717448d6SSheetal Tigadoli io_result = register_io_dev_memmap(&memmap_dev_con); 337*717448d6SSheetal Tigadoli assert(io_result == 0); 338*717448d6SSheetal Tigadoli 339*717448d6SSheetal Tigadoli /* Open connections to devices and cache the handles */ 340*717448d6SSheetal Tigadoli io_result = io_dev_open(fip_dev_con, (uintptr_t)NULL, 341*717448d6SSheetal Tigadoli &fip_dev_handle); 342*717448d6SSheetal Tigadoli assert(io_result == 0); 343*717448d6SSheetal Tigadoli 344*717448d6SSheetal Tigadoli boot_source = boot_source_get(); 345*717448d6SSheetal Tigadoli switch (boot_source) { 346*717448d6SSheetal Tigadoli case BOOT_SOURCE_QSPI: 347*717448d6SSheetal Tigadoli case BOOT_SOURCE_NAND: 348*717448d6SSheetal Tigadoli default: 349*717448d6SSheetal Tigadoli io_result = io_dev_open(memmap_dev_con, (uintptr_t)NULL, 350*717448d6SSheetal Tigadoli &memmap_dev_handle); 351*717448d6SSheetal Tigadoli break; 352*717448d6SSheetal Tigadoli } 353*717448d6SSheetal Tigadoli assert(io_result == 0); 354*717448d6SSheetal Tigadoli 355*717448d6SSheetal Tigadoli /* Ignore improbable errors in release builds */ 356*717448d6SSheetal Tigadoli (void)io_result; 357*717448d6SSheetal Tigadoli } 358*717448d6SSheetal Tigadoli 359*717448d6SSheetal Tigadoli void plat_brcm_io_setup(void) 360*717448d6SSheetal Tigadoli { 361*717448d6SSheetal Tigadoli brcm_io_setup(); 362*717448d6SSheetal Tigadoli } 363*717448d6SSheetal Tigadoli 364*717448d6SSheetal Tigadoli void plat_brcm_process_flags(uint16_t plat_toc_flags __unused) 365*717448d6SSheetal Tigadoli { 366*717448d6SSheetal Tigadoli WARN("%s not implemented\n", __func__); 367*717448d6SSheetal Tigadoli } 368*717448d6SSheetal Tigadoli 369*717448d6SSheetal Tigadoli /* 370*717448d6SSheetal Tigadoli * Return an IO device handle and specification which can be used to access 371*717448d6SSheetal Tigadoli * an image. Use this to enforce platform load policy 372*717448d6SSheetal Tigadoli */ 373*717448d6SSheetal Tigadoli int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle, 374*717448d6SSheetal Tigadoli uintptr_t *image_spec) 375*717448d6SSheetal Tigadoli { 376*717448d6SSheetal Tigadoli int result; 377*717448d6SSheetal Tigadoli const struct plat_io_policy *policy; 378*717448d6SSheetal Tigadoli uint32_t boot_source; 379*717448d6SSheetal Tigadoli uint16_t lcl_plat_toc_flg; 380*717448d6SSheetal Tigadoli 381*717448d6SSheetal Tigadoli assert(image_id < ARRAY_SIZE(policies)); 382*717448d6SSheetal Tigadoli 383*717448d6SSheetal Tigadoli boot_source = boot_source_get(); 384*717448d6SSheetal Tigadoli if (image_id == FIP_IMAGE_ID) 385*717448d6SSheetal Tigadoli policy = &boot_source_policies[boot_source]; 386*717448d6SSheetal Tigadoli else 387*717448d6SSheetal Tigadoli policy = &policies[image_id]; 388*717448d6SSheetal Tigadoli 389*717448d6SSheetal Tigadoli result = policy->check(policy->image_spec); 390*717448d6SSheetal Tigadoli if (result == 0) { 391*717448d6SSheetal Tigadoli *image_spec = policy->image_spec; 392*717448d6SSheetal Tigadoli *dev_handle = *(policy->dev_handle); 393*717448d6SSheetal Tigadoli 394*717448d6SSheetal Tigadoli if (image_id == TRUSTED_BOOT_FW_CERT_ID) { 395*717448d6SSheetal Tigadoli /* 396*717448d6SSheetal Tigadoli * Process the header flags to perform 397*717448d6SSheetal Tigadoli * such custom actions as speeding up PLL. 398*717448d6SSheetal Tigadoli * CERT seems to be the first image accessed 399*717448d6SSheetal Tigadoli * by BL1 so this is where we process the flags. 400*717448d6SSheetal Tigadoli */ 401*717448d6SSheetal Tigadoli fip_dev_get_plat_toc_flag((io_dev_info_t *)fip_dev_handle, 402*717448d6SSheetal Tigadoli &lcl_plat_toc_flg); 403*717448d6SSheetal Tigadoli plat_brcm_process_flags(lcl_plat_toc_flg); 404*717448d6SSheetal Tigadoli } 405*717448d6SSheetal Tigadoli } 406*717448d6SSheetal Tigadoli 407*717448d6SSheetal Tigadoli return result; 408*717448d6SSheetal Tigadoli } 409