182e18f89SHeiko Stuebner /* 282e18f89SHeiko Stuebner * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved. 382e18f89SHeiko Stuebner * 482e18f89SHeiko Stuebner * SPDX-License-Identifier: BSD-3-Clause 582e18f89SHeiko Stuebner */ 682e18f89SHeiko Stuebner 782e18f89SHeiko Stuebner #include <assert.h> 882e18f89SHeiko Stuebner 982e18f89SHeiko Stuebner #include <platform_def.h> 1082e18f89SHeiko Stuebner 1182e18f89SHeiko Stuebner #include <arch_helpers.h> 1282e18f89SHeiko Stuebner #include <common/bl_common.h> 1382e18f89SHeiko Stuebner #include <common/debug.h> 1482e18f89SHeiko Stuebner #include <drivers/console.h> 1582e18f89SHeiko Stuebner #include <drivers/generic_delay_timer.h> 1682e18f89SHeiko Stuebner #include <drivers/ti/uart/uart_16550.h> 1782e18f89SHeiko Stuebner #include <lib/coreboot.h> 1882e18f89SHeiko Stuebner #include <lib/mmio.h> 1982e18f89SHeiko Stuebner #include <plat_private.h> 2082e18f89SHeiko Stuebner #include <plat/common/platform.h> 2182e18f89SHeiko Stuebner 2282e18f89SHeiko Stuebner static entry_point_info_t bl33_ep_info; 2382e18f89SHeiko Stuebner 2482e18f89SHeiko Stuebner /******************************************************************************* 2582e18f89SHeiko Stuebner * Return a pointer to the 'entry_point_info' structure of the next image for 2682e18f89SHeiko Stuebner * the security state specified. BL33 corresponds to the non-secure image type. 2782e18f89SHeiko Stuebner * A NULL pointer is returned if the image does not exist. 2882e18f89SHeiko Stuebner ******************************************************************************/ 2982e18f89SHeiko Stuebner entry_point_info_t *sp_min_plat_get_bl33_ep_info(void) 3082e18f89SHeiko Stuebner { 3182e18f89SHeiko Stuebner entry_point_info_t *next_image_info; 3282e18f89SHeiko Stuebner 3382e18f89SHeiko Stuebner next_image_info = &bl33_ep_info; 3482e18f89SHeiko Stuebner 3582e18f89SHeiko Stuebner if (next_image_info->pc == 0U) { 3682e18f89SHeiko Stuebner return NULL; 3782e18f89SHeiko Stuebner } 3882e18f89SHeiko Stuebner 3982e18f89SHeiko Stuebner return next_image_info; 4082e18f89SHeiko Stuebner } 4182e18f89SHeiko Stuebner 4282e18f89SHeiko Stuebner #pragma weak params_early_setup 4382e18f89SHeiko Stuebner void params_early_setup(void *plat_param_from_bl2) 4482e18f89SHeiko Stuebner { 4582e18f89SHeiko Stuebner } 4682e18f89SHeiko Stuebner 4782e18f89SHeiko Stuebner unsigned int plat_is_my_cpu_primary(void); 4882e18f89SHeiko Stuebner 4982e18f89SHeiko Stuebner /******************************************************************************* 5082e18f89SHeiko Stuebner * Perform any BL32 specific platform actions. 5182e18f89SHeiko Stuebner ******************************************************************************/ 5282e18f89SHeiko Stuebner void sp_min_early_platform_setup2(u_register_t arg0, u_register_t arg1, 5382e18f89SHeiko Stuebner u_register_t arg2, u_register_t arg3) 5482e18f89SHeiko Stuebner { 5582e18f89SHeiko Stuebner static console_16550_t console; 5682e18f89SHeiko Stuebner struct rockchip_bl31_params *arg_from_bl2 = (struct rockchip_bl31_params *) arg0; 5782e18f89SHeiko Stuebner void *plat_params_from_bl2 = (void *) arg1; 5882e18f89SHeiko Stuebner 5982e18f89SHeiko Stuebner params_early_setup(plat_params_from_bl2); 6082e18f89SHeiko Stuebner 6182e18f89SHeiko Stuebner #if COREBOOT 6282e18f89SHeiko Stuebner if (coreboot_serial.type) 6382e18f89SHeiko Stuebner console_16550_register(coreboot_serial.baseaddr, 6482e18f89SHeiko Stuebner coreboot_serial.input_hertz, 6582e18f89SHeiko Stuebner coreboot_serial.baud, 6682e18f89SHeiko Stuebner &console); 6782e18f89SHeiko Stuebner #else 68*220c33a2SChristoph Müllner console_16550_register(rockchip_get_uart_base(), PLAT_RK_UART_CLOCK, 6982e18f89SHeiko Stuebner PLAT_RK_UART_BAUDRATE, &console); 7082e18f89SHeiko Stuebner #endif 7182e18f89SHeiko Stuebner VERBOSE("sp_min_setup\n"); 7282e18f89SHeiko Stuebner 7382e18f89SHeiko Stuebner /* Passing a NULL context is a critical programming error */ 7482e18f89SHeiko Stuebner assert(arg_from_bl2); 7582e18f89SHeiko Stuebner 7682e18f89SHeiko Stuebner assert(arg_from_bl2->h.type == PARAM_BL31); 7782e18f89SHeiko Stuebner assert(arg_from_bl2->h.version >= VERSION_1); 7882e18f89SHeiko Stuebner 7982e18f89SHeiko Stuebner bl33_ep_info = *arg_from_bl2->bl33_ep_info; 8082e18f89SHeiko Stuebner } 8182e18f89SHeiko Stuebner 8282e18f89SHeiko Stuebner /******************************************************************************* 8382e18f89SHeiko Stuebner * Perform any sp_min platform setup code 8482e18f89SHeiko Stuebner ******************************************************************************/ 8582e18f89SHeiko Stuebner void sp_min_platform_setup(void) 8682e18f89SHeiko Stuebner { 8782e18f89SHeiko Stuebner generic_delay_timer_init(); 8882e18f89SHeiko Stuebner plat_rockchip_soc_init(); 8982e18f89SHeiko Stuebner 9082e18f89SHeiko Stuebner /* Initialize the gic cpu and distributor interfaces */ 9182e18f89SHeiko Stuebner plat_rockchip_gic_driver_init(); 9282e18f89SHeiko Stuebner plat_rockchip_gic_init(); 9382e18f89SHeiko Stuebner plat_rockchip_pmu_init(); 9482e18f89SHeiko Stuebner } 9582e18f89SHeiko Stuebner 9682e18f89SHeiko Stuebner /******************************************************************************* 9782e18f89SHeiko Stuebner * Perform the very early platform specific architectural setup here. At the 9882e18f89SHeiko Stuebner * moment this is only intializes the mmu in a quick and dirty way. 9982e18f89SHeiko Stuebner ******************************************************************************/ 10082e18f89SHeiko Stuebner void sp_min_plat_arch_setup(void) 10182e18f89SHeiko Stuebner { 10282e18f89SHeiko Stuebner plat_cci_init(); 10382e18f89SHeiko Stuebner plat_cci_enable(); 10482e18f89SHeiko Stuebner 10582e18f89SHeiko Stuebner plat_configure_mmu_svc_mon(BL_CODE_BASE, 10682e18f89SHeiko Stuebner BL_COHERENT_RAM_END - BL_CODE_BASE, 10782e18f89SHeiko Stuebner BL_CODE_BASE, 10882e18f89SHeiko Stuebner BL_CODE_END, 10982e18f89SHeiko Stuebner BL_COHERENT_RAM_BASE, 11082e18f89SHeiko Stuebner BL_COHERENT_RAM_END); 11182e18f89SHeiko Stuebner } 11282e18f89SHeiko Stuebner 11382e18f89SHeiko Stuebner void sp_min_plat_fiq_handler(uint32_t id) 11482e18f89SHeiko Stuebner { 11582e18f89SHeiko Stuebner VERBOSE("[sp_min] interrupt #%d\n", id); 11682e18f89SHeiko Stuebner } 117