xref: /rk3399_ARM-atf/plat/qti/common/src/qti_bl31_setup.c (revision 1b491eead580d7849a45a38f2c6a935a5d8d1160)
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>
155bd9c17dSSaurabh Gorecha #include <lib/bl_aux_params/bl_aux_params.h>
165bd9c17dSSaurabh Gorecha #include <lib/coreboot.h>
175bd9c17dSSaurabh Gorecha #include <lib/spinlock.h>
185bd9c17dSSaurabh Gorecha 
195bd9c17dSSaurabh Gorecha #include <platform.h>
205bd9c17dSSaurabh Gorecha #include <qti_interrupt_svc.h>
215bd9c17dSSaurabh Gorecha #include <qti_plat.h>
225bd9c17dSSaurabh Gorecha #include <qti_uart_console.h>
235bd9c17dSSaurabh Gorecha #include <qtiseclib_interface.h>
245bd9c17dSSaurabh Gorecha 
255bd9c17dSSaurabh Gorecha /*
265bd9c17dSSaurabh Gorecha  * Placeholder variables for copying the arguments that have been passed to
275bd9c17dSSaurabh Gorecha  * BL31 from BL2.
285bd9c17dSSaurabh Gorecha  */
295bd9c17dSSaurabh Gorecha static entry_point_info_t bl33_image_ep_info;
305bd9c17dSSaurabh Gorecha 
315bd9c17dSSaurabh Gorecha /*
325bd9c17dSSaurabh Gorecha  * Variable to hold counter frequency for the CPU's generic timer. In this
335bd9c17dSSaurabh Gorecha  * platform coreboot image configure counter frequency for boot core before
345bd9c17dSSaurabh Gorecha  * reaching TF-A.
355bd9c17dSSaurabh Gorecha  */
365bd9c17dSSaurabh Gorecha static uint64_t g_qti_cpu_cntfrq;
375bd9c17dSSaurabh Gorecha 
385bd9c17dSSaurabh Gorecha /*
395bd9c17dSSaurabh Gorecha  * Variable to hold bl31 cold boot status. Default value 0x0 means yet to boot.
405bd9c17dSSaurabh Gorecha  * Any other value means cold booted.
415bd9c17dSSaurabh Gorecha  */
426cc743cfSSaurabh Gorecha uint32_t g_qti_bl31_cold_booted;
435bd9c17dSSaurabh Gorecha 
445bd9c17dSSaurabh Gorecha /*******************************************************************************
455bd9c17dSSaurabh Gorecha  * Perform any BL31 early platform setup common to ARM standard platforms.
465bd9c17dSSaurabh Gorecha  * Here is an opportunity to copy parameters passed by the calling EL (S-EL1
475bd9c17dSSaurabh Gorecha  * in BL2 & S-EL3 in BL1) before they are lost (potentially). This needs to be
485bd9c17dSSaurabh Gorecha  * done before the MMU is initialized so that the memory layout can be used
495bd9c17dSSaurabh Gorecha  * while creating page tables. BL2 has flushed this information to memory, so
505bd9c17dSSaurabh Gorecha  * we are guaranteed to pick up good data.
515bd9c17dSSaurabh Gorecha  ******************************************************************************/
525bd9c17dSSaurabh Gorecha void bl31_early_platform_setup(u_register_t from_bl2,
535bd9c17dSSaurabh Gorecha 			       u_register_t plat_params_from_bl2)
545bd9c17dSSaurabh Gorecha {
555bd9c17dSSaurabh Gorecha 
565bd9c17dSSaurabh Gorecha 	g_qti_cpu_cntfrq = read_cntfrq_el0();
575bd9c17dSSaurabh Gorecha 
585bd9c17dSSaurabh Gorecha 	bl_aux_params_parse(plat_params_from_bl2, NULL);
595bd9c17dSSaurabh Gorecha 
605bd9c17dSSaurabh Gorecha #if COREBOOT
615bd9c17dSSaurabh Gorecha 	if (coreboot_serial.baseaddr != 0) {
625bd9c17dSSaurabh Gorecha 		static console_t g_qti_console_uart;
635bd9c17dSSaurabh Gorecha 
645bd9c17dSSaurabh Gorecha 		qti_console_uart_register(&g_qti_console_uart,
655bd9c17dSSaurabh Gorecha 					  coreboot_serial.baseaddr);
665bd9c17dSSaurabh Gorecha 	}
675bd9c17dSSaurabh Gorecha #endif
685bd9c17dSSaurabh Gorecha 
695bd9c17dSSaurabh Gorecha 	/*
705bd9c17dSSaurabh Gorecha 	 * Tell BL31 where the non-trusted software image
715bd9c17dSSaurabh Gorecha 	 * is located and the entry state information
725bd9c17dSSaurabh Gorecha 	 */
735bd9c17dSSaurabh Gorecha 	bl31_params_parse_helper(from_bl2, NULL, &bl33_image_ep_info);
745bd9c17dSSaurabh Gorecha }
755bd9c17dSSaurabh Gorecha 
765bd9c17dSSaurabh Gorecha void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
775bd9c17dSSaurabh Gorecha 				u_register_t arg2, u_register_t arg3)
785bd9c17dSSaurabh Gorecha {
795bd9c17dSSaurabh Gorecha 	bl31_early_platform_setup(arg0, arg1);
805bd9c17dSSaurabh Gorecha }
815bd9c17dSSaurabh Gorecha 
825bd9c17dSSaurabh Gorecha /*******************************************************************************
835bd9c17dSSaurabh Gorecha  * Perform the very early platform specific architectural setup here. At the
84*1b491eeaSElyes Haouas  * moment this only initializes the mmu in a quick and dirty way.
855bd9c17dSSaurabh Gorecha  ******************************************************************************/
865bd9c17dSSaurabh Gorecha void bl31_plat_arch_setup(void)
875bd9c17dSSaurabh Gorecha {
886cc743cfSSaurabh Gorecha 	qti_setup_page_tables(
896cc743cfSSaurabh Gorecha 			      BL31_START,
906cc743cfSSaurabh Gorecha 			      BL31_END-BL31_START,
915bd9c17dSSaurabh Gorecha 			      BL_CODE_BASE,
925bd9c17dSSaurabh Gorecha 			      BL_CODE_END,
935bd9c17dSSaurabh Gorecha 			      BL_RO_DATA_BASE,
946cc743cfSSaurabh Gorecha 			      BL_RO_DATA_END
956cc743cfSSaurabh Gorecha 			     );
965bd9c17dSSaurabh Gorecha 	enable_mmu_el3(0);
975bd9c17dSSaurabh Gorecha }
985bd9c17dSSaurabh Gorecha 
995bd9c17dSSaurabh Gorecha /*******************************************************************************
1005bd9c17dSSaurabh Gorecha  * Perform any BL31 platform setup common to ARM standard platforms
1015bd9c17dSSaurabh Gorecha  ******************************************************************************/
1025bd9c17dSSaurabh Gorecha void bl31_platform_setup(void)
1035bd9c17dSSaurabh Gorecha {
1045bd9c17dSSaurabh Gorecha 	generic_delay_timer_init();
1055bd9c17dSSaurabh Gorecha 	/* Initialize the GIC driver, CPU and distributor interfaces */
1065bd9c17dSSaurabh Gorecha 	plat_qti_gic_driver_init();
1075bd9c17dSSaurabh Gorecha 	plat_qti_gic_init();
1085bd9c17dSSaurabh Gorecha 	qti_interrupt_svc_init();
1095bd9c17dSSaurabh Gorecha 	qtiseclib_bl31_platform_setup();
1105bd9c17dSSaurabh Gorecha 
1115bd9c17dSSaurabh Gorecha 	/* set boot state to cold boot complete. */
1125bd9c17dSSaurabh Gorecha 	g_qti_bl31_cold_booted = 0x1;
1135bd9c17dSSaurabh Gorecha }
1145bd9c17dSSaurabh Gorecha 
1155bd9c17dSSaurabh Gorecha /*******************************************************************************
1165bd9c17dSSaurabh Gorecha  * Return a pointer to the 'entry_point_info' structure of the next image for the
1175bd9c17dSSaurabh Gorecha  * security state specified. BL33 corresponds to the non-secure image type
1185bd9c17dSSaurabh Gorecha  * while BL32 corresponds to the secure image type. A NULL pointer is returned
1195bd9c17dSSaurabh Gorecha  * if the image does not exist.
1205bd9c17dSSaurabh Gorecha  ******************************************************************************/
1215bd9c17dSSaurabh Gorecha entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type)
1225bd9c17dSSaurabh Gorecha {
1235bd9c17dSSaurabh Gorecha 	/* QTI platform don't have BL32 implementation. */
1245bd9c17dSSaurabh Gorecha 	assert(type == NON_SECURE);
1255bd9c17dSSaurabh Gorecha 	assert(bl33_image_ep_info.h.type == PARAM_EP);
1265bd9c17dSSaurabh Gorecha 	assert(bl33_image_ep_info.h.attr == NON_SECURE);
1275bd9c17dSSaurabh Gorecha 	/*
1285bd9c17dSSaurabh Gorecha 	 * None of the images on the platforms can have 0x0
1295bd9c17dSSaurabh Gorecha 	 * as the entrypoint.
1305bd9c17dSSaurabh Gorecha 	 */
1315bd9c17dSSaurabh Gorecha 	if (bl33_image_ep_info.pc) {
1325bd9c17dSSaurabh Gorecha 		return &bl33_image_ep_info;
1335bd9c17dSSaurabh Gorecha 	} else {
1345bd9c17dSSaurabh Gorecha 		return NULL;
1355bd9c17dSSaurabh Gorecha 	}
1365bd9c17dSSaurabh Gorecha }
1375bd9c17dSSaurabh Gorecha 
1385bd9c17dSSaurabh Gorecha /*******************************************************************************
1395bd9c17dSSaurabh Gorecha  * This function is used by the architecture setup code to retrieve the counter
1405bd9c17dSSaurabh Gorecha  * frequency for the CPU's generic timer. This value will be programmed into the
1415bd9c17dSSaurabh Gorecha  * CNTFRQ_EL0 register. In Arm standard platforms, it returns the base frequency
1425bd9c17dSSaurabh Gorecha  * of the system counter, which is retrieved from the first entry in the
1435bd9c17dSSaurabh Gorecha  * frequency modes table. This will be used later in warm boot (psci_arch_setup)
1445bd9c17dSSaurabh Gorecha  * of CPUs to set when CPU frequency.
1455bd9c17dSSaurabh Gorecha  ******************************************************************************/
1465bd9c17dSSaurabh Gorecha unsigned int plat_get_syscnt_freq2(void)
1475bd9c17dSSaurabh Gorecha {
1485bd9c17dSSaurabh Gorecha 	assert(g_qti_cpu_cntfrq != 0);
1495bd9c17dSSaurabh Gorecha 	return g_qti_cpu_cntfrq;
1505bd9c17dSSaurabh Gorecha }
151