1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2015-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 <errno.h> 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <platform_def.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #include <arch_helpers.h> 13*91f16700Schasinglulu #include <bl1/bl1.h> 14*91f16700Schasinglulu #include <common/bl_common.h> 15*91f16700Schasinglulu #include <common/debug.h> 16*91f16700Schasinglulu #include <plat/common/platform.h> 17*91f16700Schasinglulu 18*91f16700Schasinglulu /* 19*91f16700Schasinglulu * The following platform functions are weakly defined. They 20*91f16700Schasinglulu * are default implementations that allow BL1 to compile in 21*91f16700Schasinglulu * absence of real definitions. The Platforms may override 22*91f16700Schasinglulu * with more complex definitions. 23*91f16700Schasinglulu */ 24*91f16700Schasinglulu #pragma weak bl1_plat_get_next_image_id 25*91f16700Schasinglulu #pragma weak bl1_plat_set_ep_info 26*91f16700Schasinglulu #pragma weak bl1_plat_get_image_desc 27*91f16700Schasinglulu #pragma weak bl1_plat_fwu_done 28*91f16700Schasinglulu #pragma weak bl1_plat_handle_pre_image_load 29*91f16700Schasinglulu #pragma weak bl1_plat_handle_post_image_load 30*91f16700Schasinglulu 31*91f16700Schasinglulu unsigned int bl1_plat_get_next_image_id(void) 32*91f16700Schasinglulu { 33*91f16700Schasinglulu /* BL2 load will be done by default. */ 34*91f16700Schasinglulu return BL2_IMAGE_ID; 35*91f16700Schasinglulu } 36*91f16700Schasinglulu 37*91f16700Schasinglulu void bl1_plat_set_ep_info(unsigned int image_id, 38*91f16700Schasinglulu struct entry_point_info *ep_info) 39*91f16700Schasinglulu { 40*91f16700Schasinglulu 41*91f16700Schasinglulu } 42*91f16700Schasinglulu 43*91f16700Schasinglulu int bl1_plat_handle_pre_image_load(unsigned int image_id) 44*91f16700Schasinglulu { 45*91f16700Schasinglulu return 0; 46*91f16700Schasinglulu } 47*91f16700Schasinglulu 48*91f16700Schasinglulu /* 49*91f16700Schasinglulu * Following is the default definition that always 50*91f16700Schasinglulu * returns BL2 image details. 51*91f16700Schasinglulu */ 52*91f16700Schasinglulu struct image_desc *bl1_plat_get_image_desc(unsigned int image_id) 53*91f16700Schasinglulu { 54*91f16700Schasinglulu static image_desc_t bl2_img_desc = BL2_IMAGE_DESC; 55*91f16700Schasinglulu return &bl2_img_desc; 56*91f16700Schasinglulu } 57*91f16700Schasinglulu 58*91f16700Schasinglulu __dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved) 59*91f16700Schasinglulu { 60*91f16700Schasinglulu while (true) 61*91f16700Schasinglulu wfi(); 62*91f16700Schasinglulu } 63*91f16700Schasinglulu 64*91f16700Schasinglulu /* 65*91f16700Schasinglulu * The Platforms must override with real definition. 66*91f16700Schasinglulu */ 67*91f16700Schasinglulu #pragma weak bl1_plat_mem_check 68*91f16700Schasinglulu 69*91f16700Schasinglulu int bl1_plat_mem_check(uintptr_t mem_base, unsigned int mem_size, 70*91f16700Schasinglulu unsigned int flags) 71*91f16700Schasinglulu { 72*91f16700Schasinglulu assert(0); 73*91f16700Schasinglulu return -ENOMEM; 74*91f16700Schasinglulu } 75*91f16700Schasinglulu 76*91f16700Schasinglulu /* 77*91f16700Schasinglulu * Default implementation for bl1_plat_handle_post_image_load(). This function 78*91f16700Schasinglulu * populates the default arguments to BL2. The BL2 memory layout structure 79*91f16700Schasinglulu * is allocated and the calculated layout is populated in arg1 to BL2. 80*91f16700Schasinglulu */ 81*91f16700Schasinglulu int bl1_plat_handle_post_image_load(unsigned int image_id) 82*91f16700Schasinglulu { 83*91f16700Schasinglulu meminfo_t *bl2_secram_layout; 84*91f16700Schasinglulu meminfo_t *bl1_secram_layout; 85*91f16700Schasinglulu image_desc_t *image_desc; 86*91f16700Schasinglulu entry_point_info_t *ep_info; 87*91f16700Schasinglulu 88*91f16700Schasinglulu if (image_id != BL2_IMAGE_ID) 89*91f16700Schasinglulu return 0; 90*91f16700Schasinglulu 91*91f16700Schasinglulu /* Get the image descriptor */ 92*91f16700Schasinglulu image_desc = bl1_plat_get_image_desc(BL2_IMAGE_ID); 93*91f16700Schasinglulu assert(image_desc != NULL); 94*91f16700Schasinglulu 95*91f16700Schasinglulu /* Get the entry point info */ 96*91f16700Schasinglulu ep_info = &image_desc->ep_info; 97*91f16700Schasinglulu 98*91f16700Schasinglulu /* Find out how much free trusted ram remains after BL1 load */ 99*91f16700Schasinglulu bl1_secram_layout = bl1_plat_sec_mem_layout(); 100*91f16700Schasinglulu 101*91f16700Schasinglulu /* 102*91f16700Schasinglulu * Create a new layout of memory for BL2 as seen by BL1 i.e. 103*91f16700Schasinglulu * tell it the amount of total and free memory available. 104*91f16700Schasinglulu * This layout is created at the first free address visible 105*91f16700Schasinglulu * to BL2. BL2 will read the memory layout before using its 106*91f16700Schasinglulu * memory for other purposes. 107*91f16700Schasinglulu */ 108*91f16700Schasinglulu bl2_secram_layout = (meminfo_t *) bl1_secram_layout->total_base; 109*91f16700Schasinglulu 110*91f16700Schasinglulu bl1_calc_bl2_mem_layout(bl1_secram_layout, bl2_secram_layout); 111*91f16700Schasinglulu 112*91f16700Schasinglulu ep_info->args.arg1 = (uintptr_t)bl2_secram_layout; 113*91f16700Schasinglulu 114*91f16700Schasinglulu VERBOSE("BL1: BL2 memory layout address = %p\n", 115*91f16700Schasinglulu (void *) bl2_secram_layout); 116*91f16700Schasinglulu return 0; 117*91f16700Schasinglulu } 118