From 4c5ccbf43c1e34e3f2f71878f732efbe2449e9f6 Mon Sep 17 00:00:00 2001 From: Jayanth Dodderi Chidanand Date: Sat, 1 Mar 2025 16:32:25 +0000 Subject: [PATCH 1/3] feat(arm): add support for Transfer List creation This patch introduces Firmware Handoff support for Arm based platforms listed under Firmware_Handoff specification. [https://firmwarehandoff.github.io/firmware_handoff/main/transfer_list.html] Signed-off-by: Jayanth Dodderi Chidanand Change-Id: Ie3f30ffe38f809db907b663a8dbf1e48944ec690 --- plat/arm/board/fvp/platform.mk | 1 - plat/arm/common/arm_common.mk | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/plat/arm/board/fvp/platform.mk b/plat/arm/board/fvp/platform.mk index e43d025c6..8c114e72f 100644 --- a/plat/arm/board/fvp/platform.mk +++ b/plat/arm/board/fvp/platform.mk @@ -433,7 +433,6 @@ endif $(eval $(call TOOL_ADD_PAYLOAD,${FVP_HW_CONFIG},--hw-config,${FVP_HW_CONFIG})) ifeq (${TRANSFER_LIST}, 1) -include lib/transfer_list/transfer_list.mk ifeq ($(RESET_TO_BL31), 1) FW_HANDOFF_SIZE := 20000 diff --git a/plat/arm/common/arm_common.mk b/plat/arm/common/arm_common.mk index c8f6b4132..3dd38cd0f 100644 --- a/plat/arm/common/arm_common.mk +++ b/plat/arm/common/arm_common.mk @@ -311,6 +311,7 @@ BL31_SOURCES += plat/arm/common/arm_bl31_setup.c \ plat/common/plat_psci_common.c ifeq (${TRANSFER_LIST}, 1) + include lib/transfer_list/transfer_list.mk TRANSFER_LIST_SOURCES += plat/arm/common/arm_transfer_list.c endif From 8187b95ec075cae46dfcbc434aa3bf9464c0d2fc Mon Sep 17 00:00:00 2001 From: Jayanth Dodderi Chidanand Date: Thu, 13 Mar 2025 10:52:46 +0000 Subject: [PATCH 2/3] refactor(arm): simplify early platform setup function in BL2 Refactor `arm_bl2_early_platform_setup` to accept generic u_register_t values, enabling support for firmware handoff boot arguments in common code. This simplifies the interface for early platform setup. Signed-off-by: Jayanth Dodderi Chidanand Change-Id: Ie0dbe4d32bbef22bd185fdafe50091a2ea5f550f --- include/plat/arm/common/plat_arm.h | 5 +++-- plat/arm/board/a5ds/a5ds_bl2_setup.c | 4 ++-- plat/arm/board/fvp/fvp_bl2_setup.c | 5 +---- plat/arm/board/fvp_ve/fvp_ve_bl2_setup.c | 4 ++-- plat/arm/common/arm_bl2_setup.c | 20 ++++++++++---------- plat/arm/css/common/css_bl2_setup.c | 4 ++-- 6 files changed, 20 insertions(+), 22 deletions(-) diff --git a/include/plat/arm/common/plat_arm.h b/include/plat/arm/common/plat_arm.h index 2e72de2a2..397b5e4cb 100644 --- a/include/plat/arm/common/plat_arm.h +++ b/include/plat/arm/common/plat_arm.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -249,7 +249,8 @@ void arm_bl1_platform_setup(void); void arm_bl1_plat_arch_setup(void); /* BL2 utility functions */ -void arm_bl2_early_platform_setup(uintptr_t fw_config, struct meminfo *mem_layout); +void arm_bl2_early_platform_setup(u_register_t arg0, u_register_t arg1, + u_register_t arg2, u_register_t arg3); void arm_bl2_platform_setup(void); void arm_bl2_plat_arch_setup(void); uint32_t arm_get_spsr_for_bl32_entry(void); diff --git a/plat/arm/board/a5ds/a5ds_bl2_setup.c b/plat/arm/board/a5ds/a5ds_bl2_setup.c index a0aa639ab..3e2618879 100644 --- a/plat/arm/board/a5ds/a5ds_bl2_setup.c +++ b/plat/arm/board/a5ds/a5ds_bl2_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Arm Limited. All rights reserved. + * Copyright (c) 2019-2025, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -9,7 +9,7 @@ void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) { - arm_bl2_early_platform_setup((uintptr_t)arg0, (meminfo_t *)arg1); + arm_bl2_early_platform_setup(arg0, arg1, arg2, arg3); } void bl2_platform_setup(void) diff --git a/plat/arm/board/fvp/fvp_bl2_setup.c b/plat/arm/board/fvp/fvp_bl2_setup.c index 90d9608ca..989f0580c 100644 --- a/plat/arm/board/fvp/fvp_bl2_setup.c +++ b/plat/arm/board/fvp/fvp_bl2_setup.c @@ -52,10 +52,7 @@ static const arm_gpt_info_t arm_gpt_info = { void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) { -#if TRANSFER_LIST - arg0 = arg3; -#endif - arm_bl2_early_platform_setup((uintptr_t)arg0, (meminfo_t *)arg1); + arm_bl2_early_platform_setup(arg0, arg1, arg2, arg3); /* Initialize the platform config for future decision making */ fvp_config_setup(); diff --git a/plat/arm/board/fvp_ve/fvp_ve_bl2_setup.c b/plat/arm/board/fvp_ve/fvp_ve_bl2_setup.c index cc29f36c5..3209a1c2d 100644 --- a/plat/arm/board/fvp_ve/fvp_ve_bl2_setup.c +++ b/plat/arm/board/fvp_ve/fvp_ve_bl2_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Arm Limited. All rights reserved. + * Copyright (c) 2019-2025, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -15,7 +15,7 @@ void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) { - arm_bl2_early_platform_setup((uintptr_t)arg0, (meminfo_t *)arg1); + arm_bl2_early_platform_setup(arg0, arg1, arg2, arg3); /* Initialize the platform config for future decision making */ fvp_ve_config_setup(); diff --git a/plat/arm/common/arm_bl2_setup.c b/plat/arm/common/arm_bl2_setup.c index 17dc0ed29..641862855 100644 --- a/plat/arm/common/arm_bl2_setup.c +++ b/plat/arm/common/arm_bl2_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -66,8 +66,8 @@ struct transfer_list_header *secure_tl __unused; * in x0. This memory layout is sitting at the base of the free trusted SRAM. * Copy it to a safe location before its reclaimed by later BL2 functionality. ******************************************************************************/ -void arm_bl2_early_platform_setup(uintptr_t fw_config, - struct meminfo *mem_layout) +void arm_bl2_early_platform_setup(u_register_t arg0, u_register_t arg1, + u_register_t arg2, u_register_t arg3) { struct transfer_list_entry *te __unused; int __maybe_unused ret; @@ -76,8 +76,7 @@ void arm_bl2_early_platform_setup(uintptr_t fw_config, arm_console_boot_init(); #if TRANSFER_LIST - // TODO: modify the prototype of this function fw_config != bl2_tl - secure_tl = (struct transfer_list_header *)fw_config; + secure_tl = (struct transfer_list_header *)arg3; te = transfer_list_find(secure_tl, TL_TAG_SRAM_LAYOUT64); assert(te != NULL); @@ -85,11 +84,11 @@ void arm_bl2_early_platform_setup(uintptr_t fw_config, bl2_tzram_layout = *(meminfo_t *)transfer_list_entry_data(te); transfer_list_rem(secure_tl, te); #else - config_base = fw_config; + config_base = (uintptr_t)arg0; /* Setup the BL2 memory layout */ - bl2_tzram_layout = *mem_layout; -#endif + bl2_tzram_layout = *(meminfo_t *)arg1; +#endif /* TRANSFER_LIST */ /* Initialise the IO layer and register platform IO devices */ plat_arm_io_setup(); @@ -105,9 +104,10 @@ void arm_bl2_early_platform_setup(uintptr_t fw_config, #endif /* ARM_GPT_SUPPORT */ } -void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) +void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, + u_register_t arg2, u_register_t arg3) { - arm_bl2_early_platform_setup((uintptr_t)arg0, (meminfo_t *)arg1); + arm_bl2_early_platform_setup(arg0, arg1, arg2, arg3); generic_delay_timer_init(); } diff --git a/plat/arm/css/common/css_bl2_setup.c b/plat/arm/css/common/css_bl2_setup.c index 1e055c599..995ef780f 100644 --- a/plat/arm/css/common/css_bl2_setup.c +++ b/plat/arm/css/common/css_bl2_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -56,7 +56,7 @@ static unsigned int scp_boot_config; void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) { - arm_bl2_early_platform_setup((uintptr_t)arg0, (meminfo_t *)arg1); + arm_bl2_early_platform_setup(arg0, arg1, arg2, arg3); /* Save SCP Boot config before it gets overwritten by SCP_BL2 loading */ scp_boot_config = mmio_read_32(SCP_BOOT_CFG_ADDR); From b6e6e2e610e5a720aa7755f61f62d38921d95603 Mon Sep 17 00:00:00 2001 From: Jayanth Dodderi Chidanand Date: Thu, 20 Mar 2025 12:06:08 +0000 Subject: [PATCH 3/3] refactor(arm): simplify early platform setup function in BL31 Refactor `arm_bl31_early_platform_setup` to accept generic u_register_t values, enabling support for firmware handoff boot arguments in common code. This simplifies the interface for early platform setup. Signed-off-by: Jayanth Dodderi Chidanand Change-Id: Iff20300d2372e1a9825827ddccbd1b3bc6751e40 --- include/plat/arm/common/plat_arm.h | 5 --- plat/arm/board/fvp/fvp_bl31_setup.c | 13 +++---- plat/arm/board/juno/juno_bl31_setup.c | 4 +- .../board/neoverse_rd/common/nrd_bl31_setup.c | 2 +- plat/arm/board/tc/tc_bl31_setup.c | 5 ++- plat/arm/common/arm_bl31_setup.c | 38 ++++++------------- 6 files changed, 24 insertions(+), 43 deletions(-) diff --git a/include/plat/arm/common/plat_arm.h b/include/plat/arm/common/plat_arm.h index 397b5e4cb..396bd14cf 100644 --- a/include/plat/arm/common/plat_arm.h +++ b/include/plat/arm/common/plat_arm.h @@ -274,13 +274,8 @@ void arm_bl2u_platform_setup(void); void arm_bl2u_plat_arch_setup(void); /* BL31 utility functions */ -#if TRANSFER_LIST void arm_bl31_early_platform_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3); -#else -void arm_bl31_early_platform_setup(void *from_bl2, uintptr_t soc_fw_config, - uintptr_t hw_config, void *plat_params_from_bl2); -#endif void arm_bl31_platform_setup(void); void arm_bl31_plat_runtime_setup(void); void arm_bl31_plat_arch_setup(void); diff --git a/plat/arm/board/fvp/fvp_bl31_setup.c b/plat/arm/board/fvp/fvp_bl31_setup.c index e08756562..aa7b875b1 100644 --- a/plat/arm/board/fvp/fvp_bl31_setup.c +++ b/plat/arm/board/fvp/fvp_bl31_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2013-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -28,10 +28,7 @@ void __init bl31_early_platform_setup2(u_register_t arg0, /* Initialize the console to provide early debug support */ arm_console_boot_init(); -#if TRANSFER_LIST - arm_bl31_early_platform_setup(arg0, arg1, arg2, arg3); -#else -#if !RESET_TO_BL31 && !RESET_TO_BL2 +#if !(TRANSFER_LIST || RESET_TO_BL31 || RESET_TO_BL2) const struct dyn_cfg_dtb_info_t *soc_fw_config_info; INFO("BL31 FCONF: FW_CONFIG address = %lx\n", (uintptr_t)arg1); @@ -53,9 +50,9 @@ void __init bl31_early_platform_setup2(u_register_t arg0, assert(hw_config_info != NULL); assert(hw_config_info->secondary_config_addr != 0UL); arg2 = hw_config_info->secondary_config_addr; -#endif /* !RESET_TO_BL31 && !RESET_TO_BL2 */ - arm_bl31_early_platform_setup((void *)arg0, arg1, arg2, (void *)arg3); -#endif /* TRANSFER_LIST */ +#endif /* !(TRANSFER_LIST || RESET_TO_BL31 || RESET_TO_BL2)*/ + + arm_bl31_early_platform_setup(arg0, arg1, arg2, arg3); /* Initialize the platform config for future decision making */ fvp_config_setup(); diff --git a/plat/arm/board/juno/juno_bl31_setup.c b/plat/arm/board/juno/juno_bl31_setup.c index 7a0a6d97b..2eec105c0 100644 --- a/plat/arm/board/juno/juno_bl31_setup.c +++ b/plat/arm/board/juno/juno_bl31_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2021-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -27,7 +27,7 @@ void __init bl31_early_platform_setup2(u_register_t arg0, arg1 = soc_fw_config_info->config_addr; } - arm_bl31_early_platform_setup((void *)arg0, arg1, arg2, (void *)arg3); + arm_bl31_early_platform_setup(arg0, arg1, arg2, arg3); /* * Initialize Interconnect for this cluster during cold boot. diff --git a/plat/arm/board/neoverse_rd/common/nrd_bl31_setup.c b/plat/arm/board/neoverse_rd/common/nrd_bl31_setup.c index 2dd8b452a..bb89c04da 100644 --- a/plat/arm/board/neoverse_rd/common/nrd_bl31_setup.c +++ b/plat/arm/board/neoverse_rd/common/nrd_bl31_setup.c @@ -179,7 +179,7 @@ void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, arg1 = soc_fw_config_info->config_addr; } #endif /* SPMD_SPM_AT_SEL2 && !RESET_TO_BL31 */ - arm_bl31_early_platform_setup((void *)arg0, arg1, arg2, (void *)arg3); + arm_bl31_early_platform_setup(arg0, arg1, arg2, arg3); } /******************************************************************************* diff --git a/plat/arm/board/tc/tc_bl31_setup.c b/plat/arm/board/tc/tc_bl31_setup.c index 5d19aeb9f..66d921da0 100644 --- a/plat/arm/board/tc/tc_bl31_setup.c +++ b/plat/arm/board/tc/tc_bl31_setup.c @@ -154,7 +154,10 @@ scmi_channel_plat_info_t *plat_css_get_scmi_info(unsigned int channel_id __unuse void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) { - arm_bl31_early_platform_setup((void *)arg0, arg1, arg2, (void *)arg3); + /* Initialize the console to provide early debug support */ + arm_console_boot_init(); + + arm_bl31_early_platform_setup(arg0, arg1, arg2, arg3); /* Fill the properties struct with the info from the config dtb */ fconf_populate("FW_CONFIG", arg1); diff --git a/plat/arm/common/arm_bl31_setup.c b/plat/arm/common/arm_bl31_setup.c index b67df36b0..bf2d8cd3e 100644 --- a/plat/arm/common/arm_bl31_setup.c +++ b/plat/arm/common/arm_bl31_setup.c @@ -154,10 +154,10 @@ struct entry_point_info *bl31_plat_get_next_image_ep_info(uint32_t type) * while creating page tables. BL2 has flushed this information to memory, so * we are guaranteed to pick up good data. ******************************************************************************/ -#if TRANSFER_LIST void __init arm_bl31_early_platform_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) { +#if TRANSFER_LIST #if RESET_TO_BL31 /* Populate entry point information for BL33 */ SET_PARAM_HEAD(&bl33_image_ep_info, PARAM_EP, VERSION_1, 0); @@ -208,18 +208,11 @@ void __init arm_bl31_early_platform_setup(u_register_t arg0, u_register_t arg1, } } #endif /* RESET_TO_BL31 */ -} -#else -void __init arm_bl31_early_platform_setup(void *from_bl2, uintptr_t soc_fw_config, - uintptr_t hw_config, void *plat_params_from_bl2) -{ - /* Initialize the console to provide early debug support */ - arm_console_boot_init(); - +#else /* (!TRANSFER_LIST) */ #if RESET_TO_BL31 /* There are no parameters from BL2 if BL31 is a reset vector */ - assert(from_bl2 == NULL); - assert(plat_params_from_bl2 == NULL); + assert((void *)arg0 == NULL); + assert((void *)arg3 == NULL); # ifdef BL32_BASE /* Populate entry point information for BL32 */ @@ -258,21 +251,18 @@ void __init arm_bl31_early_platform_setup(void *from_bl2, uintptr_t soc_fw_confi */ rmm_image_ep_info.pc = RMM_BASE; #endif /* ENABLE_RME */ - #else /* RESET_TO_BL31 */ - /* - * In debug builds, we pass a special value in 'plat_params_from_bl2' + * In debug builds, we pass a special value in 'arg3' * to verify platform parameters from BL2 to BL31. * In release builds, it's not used. */ - assert(((unsigned long long)plat_params_from_bl2) == - ARM_BL31_PLAT_PARAM_VAL); + assert(((unsigned long long)arg3) == ARM_BL31_PLAT_PARAM_VAL); /* * Check params passed from BL2 should not be NULL, */ - bl_params_t *params_from_bl2 = (bl_params_t *)from_bl2; + bl_params_t *params_from_bl2 = (bl_params_t *)arg0; assert(params_from_bl2 != NULL); assert(params_from_bl2->h.type == PARAM_BL_PARAMS); assert(params_from_bl2->h.version >= VERSION_2); @@ -325,7 +315,7 @@ void __init arm_bl31_early_platform_setup(void *from_bl2, uintptr_t soc_fw_confi #endif #endif /* RESET_TO_BL31 */ -# if ARM_LINUX_KERNEL_AS_BL33 +#if ARM_LINUX_KERNEL_AS_BL33 /* * According to the file ``Documentation/arm64/booting.txt`` of the * Linux kernel tree, Linux expects the physical address of the device @@ -339,23 +329,19 @@ void __init arm_bl31_early_platform_setup(void *from_bl2, uintptr_t soc_fw_confi #if RESET_TO_BL31 bl33_image_ep_info.args.arg0 = (u_register_t)ARM_PRELOADED_DTB_BASE; #else - bl33_image_ep_info.args.arg0 = (u_register_t)hw_config; -#endif + bl33_image_ep_info.args.arg0 = arg2; +#endif /* RESET_TO_BL31 */ bl33_image_ep_info.args.arg1 = 0U; bl33_image_ep_info.args.arg2 = 0U; bl33_image_ep_info.args.arg3 = 0U; -# endif +#endif /* ARM_LINUX_KERNEL_AS_BL33 */ +#endif /* TRANSFER_LIST */ } -#endif void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) { -#if TRANSFER_LIST arm_bl31_early_platform_setup(arg0, arg1, arg2, arg3); -#else - arm_bl31_early_platform_setup((void *)arg0, arg1, arg2, (void *)arg3); -#endif /* * Initialize Interconnect for this cluster during cold boot.