refactor(spm): `ffa_memory_access` constructors

Add `ffa_memory_access_init_permissions` and
`ffa_memory_access_init_permissions_from_mem_func` helpers.

Change-Id: I9a5bb09e7f230a65decff7f58a0c188aff3e7449
Signed-off-by: Karl Meakin <karl.meakin@arm.com>
diff --git a/include/runtime_services/ffa_helpers.h b/include/runtime_services/ffa_helpers.h
index 4f2bb02..91a7a6e 100644
--- a/include/runtime_services/ffa_helpers.h
+++ b/include/runtime_services/ffa_helpers.h
@@ -728,6 +728,12 @@
 struct ffa_value ffa_partition_info_get_regs(const struct ffa_uuid uuid,
 					     const uint16_t start_index,
 					     const uint16_t tag);
+
+struct ffa_memory_access ffa_memory_access_init_permissions(
+	ffa_id_t receiver_id, enum ffa_data_access data_access,
+	enum ffa_instruction_access instruction_access,
+	ffa_memory_receiver_flags_t flags);
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* FFA_HELPERS_H */
diff --git a/include/runtime_services/spm_common.h b/include/runtime_services/spm_common.h
index 0c8ade1..fc7ddd7 100644
--- a/include/runtime_services/spm_common.h
+++ b/include/runtime_services/spm_common.h
@@ -139,4 +139,9 @@
 bool ffa_partition_info_regs_helper(const struct ffa_uuid uuid,
 		       const struct ffa_partition_info *expected,
 		       const uint16_t expected_size);
+
+struct ffa_memory_access ffa_memory_access_init_permissions_from_mem_func(
+	ffa_id_t receiver_id,
+	uint32_t mem_func);
+
 #endif /* SPM_COMMON_H */
diff --git a/tftf/tests/runtime_services/secure_service/ffa_helpers.c b/tftf/tests/runtime_services/secure_service/ffa_helpers.c
index 601f2d3..9447a23 100644
--- a/tftf/tests/runtime_services/secure_service/ffa_helpers.c
+++ b/tftf/tests/runtime_services/secure_service/ffa_helpers.c
@@ -703,3 +703,23 @@
 
 	return ffa_service_call(&args);
 }
+
+/**
+ * Initializes receiver permissions in a memory transaction descriptor.
+ */
+struct ffa_memory_access ffa_memory_access_init_permissions(
+	ffa_id_t receiver_id, enum ffa_data_access data_access,
+	enum ffa_instruction_access instruction_access,
+	ffa_memory_receiver_flags_t flags)
+{
+	struct ffa_memory_access access;
+	access.reserved_0 = 0;
+	access.composite_memory_region_offset = 0;
+	access.receiver_permissions.flags = flags;
+	access.receiver_permissions.receiver = receiver_id;
+	access.receiver_permissions.permissions.data_access = data_access;
+	access.receiver_permissions.permissions.instruction_access =
+		instruction_access;
+
+	return access;
+}
diff --git a/tftf/tests/runtime_services/secure_service/spm_common.c b/tftf/tests/runtime_services/secure_service/spm_common.c
index 2e6d257..e76564a 100644
--- a/tftf/tests/runtime_services/secure_service/spm_common.c
+++ b/tftf/tests/runtime_services/secure_service/spm_common.c
@@ -610,3 +610,22 @@
 {
 	return configure_trusted_wdog_interrupt(source, dest, false);
 }
+
+/**
+ * Initializes receiver permissions in a memory transaction descriptor, using
+ * `mem_func` to determine the appropriate permissions.
+ */
+struct ffa_memory_access ffa_memory_access_init_permissions_from_mem_func(
+	ffa_id_t receiver_id, uint32_t mem_func)
+{
+
+	enum ffa_instruction_access instruction_access =
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED;
+	enum ffa_data_access data_access =
+		(mem_func == FFA_MEM_DONATE_SMC32)
+			? FFA_DATA_ACCESS_NOT_SPECIFIED
+			: FFA_DATA_ACCESS_RW;
+
+	return ffa_memory_access_init_permissions(receiver_id, data_access,
+						  instruction_access, 0);
+}