16fba6e04STony Xie /* 29f85f9e3SJoel Hutton * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved. 36fba6e04STony Xie * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 56fba6e04STony Xie */ 66fba6e04STony Xie 76fba6e04STony Xie #include <assert.h> 809d40e0eSAntonio Nino Diaz 96fba6e04STony Xie #include <platform_def.h> 1009d40e0eSAntonio Nino Diaz 1109d40e0eSAntonio Nino Diaz #include <common/bl_common.h> 1209d40e0eSAntonio Nino Diaz #include <common/debug.h> 1309d40e0eSAntonio Nino Diaz #include <drivers/console.h> 1409d40e0eSAntonio Nino Diaz #include <drivers/generic_delay_timer.h> 1509d40e0eSAntonio Nino Diaz #include <drivers/ti/uart/uart_16550.h> 1609d40e0eSAntonio Nino Diaz #include <lib/coreboot.h> 1709d40e0eSAntonio Nino Diaz #include <lib/mmio.h> 1809d40e0eSAntonio Nino Diaz #include <plat_private.h> 1909d40e0eSAntonio Nino Diaz #include <plat/common/platform.h> 206fba6e04STony Xie 216fba6e04STony Xie /* 226fba6e04STony Xie * The next 2 constants identify the extents of the code & RO data region. 236fba6e04STony Xie * These addresses are used by the MMU setup code and therefore they must be 246fba6e04STony Xie * page-aligned. It is the responsibility of the linker script to ensure that 256fba6e04STony Xie * __RO_START__ and __RO_END__ linker symbols refer to page-aligned addresses. 266fba6e04STony Xie */ 279f85f9e3SJoel Hutton IMPORT_SYM(unsigned long, __RO_START__, BL31_RO_BASE); 289f85f9e3SJoel Hutton IMPORT_SYM(unsigned long, __RO_END__, BL31_RO_LIMIT); 296fba6e04STony Xie 306fba6e04STony Xie static entry_point_info_t bl32_ep_info; 316fba6e04STony Xie static entry_point_info_t bl33_ep_info; 326fba6e04STony Xie 336fba6e04STony Xie /******************************************************************************* 346fba6e04STony Xie * Return a pointer to the 'entry_point_info' structure of the next image for 356fba6e04STony Xie * the security state specified. BL33 corresponds to the non-secure image type 366fba6e04STony Xie * while BL32 corresponds to the secure image type. A NULL pointer is returned 376fba6e04STony Xie * if the image does not exist. 386fba6e04STony Xie ******************************************************************************/ 396fba6e04STony Xie entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type) 406fba6e04STony Xie { 416fba6e04STony Xie entry_point_info_t *next_image_info; 426fba6e04STony Xie 436fba6e04STony Xie next_image_info = (type == NON_SECURE) ? &bl33_ep_info : &bl32_ep_info; 446fba6e04STony Xie 456fba6e04STony Xie /* None of the images on this platform can have 0x0 as the entrypoint */ 466fba6e04STony Xie if (next_image_info->pc) 476fba6e04STony Xie return next_image_info; 486fba6e04STony Xie else 496fba6e04STony Xie return NULL; 506fba6e04STony Xie } 516fba6e04STony Xie 520d5ec955Stony.xie #pragma weak params_early_setup 530d5ec955Stony.xie void params_early_setup(void *plat_param_from_bl2) 540d5ec955Stony.xie { 550d5ec955Stony.xie } 560d5ec955Stony.xie 576fba6e04STony Xie /******************************************************************************* 586fba6e04STony Xie * Perform any BL3-1 early platform setup. Here is an opportunity to copy 59a6238326SJohn Tsichritzis * parameters passed by the calling EL (S-EL1 in BL2 & EL3 in BL1) before they 606fba6e04STony Xie * are lost (potentially). This needs to be done before the MMU is initialized 616fba6e04STony Xie * so that the memory layout can be used while creating page tables. 626fba6e04STony Xie * BL2 has flushed this information to memory, so we are guaranteed to pick up 636fba6e04STony Xie * good data. 646fba6e04STony Xie ******************************************************************************/ 652d6f1f01SAntonio Nino Diaz void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, 662d6f1f01SAntonio Nino Diaz u_register_t arg2, u_register_t arg3) 676fba6e04STony Xie { 68890abc33SJulius Werner static console_16550_t console; 692d6f1f01SAntonio Nino Diaz struct rockchip_bl31_params *arg_from_bl2 = (struct rockchip_bl31_params *) arg0; 702d6f1f01SAntonio Nino Diaz void *plat_params_from_bl2 = (void *) arg1; 71890abc33SJulius Werner 723c250b9aSJulius Werner params_early_setup(plat_params_from_bl2); 733c250b9aSJulius Werner 743c250b9aSJulius Werner #if COREBOOT 753c250b9aSJulius Werner if (coreboot_serial.type) 76890abc33SJulius Werner console_16550_register(coreboot_serial.baseaddr, 77890abc33SJulius Werner coreboot_serial.input_hertz, 78890abc33SJulius Werner coreboot_serial.baud, 79890abc33SJulius Werner &console); 803c250b9aSJulius Werner #else 81*220c33a2SChristoph Müllner console_16550_register(rockchip_get_uart_base(), PLAT_RK_UART_CLOCK, 82890abc33SJulius Werner PLAT_RK_UART_BAUDRATE, &console); 833c250b9aSJulius Werner #endif 846fba6e04STony Xie 856fba6e04STony Xie VERBOSE("bl31_setup\n"); 866fba6e04STony Xie 876fba6e04STony Xie /* Passing a NULL context is a critical programming error */ 882d6f1f01SAntonio Nino Diaz assert(arg_from_bl2); 896fba6e04STony Xie 902d6f1f01SAntonio Nino Diaz assert(arg_from_bl2->h.type == PARAM_BL31); 912d6f1f01SAntonio Nino Diaz assert(arg_from_bl2->h.version >= VERSION_1); 926fba6e04STony Xie 932d6f1f01SAntonio Nino Diaz bl32_ep_info = *arg_from_bl2->bl32_ep_info; 942d6f1f01SAntonio Nino Diaz bl33_ep_info = *arg_from_bl2->bl33_ep_info; 956fba6e04STony Xie } 966fba6e04STony Xie 976fba6e04STony Xie /******************************************************************************* 986fba6e04STony Xie * Perform any BL3-1 platform setup code 996fba6e04STony Xie ******************************************************************************/ 1006fba6e04STony Xie void bl31_platform_setup(void) 1016fba6e04STony Xie { 1026704f425SAntonio Nino Diaz generic_delay_timer_init(); 1036fba6e04STony Xie plat_rockchip_soc_init(); 1046fba6e04STony Xie 1056fba6e04STony Xie /* Initialize the gic cpu and distributor interfaces */ 1066fba6e04STony Xie plat_rockchip_gic_driver_init(); 1076fba6e04STony Xie plat_rockchip_gic_init(); 1086fba6e04STony Xie plat_rockchip_pmu_init(); 1096fba6e04STony Xie } 1106fba6e04STony Xie 1116fba6e04STony Xie /******************************************************************************* 1126fba6e04STony Xie * Perform the very early platform specific architectural setup here. At the 1136fba6e04STony Xie * moment this is only intializes the mmu in a quick and dirty way. 1146fba6e04STony Xie ******************************************************************************/ 1156fba6e04STony Xie void bl31_plat_arch_setup(void) 1166fba6e04STony Xie { 1176fba6e04STony Xie plat_cci_init(); 1186fba6e04STony Xie plat_cci_enable(); 1196fba6e04STony Xie plat_configure_mmu_el3(BL31_RO_BASE, 12047497053SMasahiro Yamada BL_COHERENT_RAM_END - BL31_RO_BASE, 1216fba6e04STony Xie BL31_RO_BASE, 1226fba6e04STony Xie BL31_RO_LIMIT, 12347497053SMasahiro Yamada BL_COHERENT_RAM_BASE, 12447497053SMasahiro Yamada BL_COHERENT_RAM_END); 1256fba6e04STony Xie } 126