xref: /rk3399_ARM-atf/bl2/bl2_main.c (revision 3f8cf8a168f137b9f4f17e7ff89b5d6b2b100cf1)
14f6ad66aSAchin Gupta /*
2ec7c29abSBoyan Karatotev  * Copyright (c) 2013-2025, 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>
14758ccb80SChris Kay #include <common/build_message.h>
1509d40e0eSAntonio Nino Diaz #include <common/debug.h>
1609d40e0eSAntonio Nino Diaz #include <drivers/auth/auth_mod.h>
170aa0b3afSManish V Badarkhe #include <drivers/auth/crypto_mod.h>
1809d40e0eSAntonio Nino Diaz #include <drivers/console.h>
19396b339dSManish V Badarkhe #include <drivers/fwu/fwu.h>
20ed8f06ddSthagon01-arm #include <lib/bootmarker_capture.h>
21ed108b56SAlexei Fedorov #include <lib/extensions/pauth.h>
22ed8f06ddSthagon01-arm #include <lib/pmf/pmf.h>
2309d40e0eSAntonio Nino Diaz #include <plat/common/platform.h>
2409d40e0eSAntonio Nino Diaz 
255b827a8fSDan Handley #include "bl2_private.h"
264f6ad66aSAchin Gupta 
27402b3cf8SJulius Werner #ifdef __aarch64__
28b1d27b48SRoberto Vargas #define NEXT_IMAGE	"BL31"
29402b3cf8SJulius Werner #else
30402b3cf8SJulius Werner #define NEXT_IMAGE	"BL32"
31b1d27b48SRoberto Vargas #endif
3293d81d64SSandrine Bailleux 
33ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION
34ed8f06ddSthagon01-arm 	PMF_REGISTER_SERVICE(bl_svc, PMF_RT_INSTR_SVC_ID,
35ed8f06ddSthagon01-arm 		BL_TOTAL_IDS, PMF_DUMP_ENABLE);
36ed8f06ddSthagon01-arm #endif
37ed8f06ddSthagon01-arm 
3893d81d64SSandrine Bailleux /*******************************************************************************
39d158d425SBoyan Karatotev  * The only thing to do in BL2 is to load further images and pass control to
40d158d425SBoyan Karatotev  * next BL. The memory occupied by BL2 will be reclaimed by BL3x stages.
41dcbfa11bSAntonio Nino Diaz  ******************************************************************************/
42d158d425SBoyan Karatotev void __no_pauth bl2_main(u_register_t arg0, u_register_t arg1, u_register_t arg2,
43dcbfa11bSAntonio Nino Diaz 	       u_register_t arg3)
44dcbfa11bSAntonio Nino Diaz {
45d158d425SBoyan Karatotev 	entry_point_info_t *next_bl_ep_info;
46d158d425SBoyan Karatotev 
47ae770fedSYann Gautier 	/* Enable early console if EARLY_CONSOLE flag is enabled */
48ae770fedSYann Gautier 	plat_setup_early_console();
49d158d425SBoyan Karatotev #if RESET_TO_BL2
50ae770fedSYann Gautier 
51dcbfa11bSAntonio Nino Diaz 	/* Perform early platform-specific setup */
52dcbfa11bSAntonio Nino Diaz 	bl2_el3_early_platform_setup(arg0, arg1, arg2, arg3);
53dcbfa11bSAntonio Nino Diaz 
54dcbfa11bSAntonio Nino Diaz 	/* Perform late platform-specific setup */
55dcbfa11bSAntonio Nino Diaz 	bl2_el3_plat_arch_setup();
5642d4d3baSArvind Ram Prakash #else /* RESET_TO_BL2 */
576c09af9fSZelalem Aweke 	/* Perform early platform-specific setup */
586c09af9fSZelalem Aweke 	bl2_early_platform_setup2(arg0, arg1, arg2, arg3);
596c09af9fSZelalem Aweke 
60*3f8cf8a1SXialin Liu 	/* Perform remaining generic architectural setup in S-EL1 */
61*3f8cf8a1SXialin Liu 	bl2_arch_setup();
62*3f8cf8a1SXialin Liu 
636c09af9fSZelalem Aweke 	/* Perform late platform-specific setup */
646c09af9fSZelalem Aweke 	bl2_plat_arch_setup();
6542d4d3baSArvind Ram Prakash #endif /* RESET_TO_BL2 */
66dcbfa11bSAntonio Nino Diaz 
67d158d425SBoyan Karatotev 	if (is_feat_pauth_supported()) {
68d158d425SBoyan Karatotev #if BL2_RUNS_AT_EL3
69d158d425SBoyan Karatotev 		pauth_init_enable_el3();
70d158d425SBoyan Karatotev #else
71d158d425SBoyan Karatotev 		pauth_init_enable_el1();
72d158d425SBoyan Karatotev #endif
73d158d425SBoyan Karatotev 	}
7493d81d64SSandrine Bailleux 
75ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION
76ed8f06ddSthagon01-arm 	PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_ENTRY, PMF_CACHE_MAINT);
77ed8f06ddSthagon01-arm #endif
78ed8f06ddSthagon01-arm 
79758ccb80SChris Kay 	NOTICE("BL2: %s\n", build_version_string);
806ad2e461SDan Handley 	NOTICE("BL2: %s\n", build_message);
816ad2e461SDan Handley 
82396b339dSManish V Badarkhe #if PSA_FWU_SUPPORT
83396b339dSManish V Badarkhe 	fwu_init();
84396b339dSManish V Badarkhe #endif /* PSA_FWU_SUPPORT */
85396b339dSManish V Badarkhe 
860aa0b3afSManish V Badarkhe 	crypto_mod_init();
870aa0b3afSManish V Badarkhe 
88dec840afSJuan Castillo 	/* Initialize authentication module */
891779ba6bSJuan Castillo 	auth_mod_init();
90dec840afSJuan Castillo 
9147bf3ac3SManish V Badarkhe 	/* Initialize the Measured Boot backend */
9247bf3ac3SManish V Badarkhe 	bl2_plat_mboot_init();
9347bf3ac3SManish V Badarkhe 
943f498b0dSAlexei Fedorov 	/* Initialize boot source */
9501f62b6dSRoberto Vargas 	bl2_plat_preload_setup();
9601f62b6dSRoberto Vargas 
9742019bf4SYatharth Kochar 	/* Load the subsequent bootloader images. */
9842019bf4SYatharth Kochar 	next_bl_ep_info = bl2_load_images();
99ef538c6fSJuan Castillo 
10047bf3ac3SManish V Badarkhe 	/* Teardown the Measured Boot backend */
10147bf3ac3SManish V Badarkhe 	bl2_plat_mboot_finish();
1023f498b0dSAlexei Fedorov 
103055c97afSLauren Wehrmeister 	crypto_mod_finish();
104055c97afSLauren Wehrmeister 
10542d4d3baSArvind Ram Prakash #if !BL2_RUNS_AT_EL3
106402b3cf8SJulius Werner #ifndef __aarch64__
107d48c12e9SYatharth Kochar 	/*
108d48c12e9SYatharth Kochar 	 * For AArch32 state BL1 and BL2 share the MMU setup.
109d48c12e9SYatharth Kochar 	 * Given that BL2 does not map BL1 regions, MMU needs
110d48c12e9SYatharth Kochar 	 * to be disabled in order to go back to BL1.
111d48c12e9SYatharth Kochar 	 */
112d48c12e9SYatharth Kochar 	disable_mmu_icache_secure();
113402b3cf8SJulius Werner #endif /* !__aarch64__ */
114d48c12e9SYatharth Kochar 
115ed108b56SAlexei Fedorov 	/*
116ed108b56SAlexei Fedorov 	 * Disable pointer authentication before running next boot image
117ed108b56SAlexei Fedorov 	 */
1188d9f5f25SBoyan Karatotev 	if (is_feat_pauth_supported()) {
119ed108b56SAlexei Fedorov 		pauth_disable_el1();
1208d9f5f25SBoyan Karatotev 	}
121ed108b56SAlexei Fedorov 
122ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION
123ed8f06ddSthagon01-arm 	PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_EXIT, PMF_CACHE_MAINT);
124ed8f06ddSthagon01-arm #endif
125ed8f06ddSthagon01-arm 
126ed8f06ddSthagon01-arm 	console_flush();
127ed8f06ddSthagon01-arm 
12893d81d64SSandrine Bailleux 	/*
12942019bf4SYatharth Kochar 	 * Run next BL image via an SMC to BL1. Information on how to pass
13042019bf4SYatharth Kochar 	 * control to the BL32 (if present) and BL33 software images will
13142019bf4SYatharth Kochar 	 * be passed to next BL image as an argument.
13293d81d64SSandrine Bailleux 	 */
13342019bf4SYatharth Kochar 	smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0);
13442d4d3baSArvind Ram Prakash #else /* if BL2_RUNS_AT_EL3 */
13542d4d3baSArvind Ram Prakash 
136b1d27b48SRoberto Vargas 	NOTICE("BL2: Booting " NEXT_IMAGE "\n");
137b1d27b48SRoberto Vargas 	print_entry_point_info(next_bl_ep_info);
138ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION
139ed8f06ddSthagon01-arm 	PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_EXIT, PMF_CACHE_MAINT);
140ed8f06ddSthagon01-arm #endif
141b1d27b48SRoberto Vargas 	console_flush();
142b1d27b48SRoberto Vargas 
143ed108b56SAlexei Fedorov 	/*
144ed108b56SAlexei Fedorov 	 * Disable pointer authentication before running next boot image
145ed108b56SAlexei Fedorov 	 */
1468d9f5f25SBoyan Karatotev 	if (is_feat_pauth_supported()) {
147ed108b56SAlexei Fedorov 		pauth_disable_el3();
1488d9f5f25SBoyan Karatotev 	}
149ed108b56SAlexei Fedorov 
150b1d27b48SRoberto Vargas 	bl2_run_next_image(next_bl_ep_info);
15142d4d3baSArvind Ram Prakash #endif /* BL2_RUNS_AT_EL3 */
1524f6ad66aSAchin Gupta }
153