1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2016-2020, ARM Limited and Contributors. All rights reserved. 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park #include <assert.h> 8*54fd6939SJiyong Park #include <stdint.h> 9*54fd6939SJiyong Park 10*54fd6939SJiyong Park #include <platform_def.h> 11*54fd6939SJiyong Park 12*54fd6939SJiyong Park #include <arch.h> 13*54fd6939SJiyong Park #include <arch_helpers.h> 14*54fd6939SJiyong Park #include <common/bl_common.h> 15*54fd6939SJiyong Park #include <common/debug.h> 16*54fd6939SJiyong Park #include <common/desc_image_load.h> 17*54fd6939SJiyong Park #include <drivers/auth/auth_mod.h> 18*54fd6939SJiyong Park #include <plat/common/platform.h> 19*54fd6939SJiyong Park 20*54fd6939SJiyong Park #include "bl2_private.h" 21*54fd6939SJiyong Park 22*54fd6939SJiyong Park /******************************************************************************* 23*54fd6939SJiyong Park * This function loads SCP_BL2/BL3x images and returns the ep_info for 24*54fd6939SJiyong Park * the next executable image. 25*54fd6939SJiyong Park ******************************************************************************/ bl2_load_images(void)26*54fd6939SJiyong Parkstruct entry_point_info *bl2_load_images(void) 27*54fd6939SJiyong Park { 28*54fd6939SJiyong Park bl_params_t *bl2_to_next_bl_params; 29*54fd6939SJiyong Park bl_load_info_t *bl2_load_info; 30*54fd6939SJiyong Park const bl_load_info_node_t *bl2_node_info; 31*54fd6939SJiyong Park int plat_setup_done = 0; 32*54fd6939SJiyong Park int err; 33*54fd6939SJiyong Park 34*54fd6939SJiyong Park /* 35*54fd6939SJiyong Park * Get information about the images to load. 36*54fd6939SJiyong Park */ 37*54fd6939SJiyong Park bl2_load_info = plat_get_bl_image_load_info(); 38*54fd6939SJiyong Park assert(bl2_load_info != NULL); 39*54fd6939SJiyong Park assert(bl2_load_info->head != NULL); 40*54fd6939SJiyong Park assert(bl2_load_info->h.type == PARAM_BL_LOAD_INFO); 41*54fd6939SJiyong Park assert(bl2_load_info->h.version >= VERSION_2); 42*54fd6939SJiyong Park bl2_node_info = bl2_load_info->head; 43*54fd6939SJiyong Park 44*54fd6939SJiyong Park while (bl2_node_info != NULL) { 45*54fd6939SJiyong Park /* 46*54fd6939SJiyong Park * Perform platform setup before loading the image, 47*54fd6939SJiyong Park * if indicated in the image attributes AND if NOT 48*54fd6939SJiyong Park * already done before. 49*54fd6939SJiyong Park */ 50*54fd6939SJiyong Park if ((bl2_node_info->image_info->h.attr & 51*54fd6939SJiyong Park IMAGE_ATTRIB_PLAT_SETUP) != 0U) { 52*54fd6939SJiyong Park if (plat_setup_done != 0) { 53*54fd6939SJiyong Park WARN("BL2: Platform setup already done!!\n"); 54*54fd6939SJiyong Park } else { 55*54fd6939SJiyong Park INFO("BL2: Doing platform setup\n"); 56*54fd6939SJiyong Park bl2_platform_setup(); 57*54fd6939SJiyong Park plat_setup_done = 1; 58*54fd6939SJiyong Park } 59*54fd6939SJiyong Park } 60*54fd6939SJiyong Park 61*54fd6939SJiyong Park err = bl2_plat_handle_pre_image_load(bl2_node_info->image_id); 62*54fd6939SJiyong Park if (err != 0) { 63*54fd6939SJiyong Park ERROR("BL2: Failure in pre image load handling (%i)\n", err); 64*54fd6939SJiyong Park plat_error_handler(err); 65*54fd6939SJiyong Park } 66*54fd6939SJiyong Park 67*54fd6939SJiyong Park if ((bl2_node_info->image_info->h.attr & 68*54fd6939SJiyong Park IMAGE_ATTRIB_SKIP_LOADING) == 0U) { 69*54fd6939SJiyong Park INFO("BL2: Loading image id %d\n", bl2_node_info->image_id); 70*54fd6939SJiyong Park err = load_auth_image(bl2_node_info->image_id, 71*54fd6939SJiyong Park bl2_node_info->image_info); 72*54fd6939SJiyong Park if (err != 0) { 73*54fd6939SJiyong Park ERROR("BL2: Failed to load image id %d (%i)\n", 74*54fd6939SJiyong Park bl2_node_info->image_id, err); 75*54fd6939SJiyong Park plat_error_handler(err); 76*54fd6939SJiyong Park } 77*54fd6939SJiyong Park } else { 78*54fd6939SJiyong Park INFO("BL2: Skip loading image id %d\n", bl2_node_info->image_id); 79*54fd6939SJiyong Park } 80*54fd6939SJiyong Park 81*54fd6939SJiyong Park /* Allow platform to handle image information. */ 82*54fd6939SJiyong Park err = bl2_plat_handle_post_image_load(bl2_node_info->image_id); 83*54fd6939SJiyong Park if (err != 0) { 84*54fd6939SJiyong Park ERROR("BL2: Failure in post image load handling (%i)\n", err); 85*54fd6939SJiyong Park plat_error_handler(err); 86*54fd6939SJiyong Park } 87*54fd6939SJiyong Park 88*54fd6939SJiyong Park /* Go to next image */ 89*54fd6939SJiyong Park bl2_node_info = bl2_node_info->next_load_info; 90*54fd6939SJiyong Park } 91*54fd6939SJiyong Park 92*54fd6939SJiyong Park /* 93*54fd6939SJiyong Park * Get information to pass to the next image. 94*54fd6939SJiyong Park */ 95*54fd6939SJiyong Park bl2_to_next_bl_params = plat_get_next_bl_params(); 96*54fd6939SJiyong Park assert(bl2_to_next_bl_params != NULL); 97*54fd6939SJiyong Park assert(bl2_to_next_bl_params->head != NULL); 98*54fd6939SJiyong Park assert(bl2_to_next_bl_params->h.type == PARAM_BL_PARAMS); 99*54fd6939SJiyong Park assert(bl2_to_next_bl_params->h.version >= VERSION_2); 100*54fd6939SJiyong Park assert(bl2_to_next_bl_params->head->ep_info != NULL); 101*54fd6939SJiyong Park 102*54fd6939SJiyong Park /* Populate arg0 for the next BL image if not already provided */ 103*54fd6939SJiyong Park if (bl2_to_next_bl_params->head->ep_info->args.arg0 == (u_register_t)0) 104*54fd6939SJiyong Park bl2_to_next_bl_params->head->ep_info->args.arg0 = 105*54fd6939SJiyong Park (u_register_t)bl2_to_next_bl_params; 106*54fd6939SJiyong Park 107*54fd6939SJiyong Park /* Flush the parameters to be passed to next image */ 108*54fd6939SJiyong Park plat_flush_next_bl_params(); 109*54fd6939SJiyong Park 110*54fd6939SJiyong Park return bl2_to_next_bl_params->head->ep_info; 111*54fd6939SJiyong Park } 112