1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2016-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 #include <common/bl_common.h> 9*91f16700Schasinglulu #include <common/desc_image_load.h> 10*91f16700Schasinglulu #if defined(SPD_spmd) 11*91f16700Schasinglulu #include <plat/arm/common/fconf_arm_sp_getter.h> 12*91f16700Schasinglulu #endif 13*91f16700Schasinglulu #include <plat/arm/common/plat_arm.h> 14*91f16700Schasinglulu #include <plat/common/platform.h> 15*91f16700Schasinglulu 16*91f16700Schasinglulu #pragma weak plat_flush_next_bl_params 17*91f16700Schasinglulu #pragma weak plat_get_bl_image_load_info 18*91f16700Schasinglulu #pragma weak plat_get_next_bl_params 19*91f16700Schasinglulu 20*91f16700Schasinglulu static bl_params_t *next_bl_params_cpy_ptr; 21*91f16700Schasinglulu 22*91f16700Schasinglulu /******************************************************************************* 23*91f16700Schasinglulu * This function flushes the data structures so that they are visible 24*91f16700Schasinglulu * in memory for the next BL image. 25*91f16700Schasinglulu ******************************************************************************/ 26*91f16700Schasinglulu void plat_flush_next_bl_params(void) 27*91f16700Schasinglulu { 28*91f16700Schasinglulu assert(next_bl_params_cpy_ptr != NULL); 29*91f16700Schasinglulu 30*91f16700Schasinglulu flush_bl_params_desc_args(bl_mem_params_desc_ptr, 31*91f16700Schasinglulu bl_mem_params_desc_num, 32*91f16700Schasinglulu next_bl_params_cpy_ptr); 33*91f16700Schasinglulu } 34*91f16700Schasinglulu 35*91f16700Schasinglulu #if defined(SPD_spmd) && BL2_ENABLE_SP_LOAD 36*91f16700Schasinglulu /******************************************************************************* 37*91f16700Schasinglulu * This function appends Secure Partitions to list of loadable images. 38*91f16700Schasinglulu ******************************************************************************/ 39*91f16700Schasinglulu static void plat_add_sp_images_load_info(struct bl_load_info *load_info) 40*91f16700Schasinglulu { 41*91f16700Schasinglulu bl_load_info_node_t *curr_node = load_info->head; 42*91f16700Schasinglulu bl_load_info_node_t *prev_node; 43*91f16700Schasinglulu 44*91f16700Schasinglulu /* Shortcut for empty SP list */ 45*91f16700Schasinglulu if (sp_mem_params_descs[0].image_id == 0) { 46*91f16700Schasinglulu ERROR("No Secure Partition Image available\n"); 47*91f16700Schasinglulu return; 48*91f16700Schasinglulu } 49*91f16700Schasinglulu 50*91f16700Schasinglulu /* Traverse through the bl images list */ 51*91f16700Schasinglulu do { 52*91f16700Schasinglulu curr_node = curr_node->next_load_info; 53*91f16700Schasinglulu } while (curr_node->next_load_info != NULL); 54*91f16700Schasinglulu 55*91f16700Schasinglulu prev_node = curr_node; 56*91f16700Schasinglulu 57*91f16700Schasinglulu for (unsigned int index = 0; index < MAX_SP_IDS; index++) { 58*91f16700Schasinglulu if (sp_mem_params_descs[index].image_id == 0) { 59*91f16700Schasinglulu return; 60*91f16700Schasinglulu } 61*91f16700Schasinglulu curr_node = &sp_mem_params_descs[index].load_node_mem; 62*91f16700Schasinglulu /* Populate the image information */ 63*91f16700Schasinglulu curr_node->image_id = sp_mem_params_descs[index].image_id; 64*91f16700Schasinglulu curr_node->image_info = &sp_mem_params_descs[index].image_info; 65*91f16700Schasinglulu 66*91f16700Schasinglulu prev_node->next_load_info = curr_node; 67*91f16700Schasinglulu prev_node = curr_node; 68*91f16700Schasinglulu } 69*91f16700Schasinglulu 70*91f16700Schasinglulu INFO("Reached Max number of SPs\n"); 71*91f16700Schasinglulu } 72*91f16700Schasinglulu #endif 73*91f16700Schasinglulu 74*91f16700Schasinglulu /******************************************************************************* 75*91f16700Schasinglulu * This function returns the list of loadable images. 76*91f16700Schasinglulu ******************************************************************************/ 77*91f16700Schasinglulu struct bl_load_info *plat_get_bl_image_load_info(void) 78*91f16700Schasinglulu { 79*91f16700Schasinglulu #if defined(SPD_spmd) && BL2_ENABLE_SP_LOAD 80*91f16700Schasinglulu bl_load_info_t *bl_load_info; 81*91f16700Schasinglulu 82*91f16700Schasinglulu bl_load_info = get_bl_load_info_from_mem_params_desc(); 83*91f16700Schasinglulu plat_add_sp_images_load_info(bl_load_info); 84*91f16700Schasinglulu 85*91f16700Schasinglulu return bl_load_info; 86*91f16700Schasinglulu #else 87*91f16700Schasinglulu return get_bl_load_info_from_mem_params_desc(); 88*91f16700Schasinglulu #endif 89*91f16700Schasinglulu } 90*91f16700Schasinglulu 91*91f16700Schasinglulu /******************************************************************************* 92*91f16700Schasinglulu * ARM helper function to return the list of executable images.Since the default 93*91f16700Schasinglulu * descriptors are allocated within BL2 RW memory, this prevents BL31/BL32 94*91f16700Schasinglulu * overlay of BL2 memory. Hence this function also copies the descriptors to a 95*91f16700Schasinglulu * pre-allocated memory indicated by ARM_BL2_MEM_DESC_BASE. 96*91f16700Schasinglulu ******************************************************************************/ 97*91f16700Schasinglulu struct bl_params *arm_get_next_bl_params(void) 98*91f16700Schasinglulu { 99*91f16700Schasinglulu bl_mem_params_node_t *bl2_mem_params_descs_cpy 100*91f16700Schasinglulu = (bl_mem_params_node_t *)ARM_BL2_MEM_DESC_BASE; 101*91f16700Schasinglulu const bl_params_t *next_bl_params; 102*91f16700Schasinglulu 103*91f16700Schasinglulu next_bl_params_cpy_ptr = 104*91f16700Schasinglulu (bl_params_t *)(ARM_BL2_MEM_DESC_BASE + 105*91f16700Schasinglulu (bl_mem_params_desc_num * sizeof(bl_mem_params_node_t))); 106*91f16700Schasinglulu 107*91f16700Schasinglulu /* 108*91f16700Schasinglulu * Copy the memory descriptors to ARM_BL2_MEM_DESC_BASE area. 109*91f16700Schasinglulu */ 110*91f16700Schasinglulu (void) memcpy(bl2_mem_params_descs_cpy, bl_mem_params_desc_ptr, 111*91f16700Schasinglulu (bl_mem_params_desc_num * sizeof(bl_mem_params_node_t))); 112*91f16700Schasinglulu 113*91f16700Schasinglulu /* 114*91f16700Schasinglulu * Modify the global 'bl_mem_params_desc_ptr' to point to the 115*91f16700Schasinglulu * copied location. 116*91f16700Schasinglulu */ 117*91f16700Schasinglulu bl_mem_params_desc_ptr = bl2_mem_params_descs_cpy; 118*91f16700Schasinglulu 119*91f16700Schasinglulu next_bl_params = get_next_bl_params_from_mem_params_desc(); 120*91f16700Schasinglulu assert(next_bl_params != NULL); 121*91f16700Schasinglulu 122*91f16700Schasinglulu /* 123*91f16700Schasinglulu * Copy 'next_bl_params' to the reserved location after the copied 124*91f16700Schasinglulu * memory descriptors. 125*91f16700Schasinglulu */ 126*91f16700Schasinglulu (void) memcpy(next_bl_params_cpy_ptr, next_bl_params, 127*91f16700Schasinglulu (sizeof(bl_params_t))); 128*91f16700Schasinglulu 129*91f16700Schasinglulu populate_next_bl_params_config(next_bl_params_cpy_ptr); 130*91f16700Schasinglulu 131*91f16700Schasinglulu return next_bl_params_cpy_ptr; 132*91f16700Schasinglulu } 133*91f16700Schasinglulu 134*91f16700Schasinglulu /******************************************************************************* 135*91f16700Schasinglulu * This function returns the list of executable images 136*91f16700Schasinglulu ******************************************************************************/ 137*91f16700Schasinglulu struct bl_params *plat_get_next_bl_params(void) 138*91f16700Schasinglulu { 139*91f16700Schasinglulu return arm_get_next_bl_params(); 140*91f16700Schasinglulu } 141*91f16700Schasinglulu 142