xref: /rk3399_ARM-atf/plat/arm/common/arm_bl2_setup.c (revision 7fb3a70bffc7b77d1aec8fa1ea895f3f1a218315)
1 /*
2  * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <arch_helpers.h>
8 #include <arm_def.h>
9 #include <assert.h>
10 #include <bl_common.h>
11 #include <debug.h>
12 #include <desc_image_load.h>
13 #include <generic_delay_timer.h>
14 #ifdef SPD_opteed
15 #include <optee_utils.h>
16 #endif
17 #include <plat_arm.h>
18 #include <platform.h>
19 #include <platform_def.h>
20 #include <string.h>
21 #include <utils.h>
22 
23 /* Data structure which holds the extents of the trusted SRAM for BL2 */
24 static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE);
25 
26 /*
27  * Check that BL2_BASE is above ARM_TB_FW_CONFIG_LIMIT. This reserved page is
28  * for `meminfo_t` data structure and fw_configs passed from BL1.
29  */
30 CASSERT(BL2_BASE >= ARM_TB_FW_CONFIG_LIMIT, assert_bl2_base_overflows);
31 
32 /* Weak definitions may be overridden in specific ARM standard platform */
33 #pragma weak bl2_early_platform_setup2
34 #pragma weak bl2_platform_setup
35 #pragma weak bl2_plat_arch_setup
36 #pragma weak bl2_plat_sec_mem_layout
37 
38 #if LOAD_IMAGE_V2
39 
40 #pragma weak bl2_plat_handle_post_image_load
41 
42 #else /* LOAD_IMAGE_V2 */
43 
44 /*******************************************************************************
45  * This structure represents the superset of information that is passed to
46  * BL31, e.g. while passing control to it from BL2, bl31_params
47  * and other platform specific params
48  ******************************************************************************/
49 typedef struct bl2_to_bl31_params_mem {
50 	bl31_params_t bl31_params;
51 	image_info_t bl31_image_info;
52 	image_info_t bl32_image_info;
53 	image_info_t bl33_image_info;
54 	entry_point_info_t bl33_ep_info;
55 	entry_point_info_t bl32_ep_info;
56 	entry_point_info_t bl31_ep_info;
57 } bl2_to_bl31_params_mem_t;
58 
59 
60 static bl2_to_bl31_params_mem_t bl31_params_mem;
61 
62 
63 /* Weak definitions may be overridden in specific ARM standard platform */
64 #pragma weak bl2_plat_get_bl31_params
65 #pragma weak bl2_plat_get_bl31_ep_info
66 #pragma weak bl2_plat_flush_bl31_params
67 #pragma weak bl2_plat_set_bl31_ep_info
68 #pragma weak bl2_plat_get_scp_bl2_meminfo
69 #pragma weak bl2_plat_get_bl32_meminfo
70 #pragma weak bl2_plat_set_bl32_ep_info
71 #pragma weak bl2_plat_get_bl33_meminfo
72 #pragma weak bl2_plat_set_bl33_ep_info
73 
74 #if ARM_BL31_IN_DRAM
75 meminfo_t *bl2_plat_sec_mem_layout(void)
76 {
77 	static meminfo_t bl2_dram_layout
78 		__aligned(CACHE_WRITEBACK_GRANULE) = {
79 		.total_base = BL31_BASE,
80 		.total_size = (ARM_AP_TZC_DRAM1_BASE +
81 				ARM_AP_TZC_DRAM1_SIZE) - BL31_BASE,
82 		.free_base = BL31_BASE,
83 		.free_size = (ARM_AP_TZC_DRAM1_BASE +
84 				ARM_AP_TZC_DRAM1_SIZE) - BL31_BASE
85 	};
86 
87 	return &bl2_dram_layout;
88 }
89 #else
90 meminfo_t *bl2_plat_sec_mem_layout(void)
91 {
92 	return &bl2_tzram_layout;
93 }
94 #endif /* ARM_BL31_IN_DRAM */
95 
96 /*******************************************************************************
97  * This function assigns a pointer to the memory that the platform has kept
98  * aside to pass platform specific and trusted firmware related information
99  * to BL31. This memory is allocated by allocating memory to
100  * bl2_to_bl31_params_mem_t structure which is a superset of all the
101  * structure whose information is passed to BL31
102  * NOTE: This function should be called only once and should be done
103  * before generating params to BL31
104  ******************************************************************************/
105 bl31_params_t *bl2_plat_get_bl31_params(void)
106 {
107 	bl31_params_t *bl2_to_bl31_params;
108 
109 	/*
110 	 * Initialise the memory for all the arguments that needs to
111 	 * be passed to BL31
112 	 */
113 	zeromem(&bl31_params_mem, sizeof(bl2_to_bl31_params_mem_t));
114 
115 	/* Assign memory for TF related information */
116 	bl2_to_bl31_params = &bl31_params_mem.bl31_params;
117 	SET_PARAM_HEAD(bl2_to_bl31_params, PARAM_BL31, VERSION_1, 0);
118 
119 	/* Fill BL31 related information */
120 	bl2_to_bl31_params->bl31_image_info = &bl31_params_mem.bl31_image_info;
121 	SET_PARAM_HEAD(bl2_to_bl31_params->bl31_image_info, PARAM_IMAGE_BINARY,
122 		VERSION_1, 0);
123 
124 	/* Fill BL32 related information if it exists */
125 #ifdef BL32_BASE
126 	bl2_to_bl31_params->bl32_ep_info = &bl31_params_mem.bl32_ep_info;
127 	SET_PARAM_HEAD(bl2_to_bl31_params->bl32_ep_info, PARAM_EP,
128 		VERSION_1, 0);
129 	bl2_to_bl31_params->bl32_image_info = &bl31_params_mem.bl32_image_info;
130 	SET_PARAM_HEAD(bl2_to_bl31_params->bl32_image_info, PARAM_IMAGE_BINARY,
131 		VERSION_1, 0);
132 #endif /* BL32_BASE */
133 
134 	/* Fill BL33 related information */
135 	bl2_to_bl31_params->bl33_ep_info = &bl31_params_mem.bl33_ep_info;
136 	SET_PARAM_HEAD(bl2_to_bl31_params->bl33_ep_info,
137 		PARAM_EP, VERSION_1, 0);
138 
139 	/* BL33 expects to receive the primary CPU MPID (through x0) */
140 	bl2_to_bl31_params->bl33_ep_info->args.arg0 = 0xffff & read_mpidr();
141 
142 	bl2_to_bl31_params->bl33_image_info = &bl31_params_mem.bl33_image_info;
143 	SET_PARAM_HEAD(bl2_to_bl31_params->bl33_image_info, PARAM_IMAGE_BINARY,
144 		VERSION_1, 0);
145 
146 	return bl2_to_bl31_params;
147 }
148 
149 /* Flush the TF params and the TF plat params */
150 void bl2_plat_flush_bl31_params(void)
151 {
152 	flush_dcache_range((unsigned long)&bl31_params_mem,
153 			sizeof(bl2_to_bl31_params_mem_t));
154 }
155 
156 /*******************************************************************************
157  * This function returns a pointer to the shared memory that the platform
158  * has kept to point to entry point information of BL31 to BL2
159  ******************************************************************************/
160 struct entry_point_info *bl2_plat_get_bl31_ep_info(void)
161 {
162 #if DEBUG
163 	bl31_params_mem.bl31_ep_info.args.arg3 = ARM_BL31_PLAT_PARAM_VAL;
164 #endif
165 
166 	return &bl31_params_mem.bl31_ep_info;
167 }
168 #endif /* LOAD_IMAGE_V2 */
169 
170 /*******************************************************************************
171  * BL1 has passed the extents of the trusted SRAM that should be visible to BL2
172  * in x0. This memory layout is sitting at the base of the free trusted SRAM.
173  * Copy it to a safe location before its reclaimed by later BL2 functionality.
174  ******************************************************************************/
175 void arm_bl2_early_platform_setup(uintptr_t tb_fw_config, meminfo_t *mem_layout)
176 {
177 	/* Initialize the console to provide early debug support */
178 	arm_console_boot_init();
179 
180 	/* Setup the BL2 memory layout */
181 	bl2_tzram_layout = *mem_layout;
182 
183 	/* Initialise the IO layer and register platform IO devices */
184 	plat_arm_io_setup();
185 
186 #if LOAD_IMAGE_V2
187 	if (tb_fw_config != 0U)
188 		arm_bl2_set_tb_cfg_addr((void *)tb_fw_config);
189 #endif
190 }
191 
192 void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3)
193 {
194 	arm_bl2_early_platform_setup((uintptr_t)arg0, (meminfo_t *)arg1);
195 
196 	generic_delay_timer_init();
197 }
198 
199 /*
200  * Perform  BL2 preload setup. Currently we initialise the dynamic
201  * configuration here.
202  */
203 void bl2_plat_preload_setup(void)
204 {
205 #if LOAD_IMAGE_V2
206 	arm_bl2_dyn_cfg_init();
207 #endif
208 }
209 
210 /*
211  * Perform ARM standard platform setup.
212  */
213 void arm_bl2_platform_setup(void)
214 {
215 	/* Initialize the secure environment */
216 	plat_arm_security_setup();
217 
218 #if defined(PLAT_ARM_MEM_PROT_ADDR)
219 	arm_nor_psci_do_static_mem_protect();
220 #endif
221 }
222 
223 void bl2_platform_setup(void)
224 {
225 	arm_bl2_platform_setup();
226 }
227 
228 /*******************************************************************************
229  * Perform the very early platform specific architectural setup here. At the
230  * moment this is only initializes the mmu in a quick and dirty way.
231  ******************************************************************************/
232 void arm_bl2_plat_arch_setup(void)
233 {
234 	arm_setup_page_tables(bl2_tzram_layout.total_base,
235 			      bl2_tzram_layout.total_size,
236 			      BL_CODE_BASE,
237 			      BL_CODE_END,
238 			      BL_RO_DATA_BASE,
239 			      BL_RO_DATA_END
240 #if USE_COHERENT_MEM
241 			      , BL_COHERENT_RAM_BASE,
242 			      BL_COHERENT_RAM_END
243 #endif
244 			      );
245 
246 #ifdef AARCH32
247 	enable_mmu_secure(0);
248 #else
249 	enable_mmu_el1(0);
250 #endif
251 }
252 
253 void bl2_plat_arch_setup(void)
254 {
255 	arm_bl2_plat_arch_setup();
256 }
257 
258 #if LOAD_IMAGE_V2
259 int arm_bl2_handle_post_image_load(unsigned int image_id)
260 {
261 	int err = 0;
262 	bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id);
263 #ifdef SPD_opteed
264 	bl_mem_params_node_t *pager_mem_params = NULL;
265 	bl_mem_params_node_t *paged_mem_params = NULL;
266 #endif
267 	assert(bl_mem_params);
268 
269 	switch (image_id) {
270 #ifdef AARCH64
271 	case BL32_IMAGE_ID:
272 #ifdef SPD_opteed
273 		pager_mem_params = get_bl_mem_params_node(BL32_EXTRA1_IMAGE_ID);
274 		assert(pager_mem_params);
275 
276 		paged_mem_params = get_bl_mem_params_node(BL32_EXTRA2_IMAGE_ID);
277 		assert(paged_mem_params);
278 
279 		err = parse_optee_header(&bl_mem_params->ep_info,
280 				&pager_mem_params->image_info,
281 				&paged_mem_params->image_info);
282 		if (err != 0) {
283 			WARN("OPTEE header parse error.\n");
284 		}
285 #endif
286 		bl_mem_params->ep_info.spsr = arm_get_spsr_for_bl32_entry();
287 		break;
288 #endif
289 
290 	case BL33_IMAGE_ID:
291 		/* BL33 expects to receive the primary CPU MPID (through r0) */
292 		bl_mem_params->ep_info.args.arg0 = 0xffff & read_mpidr();
293 		bl_mem_params->ep_info.spsr = arm_get_spsr_for_bl33_entry();
294 		break;
295 
296 #ifdef SCP_BL2_BASE
297 	case SCP_BL2_IMAGE_ID:
298 		/* The subsequent handling of SCP_BL2 is platform specific */
299 		err = plat_arm_bl2_handle_scp_bl2(&bl_mem_params->image_info);
300 		if (err) {
301 			WARN("Failure in platform-specific handling of SCP_BL2 image.\n");
302 		}
303 		break;
304 #endif
305 	default:
306 		/* Do nothing in default case */
307 		break;
308 	}
309 
310 	return err;
311 }
312 
313 /*******************************************************************************
314  * This function can be used by the platforms to update/use image
315  * information for given `image_id`.
316  ******************************************************************************/
317 int bl2_plat_handle_post_image_load(unsigned int image_id)
318 {
319 	return arm_bl2_handle_post_image_load(image_id);
320 }
321 
322 #else /* LOAD_IMAGE_V2 */
323 
324 /*******************************************************************************
325  * Populate the extents of memory available for loading SCP_BL2 (if used),
326  * i.e. anywhere in trusted RAM as long as it doesn't overwrite BL2.
327  ******************************************************************************/
328 void bl2_plat_get_scp_bl2_meminfo(meminfo_t *scp_bl2_meminfo)
329 {
330 	*scp_bl2_meminfo = bl2_tzram_layout;
331 }
332 
333 /*******************************************************************************
334  * Before calling this function BL31 is loaded in memory and its entrypoint
335  * is set by load_image. This is a placeholder for the platform to change
336  * the entrypoint of BL31 and set SPSR and security state.
337  * On ARM standard platforms we only set the security state of the entrypoint
338  ******************************************************************************/
339 void bl2_plat_set_bl31_ep_info(image_info_t *bl31_image_info,
340 					entry_point_info_t *bl31_ep_info)
341 {
342 	SET_SECURITY_STATE(bl31_ep_info->h.attr, SECURE);
343 	bl31_ep_info->spsr = SPSR_64(MODE_EL3, MODE_SP_ELX,
344 					DISABLE_ALL_EXCEPTIONS);
345 }
346 
347 
348 /*******************************************************************************
349  * Before calling this function BL32 is loaded in memory and its entrypoint
350  * is set by load_image. This is a placeholder for the platform to change
351  * the entrypoint of BL32 and set SPSR and security state.
352  * On ARM standard platforms we only set the security state of the entrypoint
353  ******************************************************************************/
354 #ifdef BL32_BASE
355 void bl2_plat_set_bl32_ep_info(image_info_t *bl32_image_info,
356 					entry_point_info_t *bl32_ep_info)
357 {
358 	SET_SECURITY_STATE(bl32_ep_info->h.attr, SECURE);
359 	bl32_ep_info->spsr = arm_get_spsr_for_bl32_entry();
360 }
361 
362 /*******************************************************************************
363  * Populate the extents of memory available for loading BL32
364  ******************************************************************************/
365 void bl2_plat_get_bl32_meminfo(meminfo_t *bl32_meminfo)
366 {
367 	/*
368 	 * Populate the extents of memory available for loading BL32.
369 	 */
370 	bl32_meminfo->total_base = BL32_BASE;
371 	bl32_meminfo->free_base = BL32_BASE;
372 	bl32_meminfo->total_size =
373 			(TSP_SEC_MEM_BASE + TSP_SEC_MEM_SIZE) - BL32_BASE;
374 	bl32_meminfo->free_size =
375 			(TSP_SEC_MEM_BASE + TSP_SEC_MEM_SIZE) - BL32_BASE;
376 }
377 #endif /* BL32_BASE */
378 
379 /*******************************************************************************
380  * Before calling this function BL33 is loaded in memory and its entrypoint
381  * is set by load_image. This is a placeholder for the platform to change
382  * the entrypoint of BL33 and set SPSR and security state.
383  * On ARM standard platforms we only set the security state of the entrypoint
384  ******************************************************************************/
385 void bl2_plat_set_bl33_ep_info(image_info_t *image,
386 					entry_point_info_t *bl33_ep_info)
387 {
388 	SET_SECURITY_STATE(bl33_ep_info->h.attr, NON_SECURE);
389 	bl33_ep_info->spsr = arm_get_spsr_for_bl33_entry();
390 }
391 
392 /*******************************************************************************
393  * Populate the extents of memory available for loading BL33
394  ******************************************************************************/
395 void bl2_plat_get_bl33_meminfo(meminfo_t *bl33_meminfo)
396 {
397 	bl33_meminfo->total_base = ARM_NS_DRAM1_BASE;
398 	bl33_meminfo->total_size = ARM_NS_DRAM1_SIZE;
399 	bl33_meminfo->free_base = ARM_NS_DRAM1_BASE;
400 	bl33_meminfo->free_size = ARM_NS_DRAM1_SIZE;
401 }
402 
403 #endif /* LOAD_IMAGE_V2 */
404