13fc4124cSDan Handley /* 2f348aec1SManish V Badarkhe * Copyright (c) 2013-2023, Arm Limited and Contributors. All rights reserved. 33fc4124cSDan Handley * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 53fc4124cSDan Handley */ 63fc4124cSDan Handley 77fb9bcd8SManish V Badarkhe #include <assert.h> 87fb9bcd8SManish V Badarkhe 94a135bc3SAlexei Fedorov #include <common/debug.h> 107fb9bcd8SManish V Badarkhe #include <common/desc_image_load.h> 1109d40e0eSAntonio Nino Diaz #include <drivers/arm/sp804_delay_timer.h> 127fb9bcd8SManish V Badarkhe #include <lib/fconf/fconf.h> 137fb9bcd8SManish V Badarkhe #include <lib/fconf/fconf_dyn_cfg_getter.h> 1494c90ac8SHarrison Mutai #include <lib/transfer_list.h> 157fb9bcd8SManish V Badarkhe 16bd9344f6SAntonio Nino Diaz #include <plat/arm/common/plat_arm.h> 1709d40e0eSAntonio Nino Diaz #include <plat/common/platform.h> 18234bc7f8SAntonio Nino Diaz #include <platform_def.h> 1909d40e0eSAntonio Nino Diaz 203fc4124cSDan Handley #include "fvp_private.h" 213fc4124cSDan Handley 22*568d406cSHarrison Mutai static struct transfer_list_header *ns_tl __unused; 23*568d406cSHarrison Mutai 240c306cc0SSoby Mathew void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) 253fc4124cSDan Handley { 26cab0b5b0SSoby Mathew arm_bl2_early_platform_setup((uintptr_t)arg0, (meminfo_t *)arg1); 273fc4124cSDan Handley 283fc4124cSDan Handley /* Initialize the platform config for future decision making */ 293fc4124cSDan Handley fvp_config_setup(); 303fc4124cSDan Handley } 31b49b3221SRyan Harkin 32b49b3221SRyan Harkin void bl2_platform_setup(void) 33b49b3221SRyan Harkin { 34b49b3221SRyan Harkin arm_bl2_platform_setup(); 35b49b3221SRyan Harkin 36*568d406cSHarrison Mutai #if TRANSFER_LIST 37*568d406cSHarrison Mutai ns_tl = transfer_list_init((void *)FW_NS_HANDOFF_BASE, FW_HANDOFF_SIZE); 38*568d406cSHarrison Mutai assert(ns_tl != NULL); 39*568d406cSHarrison Mutai #endif 401b597c22SAlexei Fedorov /* Initialize System level generic or SP804 timer */ 411b597c22SAlexei Fedorov fvp_timer_init(); 42b49b3221SRyan Harkin } 437fb9bcd8SManish V Badarkhe 447fb9bcd8SManish V Badarkhe /******************************************************************************* 457fb9bcd8SManish V Badarkhe * This function returns the list of executable images 467fb9bcd8SManish V Badarkhe ******************************************************************************/ 477fb9bcd8SManish V Badarkhe struct bl_params *plat_get_next_bl_params(void) 487fb9bcd8SManish V Badarkhe { 497fb9bcd8SManish V Badarkhe struct bl_params *arm_bl_params; 5039f0b86aSManish V Badarkhe const struct dyn_cfg_dtb_info_t *hw_config_info __unused; 5194c90ac8SHarrison Mutai struct transfer_list_entry *te __unused; 52*568d406cSHarrison Mutai bl_mem_params_node_t *param_node __unused; 537fb9bcd8SManish V Badarkhe 547fb9bcd8SManish V Badarkhe arm_bl_params = arm_get_next_bl_params(); 557fb9bcd8SManish V Badarkhe 5642d4d3baSArvind Ram Prakash #if !RESET_TO_BL2 && !EL3_PAYLOAD_BASE 577fb9bcd8SManish V Badarkhe const struct dyn_cfg_dtb_info_t *fw_config_info; 5839f0b86aSManish V Badarkhe uintptr_t fw_config_base = 0UL; 597fb9bcd8SManish V Badarkhe 6039f0b86aSManish V Badarkhe #if __aarch64__ 617fb9bcd8SManish V Badarkhe /* Get BL31 image node */ 627fb9bcd8SManish V Badarkhe param_node = get_bl_mem_params_node(BL31_IMAGE_ID); 6339f0b86aSManish V Badarkhe #else /* aarch32 */ 6439f0b86aSManish V Badarkhe /* Get SP_MIN image node */ 6539f0b86aSManish V Badarkhe param_node = get_bl_mem_params_node(BL32_IMAGE_ID); 6639f0b86aSManish V Badarkhe #endif /* __aarch64__ */ 677fb9bcd8SManish V Badarkhe assert(param_node != NULL); 687fb9bcd8SManish V Badarkhe 69*568d406cSHarrison Mutai /* Update the next image's ep info with the FW config address */ 707fb9bcd8SManish V Badarkhe fw_config_info = FCONF_GET_PROPERTY(dyn_cfg, dtb, FW_CONFIG_ID); 717fb9bcd8SManish V Badarkhe assert(fw_config_info != NULL); 727fb9bcd8SManish V Badarkhe 737fb9bcd8SManish V Badarkhe fw_config_base = fw_config_info->config_addr; 7439f0b86aSManish V Badarkhe assert(fw_config_base != 0UL); 757fb9bcd8SManish V Badarkhe 76*568d406cSHarrison Mutai param_node->ep_info.args.arg1 = (uint32_t)fw_config_base; 7739f0b86aSManish V Badarkhe 78*568d406cSHarrison Mutai /* Update BL33's ep info with the NS HW config address */ 79*568d406cSHarrison Mutai param_node = get_bl_mem_params_node(BL33_IMAGE_ID); 80*568d406cSHarrison Mutai assert(param_node != NULL); 81*568d406cSHarrison Mutai 82*568d406cSHarrison Mutai #if TRANSFER_LIST 83*568d406cSHarrison Mutai /* Update BL33's ep info with NS HW config address */ 84*568d406cSHarrison Mutai te = transfer_list_find(ns_tl, TL_TAG_FDT); 85*568d406cSHarrison Mutai assert(te != NULL); 86*568d406cSHarrison Mutai 87*568d406cSHarrison Mutai param_node->ep_info.args.arg1 = TRANSFER_LIST_SIGNATURE | 88*568d406cSHarrison Mutai REGISTER_CONVENTION_VERSION_MASK; 89*568d406cSHarrison Mutai param_node->ep_info.args.arg2 = 0; 90*568d406cSHarrison Mutai param_node->ep_info.args.arg3 = (uintptr_t)ns_tl; 91*568d406cSHarrison Mutai param_node->ep_info.args.arg0 = 92*568d406cSHarrison Mutai te ? (uintptr_t)transfer_list_entry_data(te) : 0; 93*568d406cSHarrison Mutai #else 9439f0b86aSManish V Badarkhe hw_config_info = FCONF_GET_PROPERTY(dyn_cfg, dtb, HW_CONFIG_ID); 95a42b426bSManish V Badarkhe assert(hw_config_info != NULL); 9639f0b86aSManish V Badarkhe 97*568d406cSHarrison Mutai param_node->ep_info.args.arg1 = hw_config_info->secondary_config_addr; 9894c90ac8SHarrison Mutai #endif /* TRANSFER_LIST */ 9942d4d3baSArvind Ram Prakash #endif /* !RESET_TO_BL2 && !EL3_PAYLOAD_BASE */ 1007fb9bcd8SManish V Badarkhe 1017fb9bcd8SManish V Badarkhe return arm_bl_params; 1027fb9bcd8SManish V Badarkhe } 103ed567207SHarrison Mutai 104ed567207SHarrison Mutai int bl2_plat_handle_post_image_load(unsigned int image_id) 105ed567207SHarrison Mutai { 106*568d406cSHarrison Mutai #if !RESET_TO_BL2 && !EL3_PAYLOAD_BASE 107*568d406cSHarrison Mutai if (image_id == HW_CONFIG_ID) { 108*568d406cSHarrison Mutai const struct dyn_cfg_dtb_info_t *hw_config_info; 109*568d406cSHarrison Mutai struct transfer_list_entry *te __unused; 110*568d406cSHarrison Mutai 111*568d406cSHarrison Mutai const bl_mem_params_node_t *param_node = 112*568d406cSHarrison Mutai get_bl_mem_params_node(image_id); 113*568d406cSHarrison Mutai assert(param_node != NULL); 114*568d406cSHarrison Mutai 115*568d406cSHarrison Mutai hw_config_info = FCONF_GET_PROPERTY(dyn_cfg, dtb, HW_CONFIG_ID); 116*568d406cSHarrison Mutai assert(hw_config_info != NULL); 117*568d406cSHarrison Mutai 118*568d406cSHarrison Mutai #if TRANSFER_LIST 119*568d406cSHarrison Mutai /* Update BL33's ep info with NS HW config address */ 120*568d406cSHarrison Mutai te = transfer_list_add(ns_tl, TL_TAG_FDT, 121*568d406cSHarrison Mutai param_node->image_info.image_size, 122*568d406cSHarrison Mutai (void *)hw_config_info->config_addr); 123*568d406cSHarrison Mutai assert(te != NULL); 124*568d406cSHarrison Mutai #else 125*568d406cSHarrison Mutai memcpy((void *)hw_config_info->secondary_config_addr, 126*568d406cSHarrison Mutai (void *)hw_config_info->config_addr, 127*568d406cSHarrison Mutai (size_t)param_node->image_info.image_size); 128*568d406cSHarrison Mutai 129*568d406cSHarrison Mutai /* 130*568d406cSHarrison Mutai * Ensure HW-config device tree is committed to memory, as the HW-Config 131*568d406cSHarrison Mutai * might be used without cache and MMU enabled at BL33. 132*568d406cSHarrison Mutai */ 133*568d406cSHarrison Mutai flush_dcache_range(hw_config_info->secondary_config_addr, 134*568d406cSHarrison Mutai param_node->image_info.image_size); 135*568d406cSHarrison Mutai #endif /* TRANSFER_LIST */ 136*568d406cSHarrison Mutai } 137*568d406cSHarrison Mutai #endif /* !RESET_TO_BL2 && !EL3_PAYLOAD_BASE */ 138*568d406cSHarrison Mutai 139ed567207SHarrison Mutai return arm_bl2_plat_handle_post_image_load(image_id); 140ed567207SHarrison Mutai } 141