xref: /arm-trusted-firmware/plat/nxp/common/img_loadr/load_img.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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