blob: f2f21432d6ed94e98cb34b37571ed29876ff8588 [file] [log] [blame]
Achin Gupta4f6ad662013-10-25 09:08:21 +01001/*
Zelalem87675d42020-02-03 14:56:42 -06002 * Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved.
Achin Gupta4f6ad662013-10-25 09:08:21 +01003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Achin Gupta4f6ad662013-10-25 09:08:21 +01005 */
6
Manish V Badarkhe8717e032020-05-30 17:40:44 +01007#include <assert.h>
8
Alexei Fedorov61369a22020-07-13 14:59:02 +01009#include <common/debug.h>
Manish V Badarkhe8717e032020-05-30 17:40:44 +010010#include <common/desc_image_load.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000011#include <drivers/arm/sp804_delay_timer.h>
Alexei Fedorov61369a22020-07-13 14:59:02 +010012#if MEASURED_BOOT
13#include <drivers/measured_boot/measured_boot.h>
14#endif
Manish V Badarkhe8717e032020-05-30 17:40:44 +010015#include <lib/fconf/fconf.h>
16#include <lib/fconf/fconf_dyn_cfg_getter.h>
17
Antonio Nino Diazbd7b7402019-01-25 14:30:04 +000018#include <plat/arm/common/plat_arm.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000019#include <plat/common/platform.h>
Antonio Nino Diaza320ecd2019-01-15 14:19:50 +000020#include <platform_def.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000021
Dan Handleyed6ff952014-05-14 17:44:19 +010022#include "fvp_private.h"
Achin Gupta4f6ad662013-10-25 09:08:21 +010023
Soby Mathew7d5a2e72018-01-10 15:59:31 +000024void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3)
Achin Gupta4f6ad662013-10-25 09:08:21 +010025{
Soby Mathew96a1c6b2018-01-15 14:45:33 +000026 arm_bl2_early_platform_setup((uintptr_t)arg0, (meminfo_t *)arg1);
Achin Gupta4f6ad662013-10-25 09:08:21 +010027
28 /* Initialize the platform config for future decision making */
Dan Handleyea451572014-05-15 14:53:30 +010029 fvp_config_setup();
Vikram Kanigirid8c9d262014-05-16 18:48:12 +010030}
Ryan Harkinf96fc8f2015-03-17 14:54:01 +000031
32void bl2_platform_setup(void)
33{
34 arm_bl2_platform_setup();
35
Alexei Fedorov7131d832019-08-16 14:15:59 +010036 /* Initialize System level generic or SP804 timer */
37 fvp_timer_init();
Ryan Harkinf96fc8f2015-03-17 14:54:01 +000038}
Manish V Badarkhe8717e032020-05-30 17:40:44 +010039
40/*******************************************************************************
41 * This function returns the list of executable images
42 ******************************************************************************/
43struct bl_params *plat_get_next_bl_params(void)
44{
45 struct bl_params *arm_bl_params;
46
47 arm_bl_params = arm_get_next_bl_params();
48
49#if __aarch64__ && !BL2_AT_EL3
50 const struct dyn_cfg_dtb_info_t *fw_config_info;
51 bl_mem_params_node_t *param_node;
52 uintptr_t fw_config_base = 0U;
53 entry_point_info_t *ep_info;
54
55 /* Get BL31 image node */
56 param_node = get_bl_mem_params_node(BL31_IMAGE_ID);
57 assert(param_node != NULL);
58
59 /* get fw_config load address */
60 fw_config_info = FCONF_GET_PROPERTY(dyn_cfg, dtb, FW_CONFIG_ID);
61 assert(fw_config_info != NULL);
62
63 fw_config_base = fw_config_info->config_addr;
64 assert(fw_config_base != 0U);
65
66 /*
67 * Get the entry point info of BL31 image and override
68 * arg1 of entry point info with fw_config base address
69 */
70 ep_info = &param_node->ep_info;
71 ep_info->args.arg1 = (uint32_t)fw_config_base;
72#endif /* __aarch64__ && !BL2_AT_EL3 */
73
74 return arm_bl_params;
75}
Alexei Fedorov61369a22020-07-13 14:59:02 +010076#if MEASURED_BOOT
77static int fvp_bl2_plat_handle_post_image_load(unsigned int image_id)
78{
79 const bl_mem_params_node_t *bl_mem_params =
80 get_bl_mem_params_node(image_id);
81
82 assert(bl_mem_params != NULL);
83
84 image_info_t info = bl_mem_params->image_info;
85 int err;
86
87 if ((info.h.attr & IMAGE_ATTRIB_SKIP_LOADING) == 0U) {
88 /* Calculate image hash and record data in Event Log */
89 err = tpm_record_measurement(info.image_base,
90 info.image_size, image_id);
91 if (err != 0) {
92 ERROR("%s%s image id %u (%i)\n",
93 "BL2: Failed to ", "record", image_id, err);
94 return err;
95 }
96 }
97
98 err = arm_bl2_handle_post_image_load(image_id);
99 if (err != 0) {
100 ERROR("%s%s image id %u (%i)\n",
101 "BL2: Failed to ", "handle", image_id, err);
102 }
103
104 return err;
105}
106
107int arm_bl2_plat_handle_post_image_load(unsigned int image_id)
108{
109 int err = fvp_bl2_plat_handle_post_image_load(image_id);
110
111 if (err != 0) {
112 ERROR("%s() returns %i\n", __func__, err);
113 }
114
115 return err;
116}
117#endif /* MEASURED_BOOT */