xref: /rk3399_ARM-atf/plat/st/stm32mp1/sp_min/sp_min_setup.c (revision a97e1f9747e295af74e032c20c32eb94cfdf2a04)
1964dfee1SYann Gautier /*
2*8d92e4beSYann Gautier  * Copyright (c) 2015-2024, ARM Limited and Contributors. All rights reserved.
3964dfee1SYann Gautier  *
4964dfee1SYann Gautier  * SPDX-License-Identifier: BSD-3-Clause
5964dfee1SYann Gautier  */
6964dfee1SYann Gautier 
7964dfee1SYann Gautier #include <assert.h>
809d40e0eSAntonio Nino Diaz #include <string.h>
909d40e0eSAntonio Nino Diaz 
1009d40e0eSAntonio Nino Diaz #include <arch_helpers.h>
11c27d8c00SYann Gautier #include <bl32/sp_min/platform_sp_min.h>
1209d40e0eSAntonio Nino Diaz #include <common/bl_common.h>
1309d40e0eSAntonio Nino Diaz #include <common/debug.h>
1409d40e0eSAntonio Nino Diaz #include <context.h>
1559a1cdf1SYann Gautier #include <drivers/arm/gicv2.h>
1609d40e0eSAntonio Nino Diaz #include <drivers/arm/tzc400.h>
1709d40e0eSAntonio Nino Diaz #include <drivers/generic_delay_timer.h>
18c7ba52daSYann Gautier #include <drivers/st/bsec.h>
197b3a46f0SEtienne Carriere #include <drivers/st/etzpc.h>
207747356dSYann Gautier #include <drivers/st/stm32_gpio.h>
2173680c23SYann Gautier #include <drivers/st/stm32_iwdg.h>
2209d40e0eSAntonio Nino Diaz #include <drivers/st/stm32mp1_clk.h>
2309d40e0eSAntonio Nino Diaz #include <dt-bindings/clock/stm32mp1-clks.h>
2409d40e0eSAntonio Nino Diaz #include <lib/el3_runtime/context_mgmt.h>
2509d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
2609d40e0eSAntonio Nino Diaz #include <lib/xlat_tables/xlat_tables_v2.h>
2709d40e0eSAntonio Nino Diaz #include <plat/common/platform.h>
2809d40e0eSAntonio Nino Diaz 
29c27d8c00SYann Gautier #include <platform_def.h>
30964dfee1SYann Gautier 
31964dfee1SYann Gautier /******************************************************************************
32964dfee1SYann Gautier  * Placeholder variables for copying the arguments that have been passed to
33964dfee1SYann Gautier  * BL32 from BL2.
34964dfee1SYann Gautier  ******************************************************************************/
35964dfee1SYann Gautier static entry_point_info_t bl33_image_ep_info;
36964dfee1SYann Gautier 
37964dfee1SYann Gautier /*******************************************************************************
38964dfee1SYann Gautier  * Interrupt handler for FIQ (secure IRQ)
39964dfee1SYann Gautier  ******************************************************************************/
sp_min_plat_fiq_handler(uint32_t id)40964dfee1SYann Gautier void sp_min_plat_fiq_handler(uint32_t id)
41964dfee1SYann Gautier {
42484e846aSYann Gautier 	(void)plat_crash_console_init();
43484e846aSYann Gautier 
4459a1cdf1SYann Gautier 	switch (id & INT_ID_MASK) {
45964dfee1SYann Gautier 	case STM32MP1_IRQ_TZC400:
4629332bcdSYann Gautier 		tzc400_init(STM32MP1_TZC_BASE);
47236fc428SYann Gautier 		(void)tzc400_it_handler();
48964dfee1SYann Gautier 		panic();
49964dfee1SYann Gautier 		break;
50964dfee1SYann Gautier 	case STM32MP1_IRQ_AXIERRIRQ:
51964dfee1SYann Gautier 		ERROR("STM32MP1_IRQ_AXIERRIRQ generated\n");
52964dfee1SYann Gautier 		panic();
53964dfee1SYann Gautier 		break;
54964dfee1SYann Gautier 	default:
55484e846aSYann Gautier 		ERROR("SECURE IT handler not define for it : %u\n", id);
56964dfee1SYann Gautier 		break;
57964dfee1SYann Gautier 	}
58964dfee1SYann Gautier }
59964dfee1SYann Gautier 
60964dfee1SYann Gautier /*******************************************************************************
61964dfee1SYann Gautier  * Return a pointer to the 'entry_point_info' structure of the next image for
62964dfee1SYann Gautier  * the security state specified. BL33 corresponds to the non-secure image type
63964dfee1SYann Gautier  * while BL32 corresponds to the secure image type. A NULL pointer is returned
64964dfee1SYann Gautier  * if the image does not exist.
65964dfee1SYann Gautier  ******************************************************************************/
sp_min_plat_get_bl33_ep_info(void)66964dfee1SYann Gautier entry_point_info_t *sp_min_plat_get_bl33_ep_info(void)
67964dfee1SYann Gautier {
68964dfee1SYann Gautier 	entry_point_info_t *next_image_info;
69964dfee1SYann Gautier 
70964dfee1SYann Gautier 	next_image_info = &bl33_image_ep_info;
71964dfee1SYann Gautier 
72964dfee1SYann Gautier 	if (next_image_info->pc == 0U) {
73964dfee1SYann Gautier 		return NULL;
74964dfee1SYann Gautier 	}
75964dfee1SYann Gautier 
76964dfee1SYann Gautier 	return next_image_info;
77964dfee1SYann Gautier }
78964dfee1SYann Gautier 
790754143aSEtienne Carriere CASSERT((STM32MP_SEC_SYSRAM_BASE == STM32MP_SYSRAM_BASE) &&
800754143aSEtienne Carriere 	((STM32MP_SEC_SYSRAM_BASE + STM32MP_SEC_SYSRAM_SIZE) <=
810754143aSEtienne Carriere 	 (STM32MP_SYSRAM_BASE + STM32MP_SYSRAM_SIZE)),
820754143aSEtienne Carriere 	assert_secure_sysram_fits_at_begining_of_sysram);
830754143aSEtienne Carriere 
840754143aSEtienne Carriere #ifdef STM32MP_NS_SYSRAM_BASE
850754143aSEtienne Carriere CASSERT((STM32MP_NS_SYSRAM_BASE >= STM32MP_SEC_SYSRAM_BASE) &&
860754143aSEtienne Carriere 	((STM32MP_NS_SYSRAM_BASE + STM32MP_NS_SYSRAM_SIZE) ==
870754143aSEtienne Carriere 	 (STM32MP_SYSRAM_BASE + STM32MP_SYSRAM_SIZE)),
880754143aSEtienne Carriere 	assert_non_secure_sysram_fits_at_end_of_sysram);
890754143aSEtienne Carriere 
900754143aSEtienne Carriere CASSERT((STM32MP_NS_SYSRAM_BASE & (PAGE_SIZE_4KB - U(1))) == 0U,
910754143aSEtienne Carriere 	assert_non_secure_sysram_base_is_4kbyte_aligned);
920754143aSEtienne Carriere 
930754143aSEtienne Carriere #define TZMA1_SECURE_RANGE \
940754143aSEtienne Carriere 	(((STM32MP_NS_SYSRAM_BASE - STM32MP_SYSRAM_BASE) >> FOUR_KB_SHIFT) - 1U)
950754143aSEtienne Carriere #else
967b3a46f0SEtienne Carriere #define TZMA1_SECURE_RANGE		STM32MP1_ETZPC_TZMA_ALL_SECURE
970754143aSEtienne Carriere #endif /* STM32MP_NS_SYSRAM_BASE */
987b3a46f0SEtienne Carriere #define TZMA0_SECURE_RANGE		STM32MP1_ETZPC_TZMA_ALL_SECURE
997b3a46f0SEtienne Carriere 
stm32mp1_etzpc_early_setup(void)1007b3a46f0SEtienne Carriere static void stm32mp1_etzpc_early_setup(void)
1017b3a46f0SEtienne Carriere {
1027b3a46f0SEtienne Carriere 	if (etzpc_init() != 0) {
1037b3a46f0SEtienne Carriere 		panic();
1047b3a46f0SEtienne Carriere 	}
1057b3a46f0SEtienne Carriere 
1067b3a46f0SEtienne Carriere 	etzpc_configure_tzma(STM32MP1_ETZPC_TZMA_ROM, TZMA0_SECURE_RANGE);
1077b3a46f0SEtienne Carriere 	etzpc_configure_tzma(STM32MP1_ETZPC_TZMA_SYSRAM, TZMA1_SECURE_RANGE);
1087b3a46f0SEtienne Carriere }
1097b3a46f0SEtienne Carriere 
110964dfee1SYann Gautier /*******************************************************************************
111964dfee1SYann Gautier  * Perform any BL32 specific platform actions.
112964dfee1SYann Gautier  ******************************************************************************/
sp_min_early_platform_setup2(u_register_t arg0,u_register_t arg1,u_register_t arg2,u_register_t arg3)113964dfee1SYann Gautier void sp_min_early_platform_setup2(u_register_t arg0, u_register_t arg1,
114964dfee1SYann Gautier 				  u_register_t arg2, u_register_t arg3)
115964dfee1SYann Gautier {
116964dfee1SYann Gautier 	bl_params_t *params_from_bl2 = (bl_params_t *)arg0;
11729332bcdSYann Gautier 	uintptr_t dt_addr = arg1;
118964dfee1SYann Gautier 
119964dfee1SYann Gautier 	/* Imprecise aborts can be masked in NonSecure */
120964dfee1SYann Gautier 	write_scr(read_scr() | SCR_AW_BIT);
121964dfee1SYann Gautier 
12202f5d820SYann Gautier 	mmap_add_region(BL_CODE_BASE, BL_CODE_BASE,
12302f5d820SYann Gautier 			BL_CODE_END - BL_CODE_BASE,
12402f5d820SYann Gautier 			MT_CODE | MT_SECURE);
12502f5d820SYann Gautier 
12602f5d820SYann Gautier 	configure_mmu();
12702f5d820SYann Gautier 
128964dfee1SYann Gautier 	assert(params_from_bl2 != NULL);
129964dfee1SYann Gautier 	assert(params_from_bl2->h.type == PARAM_BL_PARAMS);
130964dfee1SYann Gautier 	assert(params_from_bl2->h.version >= VERSION_2);
131964dfee1SYann Gautier 
132964dfee1SYann Gautier 	bl_params_node_t *bl_params = params_from_bl2->head;
133964dfee1SYann Gautier 
134964dfee1SYann Gautier 	/*
135964dfee1SYann Gautier 	 * Copy BL33 entry point information.
136964dfee1SYann Gautier 	 * They are stored in Secure RAM, in BL2's address space.
137964dfee1SYann Gautier 	 */
138964dfee1SYann Gautier 	while (bl_params != NULL) {
139964dfee1SYann Gautier 		if (bl_params->image_id == BL33_IMAGE_ID) {
140964dfee1SYann Gautier 			bl33_image_ep_info = *bl_params->ep_info;
1411d204ee4SYann Gautier 			/*
1421d204ee4SYann Gautier 			 *  Check if hw_configuration is given to BL32 and
1431d204ee4SYann Gautier 			 *  share it to BL33.
1441d204ee4SYann Gautier 			 */
1451d204ee4SYann Gautier 			if (arg2 != 0U) {
1461d204ee4SYann Gautier 				bl33_image_ep_info.args.arg0 = 0U;
1471d204ee4SYann Gautier 				bl33_image_ep_info.args.arg1 = 0U;
1481d204ee4SYann Gautier 				bl33_image_ep_info.args.arg2 = arg2;
1491d204ee4SYann Gautier 			}
1501d204ee4SYann Gautier 
151964dfee1SYann Gautier 			break;
152964dfee1SYann Gautier 		}
153964dfee1SYann Gautier 
154964dfee1SYann Gautier 		bl_params = bl_params->next_params_info;
155964dfee1SYann Gautier 	}
156964dfee1SYann Gautier 
15729332bcdSYann Gautier 	if (dt_open_and_check(dt_addr) < 0) {
158964dfee1SYann Gautier 		panic();
159964dfee1SYann Gautier 	}
160964dfee1SYann Gautier 
161c7ba52daSYann Gautier 	if (bsec_probe() != 0) {
162c7ba52daSYann Gautier 		panic();
163c7ba52daSYann Gautier 	}
164c7ba52daSYann Gautier 
165964dfee1SYann Gautier 	if (stm32mp1_clk_probe() < 0) {
166964dfee1SYann Gautier 		panic();
167964dfee1SYann Gautier 	}
168964dfee1SYann Gautier 
169aafff043SYann Gautier 	(void)stm32mp_uart_console_setup();
1707b3a46f0SEtienne Carriere 
1717b3a46f0SEtienne Carriere 	stm32mp1_etzpc_early_setup();
172964dfee1SYann Gautier }
173964dfee1SYann Gautier 
174964dfee1SYann Gautier /*******************************************************************************
175964dfee1SYann Gautier  * Initialize the MMU, security and the GIC.
176964dfee1SYann Gautier  ******************************************************************************/
sp_min_platform_setup(void)177964dfee1SYann Gautier void sp_min_platform_setup(void)
178964dfee1SYann Gautier {
179964dfee1SYann Gautier 	generic_delay_timer_init();
180964dfee1SYann Gautier 
181c27d8c00SYann Gautier 	stm32mp_gic_init();
1827747356dSYann Gautier 
183*8d92e4beSYann Gautier 	/* Disable MCU subsystem protection */
184*8d92e4beSYann Gautier 	stm32mp1_clk_mcuss_protect(false);
185*8d92e4beSYann Gautier 
18673680c23SYann Gautier 	if (stm32_iwdg_init() < 0) {
18773680c23SYann Gautier 		panic();
18873680c23SYann Gautier 	}
1895f038ac6SEtienne Carriere 
1905f038ac6SEtienne Carriere 	stm32mp_lock_periph_registering();
191fdaaaeb4SEtienne Carriere 
192fdaaaeb4SEtienne Carriere 	stm32mp1_init_scmi_server();
193964dfee1SYann Gautier }
194964dfee1SYann Gautier 
sp_min_plat_arch_setup(void)195964dfee1SYann Gautier void sp_min_plat_arch_setup(void)
196964dfee1SYann Gautier {
197964dfee1SYann Gautier }
198