xref: /rk3399_ARM-atf/plat/nxp/s32/s32g274ardb2/plat_bl2_el3_setup.c (revision d0ce1ac58476f546ee87233112b59f4c73e11228)
18b81a39eSGhennadi Procopciuc /*
2*d82c211dSGhennadi Procopciuc  * Copyright 2024-2025 NXP
38b81a39eSGhennadi Procopciuc  *
48b81a39eSGhennadi Procopciuc  * SPDX-License-Identifier: BSD-3-Clause
58b81a39eSGhennadi Procopciuc  */
68b81a39eSGhennadi Procopciuc 
734fb2b35SGhennadi Procopciuc #include <errno.h>
8eb4d4185SGhennadi Procopciuc 
966af5425SGhennadi Procopciuc #include <common/debug.h>
108b81a39eSGhennadi Procopciuc #include <common/desc_image_load.h>
11e7905128SGhennadi Procopciuc #include <drivers/generic_delay_timer.h>
12*d82c211dSGhennadi Procopciuc #include <imx_usdhc.h>
138b81a39eSGhennadi Procopciuc #include <lib/mmio.h>
14*d82c211dSGhennadi Procopciuc #include <lib/utils.h>
1534fb2b35SGhennadi Procopciuc #include <lib/xlat_tables/xlat_tables_v2.h>
168b81a39eSGhennadi Procopciuc #include <plat/common/platform.h>
178b81a39eSGhennadi Procopciuc #include <plat_console.h>
1866af5425SGhennadi Procopciuc #include <s32cc-clk-drv.h>
19eb4d4185SGhennadi Procopciuc 
208b81a39eSGhennadi Procopciuc #include <plat_io_storage.h>
21eb4d4185SGhennadi Procopciuc #include <s32cc-bl-common.h>
225071f7c7SGhennadi Procopciuc #include <s32cc-ncore.h>
238b81a39eSGhennadi Procopciuc 
24507ce7edSGhennadi Procopciuc #define SIUL20_BASE		UL(0x4009C000)
258b81a39eSGhennadi Procopciuc #define SIUL2_PC09_MSCR		UL(0x4009C2E4)
268b81a39eSGhennadi Procopciuc #define SIUL2_PC10_MSCR		UL(0x4009C2E8)
278b81a39eSGhennadi Procopciuc #define SIUL2_PC10_LIN0_IMCR	UL(0x4009CA40)
288b81a39eSGhennadi Procopciuc 
298b81a39eSGhennadi Procopciuc #define LIN0_TX_MSCR_CFG	U(0x00214001)
308b81a39eSGhennadi Procopciuc #define LIN0_RX_MSCR_CFG	U(0x00094000)
318b81a39eSGhennadi Procopciuc #define LIN0_RX_IMCR_CFG	U(0x00000002)
328b81a39eSGhennadi Procopciuc 
plat_get_bl_image_load_info(void)338b81a39eSGhennadi Procopciuc struct bl_load_info *plat_get_bl_image_load_info(void)
348b81a39eSGhennadi Procopciuc {
358b81a39eSGhennadi Procopciuc 	return get_bl_load_info_from_mem_params_desc();
368b81a39eSGhennadi Procopciuc }
378b81a39eSGhennadi Procopciuc 
plat_get_next_bl_params(void)388b81a39eSGhennadi Procopciuc struct bl_params *plat_get_next_bl_params(void)
398b81a39eSGhennadi Procopciuc {
408b81a39eSGhennadi Procopciuc 	return get_next_bl_params_from_mem_params_desc();
418b81a39eSGhennadi Procopciuc }
428b81a39eSGhennadi Procopciuc 
plat_flush_next_bl_params(void)438b81a39eSGhennadi Procopciuc void plat_flush_next_bl_params(void)
448b81a39eSGhennadi Procopciuc {
458b81a39eSGhennadi Procopciuc 	flush_bl_params_desc();
468b81a39eSGhennadi Procopciuc }
478b81a39eSGhennadi Procopciuc 
bl2_platform_setup(void)488b81a39eSGhennadi Procopciuc void bl2_platform_setup(void)
498b81a39eSGhennadi Procopciuc {
50507ce7edSGhennadi Procopciuc 	int ret;
51507ce7edSGhennadi Procopciuc 
52507ce7edSGhennadi Procopciuc 	ret = mmap_add_dynamic_region(S32G_FIP_BASE, S32G_FIP_BASE,
53507ce7edSGhennadi Procopciuc 				      S32G_FIP_SIZE,
54507ce7edSGhennadi Procopciuc 				      MT_MEMORY | MT_RW | MT_SECURE);
55507ce7edSGhennadi Procopciuc 	if (ret != 0) {
56507ce7edSGhennadi Procopciuc 		panic();
57507ce7edSGhennadi Procopciuc 	}
58507ce7edSGhennadi Procopciuc }
59507ce7edSGhennadi Procopciuc 
s32g_mmap_siul2(void)60507ce7edSGhennadi Procopciuc static int s32g_mmap_siul2(void)
61507ce7edSGhennadi Procopciuc {
62507ce7edSGhennadi Procopciuc 	return mmap_add_dynamic_region(SIUL20_BASE, SIUL20_BASE, PAGE_SIZE,
63507ce7edSGhennadi Procopciuc 				       MT_DEVICE | MT_RW | MT_SECURE);
648b81a39eSGhennadi Procopciuc }
658b81a39eSGhennadi Procopciuc 
linflex_config_pinctrl(void)668b81a39eSGhennadi Procopciuc static void linflex_config_pinctrl(void)
678b81a39eSGhennadi Procopciuc {
688b81a39eSGhennadi Procopciuc 	/* set PC09 - MSCR[41] - for UART0 TXD */
698b81a39eSGhennadi Procopciuc 	mmio_write_32(SIUL2_PC09_MSCR, LIN0_TX_MSCR_CFG);
708b81a39eSGhennadi Procopciuc 	/* set PC10 - MSCR[42] - for UART0 RXD */
718b81a39eSGhennadi Procopciuc 	mmio_write_32(SIUL2_PC10_MSCR, LIN0_RX_MSCR_CFG);
728b81a39eSGhennadi Procopciuc 	/* set PC10 - MSCR[512]/IMCR[0] - for UART0 RXD */
738b81a39eSGhennadi Procopciuc 	mmio_write_32(SIUL2_PC10_LIN0_IMCR, LIN0_RX_IMCR_CFG);
748b81a39eSGhennadi Procopciuc }
758b81a39eSGhennadi Procopciuc 
init_s32g_usdhc(void)76*d82c211dSGhennadi Procopciuc static void init_s32g_usdhc(void)
77*d82c211dSGhennadi Procopciuc {
78*d82c211dSGhennadi Procopciuc 	static struct mmc_device_info sd_device_info = {
79*d82c211dSGhennadi Procopciuc 		.mmc_dev_type = MMC_IS_SD_HC,
80*d82c211dSGhennadi Procopciuc 		.ocr_voltage = OCR_3_2_3_3 | OCR_3_3_3_4,
81*d82c211dSGhennadi Procopciuc 	};
82*d82c211dSGhennadi Procopciuc 	imx_usdhc_params_t params;
83*d82c211dSGhennadi Procopciuc 
84*d82c211dSGhennadi Procopciuc 	zeromem(&params, sizeof(imx_usdhc_params_t));
85*d82c211dSGhennadi Procopciuc 
86*d82c211dSGhennadi Procopciuc 	params.reg_base = S32G_USDHC_BASE;
87*d82c211dSGhennadi Procopciuc 	params.clk_rate = 25000000;
88*d82c211dSGhennadi Procopciuc 	params.bus_width = MMC_BUS_WIDTH_4;
89*d82c211dSGhennadi Procopciuc 	params.flags = MMC_FLAG_SD_CMD6;
90*d82c211dSGhennadi Procopciuc 
91*d82c211dSGhennadi Procopciuc 	imx_usdhc_init(&params, &sd_device_info);
92*d82c211dSGhennadi Procopciuc }
93*d82c211dSGhennadi Procopciuc 
plat_s32_mmc_setup(void)94*d82c211dSGhennadi Procopciuc static void plat_s32_mmc_setup(void)
95*d82c211dSGhennadi Procopciuc {
96*d82c211dSGhennadi Procopciuc 	init_s32g_usdhc();
97*d82c211dSGhennadi Procopciuc }
98*d82c211dSGhennadi Procopciuc 
bl2_el3_early_platform_setup(u_register_t arg0,u_register_t arg1,u_register_t arg2,u_register_t arg3)998b81a39eSGhennadi Procopciuc void bl2_el3_early_platform_setup(u_register_t arg0, u_register_t arg1,
1008b81a39eSGhennadi Procopciuc 				  u_register_t arg2, u_register_t arg3)
1018b81a39eSGhennadi Procopciuc {
10266af5425SGhennadi Procopciuc 	int ret;
10366af5425SGhennadi Procopciuc 
1045071f7c7SGhennadi Procopciuc 	/* Restore (clear) the CAIUTC[IsolEn] bit for the primary cluster, which
1055071f7c7SGhennadi Procopciuc 	 * we have manually set during early BL2 boot.
1065071f7c7SGhennadi Procopciuc 	 */
1075071f7c7SGhennadi Procopciuc 	ncore_disable_caiu_isolation(A53_CLUSTER0_CAIU);
1085071f7c7SGhennadi Procopciuc 
1095071f7c7SGhennadi Procopciuc 	ncore_init();
1105071f7c7SGhennadi Procopciuc 	ncore_caiu_online(A53_CLUSTER0_CAIU);
1115071f7c7SGhennadi Procopciuc 
11261b5ef21SGhennadi Procopciuc 	ret = s32cc_init_core_clocks();
11361b5ef21SGhennadi Procopciuc 	if (ret != 0) {
11461b5ef21SGhennadi Procopciuc 		panic();
11561b5ef21SGhennadi Procopciuc 	}
11661b5ef21SGhennadi Procopciuc 
117eb4d4185SGhennadi Procopciuc 	ret = s32cc_bl_mmu_setup();
118eb4d4185SGhennadi Procopciuc 	if (ret != 0) {
119eb4d4185SGhennadi Procopciuc 		panic();
120eb4d4185SGhennadi Procopciuc 	}
121eb4d4185SGhennadi Procopciuc 
122507ce7edSGhennadi Procopciuc 	ret = s32cc_init_early_clks();
123507ce7edSGhennadi Procopciuc 	if (ret != 0) {
124507ce7edSGhennadi Procopciuc 		panic();
125507ce7edSGhennadi Procopciuc 	}
126507ce7edSGhennadi Procopciuc 
127507ce7edSGhennadi Procopciuc 	ret = s32g_mmap_siul2();
128507ce7edSGhennadi Procopciuc 	if (ret != 0) {
129507ce7edSGhennadi Procopciuc 		panic();
130507ce7edSGhennadi Procopciuc 	}
131507ce7edSGhennadi Procopciuc 
132e7905128SGhennadi Procopciuc 	generic_delay_timer_init();
133e7905128SGhennadi Procopciuc 
1343c60749bSGhennadi Procopciuc 	/* Configure the generic timer frequency to ensure proper operation
1353c60749bSGhennadi Procopciuc 	 * of the architectural timer in BL2.
1363c60749bSGhennadi Procopciuc 	 */
1373c60749bSGhennadi Procopciuc 	write_cntfrq_el0(plat_get_syscnt_freq2());
1383c60749bSGhennadi Procopciuc 
139507ce7edSGhennadi Procopciuc 	linflex_config_pinctrl();
140507ce7edSGhennadi Procopciuc 	console_s32g2_register();
141507ce7edSGhennadi Procopciuc 
142*d82c211dSGhennadi Procopciuc 	plat_s32_mmc_setup();
143*d82c211dSGhennadi Procopciuc 
1448b81a39eSGhennadi Procopciuc 	plat_s32g2_io_setup();
1458b81a39eSGhennadi Procopciuc }
1468b81a39eSGhennadi Procopciuc 
bl2_el3_plat_arch_setup(void)1478b81a39eSGhennadi Procopciuc void bl2_el3_plat_arch_setup(void)
1488b81a39eSGhennadi Procopciuc {
1498b81a39eSGhennadi Procopciuc }
1508b81a39eSGhennadi Procopciuc 
bl2_plat_handle_pre_image_load(unsigned int image_id)15134fb2b35SGhennadi Procopciuc int bl2_plat_handle_pre_image_load(unsigned int image_id)
15234fb2b35SGhennadi Procopciuc {
15334fb2b35SGhennadi Procopciuc 	const struct bl_mem_params_node *desc = get_bl_mem_params_node(image_id);
15434fb2b35SGhennadi Procopciuc 	const struct image_info *img_info;
15534fb2b35SGhennadi Procopciuc 	size_t size;
15634fb2b35SGhennadi Procopciuc 
15734fb2b35SGhennadi Procopciuc 	if (desc == NULL) {
15834fb2b35SGhennadi Procopciuc 		return -EINVAL;
15934fb2b35SGhennadi Procopciuc 	}
16034fb2b35SGhennadi Procopciuc 
16134fb2b35SGhennadi Procopciuc 	img_info = &desc->image_info;
16234fb2b35SGhennadi Procopciuc 
16334fb2b35SGhennadi Procopciuc 	if ((img_info == NULL) || (img_info->image_max_size == 0U)) {
16434fb2b35SGhennadi Procopciuc 		return -EINVAL;
16534fb2b35SGhennadi Procopciuc 	}
16634fb2b35SGhennadi Procopciuc 
16734fb2b35SGhennadi Procopciuc 	size = page_align(img_info->image_max_size, UP);
16834fb2b35SGhennadi Procopciuc 
16934fb2b35SGhennadi Procopciuc 	return mmap_add_dynamic_region(img_info->image_base,
17034fb2b35SGhennadi Procopciuc 				       img_info->image_base,
17134fb2b35SGhennadi Procopciuc 				       size,
17234fb2b35SGhennadi Procopciuc 				       MT_MEMORY | MT_RW | MT_SECURE);
17334fb2b35SGhennadi Procopciuc }
174