xref: /rk3399_ARM-atf/plat/arm/board/juno/juno_bl2_setup.c (revision fad88444e30621ec711dedf9ff5b4a3675b2b3a9)
107570d59SYatharth Kochar /*
2*fad88444SYeoreum Yun  * Copyright (c) 2016-2025, ARM Limited and Contributors. All rights reserved.
307570d59SYatharth Kochar  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
507570d59SYatharth Kochar  */
607570d59SYatharth Kochar 
707570d59SYatharth Kochar #include <assert.h>
809d40e0eSAntonio Nino Diaz 
909d40e0eSAntonio Nino Diaz #include <common/bl_common.h>
1009d40e0eSAntonio Nino Diaz #include <common/desc_image_load.h>
115d5fb10fSMikael Olsson #include <lib/fconf/fconf.h>
125d5fb10fSMikael Olsson #include <lib/fconf/fconf_dyn_cfg_getter.h>
135d5fb10fSMikael Olsson 
14bd9344f6SAntonio Nino Diaz #include <plat/arm/common/plat_arm.h>
1507570d59SYatharth Kochar 
1607570d59SYatharth Kochar #if JUNO_AARCH32_EL3_RUNTIME
1707570d59SYatharth Kochar /*******************************************************************************
1807570d59SYatharth Kochar  * This function changes the spsr for BL32 image to bypass
1907570d59SYatharth Kochar  * the check in BL1 AArch64 exception handler. This is needed in the aarch32
2007570d59SYatharth Kochar  * boot flow as the core comes up in aarch64 and to enter the BL32 image a warm
2107570d59SYatharth Kochar  * reset in aarch32 state is required.
2207570d59SYatharth Kochar  ******************************************************************************/
23490eeb04SDaniel Boulby int arm_bl2_plat_handle_post_image_load(unsigned int image_id)
2407570d59SYatharth Kochar {
2507570d59SYatharth Kochar 	int err = arm_bl2_handle_post_image_load(image_id);
2607570d59SYatharth Kochar 
2707570d59SYatharth Kochar 	if (!err && (image_id == BL32_IMAGE_ID)) {
2807570d59SYatharth Kochar 		bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id);
2907570d59SYatharth Kochar 		assert(bl_mem_params);
3007570d59SYatharth Kochar 		bl_mem_params->ep_info.spsr = SPSR_64(MODE_EL3, MODE_SP_ELX,
3107570d59SYatharth Kochar 			DISABLE_ALL_EXCEPTIONS);
3207570d59SYatharth Kochar 	}
3307570d59SYatharth Kochar 
3407570d59SYatharth Kochar 	return err;
3507570d59SYatharth Kochar }
365d5fb10fSMikael Olsson 
375d5fb10fSMikael Olsson #else
385d5fb10fSMikael Olsson 
395d5fb10fSMikael Olsson /*******************************************************************************
405d5fb10fSMikael Olsson  * This function returns the list of executable images
415d5fb10fSMikael Olsson  ******************************************************************************/
425d5fb10fSMikael Olsson struct bl_params *plat_get_next_bl_params(void)
435d5fb10fSMikael Olsson {
445d5fb10fSMikael Olsson 	struct bl_params *arm_bl_params = arm_get_next_bl_params();
455d5fb10fSMikael Olsson 
465d5fb10fSMikael Olsson #if __aarch64__
47*fad88444SYeoreum Yun 	const struct dyn_cfg_dtb_info_t *fw_config_info __maybe_unused;
48*fad88444SYeoreum Yun 	bl_mem_params_node_t *param_node __maybe_unused;
49*fad88444SYeoreum Yun 	uintptr_t fw_config_base __maybe_unused = 0U;
50*fad88444SYeoreum Yun 	entry_point_info_t *ep_info __maybe_unused;
515d5fb10fSMikael Olsson 
525d5fb10fSMikael Olsson 	/* Get BL31 image node */
535d5fb10fSMikael Olsson 	param_node = get_bl_mem_params_node(BL31_IMAGE_ID);
545d5fb10fSMikael Olsson 	assert(param_node != NULL);
555d5fb10fSMikael Olsson 
56*fad88444SYeoreum Yun #if TRANSFER_LIST
57*fad88444SYeoreum Yun 	arm_bl_params->head = &param_node->params_node_mem;
58*fad88444SYeoreum Yun 	arm_bl_params->head->ep_info = &param_node->ep_info;
59*fad88444SYeoreum Yun 	arm_bl_params->head->image_id = param_node->image_id;
60*fad88444SYeoreum Yun 
61*fad88444SYeoreum Yun 	arm_bl2_setup_next_ep_info(param_node);
62*fad88444SYeoreum Yun #else
635d5fb10fSMikael Olsson 	/* Get fw_config load address */
645d5fb10fSMikael Olsson 	fw_config_info = FCONF_GET_PROPERTY(dyn_cfg, dtb, FW_CONFIG_ID);
655d5fb10fSMikael Olsson 	assert(fw_config_info != NULL);
665d5fb10fSMikael Olsson 
675d5fb10fSMikael Olsson 	fw_config_base = fw_config_info->config_addr;
685d5fb10fSMikael Olsson 	assert(fw_config_base != 0U);
695d5fb10fSMikael Olsson 
705d5fb10fSMikael Olsson 	/*
715d5fb10fSMikael Olsson 	 * Get the entry point info of BL31 image and override
725d5fb10fSMikael Olsson 	 * arg1 of entry point info with fw_config base address
735d5fb10fSMikael Olsson 	 */
745d5fb10fSMikael Olsson 	ep_info = &param_node->ep_info;
755d5fb10fSMikael Olsson 	ep_info->args.arg1 = (uint32_t)fw_config_base;
76*fad88444SYeoreum Yun #endif /* TRANSFER_LIST */
775d5fb10fSMikael Olsson #endif /* __aarch64__ */
785d5fb10fSMikael Olsson 
795d5fb10fSMikael Olsson 	return arm_bl_params;
805d5fb10fSMikael Olsson }
8107570d59SYatharth Kochar #endif /* JUNO_AARCH32_EL3_RUNTIME */
82