1ed7cf3bfSPankaj Gupta /* 2*5161cfdeSJiafei Pan * Copyright 2018-2022 NXP 3ed7cf3bfSPankaj Gupta * 4ed7cf3bfSPankaj Gupta * SPDX-License-Identifier: BSD-3-Clause 5ed7cf3bfSPankaj Gupta * 6ed7cf3bfSPankaj Gupta */ 7ed7cf3bfSPankaj Gupta 8ed7cf3bfSPankaj Gupta #include <assert.h> 9ed7cf3bfSPankaj Gupta 10ed7cf3bfSPankaj Gupta #include <common/bl_common.h> 11ed7cf3bfSPankaj Gupta #include <common/desc_image_load.h> 12ed7cf3bfSPankaj Gupta #include <lib/xlat_tables/xlat_tables_v2.h> 13ed7cf3bfSPankaj Gupta 14ed7cf3bfSPankaj Gupta #include "load_img.h" 15ed7cf3bfSPankaj Gupta 16ed7cf3bfSPankaj Gupta /****************************************************************************** 17ed7cf3bfSPankaj Gupta * This function can be used to load DDR PHY/FUSE Images 18ed7cf3bfSPankaj Gupta * 19ed7cf3bfSPankaj Gupta * @param [in] image_id Image ID to be loaded 20ed7cf3bfSPankaj Gupta * 21ed7cf3bfSPankaj Gupta * @param [in,out] image_base Location at which the image should be loaded 22ed7cf3bfSPankaj Gupta * In case image is prepended by a CSF header, 23ed7cf3bfSPankaj Gupta * image_base is pointer to actual image after 24ed7cf3bfSPankaj Gupta * the header 25ed7cf3bfSPankaj Gupta * 26ed7cf3bfSPankaj Gupta * @param [in,out] image_size User should pass the maximum size of the image 27ed7cf3bfSPankaj Gupta * possible.(Buffer size starting from image_base) 28ed7cf3bfSPankaj Gupta * Actual size of the image loaded is returned 29ed7cf3bfSPankaj Gupta * back. 30ed7cf3bfSPankaj Gupta *****************************************************************************/ 31ed7cf3bfSPankaj Gupta int load_img(unsigned int image_id, uintptr_t *image_base, 32ed7cf3bfSPankaj Gupta uint32_t *image_size) 33ed7cf3bfSPankaj Gupta { 34ed7cf3bfSPankaj Gupta int err = 0; 35ed7cf3bfSPankaj Gupta 36ed7cf3bfSPankaj Gupta image_desc_t img_info = { 37ed7cf3bfSPankaj Gupta .image_id = image_id, 38ed7cf3bfSPankaj Gupta SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY, 39ed7cf3bfSPankaj Gupta VERSION_2, image_info_t, 0), 40ed7cf3bfSPankaj Gupta #ifdef CSF_HEADER_PREPENDED 41ed7cf3bfSPankaj Gupta .image_info.image_base = *image_base - CSF_HDR_SZ, 42ed7cf3bfSPankaj Gupta .image_info.image_max_size = *image_size + CSF_HDR_SZ, 43ed7cf3bfSPankaj Gupta #else 44ed7cf3bfSPankaj Gupta .image_info.image_base = *image_base, 45ed7cf3bfSPankaj Gupta .image_info.image_max_size = *image_size, 46ed7cf3bfSPankaj Gupta #endif 47ed7cf3bfSPankaj Gupta }; 48ed7cf3bfSPankaj Gupta 49ed7cf3bfSPankaj Gupta /* Create MMU entry for the CSF header */ 50ed7cf3bfSPankaj Gupta #if PLAT_XLAT_TABLES_DYNAMIC 51ed7cf3bfSPankaj Gupta #ifdef CSF_HEADER_PREPENDED 52*5161cfdeSJiafei Pan err = mmap_add_dynamic_region(img_info.image_info.image_base, 53ed7cf3bfSPankaj Gupta img_info.image_info.image_base, 54ed7cf3bfSPankaj Gupta CSF_HDR_SZ, 55ed7cf3bfSPankaj Gupta MT_MEMORY | MT_RW | MT_SECURE); 56*5161cfdeSJiafei Pan if (err != 0) { 57*5161cfdeSJiafei Pan ERROR("Failed to add dynamic memory region.\n"); 58*5161cfdeSJiafei Pan return err; 59*5161cfdeSJiafei Pan } 60ed7cf3bfSPankaj Gupta #endif 61ed7cf3bfSPankaj Gupta #endif 62ed7cf3bfSPankaj Gupta 63ed7cf3bfSPankaj Gupta VERBOSE("BL2: Loading IMG %d\n", image_id); 64ed7cf3bfSPankaj Gupta err = load_auth_image(image_id, &img_info.image_info); 65ed7cf3bfSPankaj Gupta if (err != 0) { 66ed7cf3bfSPankaj Gupta VERBOSE("Failed to load IMG %d\n", image_id); 67ed7cf3bfSPankaj Gupta return err; 68ed7cf3bfSPankaj Gupta } 69ed7cf3bfSPankaj Gupta 70ed7cf3bfSPankaj Gupta #ifdef CSF_HEADER_PREPENDED 71ed7cf3bfSPankaj Gupta *image_base = img_info.image_info.image_base + CSF_HDR_SZ; 72ed7cf3bfSPankaj Gupta *image_size = img_info.image_info.image_size - CSF_HDR_SZ; 73ed7cf3bfSPankaj Gupta #if PLAT_XLAT_TABLES_DYNAMIC 74ed7cf3bfSPankaj Gupta mmap_remove_dynamic_region(img_info.image_info.image_base, 75ed7cf3bfSPankaj Gupta CSF_HDR_SZ); 76ed7cf3bfSPankaj Gupta #endif 77ed7cf3bfSPankaj Gupta #else 78ed7cf3bfSPankaj Gupta *image_base = img_info.image_info.image_base; 79ed7cf3bfSPankaj Gupta *image_size = img_info.image_info.image_size; 80ed7cf3bfSPankaj Gupta #endif 81ed7cf3bfSPankaj Gupta 82ed7cf3bfSPankaj Gupta return err; 83ed7cf3bfSPankaj Gupta } 84