xref: /rk3399_ARM-atf/plat/mediatek/mt8183/bl31_plat_setup.c (revision 3fa9dec43dbf1d8862d2e6c16dfac5fe6d8d317c)
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