blob: 472ed34385168b33f53f1a73f7a2903a9dff759e [file] [log] [blame]
Dan Handley5f0cdb02014-05-14 17:44:19 +01001/*
Lucian Paul-Trifud72c4862022-06-22 18:45:30 +01002 * Copyright (c) 2013-2022, Arm Limited and Contributors. All rights reserved.
Dan Handley5f0cdb02014-05-14 17:44:19 +01003 *
dp-arm82cb2c12017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Dan Handley5f0cdb02014-05-14 17:44:19 +01005 */
6
Antonio Nino Diaz2bc3dba2018-07-18 16:24:16 +01007#ifndef PLATFORM_H
8#define PLATFORM_H
Dan Handley5f0cdb02014-05-14 17:44:19 +01009
10#include <stdint.h>
Dan Handley5f0cdb02014-05-14 17:44:19 +010011
Antonio Nino Diaz09d40e02018-12-14 00:18:21 +000012#include <lib/psci/psci.h>
Achin Gupta0cb64d02019-10-11 14:54:48 +010013#if defined(SPD_spmd)
14 #include <services/spm_core_manifest.h>
15#endif
Javier Almansa Sobrino1d0ca402022-04-25 17:18:15 +010016#if ENABLE_RME
17#include <services/rmm_core_manifest.h>
18#endif
Jayanth Dodderi Chidanand0b22e592022-10-11 17:16:07 +010019#include <drivers/fwu/fwu_metadata.h>
Jimmy Brisson7dfb9912020-06-22 14:18:42 -050020#if TRNG_SUPPORT
21#include "plat_trng.h"
Jayanth Dodderi Chidanand0b22e592022-10-11 17:16:07 +010022#endif /* TRNG_SUPPORT */
Lucian Paul-Trifud72c4862022-06-22 18:45:30 +010023#if DRTM_SUPPORT
24#include "plat_drtm.h"
25#endif /* DRTM_SUPPORT */
Antonio Nino Diaz09d40e02018-12-14 00:18:21 +000026
Dan Handley5f0cdb02014-05-14 17:44:19 +010027/*******************************************************************************
28 * Forward declarations
29 ******************************************************************************/
dp-armd35dee22016-12-12 14:48:13 +000030struct auth_img_desc_s;
Dan Handley5f0cdb02014-05-14 17:44:19 +010031struct meminfo;
32struct image_info;
33struct entry_point_info;
Yatharth Kochar7baff112015-10-09 18:06:13 +010034struct image_desc;
Yatharth Kochar72600222016-09-12 16:08:41 +010035struct bl_load_info;
36struct bl_params;
Antonio Nino Diaz2fccb222017-10-24 10:07:35 +010037struct mmap_region;
Paul Beesleyaeaa2252019-10-15 10:57:42 +000038struct spm_mm_boot_info;
Antonio Nino Diaze4583022018-10-30 11:12:42 +000039struct sp_res_desc;
Sumit Garg2be57b82019-11-15 15:34:55 +053040enum fw_enc_status_t;
Dan Handley5f0cdb02014-05-14 17:44:19 +010041
42/*******************************************************************************
Juan Castillo95cfd4a2015-04-14 12:49:03 +010043 * plat_get_rotpk_info() flags
44 ******************************************************************************/
45#define ROTPK_IS_HASH (1 << 0)
Soby Mathew04943d32016-05-24 15:05:15 +010046/* Flag used to skip verification of the certificate ROTPK while the platform
47 ROTPK is not deployed */
48#define ROTPK_NOT_DEPLOYED (1 << 1)
Juan Castillo95cfd4a2015-04-14 12:49:03 +010049
50/*******************************************************************************
Sumit Garg7cda17b2019-11-15 10:43:00 +053051 * plat_get_enc_key_info() flags
52 ******************************************************************************/
53/*
54 * Flag used to notify caller that information provided in key buffer is an
55 * identifier rather than an actual key.
56 */
57#define ENC_KEY_IS_IDENTIFIER (1 << 0)
58
59/*******************************************************************************
Dan Handleydec5e0d2014-05-15 14:11:36 +010060 * Function declarations
Dan Handley5f0cdb02014-05-14 17:44:19 +010061 ******************************************************************************/
Dan Handleydec5e0d2014-05-15 14:11:36 +010062/*******************************************************************************
63 * Mandatory common functions
64 ******************************************************************************/
Antonio Nino Diazd4486392016-05-18 16:53:31 +010065unsigned int plat_get_syscnt_freq2(void);
66
Juan Castillo16948ae2015-04-13 17:36:19 +010067int plat_get_image_source(unsigned int image_id,
Dan Handleydec5e0d2014-05-15 14:11:36 +010068 uintptr_t *dev_handle,
69 uintptr_t *image_spec);
Soby Mathewa0ad6012016-03-23 10:11:10 +000070uintptr_t plat_get_ns_image_entrypoint(void);
Soby Mathew67487842015-07-13 14:10:57 +010071unsigned int plat_my_core_pos(void);
72int plat_core_pos_by_mpidr(u_register_t mpidr);
Ambroise Vincent2374ab12019-04-10 12:50:27 +010073int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size);
Dan Handleydec5e0d2014-05-15 14:11:36 +010074
Manish Pandey256a5482023-10-27 11:45:44 +010075/*******************************************************************************
76 * Simple routine to determine whether a mpidr is valid or not.
77 ******************************************************************************/
78static inline bool is_valid_mpidr(u_register_t mpidr)
79{
80 int pos = plat_core_pos_by_mpidr(mpidr);
81
82 if ((pos < 0) || ((unsigned int)pos >= PLATFORM_CORE_COUNT)) {
83 return false;
84 }
85
86 return true;
87}
88
Douglas Raillard51faada2017-02-24 18:14:15 +000089#if STACK_PROTECTOR_ENABLED
90/*
91 * Return a new value to be used for the stack protection's canary.
92 *
93 * Ideally, this value is a random number that is impossible to predict by an
94 * attacker.
95 */
96u_register_t plat_get_stack_protector_canary(void);
97#endif /* STACK_PROTECTOR_ENABLED */
98
Dan Handleydec5e0d2014-05-15 14:11:36 +010099/*******************************************************************************
100 * Mandatory interrupt management functions
101 ******************************************************************************/
Dan Handley9865ac12014-05-27 16:17:21 +0100102uint32_t plat_ic_get_pending_interrupt_id(void);
103uint32_t plat_ic_get_pending_interrupt_type(void);
104uint32_t plat_ic_acknowledge_interrupt(void);
105uint32_t plat_ic_get_interrupt_type(uint32_t id);
106void plat_ic_end_of_interrupt(uint32_t id);
Dan Handley5f0cdb02014-05-14 17:44:19 +0100107uint32_t plat_interrupt_type_to_line(uint32_t type,
108 uint32_t security_state);
109
Dan Handleydec5e0d2014-05-15 14:11:36 +0100110/*******************************************************************************
Jeenu Viswambharaneb68ea92017-09-22 08:32:09 +0100111 * Optional interrupt management functions, depending on chosen EL3 components.
112 ******************************************************************************/
113unsigned int plat_ic_get_running_priority(void);
Jeenu Viswambharanca43b552017-09-22 08:32:09 +0100114int plat_ic_is_spi(unsigned int id);
115int plat_ic_is_ppi(unsigned int id);
116int plat_ic_is_sgi(unsigned int id);
Jeenu Viswambharancbd3f372017-09-22 08:32:09 +0100117unsigned int plat_ic_get_interrupt_active(unsigned int id);
Jeenu Viswambharan979225f2017-09-22 08:32:09 +0100118void plat_ic_disable_interrupt(unsigned int id);
119void plat_ic_enable_interrupt(unsigned int id);
Jeenu Viswambharan74dce7f2017-09-22 08:32:09 +0100120int plat_ic_has_interrupt_type(unsigned int type);
121void plat_ic_set_interrupt_type(unsigned int id, unsigned int type);
Jeenu Viswambharanf3a86602017-09-22 08:32:09 +0100122void plat_ic_set_interrupt_priority(unsigned int id, unsigned int priority);
Jeenu Viswambharan8db978b2017-09-22 08:32:09 +0100123void plat_ic_raise_el3_sgi(int sgi_num, u_register_t target);
Florian Lugoudcb31ff2021-09-08 12:40:24 +0200124void plat_ic_raise_ns_sgi(int sgi_num, u_register_t target);
125void plat_ic_raise_s_el1_sgi(int sgi_num, u_register_t target);
Jeenu Viswambharanfc529fe2017-09-22 08:32:09 +0100126void plat_ic_set_spi_routing(unsigned int id, unsigned int routing_mode,
127 u_register_t mpidr);
Jeenu Viswambharana2816a12017-09-22 08:32:09 +0100128void plat_ic_set_interrupt_pending(unsigned int id);
129void plat_ic_clear_interrupt_pending(unsigned int id);
Jeenu Viswambharand55a4452017-09-22 08:32:09 +0100130unsigned int plat_ic_set_priority_mask(unsigned int mask);
Jeenu Viswambharan4ee8d0b2017-10-24 15:13:59 +0100131unsigned int plat_ic_get_interrupt_id(unsigned int raw);
Jeenu Viswambharaneb68ea92017-09-22 08:32:09 +0100132
133/*******************************************************************************
Dan Handleydec5e0d2014-05-15 14:11:36 +0100134 * Optional common functions (may be overridden)
135 ******************************************************************************/
Soby Mathew4c0d0392016-06-16 14:52:04 +0100136uintptr_t plat_get_my_stack(void);
Yatharth Kochar1a0a3f02016-06-28 16:58:26 +0100137void plat_report_exception(unsigned int exception_type);
Yann Gautier6dc59792019-02-15 16:42:20 +0100138void plat_report_prefetch_abort(unsigned int fault_address);
139void plat_report_data_abort(unsigned int fault_address);
Sandrine Bailleux44804252014-08-06 11:27:23 +0100140int plat_crash_console_init(void);
Soby Mathewc67b09b2014-07-14 16:57:23 +0100141int plat_crash_console_putc(int c);
Jimmy Brisson831b0e92020-08-05 13:44:05 -0500142void plat_crash_console_flush(void);
Juan Castillo40fc6cd2015-09-25 15:41:14 +0100143void plat_error_handler(int err) __dead2;
Antonio Nino Diaz1c3ea102016-02-01 13:57:25 +0000144void plat_panic_handler(void) __dead2;
Manish V Badarkhe586f60c2022-07-12 21:48:04 +0100145void plat_system_reset(void) __dead2;
Soby Mathew7f56e9a2017-09-04 11:49:29 +0100146const char *plat_log_get_prefix(unsigned int log_level);
Roberto Vargas01f62b62017-09-26 12:53:01 +0100147void bl2_plat_preload_setup(void);
148int plat_try_next_boot_source(void);
Dan Handleydec5e0d2014-05-15 14:11:36 +0100149
Manish V Badarkhe48ba0342021-09-14 23:12:42 +0100150#if MEASURED_BOOT
151int plat_mboot_measure_image(unsigned int image_id, image_info_t *image_data);
Manish V Badarkhecf210642021-10-20 22:06:40 +0100152int plat_mboot_measure_critical_data(unsigned int critical_data_id,
153 const void *base,
154 size_t size);
Manish V Badarkhe48ba0342021-09-14 23:12:42 +0100155#else
156static inline int plat_mboot_measure_image(unsigned int image_id __unused,
157 image_info_t *image_data __unused)
158{
159 return 0;
160}
Manish V Badarkhecf210642021-10-20 22:06:40 +0100161static inline int plat_mboot_measure_critical_data(
162 unsigned int critical_data_id __unused,
163 const void *base __unused,
164 size_t size __unused)
165{
166 return 0;
167}
Manish V Badarkhe48ba0342021-09-14 23:12:42 +0100168#endif /* MEASURED_BOOT */
169
Dan Handleydec5e0d2014-05-15 14:11:36 +0100170/*******************************************************************************
171 * Mandatory BL1 functions
172 ******************************************************************************/
Dan Handley5a06bb72014-08-04 11:41:20 +0100173void bl1_early_platform_setup(void);
Dan Handleydec5e0d2014-05-15 14:11:36 +0100174void bl1_plat_arch_setup(void);
175void bl1_platform_setup(void);
176struct meminfo *bl1_plat_sec_mem_layout(void);
Dan Handley5f0cdb02014-05-14 17:44:19 +0100177
Jeenu Viswambharanb7cb1332017-10-16 08:43:14 +0100178/*******************************************************************************
179 * Optional EL3 component functions in BL31
180 ******************************************************************************/
181
182/* SDEI platform functions */
183#if SDEI_SUPPORT
Balint Dobszaycbf9e842019-12-18 15:28:00 +0100184void plat_sdei_setup(void);
Jeenu Viswambharanb7cb1332017-10-16 08:43:14 +0100185int plat_sdei_validate_entry_point(uintptr_t ep, unsigned int client_mode);
186void plat_sdei_handle_masked_trigger(uint64_t mpidr, unsigned int intr);
187#endif
188
Pali Rohár30e8fa72021-06-21 17:22:27 +0200189void plat_default_ea_handler(unsigned int ea_reason, uint64_t syndrome, void *cookie,
190 void *handle, uint64_t flags);
Jeenu Viswambharan76454ab2017-11-30 12:54:15 +0000191void plat_ea_handler(unsigned int ea_reason, uint64_t syndrome, void *cookie,
192 void *handle, uint64_t flags);
193
Yatharth Kochar48bfb882015-10-10 19:06:53 +0100194/*
195 * The following function is mandatory when the
196 * firmware update feature is used.
197 */
198int bl1_plat_mem_check(uintptr_t mem_base, unsigned int mem_size,
199 unsigned int flags);
200
Dan Handleydec5e0d2014-05-15 14:11:36 +0100201/*******************************************************************************
202 * Optional BL1 functions (may be overridden)
203 ******************************************************************************/
Yatharth Kochar7baff112015-10-09 18:06:13 +0100204/*
205 * The following functions are used for image loading process in BL1.
206 */
207void bl1_plat_set_ep_info(unsigned int image_id,
208 struct entry_point_info *ep_info);
Yatharth Kochar48bfb882015-10-10 19:06:53 +0100209/*
210 * The following functions are mandatory when firmware update
211 * feature is used and optional otherwise.
212 */
Yatharth Kochar7baff112015-10-09 18:06:13 +0100213unsigned int bl1_plat_get_next_image_id(void);
214struct image_desc *bl1_plat_get_image_desc(unsigned int image_id);
Dan Handleydec5e0d2014-05-15 14:11:36 +0100215
Yatharth Kochar48bfb882015-10-10 19:06:53 +0100216/*
217 * The following functions are used by firmware update
218 * feature and may optionally be overridden.
219 */
Dan Handley1f37b942015-12-15 14:28:24 +0000220__dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved);
Yatharth Kochar48bfb882015-10-10 19:06:53 +0100221
Masahiro Yamada11f001c2018-02-01 16:46:18 +0900222/*
Soby Mathew566034f2018-02-08 17:45:12 +0000223 * This BL1 function can be used by the platforms to update/use image
224 * information for a given `image_id`.
Masahiro Yamada11f001c2018-02-01 16:46:18 +0900225 */
Soby Mathew566034f2018-02-08 17:45:12 +0000226int bl1_plat_handle_pre_image_load(unsigned int image_id);
227int bl1_plat_handle_post_image_load(unsigned int image_id);
Yatharth Kochar48bfb882015-10-10 19:06:53 +0100228
Manish V Badarkhe48ba0342021-09-14 23:12:42 +0100229#if MEASURED_BOOT
230void bl1_plat_mboot_init(void);
231void bl1_plat_mboot_finish(void);
232#else
233static inline void bl1_plat_mboot_init(void)
234{
235}
236static inline void bl1_plat_mboot_finish(void)
237{
238}
239#endif /* MEASURED_BOOT */
240
Dan Handleydec5e0d2014-05-15 14:11:36 +0100241/*******************************************************************************
242 * Mandatory BL2 functions
243 ******************************************************************************/
Soby Mathewa6f340f2018-01-09 14:36:14 +0000244void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3);
Dan Handleydec5e0d2014-05-15 14:11:36 +0100245void bl2_plat_arch_setup(void);
246void bl2_platform_setup(void);
247struct meminfo *bl2_plat_sec_mem_layout(void);
248
Yatharth Kochar72600222016-09-12 16:08:41 +0100249/*
250 * This function can be used by the platforms to update/use image
251 * information for given `image_id`.
252 */
Masahiro Yamadaba68ef52018-02-01 16:45:51 +0900253int bl2_plat_handle_pre_image_load(unsigned int image_id);
Yatharth Kochar72600222016-09-12 16:08:41 +0100254int bl2_plat_handle_post_image_load(unsigned int image_id);
255
Sandrine Bailleux93d81d62014-06-24 14:19:36 +0100256/*******************************************************************************
Dan Handleydec5e0d2014-05-15 14:11:36 +0100257 * Optional BL2 functions (may be overridden)
258 ******************************************************************************/
Alexei Fedorov7b4e1fb2020-07-13 12:11:05 +0100259#if MEASURED_BOOT
Manish V Badarkhe47bf3ac2021-08-06 09:26:20 +0100260void bl2_plat_mboot_init(void);
261void bl2_plat_mboot_finish(void);
262#else
263static inline void bl2_plat_mboot_init(void)
264{
265}
266static inline void bl2_plat_mboot_finish(void)
267{
268}
269#endif /* MEASURED_BOOT */
Roberto Vargasb1d27b42017-10-30 14:43:43 +0000270
271/*******************************************************************************
272 * Mandatory BL2 at EL3 functions: Must be implemented if BL2_AT_EL3 image is
273 * supported
274 ******************************************************************************/
275void bl2_el3_early_platform_setup(u_register_t arg0, u_register_t arg1,
276 u_register_t arg2, u_register_t arg3);
277void bl2_el3_plat_arch_setup(void);
278
Roberto Vargasb1d27b42017-10-30 14:43:43 +0000279/*******************************************************************************
280 * Optional BL2 at EL3 functions (may be overridden)
281 ******************************************************************************/
282void bl2_el3_plat_prepare_exit(void);
283
Dan Handleydec5e0d2014-05-15 14:11:36 +0100284/*******************************************************************************
Yatharth Kochar9003fa02015-10-14 15:27:24 +0100285 * Mandatory BL2U functions.
286 ******************************************************************************/
287void bl2u_early_platform_setup(struct meminfo *mem_layout,
288 void *plat_info);
289void bl2u_plat_arch_setup(void);
290void bl2u_platform_setup(void);
291
292/*******************************************************************************
293 * Conditionally mandatory BL2U functions for CSS platforms.
294 ******************************************************************************/
295/*
296 * This function is used to perform any platform-specific actions required to
297 * handle the BL2U_SCP firmware.
298 */
299int bl2u_plat_handle_scp_bl2u(void);
300
301/*******************************************************************************
Juan Castillod1786372015-12-14 09:35:25 +0000302 * Mandatory BL31 functions
Dan Handleydec5e0d2014-05-15 14:11:36 +0100303 ******************************************************************************/
Soby Mathewa6f340f2018-01-09 14:36:14 +0000304void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
305 u_register_t arg2, u_register_t arg3);
Dan Handleydec5e0d2014-05-15 14:11:36 +0100306void bl31_plat_arch_setup(void);
307void bl31_platform_setup(void);
Soby Mathew78e61612015-12-09 11:28:43 +0000308void bl31_plat_runtime_setup(void);
Dan Handley9865ac12014-05-27 16:17:21 +0100309struct entry_point_info *bl31_plat_get_next_image_ep_info(uint32_t type);
Dan Handleydec5e0d2014-05-15 14:11:36 +0100310
311/*******************************************************************************
Juan Castillod1786372015-12-14 09:35:25 +0000312 * Mandatory PSCI functions (BL31)
Dan Handleydec5e0d2014-05-15 14:11:36 +0100313 ******************************************************************************/
Soby Mathew67487842015-07-13 14:10:57 +0100314int plat_setup_psci_ops(uintptr_t sec_entrypoint,
Roberto Vargas9fb8af32018-02-12 12:36:17 +0000315 const struct plat_psci_ops **psci_ops);
Soby Mathew67487842015-07-13 14:10:57 +0100316const unsigned char *plat_get_power_domain_tree_desc(void);
317
318/*******************************************************************************
Juan Castillod1786372015-12-14 09:35:25 +0000319 * Optional PSCI functions (BL31).
Soby Mathew67487842015-07-13 14:10:57 +0100320 ******************************************************************************/
dp-arm04c1db12017-01-31 13:01:04 +0000321void plat_psci_stat_accounting_start(const psci_power_state_t *state_info);
322void plat_psci_stat_accounting_stop(const psci_power_state_t *state_info);
323u_register_t plat_psci_stat_get_residency(unsigned int lvl,
324 const psci_power_state_t *state_info,
Deepika Bhavnani5b33ad12019-12-13 10:23:18 -0600325 unsigned int last_cpu_idx);
Soby Mathew67487842015-07-13 14:10:57 +0100326plat_local_state_t plat_get_target_pwr_state(unsigned int lvl,
327 const plat_local_state_t *states,
328 unsigned int ncpu);
Dan Handleydec5e0d2014-05-15 14:11:36 +0100329
330/*******************************************************************************
Soby Mathew0f9159b2022-03-22 16:19:39 +0000331 * Mandatory BL31 functions when ENABLE_RME=1
332 ******************************************************************************/
Javier Almansa Sobrino1d0ca402022-04-25 17:18:15 +0100333#if ENABLE_RME
Javier Almansa Sobrino8c980a42021-11-24 18:37:37 +0000334int plat_rmmd_get_cca_attest_token(uintptr_t buf, size_t *len,
335 uintptr_t hash, size_t hash_size);
336int plat_rmmd_get_cca_realm_attest_key(uintptr_t buf, size_t *len,
337 unsigned int type);
338size_t plat_rmmd_get_el3_rmm_shared_mem(uintptr_t *shared);
Javier Almansa Sobrino1d0ca402022-04-25 17:18:15 +0100339int plat_rmmd_load_manifest(rmm_manifest_t *manifest);
340#endif
341
Soby Mathew0f9159b2022-03-22 16:19:39 +0000342/*******************************************************************************
Juan Castillod1786372015-12-14 09:35:25 +0000343 * Optional BL31 functions (may be overridden)
Dan Handleydff8e472014-05-16 14:08:45 +0100344 ******************************************************************************/
Achin Guptaafff8cb2014-06-26 08:59:07 +0100345void bl31_plat_enable_mmu(uint32_t flags);
Dan Handleydff8e472014-05-16 14:08:45 +0100346
347/*******************************************************************************
Juan Castillod1786372015-12-14 09:35:25 +0000348 * Optional BL32 functions (may be overridden)
Dan Handleydff8e472014-05-16 14:08:45 +0100349 ******************************************************************************/
Achin Guptaafff8cb2014-06-26 08:59:07 +0100350void bl32_plat_enable_mmu(uint32_t flags);
Dan Handleydff8e472014-05-16 14:08:45 +0100351
Juan Castillo6eadf762015-01-07 10:39:25 +0000352/*******************************************************************************
Juan Castillo95cfd4a2015-04-14 12:49:03 +0100353 * Trusted Board Boot functions
Juan Castillo6eadf762015-01-07 10:39:25 +0000354 ******************************************************************************/
Juan Castillo95cfd4a2015-04-14 12:49:03 +0100355int plat_get_rotpk_info(void *cookie, void **key_ptr, unsigned int *key_len,
356 unsigned int *flags);
Juan Castillo48279d52016-01-22 11:05:57 +0000357int plat_get_nv_ctr(void *cookie, unsigned int *nv_ctr);
358int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr);
dp-armd35dee22016-12-12 14:48:13 +0000359int plat_set_nv_ctr2(void *cookie, const struct auth_img_desc_s *img_desc,
360 unsigned int nv_ctr);
Nicolas Toromanoff40f9f642020-11-09 12:14:52 +0100361int plat_convert_pk(void *full_pk_ptr, unsigned int full_pk_len,
362 void **hashed_pk_ptr, unsigned int *hash_pk_len);
Ambroise Vincent2374ab12019-04-10 12:50:27 +0100363int get_mbedtls_heap_helper(void **heap_addr, size_t *heap_size);
Sumit Garg2be57b82019-11-15 15:34:55 +0530364int plat_get_enc_key_info(enum fw_enc_status_t fw_enc_status, uint8_t *key,
365 size_t *key_len, unsigned int *flags,
366 const uint8_t *img_id, size_t img_id_len);
Juan Castillo6eadf762015-01-07 10:39:25 +0000367
Antonio Nino Diaz2fccb222017-10-24 10:07:35 +0100368/*******************************************************************************
369 * Secure Partitions functions
370 ******************************************************************************/
371const struct mmap_region *plat_get_secure_partition_mmap(void *cookie);
Paul Beesleyaeaa2252019-10-15 10:57:42 +0000372const struct spm_mm_boot_info *plat_get_secure_partition_boot_info(
Antonio Nino Diaz2fccb222017-10-24 10:07:35 +0100373 void *cookie);
Antonio Nino Diaze4583022018-10-30 11:12:42 +0000374int plat_spm_sp_rd_load(struct sp_res_desc *rd, const void *ptr, size_t size);
Antonio Nino Diaz680389a2018-11-27 08:36:02 +0000375int plat_spm_sp_get_next_address(void **sp_base, size_t *sp_size,
376 void **rd_base, size_t *rd_size);
Achin Gupta0cb64d02019-10-11 14:54:48 +0100377#if defined(SPD_spmd)
Olivier Deprez52696942020-04-16 13:39:06 +0200378int plat_spm_core_manifest_load(spmc_manifest_attribute_t *manifest,
Olivier Deprez23d5ba82020-02-07 15:44:43 +0100379 const void *pm_addr);
Achin Gupta0cb64d02019-10-11 14:54:48 +0100380#endif
Marc Bonnici6a0788b2021-12-16 18:31:02 +0000381#if defined(SPMC_AT_EL3)
382int plat_spmc_shmem_datastore_get(uint8_t **datastore, size_t *size);
383#endif
384
Yatharth Kochar72600222016-09-12 16:08:41 +0100385/*******************************************************************************
386 * Mandatory BL image load functions(may be overridden).
387 ******************************************************************************/
388/*
389 * This function returns pointer to the list of images that the
390 * platform has populated to load.
391 */
392struct bl_load_info *plat_get_bl_image_load_info(void);
393
394/*
395 * This function returns a pointer to the shared memory that the
396 * platform has kept aside to pass trusted firmware related
397 * information that next BL image could need.
398 */
399struct bl_params *plat_get_next_bl_params(void);
400
401/*
402 * This function flushes to main memory all the params that are
403 * passed to next image.
404 */
405void plat_flush_next_bl_params(void);
406
Soby Mathew5c8babc2015-07-13 16:26:11 +0100407/*
408 * The below function enable Trusted Firmware components like SPDs which
409 * haven't migrated to the new platform API to compile on platforms which
410 * have the compatibility layer disabled.
411 */
Roberto Vargas7fabe1a2018-02-12 12:36:17 +0000412unsigned int platform_core_pos_helper(unsigned long mpidr);
Douglas Raillard51faada2017-02-24 18:14:15 +0000413
Manish V Badarkhe0e753432020-02-22 08:43:00 +0000414/*
415 * Optional function to get SOC version
416 */
417int32_t plat_get_soc_version(void);
418
419/*
420 * Optional function to get SOC revision
421 */
422int32_t plat_get_soc_revision(void);
423
Manish V Badarkhe6f0a2f02020-07-23 20:23:01 +0100424/*
425 * Optional function to check for SMCCC function availability for platform
426 */
427int32_t plat_is_smccc_feature_available(u_register_t fid);
428
Manish V Badarkheefb2ced2021-06-20 21:04:49 +0100429/*******************************************************************************
430 * FWU platform specific functions
431 ******************************************************************************/
432int plat_fwu_set_metadata_image_source(unsigned int image_id,
433 uintptr_t *dev_handle,
434 uintptr_t *image_spec);
Sughosh Ganu6aaf2572021-11-17 17:08:10 +0530435void plat_fwu_set_images_source(const struct fwu_metadata *metadata);
Sughosh Ganu40c175e2021-12-01 15:53:32 +0530436uint32_t plat_fwu_get_boot_idx(void);
Manish V Badarkheefb2ced2021-06-20 21:04:49 +0100437
Antonio Nino Diaz2bc3dba2018-07-18 16:24:16 +0100438#endif /* PLATFORM_H */