1fcd41e86SJacky Bai /*
2fcd41e86SJacky Bai * Copyright 2021-2024 NXP
3fcd41e86SJacky Bai *
4fcd41e86SJacky Bai * SPDX-License-Identifier: BSD-3-Clause
5fcd41e86SJacky Bai */
6fcd41e86SJacky Bai
7fcd41e86SJacky Bai #include <assert.h>
8fcd41e86SJacky Bai #include <stdbool.h>
9fcd41e86SJacky Bai
10fcd41e86SJacky Bai #include <arch_helpers.h>
11fcd41e86SJacky Bai #include <common/bl_common.h>
12fcd41e86SJacky Bai #include <common/debug.h>
13fcd41e86SJacky Bai #include <context.h>
14fcd41e86SJacky Bai #include <drivers/console.h>
15fcd41e86SJacky Bai #include <drivers/generic_delay_timer.h>
16fcd41e86SJacky Bai #include <lib/el3_runtime/context_mgmt.h>
17fcd41e86SJacky Bai #include <lib/mmio.h>
18fcd41e86SJacky Bai #include <lib/xlat_tables/xlat_tables_v2.h>
19fcd41e86SJacky Bai #include <plat/common/platform.h>
20fcd41e86SJacky Bai #include <platform_def.h>
21fcd41e86SJacky Bai
22caee2733SJacky Bai #include <dram.h>
23fcd41e86SJacky Bai #include <imx8_lpuart.h>
247c5eedcaSPankaj Gupta #include <imx8ulp_caam.h>
25fcd41e86SJacky Bai #include <imx_plat_common.h>
26fcd41e86SJacky Bai #include <plat_imx8.h>
27fcd41e86SJacky Bai #include <upower_api.h>
28ac5d69b6SJacky Bai #include <xrdc.h>
29fcd41e86SJacky Bai
30fcd41e86SJacky Bai #define MAP_BL31_TOTAL \
31fcd41e86SJacky Bai MAP_REGION_FLAT(BL31_BASE, BL31_LIMIT - BL31_BASE, MT_MEMORY | MT_RW | MT_SECURE)
32fcd41e86SJacky Bai #define MAP_BL31_RO \
33fcd41e86SJacky Bai MAP_REGION_FLAT(BL_CODE_BASE, BL_CODE_END - BL_CODE_BASE, MT_MEMORY | MT_RO | MT_SECURE)
34e7b82a7dSClement Faure #define MAP_BL32_TOTAL MAP_REGION_FLAT(BL32_BASE, BL32_SIZE, MT_MEMORY | MT_RW)
35fcd41e86SJacky Bai #define MAP_COHERENT_MEM \
36fcd41e86SJacky Bai MAP_REGION_FLAT(BL_COHERENT_RAM_BASE, (BL_COHERENT_RAM_END - BL_COHERENT_RAM_BASE), \
37fcd41e86SJacky Bai MT_DEVICE | MT_RW | MT_SECURE)
38fcd41e86SJacky Bai
39e8530419SJi Luo #define TRUSTY_PARAMS_LEN_BYTES (4096*2)
40e8530419SJi Luo
41fcd41e86SJacky Bai static const mmap_region_t imx_mmap[] = {
42*ee25e6a5SAdrian Alonso DEVICE0_MAP, DEVICE1_MAP, DEVICE2_MAP,
43*ee25e6a5SAdrian Alonso ELE_MAP, SEC_SIM_MAP, SRAM0_MAP,
44fcd41e86SJacky Bai {0}
45fcd41e86SJacky Bai };
46fcd41e86SJacky Bai
47fcd41e86SJacky Bai extern uint32_t upower_init(void);
48fcd41e86SJacky Bai extern void imx8ulp_init_scmi_server(void);
49fcd41e86SJacky Bai
50fcd41e86SJacky Bai static entry_point_info_t bl32_image_ep_info;
51fcd41e86SJacky Bai static entry_point_info_t bl33_image_ep_info;
52fcd41e86SJacky Bai
bl31_early_platform_setup2(u_register_t arg0,u_register_t arg1,u_register_t arg2,u_register_t arg3)53fcd41e86SJacky Bai void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
54fcd41e86SJacky Bai u_register_t arg2, u_register_t arg3)
55fcd41e86SJacky Bai {
56fcd41e86SJacky Bai static console_t console;
57fcd41e86SJacky Bai
58daa4478aSJacky Bai /* config the TPM5 clock */
59daa4478aSJacky Bai mmio_write_32(IMX_PCC3_BASE + 0xd0, 0x92000000);
60daa4478aSJacky Bai mmio_write_32(IMX_PCC3_BASE + 0xd0, 0xd2000000);
61fcd41e86SJacky Bai
62fcd41e86SJacky Bai /* enable the GPIO D,E,F non-secure access by default */
63fcd41e86SJacky Bai mmio_write_32(IMX_PCC4_BASE + 0x78, 0xc0000000);
64fcd41e86SJacky Bai mmio_write_32(IMX_PCC4_BASE + 0x7c, 0xc0000000);
65fcd41e86SJacky Bai mmio_write_32(IMX_PCC5_BASE + 0x114, 0xc0000000);
66fcd41e86SJacky Bai
67fcd41e86SJacky Bai mmio_write_32(IMX_GPIOE_BASE + 0x10, 0xffffffff);
68fcd41e86SJacky Bai mmio_write_32(IMX_GPIOE_BASE + 0x14, 0x3);
69fcd41e86SJacky Bai mmio_write_32(IMX_GPIOE_BASE + 0x18, 0xffffffff);
70fcd41e86SJacky Bai mmio_write_32(IMX_GPIOE_BASE + 0x1c, 0x3);
71fcd41e86SJacky Bai
72fcd41e86SJacky Bai mmio_write_32(IMX_GPIOF_BASE + 0x10, 0xffffffff);
73fcd41e86SJacky Bai mmio_write_32(IMX_GPIOF_BASE + 0x14, 0x3);
74fcd41e86SJacky Bai mmio_write_32(IMX_GPIOF_BASE + 0x18, 0xffffffff);
75fcd41e86SJacky Bai mmio_write_32(IMX_GPIOF_BASE + 0x1c, 0x3);
76fcd41e86SJacky Bai
77fcd41e86SJacky Bai mmio_write_32(IMX_GPIOD_BASE + 0x10, 0xffffffff);
78fcd41e86SJacky Bai mmio_write_32(IMX_GPIOD_BASE + 0x14, 0x3);
79fcd41e86SJacky Bai mmio_write_32(IMX_GPIOD_BASE + 0x18, 0xffffffff);
80fcd41e86SJacky Bai mmio_write_32(IMX_GPIOD_BASE + 0x1c, 0x3);
81fcd41e86SJacky Bai
82fcd41e86SJacky Bai console_lpuart_register(IMX_LPUART_BASE, IMX_BOOT_UART_CLK_IN_HZ,
83fcd41e86SJacky Bai IMX_CONSOLE_BAUDRATE, &console);
84fcd41e86SJacky Bai
85fcd41e86SJacky Bai /* This console is only used for boot stage */
86fcd41e86SJacky Bai console_set_scope(&console, CONSOLE_FLAG_BOOT | CONSOLE_FLAG_RUNTIME);
87fcd41e86SJacky Bai
88fcd41e86SJacky Bai bl33_image_ep_info.pc = PLAT_NS_IMAGE_OFFSET;
89fcd41e86SJacky Bai bl33_image_ep_info.spsr = plat_get_spsr_for_bl33_entry();
90fcd41e86SJacky Bai SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE);
91e7b82a7dSClement Faure
92e8530419SJi Luo #if defined(SPD_opteed) || defined(SPD_trusty)
93e7b82a7dSClement Faure /* Populate entry point information for BL32 */
94e7b82a7dSClement Faure SET_PARAM_HEAD(&bl32_image_ep_info, PARAM_EP, VERSION_1, 0);
95e7b82a7dSClement Faure SET_SECURITY_STATE(bl32_image_ep_info.h.attr, SECURE);
96e7b82a7dSClement Faure bl32_image_ep_info.pc = BL32_BASE;
97e7b82a7dSClement Faure bl32_image_ep_info.spsr = 0;
98e7b82a7dSClement Faure
99e7b82a7dSClement Faure /* Pass TEE base and size to bl33 */
100e7b82a7dSClement Faure bl33_image_ep_info.args.arg1 = BL32_BASE;
101e7b82a7dSClement Faure bl33_image_ep_info.args.arg2 = BL32_SIZE;
102e7b82a7dSClement Faure
103e8530419SJi Luo #ifdef SPD_trusty
104e8530419SJi Luo bl32_image_ep_info.args.arg0 = BL32_SIZE;
105e8530419SJi Luo bl32_image_ep_info.args.arg1 = BL32_BASE;
106e8530419SJi Luo #else
107e7b82a7dSClement Faure /* Make sure memory is clean */
108e7b82a7dSClement Faure mmio_write_32(BL32_FDT_OVERLAY_ADDR, 0);
109e7b82a7dSClement Faure bl33_image_ep_info.args.arg3 = BL32_FDT_OVERLAY_ADDR;
110e7b82a7dSClement Faure bl32_image_ep_info.args.arg3 = BL32_FDT_OVERLAY_ADDR;
111e7b82a7dSClement Faure #endif
112e8530419SJi Luo #endif
113fcd41e86SJacky Bai }
114fcd41e86SJacky Bai
bl31_plat_arch_setup(void)115fcd41e86SJacky Bai void bl31_plat_arch_setup(void)
116fcd41e86SJacky Bai {
117fcd41e86SJacky Bai const mmap_region_t bl_regions[] = {
118fcd41e86SJacky Bai MAP_BL31_TOTAL,
119fcd41e86SJacky Bai MAP_BL31_RO,
120fcd41e86SJacky Bai #if USE_COHERENT_MEM
121fcd41e86SJacky Bai MAP_COHERENT_MEM,
122fcd41e86SJacky Bai #endif
123e8530419SJi Luo #if defined(SPD_opteed) || defined(SPD_trusty)
124e7b82a7dSClement Faure MAP_BL32_TOTAL,
125e7b82a7dSClement Faure #endif
126fcd41e86SJacky Bai {0},
127fcd41e86SJacky Bai };
128fcd41e86SJacky Bai
129fcd41e86SJacky Bai setup_page_tables(bl_regions, imx_mmap);
130fcd41e86SJacky Bai enable_mmu_el3(0);
131fcd41e86SJacky Bai
132fcd41e86SJacky Bai /* TODO: Hack, refine this piece, scmi channel free */
133fcd41e86SJacky Bai mmio_write_32(SRAM0_BASE + 0x4, 1);
134ea1f7a2eSYe Li
135ea1f7a2eSYe Li /* Allow M core to reset A core */
136ea1f7a2eSYe Li mmio_clrbits_32(IMX_MU0B_BASE + 0x10, BIT(2));
137fcd41e86SJacky Bai }
138fcd41e86SJacky Bai
bl31_platform_setup(void)139fcd41e86SJacky Bai void bl31_platform_setup(void)
140fcd41e86SJacky Bai {
141fcd41e86SJacky Bai /* select the arch timer source */
142fcd41e86SJacky Bai mmio_setbits_32(IMX_SIM1_BASE + 0x30, 0x8000000);
143fcd41e86SJacky Bai
144fcd41e86SJacky Bai generic_delay_timer_init();
145fcd41e86SJacky Bai
146fcd41e86SJacky Bai plat_gic_driver_init();
147fcd41e86SJacky Bai plat_gic_init();
148fcd41e86SJacky Bai
149fcd41e86SJacky Bai imx8ulp_init_scmi_server();
150fcd41e86SJacky Bai upower_init();
151ac5d69b6SJacky Bai
152ac5d69b6SJacky Bai xrdc_apply_apd_config();
153ac5d69b6SJacky Bai xrdc_apply_lpav_config();
154ac5d69b6SJacky Bai xrdc_enable();
155ac5d69b6SJacky Bai
1567c5eedcaSPankaj Gupta imx8ulp_caam_init();
157caee2733SJacky Bai
158caee2733SJacky Bai dram_init();
159fcd41e86SJacky Bai }
160fcd41e86SJacky Bai
bl31_plat_get_next_image_ep_info(unsigned int type)161fcd41e86SJacky Bai entry_point_info_t *bl31_plat_get_next_image_ep_info(unsigned int type)
162fcd41e86SJacky Bai {
163fcd41e86SJacky Bai if (type == NON_SECURE) {
164fcd41e86SJacky Bai return &bl33_image_ep_info;
165fcd41e86SJacky Bai } else {
166fcd41e86SJacky Bai return &bl32_image_ep_info;
167fcd41e86SJacky Bai }
168fcd41e86SJacky Bai }
169fcd41e86SJacky Bai
plat_get_syscnt_freq2(void)170fcd41e86SJacky Bai unsigned int plat_get_syscnt_freq2(void)
171fcd41e86SJacky Bai {
172fcd41e86SJacky Bai return COUNTER_FREQUENCY;
173fcd41e86SJacky Bai }
174fcd41e86SJacky Bai
bl31_plat_runtime_setup(void)175fcd41e86SJacky Bai void bl31_plat_runtime_setup(void)
176fcd41e86SJacky Bai {
177fcd41e86SJacky Bai }
178e8530419SJi Luo
179e8530419SJi Luo #ifdef SPD_trusty
plat_trusty_set_boot_args(aapcs64_params_t * args)180e8530419SJi Luo void plat_trusty_set_boot_args(aapcs64_params_t *args)
181e8530419SJi Luo {
182e8530419SJi Luo args->arg0 = BL32_SIZE;
183e8530419SJi Luo args->arg1 = BL32_BASE;
184e8530419SJi Luo args->arg2 = TRUSTY_PARAMS_LEN_BYTES;
185e8530419SJi Luo }
186e8530419SJi Luo #endif
187