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