xref: /rk3399_ARM-atf/bl2/bl2_main.c (revision ae770fedf459d5643125d29f48659e3e936ebd2d)
14f6ad66aSAchin Gupta /*
2*ae770fedSYann Gautier  * Copyright (c) 2013-2024, Arm Limited and Contributors. All rights reserved.
34f6ad66aSAchin Gupta  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
54f6ad66aSAchin Gupta  */
64f6ad66aSAchin Gupta 
7ed108b56SAlexei Fedorov #include <assert.h>
8ed108b56SAlexei Fedorov 
94f6ad66aSAchin Gupta #include <arch_helpers.h>
10ed108b56SAlexei 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>
160aa0b3afSManish V Badarkhe #include <drivers/auth/crypto_mod.h>
1709d40e0eSAntonio Nino Diaz #include <drivers/console.h>
18396b339dSManish V Badarkhe #include <drivers/fwu/fwu.h>
19ed8f06ddSthagon01-arm #include <lib/bootmarker_capture.h>
20ed108b56SAlexei Fedorov #include <lib/extensions/pauth.h>
21ed8f06ddSthagon01-arm #include <lib/pmf/pmf.h>
2209d40e0eSAntonio Nino Diaz #include <plat/common/platform.h>
2309d40e0eSAntonio Nino Diaz 
245b827a8fSDan Handley #include "bl2_private.h"
254f6ad66aSAchin Gupta 
26402b3cf8SJulius Werner #ifdef __aarch64__
27b1d27b48SRoberto Vargas #define NEXT_IMAGE	"BL31"
28402b3cf8SJulius Werner #else
29402b3cf8SJulius Werner #define NEXT_IMAGE	"BL32"
30b1d27b48SRoberto Vargas #endif
3193d81d64SSandrine Bailleux 
32ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION
33ed8f06ddSthagon01-arm 	PMF_REGISTER_SERVICE(bl_svc, PMF_RT_INSTR_SVC_ID,
34ed8f06ddSthagon01-arm 		BL_TOTAL_IDS, PMF_DUMP_ENABLE);
35ed8f06ddSthagon01-arm #endif
36ed8f06ddSthagon01-arm 
3742d4d3baSArvind Ram Prakash #if RESET_TO_BL2
3893d81d64SSandrine Bailleux /*******************************************************************************
3942d4d3baSArvind Ram Prakash  * Setup function for BL2 when RESET_TO_BL2=1
40dcbfa11bSAntonio Nino Diaz  ******************************************************************************/
41dcbfa11bSAntonio Nino Diaz void bl2_el3_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2,
42dcbfa11bSAntonio Nino Diaz 		   u_register_t arg3)
43dcbfa11bSAntonio Nino Diaz {
44*ae770fedSYann Gautier 	/* Enable early console if EARLY_CONSOLE flag is enabled */
45*ae770fedSYann Gautier 	plat_setup_early_console();
46*ae770fedSYann Gautier 
47dcbfa11bSAntonio Nino Diaz 	/* Perform early platform-specific setup */
48dcbfa11bSAntonio Nino Diaz 	bl2_el3_early_platform_setup(arg0, arg1, arg2, arg3);
49dcbfa11bSAntonio Nino Diaz 
50dcbfa11bSAntonio Nino Diaz 	/* Perform late platform-specific setup */
51dcbfa11bSAntonio Nino Diaz 	bl2_el3_plat_arch_setup();
52ed108b56SAlexei Fedorov 
53ed108b56SAlexei Fedorov #if CTX_INCLUDE_PAUTH_REGS
54ed108b56SAlexei Fedorov 	/*
55ed108b56SAlexei Fedorov 	 * Assert that the ARMv8.3-PAuth registers are present or an access
56ed108b56SAlexei Fedorov 	 * fault will be triggered when they are being saved or restored.
57ed108b56SAlexei Fedorov 	 */
58ed108b56SAlexei Fedorov 	assert(is_armv8_3_pauth_present());
59ed108b56SAlexei Fedorov #endif /* CTX_INCLUDE_PAUTH_REGS */
60dcbfa11bSAntonio Nino Diaz }
6142d4d3baSArvind Ram Prakash #else /* RESET_TO_BL2 */
6242d4d3baSArvind Ram Prakash 
636c09af9fSZelalem Aweke /*******************************************************************************
6442d4d3baSArvind Ram Prakash  * Setup function for BL2 when RESET_TO_BL2=0
656c09af9fSZelalem Aweke  ******************************************************************************/
666c09af9fSZelalem Aweke void bl2_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2,
676c09af9fSZelalem Aweke 	       u_register_t arg3)
686c09af9fSZelalem Aweke {
69*ae770fedSYann Gautier 	/* Enable early console if EARLY_CONSOLE flag is enabled */
70*ae770fedSYann Gautier 	plat_setup_early_console();
71*ae770fedSYann Gautier 
726c09af9fSZelalem Aweke 	/* Perform early platform-specific setup */
736c09af9fSZelalem Aweke 	bl2_early_platform_setup2(arg0, arg1, arg2, arg3);
746c09af9fSZelalem Aweke 
756c09af9fSZelalem Aweke 	/* Perform late platform-specific setup */
766c09af9fSZelalem Aweke 	bl2_plat_arch_setup();
776c09af9fSZelalem Aweke 
786c09af9fSZelalem Aweke #if CTX_INCLUDE_PAUTH_REGS
796c09af9fSZelalem Aweke 	/*
806c09af9fSZelalem Aweke 	 * Assert that the ARMv8.3-PAuth registers are present or an access
816c09af9fSZelalem Aweke 	 * fault will be triggered when they are being saved or restored.
826c09af9fSZelalem Aweke 	 */
836c09af9fSZelalem Aweke 	assert(is_armv8_3_pauth_present());
846c09af9fSZelalem Aweke #endif /* CTX_INCLUDE_PAUTH_REGS */
856c09af9fSZelalem Aweke }
8642d4d3baSArvind Ram Prakash #endif /* RESET_TO_BL2 */
87dcbfa11bSAntonio Nino Diaz 
889d93fc2fSAntonio Nino Diaz /*******************************************************************************
8993d81d64SSandrine Bailleux  * The only thing to do in BL2 is to load further images and pass control to
9042019bf4SYatharth Kochar  * next BL. The memory occupied by BL2 will be reclaimed by BL3x stages. BL2
9142019bf4SYatharth Kochar  * runs entirely in S-EL1.
9293d81d64SSandrine Bailleux  ******************************************************************************/
9393d81d64SSandrine Bailleux void bl2_main(void)
9493d81d64SSandrine Bailleux {
9542019bf4SYatharth Kochar 	entry_point_info_t *next_bl_ep_info;
9693d81d64SSandrine Bailleux 
97ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION
98ed8f06ddSthagon01-arm 	PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_ENTRY, PMF_CACHE_MAINT);
99ed8f06ddSthagon01-arm #endif
100ed8f06ddSthagon01-arm 
1016ad2e461SDan Handley 	NOTICE("BL2: %s\n", version_string);
1026ad2e461SDan Handley 	NOTICE("BL2: %s\n", build_message);
1036ad2e461SDan Handley 
10493d81d64SSandrine Bailleux 	/* Perform remaining generic architectural setup in S-EL1 */
10593d81d64SSandrine Bailleux 	bl2_arch_setup();
10693d81d64SSandrine Bailleux 
107396b339dSManish V Badarkhe #if PSA_FWU_SUPPORT
108396b339dSManish V Badarkhe 	fwu_init();
109396b339dSManish V Badarkhe #endif /* PSA_FWU_SUPPORT */
110396b339dSManish V Badarkhe 
1110aa0b3afSManish V Badarkhe 	crypto_mod_init();
1120aa0b3afSManish V Badarkhe 
113dec840afSJuan Castillo 	/* Initialize authentication module */
1141779ba6bSJuan Castillo 	auth_mod_init();
115dec840afSJuan Castillo 
11647bf3ac3SManish V Badarkhe 	/* Initialize the Measured Boot backend */
11747bf3ac3SManish V Badarkhe 	bl2_plat_mboot_init();
11847bf3ac3SManish V Badarkhe 
1193f498b0dSAlexei Fedorov 	/* Initialize boot source */
12001f62b6dSRoberto Vargas 	bl2_plat_preload_setup();
12101f62b6dSRoberto Vargas 
12242019bf4SYatharth Kochar 	/* Load the subsequent bootloader images. */
12342019bf4SYatharth Kochar 	next_bl_ep_info = bl2_load_images();
124ef538c6fSJuan Castillo 
12547bf3ac3SManish V Badarkhe 	/* Teardown the Measured Boot backend */
12647bf3ac3SManish V Badarkhe 	bl2_plat_mboot_finish();
1273f498b0dSAlexei Fedorov 
12842d4d3baSArvind Ram Prakash #if !BL2_RUNS_AT_EL3
129402b3cf8SJulius Werner #ifndef __aarch64__
130d48c12e9SYatharth Kochar 	/*
131d48c12e9SYatharth Kochar 	 * For AArch32 state BL1 and BL2 share the MMU setup.
132d48c12e9SYatharth Kochar 	 * Given that BL2 does not map BL1 regions, MMU needs
133d48c12e9SYatharth Kochar 	 * to be disabled in order to go back to BL1.
134d48c12e9SYatharth Kochar 	 */
135d48c12e9SYatharth Kochar 	disable_mmu_icache_secure();
136402b3cf8SJulius Werner #endif /* !__aarch64__ */
137d48c12e9SYatharth Kochar 
138ed108b56SAlexei Fedorov #if ENABLE_PAUTH
139ed108b56SAlexei Fedorov 	/*
140ed108b56SAlexei Fedorov 	 * Disable pointer authentication before running next boot image
141ed108b56SAlexei Fedorov 	 */
142ed108b56SAlexei Fedorov 	pauth_disable_el1();
143ed108b56SAlexei Fedorov #endif /* ENABLE_PAUTH */
144ed108b56SAlexei Fedorov 
145ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION
146ed8f06ddSthagon01-arm 	PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_EXIT, PMF_CACHE_MAINT);
147ed8f06ddSthagon01-arm #endif
148ed8f06ddSthagon01-arm 
149ed8f06ddSthagon01-arm 	console_flush();
150ed8f06ddSthagon01-arm 
15193d81d64SSandrine Bailleux 	/*
15242019bf4SYatharth Kochar 	 * Run next BL image via an SMC to BL1. Information on how to pass
15342019bf4SYatharth Kochar 	 * control to the BL32 (if present) and BL33 software images will
15442019bf4SYatharth Kochar 	 * be passed to next BL image as an argument.
15593d81d64SSandrine Bailleux 	 */
15642019bf4SYatharth Kochar 	smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0);
15742d4d3baSArvind Ram Prakash #else /* if BL2_RUNS_AT_EL3 */
15842d4d3baSArvind Ram Prakash 
159b1d27b48SRoberto Vargas 	NOTICE("BL2: Booting " NEXT_IMAGE "\n");
160b1d27b48SRoberto Vargas 	print_entry_point_info(next_bl_ep_info);
161ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION
162ed8f06ddSthagon01-arm 	PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_EXIT, PMF_CACHE_MAINT);
163ed8f06ddSthagon01-arm #endif
164b1d27b48SRoberto Vargas 	console_flush();
165b1d27b48SRoberto Vargas 
166ed108b56SAlexei Fedorov #if ENABLE_PAUTH
167ed108b56SAlexei Fedorov 	/*
168ed108b56SAlexei Fedorov 	 * Disable pointer authentication before running next boot image
169ed108b56SAlexei Fedorov 	 */
170ed108b56SAlexei Fedorov 	pauth_disable_el3();
171ed108b56SAlexei Fedorov #endif /* ENABLE_PAUTH */
172ed108b56SAlexei Fedorov 
173b1d27b48SRoberto Vargas 	bl2_run_next_image(next_bl_ep_info);
17442d4d3baSArvind Ram Prakash #endif /* BL2_RUNS_AT_EL3 */
1754f6ad66aSAchin Gupta }
176