1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- /*
- * 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;
- }
|