xref: /rk3399_ARM-atf/plat/imx/imx8m/imx8mp/imx8mp_bl2_el3_setup.c (revision caf8fdb712e3491737be2e75e3fb2c3390cf03e0)
1*75fbf554SYing-Chun Liu (PaulLiu) /*
2*75fbf554SYing-Chun Liu (PaulLiu)  * Copyright 2021 NXP
3*75fbf554SYing-Chun Liu (PaulLiu)  *
4*75fbf554SYing-Chun Liu (PaulLiu)  * SPDX-License-Identifier: BSD-3-Clause
5*75fbf554SYing-Chun Liu (PaulLiu)  */
6*75fbf554SYing-Chun Liu (PaulLiu) 
7*75fbf554SYing-Chun Liu (PaulLiu) #include <assert.h>
8*75fbf554SYing-Chun Liu (PaulLiu) #include <stdbool.h>
9*75fbf554SYing-Chun Liu (PaulLiu) 
10*75fbf554SYing-Chun Liu (PaulLiu) #include <arch_helpers.h>
11*75fbf554SYing-Chun Liu (PaulLiu) #include <common/bl_common.h>
12*75fbf554SYing-Chun Liu (PaulLiu) #include <common/debug.h>
13*75fbf554SYing-Chun Liu (PaulLiu) #include <common/desc_image_load.h>
14*75fbf554SYing-Chun Liu (PaulLiu) #include <common/tbbr/tbbr_img_def.h>
15*75fbf554SYing-Chun Liu (PaulLiu) #include <context.h>
16*75fbf554SYing-Chun Liu (PaulLiu) #include <drivers/arm/tzc380.h>
17*75fbf554SYing-Chun Liu (PaulLiu) #include <drivers/console.h>
18*75fbf554SYing-Chun Liu (PaulLiu) #include <drivers/generic_delay_timer.h>
19*75fbf554SYing-Chun Liu (PaulLiu) #include <drivers/mmc.h>
20*75fbf554SYing-Chun Liu (PaulLiu) #include <lib/el3_runtime/context_mgmt.h>
21*75fbf554SYing-Chun Liu (PaulLiu) #include <lib/mmio.h>
22*75fbf554SYing-Chun Liu (PaulLiu) #include <lib/optee_utils.h>
23*75fbf554SYing-Chun Liu (PaulLiu) #include <lib/xlat_tables/xlat_tables_v2.h>
24*75fbf554SYing-Chun Liu (PaulLiu) 
25*75fbf554SYing-Chun Liu (PaulLiu) #include <imx8m_caam.h>
26*75fbf554SYing-Chun Liu (PaulLiu) #include "imx8mp_private.h"
27*75fbf554SYing-Chun Liu (PaulLiu) #include <imx_aipstz.h>
28*75fbf554SYing-Chun Liu (PaulLiu) #include <imx_rdc.h>
29*75fbf554SYing-Chun Liu (PaulLiu) #include <imx_uart.h>
30*75fbf554SYing-Chun Liu (PaulLiu) #include <plat/common/platform.h>
31*75fbf554SYing-Chun Liu (PaulLiu) #include <plat_imx8.h>
32*75fbf554SYing-Chun Liu (PaulLiu) #include <platform_def.h>
33*75fbf554SYing-Chun Liu (PaulLiu) 
34*75fbf554SYing-Chun Liu (PaulLiu) 
35*75fbf554SYing-Chun Liu (PaulLiu) static const struct aipstz_cfg aipstz[] = {
36*75fbf554SYing-Chun Liu (PaulLiu) 	{IMX_AIPSTZ1, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, },
37*75fbf554SYing-Chun Liu (PaulLiu) 	{IMX_AIPSTZ2, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, },
38*75fbf554SYing-Chun Liu (PaulLiu) 	{IMX_AIPSTZ3, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, },
39*75fbf554SYing-Chun Liu (PaulLiu) 	{IMX_AIPSTZ4, 0x77777777, 0x77777777, .opacr = {0x0, 0x0, 0x0, 0x0, 0x0}, },
40*75fbf554SYing-Chun Liu (PaulLiu) 	{0},
41*75fbf554SYing-Chun Liu (PaulLiu) };
42*75fbf554SYing-Chun Liu (PaulLiu) 
bl2_el3_early_platform_setup(u_register_t arg0,u_register_t arg1,u_register_t arg2,u_register_t arg3)43*75fbf554SYing-Chun Liu (PaulLiu) void bl2_el3_early_platform_setup(u_register_t arg0, u_register_t arg1,
44*75fbf554SYing-Chun Liu (PaulLiu) 		u_register_t arg2, u_register_t arg3)
45*75fbf554SYing-Chun Liu (PaulLiu) {
46*75fbf554SYing-Chun Liu (PaulLiu) 	static console_t console;
47*75fbf554SYing-Chun Liu (PaulLiu) 	unsigned int i;
48*75fbf554SYing-Chun Liu (PaulLiu) 
49*75fbf554SYing-Chun Liu (PaulLiu) 	/* Enable CSU NS access permission */
50*75fbf554SYing-Chun Liu (PaulLiu) 	for (i = 0U; i < 64; i++) {
51*75fbf554SYing-Chun Liu (PaulLiu) 		mmio_write_32(IMX_CSU_BASE + i * 4, 0x00ff00ff);
52*75fbf554SYing-Chun Liu (PaulLiu) 	}
53*75fbf554SYing-Chun Liu (PaulLiu) 
54*75fbf554SYing-Chun Liu (PaulLiu) 	imx_aipstz_init(aipstz);
55*75fbf554SYing-Chun Liu (PaulLiu) 
56*75fbf554SYing-Chun Liu (PaulLiu) 	console_imx_uart_register(IMX_BOOT_UART_BASE, IMX_BOOT_UART_CLK_IN_HZ,
57*75fbf554SYing-Chun Liu (PaulLiu) 		IMX_CONSOLE_BAUDRATE, &console);
58*75fbf554SYing-Chun Liu (PaulLiu) 
59*75fbf554SYing-Chun Liu (PaulLiu) 	generic_delay_timer_init();
60*75fbf554SYing-Chun Liu (PaulLiu) 
61*75fbf554SYing-Chun Liu (PaulLiu) 	/* select the CKIL source to 32K OSC */
62*75fbf554SYing-Chun Liu (PaulLiu) 	mmio_write_32(IMX_ANAMIX_BASE + ANAMIX_MISC_CTL, 0x1);
63*75fbf554SYing-Chun Liu (PaulLiu) 
64*75fbf554SYing-Chun Liu (PaulLiu) 	/* Open handles to a FIP image */
65*75fbf554SYing-Chun Liu (PaulLiu) 	plat_imx_io_setup();
66*75fbf554SYing-Chun Liu (PaulLiu) }
67*75fbf554SYing-Chun Liu (PaulLiu) 
bl2_el3_plat_arch_setup(void)68*75fbf554SYing-Chun Liu (PaulLiu) void bl2_el3_plat_arch_setup(void)
69*75fbf554SYing-Chun Liu (PaulLiu) {
70*75fbf554SYing-Chun Liu (PaulLiu) }
71*75fbf554SYing-Chun Liu (PaulLiu) 
bl2_platform_setup(void)72*75fbf554SYing-Chun Liu (PaulLiu) void bl2_platform_setup(void)
73*75fbf554SYing-Chun Liu (PaulLiu) {
74*75fbf554SYing-Chun Liu (PaulLiu) }
75*75fbf554SYing-Chun Liu (PaulLiu) 
bl2_plat_handle_post_image_load(unsigned int image_id)76*75fbf554SYing-Chun Liu (PaulLiu) int bl2_plat_handle_post_image_load(unsigned int image_id)
77*75fbf554SYing-Chun Liu (PaulLiu) {
78*75fbf554SYing-Chun Liu (PaulLiu) 	int err = 0;
79*75fbf554SYing-Chun Liu (PaulLiu) 	bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id);
80*75fbf554SYing-Chun Liu (PaulLiu) 	bl_mem_params_node_t *pager_mem_params = NULL;
81*75fbf554SYing-Chun Liu (PaulLiu) 	bl_mem_params_node_t *paged_mem_params = NULL;
82*75fbf554SYing-Chun Liu (PaulLiu) 
83*75fbf554SYing-Chun Liu (PaulLiu) 	assert(bl_mem_params);
84*75fbf554SYing-Chun Liu (PaulLiu) 
85*75fbf554SYing-Chun Liu (PaulLiu) 	switch (image_id) {
86*75fbf554SYing-Chun Liu (PaulLiu) 	case BL32_IMAGE_ID:
87*75fbf554SYing-Chun Liu (PaulLiu) 		pager_mem_params = get_bl_mem_params_node(BL32_EXTRA1_IMAGE_ID);
88*75fbf554SYing-Chun Liu (PaulLiu) 		assert(pager_mem_params);
89*75fbf554SYing-Chun Liu (PaulLiu) 
90*75fbf554SYing-Chun Liu (PaulLiu) 		paged_mem_params = get_bl_mem_params_node(BL32_EXTRA2_IMAGE_ID);
91*75fbf554SYing-Chun Liu (PaulLiu) 		assert(paged_mem_params);
92*75fbf554SYing-Chun Liu (PaulLiu) 
93*75fbf554SYing-Chun Liu (PaulLiu) 		err = parse_optee_header(&bl_mem_params->ep_info,
94*75fbf554SYing-Chun Liu (PaulLiu) 					 &pager_mem_params->image_info,
95*75fbf554SYing-Chun Liu (PaulLiu) 					 &paged_mem_params->image_info);
96*75fbf554SYing-Chun Liu (PaulLiu) 		if (err != 0) {
97*75fbf554SYing-Chun Liu (PaulLiu) 			WARN("OPTEE header parse error.\n");
98*75fbf554SYing-Chun Liu (PaulLiu) 		}
99*75fbf554SYing-Chun Liu (PaulLiu) 
100*75fbf554SYing-Chun Liu (PaulLiu) 		break;
101*75fbf554SYing-Chun Liu (PaulLiu) 	default:
102*75fbf554SYing-Chun Liu (PaulLiu) 		/* Do nothing in default case */
103*75fbf554SYing-Chun Liu (PaulLiu) 		break;
104*75fbf554SYing-Chun Liu (PaulLiu) 	}
105*75fbf554SYing-Chun Liu (PaulLiu) 
106*75fbf554SYing-Chun Liu (PaulLiu) 	return err;
107*75fbf554SYing-Chun Liu (PaulLiu) }
108*75fbf554SYing-Chun Liu (PaulLiu) 
plat_get_syscnt_freq2(void)109*75fbf554SYing-Chun Liu (PaulLiu) unsigned int plat_get_syscnt_freq2(void)
110*75fbf554SYing-Chun Liu (PaulLiu) {
111*75fbf554SYing-Chun Liu (PaulLiu) 	return COUNTER_FREQUENCY;
112*75fbf554SYing-Chun Liu (PaulLiu) }
113*75fbf554SYing-Chun Liu (PaulLiu) 
bl2_plat_runtime_setup(void)114*75fbf554SYing-Chun Liu (PaulLiu) void bl2_plat_runtime_setup(void)
115*75fbf554SYing-Chun Liu (PaulLiu) {
116*75fbf554SYing-Chun Liu (PaulLiu) 	return;
117*75fbf554SYing-Chun Liu (PaulLiu) }
118