feat(memory share): relinquish with multiple borrowers

Update the handling of the FFA_MEM_RELINQUISH_32 to support multiple
borrowers.

Change-Id: I1a1848462efc51144796eff061d7c6d144f89a86
Signed-off-by: J-Alves <joao.alves@arm.com>
diff --git a/src/ffa_memory.c b/src/ffa_memory.c
index 6da0459..f3c54f5 100644
--- a/src/ffa_memory.c
+++ b/src/ffa_memory.c
@@ -2804,6 +2804,7 @@
 	struct ffa_memory_region *memory_region;
 	bool clear;
 	struct ffa_value ret;
+	uint32_t receiver_index;
 
 	if (relinquish_request->endpoint_count != 1) {
 		dlog_verbose(
@@ -2843,24 +2844,24 @@
 	memory_region = share_state->memory_region;
 	CHECK(memory_region != NULL);
 
-	if (memory_region->receivers[0].receiver_permissions.receiver !=
-	    from_locked.vm->id) {
+	receiver_index = ffa_memory_region_get_receiver(memory_region,
+							from_locked.vm->id);
+
+	if (receiver_index == memory_region->receiver_count) {
 		dlog_verbose(
 			"VM ID %d tried to relinquish memory region with "
-			"handle %#x but receiver was %d.\n",
-			from_locked.vm->id, handle,
-			memory_region->receivers[0]
-				.receiver_permissions.receiver);
+			"handle %#x and it is not a valid borrower.\n",
+			from_locked.vm->id, handle);
 		ret = ffa_error(FFA_INVALID_PARAMETERS);
 		goto out;
 	}
 
-	if (share_state->retrieved_fragment_count[0] !=
+	if (share_state->retrieved_fragment_count[receiver_index] !=
 	    share_state->fragment_count) {
 		dlog_verbose(
-			"Memory with handle %#x not yet fully retrieved, can't "
-			"relinquish.\n",
-			handle);
+			"Memory with handle %#x not yet fully retrieved, "
+			"receiver %x can't relinquish.\n",
+			handle, from_locked.vm->id);
 		ret = ffa_error(FFA_INVALID_PARAMETERS);
 		goto out;
 	}
@@ -2887,7 +2888,7 @@
 		 * Mark memory handle as not retrieved, so it can be reclaimed
 		 * (or retrieved again).
 		 */
-		share_state->retrieved_fragment_count[0] = 0;
+		share_state->retrieved_fragment_count[receiver_index] = 0;
 	}
 
 out: