xref: /rk3399_ARM-atf/include/services/el3_spmd_logical_sp.h (revision 0b850e9e7c89667f9a12d49492a60baf44750dd9)
1 /*
2  * Copyright (c) 2023, ARM Limited and Contributors. All rights reserved.
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 #ifndef EL3_SPMD_LOGICAL_SP_H
6 #define EL3_SPMD_LOGICAL_SP_H
7 
8 #include <common/bl_common.h>
9 #include <lib/cassert.h>
10 #include <services/ffa_svc.h>
11 
12 /*******************************************************************************
13  * Structure definition, typedefs & constants for the SPMD Logical Partitions.
14  ******************************************************************************/
15 typedef struct spmd_spm_core_context spmd_spm_core_context_t;
16 
17 /* Prototype for SPMD logical partition initializing function. */
18 typedef int32_t (*ffa_spmd_lp_init_t)(void);
19 
20 /* SPMD Logical Partition Descriptor. */
21 struct spmd_lp_desc {
22 	ffa_spmd_lp_init_t init;
23 	uint16_t sp_id;
24 	uint32_t properties;
25 	uint32_t uuid[4];  /* Little Endian. */
26 	const char *debug_name;
27 };
28 
29 struct ffa_value {
30 	uint64_t func;
31 	uint64_t arg1;
32 	uint64_t arg2;
33 	uint64_t arg3;
34 	uint64_t arg4;
35 	uint64_t arg5;
36 	uint64_t arg6;
37 	uint64_t arg7;
38 	uint64_t arg8;
39 	uint64_t arg9;
40 	uint64_t arg10;
41 	uint64_t arg11;
42 	uint64_t arg12;
43 	uint64_t arg13;
44 	uint64_t arg14;
45 	uint64_t arg15;
46 	uint64_t arg16;
47 	uint64_t arg17;
48 };
49 
50 /* Convenience macro to declare a SPMD logical partition descriptor. */
51 #define DECLARE_SPMD_LOGICAL_PARTITION(_name, _init, _sp_id, _uuid, _properties) \
52 	static const struct spmd_lp_desc __partition_desc_ ## _name	    \
53 		__section(".spmd_lp_descs") __used = {			    \
54 			.debug_name = #_name,				    \
55 			.init = (_init),				    \
56 			.sp_id = (_sp_id),				    \
57 			.uuid = _uuid,					    \
58 			.properties = (_properties),			    \
59 		}
60 
61 IMPORT_SYM(uintptr_t, __SPMD_LP_DESCS_START__,	SPMD_LP_DESCS_START);
62 IMPORT_SYM(uintptr_t, __SPMD_LP_DESCS_END__,	SPMD_LP_DESCS_END);
63 
64 #define SPMD_LP_DESCS_COUNT ((SPMD_LP_DESCS_END - SPMD_LP_DESCS_START) \
65 			  / sizeof(struct spmd_lp_desc))
66 CASSERT(sizeof(struct spmd_lp_desc) == 40, assert_spmd_lp_desc_size_mismatch);
67 
68 /*
69  * Reserve 63 IDs for SPMD Logical Partitions. Currently, 0xFFC0 to 0xFFFE
70  * is reserved.
71  */
72 #define SPMD_LP_ID_END		(SPMD_DIRECT_MSG_ENDPOINT_ID - 1)
73 #define SPMD_LP_ID_START	(SPMD_LP_ID_END - 62)
74 
75 static inline bool is_spmd_lp_id(unsigned int id)
76 {
77 #if ENABLE_SPMD_LP
78 	return (id >= SPMD_LP_ID_START && id <= SPMD_LP_ID_END);
79 #else
80 	return false;
81 #endif
82 }
83 
84 static inline bool is_ffa_error(struct ffa_value *retval)
85 {
86 	return retval->func == FFA_ERROR;
87 }
88 
89 static inline bool is_ffa_success(struct ffa_value *retval)
90 {
91 	return (retval->func == FFA_SUCCESS_SMC32) ||
92 		(retval->func == FFA_SUCCESS_SMC64);
93 }
94 
95 static inline bool is_ffa_direct_msg_resp(struct ffa_value *retval)
96 {
97 	return (retval->func == FFA_MSG_SEND_DIRECT_RESP_SMC32) ||
98 		(retval->func == FFA_MSG_SEND_DIRECT_RESP_SMC64);
99 }
100 
101 static inline uint16_t ffa_partition_info_regs_get_last_idx(
102 	struct ffa_value args)
103 {
104 	return (uint16_t)(args.arg2 & 0xFFFFU);
105 }
106 
107 static inline uint16_t ffa_partition_info_regs_get_curr_idx(
108 	struct ffa_value args)
109 {
110 	return (uint16_t)((args.arg2 >> 16) & 0xFFFFU);
111 }
112 
113 static inline uint16_t ffa_partition_info_regs_get_tag(struct ffa_value args)
114 {
115 	return (uint16_t)((args.arg2 >> 32) & 0xFFFFU);
116 }
117 
118 static inline uint16_t ffa_partition_info_regs_get_desc_size(
119 	struct ffa_value args)
120 {
121 	return (uint16_t)(args.arg2 >> 48);
122 }
123 
124 bool ffa_partition_info_regs_get_part_info(
125 	struct ffa_value args, uint8_t idx,
126 	struct ffa_partition_info_v1_1 *partition_info);
127 
128 bool spmd_el3_invoke_partition_info_get(
129 				const uint32_t target_uuid[4],
130 				const uint16_t start_index,
131 				const uint16_t tag,
132 				struct ffa_value *retval);
133 void spmd_logical_sp_set_spmc_initialized(void);
134 void spmc_logical_sp_set_spmc_failure(void);
135 
136 int32_t spmd_logical_sp_init(void);
137 bool is_spmd_logical_sp_dir_req_in_progress(
138 		spmd_spm_core_context_t *ctx);
139 
140 bool is_spmd_logical_sp_info_regs_req_in_progress(
141 		spmd_spm_core_context_t *ctx);
142 
143 bool spmd_el3_ffa_msg_direct_req(uint64_t x1,
144 				 uint64_t x2,
145 				 uint64_t x3,
146 				 uint64_t x4,
147 				 void *handle,
148 				 struct ffa_value *retval);
149 
150 #endif /* EL3_SPMD_LOGICAL_SP_H */
151