1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2021, 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 BL33_IMAGE_NAME "bl33.bin" 19*91f16700Schasinglulu 20*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT 21*91f16700Schasinglulu #define TRUSTED_KEY_CERT_NAME "trusted_key.crt" 22*91f16700Schasinglulu #define NT_FW_KEY_CERT_NAME "nt_fw_key.crt" 23*91f16700Schasinglulu #define NT_FW_CONTENT_CERT_NAME "nt_fw_content.crt" 24*91f16700Schasinglulu #endif /* TRUSTED_BOARD_BOOT */ 25*91f16700Schasinglulu 26*91f16700Schasinglulu /* IO devices */ 27*91f16700Schasinglulu static const io_dev_connector_t *sh_dev_con; 28*91f16700Schasinglulu static uintptr_t sh_dev_handle; 29*91f16700Schasinglulu 30*91f16700Schasinglulu static const io_file_spec_t sh_file_spec[] = { 31*91f16700Schasinglulu [BL33_IMAGE_ID] = { 32*91f16700Schasinglulu .path = BL33_IMAGE_NAME, 33*91f16700Schasinglulu .mode = FOPEN_MODE_RB 34*91f16700Schasinglulu }, 35*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT 36*91f16700Schasinglulu [TRUSTED_KEY_CERT_ID] = { 37*91f16700Schasinglulu .path = TRUSTED_KEY_CERT_NAME, 38*91f16700Schasinglulu .mode = FOPEN_MODE_RB 39*91f16700Schasinglulu }, 40*91f16700Schasinglulu [NON_TRUSTED_FW_KEY_CERT_ID] = { 41*91f16700Schasinglulu .path = NT_FW_KEY_CERT_NAME, 42*91f16700Schasinglulu .mode = FOPEN_MODE_RB 43*91f16700Schasinglulu }, 44*91f16700Schasinglulu [NON_TRUSTED_FW_CONTENT_CERT_ID] = { 45*91f16700Schasinglulu .path = NT_FW_CONTENT_CERT_NAME, 46*91f16700Schasinglulu .mode = FOPEN_MODE_RB 47*91f16700Schasinglulu }, 48*91f16700Schasinglulu #endif /* TRUSTED_BOARD_BOOT */ 49*91f16700Schasinglulu }; 50*91f16700Schasinglulu 51*91f16700Schasinglulu 52*91f16700Schasinglulu static int open_semihosting(const uintptr_t spec) 53*91f16700Schasinglulu { 54*91f16700Schasinglulu int result; 55*91f16700Schasinglulu uintptr_t local_image_handle; 56*91f16700Schasinglulu 57*91f16700Schasinglulu /* See if the file exists on semi-hosting.*/ 58*91f16700Schasinglulu result = io_dev_init(sh_dev_handle, (uintptr_t)NULL); 59*91f16700Schasinglulu if (result == 0) { 60*91f16700Schasinglulu result = io_open(sh_dev_handle, spec, &local_image_handle); 61*91f16700Schasinglulu if (result == 0) { 62*91f16700Schasinglulu VERBOSE("Using Semi-hosting IO\n"); 63*91f16700Schasinglulu io_close(local_image_handle); 64*91f16700Schasinglulu } 65*91f16700Schasinglulu } 66*91f16700Schasinglulu return result; 67*91f16700Schasinglulu } 68*91f16700Schasinglulu 69*91f16700Schasinglulu void plat_arm_io_setup(void) 70*91f16700Schasinglulu { 71*91f16700Schasinglulu int io_result; 72*91f16700Schasinglulu 73*91f16700Schasinglulu io_result = arm_io_setup(); 74*91f16700Schasinglulu if (io_result < 0) { 75*91f16700Schasinglulu panic(); 76*91f16700Schasinglulu } 77*91f16700Schasinglulu 78*91f16700Schasinglulu /* Register the additional IO devices on this platform */ 79*91f16700Schasinglulu io_result = register_io_dev_sh(&sh_dev_con); 80*91f16700Schasinglulu if (io_result < 0) { 81*91f16700Schasinglulu panic(); 82*91f16700Schasinglulu } 83*91f16700Schasinglulu 84*91f16700Schasinglulu /* Open connections to devices and cache the handles */ 85*91f16700Schasinglulu io_result = io_dev_open(sh_dev_con, (uintptr_t)NULL, &sh_dev_handle); 86*91f16700Schasinglulu if (io_result < 0) { 87*91f16700Schasinglulu panic(); 88*91f16700Schasinglulu } 89*91f16700Schasinglulu } 90*91f16700Schasinglulu 91*91f16700Schasinglulu /* 92*91f16700Schasinglulu * FVP_R provides semihosting as an alternative to load images 93*91f16700Schasinglulu */ 94*91f16700Schasinglulu int plat_arm_get_alt_image_source(unsigned int image_id, uintptr_t *dev_handle, 95*91f16700Schasinglulu uintptr_t *image_spec) 96*91f16700Schasinglulu { 97*91f16700Schasinglulu int result = open_semihosting((const uintptr_t)&sh_file_spec[image_id]); 98*91f16700Schasinglulu 99*91f16700Schasinglulu if (result == 0) { 100*91f16700Schasinglulu *dev_handle = sh_dev_handle; 101*91f16700Schasinglulu *image_spec = (uintptr_t)&sh_file_spec[image_id]; 102*91f16700Schasinglulu } 103*91f16700Schasinglulu 104*91f16700Schasinglulu return result; 105*91f16700Schasinglulu } 106