blob: 4772bada900178d7dc946811bce4d8d5b3e6084e [file] [log] [blame]
Masahiro Yamada2a4fe4f2018-02-01 18:42:24 +09001/*
Yann Gautier8b61d882024-02-05 11:28:29 +01002 * Copyright (c) 2018-2024, Arm Limited and Contributors. All rights reserved.
Masahiro Yamada2a4fe4f2018-02-01 18:42:24 +09003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Soby Mathew2f38ce32018-02-08 17:45:12 +00007#include <assert.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00008
9#include <arch_helpers.h>
10#include <common/bl_common.h>
11#include <common/debug.h>
Raymond Maoab98f152024-11-14 13:28:36 -080012#include <lib/transfer_list.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000013#include <lib/xlat_tables/xlat_tables_compat.h>
14#include <plat/common/platform.h>
Manish V Badarkhe80f13ee2020-07-23 20:23:01 +010015#include <services/arm_arch_svc.h>
Manish V Badarkhef809c6e2020-02-22 08:43:00 +000016#include <smccc_helpers.h>
Sumit Garg617e2152019-11-15 15:34:55 +053017#include <tools_share/firmware_encrypted.h>
Masahiro Yamada2a4fe4f2018-02-01 18:42:24 +090018
19/*
Soby Mathew2f38ce32018-02-08 17:45:12 +000020 * The following platform functions are weakly defined. The Platforms
21 * may redefine with strong definition.
Masahiro Yamada2a4fe4f2018-02-01 18:42:24 +090022 */
Soby Mathew2f38ce32018-02-08 17:45:12 +000023#pragma weak bl2_el3_plat_prepare_exit
Masahiro Yamada2a4fe4f2018-02-01 18:42:24 +090024#pragma weak plat_error_handler
25#pragma weak bl2_plat_preload_setup
Masahiro Yamada02a0d3d2018-02-01 16:45:51 +090026#pragma weak bl2_plat_handle_pre_image_load
27#pragma weak bl2_plat_handle_post_image_load
Sumit Garg617e2152019-11-15 15:34:55 +053028#pragma weak plat_get_enc_key_info
Manish V Badarkhe80f13ee2020-07-23 20:23:01 +010029#pragma weak plat_is_smccc_feature_available
Manish V Badarkhef809c6e2020-02-22 08:43:00 +000030#pragma weak plat_get_soc_version
31#pragma weak plat_get_soc_revision
32
33int32_t plat_get_soc_version(void)
34{
35 return SMC_ARCH_CALL_NOT_SUPPORTED;
36}
37
38int32_t plat_get_soc_revision(void)
39{
40 return SMC_ARCH_CALL_NOT_SUPPORTED;
41}
Masahiro Yamada2a4fe4f2018-02-01 18:42:24 +090042
Manish V Badarkhe80f13ee2020-07-23 20:23:01 +010043int32_t plat_is_smccc_feature_available(u_register_t fid __unused)
44{
45 return SMC_ARCH_CALL_NOT_SUPPORTED;
46}
47
Soby Mathew2f38ce32018-02-08 17:45:12 +000048void bl2_el3_plat_prepare_exit(void)
Masahiro Yamada43d20b32018-02-01 16:46:18 +090049{
Masahiro Yamada43d20b32018-02-01 16:46:18 +090050}
51
Soby Mathew2f38ce32018-02-08 17:45:12 +000052void __dead2 plat_error_handler(int err)
Masahiro Yamada43d20b32018-02-01 16:46:18 +090053{
Maheedhar Bollapalli9bf41842024-04-25 10:34:02 +053054 while (1) {
Soby Mathew2f38ce32018-02-08 17:45:12 +000055 wfi();
Maheedhar Bollapalli9bf41842024-04-25 10:34:02 +053056 }
Masahiro Yamada43d20b32018-02-01 16:46:18 +090057}
58
Masahiro Yamada2a4fe4f2018-02-01 18:42:24 +090059void bl2_plat_preload_setup(void)
60{
61}
62
Masahiro Yamada02a0d3d2018-02-01 16:45:51 +090063int bl2_plat_handle_pre_image_load(unsigned int image_id)
64{
65 return 0;
66}
67
68int bl2_plat_handle_post_image_load(unsigned int image_id)
69{
70 return 0;
71}
72
Roberto Vargas344ff022018-10-19 16:44:18 +010073/*
Sumit Garg617e2152019-11-15 15:34:55 +053074 * Weak implementation to provide dummy decryption key only for test purposes,
75 * platforms must override this API for any real world firmware encryption
76 * use-case.
77 */
78int plat_get_enc_key_info(enum fw_enc_status_t fw_enc_status, uint8_t *key,
79 size_t *key_len, unsigned int *flags,
80 const uint8_t *img_id, size_t img_id_len)
81{
82#define DUMMY_FIP_ENC_KEY { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, \
83 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, \
84 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, \
85 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef }
86
87 const uint8_t dummy_key[] = DUMMY_FIP_ENC_KEY;
88
89 assert(*key_len >= sizeof(dummy_key));
90
91 *key_len = sizeof(dummy_key);
92 memcpy(key, dummy_key, *key_len);
93 *flags = 0;
94
95 return 0;
96}
97
98/*
Roberto Vargas344ff022018-10-19 16:44:18 +010099 * Set up the page tables for the generic and platform-specific memory regions.
100 * The size of the Trusted SRAM seen by the BL image must be specified as well
101 * as an array specifying the generic memory regions which can be;
102 * - Code section;
103 * - Read-only data section;
104 * - Init code section, if applicable
105 * - Coherent memory region, if applicable.
106 */
107
108void __init setup_page_tables(const mmap_region_t *bl_regions,
109 const mmap_region_t *plat_regions)
110{
111#if LOG_LEVEL >= LOG_LEVEL_VERBOSE
112 const mmap_region_t *regions = bl_regions;
113
114 while (regions->size != 0U) {
115 VERBOSE("Region: 0x%lx - 0x%lx has attributes 0x%x\n",
116 regions->base_va,
117 regions->base_va + regions->size,
118 regions->attr);
119 regions++;
120 }
121#endif
122 /*
123 * Map the Trusted SRAM with appropriate memory attributes.
124 * Subsequent mappings will adjust the attributes for specific regions.
125 */
126 mmap_add(bl_regions);
127
128 /* Now (re-)map the platform-specific memory regions */
129 mmap_add(plat_regions);
130
131 /* Create the page tables to reflect the above mappings */
132 init_xlat_tables();
133}
Raymond Maoab98f152024-11-14 13:28:36 -0800134
135#if ((MEASURED_BOOT || DICE_PROTECTION_ENVIRONMENT) && TRANSFER_LIST)
136int plat_handoff_mboot(const void *data, uint32_t data_size, void *tl_base)
137{
138 if (!transfer_list_add(tl_base, TL_TAG_TPM_EVLOG, data_size, data))
139 return -1;
140
141 return 0;
142}
143#endif