1*58fdd608SJacky Bai /* 2*58fdd608SJacky Bai * Copyright 2019-2020 NXP 3*58fdd608SJacky Bai * 4*58fdd608SJacky Bai * SPDX-License-Identifier: BSD-3-Clause 5*58fdd608SJacky Bai */ 6*58fdd608SJacky Bai 7*58fdd608SJacky Bai #include <assert.h> 8*58fdd608SJacky Bai #include <stdbool.h> 9*58fdd608SJacky Bai 10*58fdd608SJacky Bai #include <arch_helpers.h> 11*58fdd608SJacky Bai #include <common/bl_common.h> 12*58fdd608SJacky Bai #include <common/debug.h> 13*58fdd608SJacky Bai #include <context.h> 14*58fdd608SJacky Bai #include <drivers/arm/tzc380.h> 15*58fdd608SJacky Bai #include <drivers/console.h> 16*58fdd608SJacky Bai #include <drivers/generic_delay_timer.h> 17*58fdd608SJacky Bai #include <lib/el3_runtime/context_mgmt.h> 18*58fdd608SJacky Bai #include <lib/mmio.h> 19*58fdd608SJacky Bai #include <lib/xlat_tables/xlat_tables_v2.h> 20*58fdd608SJacky Bai #include <plat/common/platform.h> 21*58fdd608SJacky Bai 22*58fdd608SJacky Bai #include <gpc.h> 23*58fdd608SJacky Bai #include <imx_aipstz.h> 24*58fdd608SJacky Bai #include <imx_uart.h> 25*58fdd608SJacky Bai #include <imx_rdc.h> 26*58fdd608SJacky Bai #include <imx8m_caam.h> 27*58fdd608SJacky Bai #include <platform_def.h> 28*58fdd608SJacky Bai #include <plat_imx8.h> 29*58fdd608SJacky Bai 30*58fdd608SJacky Bai static const mmap_region_t imx_mmap[] = { 31*58fdd608SJacky Bai GIC_MAP, AIPS_MAP, OCRAM_S_MAP, DDRC_MAP, {0}, 32*58fdd608SJacky Bai }; 33*58fdd608SJacky Bai 34*58fdd608SJacky Bai static const struct aipstz_cfg aipstz[] = { 35*58fdd608SJacky Bai {IMX_AIPSTZ1, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, }, 36*58fdd608SJacky Bai {IMX_AIPSTZ2, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, }, 37*58fdd608SJacky Bai {IMX_AIPSTZ3, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, }, 38*58fdd608SJacky Bai {IMX_AIPSTZ4, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, }, 39*58fdd608SJacky Bai {0}, 40*58fdd608SJacky Bai }; 41*58fdd608SJacky Bai 42*58fdd608SJacky Bai static const struct imx_rdc_cfg rdc[] = { 43*58fdd608SJacky Bai /* Master domain assignment */ 44*58fdd608SJacky Bai RDC_MDAn(0x1, DID1), 45*58fdd608SJacky Bai 46*58fdd608SJacky Bai /* peripherals domain permission */ 47*58fdd608SJacky Bai 48*58fdd608SJacky Bai /* memory region */ 49*58fdd608SJacky Bai RDC_MEM_REGIONn(16, 0x0, 0x0, 0xff), 50*58fdd608SJacky Bai RDC_MEM_REGIONn(17, 0x0, 0x0, 0xff), 51*58fdd608SJacky Bai RDC_MEM_REGIONn(18, 0x0, 0x0, 0xff), 52*58fdd608SJacky Bai 53*58fdd608SJacky Bai /* Sentinel */ 54*58fdd608SJacky Bai {0}, 55*58fdd608SJacky Bai }; 56*58fdd608SJacky Bai 57*58fdd608SJacky Bai static entry_point_info_t bl32_image_ep_info; 58*58fdd608SJacky Bai static entry_point_info_t bl33_image_ep_info; 59*58fdd608SJacky Bai 60*58fdd608SJacky Bai /* get SPSR for BL33 entry */ 61*58fdd608SJacky Bai static uint32_t get_spsr_for_bl33_entry(void) 62*58fdd608SJacky Bai { 63*58fdd608SJacky Bai unsigned long el_status; 64*58fdd608SJacky Bai unsigned long mode; 65*58fdd608SJacky Bai uint32_t spsr; 66*58fdd608SJacky Bai 67*58fdd608SJacky Bai /* figure out what mode we enter the non-secure world */ 68*58fdd608SJacky Bai el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT; 69*58fdd608SJacky Bai el_status &= ID_AA64PFR0_ELX_MASK; 70*58fdd608SJacky Bai 71*58fdd608SJacky Bai mode = (el_status) ? MODE_EL2 : MODE_EL1; 72*58fdd608SJacky Bai 73*58fdd608SJacky Bai spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); 74*58fdd608SJacky Bai return spsr; 75*58fdd608SJacky Bai } 76*58fdd608SJacky Bai 77*58fdd608SJacky Bai static void bl31_tzc380_setup(void) 78*58fdd608SJacky Bai { 79*58fdd608SJacky Bai unsigned int val; 80*58fdd608SJacky Bai 81*58fdd608SJacky Bai val = mmio_read_32(IMX_IOMUX_GPR_BASE + 0x28); 82*58fdd608SJacky Bai if ((val & GPR_TZASC_EN) != GPR_TZASC_EN) 83*58fdd608SJacky Bai return; 84*58fdd608SJacky Bai 85*58fdd608SJacky Bai tzc380_init(IMX_TZASC_BASE); 86*58fdd608SJacky Bai 87*58fdd608SJacky Bai /* 88*58fdd608SJacky Bai * Need to substact offset 0x40000000 from CPU address when 89*58fdd608SJacky Bai * programming tzasc region for i.mx8mn. 90*58fdd608SJacky Bai */ 91*58fdd608SJacky Bai 92*58fdd608SJacky Bai /* Enable 1G-5G S/NS RW */ 93*58fdd608SJacky Bai tzc380_configure_region(0, 0x00000000, TZC_ATTR_REGION_SIZE(TZC_REGION_SIZE_4G) | 94*58fdd608SJacky Bai TZC_ATTR_REGION_EN_MASK | TZC_ATTR_SP_ALL); 95*58fdd608SJacky Bai } 96*58fdd608SJacky Bai 97*58fdd608SJacky Bai void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, 98*58fdd608SJacky Bai u_register_t arg2, u_register_t arg3) 99*58fdd608SJacky Bai { 100*58fdd608SJacky Bai static console_t console; 101*58fdd608SJacky Bai int i; 102*58fdd608SJacky Bai 103*58fdd608SJacky Bai /* Enable CSU NS access permission */ 104*58fdd608SJacky Bai for (i = 0; i < 64; i++) { 105*58fdd608SJacky Bai mmio_write_32(IMX_CSU_BASE + i * 4, 0x00ff00ff); 106*58fdd608SJacky Bai } 107*58fdd608SJacky Bai 108*58fdd608SJacky Bai imx_aipstz_init(aipstz); 109*58fdd608SJacky Bai 110*58fdd608SJacky Bai imx_rdc_init(rdc); 111*58fdd608SJacky Bai 112*58fdd608SJacky Bai imx8m_caam_init(); 113*58fdd608SJacky Bai 114*58fdd608SJacky Bai console_imx_uart_register(IMX_BOOT_UART_BASE, IMX_BOOT_UART_CLK_IN_HZ, 115*58fdd608SJacky Bai IMX_CONSOLE_BAUDRATE, &console); 116*58fdd608SJacky Bai /* This console is only used for boot stage */ 117*58fdd608SJacky Bai console_set_scope(&console, CONSOLE_FLAG_BOOT); 118*58fdd608SJacky Bai 119*58fdd608SJacky Bai /* 120*58fdd608SJacky Bai * tell BL3-1 where the non-secure software image is located 121*58fdd608SJacky Bai * and the entry state information. 122*58fdd608SJacky Bai */ 123*58fdd608SJacky Bai bl33_image_ep_info.pc = PLAT_NS_IMAGE_OFFSET; 124*58fdd608SJacky Bai bl33_image_ep_info.spsr = get_spsr_for_bl33_entry(); 125*58fdd608SJacky Bai SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE); 126*58fdd608SJacky Bai 127*58fdd608SJacky Bai #ifdef SPD_opteed 128*58fdd608SJacky Bai /* Populate entry point information for BL32 */ 129*58fdd608SJacky Bai SET_PARAM_HEAD(&bl32_image_ep_info, PARAM_EP, VERSION_1, 0); 130*58fdd608SJacky Bai SET_SECURITY_STATE(bl32_image_ep_info.h.attr, SECURE); 131*58fdd608SJacky Bai bl32_image_ep_info.pc = BL32_BASE; 132*58fdd608SJacky Bai bl32_image_ep_info.spsr = 0; 133*58fdd608SJacky Bai 134*58fdd608SJacky Bai /* Pass TEE base and size to bl33 */ 135*58fdd608SJacky Bai bl33_image_ep_info.args.arg1 = BL32_BASE; 136*58fdd608SJacky Bai bl33_image_ep_info.args.arg2 = BL32_SIZE; 137*58fdd608SJacky Bai #endif 138*58fdd608SJacky Bai 139*58fdd608SJacky Bai bl31_tzc380_setup(); 140*58fdd608SJacky Bai } 141*58fdd608SJacky Bai 142*58fdd608SJacky Bai void bl31_plat_arch_setup(void) 143*58fdd608SJacky Bai { 144*58fdd608SJacky Bai mmap_add_region(BL31_BASE, BL31_BASE, (BL31_LIMIT - BL31_BASE), 145*58fdd608SJacky Bai MT_MEMORY | MT_RW | MT_SECURE); 146*58fdd608SJacky Bai mmap_add_region(BL_CODE_BASE, BL_CODE_BASE, (BL_CODE_END - BL_CODE_BASE), 147*58fdd608SJacky Bai MT_MEMORY | MT_RO | MT_SECURE); 148*58fdd608SJacky Bai #if USE_COHERENT_MEM 149*58fdd608SJacky Bai mmap_add_region(BL_COHERENT_RAM_BASE, BL_COHERENT_RAM_BASE, 150*58fdd608SJacky Bai (BL_COHERENT_RAM_END - BL_COHERENT_RAM_BASE), 151*58fdd608SJacky Bai MT_DEVICE | MT_RW | MT_SECURE); 152*58fdd608SJacky Bai #endif 153*58fdd608SJacky Bai mmap_add(imx_mmap); 154*58fdd608SJacky Bai 155*58fdd608SJacky Bai init_xlat_tables(); 156*58fdd608SJacky Bai 157*58fdd608SJacky Bai enable_mmu_el3(0); 158*58fdd608SJacky Bai } 159*58fdd608SJacky Bai 160*58fdd608SJacky Bai void bl31_platform_setup(void) 161*58fdd608SJacky Bai { 162*58fdd608SJacky Bai generic_delay_timer_init(); 163*58fdd608SJacky Bai 164*58fdd608SJacky Bai /* select the CKIL source to 32K OSC */ 165*58fdd608SJacky Bai mmio_write_32(IMX_ANAMIX_BASE + ANAMIX_MISC_CTL, 0x1); 166*58fdd608SJacky Bai 167*58fdd608SJacky Bai plat_gic_driver_init(); 168*58fdd608SJacky Bai plat_gic_init(); 169*58fdd608SJacky Bai 170*58fdd608SJacky Bai imx_gpc_init(); 171*58fdd608SJacky Bai } 172*58fdd608SJacky Bai 173*58fdd608SJacky Bai entry_point_info_t *bl31_plat_get_next_image_ep_info(unsigned int type) 174*58fdd608SJacky Bai { 175*58fdd608SJacky Bai if (type == NON_SECURE) 176*58fdd608SJacky Bai return &bl33_image_ep_info; 177*58fdd608SJacky Bai if (type == SECURE) 178*58fdd608SJacky Bai return &bl32_image_ep_info; 179*58fdd608SJacky Bai 180*58fdd608SJacky Bai return NULL; 181*58fdd608SJacky Bai } 182*58fdd608SJacky Bai 183*58fdd608SJacky Bai unsigned int plat_get_syscnt_freq2(void) 184*58fdd608SJacky Bai { 185*58fdd608SJacky Bai return COUNTER_FREQUENCY; 186*58fdd608SJacky Bai } 187