xref: /rk3399_ARM-atf/bl2/bl2_main.c (revision 9d93fc2f89a00e104bfe6be31f87861c26ba2bf0)
1 /*
2  * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <arch_helpers.h>
8 #include <bl1/bl1.h>
9 #include <bl2/bl2.h>
10 #include <common/bl_common.h>
11 #include <common/debug.h>
12 #include <drivers/auth/auth_mod.h>
13 #include <drivers/console.h>
14 #include <plat/common/platform.h>
15 
16 #include "bl2_private.h"
17 
18 #ifdef AARCH32
19 #define NEXT_IMAGE	"BL32"
20 #else
21 #define NEXT_IMAGE	"BL31"
22 #endif
23 
24 /*******************************************************************************
25  * Setup function for BL2.
26  ******************************************************************************/
27 void bl2_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2,
28 	       u_register_t arg3)
29 {
30 	/* Perform early platform-specific setup */
31 	bl2_early_platform_setup2(arg0, arg1, arg2, arg3);
32 
33 #ifdef AARCH64
34 	/*
35 	 * Update pointer authentication key before the MMU is enabled. It is
36 	 * saved in the rodata section, that can be writen before enabling the
37 	 * MMU. This function must be called after the console is initialized
38 	 * in the early platform setup.
39 	 */
40 	bl_handle_pauth();
41 #endif /* AARCH64 */
42 
43 	/* Perform late platform-specific setup */
44 	bl2_plat_arch_setup();
45 }
46 
47 /*******************************************************************************
48  * The only thing to do in BL2 is to load further images and pass control to
49  * next BL. The memory occupied by BL2 will be reclaimed by BL3x stages. BL2
50  * runs entirely in S-EL1.
51  ******************************************************************************/
52 void bl2_main(void)
53 {
54 	entry_point_info_t *next_bl_ep_info;
55 
56 	NOTICE("BL2: %s\n", version_string);
57 	NOTICE("BL2: %s\n", build_message);
58 
59 	/* Perform remaining generic architectural setup in S-EL1 */
60 	bl2_arch_setup();
61 
62 #if TRUSTED_BOARD_BOOT
63 	/* Initialize authentication module */
64 	auth_mod_init();
65 #endif /* TRUSTED_BOARD_BOOT */
66 
67 	/* initialize boot source */
68 	bl2_plat_preload_setup();
69 
70 	/* Load the subsequent bootloader images. */
71 	next_bl_ep_info = bl2_load_images();
72 
73 #if !BL2_AT_EL3
74 #ifdef AARCH32
75 	/*
76 	 * For AArch32 state BL1 and BL2 share the MMU setup.
77 	 * Given that BL2 does not map BL1 regions, MMU needs
78 	 * to be disabled in order to go back to BL1.
79 	 */
80 	disable_mmu_icache_secure();
81 #endif /* AARCH32 */
82 
83 	console_flush();
84 
85 	/*
86 	 * Run next BL image via an SMC to BL1. Information on how to pass
87 	 * control to the BL32 (if present) and BL33 software images will
88 	 * be passed to next BL image as an argument.
89 	 */
90 	smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0);
91 #else
92 	NOTICE("BL2: Booting " NEXT_IMAGE "\n");
93 	print_entry_point_info(next_bl_ep_info);
94 	console_flush();
95 
96 	bl2_run_next_image(next_bl_ep_info);
97 #endif
98 }
99