xref: /arm-trusted-firmware/plat/st/stm32mp1/sp_min/sp_min_setup.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2015-2023, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <assert.h>
8*91f16700Schasinglulu #include <string.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <arch_helpers.h>
11*91f16700Schasinglulu #include <bl32/sp_min/platform_sp_min.h>
12*91f16700Schasinglulu #include <common/bl_common.h>
13*91f16700Schasinglulu #include <common/debug.h>
14*91f16700Schasinglulu #include <context.h>
15*91f16700Schasinglulu #include <drivers/arm/gicv2.h>
16*91f16700Schasinglulu #include <drivers/arm/tzc400.h>
17*91f16700Schasinglulu #include <drivers/generic_delay_timer.h>
18*91f16700Schasinglulu #include <drivers/st/bsec.h>
19*91f16700Schasinglulu #include <drivers/st/etzpc.h>
20*91f16700Schasinglulu #include <drivers/st/stm32_gpio.h>
21*91f16700Schasinglulu #include <drivers/st/stm32_iwdg.h>
22*91f16700Schasinglulu #include <drivers/st/stm32mp1_clk.h>
23*91f16700Schasinglulu #include <dt-bindings/clock/stm32mp1-clks.h>
24*91f16700Schasinglulu #include <lib/el3_runtime/context_mgmt.h>
25*91f16700Schasinglulu #include <lib/mmio.h>
26*91f16700Schasinglulu #include <lib/xlat_tables/xlat_tables_v2.h>
27*91f16700Schasinglulu #include <plat/common/platform.h>
28*91f16700Schasinglulu 
29*91f16700Schasinglulu #include <platform_def.h>
30*91f16700Schasinglulu 
31*91f16700Schasinglulu /******************************************************************************
32*91f16700Schasinglulu  * Placeholder variables for copying the arguments that have been passed to
33*91f16700Schasinglulu  * BL32 from BL2.
34*91f16700Schasinglulu  ******************************************************************************/
35*91f16700Schasinglulu static entry_point_info_t bl33_image_ep_info;
36*91f16700Schasinglulu 
37*91f16700Schasinglulu /*******************************************************************************
38*91f16700Schasinglulu  * Interrupt handler for FIQ (secure IRQ)
39*91f16700Schasinglulu  ******************************************************************************/
40*91f16700Schasinglulu void sp_min_plat_fiq_handler(uint32_t id)
41*91f16700Schasinglulu {
42*91f16700Schasinglulu 	(void)plat_crash_console_init();
43*91f16700Schasinglulu 
44*91f16700Schasinglulu 	switch (id & INT_ID_MASK) {
45*91f16700Schasinglulu 	case STM32MP1_IRQ_TZC400:
46*91f16700Schasinglulu 		tzc400_init(STM32MP1_TZC_BASE);
47*91f16700Schasinglulu 		(void)tzc400_it_handler();
48*91f16700Schasinglulu 		panic();
49*91f16700Schasinglulu 		break;
50*91f16700Schasinglulu 	case STM32MP1_IRQ_AXIERRIRQ:
51*91f16700Schasinglulu 		ERROR("STM32MP1_IRQ_AXIERRIRQ generated\n");
52*91f16700Schasinglulu 		panic();
53*91f16700Schasinglulu 		break;
54*91f16700Schasinglulu 	default:
55*91f16700Schasinglulu 		ERROR("SECURE IT handler not define for it : %u\n", id);
56*91f16700Schasinglulu 		break;
57*91f16700Schasinglulu 	}
58*91f16700Schasinglulu }
59*91f16700Schasinglulu 
60*91f16700Schasinglulu /*******************************************************************************
61*91f16700Schasinglulu  * Return a pointer to the 'entry_point_info' structure of the next image for
62*91f16700Schasinglulu  * the security state specified. BL33 corresponds to the non-secure image type
63*91f16700Schasinglulu  * while BL32 corresponds to the secure image type. A NULL pointer is returned
64*91f16700Schasinglulu  * if the image does not exist.
65*91f16700Schasinglulu  ******************************************************************************/
66*91f16700Schasinglulu entry_point_info_t *sp_min_plat_get_bl33_ep_info(void)
67*91f16700Schasinglulu {
68*91f16700Schasinglulu 	entry_point_info_t *next_image_info;
69*91f16700Schasinglulu 
70*91f16700Schasinglulu 	next_image_info = &bl33_image_ep_info;
71*91f16700Schasinglulu 
72*91f16700Schasinglulu 	if (next_image_info->pc == 0U) {
73*91f16700Schasinglulu 		return NULL;
74*91f16700Schasinglulu 	}
75*91f16700Schasinglulu 
76*91f16700Schasinglulu 	return next_image_info;
77*91f16700Schasinglulu }
78*91f16700Schasinglulu 
79*91f16700Schasinglulu CASSERT((STM32MP_SEC_SYSRAM_BASE == STM32MP_SYSRAM_BASE) &&
80*91f16700Schasinglulu 	((STM32MP_SEC_SYSRAM_BASE + STM32MP_SEC_SYSRAM_SIZE) <=
81*91f16700Schasinglulu 	 (STM32MP_SYSRAM_BASE + STM32MP_SYSRAM_SIZE)),
82*91f16700Schasinglulu 	assert_secure_sysram_fits_at_begining_of_sysram);
83*91f16700Schasinglulu 
84*91f16700Schasinglulu #ifdef STM32MP_NS_SYSRAM_BASE
85*91f16700Schasinglulu CASSERT((STM32MP_NS_SYSRAM_BASE >= STM32MP_SEC_SYSRAM_BASE) &&
86*91f16700Schasinglulu 	((STM32MP_NS_SYSRAM_BASE + STM32MP_NS_SYSRAM_SIZE) ==
87*91f16700Schasinglulu 	 (STM32MP_SYSRAM_BASE + STM32MP_SYSRAM_SIZE)),
88*91f16700Schasinglulu 	assert_non_secure_sysram_fits_at_end_of_sysram);
89*91f16700Schasinglulu 
90*91f16700Schasinglulu CASSERT((STM32MP_NS_SYSRAM_BASE & (PAGE_SIZE_4KB - U(1))) == 0U,
91*91f16700Schasinglulu 	assert_non_secure_sysram_base_is_4kbyte_aligned);
92*91f16700Schasinglulu 
93*91f16700Schasinglulu #define TZMA1_SECURE_RANGE \
94*91f16700Schasinglulu 	(((STM32MP_NS_SYSRAM_BASE - STM32MP_SYSRAM_BASE) >> FOUR_KB_SHIFT) - 1U)
95*91f16700Schasinglulu #else
96*91f16700Schasinglulu #define TZMA1_SECURE_RANGE		STM32MP1_ETZPC_TZMA_ALL_SECURE
97*91f16700Schasinglulu #endif /* STM32MP_NS_SYSRAM_BASE */
98*91f16700Schasinglulu #define TZMA0_SECURE_RANGE		STM32MP1_ETZPC_TZMA_ALL_SECURE
99*91f16700Schasinglulu 
100*91f16700Schasinglulu static void stm32mp1_etzpc_early_setup(void)
101*91f16700Schasinglulu {
102*91f16700Schasinglulu 	if (etzpc_init() != 0) {
103*91f16700Schasinglulu 		panic();
104*91f16700Schasinglulu 	}
105*91f16700Schasinglulu 
106*91f16700Schasinglulu 	etzpc_configure_tzma(STM32MP1_ETZPC_TZMA_ROM, TZMA0_SECURE_RANGE);
107*91f16700Schasinglulu 	etzpc_configure_tzma(STM32MP1_ETZPC_TZMA_SYSRAM, TZMA1_SECURE_RANGE);
108*91f16700Schasinglulu }
109*91f16700Schasinglulu 
110*91f16700Schasinglulu /*******************************************************************************
111*91f16700Schasinglulu  * Perform any BL32 specific platform actions.
112*91f16700Schasinglulu  ******************************************************************************/
113*91f16700Schasinglulu void sp_min_early_platform_setup2(u_register_t arg0, u_register_t arg1,
114*91f16700Schasinglulu 				  u_register_t arg2, u_register_t arg3)
115*91f16700Schasinglulu {
116*91f16700Schasinglulu 	bl_params_t *params_from_bl2 = (bl_params_t *)arg0;
117*91f16700Schasinglulu 	uintptr_t dt_addr = arg1;
118*91f16700Schasinglulu 
119*91f16700Schasinglulu 	stm32mp_setup_early_console();
120*91f16700Schasinglulu 
121*91f16700Schasinglulu 	/* Imprecise aborts can be masked in NonSecure */
122*91f16700Schasinglulu 	write_scr(read_scr() | SCR_AW_BIT);
123*91f16700Schasinglulu 
124*91f16700Schasinglulu 	mmap_add_region(BL_CODE_BASE, BL_CODE_BASE,
125*91f16700Schasinglulu 			BL_CODE_END - BL_CODE_BASE,
126*91f16700Schasinglulu 			MT_CODE | MT_SECURE);
127*91f16700Schasinglulu 
128*91f16700Schasinglulu 	configure_mmu();
129*91f16700Schasinglulu 
130*91f16700Schasinglulu 	assert(params_from_bl2 != NULL);
131*91f16700Schasinglulu 	assert(params_from_bl2->h.type == PARAM_BL_PARAMS);
132*91f16700Schasinglulu 	assert(params_from_bl2->h.version >= VERSION_2);
133*91f16700Schasinglulu 
134*91f16700Schasinglulu 	bl_params_node_t *bl_params = params_from_bl2->head;
135*91f16700Schasinglulu 
136*91f16700Schasinglulu 	/*
137*91f16700Schasinglulu 	 * Copy BL33 entry point information.
138*91f16700Schasinglulu 	 * They are stored in Secure RAM, in BL2's address space.
139*91f16700Schasinglulu 	 */
140*91f16700Schasinglulu 	while (bl_params != NULL) {
141*91f16700Schasinglulu 		if (bl_params->image_id == BL33_IMAGE_ID) {
142*91f16700Schasinglulu 			bl33_image_ep_info = *bl_params->ep_info;
143*91f16700Schasinglulu 			/*
144*91f16700Schasinglulu 			 *  Check if hw_configuration is given to BL32 and
145*91f16700Schasinglulu 			 *  share it to BL33.
146*91f16700Schasinglulu 			 */
147*91f16700Schasinglulu 			if (arg2 != 0U) {
148*91f16700Schasinglulu 				bl33_image_ep_info.args.arg0 = 0U;
149*91f16700Schasinglulu 				bl33_image_ep_info.args.arg1 = 0U;
150*91f16700Schasinglulu 				bl33_image_ep_info.args.arg2 = arg2;
151*91f16700Schasinglulu 			}
152*91f16700Schasinglulu 
153*91f16700Schasinglulu 			break;
154*91f16700Schasinglulu 		}
155*91f16700Schasinglulu 
156*91f16700Schasinglulu 		bl_params = bl_params->next_params_info;
157*91f16700Schasinglulu 	}
158*91f16700Schasinglulu 
159*91f16700Schasinglulu 	if (dt_open_and_check(dt_addr) < 0) {
160*91f16700Schasinglulu 		panic();
161*91f16700Schasinglulu 	}
162*91f16700Schasinglulu 
163*91f16700Schasinglulu 	if (bsec_probe() != 0) {
164*91f16700Schasinglulu 		panic();
165*91f16700Schasinglulu 	}
166*91f16700Schasinglulu 
167*91f16700Schasinglulu 	if (stm32mp1_clk_probe() < 0) {
168*91f16700Schasinglulu 		panic();
169*91f16700Schasinglulu 	}
170*91f16700Schasinglulu 
171*91f16700Schasinglulu 	(void)stm32mp_uart_console_setup();
172*91f16700Schasinglulu 
173*91f16700Schasinglulu 	stm32mp1_etzpc_early_setup();
174*91f16700Schasinglulu }
175*91f16700Schasinglulu 
176*91f16700Schasinglulu /*******************************************************************************
177*91f16700Schasinglulu  * Initialize the MMU, security and the GIC.
178*91f16700Schasinglulu  ******************************************************************************/
179*91f16700Schasinglulu void sp_min_platform_setup(void)
180*91f16700Schasinglulu {
181*91f16700Schasinglulu 	generic_delay_timer_init();
182*91f16700Schasinglulu 
183*91f16700Schasinglulu 	stm32mp_gic_init();
184*91f16700Schasinglulu 
185*91f16700Schasinglulu 	if (stm32_iwdg_init() < 0) {
186*91f16700Schasinglulu 		panic();
187*91f16700Schasinglulu 	}
188*91f16700Schasinglulu 
189*91f16700Schasinglulu 	stm32mp_lock_periph_registering();
190*91f16700Schasinglulu 
191*91f16700Schasinglulu 	stm32mp1_init_scmi_server();
192*91f16700Schasinglulu }
193*91f16700Schasinglulu 
194*91f16700Schasinglulu void sp_min_plat_arch_setup(void)
195*91f16700Schasinglulu {
196*91f16700Schasinglulu }
197