feat(spmd): add partition info get regs
This patch adds support for an EL3 SPMD logical partition to discover
secure partitions using the FFA_PARTITION_INFO_GET_REGS abi. It also
adds helper functions for a logical partition to use the information
returned in registers in a meaningful way.
Signed-off-by: Raghu Krishnamurthy <raghu.ncstate@gmail.com>
Change-Id: Id69488e7367e17e2dfa6c8e332be3c8d41f6c773
diff --git a/include/services/el3_spmd_logical_sp.h b/include/services/el3_spmd_logical_sp.h
index dcbbfab..c810714 100644
--- a/include/services/el3_spmd_logical_sp.h
+++ b/include/services/el3_spmd_logical_sp.h
@@ -35,6 +35,16 @@
uint64_t arg5;
uint64_t arg6;
uint64_t arg7;
+ uint64_t arg8;
+ uint64_t arg9;
+ uint64_t arg10;
+ uint64_t arg11;
+ uint64_t arg12;
+ uint64_t arg13;
+ uint64_t arg14;
+ uint64_t arg15;
+ uint64_t arg16;
+ uint64_t arg17;
};
/* Convenience macro to declare a SPMD logical partition descriptor. */
@@ -76,12 +86,50 @@
return retval->func == FFA_ERROR;
}
+static inline bool is_ffa_success(struct ffa_value *retval)
+{
+ return (retval->func == FFA_SUCCESS_SMC32) ||
+ (retval->func == FFA_SUCCESS_SMC64);
+}
+
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);
}
+static inline uint16_t ffa_partition_info_regs_get_last_idx(
+ struct ffa_value args)
+{
+ return (uint16_t)(args.arg2 & 0xFFFFU);
+}
+
+static inline uint16_t ffa_partition_info_regs_get_curr_idx(
+ struct ffa_value args)
+{
+ return (uint16_t)((args.arg2 >> 16) & 0xFFFFU);
+}
+
+static inline uint16_t ffa_partition_info_regs_get_tag(struct ffa_value args)
+{
+ return (uint16_t)((args.arg2 >> 32) & 0xFFFFU);
+}
+
+static inline uint16_t ffa_partition_info_regs_get_desc_size(
+ struct ffa_value args)
+{
+ return (uint16_t)(args.arg2 >> 48);
+}
+
+bool ffa_partition_info_regs_get_part_info(
+ struct ffa_value args, uint8_t idx,
+ struct ffa_partition_info_v1_1 *partition_info);
+
+bool spmd_el3_invoke_partition_info_get(
+ const uint32_t target_uuid[4],
+ const uint16_t start_index,
+ const uint16_t tag,
+ struct ffa_value *retval);
void spmd_logical_sp_set_spmc_initialized(void);
void spmc_logical_sp_set_spmc_failure(void);
@@ -89,6 +137,9 @@
bool is_spmd_logical_sp_dir_req_in_progress(
spmd_spm_core_context_t *ctx);
+bool is_spmd_logical_sp_info_regs_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,