xref: /rk3399_ARM-atf/plat/rockchip/common/sp_min_plat_setup.c (revision 82e18f89982141f1f3a0f493d15f99bfc874ffd3)
1*82e18f89SHeiko Stuebner /*
2*82e18f89SHeiko Stuebner  * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
3*82e18f89SHeiko Stuebner  *
4*82e18f89SHeiko Stuebner  * SPDX-License-Identifier: BSD-3-Clause
5*82e18f89SHeiko Stuebner  */
6*82e18f89SHeiko Stuebner 
7*82e18f89SHeiko Stuebner #include <assert.h>
8*82e18f89SHeiko Stuebner 
9*82e18f89SHeiko Stuebner #include <platform_def.h>
10*82e18f89SHeiko Stuebner 
11*82e18f89SHeiko Stuebner #include <arch_helpers.h>
12*82e18f89SHeiko Stuebner #include <common/bl_common.h>
13*82e18f89SHeiko Stuebner #include <common/debug.h>
14*82e18f89SHeiko Stuebner #include <drivers/console.h>
15*82e18f89SHeiko Stuebner #include <drivers/generic_delay_timer.h>
16*82e18f89SHeiko Stuebner #include <drivers/ti/uart/uart_16550.h>
17*82e18f89SHeiko Stuebner #include <lib/coreboot.h>
18*82e18f89SHeiko Stuebner #include <lib/mmio.h>
19*82e18f89SHeiko Stuebner #include <plat_private.h>
20*82e18f89SHeiko Stuebner #include <plat/common/platform.h>
21*82e18f89SHeiko Stuebner 
22*82e18f89SHeiko Stuebner static entry_point_info_t bl33_ep_info;
23*82e18f89SHeiko Stuebner 
24*82e18f89SHeiko Stuebner /*******************************************************************************
25*82e18f89SHeiko Stuebner  * Return a pointer to the 'entry_point_info' structure of the next image for
26*82e18f89SHeiko Stuebner  * the security state specified. BL33 corresponds to the non-secure image type.
27*82e18f89SHeiko Stuebner  * A NULL pointer is returned if the image does not exist.
28*82e18f89SHeiko Stuebner  ******************************************************************************/
29*82e18f89SHeiko Stuebner entry_point_info_t *sp_min_plat_get_bl33_ep_info(void)
30*82e18f89SHeiko Stuebner {
31*82e18f89SHeiko Stuebner 	entry_point_info_t *next_image_info;
32*82e18f89SHeiko Stuebner 
33*82e18f89SHeiko Stuebner 	next_image_info = &bl33_ep_info;
34*82e18f89SHeiko Stuebner 
35*82e18f89SHeiko Stuebner 	if (next_image_info->pc == 0U) {
36*82e18f89SHeiko Stuebner 		return NULL;
37*82e18f89SHeiko Stuebner 	}
38*82e18f89SHeiko Stuebner 
39*82e18f89SHeiko Stuebner 	return next_image_info;
40*82e18f89SHeiko Stuebner }
41*82e18f89SHeiko Stuebner 
42*82e18f89SHeiko Stuebner #pragma weak params_early_setup
43*82e18f89SHeiko Stuebner void params_early_setup(void *plat_param_from_bl2)
44*82e18f89SHeiko Stuebner {
45*82e18f89SHeiko Stuebner }
46*82e18f89SHeiko Stuebner 
47*82e18f89SHeiko Stuebner unsigned int plat_is_my_cpu_primary(void);
48*82e18f89SHeiko Stuebner 
49*82e18f89SHeiko Stuebner /*******************************************************************************
50*82e18f89SHeiko Stuebner  * Perform any BL32 specific platform actions.
51*82e18f89SHeiko Stuebner  ******************************************************************************/
52*82e18f89SHeiko Stuebner void sp_min_early_platform_setup2(u_register_t arg0, u_register_t arg1,
53*82e18f89SHeiko Stuebner 				  u_register_t arg2, u_register_t arg3)
54*82e18f89SHeiko Stuebner {
55*82e18f89SHeiko Stuebner 	static console_16550_t console;
56*82e18f89SHeiko Stuebner 	struct rockchip_bl31_params *arg_from_bl2 = (struct rockchip_bl31_params *) arg0;
57*82e18f89SHeiko Stuebner 	void *plat_params_from_bl2 = (void *) arg1;
58*82e18f89SHeiko Stuebner 
59*82e18f89SHeiko Stuebner 	params_early_setup(plat_params_from_bl2);
60*82e18f89SHeiko Stuebner 
61*82e18f89SHeiko Stuebner #if COREBOOT
62*82e18f89SHeiko Stuebner 	if (coreboot_serial.type)
63*82e18f89SHeiko Stuebner 		console_16550_register(coreboot_serial.baseaddr,
64*82e18f89SHeiko Stuebner 				       coreboot_serial.input_hertz,
65*82e18f89SHeiko Stuebner 				       coreboot_serial.baud,
66*82e18f89SHeiko Stuebner 				       &console);
67*82e18f89SHeiko Stuebner #else
68*82e18f89SHeiko Stuebner 	console_16550_register(PLAT_RK_UART_BASE, PLAT_RK_UART_CLOCK,
69*82e18f89SHeiko Stuebner 			       PLAT_RK_UART_BAUDRATE, &console);
70*82e18f89SHeiko Stuebner #endif
71*82e18f89SHeiko Stuebner 	VERBOSE("sp_min_setup\n");
72*82e18f89SHeiko Stuebner 
73*82e18f89SHeiko Stuebner 	/* Passing a NULL context is a critical programming error */
74*82e18f89SHeiko Stuebner 	assert(arg_from_bl2);
75*82e18f89SHeiko Stuebner 
76*82e18f89SHeiko Stuebner 	assert(arg_from_bl2->h.type == PARAM_BL31);
77*82e18f89SHeiko Stuebner 	assert(arg_from_bl2->h.version >= VERSION_1);
78*82e18f89SHeiko Stuebner 
79*82e18f89SHeiko Stuebner 	bl33_ep_info = *arg_from_bl2->bl33_ep_info;
80*82e18f89SHeiko Stuebner }
81*82e18f89SHeiko Stuebner 
82*82e18f89SHeiko Stuebner /*******************************************************************************
83*82e18f89SHeiko Stuebner  * Perform any sp_min platform setup code
84*82e18f89SHeiko Stuebner  ******************************************************************************/
85*82e18f89SHeiko Stuebner void sp_min_platform_setup(void)
86*82e18f89SHeiko Stuebner {
87*82e18f89SHeiko Stuebner 	generic_delay_timer_init();
88*82e18f89SHeiko Stuebner 	plat_rockchip_soc_init();
89*82e18f89SHeiko Stuebner 
90*82e18f89SHeiko Stuebner 	/* Initialize the gic cpu and distributor interfaces */
91*82e18f89SHeiko Stuebner 	plat_rockchip_gic_driver_init();
92*82e18f89SHeiko Stuebner 	plat_rockchip_gic_init();
93*82e18f89SHeiko Stuebner 	plat_rockchip_pmu_init();
94*82e18f89SHeiko Stuebner }
95*82e18f89SHeiko Stuebner 
96*82e18f89SHeiko Stuebner /*******************************************************************************
97*82e18f89SHeiko Stuebner  * Perform the very early platform specific architectural setup here. At the
98*82e18f89SHeiko Stuebner  * moment this is only intializes the mmu in a quick and dirty way.
99*82e18f89SHeiko Stuebner  ******************************************************************************/
100*82e18f89SHeiko Stuebner void sp_min_plat_arch_setup(void)
101*82e18f89SHeiko Stuebner {
102*82e18f89SHeiko Stuebner 	plat_cci_init();
103*82e18f89SHeiko Stuebner 	plat_cci_enable();
104*82e18f89SHeiko Stuebner 
105*82e18f89SHeiko Stuebner 	plat_configure_mmu_svc_mon(BL_CODE_BASE,
106*82e18f89SHeiko Stuebner 				   BL_COHERENT_RAM_END - BL_CODE_BASE,
107*82e18f89SHeiko Stuebner 				   BL_CODE_BASE,
108*82e18f89SHeiko Stuebner 				   BL_CODE_END,
109*82e18f89SHeiko Stuebner 				   BL_COHERENT_RAM_BASE,
110*82e18f89SHeiko Stuebner 				   BL_COHERENT_RAM_END);
111*82e18f89SHeiko Stuebner }
112*82e18f89SHeiko Stuebner 
113*82e18f89SHeiko Stuebner void sp_min_plat_fiq_handler(uint32_t id)
114*82e18f89SHeiko Stuebner {
115*82e18f89SHeiko Stuebner 	VERBOSE("[sp_min] interrupt #%d\n", id);
116*82e18f89SHeiko Stuebner }
117