xref: /arm-trusted-firmware/include/plat/common/platform.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2013-2023, Arm Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef PLATFORM_H
8*91f16700Schasinglulu #define PLATFORM_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <stdint.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include <lib/psci/psci.h>
13*91f16700Schasinglulu #if defined(SPD_spmd)
14*91f16700Schasinglulu #include <services/spm_core_manifest.h>
15*91f16700Schasinglulu #endif
16*91f16700Schasinglulu #if ENABLE_RME
17*91f16700Schasinglulu #include <services/rmm_core_manifest.h>
18*91f16700Schasinglulu #endif
19*91f16700Schasinglulu #include <drivers/fwu/fwu_metadata.h>
20*91f16700Schasinglulu #if TRNG_SUPPORT
21*91f16700Schasinglulu #include "plat_trng.h"
22*91f16700Schasinglulu #endif /* TRNG_SUPPORT */
23*91f16700Schasinglulu #if DRTM_SUPPORT
24*91f16700Schasinglulu #include "plat_drtm.h"
25*91f16700Schasinglulu #endif /* DRTM_SUPPORT */
26*91f16700Schasinglulu 
27*91f16700Schasinglulu /*******************************************************************************
28*91f16700Schasinglulu  * Forward declarations
29*91f16700Schasinglulu  ******************************************************************************/
30*91f16700Schasinglulu struct auth_img_desc_s;
31*91f16700Schasinglulu struct meminfo;
32*91f16700Schasinglulu struct image_info;
33*91f16700Schasinglulu struct entry_point_info;
34*91f16700Schasinglulu struct image_desc;
35*91f16700Schasinglulu struct bl_load_info;
36*91f16700Schasinglulu struct bl_params;
37*91f16700Schasinglulu struct mmap_region;
38*91f16700Schasinglulu struct spm_mm_boot_info;
39*91f16700Schasinglulu struct sp_res_desc;
40*91f16700Schasinglulu struct rmm_manifest;
41*91f16700Schasinglulu enum fw_enc_status_t;
42*91f16700Schasinglulu 
43*91f16700Schasinglulu /*******************************************************************************
44*91f16700Schasinglulu  * plat_get_rotpk_info() flags
45*91f16700Schasinglulu  ******************************************************************************/
46*91f16700Schasinglulu #define ROTPK_IS_HASH			(1 << 0)
47*91f16700Schasinglulu 
48*91f16700Schasinglulu /* Flag used to skip verification of the certificate ROTPK while the platform
49*91f16700Schasinglulu    ROTPK is not deployed */
50*91f16700Schasinglulu #define ROTPK_NOT_DEPLOYED		(1 << 1)
51*91f16700Schasinglulu 
52*91f16700Schasinglulu static inline bool is_rotpk_flags_valid(unsigned int flags)
53*91f16700Schasinglulu {
54*91f16700Schasinglulu 	unsigned int valid_flags = ROTPK_IS_HASH;
55*91f16700Schasinglulu 	return (flags == ROTPK_NOT_DEPLOYED) || ((flags & ~valid_flags) == 0);
56*91f16700Schasinglulu }
57*91f16700Schasinglulu 
58*91f16700Schasinglulu /*******************************************************************************
59*91f16700Schasinglulu  * plat_get_enc_key_info() flags
60*91f16700Schasinglulu  ******************************************************************************/
61*91f16700Schasinglulu /*
62*91f16700Schasinglulu  * Flag used to notify caller that information provided in key buffer is an
63*91f16700Schasinglulu  * identifier rather than an actual key.
64*91f16700Schasinglulu  */
65*91f16700Schasinglulu #define ENC_KEY_IS_IDENTIFIER		(1 << 0)
66*91f16700Schasinglulu 
67*91f16700Schasinglulu /*******************************************************************************
68*91f16700Schasinglulu  * Function declarations
69*91f16700Schasinglulu  ******************************************************************************/
70*91f16700Schasinglulu /*******************************************************************************
71*91f16700Schasinglulu  * Mandatory common functions
72*91f16700Schasinglulu  ******************************************************************************/
73*91f16700Schasinglulu unsigned int plat_get_syscnt_freq2(void);
74*91f16700Schasinglulu 
75*91f16700Schasinglulu int plat_get_image_source(unsigned int image_id,
76*91f16700Schasinglulu 			uintptr_t *dev_handle,
77*91f16700Schasinglulu 			uintptr_t *image_spec);
78*91f16700Schasinglulu uintptr_t plat_get_ns_image_entrypoint(void);
79*91f16700Schasinglulu unsigned int plat_my_core_pos(void);
80*91f16700Schasinglulu int plat_core_pos_by_mpidr(u_register_t mpidr);
81*91f16700Schasinglulu int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size);
82*91f16700Schasinglulu 
83*91f16700Schasinglulu /*******************************************************************************
84*91f16700Schasinglulu  * Simple routine to determine whether a mpidr is valid or not.
85*91f16700Schasinglulu  ******************************************************************************/
86*91f16700Schasinglulu static inline bool is_valid_mpidr(u_register_t mpidr)
87*91f16700Schasinglulu {
88*91f16700Schasinglulu 	int pos = plat_core_pos_by_mpidr(mpidr);
89*91f16700Schasinglulu 
90*91f16700Schasinglulu 	if ((pos < 0) || ((unsigned int)pos >= PLATFORM_CORE_COUNT)) {
91*91f16700Schasinglulu 		return false;
92*91f16700Schasinglulu 	}
93*91f16700Schasinglulu 
94*91f16700Schasinglulu 	return true;
95*91f16700Schasinglulu }
96*91f16700Schasinglulu 
97*91f16700Schasinglulu #if STACK_PROTECTOR_ENABLED
98*91f16700Schasinglulu /*
99*91f16700Schasinglulu  * Return a new value to be used for the stack protection's canary.
100*91f16700Schasinglulu  *
101*91f16700Schasinglulu  * Ideally, this value is a random number that is impossible to predict by an
102*91f16700Schasinglulu  * attacker.
103*91f16700Schasinglulu  */
104*91f16700Schasinglulu u_register_t plat_get_stack_protector_canary(void);
105*91f16700Schasinglulu #endif /* STACK_PROTECTOR_ENABLED */
106*91f16700Schasinglulu 
107*91f16700Schasinglulu /*******************************************************************************
108*91f16700Schasinglulu  * Mandatory interrupt management functions
109*91f16700Schasinglulu  ******************************************************************************/
110*91f16700Schasinglulu uint32_t plat_ic_get_pending_interrupt_id(void);
111*91f16700Schasinglulu uint32_t plat_ic_get_pending_interrupt_type(void);
112*91f16700Schasinglulu uint32_t plat_ic_acknowledge_interrupt(void);
113*91f16700Schasinglulu uint32_t plat_ic_get_interrupt_type(uint32_t id);
114*91f16700Schasinglulu void plat_ic_end_of_interrupt(uint32_t id);
115*91f16700Schasinglulu uint32_t plat_interrupt_type_to_line(uint32_t type,
116*91f16700Schasinglulu 				     uint32_t security_state);
117*91f16700Schasinglulu 
118*91f16700Schasinglulu /*******************************************************************************
119*91f16700Schasinglulu  * Optional interrupt management functions, depending on chosen EL3 components.
120*91f16700Schasinglulu  ******************************************************************************/
121*91f16700Schasinglulu unsigned int plat_ic_get_running_priority(void);
122*91f16700Schasinglulu int plat_ic_is_spi(unsigned int id);
123*91f16700Schasinglulu int plat_ic_is_ppi(unsigned int id);
124*91f16700Schasinglulu int plat_ic_is_sgi(unsigned int id);
125*91f16700Schasinglulu unsigned int plat_ic_get_interrupt_active(unsigned int id);
126*91f16700Schasinglulu void plat_ic_disable_interrupt(unsigned int id);
127*91f16700Schasinglulu void plat_ic_enable_interrupt(unsigned int id);
128*91f16700Schasinglulu bool plat_ic_has_interrupt_type(unsigned int type);
129*91f16700Schasinglulu void plat_ic_set_interrupt_type(unsigned int id, unsigned int type);
130*91f16700Schasinglulu void plat_ic_set_interrupt_priority(unsigned int id, unsigned int priority);
131*91f16700Schasinglulu void plat_ic_raise_el3_sgi(int sgi_num, u_register_t target);
132*91f16700Schasinglulu void plat_ic_raise_ns_sgi(int sgi_num, u_register_t target);
133*91f16700Schasinglulu void plat_ic_raise_s_el1_sgi(int sgi_num, u_register_t target);
134*91f16700Schasinglulu void plat_ic_set_spi_routing(unsigned int id, unsigned int routing_mode,
135*91f16700Schasinglulu 		u_register_t mpidr);
136*91f16700Schasinglulu void plat_ic_set_interrupt_pending(unsigned int id);
137*91f16700Schasinglulu void plat_ic_clear_interrupt_pending(unsigned int id);
138*91f16700Schasinglulu unsigned int plat_ic_set_priority_mask(unsigned int mask);
139*91f16700Schasinglulu unsigned int plat_ic_get_interrupt_id(unsigned int raw);
140*91f16700Schasinglulu 
141*91f16700Schasinglulu /*******************************************************************************
142*91f16700Schasinglulu  * Optional common functions (may be overridden)
143*91f16700Schasinglulu  ******************************************************************************/
144*91f16700Schasinglulu uintptr_t plat_get_my_stack(void);
145*91f16700Schasinglulu void plat_report_exception(unsigned int exception_type);
146*91f16700Schasinglulu void plat_report_prefetch_abort(unsigned int fault_address);
147*91f16700Schasinglulu void plat_report_data_abort(unsigned int fault_address);
148*91f16700Schasinglulu int plat_crash_console_init(void);
149*91f16700Schasinglulu int plat_crash_console_putc(int c);
150*91f16700Schasinglulu void plat_crash_console_flush(void);
151*91f16700Schasinglulu void plat_error_handler(int err) __dead2;
152*91f16700Schasinglulu void plat_panic_handler(void) __dead2;
153*91f16700Schasinglulu void plat_system_reset(void) __dead2;
154*91f16700Schasinglulu const char *plat_log_get_prefix(unsigned int log_level);
155*91f16700Schasinglulu void bl2_plat_preload_setup(void);
156*91f16700Schasinglulu int plat_try_next_boot_source(void);
157*91f16700Schasinglulu 
158*91f16700Schasinglulu #if MEASURED_BOOT
159*91f16700Schasinglulu int plat_mboot_measure_image(unsigned int image_id, image_info_t *image_data);
160*91f16700Schasinglulu int plat_mboot_measure_critical_data(unsigned int critical_data_id,
161*91f16700Schasinglulu 				     const void *base,
162*91f16700Schasinglulu 				     size_t size);
163*91f16700Schasinglulu int plat_mboot_measure_key(const void *pk_oid, const void *pk_ptr,
164*91f16700Schasinglulu 			   size_t pk_len);
165*91f16700Schasinglulu #else
166*91f16700Schasinglulu static inline int plat_mboot_measure_image(unsigned int image_id __unused,
167*91f16700Schasinglulu 					   image_info_t *image_data __unused)
168*91f16700Schasinglulu {
169*91f16700Schasinglulu 	return 0;
170*91f16700Schasinglulu }
171*91f16700Schasinglulu static inline int plat_mboot_measure_critical_data(
172*91f16700Schasinglulu 					unsigned int critical_data_id __unused,
173*91f16700Schasinglulu 					const void *base __unused,
174*91f16700Schasinglulu 					size_t size __unused)
175*91f16700Schasinglulu {
176*91f16700Schasinglulu 	return 0;
177*91f16700Schasinglulu }
178*91f16700Schasinglulu static inline int plat_mboot_measure_key(const void *pk_oid __unused,
179*91f16700Schasinglulu 					 const void *pk_ptr __unused,
180*91f16700Schasinglulu 					 size_t pk_len __unused)
181*91f16700Schasinglulu {
182*91f16700Schasinglulu 	return 0;
183*91f16700Schasinglulu }
184*91f16700Schasinglulu #endif /* MEASURED_BOOT */
185*91f16700Schasinglulu 
186*91f16700Schasinglulu /*******************************************************************************
187*91f16700Schasinglulu  * Mandatory BL1 functions
188*91f16700Schasinglulu  ******************************************************************************/
189*91f16700Schasinglulu void bl1_early_platform_setup(void);
190*91f16700Schasinglulu void bl1_plat_arch_setup(void);
191*91f16700Schasinglulu void bl1_platform_setup(void);
192*91f16700Schasinglulu struct meminfo *bl1_plat_sec_mem_layout(void);
193*91f16700Schasinglulu 
194*91f16700Schasinglulu /*******************************************************************************
195*91f16700Schasinglulu  * Optional EL3 component functions in BL31
196*91f16700Schasinglulu  ******************************************************************************/
197*91f16700Schasinglulu 
198*91f16700Schasinglulu /* SDEI platform functions */
199*91f16700Schasinglulu #if SDEI_SUPPORT
200*91f16700Schasinglulu void plat_sdei_setup(void);
201*91f16700Schasinglulu int plat_sdei_validate_entry_point(uintptr_t ep, unsigned int client_mode);
202*91f16700Schasinglulu void plat_sdei_handle_masked_trigger(uint64_t mpidr, unsigned int intr);
203*91f16700Schasinglulu #endif
204*91f16700Schasinglulu 
205*91f16700Schasinglulu void plat_default_ea_handler(unsigned int ea_reason, uint64_t syndrome, void *cookie,
206*91f16700Schasinglulu 		void *handle, uint64_t flags);
207*91f16700Schasinglulu void plat_ea_handler(unsigned int ea_reason, uint64_t syndrome, void *cookie,
208*91f16700Schasinglulu 		void *handle, uint64_t flags);
209*91f16700Schasinglulu 
210*91f16700Schasinglulu /*
211*91f16700Schasinglulu  * The following function is mandatory when the
212*91f16700Schasinglulu  * firmware update feature is used.
213*91f16700Schasinglulu  */
214*91f16700Schasinglulu int bl1_plat_mem_check(uintptr_t mem_base, unsigned int mem_size,
215*91f16700Schasinglulu 		unsigned int flags);
216*91f16700Schasinglulu 
217*91f16700Schasinglulu /*******************************************************************************
218*91f16700Schasinglulu  * Optional BL1 functions (may be overridden)
219*91f16700Schasinglulu  ******************************************************************************/
220*91f16700Schasinglulu /*
221*91f16700Schasinglulu  * The following functions are used for image loading process in BL1.
222*91f16700Schasinglulu  */
223*91f16700Schasinglulu void bl1_plat_set_ep_info(unsigned int image_id,
224*91f16700Schasinglulu 		struct entry_point_info *ep_info);
225*91f16700Schasinglulu /*
226*91f16700Schasinglulu  * The following functions are mandatory when firmware update
227*91f16700Schasinglulu  * feature is used and optional otherwise.
228*91f16700Schasinglulu  */
229*91f16700Schasinglulu unsigned int bl1_plat_get_next_image_id(void);
230*91f16700Schasinglulu struct image_desc *bl1_plat_get_image_desc(unsigned int image_id);
231*91f16700Schasinglulu 
232*91f16700Schasinglulu /*
233*91f16700Schasinglulu  * The following functions are used by firmware update
234*91f16700Schasinglulu  * feature and may optionally be overridden.
235*91f16700Schasinglulu  */
236*91f16700Schasinglulu __dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved);
237*91f16700Schasinglulu 
238*91f16700Schasinglulu /*
239*91f16700Schasinglulu  * This BL1 function can be used by the platforms to update/use image
240*91f16700Schasinglulu  * information for a given `image_id`.
241*91f16700Schasinglulu  */
242*91f16700Schasinglulu int bl1_plat_handle_pre_image_load(unsigned int image_id);
243*91f16700Schasinglulu int bl1_plat_handle_post_image_load(unsigned int image_id);
244*91f16700Schasinglulu 
245*91f16700Schasinglulu #if MEASURED_BOOT
246*91f16700Schasinglulu void bl1_plat_mboot_init(void);
247*91f16700Schasinglulu void bl1_plat_mboot_finish(void);
248*91f16700Schasinglulu #else
249*91f16700Schasinglulu static inline void bl1_plat_mboot_init(void)
250*91f16700Schasinglulu {
251*91f16700Schasinglulu }
252*91f16700Schasinglulu static inline void bl1_plat_mboot_finish(void)
253*91f16700Schasinglulu {
254*91f16700Schasinglulu }
255*91f16700Schasinglulu #endif /* MEASURED_BOOT */
256*91f16700Schasinglulu 
257*91f16700Schasinglulu /*******************************************************************************
258*91f16700Schasinglulu  * Mandatory BL2 functions
259*91f16700Schasinglulu  ******************************************************************************/
260*91f16700Schasinglulu void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3);
261*91f16700Schasinglulu void bl2_plat_arch_setup(void);
262*91f16700Schasinglulu void bl2_platform_setup(void);
263*91f16700Schasinglulu struct meminfo *bl2_plat_sec_mem_layout(void);
264*91f16700Schasinglulu 
265*91f16700Schasinglulu /*
266*91f16700Schasinglulu  * This function can be used by the platforms to update/use image
267*91f16700Schasinglulu  * information for given `image_id`.
268*91f16700Schasinglulu  */
269*91f16700Schasinglulu int bl2_plat_handle_pre_image_load(unsigned int image_id);
270*91f16700Schasinglulu int bl2_plat_handle_post_image_load(unsigned int image_id);
271*91f16700Schasinglulu 
272*91f16700Schasinglulu /*******************************************************************************
273*91f16700Schasinglulu  * Optional BL2 functions (may be overridden)
274*91f16700Schasinglulu  ******************************************************************************/
275*91f16700Schasinglulu #if MEASURED_BOOT
276*91f16700Schasinglulu void bl2_plat_mboot_init(void);
277*91f16700Schasinglulu void bl2_plat_mboot_finish(void);
278*91f16700Schasinglulu #else
279*91f16700Schasinglulu static inline void bl2_plat_mboot_init(void)
280*91f16700Schasinglulu {
281*91f16700Schasinglulu }
282*91f16700Schasinglulu static inline void bl2_plat_mboot_finish(void)
283*91f16700Schasinglulu {
284*91f16700Schasinglulu }
285*91f16700Schasinglulu #endif /* MEASURED_BOOT */
286*91f16700Schasinglulu 
287*91f16700Schasinglulu /*******************************************************************************
288*91f16700Schasinglulu  * Mandatory BL2 at EL3 functions: Must be implemented
289*91f16700Schasinglulu  * if RESET_TO_BL2 image is supported
290*91f16700Schasinglulu  ******************************************************************************/
291*91f16700Schasinglulu void bl2_el3_early_platform_setup(u_register_t arg0, u_register_t arg1,
292*91f16700Schasinglulu 				  u_register_t arg2, u_register_t arg3);
293*91f16700Schasinglulu void bl2_el3_plat_arch_setup(void);
294*91f16700Schasinglulu 
295*91f16700Schasinglulu /*******************************************************************************
296*91f16700Schasinglulu  * Optional BL2 at EL3 functions (may be overridden)
297*91f16700Schasinglulu  ******************************************************************************/
298*91f16700Schasinglulu void bl2_el3_plat_prepare_exit(void);
299*91f16700Schasinglulu 
300*91f16700Schasinglulu /*******************************************************************************
301*91f16700Schasinglulu  * Mandatory BL2U functions.
302*91f16700Schasinglulu  ******************************************************************************/
303*91f16700Schasinglulu void bl2u_early_platform_setup(struct meminfo *mem_layout,
304*91f16700Schasinglulu 		void *plat_info);
305*91f16700Schasinglulu void bl2u_plat_arch_setup(void);
306*91f16700Schasinglulu void bl2u_platform_setup(void);
307*91f16700Schasinglulu 
308*91f16700Schasinglulu /*******************************************************************************
309*91f16700Schasinglulu  * Conditionally mandatory BL2U functions for CSS platforms.
310*91f16700Schasinglulu  ******************************************************************************/
311*91f16700Schasinglulu /*
312*91f16700Schasinglulu  * This function is used to perform any platform-specific actions required to
313*91f16700Schasinglulu  * handle the BL2U_SCP firmware.
314*91f16700Schasinglulu  */
315*91f16700Schasinglulu int bl2u_plat_handle_scp_bl2u(void);
316*91f16700Schasinglulu 
317*91f16700Schasinglulu /*******************************************************************************
318*91f16700Schasinglulu  * Mandatory BL31 functions
319*91f16700Schasinglulu  ******************************************************************************/
320*91f16700Schasinglulu void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
321*91f16700Schasinglulu 		u_register_t arg2, u_register_t arg3);
322*91f16700Schasinglulu void bl31_plat_arch_setup(void);
323*91f16700Schasinglulu void bl31_platform_setup(void);
324*91f16700Schasinglulu void bl31_plat_runtime_setup(void);
325*91f16700Schasinglulu struct entry_point_info *bl31_plat_get_next_image_ep_info(uint32_t type);
326*91f16700Schasinglulu 
327*91f16700Schasinglulu /*******************************************************************************
328*91f16700Schasinglulu  * Mandatory PSCI functions (BL31)
329*91f16700Schasinglulu  ******************************************************************************/
330*91f16700Schasinglulu int plat_setup_psci_ops(uintptr_t sec_entrypoint,
331*91f16700Schasinglulu 			const struct plat_psci_ops **psci_ops);
332*91f16700Schasinglulu const unsigned char *plat_get_power_domain_tree_desc(void);
333*91f16700Schasinglulu 
334*91f16700Schasinglulu /*******************************************************************************
335*91f16700Schasinglulu  * Optional PSCI functions (BL31).
336*91f16700Schasinglulu  ******************************************************************************/
337*91f16700Schasinglulu void plat_psci_stat_accounting_start(const psci_power_state_t *state_info);
338*91f16700Schasinglulu void plat_psci_stat_accounting_stop(const psci_power_state_t *state_info);
339*91f16700Schasinglulu u_register_t plat_psci_stat_get_residency(unsigned int lvl,
340*91f16700Schasinglulu 			const psci_power_state_t *state_info,
341*91f16700Schasinglulu 			unsigned int last_cpu_idx);
342*91f16700Schasinglulu plat_local_state_t plat_get_target_pwr_state(unsigned int lvl,
343*91f16700Schasinglulu 			const plat_local_state_t *states,
344*91f16700Schasinglulu 			unsigned int ncpu);
345*91f16700Schasinglulu 
346*91f16700Schasinglulu /*******************************************************************************
347*91f16700Schasinglulu  * Mandatory BL31 functions when ENABLE_RME=1
348*91f16700Schasinglulu  ******************************************************************************/
349*91f16700Schasinglulu #if ENABLE_RME
350*91f16700Schasinglulu int plat_rmmd_get_cca_attest_token(uintptr_t buf, size_t *len,
351*91f16700Schasinglulu 				   uintptr_t hash, size_t hash_size);
352*91f16700Schasinglulu int plat_rmmd_get_cca_realm_attest_key(uintptr_t buf, size_t *len,
353*91f16700Schasinglulu 				       unsigned int type);
354*91f16700Schasinglulu size_t plat_rmmd_get_el3_rmm_shared_mem(uintptr_t *shared);
355*91f16700Schasinglulu int plat_rmmd_load_manifest(struct rmm_manifest *manifest);
356*91f16700Schasinglulu #endif
357*91f16700Schasinglulu 
358*91f16700Schasinglulu /*******************************************************************************
359*91f16700Schasinglulu  * Optional BL31 functions (may be overridden)
360*91f16700Schasinglulu  ******************************************************************************/
361*91f16700Schasinglulu void bl31_plat_enable_mmu(uint32_t flags);
362*91f16700Schasinglulu 
363*91f16700Schasinglulu /*******************************************************************************
364*91f16700Schasinglulu  * Optional BL32 functions (may be overridden)
365*91f16700Schasinglulu  ******************************************************************************/
366*91f16700Schasinglulu void bl32_plat_enable_mmu(uint32_t flags);
367*91f16700Schasinglulu 
368*91f16700Schasinglulu /*******************************************************************************
369*91f16700Schasinglulu  * Trusted Board Boot functions
370*91f16700Schasinglulu  ******************************************************************************/
371*91f16700Schasinglulu int plat_get_rotpk_info(void *cookie, void **key_ptr, unsigned int *key_len,
372*91f16700Schasinglulu 			unsigned int *flags);
373*91f16700Schasinglulu int plat_get_nv_ctr(void *cookie, unsigned int *nv_ctr);
374*91f16700Schasinglulu int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr);
375*91f16700Schasinglulu int plat_set_nv_ctr2(void *cookie, const struct auth_img_desc_s *img_desc,
376*91f16700Schasinglulu 		unsigned int nv_ctr);
377*91f16700Schasinglulu int get_mbedtls_heap_helper(void **heap_addr, size_t *heap_size);
378*91f16700Schasinglulu int plat_get_enc_key_info(enum fw_enc_status_t fw_enc_status, uint8_t *key,
379*91f16700Schasinglulu 			  size_t *key_len, unsigned int *flags,
380*91f16700Schasinglulu 			  const uint8_t *img_id, size_t img_id_len);
381*91f16700Schasinglulu 
382*91f16700Schasinglulu /*******************************************************************************
383*91f16700Schasinglulu  * Secure Partitions functions
384*91f16700Schasinglulu  ******************************************************************************/
385*91f16700Schasinglulu const struct mmap_region *plat_get_secure_partition_mmap(void *cookie);
386*91f16700Schasinglulu const struct spm_mm_boot_info *plat_get_secure_partition_boot_info(
387*91f16700Schasinglulu 		void *cookie);
388*91f16700Schasinglulu int plat_spm_sp_rd_load(struct sp_res_desc *rd, const void *ptr, size_t size);
389*91f16700Schasinglulu int plat_spm_sp_get_next_address(void **sp_base, size_t *sp_size,
390*91f16700Schasinglulu 				 void **rd_base, size_t *rd_size);
391*91f16700Schasinglulu #if defined(SPD_spmd)
392*91f16700Schasinglulu int plat_spm_core_manifest_load(spmc_manifest_attribute_t *manifest,
393*91f16700Schasinglulu 				const void *pm_addr);
394*91f16700Schasinglulu #endif
395*91f16700Schasinglulu #if defined(SPMC_AT_EL3)
396*91f16700Schasinglulu int plat_spmc_shmem_datastore_get(uint8_t **datastore, size_t *size);
397*91f16700Schasinglulu #endif
398*91f16700Schasinglulu 
399*91f16700Schasinglulu /*******************************************************************************
400*91f16700Schasinglulu  * Mandatory BL image load functions(may be overridden).
401*91f16700Schasinglulu  ******************************************************************************/
402*91f16700Schasinglulu /*
403*91f16700Schasinglulu  * This function returns pointer to the list of images that the
404*91f16700Schasinglulu  * platform has populated to load.
405*91f16700Schasinglulu  */
406*91f16700Schasinglulu struct bl_load_info *plat_get_bl_image_load_info(void);
407*91f16700Schasinglulu 
408*91f16700Schasinglulu /*
409*91f16700Schasinglulu  * This function returns a pointer to the shared memory that the
410*91f16700Schasinglulu  * platform has kept aside to pass trusted firmware related
411*91f16700Schasinglulu  * information that next BL image could need.
412*91f16700Schasinglulu  */
413*91f16700Schasinglulu struct bl_params *plat_get_next_bl_params(void);
414*91f16700Schasinglulu 
415*91f16700Schasinglulu /*
416*91f16700Schasinglulu  * This function flushes to main memory all the params that are
417*91f16700Schasinglulu  * passed to next image.
418*91f16700Schasinglulu  */
419*91f16700Schasinglulu void plat_flush_next_bl_params(void);
420*91f16700Schasinglulu 
421*91f16700Schasinglulu /*
422*91f16700Schasinglulu  * The below function enable Trusted Firmware components like SPDs which
423*91f16700Schasinglulu  * haven't migrated to the new platform API to compile on platforms which
424*91f16700Schasinglulu  * have the compatibility layer disabled.
425*91f16700Schasinglulu  */
426*91f16700Schasinglulu unsigned int platform_core_pos_helper(unsigned long mpidr);
427*91f16700Schasinglulu 
428*91f16700Schasinglulu /*
429*91f16700Schasinglulu  * Optional function to get SOC version
430*91f16700Schasinglulu  */
431*91f16700Schasinglulu int32_t plat_get_soc_version(void);
432*91f16700Schasinglulu 
433*91f16700Schasinglulu /*
434*91f16700Schasinglulu  * Optional function to get SOC revision
435*91f16700Schasinglulu  */
436*91f16700Schasinglulu int32_t plat_get_soc_revision(void);
437*91f16700Schasinglulu 
438*91f16700Schasinglulu /*
439*91f16700Schasinglulu  * Optional function to check for SMCCC function availability for platform
440*91f16700Schasinglulu  */
441*91f16700Schasinglulu int32_t plat_is_smccc_feature_available(u_register_t fid);
442*91f16700Schasinglulu 
443*91f16700Schasinglulu /*******************************************************************************
444*91f16700Schasinglulu  * FWU platform specific functions
445*91f16700Schasinglulu  ******************************************************************************/
446*91f16700Schasinglulu int plat_fwu_set_metadata_image_source(unsigned int image_id,
447*91f16700Schasinglulu 				       uintptr_t *dev_handle,
448*91f16700Schasinglulu 				       uintptr_t *image_spec);
449*91f16700Schasinglulu void plat_fwu_set_images_source(const struct fwu_metadata *metadata);
450*91f16700Schasinglulu uint32_t plat_fwu_get_boot_idx(void);
451*91f16700Schasinglulu 
452*91f16700Schasinglulu /*
453*91f16700Schasinglulu  * Optional function to indicate if cache management operations can be
454*91f16700Schasinglulu  * performed.
455*91f16700Schasinglulu  */
456*91f16700Schasinglulu #if CONDITIONAL_CMO
457*91f16700Schasinglulu uint64_t plat_can_cmo(void);
458*91f16700Schasinglulu #else
459*91f16700Schasinglulu static inline uint64_t plat_can_cmo(void)
460*91f16700Schasinglulu {
461*91f16700Schasinglulu 	return 1;
462*91f16700Schasinglulu }
463*91f16700Schasinglulu #endif /* CONDITIONAL_CMO */
464*91f16700Schasinglulu 
465*91f16700Schasinglulu #endif /* PLATFORM_H */
466