xref: /rk3399_ARM-atf/plat/aspeed/ast2700/plat_bl31_setup.c (revision 564e073cd5538a1e565fb55a6bc0a934107f5f15)
185f199b7SChia-Wei Wang /*
285f199b7SChia-Wei Wang  * Copyright (c) 2023, Aspeed Technology Inc.
385f199b7SChia-Wei Wang  *
485f199b7SChia-Wei Wang  * SPDX-License-Identifier: BSD-3-Clause
585f199b7SChia-Wei Wang  */
685f199b7SChia-Wei Wang 
785f199b7SChia-Wei Wang #include <arch.h>
885f199b7SChia-Wei Wang #include <common/debug.h>
985f199b7SChia-Wei Wang #include <common/desc_image_load.h>
1085f199b7SChia-Wei Wang #include <drivers/arm/gicv3.h>
1185f199b7SChia-Wei Wang #include <drivers/console.h>
1285f199b7SChia-Wei Wang #include <drivers/ti/uart/uart_16550.h>
13*564e073cSChia-Wei Wang #include <lib/mmio.h>
1485f199b7SChia-Wei Wang #include <lib/xlat_tables/xlat_tables_v2.h>
1585f199b7SChia-Wei Wang #include <plat/common/platform.h>
1685f199b7SChia-Wei Wang #include <platform_def.h>
1785f199b7SChia-Wei Wang 
1885f199b7SChia-Wei Wang static console_t console;
1985f199b7SChia-Wei Wang 
2085f199b7SChia-Wei Wang static entry_point_info_t bl32_ep_info;
2185f199b7SChia-Wei Wang static entry_point_info_t bl33_ep_info;
2285f199b7SChia-Wei Wang 
2385f199b7SChia-Wei Wang static uintptr_t rdistif_base_addrs[PLATFORM_CORE_COUNT];
2485f199b7SChia-Wei Wang 
2585f199b7SChia-Wei Wang static unsigned int plat_mpidr_to_core_pos(u_register_t mpidr)
2685f199b7SChia-Wei Wang {
2785f199b7SChia-Wei Wang 	/* to workaround the return type mismatch */
2885f199b7SChia-Wei Wang 	return plat_core_pos_by_mpidr(mpidr);
2985f199b7SChia-Wei Wang }
3085f199b7SChia-Wei Wang 
3185f199b7SChia-Wei Wang static const gicv3_driver_data_t plat_gic_data = {
3285f199b7SChia-Wei Wang 	.gicd_base = GICD_BASE,
3385f199b7SChia-Wei Wang 	.gicr_base = GICR_BASE,
3485f199b7SChia-Wei Wang 	.rdistif_num = PLATFORM_CORE_COUNT,
3585f199b7SChia-Wei Wang 	.rdistif_base_addrs = rdistif_base_addrs,
3685f199b7SChia-Wei Wang 	.mpidr_to_core_pos = plat_mpidr_to_core_pos,
3785f199b7SChia-Wei Wang };
3885f199b7SChia-Wei Wang 
3985f199b7SChia-Wei Wang static const mmap_region_t plat_mmap[] = {
4085f199b7SChia-Wei Wang 	MAP_REGION_FLAT(GICD_BASE, GICD_SIZE,
4185f199b7SChia-Wei Wang 			MT_DEVICE | MT_RW | MT_SECURE),
4285f199b7SChia-Wei Wang 	MAP_REGION_FLAT(GICR_BASE, GICR_SIZE,
4385f199b7SChia-Wei Wang 			MT_DEVICE | MT_RW | MT_SECURE),
4485f199b7SChia-Wei Wang 	MAP_REGION_FLAT(UART_BASE, PAGE_SIZE,
4585f199b7SChia-Wei Wang 			MT_DEVICE | MT_RW | MT_SECURE),
4685f199b7SChia-Wei Wang 	MAP_REGION_FLAT(SCU_CPU_BASE, PAGE_SIZE,
4785f199b7SChia-Wei Wang 			MT_DEVICE | MT_RW | MT_SECURE),
4885f199b7SChia-Wei Wang 	{ 0 }
4985f199b7SChia-Wei Wang };
5085f199b7SChia-Wei Wang 
5185f199b7SChia-Wei Wang void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
5285f199b7SChia-Wei Wang 				u_register_t arg2, u_register_t arg3)
5385f199b7SChia-Wei Wang {
5485f199b7SChia-Wei Wang 	console_16550_register(CONSOLE_UART_BASE, CONSOLE_UART_CLKIN_HZ,
5585f199b7SChia-Wei Wang 			       CONSOLE_UART_BAUDRATE, &console);
5685f199b7SChia-Wei Wang 
5785f199b7SChia-Wei Wang 	console_set_scope(&console, CONSOLE_FLAG_BOOT | CONSOLE_FLAG_RUNTIME | CONSOLE_FLAG_CRASH);
5885f199b7SChia-Wei Wang 
59*564e073cSChia-Wei Wang 	SET_PARAM_HEAD(&bl32_ep_info, PARAM_EP, VERSION_2, 0);
60*564e073cSChia-Wei Wang 	bl32_ep_info.pc = BL32_BASE;
61*564e073cSChia-Wei Wang 	SET_SECURITY_STATE(bl32_ep_info.h.attr, SECURE);
62*564e073cSChia-Wei Wang 
63*564e073cSChia-Wei Wang 	SET_PARAM_HEAD(&bl33_ep_info, PARAM_EP, VERSION_2, 0);
64*564e073cSChia-Wei Wang 	bl33_ep_info.pc = mmio_read_64(SCU_CPU_SMP_EP0);
65*564e073cSChia-Wei Wang 	bl33_ep_info.spsr = SPSR_64(MODE_EL2, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS);
66*564e073cSChia-Wei Wang 	SET_SECURITY_STATE(bl33_ep_info.h.attr, NON_SECURE);
6785f199b7SChia-Wei Wang }
6885f199b7SChia-Wei Wang 
6985f199b7SChia-Wei Wang void bl31_plat_arch_setup(void)
7085f199b7SChia-Wei Wang {
7185f199b7SChia-Wei Wang 	mmap_add_region(BL_CODE_BASE, BL_CODE_BASE,
7285f199b7SChia-Wei Wang 			BL_CODE_END - BL_CODE_BASE,
7385f199b7SChia-Wei Wang 			MT_CODE | MT_SECURE);
7485f199b7SChia-Wei Wang 
7585f199b7SChia-Wei Wang 	mmap_add_region(BL_CODE_END, BL_CODE_END,
7685f199b7SChia-Wei Wang 			BL_END - BL_CODE_END,
7785f199b7SChia-Wei Wang 			MT_RW_DATA | MT_SECURE);
7885f199b7SChia-Wei Wang 
7985f199b7SChia-Wei Wang 	mmap_add_region(BL32_BASE, BL32_BASE, BL32_SIZE,
8085f199b7SChia-Wei Wang 			MT_MEMORY | MT_RW);
8185f199b7SChia-Wei Wang 
8285f199b7SChia-Wei Wang 	mmap_add(plat_mmap);
8385f199b7SChia-Wei Wang 
8485f199b7SChia-Wei Wang 	init_xlat_tables();
8585f199b7SChia-Wei Wang 
8685f199b7SChia-Wei Wang 	enable_mmu_el3(0);
8785f199b7SChia-Wei Wang }
8885f199b7SChia-Wei Wang 
8985f199b7SChia-Wei Wang void bl31_platform_setup(void)
9085f199b7SChia-Wei Wang {
9185f199b7SChia-Wei Wang 	gicv3_driver_init(&plat_gic_data);
9285f199b7SChia-Wei Wang 	gicv3_distif_init();
9385f199b7SChia-Wei Wang 	gicv3_rdistif_init(plat_my_core_pos());
9485f199b7SChia-Wei Wang 	gicv3_cpuif_enable(plat_my_core_pos());
9585f199b7SChia-Wei Wang }
9685f199b7SChia-Wei Wang 
9785f199b7SChia-Wei Wang entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type)
9885f199b7SChia-Wei Wang {
9985f199b7SChia-Wei Wang 	entry_point_info_t *ep_info;
10085f199b7SChia-Wei Wang 
10185f199b7SChia-Wei Wang 	ep_info = (type == NON_SECURE) ? &bl33_ep_info : &bl32_ep_info;
10285f199b7SChia-Wei Wang 
10385f199b7SChia-Wei Wang 	if (!ep_info->pc) {
10485f199b7SChia-Wei Wang 		return NULL;
10585f199b7SChia-Wei Wang 	}
10685f199b7SChia-Wei Wang 
10785f199b7SChia-Wei Wang 	return ep_info;
10885f199b7SChia-Wei Wang }
109