xref: /rk3399_ARM-atf/include/services/el3_spmd_logical_sp.h (revision 0b850e9e7c89667f9a12d49492a60baf44750dd9)
1890b5088SRaghu Krishnamurthy /*
2890b5088SRaghu Krishnamurthy  * Copyright (c) 2023, ARM Limited and Contributors. All rights reserved.
3890b5088SRaghu Krishnamurthy  * SPDX-License-Identifier: BSD-3-Clause
4890b5088SRaghu Krishnamurthy  */
5890b5088SRaghu Krishnamurthy #ifndef EL3_SPMD_LOGICAL_SP_H
6890b5088SRaghu Krishnamurthy #define EL3_SPMD_LOGICAL_SP_H
7890b5088SRaghu Krishnamurthy 
8890b5088SRaghu Krishnamurthy #include <common/bl_common.h>
9890b5088SRaghu Krishnamurthy #include <lib/cassert.h>
10890b5088SRaghu Krishnamurthy #include <services/ffa_svc.h>
11890b5088SRaghu Krishnamurthy 
12890b5088SRaghu Krishnamurthy /*******************************************************************************
13890b5088SRaghu Krishnamurthy  * Structure definition, typedefs & constants for the SPMD Logical Partitions.
14890b5088SRaghu Krishnamurthy  ******************************************************************************/
1566bdfd6eSRaghu Krishnamurthy typedef struct spmd_spm_core_context spmd_spm_core_context_t;
16890b5088SRaghu Krishnamurthy 
17890b5088SRaghu Krishnamurthy /* Prototype for SPMD logical partition initializing function. */
18890b5088SRaghu Krishnamurthy typedef int32_t (*ffa_spmd_lp_init_t)(void);
19890b5088SRaghu Krishnamurthy 
20890b5088SRaghu Krishnamurthy /* SPMD Logical Partition Descriptor. */
21890b5088SRaghu Krishnamurthy struct spmd_lp_desc {
22890b5088SRaghu Krishnamurthy 	ffa_spmd_lp_init_t init;
23890b5088SRaghu Krishnamurthy 	uint16_t sp_id;
24890b5088SRaghu Krishnamurthy 	uint32_t properties;
25890b5088SRaghu Krishnamurthy 	uint32_t uuid[4];  /* Little Endian. */
26890b5088SRaghu Krishnamurthy 	const char *debug_name;
27890b5088SRaghu Krishnamurthy };
28890b5088SRaghu Krishnamurthy 
2966bdfd6eSRaghu Krishnamurthy struct ffa_value {
3066bdfd6eSRaghu Krishnamurthy 	uint64_t func;
3166bdfd6eSRaghu Krishnamurthy 	uint64_t arg1;
3266bdfd6eSRaghu Krishnamurthy 	uint64_t arg2;
3366bdfd6eSRaghu Krishnamurthy 	uint64_t arg3;
3466bdfd6eSRaghu Krishnamurthy 	uint64_t arg4;
3566bdfd6eSRaghu Krishnamurthy 	uint64_t arg5;
3666bdfd6eSRaghu Krishnamurthy 	uint64_t arg6;
3766bdfd6eSRaghu Krishnamurthy 	uint64_t arg7;
38*0b850e9eSRaghu Krishnamurthy 	uint64_t arg8;
39*0b850e9eSRaghu Krishnamurthy 	uint64_t arg9;
40*0b850e9eSRaghu Krishnamurthy 	uint64_t arg10;
41*0b850e9eSRaghu Krishnamurthy 	uint64_t arg11;
42*0b850e9eSRaghu Krishnamurthy 	uint64_t arg12;
43*0b850e9eSRaghu Krishnamurthy 	uint64_t arg13;
44*0b850e9eSRaghu Krishnamurthy 	uint64_t arg14;
45*0b850e9eSRaghu Krishnamurthy 	uint64_t arg15;
46*0b850e9eSRaghu Krishnamurthy 	uint64_t arg16;
47*0b850e9eSRaghu Krishnamurthy 	uint64_t arg17;
4866bdfd6eSRaghu Krishnamurthy };
4966bdfd6eSRaghu Krishnamurthy 
50890b5088SRaghu Krishnamurthy /* Convenience macro to declare a SPMD logical partition descriptor. */
51890b5088SRaghu Krishnamurthy #define DECLARE_SPMD_LOGICAL_PARTITION(_name, _init, _sp_id, _uuid, _properties) \
52890b5088SRaghu Krishnamurthy 	static const struct spmd_lp_desc __partition_desc_ ## _name	    \
53890b5088SRaghu Krishnamurthy 		__section(".spmd_lp_descs") __used = {			    \
54890b5088SRaghu Krishnamurthy 			.debug_name = #_name,				    \
55890b5088SRaghu Krishnamurthy 			.init = (_init),				    \
56890b5088SRaghu Krishnamurthy 			.sp_id = (_sp_id),				    \
57890b5088SRaghu Krishnamurthy 			.uuid = _uuid,					    \
58890b5088SRaghu Krishnamurthy 			.properties = (_properties),			    \
59890b5088SRaghu Krishnamurthy 		}
60890b5088SRaghu Krishnamurthy 
61890b5088SRaghu Krishnamurthy IMPORT_SYM(uintptr_t, __SPMD_LP_DESCS_START__,	SPMD_LP_DESCS_START);
62890b5088SRaghu Krishnamurthy IMPORT_SYM(uintptr_t, __SPMD_LP_DESCS_END__,	SPMD_LP_DESCS_END);
63890b5088SRaghu Krishnamurthy 
64890b5088SRaghu Krishnamurthy #define SPMD_LP_DESCS_COUNT ((SPMD_LP_DESCS_END - SPMD_LP_DESCS_START) \
65890b5088SRaghu Krishnamurthy 			  / sizeof(struct spmd_lp_desc))
66890b5088SRaghu Krishnamurthy CASSERT(sizeof(struct spmd_lp_desc) == 40, assert_spmd_lp_desc_size_mismatch);
67890b5088SRaghu Krishnamurthy 
68890b5088SRaghu Krishnamurthy /*
69890b5088SRaghu Krishnamurthy  * Reserve 63 IDs for SPMD Logical Partitions. Currently, 0xFFC0 to 0xFFFE
70890b5088SRaghu Krishnamurthy  * is reserved.
71890b5088SRaghu Krishnamurthy  */
72890b5088SRaghu Krishnamurthy #define SPMD_LP_ID_END		(SPMD_DIRECT_MSG_ENDPOINT_ID - 1)
73890b5088SRaghu Krishnamurthy #define SPMD_LP_ID_START	(SPMD_LP_ID_END - 62)
74890b5088SRaghu Krishnamurthy 
75890b5088SRaghu Krishnamurthy static inline bool is_spmd_lp_id(unsigned int id)
76890b5088SRaghu Krishnamurthy {
7766bdfd6eSRaghu Krishnamurthy #if ENABLE_SPMD_LP
78890b5088SRaghu Krishnamurthy 	return (id >= SPMD_LP_ID_START && id <= SPMD_LP_ID_END);
7966bdfd6eSRaghu Krishnamurthy #else
8066bdfd6eSRaghu Krishnamurthy 	return false;
8166bdfd6eSRaghu Krishnamurthy #endif
8266bdfd6eSRaghu Krishnamurthy }
8366bdfd6eSRaghu Krishnamurthy 
8466bdfd6eSRaghu Krishnamurthy static inline bool is_ffa_error(struct ffa_value *retval)
8566bdfd6eSRaghu Krishnamurthy {
8666bdfd6eSRaghu Krishnamurthy 	return retval->func == FFA_ERROR;
8766bdfd6eSRaghu Krishnamurthy }
8866bdfd6eSRaghu Krishnamurthy 
89*0b850e9eSRaghu Krishnamurthy static inline bool is_ffa_success(struct ffa_value *retval)
90*0b850e9eSRaghu Krishnamurthy {
91*0b850e9eSRaghu Krishnamurthy 	return (retval->func == FFA_SUCCESS_SMC32) ||
92*0b850e9eSRaghu Krishnamurthy 		(retval->func == FFA_SUCCESS_SMC64);
93*0b850e9eSRaghu Krishnamurthy }
94*0b850e9eSRaghu Krishnamurthy 
9566bdfd6eSRaghu Krishnamurthy static inline bool is_ffa_direct_msg_resp(struct ffa_value *retval)
9666bdfd6eSRaghu Krishnamurthy {
9766bdfd6eSRaghu Krishnamurthy 	return (retval->func == FFA_MSG_SEND_DIRECT_RESP_SMC32) ||
9866bdfd6eSRaghu Krishnamurthy 		(retval->func == FFA_MSG_SEND_DIRECT_RESP_SMC64);
99890b5088SRaghu Krishnamurthy }
100890b5088SRaghu Krishnamurthy 
101*0b850e9eSRaghu Krishnamurthy static inline uint16_t ffa_partition_info_regs_get_last_idx(
102*0b850e9eSRaghu Krishnamurthy 	struct ffa_value args)
103*0b850e9eSRaghu Krishnamurthy {
104*0b850e9eSRaghu Krishnamurthy 	return (uint16_t)(args.arg2 & 0xFFFFU);
105*0b850e9eSRaghu Krishnamurthy }
106*0b850e9eSRaghu Krishnamurthy 
107*0b850e9eSRaghu Krishnamurthy static inline uint16_t ffa_partition_info_regs_get_curr_idx(
108*0b850e9eSRaghu Krishnamurthy 	struct ffa_value args)
109*0b850e9eSRaghu Krishnamurthy {
110*0b850e9eSRaghu Krishnamurthy 	return (uint16_t)((args.arg2 >> 16) & 0xFFFFU);
111*0b850e9eSRaghu Krishnamurthy }
112*0b850e9eSRaghu Krishnamurthy 
113*0b850e9eSRaghu Krishnamurthy static inline uint16_t ffa_partition_info_regs_get_tag(struct ffa_value args)
114*0b850e9eSRaghu Krishnamurthy {
115*0b850e9eSRaghu Krishnamurthy 	return (uint16_t)((args.arg2 >> 32) & 0xFFFFU);
116*0b850e9eSRaghu Krishnamurthy }
117*0b850e9eSRaghu Krishnamurthy 
118*0b850e9eSRaghu Krishnamurthy static inline uint16_t ffa_partition_info_regs_get_desc_size(
119*0b850e9eSRaghu Krishnamurthy 	struct ffa_value args)
120*0b850e9eSRaghu Krishnamurthy {
121*0b850e9eSRaghu Krishnamurthy 	return (uint16_t)(args.arg2 >> 48);
122*0b850e9eSRaghu Krishnamurthy }
123*0b850e9eSRaghu Krishnamurthy 
124*0b850e9eSRaghu Krishnamurthy bool ffa_partition_info_regs_get_part_info(
125*0b850e9eSRaghu Krishnamurthy 	struct ffa_value args, uint8_t idx,
126*0b850e9eSRaghu Krishnamurthy 	struct ffa_partition_info_v1_1 *partition_info);
127*0b850e9eSRaghu Krishnamurthy 
128*0b850e9eSRaghu Krishnamurthy bool spmd_el3_invoke_partition_info_get(
129*0b850e9eSRaghu Krishnamurthy 				const uint32_t target_uuid[4],
130*0b850e9eSRaghu Krishnamurthy 				const uint16_t start_index,
131*0b850e9eSRaghu Krishnamurthy 				const uint16_t tag,
132*0b850e9eSRaghu Krishnamurthy 				struct ffa_value *retval);
133890b5088SRaghu Krishnamurthy void spmd_logical_sp_set_spmc_initialized(void);
134890b5088SRaghu Krishnamurthy void spmc_logical_sp_set_spmc_failure(void);
135890b5088SRaghu Krishnamurthy 
136890b5088SRaghu Krishnamurthy int32_t spmd_logical_sp_init(void);
13766bdfd6eSRaghu Krishnamurthy bool is_spmd_logical_sp_dir_req_in_progress(
13866bdfd6eSRaghu Krishnamurthy 		spmd_spm_core_context_t *ctx);
13966bdfd6eSRaghu Krishnamurthy 
140*0b850e9eSRaghu Krishnamurthy bool is_spmd_logical_sp_info_regs_req_in_progress(
141*0b850e9eSRaghu Krishnamurthy 		spmd_spm_core_context_t *ctx);
142*0b850e9eSRaghu Krishnamurthy 
14366bdfd6eSRaghu Krishnamurthy bool spmd_el3_ffa_msg_direct_req(uint64_t x1,
14466bdfd6eSRaghu Krishnamurthy 				 uint64_t x2,
14566bdfd6eSRaghu Krishnamurthy 				 uint64_t x3,
14666bdfd6eSRaghu Krishnamurthy 				 uint64_t x4,
14766bdfd6eSRaghu Krishnamurthy 				 void *handle,
14866bdfd6eSRaghu Krishnamurthy 				 struct ffa_value *retval);
149890b5088SRaghu Krishnamurthy 
150890b5088SRaghu Krishnamurthy #endif /* EL3_SPMD_LOGICAL_SP_H */
151