1 /*
2  * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef __BL_COMMON_H__
8 #define __BL_COMMON_H__
9 
10 #include <ep_info.h>
11 #include <param_header.h>
12 
13 #define UP	1
14 #define DOWN	0
15 
16 /*******************************************************************************
17  * Constants to identify the location of a memory region in a given memory
18  * layout.
19 ******************************************************************************/
20 #define TOP	0x1
21 #define BOTTOM	!TOP
22 
23 /*
24  * The following are used for image state attributes.
25  * Image can only be in one of the following state.
26  */
27 #define IMAGE_STATE_RESET			0
28 #define IMAGE_STATE_COPIED			1
29 #define IMAGE_STATE_COPYING			2
30 #define IMAGE_STATE_AUTHENTICATED		3
31 #define IMAGE_STATE_EXECUTED			4
32 #define IMAGE_STATE_INTERRUPTED			5
33 
34 #define IMAGE_ATTRIB_SKIP_LOADING	0x02
35 #define IMAGE_ATTRIB_PLAT_SETUP		0x04
36 
37 #define INVALID_IMAGE_ID		(0xFFFFFFFF)
38 
39 /*******************************************************************************
40  * Constants to indicate type of exception to the common exception handler.
41  ******************************************************************************/
42 #define SYNC_EXCEPTION_SP_EL0		0x0
43 #define IRQ_SP_EL0			0x1
44 #define FIQ_SP_EL0			0x2
45 #define SERROR_SP_EL0			0x3
46 #define SYNC_EXCEPTION_SP_ELX		0x4
47 #define IRQ_SP_ELX			0x5
48 #define FIQ_SP_ELX			0x6
49 #define SERROR_SP_ELX			0x7
50 #define SYNC_EXCEPTION_AARCH64		0x8
51 #define IRQ_AARCH64			0x9
52 #define FIQ_AARCH64			0xa
53 #define SERROR_AARCH64			0xb
54 #define SYNC_EXCEPTION_AARCH32		0xc
55 #define IRQ_AARCH32			0xd
56 #define FIQ_AARCH32			0xe
57 #define SERROR_AARCH32			0xf
58 
59 #ifndef __ASSEMBLY__
60 #include <cassert.h>
61 #include <stddef.h>
62 #include <stdint.h>
63 #include <types.h>
64 #include <utils_def.h> /* To retain compatibility */
65 
66 /*
67  * Declarations of linker defined symbols to help determine memory layout of
68  * BL images
69  */
70 #if SEPARATE_CODE_AND_RODATA
71 extern uintptr_t __TEXT_START__;
72 extern uintptr_t __TEXT_END__;
73 extern uintptr_t __RODATA_START__;
74 extern uintptr_t __RODATA_END__;
75 #else
76 extern uintptr_t __RO_START__;
77 extern uintptr_t __RO_END__;
78 #endif
79 
80 #if defined(IMAGE_BL2)
81 extern uintptr_t __BL2_END__;
82 #elif defined(IMAGE_BL2U)
83 extern uintptr_t __BL2U_END__;
84 #elif defined(IMAGE_BL31)
85 extern uintptr_t __BL31_END__;
86 #elif defined(IMAGE_BL32)
87 extern uintptr_t __BL32_END__;
88 #endif /* IMAGE_BLX */
89 
90 #if USE_COHERENT_MEM
91 extern uintptr_t __COHERENT_RAM_START__;
92 extern uintptr_t __COHERENT_RAM_END__;
93 #endif
94 
95 /*******************************************************************************
96  * Structure used for telling the next BL how much of a particular type of
97  * memory is available for its use and how much is already used.
98  ******************************************************************************/
99 typedef struct meminfo {
100 	uintptr_t total_base;
101 	size_t total_size;
102 #if !LOAD_IMAGE_V2
103 	uintptr_t free_base;
104 	size_t free_size;
105 #endif
106 } meminfo_t;
107 
108 /*****************************************************************************
109  * Image info binary provides information from the image loader that
110  * can be used by the firmware to manage available trusted RAM.
111  * More advanced firmware image formats can provide additional
112  * information that enables optimization or greater flexibility in the
113  * common firmware code
114  *****************************************************************************/
115 typedef struct image_info {
116 	param_header_t h;
117 	uintptr_t image_base;   /* physical address of base of image */
118 	uint32_t image_size;    /* bytes read from image file */
119 #if LOAD_IMAGE_V2
120 	uint32_t image_max_size;
121 #endif
122 } image_info_t;
123 
124 /*****************************************************************************
125  * The image descriptor struct definition.
126  *****************************************************************************/
127 typedef struct image_desc {
128 	/* Contains unique image id for the image. */
129 	unsigned int image_id;
130 	/*
131 	 * This member contains Image state information.
132 	 * Refer IMAGE_STATE_XXX defined above.
133 	 */
134 	unsigned int state;
135 	uint32_t copied_size;	/* image size copied in blocks */
136 	image_info_t image_info;
137 	entry_point_info_t ep_info;
138 } image_desc_t;
139 
140 #if LOAD_IMAGE_V2
141 /* BL image node in the BL image loading sequence */
142 typedef struct bl_load_info_node {
143 	unsigned int image_id;
144 	image_info_t *image_info;
145 	struct bl_load_info_node *next_load_info;
146 } bl_load_info_node_t;
147 
148 /* BL image head node in the BL image loading sequence */
149 typedef struct bl_load_info {
150 	param_header_t h;
151 	bl_load_info_node_t *head;
152 } bl_load_info_t;
153 
154 /* BL image node in the BL image execution sequence */
155 typedef struct bl_params_node {
156 	unsigned int image_id;
157 	image_info_t *image_info;
158 	entry_point_info_t *ep_info;
159 	struct bl_params_node *next_params_info;
160 } bl_params_node_t;
161 
162 /*
163  * BL image head node in the BL image execution sequence
164  * It is also used to pass information to next BL image.
165  */
166 typedef struct bl_params {
167 	param_header_t h;
168 	bl_params_node_t *head;
169 } bl_params_t;
170 
171 #else /* LOAD_IMAGE_V2 */
172 
173 /*******************************************************************************
174  * This structure represents the superset of information that can be passed to
175  * BL31 e.g. while passing control to it from BL2. The BL32 parameters will be
176  * populated only if BL2 detects its presence. A pointer to a structure of this
177  * type should be passed in X0 to BL31's cold boot entrypoint.
178  *
179  * Use of this structure and the X0 parameter is not mandatory: the BL31
180  * platform code can use other mechanisms to provide the necessary information
181  * about BL32 and BL33 to the common and SPD code.
182  *
183  * BL31 image information is mandatory if this structure is used. If either of
184  * the optional BL32 and BL33 image information is not provided, this is
185  * indicated by the respective image_info pointers being zero.
186  ******************************************************************************/
187 typedef struct bl31_params {
188 	param_header_t h;
189 	image_info_t *bl31_image_info;
190 	entry_point_info_t *bl32_ep_info;
191 	image_info_t *bl32_image_info;
192 	entry_point_info_t *bl33_ep_info;
193 	image_info_t *bl33_image_info;
194 } bl31_params_t;
195 
196 #endif /* LOAD_IMAGE_V2 */
197 
198 /*******************************************************************************
199  * Function & variable prototypes
200  ******************************************************************************/
201 size_t image_size(unsigned int image_id);
202 
203 int is_mem_free(uintptr_t free_base, size_t free_size,
204 		uintptr_t addr, size_t size);
205 
206 #if LOAD_IMAGE_V2
207 
208 int load_image(unsigned int image_id, image_info_t *image_data);
209 int load_auth_image(unsigned int image_id, image_info_t *image_data);
210 
211 #else
212 
213 uintptr_t page_align(uintptr_t, unsigned);
214 int load_image(meminfo_t *mem_layout,
215 	       unsigned int image_id,
216 	       uintptr_t image_base,
217 	       image_info_t *image_data,
218 	       entry_point_info_t *entry_point_info);
219 int load_auth_image(meminfo_t *mem_layout,
220 		    unsigned int image_id,
221 		    uintptr_t image_base,
222 		    image_info_t *image_data,
223 		    entry_point_info_t *entry_point_info);
224 void reserve_mem(uintptr_t *free_base, size_t *free_size,
225 		uintptr_t addr, size_t size);
226 
227 #endif /* LOAD_IMAGE_V2 */
228 
229 extern const char build_message[];
230 extern const char version_string[];
231 
232 void print_entry_point_info(const entry_point_info_t *ep_info);
233 
234 #endif /*__ASSEMBLY__*/
235 
236 #endif /* __BL_COMMON_H__ */
237