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