xref: /rk3399_ARM-atf/plat/nxp/common/img_loadr/load_img.c (revision f78cb61a11da3d965be809ebf8b592a8c33f6473)
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