fvp_bl1_setup.c 3.25 KB
Newer Older
1
/*
2
 * Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved.
3
 *
dp-arm's avatar
dp-arm committed
4
 * SPDX-License-Identifier: BSD-3-Clause
5
6
 */

7
8
9
#include <assert.h>

#include <bl1/bl1.h>
10
#include <common/tbbr/tbbr_img_def.h>
11
#include <drivers/arm/smmu_v3.h>
12
#include <drivers/arm/sp805.h>
13
#include <plat/arm/common/arm_config.h>
14
#include <plat/arm/common/plat_arm.h>
15
#include <plat/arm/common/arm_def.h>
16
17
#include <plat/common/platform.h>
#include "fvp_private.h"
18
19
20
21
22
23

/*******************************************************************************
 * Perform any BL1 specific platform actions.
 ******************************************************************************/
void bl1_early_platform_setup(void)
{
24
	arm_bl1_early_platform_setup();
25

26
	/* Initialize the platform config for future decision making */
27
	fvp_config_setup();
28

29
	/*
30
	 * Initialize Interconnect for this cluster during cold boot.
31
32
	 * No need for locks as no other CPU is active.
	 */
33
	fvp_interconnect_init();
34
	/*
35
	 * Enable coherency in Interconnect for the primary CPU's cluster.
36
	 */
37
	fvp_interconnect_enable();
38
}
39
40
41
42
43
44
45
46
47
48

void plat_arm_secure_wdt_start(void)
{
	sp805_start(ARM_SP805_TWDG_BASE, ARM_TWDG_LOAD_VAL);
}

void plat_arm_secure_wdt_stop(void)
{
	sp805_stop(ARM_SP805_TWDG_BASE);
}
49
50
51
52
53

void bl1_platform_setup(void)
{
	arm_bl1_platform_setup();

54
55
56
	/* Initialize System level generic or SP804 timer */
	fvp_timer_init();

57
58
59
60
	/* On FVP RevC, initialize SMMUv3 */
	if ((arm_config.flags & ARM_CONFIG_FVP_HAS_SMMUV3) != 0U)
		smmuv3_security_init(PLAT_FVP_SMMUV3_BASE);
}
61
62
63
64
65
66
67
68
69

__dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved)
{
	/* Setup the watchdog to reset the system as soon as possible */
	sp805_refresh(ARM_SP805_TWDG_BASE, 1U);

	while (1)
		wfi();
}
70
71

#if MEASURED_BOOT
72
73
74
75
76
77
78
79
/*
 * Calculates and writes BL2 hash data to TB_FW_CONFIG DTB.
 */
void bl1_plat_set_bl2_hash(const image_desc_t *image_desc)
{
	arm_bl1_set_bl2_hash(image_desc);
}

80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*
 * Implementation for bl1_plat_handle_post_image_load(). This function
 * populates the default arguments to BL2. The BL2 memory layout structure
 * is allocated and the calculated layout is populated in arg1 to BL2.
 */
int bl1_plat_handle_post_image_load(unsigned int image_id)
{
	meminfo_t *bl2_tzram_layout;
	meminfo_t *bl1_tzram_layout;
	image_desc_t *image_desc;
	entry_point_info_t *ep_info;

	if (image_id != BL2_IMAGE_ID) {
		return 0;
	}

	/* Get the image descriptor */
	image_desc = bl1_plat_get_image_desc(BL2_IMAGE_ID);
	assert(image_desc != NULL);

	/* Calculate BL2 hash and set it in TB_FW_CONFIG */
101
	bl1_plat_set_bl2_hash(image_desc);
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126

	/* Get the entry point info */
	ep_info = &image_desc->ep_info;

	/* Find out how much free trusted ram remains after BL1 load */
	bl1_tzram_layout = bl1_plat_sec_mem_layout();

	/*
	 * Create a new layout of memory for BL2 as seen by BL1 i.e.
	 * tell it the amount of total and free memory available.
	 * This layout is created at the first free address visible
	 * to BL2. BL2 will read the memory layout before using its
	 * memory for other purposes.
	 */
	bl2_tzram_layout = (meminfo_t *)bl1_tzram_layout->total_base;

	bl1_calc_bl2_mem_layout(bl1_tzram_layout, bl2_tzram_layout);

	ep_info->args.arg1 = (uintptr_t)bl2_tzram_layout;

	VERBOSE("BL1: BL2 memory layout address = %p\n",
		(void *)bl2_tzram_layout);
	return 0;
}
#endif /* MEASURED_BOOT */