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