1*3fa9dec4Skenny liang /* 2*3fa9dec4Skenny liang * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved. 3*3fa9dec4Skenny liang * 4*3fa9dec4Skenny liang * SPDX-License-Identifier: BSD-3-Clause 5*3fa9dec4Skenny liang */ 6*3fa9dec4Skenny liang 7*3fa9dec4Skenny liang #include <assert.h> 8*3fa9dec4Skenny liang #include <arch_helpers.h> 9*3fa9dec4Skenny liang #include <common/bl_common.h> 10*3fa9dec4Skenny liang #include <plat/common/common_def.h> 11*3fa9dec4Skenny liang #include <drivers/console.h> 12*3fa9dec4Skenny liang #include <common/debug.h> 13*3fa9dec4Skenny liang #include <drivers/generic_delay_timer.h> 14*3fa9dec4Skenny liang #include <mcucfg.h> 15*3fa9dec4Skenny liang #include <lib/mmio.h> 16*3fa9dec4Skenny liang #include <mtk_plat_common.h> 17*3fa9dec4Skenny liang #include <plat_debug.h> 18*3fa9dec4Skenny liang #include <plat_private.h> 19*3fa9dec4Skenny liang #include <platform_def.h> 20*3fa9dec4Skenny liang #include <scu.h> 21*3fa9dec4Skenny liang #include <drivers/ti/uart/uart_16550.h> 22*3fa9dec4Skenny liang 23*3fa9dec4Skenny liang static entry_point_info_t bl32_ep_info; 24*3fa9dec4Skenny liang static entry_point_info_t bl33_ep_info; 25*3fa9dec4Skenny liang 26*3fa9dec4Skenny liang static void platform_setup_cpu(void) 27*3fa9dec4Skenny liang { 28*3fa9dec4Skenny liang mmio_write_32((uintptr_t)&mt8183_mcucfg->mp0_rw_rsvd0, 0x00000001); 29*3fa9dec4Skenny liang 30*3fa9dec4Skenny liang VERBOSE("addr of cci_adb400_dcm_config: 0x%x\n", 31*3fa9dec4Skenny liang mmio_read_32((uintptr_t)&mt8183_mcucfg->cci_adb400_dcm_config)); 32*3fa9dec4Skenny liang VERBOSE("addr of sync_dcm_config: 0x%x\n", 33*3fa9dec4Skenny liang mmio_read_32((uintptr_t)&mt8183_mcucfg->sync_dcm_config)); 34*3fa9dec4Skenny liang 35*3fa9dec4Skenny liang VERBOSE("mp0_spmc: 0x%x\n", 36*3fa9dec4Skenny liang mmio_read_32((uintptr_t)&mt8183_mcucfg->mp0_cputop_spmc_ctl)); 37*3fa9dec4Skenny liang VERBOSE("mp1_spmc: 0x%x\n", 38*3fa9dec4Skenny liang mmio_read_32((uintptr_t)&mt8183_mcucfg->mp1_cputop_spmc_ctl)); 39*3fa9dec4Skenny liang } 40*3fa9dec4Skenny liang 41*3fa9dec4Skenny liang /******************************************************************************* 42*3fa9dec4Skenny liang * Return a pointer to the 'entry_point_info' structure of the next image for 43*3fa9dec4Skenny liang * the security state specified. BL33 corresponds to the non-secure image type 44*3fa9dec4Skenny liang * while BL32 corresponds to the secure image type. A NULL pointer is returned 45*3fa9dec4Skenny liang * if the image does not exist. 46*3fa9dec4Skenny liang ******************************************************************************/ 47*3fa9dec4Skenny liang entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type) 48*3fa9dec4Skenny liang { 49*3fa9dec4Skenny liang entry_point_info_t *next_image_info; 50*3fa9dec4Skenny liang 51*3fa9dec4Skenny liang next_image_info = (type == NON_SECURE) ? &bl33_ep_info : &bl32_ep_info; 52*3fa9dec4Skenny liang 53*3fa9dec4Skenny liang /* None of the images on this platform can have 0x0 as the entrypoint */ 54*3fa9dec4Skenny liang if (next_image_info->pc) 55*3fa9dec4Skenny liang return next_image_info; 56*3fa9dec4Skenny liang else 57*3fa9dec4Skenny liang return NULL; 58*3fa9dec4Skenny liang } 59*3fa9dec4Skenny liang 60*3fa9dec4Skenny liang /******************************************************************************* 61*3fa9dec4Skenny liang * Perform any BL31 early platform setup. Here is an opportunity to copy 62*3fa9dec4Skenny liang * parameters passed by the calling EL (S-EL1 in BL2 & S-EL3 in BL1) before they 63*3fa9dec4Skenny liang * are lost (potentially). This needs to be done before the MMU is initialized 64*3fa9dec4Skenny liang * so that the memory layout can be used while creating page tables. 65*3fa9dec4Skenny liang * BL2 has flushed this information to memory, so we are guaranteed to pick up 66*3fa9dec4Skenny liang * good data. 67*3fa9dec4Skenny liang ******************************************************************************/ 68*3fa9dec4Skenny liang void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, 69*3fa9dec4Skenny liang u_register_t arg2, u_register_t arg3) 70*3fa9dec4Skenny liang { 71*3fa9dec4Skenny liang struct mtk_bl31_params *arg_from_bl2 = (struct mtk_bl31_params *)arg0; 72*3fa9dec4Skenny liang 73*3fa9dec4Skenny liang static console_16550_t console; 74*3fa9dec4Skenny liang console_16550_register(UART0_BASE, UART_CLOCK, UART_BAUDRATE, &console); 75*3fa9dec4Skenny liang 76*3fa9dec4Skenny liang NOTICE("MT8183 bl31_setup\n"); 77*3fa9dec4Skenny liang 78*3fa9dec4Skenny liang assert(arg_from_bl2 != NULL); 79*3fa9dec4Skenny liang assert(arg_from_bl2->h.type == PARAM_BL31); 80*3fa9dec4Skenny liang assert(arg_from_bl2->h.version >= VERSION_1); 81*3fa9dec4Skenny liang 82*3fa9dec4Skenny liang bl32_ep_info = *arg_from_bl2->bl32_ep_info; 83*3fa9dec4Skenny liang bl33_ep_info = *arg_from_bl2->bl33_ep_info; 84*3fa9dec4Skenny liang } 85*3fa9dec4Skenny liang 86*3fa9dec4Skenny liang 87*3fa9dec4Skenny liang /******************************************************************************* 88*3fa9dec4Skenny liang * Perform any BL31 platform setup code 89*3fa9dec4Skenny liang ******************************************************************************/ 90*3fa9dec4Skenny liang void bl31_platform_setup(void) 91*3fa9dec4Skenny liang { 92*3fa9dec4Skenny liang platform_setup_cpu(); 93*3fa9dec4Skenny liang generic_delay_timer_init(); 94*3fa9dec4Skenny liang } 95*3fa9dec4Skenny liang 96*3fa9dec4Skenny liang /******************************************************************************* 97*3fa9dec4Skenny liang * Perform the very early platform specific architectural setup here. At the 98*3fa9dec4Skenny liang * moment this is only intializes the mmu in a quick and dirty way. 99*3fa9dec4Skenny liang ******************************************************************************/ 100*3fa9dec4Skenny liang void bl31_plat_arch_setup(void) 101*3fa9dec4Skenny liang { 102*3fa9dec4Skenny liang enable_scu(read_mpidr()); 103*3fa9dec4Skenny liang 104*3fa9dec4Skenny liang plat_configure_mmu_el3(BL_CODE_BASE, 105*3fa9dec4Skenny liang BL_COHERENT_RAM_END - BL_CODE_BASE, 106*3fa9dec4Skenny liang BL_CODE_BASE, 107*3fa9dec4Skenny liang BL_CODE_END, 108*3fa9dec4Skenny liang BL_COHERENT_RAM_BASE, 109*3fa9dec4Skenny liang BL_COHERENT_RAM_END); 110*3fa9dec4Skenny liang } 111