refactor(memory sharing): initialize memory access

Factor out logic to initialize 'struct ffa_memory_access' from existing
helper functions. This shall help with adding helpers for memory sharing
with multiple borrowers.

Change-Id: Ifd9e2fe0fffca962d10044b152af6bd841f65e9b
Signed-off-by: J-Alves <joao.alves@arm.com>
diff --git a/vmlib/ffa.c b/vmlib/ffa.c
index cc9d558..13b5d95 100644
--- a/vmlib/ffa.c
+++ b/vmlib/ffa.c
@@ -35,14 +35,35 @@
 }
 
 /**
- * Initialises the header of the given `ffa_memory_region`, not including the
- * composite memory region offset.
+ * Initializes receiver permissions, in a memory transaction descriptor.
+ */
+void ffa_memory_access_init_permissions(
+	struct ffa_memory_access *receiver, ffa_vm_id_t receiver_id,
+	enum ffa_data_access data_access,
+	enum ffa_instruction_access instruction_access,
+	ffa_memory_receiver_flags_t flags)
+{
+	ffa_memory_access_permissions_t permissions = 0;
+
+	/* Set memory region's permissions. */
+	ffa_set_data_access_attr(&permissions, data_access);
+	ffa_set_instruction_access_attr(&permissions, instruction_access);
+
+	receiver->receiver_permissions.receiver = receiver_id;
+	receiver->receiver_permissions.permissions = permissions;
+	receiver->receiver_permissions.flags = flags;
+
+	receiver->reserved_0 = 0ULL;
+}
+
+/**
+ * Initialises the header of the given `ffa_memory_region`, not
+ * including the composite memory region offset.
  */
 static void ffa_memory_region_init_header(
 	struct ffa_memory_region *memory_region, ffa_vm_id_t sender,
 	ffa_memory_attributes_t attributes, ffa_memory_region_flags_t flags,
-	ffa_memory_handle_t handle, uint32_t tag, ffa_vm_id_t receiver,
-	ffa_memory_access_permissions_t permissions)
+	ffa_memory_handle_t handle, uint32_t tag, uint32_t receiver_count)
 {
 	memory_region->sender = sender;
 	memory_region->attributes = attributes;
@@ -51,12 +72,7 @@
 	memory_region->handle = handle;
 	memory_region->tag = tag;
 	memory_region->reserved_1 = 0;
-	memory_region->receiver_count = 1;
-	memory_region->receivers[0].receiver_permissions.receiver = receiver;
-	memory_region->receivers[0].receiver_permissions.permissions =
-		permissions;
-	memory_region->receivers[0].receiver_permissions.flags = 0;
-	memory_region->receivers[0].reserved_0 = 0;
+	memory_region->receiver_count = receiver_count;
 }
 
 /**
@@ -160,20 +176,18 @@
 	enum ffa_memory_shareability shareability, uint32_t *total_length,
 	uint32_t *fragment_length)
 {
-	ffa_memory_access_permissions_t permissions = 0;
 	ffa_memory_attributes_t attributes = 0;
 
-	/* Set memory region's permissions. */
-	ffa_set_data_access_attr(&permissions, data_access);
-	ffa_set_instruction_access_attr(&permissions, instruction_access);
-
 	/* Set memory region's page attributes. */
 	ffa_set_memory_type_attr(&attributes, type);
 	ffa_set_memory_cacheability_attr(&attributes, cacheability);
 	ffa_set_memory_shareability_attr(&attributes, shareability);
 
 	ffa_memory_region_init_header(memory_region, sender, attributes, flags,
-				      0, tag, receiver, permissions);
+				      0, tag, 1);
+	ffa_memory_access_init_permissions(&memory_region->receivers[0],
+					   receiver, data_access,
+					   instruction_access, 0);
 
 	return ffa_memory_region_init_constituents(
 		memory_region, memory_region_max_size, constituents,
@@ -194,20 +208,19 @@
 	enum ffa_memory_type type, enum ffa_memory_cacheability cacheability,
 	enum ffa_memory_shareability shareability)
 {
-	ffa_memory_access_permissions_t permissions = 0;
 	ffa_memory_attributes_t attributes = 0;
 
-	/* Set memory region's permissions. */
-	ffa_set_data_access_attr(&permissions, data_access);
-	ffa_set_instruction_access_attr(&permissions, instruction_access);
-
 	/* Set memory region's page attributes. */
 	ffa_set_memory_type_attr(&attributes, type);
 	ffa_set_memory_cacheability_attr(&attributes, cacheability);
 	ffa_set_memory_shareability_attr(&attributes, shareability);
 
 	ffa_memory_region_init_header(memory_region, sender, attributes, flags,
-				      handle, tag, receiver, permissions);
+				      handle, tag, 1);
+	ffa_memory_access_init_permissions(&memory_region->receivers[0],
+					   receiver, data_access,
+					   instruction_access, 0);
+
 	/*
 	 * Offset 0 in this case means that the hypervisor should allocate the
 	 * address ranges. This is the only configuration supported by Hafnium,
@@ -265,7 +278,14 @@
 	uint32_t constituents_offset;
 
 	ffa_memory_region_init_header(response, sender, attributes, flags,
-				      handle, 0, receiver, permissions);
+				      handle, 0, 1);
+	/*
+	 * Initialized here as in memory retrieve responses we currently expect
+	 * one borrower to be specified.
+	 */
+	ffa_memory_access_init_permissions(&response->receivers[0], receiver, 0,
+					   0, 0);
+
 	/*
 	 * Note that `sizeof(struct_ffa_memory_region)` and `sizeof(struct
 	 * ffa_memory_access)` must both be multiples of 16 (as verified by the