1*d8e919c7SMasahiro Yamada /* 2*d8e919c7SMasahiro Yamada * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. 3*d8e919c7SMasahiro Yamada * 4*d8e919c7SMasahiro Yamada * SPDX-License-Identifier: BSD-3-Clause 5*d8e919c7SMasahiro Yamada */ 6*d8e919c7SMasahiro Yamada 7*d8e919c7SMasahiro Yamada #include <arch.h> 8*d8e919c7SMasahiro Yamada #include <assert.h> 9*d8e919c7SMasahiro Yamada #include <bl_common.h> 10*d8e919c7SMasahiro Yamada #include <console.h> 11*d8e919c7SMasahiro Yamada #include <debug.h> 12*d8e919c7SMasahiro Yamada #include <errno.h> 13*d8e919c7SMasahiro Yamada #include <mmio.h> 14*d8e919c7SMasahiro Yamada #include <platform.h> 15*d8e919c7SMasahiro Yamada #include <platform_def.h> 16*d8e919c7SMasahiro Yamada #include <xlat_mmu_helpers.h> 17*d8e919c7SMasahiro Yamada 18*d8e919c7SMasahiro Yamada #include "uniphier.h" 19*d8e919c7SMasahiro Yamada 20*d8e919c7SMasahiro Yamada #define BL31_END (unsigned long)(&__BL31_END__) 21*d8e919c7SMasahiro Yamada #define BL31_SIZE ((BL31_END) - (BL31_BASE)) 22*d8e919c7SMasahiro Yamada 23*d8e919c7SMasahiro Yamada static entry_point_info_t bl32_image_ep_info; 24*d8e919c7SMasahiro Yamada static entry_point_info_t bl33_image_ep_info; 25*d8e919c7SMasahiro Yamada 26*d8e919c7SMasahiro Yamada entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type) 27*d8e919c7SMasahiro Yamada { 28*d8e919c7SMasahiro Yamada assert(sec_state_is_valid(type)); 29*d8e919c7SMasahiro Yamada return type == NON_SECURE ? &bl33_image_ep_info : &bl32_image_ep_info; 30*d8e919c7SMasahiro Yamada } 31*d8e919c7SMasahiro Yamada 32*d8e919c7SMasahiro Yamada void bl31_early_platform_setup(void *from_bl2, void *plat_params_from_bl2) 33*d8e919c7SMasahiro Yamada { 34*d8e919c7SMasahiro Yamada bl_params_node_t *bl_params = ((bl_params_t *)from_bl2)->head; 35*d8e919c7SMasahiro Yamada 36*d8e919c7SMasahiro Yamada uniphier_console_setup(); 37*d8e919c7SMasahiro Yamada 38*d8e919c7SMasahiro Yamada while (bl_params) { 39*d8e919c7SMasahiro Yamada if (bl_params->image_id == BL32_IMAGE_ID) 40*d8e919c7SMasahiro Yamada bl32_image_ep_info = *bl_params->ep_info; 41*d8e919c7SMasahiro Yamada 42*d8e919c7SMasahiro Yamada if (bl_params->image_id == BL33_IMAGE_ID) 43*d8e919c7SMasahiro Yamada bl33_image_ep_info = *bl_params->ep_info; 44*d8e919c7SMasahiro Yamada 45*d8e919c7SMasahiro Yamada bl_params = bl_params->next_params_info; 46*d8e919c7SMasahiro Yamada } 47*d8e919c7SMasahiro Yamada 48*d8e919c7SMasahiro Yamada if (bl33_image_ep_info.pc == 0) 49*d8e919c7SMasahiro Yamada panic(); 50*d8e919c7SMasahiro Yamada } 51*d8e919c7SMasahiro Yamada 52*d8e919c7SMasahiro Yamada #define UNIPHIER_SYS_CNTCTL_BASE 0x60E00000 53*d8e919c7SMasahiro Yamada 54*d8e919c7SMasahiro Yamada void bl31_platform_setup(void) 55*d8e919c7SMasahiro Yamada { 56*d8e919c7SMasahiro Yamada unsigned int soc; 57*d8e919c7SMasahiro Yamada 58*d8e919c7SMasahiro Yamada soc = uniphier_get_soc_id(); 59*d8e919c7SMasahiro Yamada if (soc == UNIPHIER_SOC_UNKNOWN) { 60*d8e919c7SMasahiro Yamada ERROR("unsupported SoC\n"); 61*d8e919c7SMasahiro Yamada plat_error_handler(-ENOTSUP); 62*d8e919c7SMasahiro Yamada } 63*d8e919c7SMasahiro Yamada 64*d8e919c7SMasahiro Yamada uniphier_cci_init(soc); 65*d8e919c7SMasahiro Yamada uniphier_cci_enable(); 66*d8e919c7SMasahiro Yamada 67*d8e919c7SMasahiro Yamada /* Initialize the GIC driver, cpu and distributor interfaces */ 68*d8e919c7SMasahiro Yamada uniphier_gic_driver_init(soc); 69*d8e919c7SMasahiro Yamada uniphier_gic_init(); 70*d8e919c7SMasahiro Yamada 71*d8e919c7SMasahiro Yamada /* Enable and initialize the System level generic timer */ 72*d8e919c7SMasahiro Yamada mmio_write_32(UNIPHIER_SYS_CNTCTL_BASE + CNTCR_OFF, 73*d8e919c7SMasahiro Yamada CNTCR_FCREQ(0) | CNTCR_EN); 74*d8e919c7SMasahiro Yamada } 75*d8e919c7SMasahiro Yamada 76*d8e919c7SMasahiro Yamada void bl31_plat_arch_setup(void) 77*d8e919c7SMasahiro Yamada { 78*d8e919c7SMasahiro Yamada uniphier_mmap_setup(BL31_BASE, BL31_SIZE, NULL); 79*d8e919c7SMasahiro Yamada enable_mmu_el3(0); 80*d8e919c7SMasahiro Yamada } 81*d8e919c7SMasahiro Yamada 82*d8e919c7SMasahiro Yamada void bl31_plat_runtime_setup(void) 83*d8e919c7SMasahiro Yamada { 84*d8e919c7SMasahiro Yamada /* Suppress any runtime logs unless DEBUG is defined */ 85*d8e919c7SMasahiro Yamada #if !DEBUG 86*d8e919c7SMasahiro Yamada console_uninit(); 87*d8e919c7SMasahiro Yamada #endif 88*d8e919c7SMasahiro Yamada } 89