xref: /rk3399_ARM-atf/plat/imx/imx9/common/imx9_bl31_setup.c (revision 480e8dd9df291cc0e31695983fa6ff235e1671cd)
1*4ddfb6f1SJacky Bai /*
2*4ddfb6f1SJacky Bai  * Copyright 2025 NXP
3*4ddfb6f1SJacky Bai  *
4*4ddfb6f1SJacky Bai  * SPDX-License-Identifier: BSD-3-Clause
5*4ddfb6f1SJacky Bai  */
6*4ddfb6f1SJacky Bai 
7*4ddfb6f1SJacky Bai #include <assert.h>
8*4ddfb6f1SJacky Bai #include <stdbool.h>
9*4ddfb6f1SJacky Bai 
10*4ddfb6f1SJacky Bai #include "../drivers/arm/gic/v3/gicv3_private.h"
11*4ddfb6f1SJacky Bai 
12*4ddfb6f1SJacky Bai #include <arch_helpers.h>
13*4ddfb6f1SJacky Bai #include <common/bl_common.h>
14*4ddfb6f1SJacky Bai #include <common/debug.h>
15*4ddfb6f1SJacky Bai #include <context.h>
16*4ddfb6f1SJacky Bai 
17*4ddfb6f1SJacky Bai #include <drivers/arm/gic.h>
18*4ddfb6f1SJacky Bai #include <drivers/console.h>
19*4ddfb6f1SJacky Bai #include <drivers/generic_delay_timer.h>
20*4ddfb6f1SJacky Bai #include <lib/el3_runtime/context_mgmt.h>
21*4ddfb6f1SJacky Bai #include <lib/mmio.h>
22*4ddfb6f1SJacky Bai #include <lib/xlat_tables/xlat_tables_v2.h>
23*4ddfb6f1SJacky Bai #include <plat/common/platform.h>
24*4ddfb6f1SJacky Bai 
25*4ddfb6f1SJacky Bai #include <ele_api.h>
26*4ddfb6f1SJacky Bai #include <imx8_lpuart.h>
27*4ddfb6f1SJacky Bai #include <imx_plat_common.h>
28*4ddfb6f1SJacky Bai #include <imx_scmi_client.h>
29*4ddfb6f1SJacky Bai #include <plat_imx8.h>
30*4ddfb6f1SJacky Bai #include <platform_def.h>
31*4ddfb6f1SJacky Bai 
32*4ddfb6f1SJacky Bai extern gicv3_driver_data_t gic_data;
33*4ddfb6f1SJacky Bai 
34*4ddfb6f1SJacky Bai static entry_point_info_t bl32_image_ep_info;
35*4ddfb6f1SJacky Bai static entry_point_info_t bl33_image_ep_info;
36*4ddfb6f1SJacky Bai 
37*4ddfb6f1SJacky Bai extern const mmap_region_t imx_mmap[];
38*4ddfb6f1SJacky Bai extern uintptr_t gpio_base[GPIO_NUM];
39*4ddfb6f1SJacky Bai 
bl31_early_platform_setup2(u_register_t arg0,u_register_t arg1,u_register_t arg2,u_register_t arg3)40*4ddfb6f1SJacky Bai void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
41*4ddfb6f1SJacky Bai 		u_register_t arg2, u_register_t arg3)
42*4ddfb6f1SJacky Bai {
43*4ddfb6f1SJacky Bai 	static console_t console;
44*4ddfb6f1SJacky Bai 
45*4ddfb6f1SJacky Bai 	console_lpuart_register(IMX_LPUART_BASE, IMX_BOOT_UART_CLK_IN_HZ,
46*4ddfb6f1SJacky Bai 		     IMX_CONSOLE_BAUDRATE, &console);
47*4ddfb6f1SJacky Bai 
48*4ddfb6f1SJacky Bai 	/* this console is only used for boot stage */
49*4ddfb6f1SJacky Bai 	console_set_scope(&console, CONSOLE_FLAG_BOOT);
50*4ddfb6f1SJacky Bai 
51*4ddfb6f1SJacky Bai 	/*
52*4ddfb6f1SJacky Bai 	 * tell bl3-1 where the non-secure software image is located
53*4ddfb6f1SJacky Bai 	 * and the entry state information.
54*4ddfb6f1SJacky Bai 	 */
55*4ddfb6f1SJacky Bai 	bl33_image_ep_info.pc = PLAT_NS_IMAGE_OFFSET;
56*4ddfb6f1SJacky Bai 	bl33_image_ep_info.spsr = plat_get_spsr_for_bl33_entry();
57*4ddfb6f1SJacky Bai 	SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE);
58*4ddfb6f1SJacky Bai 
59*4ddfb6f1SJacky Bai #if defined(SPD_opteed) || defined(SPD_trusty)
60*4ddfb6f1SJacky Bai 	/* Populate entry point information for BL32 */
61*4ddfb6f1SJacky Bai 	SET_PARAM_HEAD(&bl32_image_ep_info, PARAM_EP, VERSION_1, 0);
62*4ddfb6f1SJacky Bai 	SET_SECURITY_STATE(bl32_image_ep_info.h.attr, SECURE);
63*4ddfb6f1SJacky Bai 	bl32_image_ep_info.pc = BL32_BASE;
64*4ddfb6f1SJacky Bai 	bl32_image_ep_info.spsr = 0;
65*4ddfb6f1SJacky Bai 
66*4ddfb6f1SJacky Bai 	/* Pass TEE base and size to bl33 */
67*4ddfb6f1SJacky Bai 	bl33_image_ep_info.args.arg1 = BL32_BASE;
68*4ddfb6f1SJacky Bai 	bl33_image_ep_info.args.arg2 = BL32_SIZE;
69*4ddfb6f1SJacky Bai 
70*4ddfb6f1SJacky Bai #ifdef SPD_trusty
71*4ddfb6f1SJacky Bai 	bl32_image_ep_info.args.arg0 = BL32_SIZE;
72*4ddfb6f1SJacky Bai 	bl32_image_ep_info.args.arg1 = BL32_BASE;
73*4ddfb6f1SJacky Bai #else
74*4ddfb6f1SJacky Bai 	/* Make sure memory is clean */
75*4ddfb6f1SJacky Bai 	mmio_write_32(BL32_FDT_OVERLAY_ADDR, 0);
76*4ddfb6f1SJacky Bai 	bl33_image_ep_info.args.arg3 = BL32_FDT_OVERLAY_ADDR;
77*4ddfb6f1SJacky Bai 	bl32_image_ep_info.args.arg3 = BL32_FDT_OVERLAY_ADDR;
78*4ddfb6f1SJacky Bai #endif
79*4ddfb6f1SJacky Bai #endif
80*4ddfb6f1SJacky Bai }
81*4ddfb6f1SJacky Bai 
bl31_plat_arch_setup(void)82*4ddfb6f1SJacky Bai void bl31_plat_arch_setup(void)
83*4ddfb6f1SJacky Bai {
84*4ddfb6f1SJacky Bai 	/* Assign all the GPIO pins to non-secure world by default */
85*4ddfb6f1SJacky Bai 	for (unsigned int i = 0U; i < GPIO_NUM; i++) {
86*4ddfb6f1SJacky Bai 		mmio_write_32(gpio_base[i] + 0x10, 0xffffffff);
87*4ddfb6f1SJacky Bai 		mmio_write_32(gpio_base[i] + 0x14, 0x3);
88*4ddfb6f1SJacky Bai 		mmio_write_32(gpio_base[i] + 0x18, 0xffffffff);
89*4ddfb6f1SJacky Bai 		mmio_write_32(gpio_base[i] + 0x1c, 0x3);
90*4ddfb6f1SJacky Bai 	}
91*4ddfb6f1SJacky Bai 
92*4ddfb6f1SJacky Bai 	mmap_add_region(BL31_BASE, BL31_BASE, (BL31_LIMIT - BL31_BASE),
93*4ddfb6f1SJacky Bai 		MT_MEMORY | MT_RW | MT_SECURE);
94*4ddfb6f1SJacky Bai 	mmap_add_region(BL_CODE_BASE, BL_CODE_BASE, (BL_CODE_END - BL_CODE_BASE),
95*4ddfb6f1SJacky Bai 		MT_MEMORY | MT_RO | MT_SECURE);
96*4ddfb6f1SJacky Bai 
97*4ddfb6f1SJacky Bai #ifdef SPD_trusty
98*4ddfb6f1SJacky Bai 	mmap_add_region(BL32_BASE, BL32_BASE, BL32_SIZE, MT_MEMORY | MT_RW);
99*4ddfb6f1SJacky Bai #endif
100*4ddfb6f1SJacky Bai 	mmap_add(imx_mmap);
101*4ddfb6f1SJacky Bai 
102*4ddfb6f1SJacky Bai 	init_xlat_tables();
103*4ddfb6f1SJacky Bai 
104*4ddfb6f1SJacky Bai 	enable_mmu_el3(0);
105*4ddfb6f1SJacky Bai }
106*4ddfb6f1SJacky Bai 
bl31_platform_setup(void)107*4ddfb6f1SJacky Bai void bl31_platform_setup(void)
108*4ddfb6f1SJacky Bai {
109*4ddfb6f1SJacky Bai 	uint32_t gicr_ctlr;
110*4ddfb6f1SJacky Bai 	uintptr_t gicr_base;
111*4ddfb6f1SJacky Bai 
112*4ddfb6f1SJacky Bai 	generic_delay_timer_init();
113*4ddfb6f1SJacky Bai 
114*4ddfb6f1SJacky Bai 	/*
115*4ddfb6f1SJacky Bai 	 * In order to apply platform specific gic workaround, the
116*4ddfb6f1SJacky Bai 	 * gicv3_driver_data need to be initialized, the 'USE_GIC_DRIVER'
117*4ddfb6f1SJacky Bai 	 * will init it again, it should be fine.
118*4ddfb6f1SJacky Bai 	 */
119*4ddfb6f1SJacky Bai 	gic_data.gicr_base = PLAT_ARM_GICR_BASE;
120*4ddfb6f1SJacky Bai 	gicv3_driver_init(&gic_data);
121*4ddfb6f1SJacky Bai 	/* Ensure to mark the core as asleep, required for reset case. */
122*4ddfb6f1SJacky Bai 	gic_cpuif_disable(plat_my_core_pos());
123*4ddfb6f1SJacky Bai 	/* Clear LPIs */
124*4ddfb6f1SJacky Bai 	for (unsigned int i = 0U; i < PLATFORM_CORE_COUNT; i++) {
125*4ddfb6f1SJacky Bai 		gicr_base = gicv3_driver_data->rdistif_base_addrs[i];
126*4ddfb6f1SJacky Bai 		gicr_ctlr = gicr_read_ctlr(gicr_base);
127*4ddfb6f1SJacky Bai 		gicr_write_ctlr(gicr_base, gicr_ctlr & ~(GICR_CTLR_EN_LPIS_BIT));
128*4ddfb6f1SJacky Bai 	}
129*4ddfb6f1SJacky Bai 
130*4ddfb6f1SJacky Bai 	/* get soc info */
131*4ddfb6f1SJacky Bai 	ele_get_soc_info();
132*4ddfb6f1SJacky Bai 
133*4ddfb6f1SJacky Bai #if HAS_XSPI_SUPPORT
134*4ddfb6f1SJacky Bai 	/* i.MX94 specific */
135*4ddfb6f1SJacky Bai 	ele_release_gmid();
136*4ddfb6f1SJacky Bai #endif
137*4ddfb6f1SJacky Bai 
138*4ddfb6f1SJacky Bai 	plat_imx9_scmi_setup();
139*4ddfb6f1SJacky Bai }
140*4ddfb6f1SJacky Bai 
bl31_plat_get_next_image_ep_info(unsigned int type)141*4ddfb6f1SJacky Bai entry_point_info_t *bl31_plat_get_next_image_ep_info(unsigned int type)
142*4ddfb6f1SJacky Bai {
143*4ddfb6f1SJacky Bai 	if (type == NON_SECURE) {
144*4ddfb6f1SJacky Bai 		return &bl33_image_ep_info;
145*4ddfb6f1SJacky Bai 	}
146*4ddfb6f1SJacky Bai 
147*4ddfb6f1SJacky Bai 	if (type == SECURE) {
148*4ddfb6f1SJacky Bai 		return &bl32_image_ep_info;
149*4ddfb6f1SJacky Bai 	}
150*4ddfb6f1SJacky Bai 
151*4ddfb6f1SJacky Bai 	return NULL;
152*4ddfb6f1SJacky Bai }
153*4ddfb6f1SJacky Bai 
plat_get_syscnt_freq2(void)154*4ddfb6f1SJacky Bai unsigned int plat_get_syscnt_freq2(void)
155*4ddfb6f1SJacky Bai {
156*4ddfb6f1SJacky Bai 	return COUNTER_FREQUENCY;
157*4ddfb6f1SJacky Bai }
158*4ddfb6f1SJacky Bai 
159*4ddfb6f1SJacky Bai #ifdef SPD_trusty
plat_trusty_set_boot_args(aapcs64_params_t * args)160*4ddfb6f1SJacky Bai void plat_trusty_set_boot_args(aapcs64_params_t *args)
161*4ddfb6f1SJacky Bai {
162*4ddfb6f1SJacky Bai 	args->arg0 = BL32_SIZE;
163*4ddfb6f1SJacky Bai 	args->arg1 = BL32_BASE;
164*4ddfb6f1SJacky Bai 	args->arg2 = TRUSTY_PARAMS_LEN_BYTES;
165*4ddfb6f1SJacky Bai }
166*4ddfb6f1SJacky Bai #endif
167