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