1 /*
2  * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <platform_def.h>
8 
9 #include <common/bl_common.h>
10 #include <common/desc_image_load.h>
11 #include <plat/common/platform.h>
12 
13 /*******************************************************************************
14  * Following descriptor provides BL image/ep information that gets used
15  * by BL2 to load the images and also subset of this information is
16  * passed to next BL image. The image loading sequence is managed by
17  * populating the images in required loading order. The image execution
18  * sequence is managed by populating the `next_handoff_image_id` with
19  * the next executable image id.
20  ******************************************************************************/
21 static bl_mem_params_node_t bl2_mem_params_descs[] = {
22 
23 	/* Fill BL31 related information */
24 	{
25 		.image_id = BL31_IMAGE_ID,
26 
27 		SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
28 				      VERSION_2, entry_point_info_t,
29 				      SECURE | EXECUTABLE | EP_FIRST_EXE),
30 		.ep_info.pc = BL31_BASE,
31 		.ep_info.spsr = SPSR_64(MODE_EL3, MODE_SP_ELX,
32 					DISABLE_ALL_EXCEPTIONS),
33 #if DEBUG
34 		.ep_info.args.arg1 = RPI3_BL31_PLAT_PARAM_VAL,
35 #endif
36 		SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
37 				      VERSION_2, image_info_t,
38 				      IMAGE_ATTRIB_PLAT_SETUP),
39 		.image_info.image_base = BL31_BASE,
40 		.image_info.image_max_size = BL31_LIMIT - BL31_BASE,
41 
42 # ifdef BL32_BASE
43 		.next_handoff_image_id = BL32_IMAGE_ID,
44 # else
45 		.next_handoff_image_id = BL33_IMAGE_ID,
46 # endif
47 	},
48 
49 # ifdef BL32_BASE
50 	/* Fill BL32 related information */
51 	{
52 		.image_id = BL32_IMAGE_ID,
53 
54 		SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
55 				      VERSION_2, entry_point_info_t,
56 				      SECURE | EXECUTABLE),
57 		.ep_info.pc = BL32_BASE,
58 
59 		SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
60 				      VERSION_2, image_info_t, 0),
61 		.image_info.image_base = BL32_BASE,
62 		.image_info.image_max_size = BL32_LIMIT - BL32_BASE,
63 
64 		.next_handoff_image_id = BL33_IMAGE_ID,
65 	},
66 
67 	/*
68 	 * Fill BL32 external 1 related information.
69 	 * A typical use for extra1 image is with OP-TEE where it is the pager
70 	 * image.
71 	 */
72 	{
73 		.image_id = BL32_EXTRA1_IMAGE_ID,
74 
75 		SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
76 				      VERSION_2, entry_point_info_t,
77 				      SECURE | NON_EXECUTABLE),
78 
79 		SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
80 				      VERSION_2, image_info_t,
81 				      IMAGE_ATTRIB_SKIP_LOADING),
82 		.image_info.image_base = BL32_BASE,
83 		.image_info.image_max_size = BL32_LIMIT - BL32_BASE,
84 
85 		.next_handoff_image_id = INVALID_IMAGE_ID,
86 	},
87 
88 	/*
89 	 * Fill BL32 external 2 related information.
90 	 * A typical use for extra2 image is with OP-TEE where it is the paged
91 	 * image.
92 	 */
93 	{
94 		.image_id = BL32_EXTRA2_IMAGE_ID,
95 
96 		SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
97 				      VERSION_2, entry_point_info_t,
98 				      SECURE | NON_EXECUTABLE),
99 
100 		SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
101 				      VERSION_2, image_info_t,
102 				      IMAGE_ATTRIB_SKIP_LOADING),
103 #ifdef SPD_opteed
104 		.image_info.image_base = RPI3_OPTEE_PAGEABLE_LOAD_BASE,
105 		.image_info.image_max_size = RPI3_OPTEE_PAGEABLE_LOAD_SIZE,
106 #endif
107 		.next_handoff_image_id = INVALID_IMAGE_ID,
108 	},
109 # endif /* BL32_BASE */
110 
111 	/* Fill BL33 related information */
112 	{
113 		.image_id = BL33_IMAGE_ID,
114 		SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
115 				      VERSION_2, entry_point_info_t,
116 				      NON_SECURE | EXECUTABLE),
117 # ifdef PRELOADED_BL33_BASE
118 		.ep_info.pc = PRELOADED_BL33_BASE,
119 
120 		SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
121 				      VERSION_2, image_info_t,
122 				      IMAGE_ATTRIB_SKIP_LOADING),
123 # else
124 		.ep_info.pc = PLAT_RPI3_NS_IMAGE_OFFSET,
125 
126 		SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
127 				      VERSION_2, image_info_t, 0),
128 		.image_info.image_base = PLAT_RPI3_NS_IMAGE_OFFSET,
129 		.image_info.image_max_size = PLAT_RPI3_NS_IMAGE_MAX_SIZE,
130 # endif /* PRELOADED_BL33_BASE */
131 
132 		.next_handoff_image_id = INVALID_IMAGE_ID,
133 	}
134 };
135 
136 REGISTER_BL_IMAGE_DESCS(bl2_mem_params_descs)
137