1 /* 2 * Copyright (c) 2015-2024, 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 *bl1_tzram_layout; 84 image_desc_t *image_desc; 85 86 if (image_id != BL2_IMAGE_ID) 87 return 0; 88 89 /* Get the image descriptor */ 90 image_desc = bl1_plat_get_image_desc(BL2_IMAGE_ID); 91 assert(image_desc != NULL); 92 93 /* Find out how much free trusted ram remains after BL1 load */ 94 bl1_tzram_layout = bl1_plat_sec_mem_layout(); 95 96 /* 97 * Convey this information to BL2 by storing the layout at the first free 98 * address visible to BL2. 99 */ 100 bl1_plat_calc_bl2_layout(bl1_tzram_layout, 101 (meminfo_t *)bl1_tzram_layout->total_base); 102 103 image_desc->ep_info.args.arg1 = (uintptr_t)bl1_tzram_layout->total_base; 104 105 VERBOSE("BL1: BL2 memory layout address = %p\n", 106 (void *)image_desc->ep_info.args.arg1); 107 108 return 0; 109 } 110 111 /******************************************************************************* 112 * Helper utility to calculate the BL2 memory layout taking into consideration 113 * the BL1 RW data assuming that it is at the top of the memory layout. 114 ******************************************************************************/ 115 void bl1_plat_calc_bl2_layout(const meminfo_t *bl1_mem_layout, 116 meminfo_t *bl2_mem_layout) 117 { 118 assert(bl1_mem_layout != NULL); 119 assert(bl2_mem_layout != NULL); 120 121 /* 122 * Remove BL1 RW data from the scope of memory visible to BL2. 123 * This is assuming BL1 RW data is at the top of bl1_mem_layout. 124 */ 125 assert(BL1_RW_BASE > bl1_mem_layout->total_base); 126 bl2_mem_layout->total_base = bl1_mem_layout->total_base; 127 bl2_mem_layout->total_size = BL1_RW_BASE - bl1_mem_layout->total_base; 128 129 flush_dcache_range((uintptr_t)bl2_mem_layout, sizeof(meminfo_t)); 130 } 131