xref: /rk3399_ARM-atf/plat/imx/imx8ulp/imx8ulp_bl31_setup.c (revision fcd41e8692ce8e8fc98d069bc131820cbf83c55c)
1*fcd41e86SJacky Bai /*
2*fcd41e86SJacky Bai  * Copyright 2021-2024 NXP
3*fcd41e86SJacky Bai  *
4*fcd41e86SJacky Bai  * SPDX-License-Identifier: BSD-3-Clause
5*fcd41e86SJacky Bai  */
6*fcd41e86SJacky Bai 
7*fcd41e86SJacky Bai #include <assert.h>
8*fcd41e86SJacky Bai #include <stdbool.h>
9*fcd41e86SJacky Bai 
10*fcd41e86SJacky Bai #include <arch_helpers.h>
11*fcd41e86SJacky Bai #include <common/bl_common.h>
12*fcd41e86SJacky Bai #include <common/debug.h>
13*fcd41e86SJacky Bai #include <context.h>
14*fcd41e86SJacky Bai #include <drivers/console.h>
15*fcd41e86SJacky Bai #include <drivers/generic_delay_timer.h>
16*fcd41e86SJacky Bai #include <lib/el3_runtime/context_mgmt.h>
17*fcd41e86SJacky Bai #include <lib/mmio.h>
18*fcd41e86SJacky Bai #include <lib/xlat_tables/xlat_tables_v2.h>
19*fcd41e86SJacky Bai #include <plat/common/platform.h>
20*fcd41e86SJacky Bai #include <platform_def.h>
21*fcd41e86SJacky Bai 
22*fcd41e86SJacky Bai #include <imx8_lpuart.h>
23*fcd41e86SJacky Bai #include <imx_plat_common.h>
24*fcd41e86SJacky Bai #include <plat_imx8.h>
25*fcd41e86SJacky Bai #include <upower_api.h>
26*fcd41e86SJacky Bai 
27*fcd41e86SJacky Bai #define MAP_BL31_TOTAL										   \
28*fcd41e86SJacky Bai 	MAP_REGION_FLAT(BL31_BASE, BL31_LIMIT - BL31_BASE, MT_MEMORY | MT_RW | MT_SECURE)
29*fcd41e86SJacky Bai #define MAP_BL31_RO										   \
30*fcd41e86SJacky Bai 	MAP_REGION_FLAT(BL_CODE_BASE, BL_CODE_END - BL_CODE_BASE, MT_MEMORY | MT_RO | MT_SECURE)
31*fcd41e86SJacky Bai 
32*fcd41e86SJacky Bai #define MAP_COHERENT_MEM									\
33*fcd41e86SJacky Bai 	MAP_REGION_FLAT(BL_COHERENT_RAM_BASE, (BL_COHERENT_RAM_END - BL_COHERENT_RAM_BASE),	\
34*fcd41e86SJacky Bai 			 MT_DEVICE | MT_RW | MT_SECURE)
35*fcd41e86SJacky Bai 
36*fcd41e86SJacky Bai static const mmap_region_t imx_mmap[] = {
37*fcd41e86SJacky Bai 	DEVICE0_MAP, DEVICE1_MAP, ELE_MAP,
38*fcd41e86SJacky Bai 	SEC_SIM_MAP, SRAM0_MAP,
39*fcd41e86SJacky Bai 	{0}
40*fcd41e86SJacky Bai };
41*fcd41e86SJacky Bai 
42*fcd41e86SJacky Bai extern uint32_t upower_init(void);
43*fcd41e86SJacky Bai extern void imx8ulp_init_scmi_server(void);
44*fcd41e86SJacky Bai 
45*fcd41e86SJacky Bai static entry_point_info_t bl32_image_ep_info;
46*fcd41e86SJacky Bai static entry_point_info_t bl33_image_ep_info;
47*fcd41e86SJacky Bai 
48*fcd41e86SJacky Bai void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
49*fcd41e86SJacky Bai 				u_register_t arg2, u_register_t arg3)
50*fcd41e86SJacky Bai {
51*fcd41e86SJacky Bai 	static console_t console;
52*fcd41e86SJacky Bai 
53*fcd41e86SJacky Bai 
54*fcd41e86SJacky Bai 	/* enable the GPIO D,E,F non-secure access by default */
55*fcd41e86SJacky Bai 	mmio_write_32(IMX_PCC4_BASE + 0x78, 0xc0000000);
56*fcd41e86SJacky Bai 	mmio_write_32(IMX_PCC4_BASE + 0x7c, 0xc0000000);
57*fcd41e86SJacky Bai 	mmio_write_32(IMX_PCC5_BASE + 0x114, 0xc0000000);
58*fcd41e86SJacky Bai 
59*fcd41e86SJacky Bai 	mmio_write_32(IMX_GPIOE_BASE + 0x10, 0xffffffff);
60*fcd41e86SJacky Bai 	mmio_write_32(IMX_GPIOE_BASE + 0x14, 0x3);
61*fcd41e86SJacky Bai 	mmio_write_32(IMX_GPIOE_BASE + 0x18, 0xffffffff);
62*fcd41e86SJacky Bai 	mmio_write_32(IMX_GPIOE_BASE + 0x1c, 0x3);
63*fcd41e86SJacky Bai 
64*fcd41e86SJacky Bai 	mmio_write_32(IMX_GPIOF_BASE + 0x10, 0xffffffff);
65*fcd41e86SJacky Bai 	mmio_write_32(IMX_GPIOF_BASE + 0x14, 0x3);
66*fcd41e86SJacky Bai 	mmio_write_32(IMX_GPIOF_BASE + 0x18, 0xffffffff);
67*fcd41e86SJacky Bai 	mmio_write_32(IMX_GPIOF_BASE + 0x1c, 0x3);
68*fcd41e86SJacky Bai 
69*fcd41e86SJacky Bai 	mmio_write_32(IMX_GPIOD_BASE + 0x10, 0xffffffff);
70*fcd41e86SJacky Bai 	mmio_write_32(IMX_GPIOD_BASE + 0x14, 0x3);
71*fcd41e86SJacky Bai 	mmio_write_32(IMX_GPIOD_BASE + 0x18, 0xffffffff);
72*fcd41e86SJacky Bai 	mmio_write_32(IMX_GPIOD_BASE + 0x1c, 0x3);
73*fcd41e86SJacky Bai 
74*fcd41e86SJacky Bai 	console_lpuart_register(IMX_LPUART_BASE, IMX_BOOT_UART_CLK_IN_HZ,
75*fcd41e86SJacky Bai 		     IMX_CONSOLE_BAUDRATE, &console);
76*fcd41e86SJacky Bai 
77*fcd41e86SJacky Bai 	/* This console is only used for boot stage */
78*fcd41e86SJacky Bai 	console_set_scope(&console, CONSOLE_FLAG_BOOT | CONSOLE_FLAG_RUNTIME);
79*fcd41e86SJacky Bai 
80*fcd41e86SJacky Bai 	bl33_image_ep_info.pc = PLAT_NS_IMAGE_OFFSET;
81*fcd41e86SJacky Bai 	bl33_image_ep_info.spsr = plat_get_spsr_for_bl33_entry();
82*fcd41e86SJacky Bai 	SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE);
83*fcd41e86SJacky Bai }
84*fcd41e86SJacky Bai 
85*fcd41e86SJacky Bai void bl31_plat_arch_setup(void)
86*fcd41e86SJacky Bai {
87*fcd41e86SJacky Bai 	const mmap_region_t bl_regions[] = {
88*fcd41e86SJacky Bai 		MAP_BL31_TOTAL,
89*fcd41e86SJacky Bai 		MAP_BL31_RO,
90*fcd41e86SJacky Bai #if USE_COHERENT_MEM
91*fcd41e86SJacky Bai 		MAP_COHERENT_MEM,
92*fcd41e86SJacky Bai #endif
93*fcd41e86SJacky Bai 		{0},
94*fcd41e86SJacky Bai 	};
95*fcd41e86SJacky Bai 
96*fcd41e86SJacky Bai 	setup_page_tables(bl_regions, imx_mmap);
97*fcd41e86SJacky Bai 	enable_mmu_el3(0);
98*fcd41e86SJacky Bai 
99*fcd41e86SJacky Bai 	/* TODO: Hack, refine this piece, scmi channel free */
100*fcd41e86SJacky Bai 	mmio_write_32(SRAM0_BASE + 0x4, 1);
101*fcd41e86SJacky Bai }
102*fcd41e86SJacky Bai 
103*fcd41e86SJacky Bai void bl31_platform_setup(void)
104*fcd41e86SJacky Bai {
105*fcd41e86SJacky Bai 	/* select the arch timer source */
106*fcd41e86SJacky Bai 	mmio_setbits_32(IMX_SIM1_BASE + 0x30, 0x8000000);
107*fcd41e86SJacky Bai 
108*fcd41e86SJacky Bai 	generic_delay_timer_init();
109*fcd41e86SJacky Bai 
110*fcd41e86SJacky Bai 	plat_gic_driver_init();
111*fcd41e86SJacky Bai 	plat_gic_init();
112*fcd41e86SJacky Bai 
113*fcd41e86SJacky Bai 	imx8ulp_init_scmi_server();
114*fcd41e86SJacky Bai 	upower_init();
115*fcd41e86SJacky Bai }
116*fcd41e86SJacky Bai 
117*fcd41e86SJacky Bai entry_point_info_t *bl31_plat_get_next_image_ep_info(unsigned int type)
118*fcd41e86SJacky Bai {
119*fcd41e86SJacky Bai 	if (type == NON_SECURE) {
120*fcd41e86SJacky Bai 		return &bl33_image_ep_info;
121*fcd41e86SJacky Bai 	} else {
122*fcd41e86SJacky Bai 		return &bl32_image_ep_info;
123*fcd41e86SJacky Bai 	}
124*fcd41e86SJacky Bai }
125*fcd41e86SJacky Bai 
126*fcd41e86SJacky Bai unsigned int plat_get_syscnt_freq2(void)
127*fcd41e86SJacky Bai {
128*fcd41e86SJacky Bai 	return COUNTER_FREQUENCY;
129*fcd41e86SJacky Bai }
130*fcd41e86SJacky Bai 
131*fcd41e86SJacky Bai void bl31_plat_runtime_setup(void)
132*fcd41e86SJacky Bai {
133*fcd41e86SJacky Bai }
134