feat(spmd): el3 direct message API
This patch implements an API that is exposed to SPMD logical partitions
that can be used to send direct messages to a secure partition.
It also adds required code in the SPMD smc handler to complete the
direct response appropriately.
Change-Id: I2d0e38415f13ad4fd28f8984d565036b7d3a9e71
Signed-off-by: Raghu Krishnamurthy <raghu.ncstate@gmail.com>
diff --git a/include/services/el3_spmd_logical_sp.h b/include/services/el3_spmd_logical_sp.h
index 4725c15..dcbbfab 100644
--- a/include/services/el3_spmd_logical_sp.h
+++ b/include/services/el3_spmd_logical_sp.h
@@ -12,6 +12,7 @@
/*******************************************************************************
* Structure definition, typedefs & constants for the SPMD Logical Partitions.
******************************************************************************/
+typedef struct spmd_spm_core_context spmd_spm_core_context_t;
/* Prototype for SPMD logical partition initializing function. */
typedef int32_t (*ffa_spmd_lp_init_t)(void);
@@ -25,6 +26,17 @@
const char *debug_name;
};
+struct ffa_value {
+ uint64_t func;
+ uint64_t arg1;
+ uint64_t arg2;
+ uint64_t arg3;
+ uint64_t arg4;
+ uint64_t arg5;
+ uint64_t arg6;
+ uint64_t arg7;
+};
+
/* Convenience macro to declare a SPMD logical partition descriptor. */
#define DECLARE_SPMD_LOGICAL_PARTITION(_name, _init, _sp_id, _uuid, _properties) \
static const struct spmd_lp_desc __partition_desc_ ## _name \
@@ -52,12 +64,36 @@
static inline bool is_spmd_lp_id(unsigned int id)
{
+#if ENABLE_SPMD_LP
return (id >= SPMD_LP_ID_START && id <= SPMD_LP_ID_END);
+#else
+ return false;
+#endif
+}
+
+static inline bool is_ffa_error(struct ffa_value *retval)
+{
+ return retval->func == FFA_ERROR;
+}
+
+static inline bool is_ffa_direct_msg_resp(struct ffa_value *retval)
+{
+ return (retval->func == FFA_MSG_SEND_DIRECT_RESP_SMC32) ||
+ (retval->func == FFA_MSG_SEND_DIRECT_RESP_SMC64);
}
void spmd_logical_sp_set_spmc_initialized(void);
void spmc_logical_sp_set_spmc_failure(void);
int32_t spmd_logical_sp_init(void);
+bool is_spmd_logical_sp_dir_req_in_progress(
+ spmd_spm_core_context_t *ctx);
+
+bool spmd_el3_ffa_msg_direct_req(uint64_t x1,
+ uint64_t x2,
+ uint64_t x3,
+ uint64_t x4,
+ void *handle,
+ struct ffa_value *retval);
#endif /* EL3_SPMD_LOGICAL_SP_H */