xref: /arm-trusted-firmware/plat/common/plat_bl1_common.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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