blob: dd8f13bb6203d135772c10cf44a5dbaa0ffad85d [file] [log] [blame]
Dan Handleyb4315302015-03-19 18:58:55 +00001/*
Gary Morrison5fb061e2021-01-27 13:08:47 -06002 * Copyright (c) 2015-2021, ARM Limited and Contributors. All rights reserved.
Dan Handleyb4315302015-03-19 18:58:55 +00003 *
dp-arm82cb2c12017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Dan Handleyb4315302015-03-19 18:58:55 +00005 */
6
Daniel Boulbyd323af92018-07-06 16:54:44 +01007#include <assert.h>
Antonio Nino Diaz09d40e02018-12-14 00:18:21 +00008
Isla Mitchell4adb10c2017-07-14 10:48:25 +01009#include <platform_def.h>
Antonio Nino Diaz09d40e02018-12-14 00:18:21 +000010
11#include <arch.h>
12#include <bl1/bl1.h>
13#include <common/bl_common.h>
Louis Mayencourt3b5ea742019-10-17 14:46:51 +010014#include <lib/fconf/fconf.h>
Manish V Badarkhe82869672020-06-11 22:32:11 +010015#include <lib/fconf/fconf_dyn_cfg_getter.h>
Antonio Nino Diaz09d40e02018-12-14 00:18:21 +000016#include <lib/utils.h>
17#include <lib/xlat_tables/xlat_tables_compat.h>
Antonio Nino Diazbd9344f2019-01-25 14:30:04 +000018#include <plat/arm/common/plat_arm.h>
Antonio Nino Diaz09d40e02018-12-14 00:18:21 +000019#include <plat/common/platform.h>
20
Dan Handleyb4315302015-03-19 18:58:55 +000021/* Weak definitions may be overridden in specific ARM standard platform */
22#pragma weak bl1_early_platform_setup
23#pragma weak bl1_plat_arch_setup
Dan Handleyb4315302015-03-19 18:58:55 +000024#pragma weak bl1_plat_sec_mem_layout
Gary Morrison5fb061e2021-01-27 13:08:47 -060025#pragma weak arm_bl1_early_platform_setup
Yatharth Kochar07570d52016-11-14 12:01:04 +000026#pragma weak bl1_plat_prepare_exit
Sathees Balya4da6f6c2018-09-03 17:41:13 +010027#pragma weak bl1_plat_get_next_image_id
28#pragma weak plat_arm_bl1_fwu_needed
Gary Morrison5fb061e2021-01-27 13:08:47 -060029#pragma weak arm_bl1_plat_arch_setup
Dan Handleyb4315302015-03-19 18:58:55 +000030
Daniel Boulbyd323af92018-07-06 16:54:44 +010031#define MAP_BL1_TOTAL MAP_REGION_FLAT( \
32 bl1_tzram_layout.total_base, \
33 bl1_tzram_layout.total_size, \
34 MT_MEMORY | MT_RW | MT_SECURE)
Daniel Boulby2ecaafd2018-07-16 14:09:15 +010035/*
36 * If SEPARATE_CODE_AND_RODATA=1 we define a region for each section
37 * otherwise one region is defined containing both
38 */
39#if SEPARATE_CODE_AND_RODATA
40#define MAP_BL1_RO MAP_REGION_FLAT( \
Daniel Boulbyd323af92018-07-06 16:54:44 +010041 BL_CODE_BASE, \
42 BL1_CODE_END - BL_CODE_BASE, \
Daniel Boulby2ecaafd2018-07-16 14:09:15 +010043 MT_CODE | MT_SECURE), \
44 MAP_REGION_FLAT( \
Daniel Boulbyd323af92018-07-06 16:54:44 +010045 BL1_RO_DATA_BASE, \
46 BL1_RO_DATA_END \
47 - BL_RO_DATA_BASE, \
48 MT_RO_DATA | MT_SECURE)
Daniel Boulby2ecaafd2018-07-16 14:09:15 +010049#else
50#define MAP_BL1_RO MAP_REGION_FLAT( \
51 BL_CODE_BASE, \
52 BL1_CODE_END - BL_CODE_BASE, \
53 MT_CODE | MT_SECURE)
54#endif
Dan Handleyb4315302015-03-19 18:58:55 +000055
56/* Data structure which holds the extents of the trusted SRAM for BL1*/
57static meminfo_t bl1_tzram_layout;
58
Manish V Badarkhea249a9d2020-07-14 11:28:36 +010059/* Boolean variable to hold condition whether firmware update needed or not */
60static bool is_fwu_needed;
61
Sandrine Bailleux6c77e742018-07-11 12:44:22 +020062struct meminfo *bl1_plat_sec_mem_layout(void)
Dan Handleyb4315302015-03-19 18:58:55 +000063{
64 return &bl1_tzram_layout;
65}
66
67/*******************************************************************************
68 * BL1 specific platform actions shared between ARM standard platforms.
69 ******************************************************************************/
70void arm_bl1_early_platform_setup(void)
71{
Dan Handleyb4315302015-03-19 18:58:55 +000072
Juan Castillo7b4c1402015-10-06 14:01:35 +010073#if !ARM_DISABLE_TRUSTED_WDOG
74 /* Enable watchdog */
Aditya Angadib0c97da2019-04-16 11:29:14 +053075 plat_arm_secure_wdt_start();
Juan Castillo7b4c1402015-10-06 14:01:35 +010076#endif
77
Dan Handleyb4315302015-03-19 18:58:55 +000078 /* Initialize the console to provide early debug support */
Antonio Nino Diaz88a05232018-06-19 09:29:36 +010079 arm_console_boot_init();
Dan Handleyb4315302015-03-19 18:58:55 +000080
81 /* Allow BL1 to see the whole Trusted RAM */
82 bl1_tzram_layout.total_base = ARM_BL_RAM_BASE;
83 bl1_tzram_layout.total_size = ARM_BL_RAM_SIZE;
Dan Handleyb4315302015-03-19 18:58:55 +000084}
85
86void bl1_early_platform_setup(void)
87{
88 arm_bl1_early_platform_setup();
89
90 /*
Vikram Kanigiri6355f232016-02-15 11:54:14 +000091 * Initialize Interconnect for this cluster during cold boot.
Dan Handleyb4315302015-03-19 18:58:55 +000092 * No need for locks as no other CPU is active.
93 */
Vikram Kanigiri6355f232016-02-15 11:54:14 +000094 plat_arm_interconnect_init();
Dan Handleyb4315302015-03-19 18:58:55 +000095 /*
Vikram Kanigiri6355f232016-02-15 11:54:14 +000096 * Enable Interconnect coherency for the primary CPU's cluster.
Dan Handleyb4315302015-03-19 18:58:55 +000097 */
Vikram Kanigiri6355f232016-02-15 11:54:14 +000098 plat_arm_interconnect_enter_coherency();
Dan Handleyb4315302015-03-19 18:58:55 +000099}
100
101/******************************************************************************
102 * Perform the very early platform specific architecture setup shared between
103 * ARM standard platforms. This only does basic initialization. Later
104 * architectural setup (bl1_arch_setup()) does not do anything platform
105 * specific.
106 *****************************************************************************/
107void arm_bl1_plat_arch_setup(void)
108{
Soby Mathew943bb7f2018-09-18 11:42:42 +0100109#if USE_COHERENT_MEM && !ARM_CRYPTOCELL_INTEG
110 /*
111 * Ensure ARM platforms don't use coherent memory in BL1 unless
112 * cryptocell integration is enabled.
113 */
Daniel Boulbyd323af92018-07-06 16:54:44 +0100114 assert((BL_COHERENT_RAM_END - BL_COHERENT_RAM_BASE) == 0U);
Dan Handleyb4315302015-03-19 18:58:55 +0000115#endif
Daniel Boulbyd323af92018-07-06 16:54:44 +0100116
117 const mmap_region_t bl_regions[] = {
118 MAP_BL1_TOTAL,
Daniel Boulby2ecaafd2018-07-16 14:09:15 +0100119 MAP_BL1_RO,
Roberto Vargas1eb735d2018-05-23 09:27:06 +0100120#if USE_ROMLIB
121 ARM_MAP_ROMLIB_CODE,
122 ARM_MAP_ROMLIB_DATA,
Soby Mathew943bb7f2018-09-18 11:42:42 +0100123#endif
124#if ARM_CRYPTOCELL_INTEG
125 ARM_MAP_BL_COHERENT_RAM,
126#endif
Daniel Boulbyd323af92018-07-06 16:54:44 +0100127 {0}
128 };
129
Roberto Vargas0916c382018-10-19 16:44:18 +0100130 setup_page_tables(bl_regions, plat_arm_get_mmap());
Julius Werner402b3cf2019-07-09 14:02:43 -0700131#ifdef __aarch64__
Sandrine Bailleuxb5fa6562016-05-18 16:11:47 +0100132 enable_mmu_el3(0);
Julius Werner402b3cf2019-07-09 14:02:43 -0700133#else
134 enable_mmu_svc_mon(0);
135#endif /* __aarch64__ */
Roberto Vargas1eb735d2018-05-23 09:27:06 +0100136
137 arm_setup_romlib();
Dan Handleyb4315302015-03-19 18:58:55 +0000138}
139
140void bl1_plat_arch_setup(void)
141{
142 arm_bl1_plat_arch_setup();
143}
144
145/*
146 * Perform the platform specific architecture setup shared between
147 * ARM standard platforms.
148 */
149void arm_bl1_platform_setup(void)
150{
Manish V Badarkhe82869672020-06-11 22:32:11 +0100151 const struct dyn_cfg_dtb_info_t *fw_config_info;
152 image_desc_t *desc;
153 uint32_t fw_config_max_size;
154 int err = -1;
155
Dan Handleyb4315302015-03-19 18:58:55 +0000156 /* Initialise the IO layer and register platform IO devices */
157 plat_arm_io_setup();
Louis Mayencourt3b5ea742019-10-17 14:46:51 +0100158
Manish V Badarkhe82869672020-06-11 22:32:11 +0100159 /* Check if we need FWU before further processing */
Manish V Badarkhea249a9d2020-07-14 11:28:36 +0100160 is_fwu_needed = plat_arm_bl1_fwu_needed();
161 if (is_fwu_needed) {
Manish V Badarkhe82869672020-06-11 22:32:11 +0100162 ERROR("Skip platform setup as FWU detected\n");
163 return;
164 }
165
166 /* Set global DTB info for fixed fw_config information */
167 fw_config_max_size = ARM_FW_CONFIG_LIMIT - ARM_FW_CONFIG_BASE;
Manish V Badarkhef4417182020-07-15 05:08:37 +0100168 set_config_info(ARM_FW_CONFIG_BASE, fw_config_max_size, FW_CONFIG_ID);
Manish V Badarkhe82869672020-06-11 22:32:11 +0100169
170 /* Fill the device tree information struct with the info from the config dtb */
171 err = fconf_load_config(FW_CONFIG_ID);
172 if (err < 0) {
173 ERROR("Loading of FW_CONFIG failed %d\n", err);
174 plat_error_handler(err);
175 }
176
177 /*
178 * FW_CONFIG loaded successfully. If FW_CONFIG device tree parsing
179 * is successful then load TB_FW_CONFIG device tree.
180 */
181 fw_config_info = FCONF_GET_PROPERTY(dyn_cfg, dtb, FW_CONFIG_ID);
182 if (fw_config_info != NULL) {
183 err = fconf_populate_dtb_registry(fw_config_info->config_addr);
184 if (err < 0) {
185 ERROR("Parsing of FW_CONFIG failed %d\n", err);
186 plat_error_handler(err);
187 }
188 /* load TB_FW_CONFIG */
189 err = fconf_load_config(TB_FW_CONFIG_ID);
190 if (err < 0) {
191 ERROR("Loading of TB_FW_CONFIG failed %d\n", err);
192 plat_error_handler(err);
193 }
194 } else {
195 ERROR("Invalid FW_CONFIG address\n");
196 plat_error_handler(err);
197 }
198
199 /* The BL2 ep_info arg0 is modified to point to FW_CONFIG */
200 desc = bl1_plat_get_image_desc(BL2_IMAGE_ID);
201 assert(desc != NULL);
202 desc->ep_info.args.arg0 = fw_config_info->config_addr;
Louis Mayencourt3b5ea742019-10-17 14:46:51 +0100203
John Tsichritzisba597da2018-07-30 13:41:52 +0100204#if TRUSTED_BOARD_BOOT
205 /* Share the Mbed TLS heap info with other images */
206 arm_bl1_set_mbedtls_heap();
207#endif /* TRUSTED_BOARD_BOOT */
Antonio Nino Diaz60e19f52018-09-25 11:37:23 +0100208
Soby Mathew3208edc2018-06-11 16:40:36 +0100209 /*
210 * Allow access to the System counter timer module and program
211 * counter frequency for non secure images during FWU
212 */
Usama Arif6393c782018-11-30 15:43:56 +0000213#ifdef ARM_SYS_TIMCTL_BASE
Soby Mathew3208edc2018-06-11 16:40:36 +0100214 arm_configure_sys_timer();
Usama Arif6393c782018-11-30 15:43:56 +0000215#endif
Usama Arif8f736632018-12-12 17:14:29 +0000216#if (ARM_ARCH_MAJOR > 7) || defined(ARMV7_SUPPORTS_GENERIC_TIMER)
Soby Mathew3208edc2018-06-11 16:40:36 +0100217 write_cntfrq_el0(plat_get_syscnt_freq2());
Usama Arif8f736632018-12-12 17:14:29 +0000218#endif
Dan Handleyb4315302015-03-19 18:58:55 +0000219}
220
Sandrine Bailleux4c117f62015-11-26 16:31:34 +0000221void bl1_plat_prepare_exit(entry_point_info_t *ep_info)
222{
Juan Castillo7b4c1402015-10-06 14:01:35 +0100223#if !ARM_DISABLE_TRUSTED_WDOG
224 /* Disable watchdog before leaving BL1 */
Aditya Angadib0c97da2019-04-16 11:29:14 +0530225 plat_arm_secure_wdt_stop();
Juan Castillo7b4c1402015-10-06 14:01:35 +0100226#endif
227
Sandrine Bailleux4c117f62015-11-26 16:31:34 +0000228#ifdef EL3_PAYLOAD_BASE
229 /*
230 * Program the EL3 payload's entry point address into the CPUs mailbox
231 * in order to release secondary CPUs from their holding pen and make
232 * them jump there.
233 */
Dimitris Papastamos2a246d2e2018-06-18 13:01:06 +0100234 plat_arm_program_trusted_mailbox(ep_info->pc);
Sandrine Bailleux4c117f62015-11-26 16:31:34 +0000235 dsbsy();
236 sev();
237#endif
238}
Soby Mathew7b569282018-03-07 11:32:04 +0000239
Sathees Balya4da6f6c2018-09-03 17:41:13 +0100240/*
241 * On Arm platforms, the FWU process is triggered when the FIP image has
242 * been tampered with.
243 */
Louis Mayencourtd6dcbca2020-01-29 11:42:31 +0000244bool plat_arm_bl1_fwu_needed(void)
Sathees Balya4da6f6c2018-09-03 17:41:13 +0100245{
Louis Mayencourtd6dcbca2020-01-29 11:42:31 +0000246 return !arm_io_is_toc_valid();
Sathees Balya4da6f6c2018-09-03 17:41:13 +0100247}
248
Soby Mathew7b569282018-03-07 11:32:04 +0000249/*******************************************************************************
250 * The following function checks if Firmware update is needed,
251 * by checking if TOC in FIP image is valid or not.
252 ******************************************************************************/
253unsigned int bl1_plat_get_next_image_id(void)
254{
Manish V Badarkhea249a9d2020-07-14 11:28:36 +0100255 return is_fwu_needed ? NS_BL1U_IMAGE_ID : BL2_IMAGE_ID;
Soby Mathew7b569282018-03-07 11:32:04 +0000256}