mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-05-05 18:48:45 +00:00

Check return value of mmap_add_dynamic_region(). Signed-off-by: Jiafei Pan <Jiafei.Pan@nxp.com> Change-Id: I84e257b3052371e18af158c3254f42a1bae0da10
83 lines
2.3 KiB
C
83 lines
2.3 KiB
C
/*
|
|
* Copyright 2018-2022 NXP
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*
|
|
*/
|
|
|
|
#include <assert.h>
|
|
|
|
#include <common/bl_common.h>
|
|
#include <common/desc_image_load.h>
|
|
#include <lib/xlat_tables/xlat_tables_v2.h>
|
|
|
|
#include "load_img.h"
|
|
|
|
/******************************************************************************
|
|
* This function can be used to load DDR PHY/FUSE Images
|
|
*
|
|
* @param [in] image_id Image ID to be loaded
|
|
*
|
|
* @param [in,out] image_base Location at which the image should be loaded
|
|
* In case image is prepended by a CSF header,
|
|
* image_base is pointer to actual image after
|
|
* the header
|
|
*
|
|
* @param [in,out] image_size User should pass the maximum size of the image
|
|
* possible.(Buffer size starting from image_base)
|
|
* Actual size of the image loaded is returned
|
|
* back.
|
|
*****************************************************************************/
|
|
int load_img(unsigned int image_id, uintptr_t *image_base,
|
|
uint32_t *image_size)
|
|
{
|
|
int err = 0;
|
|
|
|
image_desc_t img_info = {
|
|
.image_id = image_id,
|
|
SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY,
|
|
VERSION_2, image_info_t, 0),
|
|
#ifdef CSF_HEADER_PREPENDED
|
|
.image_info.image_base = *image_base - CSF_HDR_SZ,
|
|
.image_info.image_max_size = *image_size + CSF_HDR_SZ,
|
|
#else
|
|
.image_info.image_base = *image_base,
|
|
.image_info.image_max_size = *image_size,
|
|
#endif
|
|
};
|
|
|
|
/* Create MMU entry for the CSF header */
|
|
#if PLAT_XLAT_TABLES_DYNAMIC
|
|
#ifdef CSF_HEADER_PREPENDED
|
|
err = mmap_add_dynamic_region(img_info.image_info.image_base,
|
|
img_info.image_info.image_base,
|
|
CSF_HDR_SZ,
|
|
MT_MEMORY | MT_RW | MT_SECURE);
|
|
if (err != 0) {
|
|
ERROR("Failed to add dynamic memory region.\n");
|
|
return err;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
VERBOSE("BL2: Loading IMG %d\n", image_id);
|
|
err = load_auth_image(image_id, &img_info.image_info);
|
|
if (err != 0) {
|
|
VERBOSE("Failed to load IMG %d\n", image_id);
|
|
return err;
|
|
}
|
|
|
|
#ifdef CSF_HEADER_PREPENDED
|
|
*image_base = img_info.image_info.image_base + CSF_HDR_SZ;
|
|
*image_size = img_info.image_info.image_size - CSF_HDR_SZ;
|
|
#if PLAT_XLAT_TABLES_DYNAMIC
|
|
mmap_remove_dynamic_region(img_info.image_info.image_base,
|
|
CSF_HDR_SZ);
|
|
#endif
|
|
#else
|
|
*image_base = img_info.image_info.image_base;
|
|
*image_size = img_info.image_info.image_size;
|
|
#endif
|
|
|
|
return err;
|
|
}
|