blob: 1fbdbabac787afe3c9cc0b2c7ea781d199c4cafa [file] [log] [blame]
Yatharth Kochar51f76f62016-09-12 16:10:33 +01001/*
Masahiro Yamada02a0d3d2018-02-01 16:45:51 +09002 * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
Yatharth Kochar51f76f62016-09-12 16:10:33 +01003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Yatharth Kochar51f76f62016-09-12 16:10:33 +01005 */
6
Yatharth Kochar51f76f62016-09-12 16:10:33 +01007#include <assert.h>
Yatharth Kochar51f76f62016-09-12 16:10:33 +01008#include <stdint.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00009
10#include <platform_def.h>
Yatharth Kochar51f76f62016-09-12 16:10:33 +010011
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000012#include <arch.h>
13#include <arch_helpers.h>
14#include <common/bl_common.h>
15#include <common/debug.h>
16#include <common/desc_image_load.h>
17#include <drivers/auth/auth_mod.h>
18#include <plat/common/platform.h>
19
20#include "bl2_private.h"
Yatharth Kochar51f76f62016-09-12 16:10:33 +010021
22/*******************************************************************************
23 * This function loads SCP_BL2/BL3x images and returns the ep_info for
24 * the next executable image.
25 ******************************************************************************/
Roberto Vargas02b2c2b2018-02-12 12:36:17 +000026struct entry_point_info *bl2_load_images(void)
Yatharth Kochar51f76f62016-09-12 16:10:33 +010027{
28 bl_params_t *bl2_to_next_bl_params;
29 bl_load_info_t *bl2_load_info;
30 const bl_load_info_node_t *bl2_node_info;
31 int plat_setup_done = 0;
32 int err;
33
34 /*
35 * Get information about the images to load.
36 */
37 bl2_load_info = plat_get_bl_image_load_info();
38 assert(bl2_load_info);
39 assert(bl2_load_info->head);
40 assert(bl2_load_info->h.type == PARAM_BL_LOAD_INFO);
41 assert(bl2_load_info->h.version >= VERSION_2);
42 bl2_node_info = bl2_load_info->head;
43
44 while (bl2_node_info) {
45 /*
46 * Perform platform setup before loading the image,
47 * if indicated in the image attributes AND if NOT
48 * already done before.
49 */
50 if (bl2_node_info->image_info->h.attr & IMAGE_ATTRIB_PLAT_SETUP) {
51 if (plat_setup_done) {
52 WARN("BL2: Platform setup already done!!\n");
53 } else {
54 INFO("BL2: Doing platform setup\n");
55 bl2_platform_setup();
56 plat_setup_done = 1;
57 }
58 }
59
Masahiro Yamada02a0d3d2018-02-01 16:45:51 +090060 err = bl2_plat_handle_pre_image_load(bl2_node_info->image_id);
61 if (err) {
62 ERROR("BL2: Failure in pre image load handling (%i)\n", err);
63 plat_error_handler(err);
64 }
65
Yatharth Kochar51f76f62016-09-12 16:10:33 +010066 if (!(bl2_node_info->image_info->h.attr & IMAGE_ATTRIB_SKIP_LOADING)) {
67 INFO("BL2: Loading image id %d\n", bl2_node_info->image_id);
68 err = load_auth_image(bl2_node_info->image_id,
69 bl2_node_info->image_info);
70 if (err) {
Sandrine Bailleuxe545a832020-02-03 15:58:16 +010071 ERROR("BL2: Failed to load image id %d (%i)\n",
72 bl2_node_info->image_id, err);
Yatharth Kochar51f76f62016-09-12 16:10:33 +010073 plat_error_handler(err);
74 }
75 } else {
76 INFO("BL2: Skip loading image id %d\n", bl2_node_info->image_id);
77 }
78
79 /* Allow platform to handle image information. */
80 err = bl2_plat_handle_post_image_load(bl2_node_info->image_id);
81 if (err) {
82 ERROR("BL2: Failure in post image load handling (%i)\n", err);
83 plat_error_handler(err);
84 }
85
86 /* Go to next image */
87 bl2_node_info = bl2_node_info->next_load_info;
88 }
89
90 /*
91 * Get information to pass to the next image.
92 */
93 bl2_to_next_bl_params = plat_get_next_bl_params();
94 assert(bl2_to_next_bl_params);
95 assert(bl2_to_next_bl_params->head);
96 assert(bl2_to_next_bl_params->h.type == PARAM_BL_PARAMS);
97 assert(bl2_to_next_bl_params->h.version >= VERSION_2);
Dan Handley09c97c92017-04-18 14:46:23 +010098 assert(bl2_to_next_bl_params->head->ep_info);
99
Etienne Carrieredc8bbb42018-02-05 10:42:42 +0100100 /* Populate arg0 for the next BL image if not already provided */
Etienne Carriere2b407d22018-02-06 10:58:21 +0100101 if (bl2_to_next_bl_params->head->ep_info->args.arg0 == (u_register_t)0)
Etienne Carrieredc8bbb42018-02-05 10:42:42 +0100102 bl2_to_next_bl_params->head->ep_info->args.arg0 =
103 (u_register_t)bl2_to_next_bl_params;
Yatharth Kochar51f76f62016-09-12 16:10:33 +0100104
105 /* Flush the parameters to be passed to next image */
106 plat_flush_next_bl_params();
107
108 return bl2_to_next_bl_params->head->ep_info;
109}