1 /* 2 * Copyright (c) 2015-2020, 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 #if MEASURED_BOOT 31 #pragma weak bl1_plat_set_bl2_hash 32 #endif 33 34 unsigned int bl1_plat_get_next_image_id(void) 35 { 36 /* BL2 load will be done by default. */ 37 return BL2_IMAGE_ID; 38 } 39 40 void bl1_plat_set_ep_info(unsigned int image_id, 41 struct entry_point_info *ep_info) 42 { 43 44 } 45 46 int bl1_plat_handle_pre_image_load(unsigned int image_id) 47 { 48 return 0; 49 } 50 51 /* 52 * Following is the default definition that always 53 * returns BL2 image details. 54 */ 55 struct image_desc *bl1_plat_get_image_desc(unsigned int image_id) 56 { 57 static image_desc_t bl2_img_desc = BL2_IMAGE_DESC; 58 return &bl2_img_desc; 59 } 60 61 __dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved) 62 { 63 while (true) 64 wfi(); 65 } 66 67 /* 68 * The Platforms must override with real definition. 69 */ 70 #pragma weak bl1_plat_mem_check 71 72 int bl1_plat_mem_check(uintptr_t mem_base, unsigned int mem_size, 73 unsigned int flags) 74 { 75 assert(0); 76 return -ENOMEM; 77 } 78 79 /* 80 * Default implementation for bl1_plat_handle_post_image_load(). This function 81 * populates the default arguments to BL2. The BL2 memory layout structure 82 * is allocated and the calculated layout is populated in arg1 to BL2. 83 */ 84 int bl1_plat_handle_post_image_load(unsigned int image_id) 85 { 86 meminfo_t *bl2_secram_layout; 87 meminfo_t *bl1_secram_layout; 88 image_desc_t *image_desc; 89 entry_point_info_t *ep_info; 90 91 if (image_id != BL2_IMAGE_ID) 92 return 0; 93 94 /* Get the image descriptor */ 95 image_desc = bl1_plat_get_image_desc(BL2_IMAGE_ID); 96 assert(image_desc != NULL); 97 98 /* Get the entry point info */ 99 ep_info = &image_desc->ep_info; 100 101 /* Find out how much free trusted ram remains after BL1 load */ 102 bl1_secram_layout = bl1_plat_sec_mem_layout(); 103 104 /* 105 * Create a new layout of memory for BL2 as seen by BL1 i.e. 106 * tell it the amount of total and free memory available. 107 * This layout is created at the first free address visible 108 * to BL2. BL2 will read the memory layout before using its 109 * memory for other purposes. 110 */ 111 bl2_secram_layout = (meminfo_t *) bl1_secram_layout->total_base; 112 113 bl1_calc_bl2_mem_layout(bl1_secram_layout, bl2_secram_layout); 114 115 ep_info->args.arg1 = (uintptr_t)bl2_secram_layout; 116 117 VERBOSE("BL1: BL2 memory layout address = %p\n", 118 (void *) bl2_secram_layout); 119 return 0; 120 } 121 122 #if MEASURED_BOOT 123 /* 124 * Calculates and writes BL2 hash data to TB_FW_CONFIG DTB. 125 */ 126 void bl1_plat_set_bl2_hash(const image_desc_t *image_desc) 127 { 128 } 129 #endif 130