xref: /arm-trusted-firmware/include/services/el3_spmc_logical_sp.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2022, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu #ifndef EL3_SP_H
7*91f16700Schasinglulu #define EL3_SP_H
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <common/bl_common.h>
10*91f16700Schasinglulu #include <lib/cassert.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu /*******************************************************************************
13*91f16700Schasinglulu  * Structure definition, typedefs & constants for the Logical SPs.
14*91f16700Schasinglulu  ******************************************************************************/
15*91f16700Schasinglulu 
16*91f16700Schasinglulu typedef uint64_t (*direct_msg_handler)(uint32_t smc_fid, bool secure_origin,
17*91f16700Schasinglulu 				       uint64_t x1, uint64_t x2, uint64_t x3,
18*91f16700Schasinglulu 				       uint64_t x4, void *cookie, void *handle,
19*91f16700Schasinglulu 				       uint64_t flags);
20*91f16700Schasinglulu 
21*91f16700Schasinglulu /* Prototype for logical partition initializing function. */
22*91f16700Schasinglulu typedef int32_t (*ffa_partition_init_t)(void);
23*91f16700Schasinglulu 
24*91f16700Schasinglulu /* Logical Partition Descriptor. */
25*91f16700Schasinglulu struct el3_lp_desc {
26*91f16700Schasinglulu 	ffa_partition_init_t init;
27*91f16700Schasinglulu 	uint16_t sp_id;
28*91f16700Schasinglulu 	uint32_t properties;
29*91f16700Schasinglulu 	uint32_t uuid[4];  /* Little Endian. */
30*91f16700Schasinglulu 	direct_msg_handler direct_req;
31*91f16700Schasinglulu 	const char *debug_name;
32*91f16700Schasinglulu };
33*91f16700Schasinglulu 
34*91f16700Schasinglulu /* Convenience macro to declare a logical partition descriptor. */
35*91f16700Schasinglulu #define DECLARE_LOGICAL_PARTITION(_name, _init, _sp_id, _uuid, _properties, \
36*91f16700Schasinglulu 				  _direct_req)				    \
37*91f16700Schasinglulu 	static const struct el3_lp_desc __partition_desc_ ## _name	    \
38*91f16700Schasinglulu 		__section(".el3_lp_descs") __used = {			    \
39*91f16700Schasinglulu 			.debug_name = #_name,				    \
40*91f16700Schasinglulu 			.init = (_init),				    \
41*91f16700Schasinglulu 			.sp_id = (_sp_id),				    \
42*91f16700Schasinglulu 			.uuid = _uuid,					    \
43*91f16700Schasinglulu 			.properties = (_properties),			    \
44*91f16700Schasinglulu 			.direct_req = (_direct_req),			    \
45*91f16700Schasinglulu 		}
46*91f16700Schasinglulu 
47*91f16700Schasinglulu 
48*91f16700Schasinglulu /*******************************************************************************
49*91f16700Schasinglulu  * Function & variable prototypes.
50*91f16700Schasinglulu  ******************************************************************************/
51*91f16700Schasinglulu int el3_sp_desc_validate(void);
52*91f16700Schasinglulu 
53*91f16700Schasinglulu IMPORT_SYM(uintptr_t, __EL3_LP_DESCS_START__,	EL3_LP_DESCS_START);
54*91f16700Schasinglulu IMPORT_SYM(uintptr_t, __EL3_LP_DESCS_END__,	EL3_LP_DESCS_END);
55*91f16700Schasinglulu 
56*91f16700Schasinglulu #define EL3_LP_DESCS_COUNT ((EL3_LP_DESCS_END - EL3_LP_DESCS_START) \
57*91f16700Schasinglulu 			  / sizeof(struct el3_lp_desc))
58*91f16700Schasinglulu 
59*91f16700Schasinglulu #endif /* EL3_SP_H */
60