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