xref: /rk3399_ARM-atf/plat/qti/common/src/qti_bl31_setup.c (revision 292ffc06ef98aa89c570f8739a8d99d9a45c8fe2)
15bd9c17dSSaurabh Gorecha /*
25bd9c17dSSaurabh Gorecha  * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
35bd9c17dSSaurabh Gorecha  * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
45bd9c17dSSaurabh Gorecha  *
55bd9c17dSSaurabh Gorecha  * SPDX-License-Identifier: BSD-3-Clause
65bd9c17dSSaurabh Gorecha  */
75bd9c17dSSaurabh Gorecha 
85bd9c17dSSaurabh Gorecha #include <assert.h>
95bd9c17dSSaurabh Gorecha 
105bd9c17dSSaurabh Gorecha #include <bl31/bl31.h>
115bd9c17dSSaurabh Gorecha #include <common/debug.h>
125bd9c17dSSaurabh Gorecha #include <common/desc_image_load.h>
135bd9c17dSSaurabh Gorecha #include <drivers/console.h>
145bd9c17dSSaurabh Gorecha #include <drivers/generic_delay_timer.h>
15*292ffc06SSumit Garg #include <drivers/qti/accesscontrol/xpu.h>
165bd9c17dSSaurabh Gorecha #include <lib/bl_aux_params/bl_aux_params.h>
175bd9c17dSSaurabh Gorecha #include <lib/coreboot.h>
185bd9c17dSSaurabh Gorecha #include <lib/spinlock.h>
195bd9c17dSSaurabh Gorecha 
205bd9c17dSSaurabh Gorecha #include <platform.h>
215bd9c17dSSaurabh Gorecha #include <qti_interrupt_svc.h>
225bd9c17dSSaurabh Gorecha #include <qti_plat.h>
235bd9c17dSSaurabh Gorecha #include <qti_uart_console.h>
245bd9c17dSSaurabh Gorecha #include <qtiseclib_interface.h>
255bd9c17dSSaurabh Gorecha 
268eb87556SSumit Garg /* Variable to hold QTI UART configuration */
278eb87556SSumit Garg static console_t g_qti_console_uart;
288eb87556SSumit Garg 
295bd9c17dSSaurabh Gorecha /*
3048897badSCasey Connolly  * Placeholder variables for copying the BL32 and Bl33 arguments that have been
3148897badSCasey Connolly  * passed to BL31 from BL2.
325bd9c17dSSaurabh Gorecha  */
3348897badSCasey Connolly static entry_point_info_t bl32_image_ep_info;
345bd9c17dSSaurabh Gorecha static entry_point_info_t bl33_image_ep_info;
355bd9c17dSSaurabh Gorecha 
365bd9c17dSSaurabh Gorecha /*
375bd9c17dSSaurabh Gorecha  * Variable to hold bl31 cold boot status. Default value 0x0 means yet to boot.
385bd9c17dSSaurabh Gorecha  * Any other value means cold booted.
395bd9c17dSSaurabh Gorecha  */
406cc743cfSSaurabh Gorecha uint32_t g_qti_bl31_cold_booted;
415bd9c17dSSaurabh Gorecha 
425bd9c17dSSaurabh Gorecha /*******************************************************************************
435bd9c17dSSaurabh Gorecha  * Perform any BL31 early platform setup common to ARM standard platforms.
445bd9c17dSSaurabh Gorecha  * Here is an opportunity to copy parameters passed by the calling EL (S-EL1
455bd9c17dSSaurabh Gorecha  * in BL2 & S-EL3 in BL1) before they are lost (potentially). This needs to be
465bd9c17dSSaurabh Gorecha  * done before the MMU is initialized so that the memory layout can be used
475bd9c17dSSaurabh Gorecha  * while creating page tables. BL2 has flushed this information to memory, so
485bd9c17dSSaurabh Gorecha  * we are guaranteed to pick up good data.
495bd9c17dSSaurabh Gorecha  ******************************************************************************/
505bd9c17dSSaurabh Gorecha void bl31_early_platform_setup(u_register_t from_bl2,
515bd9c17dSSaurabh Gorecha 			       u_register_t plat_params_from_bl2)
525bd9c17dSSaurabh Gorecha {
535bd9c17dSSaurabh Gorecha 	bl_aux_params_parse(plat_params_from_bl2, NULL);
545bd9c17dSSaurabh Gorecha 
558eb87556SSumit Garg 	qti_console_uart_register(&g_qti_console_uart, PLAT_QTI_UART_BASE);
568eb87556SSumit Garg 	console_set_scope(&g_qti_console_uart, CONSOLE_FLAG_RUNTIME |
578eb87556SSumit Garg 			  CONSOLE_FLAG_BOOT | CONSOLE_FLAG_CRASH);
585bd9c17dSSaurabh Gorecha 	/*
595bd9c17dSSaurabh Gorecha 	 * Tell BL31 where the non-trusted software image
605bd9c17dSSaurabh Gorecha 	 * is located and the entry state information
615bd9c17dSSaurabh Gorecha 	 */
6248897badSCasey Connolly 	bl31_params_parse_helper(from_bl2, &bl32_image_ep_info, &bl33_image_ep_info);
635bd9c17dSSaurabh Gorecha }
645bd9c17dSSaurabh Gorecha 
655bd9c17dSSaurabh Gorecha void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
665bd9c17dSSaurabh Gorecha 				u_register_t arg2, u_register_t arg3)
675bd9c17dSSaurabh Gorecha {
685bd9c17dSSaurabh Gorecha 	bl31_early_platform_setup(arg0, arg1);
695bd9c17dSSaurabh Gorecha }
705bd9c17dSSaurabh Gorecha 
715bd9c17dSSaurabh Gorecha /*******************************************************************************
725bd9c17dSSaurabh Gorecha  * Perform the very early platform specific architectural setup here. At the
731b491eeaSElyes Haouas  * moment this only initializes the mmu in a quick and dirty way.
745bd9c17dSSaurabh Gorecha  ******************************************************************************/
755bd9c17dSSaurabh Gorecha void bl31_plat_arch_setup(void)
765bd9c17dSSaurabh Gorecha {
776cc743cfSSaurabh Gorecha 	qti_setup_page_tables(
786cc743cfSSaurabh Gorecha 			      BL31_START,
796cc743cfSSaurabh Gorecha 			      BL31_END-BL31_START,
805bd9c17dSSaurabh Gorecha 			      BL_CODE_BASE,
815bd9c17dSSaurabh Gorecha 			      BL_CODE_END,
825bd9c17dSSaurabh Gorecha 			      BL_RO_DATA_BASE,
836cc743cfSSaurabh Gorecha 			      BL_RO_DATA_END
846cc743cfSSaurabh Gorecha 			     );
855bd9c17dSSaurabh Gorecha 	enable_mmu_el3(0);
865bd9c17dSSaurabh Gorecha }
875bd9c17dSSaurabh Gorecha 
885bd9c17dSSaurabh Gorecha /*******************************************************************************
895bd9c17dSSaurabh Gorecha  * Perform any BL31 platform setup common to ARM standard platforms
905bd9c17dSSaurabh Gorecha  ******************************************************************************/
915bd9c17dSSaurabh Gorecha void bl31_platform_setup(void)
925bd9c17dSSaurabh Gorecha {
93*292ffc06SSumit Garg #ifdef QTI_MSM_XPU_BYPASS
94*292ffc06SSumit Garg 	INFO("Bypassing QTI MSM XPU...\n");
95*292ffc06SSumit Garg 	qti_msm_xpu_bypass();
96*292ffc06SSumit Garg #endif
975bd9c17dSSaurabh Gorecha 	generic_delay_timer_init();
985bd9c17dSSaurabh Gorecha 	/* Initialize the GIC driver, CPU and distributor interfaces */
995bd9c17dSSaurabh Gorecha 	plat_qti_gic_driver_init();
1005bd9c17dSSaurabh Gorecha 	plat_qti_gic_init();
10148897badSCasey Connolly 	qti_interrupt_svc_init(bl32_image_ep_info.pc != 0);
1025bd9c17dSSaurabh Gorecha 	qtiseclib_bl31_platform_setup();
1035bd9c17dSSaurabh Gorecha 
1045bd9c17dSSaurabh Gorecha 	/* set boot state to cold boot complete. */
1055bd9c17dSSaurabh Gorecha 	g_qti_bl31_cold_booted = 0x1;
1065bd9c17dSSaurabh Gorecha }
1075bd9c17dSSaurabh Gorecha 
1085bd9c17dSSaurabh Gorecha /*******************************************************************************
1095bd9c17dSSaurabh Gorecha  * Return a pointer to the 'entry_point_info' structure of the next image for the
1105bd9c17dSSaurabh Gorecha  * security state specified. BL33 corresponds to the non-secure image type
1115bd9c17dSSaurabh Gorecha  * while BL32 corresponds to the secure image type. A NULL pointer is returned
1125bd9c17dSSaurabh Gorecha  * if the image does not exist.
1135bd9c17dSSaurabh Gorecha  ******************************************************************************/
1145bd9c17dSSaurabh Gorecha entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type)
1155bd9c17dSSaurabh Gorecha {
11648897badSCasey Connolly 	entry_point_info_t *ep;
11748897badSCasey Connolly 
11848897badSCasey Connolly 	assert(sec_state_is_valid(type) != 0);
11948897badSCasey Connolly 	ep = (type == SECURE) ? &bl32_image_ep_info : &bl33_image_ep_info;
12048897badSCasey Connolly 
12148897badSCasey Connolly 	return ep->pc ? ep : NULL;
1225bd9c17dSSaurabh Gorecha }
1235bd9c17dSSaurabh Gorecha 
1245bd9c17dSSaurabh Gorecha /*******************************************************************************
1255bd9c17dSSaurabh Gorecha  * This function is used by the architecture setup code to retrieve the counter
1265bd9c17dSSaurabh Gorecha  * frequency for the CPU's generic timer. This value will be programmed into the
1275bd9c17dSSaurabh Gorecha  * CNTFRQ_EL0 register. In Arm standard platforms, it returns the base frequency
1285bd9c17dSSaurabh Gorecha  * of the system counter, which is retrieved from the first entry in the
1295bd9c17dSSaurabh Gorecha  * frequency modes table. This will be used later in warm boot (psci_arch_setup)
1305bd9c17dSSaurabh Gorecha  * of CPUs to set when CPU frequency.
1315bd9c17dSSaurabh Gorecha  ******************************************************************************/
1325bd9c17dSSaurabh Gorecha unsigned int plat_get_syscnt_freq2(void)
1335bd9c17dSSaurabh Gorecha {
134327a32d9SSumit Garg 	return PLAT_SYSCNT_FREQ;
1355bd9c17dSSaurabh Gorecha }
136