xref: /rk3399_ARM-atf/bl2/bl2_main.c (revision ed108b56051de5da8024568a06781ce287e86c78)
14f6ad66aSAchin Gupta /*
29d93fc2fSAntonio Nino Diaz  * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
34f6ad66aSAchin Gupta  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
54f6ad66aSAchin Gupta  */
64f6ad66aSAchin Gupta 
7*ed108b56SAlexei Fedorov #include <assert.h>
8*ed108b56SAlexei Fedorov 
94f6ad66aSAchin Gupta #include <arch_helpers.h>
10*ed108b56SAlexei Fedorov #include <arch_features.h>
1109d40e0eSAntonio Nino Diaz #include <bl1/bl1.h>
1209d40e0eSAntonio Nino Diaz #include <bl2/bl2.h>
1309d40e0eSAntonio Nino Diaz #include <common/bl_common.h>
1409d40e0eSAntonio Nino Diaz #include <common/debug.h>
1509d40e0eSAntonio Nino Diaz #include <drivers/auth/auth_mod.h>
1609d40e0eSAntonio Nino Diaz #include <drivers/console.h>
17*ed108b56SAlexei Fedorov #include <lib/extensions/pauth.h>
1809d40e0eSAntonio Nino Diaz #include <plat/common/platform.h>
1909d40e0eSAntonio Nino Diaz 
205b827a8fSDan Handley #include "bl2_private.h"
214f6ad66aSAchin Gupta 
22402b3cf8SJulius Werner #ifdef __aarch64__
23b1d27b48SRoberto Vargas #define NEXT_IMAGE	"BL31"
24402b3cf8SJulius Werner #else
25402b3cf8SJulius Werner #define NEXT_IMAGE	"BL32"
26b1d27b48SRoberto Vargas #endif
2793d81d64SSandrine Bailleux 
28dcbfa11bSAntonio Nino Diaz #if !BL2_AT_EL3
2993d81d64SSandrine Bailleux /*******************************************************************************
309d93fc2fSAntonio Nino Diaz  * Setup function for BL2.
319d93fc2fSAntonio Nino Diaz  ******************************************************************************/
329d93fc2fSAntonio Nino Diaz void bl2_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2,
339d93fc2fSAntonio Nino Diaz 	       u_register_t arg3)
349d93fc2fSAntonio Nino Diaz {
359d93fc2fSAntonio Nino Diaz 	/* Perform early platform-specific setup */
369d93fc2fSAntonio Nino Diaz 	bl2_early_platform_setup2(arg0, arg1, arg2, arg3);
379d93fc2fSAntonio Nino Diaz 
389d93fc2fSAntonio Nino Diaz 	/* Perform late platform-specific setup */
399d93fc2fSAntonio Nino Diaz 	bl2_plat_arch_setup();
40*ed108b56SAlexei Fedorov 
41*ed108b56SAlexei Fedorov #if CTX_INCLUDE_PAUTH_REGS
42*ed108b56SAlexei Fedorov 	/*
43*ed108b56SAlexei Fedorov 	 * Assert that the ARMv8.3-PAuth registers are present or an access
44*ed108b56SAlexei Fedorov 	 * fault will be triggered when they are being saved or restored.
45*ed108b56SAlexei Fedorov 	 */
46*ed108b56SAlexei Fedorov 	assert(is_armv8_3_pauth_present());
47*ed108b56SAlexei Fedorov #endif /* CTX_INCLUDE_PAUTH_REGS */
489d93fc2fSAntonio Nino Diaz }
499d93fc2fSAntonio Nino Diaz 
50dcbfa11bSAntonio Nino Diaz #else /* if BL2_AT_EL3 */
51dcbfa11bSAntonio Nino Diaz /*******************************************************************************
52dcbfa11bSAntonio Nino Diaz  * Setup function for BL2 when BL2_AT_EL3=1.
53dcbfa11bSAntonio Nino Diaz  ******************************************************************************/
54dcbfa11bSAntonio Nino Diaz void bl2_el3_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2,
55dcbfa11bSAntonio Nino Diaz 		   u_register_t arg3)
56dcbfa11bSAntonio Nino Diaz {
57dcbfa11bSAntonio Nino Diaz 	/* Perform early platform-specific setup */
58dcbfa11bSAntonio Nino Diaz 	bl2_el3_early_platform_setup(arg0, arg1, arg2, arg3);
59dcbfa11bSAntonio Nino Diaz 
60dcbfa11bSAntonio Nino Diaz 	/* Perform late platform-specific setup */
61dcbfa11bSAntonio Nino Diaz 	bl2_el3_plat_arch_setup();
62*ed108b56SAlexei Fedorov 
63*ed108b56SAlexei Fedorov #if CTX_INCLUDE_PAUTH_REGS
64*ed108b56SAlexei Fedorov 	/*
65*ed108b56SAlexei Fedorov 	 * Assert that the ARMv8.3-PAuth registers are present or an access
66*ed108b56SAlexei Fedorov 	 * fault will be triggered when they are being saved or restored.
67*ed108b56SAlexei Fedorov 	 */
68*ed108b56SAlexei Fedorov 	assert(is_armv8_3_pauth_present());
69*ed108b56SAlexei Fedorov #endif /* CTX_INCLUDE_PAUTH_REGS */
70dcbfa11bSAntonio Nino Diaz }
71dcbfa11bSAntonio Nino Diaz #endif /* BL2_AT_EL3 */
72dcbfa11bSAntonio Nino Diaz 
739d93fc2fSAntonio Nino Diaz /*******************************************************************************
7493d81d64SSandrine Bailleux  * The only thing to do in BL2 is to load further images and pass control to
7542019bf4SYatharth Kochar  * next BL. The memory occupied by BL2 will be reclaimed by BL3x stages. BL2
7642019bf4SYatharth Kochar  * runs entirely in S-EL1.
7793d81d64SSandrine Bailleux  ******************************************************************************/
7893d81d64SSandrine Bailleux void bl2_main(void)
7993d81d64SSandrine Bailleux {
8042019bf4SYatharth Kochar 	entry_point_info_t *next_bl_ep_info;
8193d81d64SSandrine Bailleux 
826ad2e461SDan Handley 	NOTICE("BL2: %s\n", version_string);
836ad2e461SDan Handley 	NOTICE("BL2: %s\n", build_message);
846ad2e461SDan Handley 
8593d81d64SSandrine Bailleux 	/* Perform remaining generic architectural setup in S-EL1 */
8693d81d64SSandrine Bailleux 	bl2_arch_setup();
8793d81d64SSandrine Bailleux 
88dec840afSJuan Castillo #if TRUSTED_BOARD_BOOT
89dec840afSJuan Castillo 	/* Initialize authentication module */
901779ba6bSJuan Castillo 	auth_mod_init();
91dec840afSJuan Castillo #endif /* TRUSTED_BOARD_BOOT */
92dec840afSJuan Castillo 
9301f62b6dSRoberto Vargas 	/* initialize boot source */
9401f62b6dSRoberto Vargas 	bl2_plat_preload_setup();
9501f62b6dSRoberto Vargas 
9642019bf4SYatharth Kochar 	/* Load the subsequent bootloader images. */
9742019bf4SYatharth Kochar 	next_bl_ep_info = bl2_load_images();
98ef538c6fSJuan Castillo 
9901a1f7c2SYann Gautier #if !BL2_AT_EL3
100402b3cf8SJulius Werner #ifndef __aarch64__
101d48c12e9SYatharth Kochar 	/*
102d48c12e9SYatharth Kochar 	 * For AArch32 state BL1 and BL2 share the MMU setup.
103d48c12e9SYatharth Kochar 	 * Given that BL2 does not map BL1 regions, MMU needs
104d48c12e9SYatharth Kochar 	 * to be disabled in order to go back to BL1.
105d48c12e9SYatharth Kochar 	 */
106d48c12e9SYatharth Kochar 	disable_mmu_icache_secure();
107402b3cf8SJulius Werner #endif /* !__aarch64__ */
108d48c12e9SYatharth Kochar 
1090b32628eSAntonio Nino Diaz 	console_flush();
1100b32628eSAntonio Nino Diaz 
111*ed108b56SAlexei Fedorov #if ENABLE_PAUTH
112*ed108b56SAlexei Fedorov 	/*
113*ed108b56SAlexei Fedorov 	 * Disable pointer authentication before running next boot image
114*ed108b56SAlexei Fedorov 	 */
115*ed108b56SAlexei Fedorov 	pauth_disable_el1();
116*ed108b56SAlexei Fedorov #endif /* ENABLE_PAUTH */
117*ed108b56SAlexei Fedorov 
11893d81d64SSandrine Bailleux 	/*
11942019bf4SYatharth Kochar 	 * Run next BL image via an SMC to BL1. Information on how to pass
12042019bf4SYatharth Kochar 	 * control to the BL32 (if present) and BL33 software images will
12142019bf4SYatharth Kochar 	 * be passed to next BL image as an argument.
12293d81d64SSandrine Bailleux 	 */
12342019bf4SYatharth Kochar 	smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0);
124dcbfa11bSAntonio Nino Diaz #else /* if BL2_AT_EL3 */
125b1d27b48SRoberto Vargas 	NOTICE("BL2: Booting " NEXT_IMAGE "\n");
126b1d27b48SRoberto Vargas 	print_entry_point_info(next_bl_ep_info);
127b1d27b48SRoberto Vargas 	console_flush();
128b1d27b48SRoberto Vargas 
129*ed108b56SAlexei Fedorov #if ENABLE_PAUTH
130*ed108b56SAlexei Fedorov 	/*
131*ed108b56SAlexei Fedorov 	 * Disable pointer authentication before running next boot image
132*ed108b56SAlexei Fedorov 	 */
133*ed108b56SAlexei Fedorov 	pauth_disable_el3();
134*ed108b56SAlexei Fedorov #endif /* ENABLE_PAUTH */
135*ed108b56SAlexei Fedorov 
136b1d27b48SRoberto Vargas 	bl2_run_next_image(next_bl_ep_info);
137dcbfa11bSAntonio Nino Diaz #endif /* BL2_AT_EL3 */
1384f6ad66aSAchin Gupta }
139