xref: /rk3399_ARM-atf/include/common/bl_common.h (revision fd7b287cbe9147ca9e07dd9f30c49c58bbdd92a8)
1 /*
2  * Copyright (c) 2013-2019, 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 <common/ep_info.h>
11 #include <common/param_header.h>
12 #include <lib/utils_def.h>
13 
14 #define UP	U(1)
15 #define DOWN	U(0)
16 
17 /*******************************************************************************
18  * Constants to identify the location of a memory region in a given memory
19  * layout.
20 ******************************************************************************/
21 #define TOP	U(0x1)
22 #define BOTTOM	U(0x0)
23 
24 /*
25  * The following are used for image state attributes.
26  * Image can only be in one of the following state.
27  */
28 #define IMAGE_STATE_RESET		U(0)
29 #define IMAGE_STATE_COPIED		U(1)
30 #define IMAGE_STATE_COPYING		U(2)
31 #define IMAGE_STATE_AUTHENTICATED	U(3)
32 #define IMAGE_STATE_EXECUTED		U(4)
33 #define IMAGE_STATE_INTERRUPTED		U(5)
34 
35 #define IMAGE_ATTRIB_SKIP_LOADING	U(0x02)
36 #define IMAGE_ATTRIB_PLAT_SETUP		U(0x04)
37 
38 #define INVALID_IMAGE_ID		U(0xFFFFFFFF)
39 
40 /*******************************************************************************
41  * Constants to indicate type of exception to the common exception handler.
42  ******************************************************************************/
43 #define SYNC_EXCEPTION_SP_EL0		U(0x0)
44 #define IRQ_SP_EL0			U(0x1)
45 #define FIQ_SP_EL0			U(0x2)
46 #define SERROR_SP_EL0			U(0x3)
47 #define SYNC_EXCEPTION_SP_ELX		U(0x4)
48 #define IRQ_SP_ELX			U(0x5)
49 #define FIQ_SP_ELX			U(0x6)
50 #define SERROR_SP_ELX			U(0x7)
51 #define SYNC_EXCEPTION_AARCH64		U(0x8)
52 #define IRQ_AARCH64			U(0x9)
53 #define FIQ_AARCH64			U(0xa)
54 #define SERROR_AARCH64			U(0xb)
55 #define SYNC_EXCEPTION_AARCH32		U(0xc)
56 #define IRQ_AARCH32			U(0xd)
57 #define FIQ_AARCH32			U(0xe)
58 #define SERROR_AARCH32			U(0xf)
59 
60 /*
61  * Mapping to connect linker symbols from .ld.S with their counterparts
62  * from .scat for the BL31 image
63  */
64 #if defined(USE_ARM_LINK)
65 #define __BL31_END__			Load$$LR$$LR_END$$Base
66 #define __BSS_START__			Load$$LR$$LR_BSS$$Base
67 #define __BSS_END__			Load$$LR$$LR_BSS$$Limit
68 #define __BSS_SIZE__			Load$$LR$$LR_BSS$$Length
69 #define __COHERENT_RAM_START__		Load$$LR$$LR_COHERENT_RAM$$Base
70 #define __COHERENT_RAM_END_UNALIGNED__	Load$$__COHERENT_RAM_EPILOGUE_UNALIGNED__$$Base
71 #define __COHERENT_RAM_END__		Load$$LR$$LR_COHERENT_RAM$$Limit
72 #define __COHERENT_RAM_UNALIGNED_SIZE__	Load$$__COHERENT_RAM__$$Length
73 #define __CPU_OPS_START__		Load$$__CPU_OPS__$$Base
74 #define __CPU_OPS_END__			Load$$__CPU_OPS__$$Limit
75 #define __DATA_START__			Load$$__DATA__$$Base
76 #define __DATA_END__			Load$$__DATA__$$Limit
77 #define __GOT_START__			Load$$__GOT__$$Base
78 #define __GOT_END__			Load$$__GOT__$$Limit
79 #define __PERCPU_BAKERY_LOCK_START__	Load$$__BAKERY_LOCKS__$$Base
80 #define __PERCPU_BAKERY_LOCK_END__	Load$$__BAKERY_LOCKS_EPILOGUE__$$Base
81 #define __PMF_SVC_DESCS_START__		Load$$__PMF_SVC_DESCS__$$Base
82 #define __PMF_SVC_DESCS_END__		Load$$__PMF_SVC_DESCS__$$Limit
83 #define __PMF_TIMESTAMP_START__		Load$$__PMF_TIMESTAMP__$$Base
84 #define __PMF_TIMESTAMP_END__		Load$$__PER_CPU_TIMESTAMPS__$$Limit
85 #define __PMF_PERCPU_TIMESTAMP_END__	Load$$__PMF_TIMESTAMP_EPILOGUE__$$Base
86 #define __RELA_END__			Load$$__RELA__$$Limit
87 #define __RELA_START__			Load$$__RELA__$$Base
88 #define __RODATA_START__		Load$$__RODATA__$$Base
89 #define __RODATA_END__			Load$$__RODATA_EPILOGUE__$$Base
90 #define __RT_SVC_DESCS_START__		Load$$__RT_SVC_DESCS__$$Base
91 #define __RT_SVC_DESCS_END__		Load$$__RT_SVC_DESCS__$$Limit
92 #define __RW_START__			Load$$LR$$LR_RW_DATA$$Base
93 #define __RW_END__			Load$$LR$$LR_END$$Base
94 #define __SPM_SHIM_EXCEPTIONS_START__	Load$$__SPM_SHIM_EXCEPTIONS__$$Base
95 #define __SPM_SHIM_EXCEPTIONS_END__	Load$$__SPM_SHIM_EXCEPTIONS_EPILOGUE__$$Base
96 #define __STACKS_START__		Load$$__STACKS__$$Base
97 #define __STACKS_END__			Load$$__STACKS__$$Limit
98 #define __TEXT_START__			Load$$__TEXT__$$Base
99 #define __TEXT_END__			Load$$__TEXT_EPILOGUE__$$Base
100 #endif /* USE_ARM_LINK */
101 
102 #ifndef __ASSEMBLY__
103 
104 #include <stddef.h>
105 #include <stdint.h>
106 
107 #include <lib/cassert.h>
108 
109 /*
110  * Declarations of linker defined symbols to help determine memory layout of
111  * BL images
112  */
113 #if SEPARATE_CODE_AND_RODATA
114 IMPORT_SYM(uintptr_t, __TEXT_START__,		BL_CODE_BASE);
115 IMPORT_SYM(uintptr_t, __TEXT_END__,		BL_CODE_END);
116 IMPORT_SYM(uintptr_t, __RODATA_START__,		BL_RO_DATA_BASE);
117 IMPORT_SYM(uintptr_t, __RODATA_END__,		BL_RO_DATA_END);
118 #else
119 IMPORT_SYM(uintptr_t, __RO_START__,		BL_CODE_BASE);
120 IMPORT_SYM(uintptr_t, __RO_END__,		BL_CODE_END);
121 #endif
122 
123 #if defined(IMAGE_BL1)
124 IMPORT_SYM(uintptr_t, __BL1_ROM_END__,		BL1_ROM_END);
125 
126 IMPORT_SYM(uintptr_t, __BL1_RAM_START__,	BL1_RAM_BASE);
127 IMPORT_SYM(uintptr_t, __BL1_RAM_END__,		BL1_RAM_LIMIT);
128 #elif defined(IMAGE_BL2)
129 IMPORT_SYM(uintptr_t, __BL2_END__,		BL2_END);
130 #elif defined(IMAGE_BL2U)
131 IMPORT_SYM(uintptr_t, __BL2U_END__,		BL2U_END);
132 #elif defined(IMAGE_BL31)
133 IMPORT_SYM(uintptr_t, __BL31_START__,		BL31_START);
134 IMPORT_SYM(uintptr_t, __BL31_END__,		BL31_END);
135 #elif defined(IMAGE_BL32)
136 IMPORT_SYM(uintptr_t, __BL32_END__,		BL32_END);
137 #endif /* IMAGE_BLX */
138 
139 /* The following symbols are only exported from the BL2 at EL3 linker script. */
140 #if BL2_IN_XIP_MEM && defined(IMAGE_BL2)
141 IMPORT_SYM(uintptr_t, __BL2_ROM_END__,		BL2_ROM_END);
142 
143 IMPORT_SYM(uintptr_t, __BL2_RAM_START__,	BL2_RAM_BASE);
144 IMPORT_SYM(uintptr_t, __BL2_RAM_END__,		BL2_RAM_END);
145 #endif /* BL2_IN_XIP_MEM */
146 
147 /*
148  * The next 2 constants identify the extents of the coherent memory region.
149  * These addresses are used by the MMU setup code and therefore they must be
150  * page-aligned.  It is the responsibility of the linker script to ensure that
151  * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols refer to
152  * page-aligned addresses.
153  */
154 #if USE_COHERENT_MEM
155 IMPORT_SYM(uintptr_t, __COHERENT_RAM_START__,	BL_COHERENT_RAM_BASE);
156 IMPORT_SYM(uintptr_t, __COHERENT_RAM_END__,	BL_COHERENT_RAM_END);
157 #endif
158 
159 /*******************************************************************************
160  * Structure used for telling the next BL how much of a particular type of
161  * memory is available for its use and how much is already used.
162  ******************************************************************************/
163 typedef struct meminfo {
164 	uintptr_t total_base;
165 	size_t total_size;
166 } meminfo_t;
167 
168 /*****************************************************************************
169  * Image info binary provides information from the image loader that
170  * can be used by the firmware to manage available trusted RAM.
171  * More advanced firmware image formats can provide additional
172  * information that enables optimization or greater flexibility in the
173  * common firmware code
174  *****************************************************************************/
175 typedef struct image_info {
176 	param_header_t h;
177 	uintptr_t image_base;   /* physical address of base of image */
178 	uint32_t image_size;    /* bytes read from image file */
179 	uint32_t image_max_size;
180 } image_info_t;
181 
182 /*****************************************************************************
183  * The image descriptor struct definition.
184  *****************************************************************************/
185 typedef struct image_desc {
186 	/* Contains unique image id for the image. */
187 	unsigned int image_id;
188 	/*
189 	 * This member contains Image state information.
190 	 * Refer IMAGE_STATE_XXX defined above.
191 	 */
192 	unsigned int state;
193 	uint32_t copied_size;	/* image size copied in blocks */
194 	image_info_t image_info;
195 	entry_point_info_t ep_info;
196 } image_desc_t;
197 
198 /* BL image node in the BL image loading sequence */
199 typedef struct bl_load_info_node {
200 	unsigned int image_id;
201 	image_info_t *image_info;
202 	struct bl_load_info_node *next_load_info;
203 } bl_load_info_node_t;
204 
205 /* BL image head node in the BL image loading sequence */
206 typedef struct bl_load_info {
207 	param_header_t h;
208 	bl_load_info_node_t *head;
209 } bl_load_info_t;
210 
211 /* BL image node in the BL image execution sequence */
212 typedef struct bl_params_node {
213 	unsigned int image_id;
214 	image_info_t *image_info;
215 	entry_point_info_t *ep_info;
216 	struct bl_params_node *next_params_info;
217 } bl_params_node_t;
218 
219 /*
220  * BL image head node in the BL image execution sequence
221  * It is also used to pass information to next BL image.
222  */
223 typedef struct bl_params {
224 	param_header_t h;
225 	bl_params_node_t *head;
226 } bl_params_t;
227 
228 /*******************************************************************************
229  * Function & variable prototypes
230  ******************************************************************************/
231 int load_auth_image(unsigned int image_id, image_info_t *image_data);
232 
233 #if TRUSTED_BOARD_BOOT && defined(DYN_DISABLE_AUTH)
234 /*
235  * API to dynamically disable authentication. Only meant for development
236  * systems.
237  */
238 void dyn_disable_auth(void);
239 #endif
240 
241 extern const char build_message[];
242 extern const char version_string[];
243 
244 void print_entry_point_info(const entry_point_info_t *ep_info);
245 uintptr_t page_align(uintptr_t value, unsigned dir);
246 
247 struct mmap_region;
248 
249 void setup_page_tables(const struct mmap_region *bl_regions,
250 			   const struct mmap_region *plat_regions);
251 
252 void bl_handle_pauth(void);
253 
254 #endif /*__ASSEMBLY__*/
255 
256 #endif /* BL_COMMON_H */
257