1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2014-2020, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <common/debug.h> 10*91f16700Schasinglulu #include <drivers/io/io_driver.h> 11*91f16700Schasinglulu #include <drivers/io/io_semihosting.h> 12*91f16700Schasinglulu #include <drivers/io/io_storage.h> 13*91f16700Schasinglulu #include <lib/semihosting.h> 14*91f16700Schasinglulu #include <plat/arm/common/plat_arm.h> 15*91f16700Schasinglulu #include <plat/common/common_def.h> 16*91f16700Schasinglulu 17*91f16700Schasinglulu /* Semihosting filenames */ 18*91f16700Schasinglulu #define BL2_IMAGE_NAME "bl2.bin" 19*91f16700Schasinglulu #define BL31_IMAGE_NAME "bl31.bin" 20*91f16700Schasinglulu #define BL32_IMAGE_NAME "bl32.bin" 21*91f16700Schasinglulu #define BL33_IMAGE_NAME "bl33.bin" 22*91f16700Schasinglulu #define TB_FW_CONFIG_NAME "fvp_tb_fw_config.dtb" 23*91f16700Schasinglulu #define SOC_FW_CONFIG_NAME "fvp_soc_fw_config.dtb" 24*91f16700Schasinglulu #define TOS_FW_CONFIG_NAME "fvp_tsp_fw_config.dtb" 25*91f16700Schasinglulu #define NT_FW_CONFIG_NAME "fvp_nt_fw_config.dtb" 26*91f16700Schasinglulu #define FW_CONFIG_NAME "fvp_fw_config.dtb" 27*91f16700Schasinglulu #define HW_CONFIG_NAME "hw_config.dtb" 28*91f16700Schasinglulu 29*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT 30*91f16700Schasinglulu #define TRUSTED_BOOT_FW_CERT_NAME "tb_fw.crt" 31*91f16700Schasinglulu #define TRUSTED_KEY_CERT_NAME "trusted_key.crt" 32*91f16700Schasinglulu #define SOC_FW_KEY_CERT_NAME "soc_fw_key.crt" 33*91f16700Schasinglulu #define TOS_FW_KEY_CERT_NAME "tos_fw_key.crt" 34*91f16700Schasinglulu #define NT_FW_KEY_CERT_NAME "nt_fw_key.crt" 35*91f16700Schasinglulu #define SOC_FW_CONTENT_CERT_NAME "soc_fw_content.crt" 36*91f16700Schasinglulu #define TOS_FW_CONTENT_CERT_NAME "tos_fw_content.crt" 37*91f16700Schasinglulu #define NT_FW_CONTENT_CERT_NAME "nt_fw_content.crt" 38*91f16700Schasinglulu #endif /* TRUSTED_BOARD_BOOT */ 39*91f16700Schasinglulu 40*91f16700Schasinglulu /* IO devices */ 41*91f16700Schasinglulu static const io_dev_connector_t *sh_dev_con; 42*91f16700Schasinglulu static uintptr_t sh_dev_handle; 43*91f16700Schasinglulu 44*91f16700Schasinglulu static const io_file_spec_t sh_file_spec[] = { 45*91f16700Schasinglulu [BL2_IMAGE_ID] = { 46*91f16700Schasinglulu .path = BL2_IMAGE_NAME, 47*91f16700Schasinglulu .mode = FOPEN_MODE_RB 48*91f16700Schasinglulu }, 49*91f16700Schasinglulu [BL31_IMAGE_ID] = { 50*91f16700Schasinglulu .path = BL31_IMAGE_NAME, 51*91f16700Schasinglulu .mode = FOPEN_MODE_RB 52*91f16700Schasinglulu }, 53*91f16700Schasinglulu [BL32_IMAGE_ID] = { 54*91f16700Schasinglulu .path = BL32_IMAGE_NAME, 55*91f16700Schasinglulu .mode = FOPEN_MODE_RB 56*91f16700Schasinglulu }, 57*91f16700Schasinglulu [BL33_IMAGE_ID] = { 58*91f16700Schasinglulu .path = BL33_IMAGE_NAME, 59*91f16700Schasinglulu .mode = FOPEN_MODE_RB 60*91f16700Schasinglulu }, 61*91f16700Schasinglulu [TB_FW_CONFIG_ID] = { 62*91f16700Schasinglulu .path = TB_FW_CONFIG_NAME, 63*91f16700Schasinglulu .mode = FOPEN_MODE_RB 64*91f16700Schasinglulu }, 65*91f16700Schasinglulu [SOC_FW_CONFIG_ID] = { 66*91f16700Schasinglulu .path = SOC_FW_CONFIG_NAME, 67*91f16700Schasinglulu .mode = FOPEN_MODE_RB 68*91f16700Schasinglulu }, 69*91f16700Schasinglulu [TOS_FW_CONFIG_ID] = { 70*91f16700Schasinglulu .path = TOS_FW_CONFIG_NAME, 71*91f16700Schasinglulu .mode = FOPEN_MODE_RB 72*91f16700Schasinglulu }, 73*91f16700Schasinglulu [NT_FW_CONFIG_ID] = { 74*91f16700Schasinglulu .path = NT_FW_CONFIG_NAME, 75*91f16700Schasinglulu .mode = FOPEN_MODE_RB 76*91f16700Schasinglulu }, 77*91f16700Schasinglulu [FW_CONFIG_ID] = { 78*91f16700Schasinglulu .path = FW_CONFIG_NAME, 79*91f16700Schasinglulu .mode = FOPEN_MODE_RB 80*91f16700Schasinglulu }, 81*91f16700Schasinglulu [HW_CONFIG_ID] = { 82*91f16700Schasinglulu .path = HW_CONFIG_NAME, 83*91f16700Schasinglulu .mode = FOPEN_MODE_RB 84*91f16700Schasinglulu }, 85*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT 86*91f16700Schasinglulu [TRUSTED_BOOT_FW_CERT_ID] = { 87*91f16700Schasinglulu .path = TRUSTED_BOOT_FW_CERT_NAME, 88*91f16700Schasinglulu .mode = FOPEN_MODE_RB 89*91f16700Schasinglulu }, 90*91f16700Schasinglulu [TRUSTED_KEY_CERT_ID] = { 91*91f16700Schasinglulu .path = TRUSTED_KEY_CERT_NAME, 92*91f16700Schasinglulu .mode = FOPEN_MODE_RB 93*91f16700Schasinglulu }, 94*91f16700Schasinglulu [SOC_FW_KEY_CERT_ID] = { 95*91f16700Schasinglulu .path = SOC_FW_KEY_CERT_NAME, 96*91f16700Schasinglulu .mode = FOPEN_MODE_RB 97*91f16700Schasinglulu }, 98*91f16700Schasinglulu [TRUSTED_OS_FW_KEY_CERT_ID] = { 99*91f16700Schasinglulu .path = TOS_FW_KEY_CERT_NAME, 100*91f16700Schasinglulu .mode = FOPEN_MODE_RB 101*91f16700Schasinglulu }, 102*91f16700Schasinglulu [NON_TRUSTED_FW_KEY_CERT_ID] = { 103*91f16700Schasinglulu .path = NT_FW_KEY_CERT_NAME, 104*91f16700Schasinglulu .mode = FOPEN_MODE_RB 105*91f16700Schasinglulu }, 106*91f16700Schasinglulu [SOC_FW_CONTENT_CERT_ID] = { 107*91f16700Schasinglulu .path = SOC_FW_CONTENT_CERT_NAME, 108*91f16700Schasinglulu .mode = FOPEN_MODE_RB 109*91f16700Schasinglulu }, 110*91f16700Schasinglulu [TRUSTED_OS_FW_CONTENT_CERT_ID] = { 111*91f16700Schasinglulu .path = TOS_FW_CONTENT_CERT_NAME, 112*91f16700Schasinglulu .mode = FOPEN_MODE_RB 113*91f16700Schasinglulu }, 114*91f16700Schasinglulu [NON_TRUSTED_FW_CONTENT_CERT_ID] = { 115*91f16700Schasinglulu .path = NT_FW_CONTENT_CERT_NAME, 116*91f16700Schasinglulu .mode = FOPEN_MODE_RB 117*91f16700Schasinglulu }, 118*91f16700Schasinglulu #endif /* TRUSTED_BOARD_BOOT */ 119*91f16700Schasinglulu }; 120*91f16700Schasinglulu 121*91f16700Schasinglulu 122*91f16700Schasinglulu static int open_semihosting(const uintptr_t spec) 123*91f16700Schasinglulu { 124*91f16700Schasinglulu int result; 125*91f16700Schasinglulu uintptr_t local_image_handle; 126*91f16700Schasinglulu 127*91f16700Schasinglulu /* See if the file exists on semi-hosting.*/ 128*91f16700Schasinglulu result = io_dev_init(sh_dev_handle, (uintptr_t)NULL); 129*91f16700Schasinglulu if (result == 0) { 130*91f16700Schasinglulu result = io_open(sh_dev_handle, spec, &local_image_handle); 131*91f16700Schasinglulu if (result == 0) { 132*91f16700Schasinglulu VERBOSE("Using Semi-hosting IO\n"); 133*91f16700Schasinglulu io_close(local_image_handle); 134*91f16700Schasinglulu } 135*91f16700Schasinglulu } 136*91f16700Schasinglulu return result; 137*91f16700Schasinglulu } 138*91f16700Schasinglulu 139*91f16700Schasinglulu void plat_arm_io_setup(void) 140*91f16700Schasinglulu { 141*91f16700Schasinglulu int io_result; 142*91f16700Schasinglulu 143*91f16700Schasinglulu io_result = arm_io_setup(); 144*91f16700Schasinglulu if (io_result < 0) { 145*91f16700Schasinglulu panic(); 146*91f16700Schasinglulu } 147*91f16700Schasinglulu 148*91f16700Schasinglulu /* Register the additional IO devices on this platform */ 149*91f16700Schasinglulu io_result = register_io_dev_sh(&sh_dev_con); 150*91f16700Schasinglulu if (io_result < 0) { 151*91f16700Schasinglulu panic(); 152*91f16700Schasinglulu } 153*91f16700Schasinglulu 154*91f16700Schasinglulu /* Open connections to devices and cache the handles */ 155*91f16700Schasinglulu io_result = io_dev_open(sh_dev_con, (uintptr_t)NULL, &sh_dev_handle); 156*91f16700Schasinglulu if (io_result < 0) { 157*91f16700Schasinglulu panic(); 158*91f16700Schasinglulu } 159*91f16700Schasinglulu } 160*91f16700Schasinglulu 161*91f16700Schasinglulu /* 162*91f16700Schasinglulu * FVP provides semihosting as an alternative to load images 163*91f16700Schasinglulu */ 164*91f16700Schasinglulu int plat_arm_get_alt_image_source(unsigned int image_id, uintptr_t *dev_handle, 165*91f16700Schasinglulu uintptr_t *image_spec) 166*91f16700Schasinglulu { 167*91f16700Schasinglulu int result = open_semihosting((const uintptr_t)&sh_file_spec[image_id]); 168*91f16700Schasinglulu if (result == 0) { 169*91f16700Schasinglulu *dev_handle = sh_dev_handle; 170*91f16700Schasinglulu *image_spec = (uintptr_t)&sh_file_spec[image_id]; 171*91f16700Schasinglulu } 172*91f16700Schasinglulu 173*91f16700Schasinglulu return result; 174*91f16700Schasinglulu } 175