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