1*81136819SBai Ping /* 2*81136819SBai Ping * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 3*81136819SBai Ping * 4*81136819SBai Ping * SPDX-License-Identifier: BSD-3-Clause 5*81136819SBai Ping */ 6*81136819SBai Ping 7*81136819SBai Ping #include <arch_helpers.h> 8*81136819SBai Ping #include <assert.h> 9*81136819SBai Ping #include <bl_common.h> 10*81136819SBai Ping #include <console.h> 11*81136819SBai Ping #include <context.h> 12*81136819SBai Ping #include <context_mgmt.h> 13*81136819SBai Ping #include <debug.h> 14*81136819SBai Ping #include <gpc.h> 15*81136819SBai Ping #include <imx_uart.h> 16*81136819SBai Ping #include <stdbool.h> 17*81136819SBai Ping #include <mmio.h> 18*81136819SBai Ping #include <platform.h> 19*81136819SBai Ping #include <platform_def.h> 20*81136819SBai Ping #include <plat_imx8.h> 21*81136819SBai Ping #include <xlat_tables.h> 22*81136819SBai Ping #include <tzc380.h> 23*81136819SBai Ping 24*81136819SBai Ping IMPORT_SYM(uintptr_t, __COHERENT_RAM_START__, BL31_COHERENT_RAM_START); 25*81136819SBai Ping IMPORT_SYM(uintptr_t, __COHERENT_RAM_END__, BL31_COHERENT_RAM_END); 26*81136819SBai Ping IMPORT_SYM(uintptr_t, __RO_START__, BL31_RO_START); 27*81136819SBai Ping IMPORT_SYM(uintptr_t, __RO_END__, BL31_RO_END); 28*81136819SBai Ping IMPORT_SYM(uintptr_t, __RW_START__, BL31_RW_START); 29*81136819SBai Ping IMPORT_SYM(uintptr_t, __RW_END__, BL31_RW_END); 30*81136819SBai Ping 31*81136819SBai Ping static const mmap_region_t imx_mmap[] = { 32*81136819SBai Ping MAP_REGION_FLAT(GPV_BASE, GPV_SIZE, MT_DEVICE | MT_RW), /* GPV map */ 33*81136819SBai Ping MAP_REGION_FLAT(IMX_AIPS_BASE, IMX_AIPS_SIZE, MT_DEVICE | MT_RW), /* AIPS map */ 34*81136819SBai Ping MAP_REGION_FLAT(IMX_GIC_BASE, IMX_GIC_SIZE, MT_DEVICE | MT_RW), /* GIC map */ 35*81136819SBai Ping {0}, 36*81136819SBai Ping }; 37*81136819SBai Ping 38*81136819SBai Ping static entry_point_info_t bl32_image_ep_info; 39*81136819SBai Ping static entry_point_info_t bl33_image_ep_info; 40*81136819SBai Ping 41*81136819SBai Ping /* get SPSR for BL33 entry */ 42*81136819SBai Ping static uint32_t get_spsr_for_bl33_entry(void) 43*81136819SBai Ping { 44*81136819SBai Ping unsigned long el_status; 45*81136819SBai Ping unsigned long mode; 46*81136819SBai Ping uint32_t spsr; 47*81136819SBai Ping 48*81136819SBai Ping /* figure out what mode we enter the non-secure world */ 49*81136819SBai Ping el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT; 50*81136819SBai Ping el_status &= ID_AA64PFR0_ELX_MASK; 51*81136819SBai Ping 52*81136819SBai Ping mode = (el_status) ? MODE_EL2 : MODE_EL1; 53*81136819SBai Ping 54*81136819SBai Ping spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); 55*81136819SBai Ping return spsr; 56*81136819SBai Ping } 57*81136819SBai Ping 58*81136819SBai Ping static void bl31_tz380_setup(void) 59*81136819SBai Ping { 60*81136819SBai Ping unsigned int val; 61*81136819SBai Ping 62*81136819SBai Ping val = mmio_read_32(IMX_IOMUX_GPR_BASE + IOMUXC_GPR10); 63*81136819SBai Ping if ((val & GPR_TZASC_EN) != GPR_TZASC_EN) 64*81136819SBai Ping return; 65*81136819SBai Ping 66*81136819SBai Ping tzc380_init(IMX_TZASC_BASE); 67*81136819SBai Ping /* 68*81136819SBai Ping * Need to substact offset 0x40000000 from CPU address when 69*81136819SBai Ping * programming tzasc region for i.mx8mq. Enable 1G-5G S/NS RW 70*81136819SBai Ping */ 71*81136819SBai Ping tzc380_configure_region(0, 0x00000000, TZC_ATTR_REGION_SIZE(TZC_REGION_SIZE_4G) | 72*81136819SBai Ping TZC_ATTR_REGION_EN_MASK | TZC_ATTR_SP_ALL); 73*81136819SBai Ping } 74*81136819SBai Ping 75*81136819SBai Ping void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, 76*81136819SBai Ping u_register_t arg2, u_register_t arg3) 77*81136819SBai Ping { 78*81136819SBai Ping int i; 79*81136819SBai Ping /* enable CSU NS access permission */ 80*81136819SBai Ping for (i = 0; i < 64; i++) { 81*81136819SBai Ping mmio_write_32(IMX_CSU_BASE + i * 4, 0xffffffff); 82*81136819SBai Ping } 83*81136819SBai Ping 84*81136819SBai Ping #if DEBUG_CONSOLE 85*81136819SBai Ping static console_uart_t console; 86*81136819SBai Ping 87*81136819SBai Ping console_uart_register(IMX_BOOT_UART_BASE, IMX_BOOT_UART_CLK_IN_HZ, 88*81136819SBai Ping IMX_CONSOLE_BAUDRATE, &console); 89*81136819SBai Ping #endif 90*81136819SBai Ping /* 91*81136819SBai Ping * tell BL3-1 where the non-secure software image is located 92*81136819SBai Ping * and the entry state information. 93*81136819SBai Ping */ 94*81136819SBai Ping bl33_image_ep_info.pc = PLAT_NS_IMAGE_OFFSET; 95*81136819SBai Ping bl33_image_ep_info.spsr = get_spsr_for_bl33_entry(); 96*81136819SBai Ping SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE); 97*81136819SBai Ping 98*81136819SBai Ping bl31_tz380_setup(); 99*81136819SBai Ping } 100*81136819SBai Ping 101*81136819SBai Ping void bl31_plat_arch_setup(void) 102*81136819SBai Ping { 103*81136819SBai Ping mmap_add_region(BL31_RO_START, BL31_RO_START, (BL31_RO_END - BL31_RO_START), 104*81136819SBai Ping MT_MEMORY | MT_RO | MT_SECURE); 105*81136819SBai Ping mmap_add_region(BL31_RW_START, BL31_RW_START, (BL31_RW_END - BL31_RW_START), 106*81136819SBai Ping MT_MEMORY | MT_RW | MT_SECURE); 107*81136819SBai Ping 108*81136819SBai Ping mmap_add(imx_mmap); 109*81136819SBai Ping 110*81136819SBai Ping #if USE_COHERENT_MEM 111*81136819SBai Ping mmap_add_region(BL31_COHERENT_RAM_START, BL31_COHERENT_RAM_START, 112*81136819SBai Ping BL31_COHERENT_RAM_END - BL31_COHERENT_RAM_START, 113*81136819SBai Ping MT_DEVICE | MT_RW | MT_SECURE); 114*81136819SBai Ping #endif 115*81136819SBai Ping /* setup xlat table */ 116*81136819SBai Ping init_xlat_tables(); 117*81136819SBai Ping /* enable the MMU */ 118*81136819SBai Ping enable_mmu_el3(0); 119*81136819SBai Ping } 120*81136819SBai Ping 121*81136819SBai Ping void bl31_platform_setup(void) 122*81136819SBai Ping { 123*81136819SBai Ping /* init the GICv3 cpu and distributor interface */ 124*81136819SBai Ping plat_gic_driver_init(); 125*81136819SBai Ping plat_gic_init(); 126*81136819SBai Ping 127*81136819SBai Ping /* gpc init */ 128*81136819SBai Ping imx_gpc_init(); 129*81136819SBai Ping } 130*81136819SBai Ping 131*81136819SBai Ping entry_point_info_t *bl31_plat_get_next_image_ep_info(unsigned int type) 132*81136819SBai Ping { 133*81136819SBai Ping if (type == NON_SECURE) 134*81136819SBai Ping return &bl33_image_ep_info; 135*81136819SBai Ping if (type == SECURE) 136*81136819SBai Ping return &bl32_image_ep_info; 137*81136819SBai Ping 138*81136819SBai Ping return NULL; 139*81136819SBai Ping } 140*81136819SBai Ping 141*81136819SBai Ping unsigned int plat_get_syscnt_freq2(void) 142*81136819SBai Ping { 143*81136819SBai Ping return COUNTER_FREQUENCY; 144*81136819SBai Ping } 145*81136819SBai Ping 146*81136819SBai Ping void bl31_plat_runtime_setup(void) 147*81136819SBai Ping { 148*81136819SBai Ping return; 149*81136819SBai Ping } 150