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