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 *****************************************************************************/
load_img(unsigned int image_id,uintptr_t * image_base,uint32_t * image_size)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