refactor: create helper to unmap rxtx buffer pair of a partition

The helper utility added in this patch is needed in subsequent patch
that lets partition manager to reclaim resources allocated to a
parition if it aborts.

Change-Id: I09375e2058378aa6429382104200f65da25afba1
Signed-off-by: Madhukar Pappireddy <madhukar.pappireddy@arm.com>
diff --git a/src/api.c b/src/api.c
index 3ba1993..705834c 100644
--- a/src/api.c
+++ b/src/api.c
@@ -1862,6 +1862,8 @@
 	owner_vm_id = api_get_rxtx_description(current->vm, &send, &recv,
 					       &page_count);
 	if (owner_vm_id == HF_INVALID_VM_ID) {
+		dlog_error("Cannot map RX/TX for invalid VM ID %#x.\n",
+			   owner_vm_id);
 		return ffa_error(FFA_INVALID_PARAMETERS);
 	}
 
@@ -1958,52 +1960,41 @@
 		goto out;
 	}
 
-	/* Currently a mailbox size of 1 page is assumed. */
-	send_pa_begin = pa_from_va(va_from_ptr(vm->mailbox.send));
-	send_pa_end = pa_add(send_pa_begin, HF_MAILBOX_SIZE);
-	recv_pa_begin = pa_from_va(va_from_ptr(vm->mailbox.recv));
-	recv_pa_end = pa_add(recv_pa_begin, HF_MAILBOX_SIZE);
+	vm_unmap_rxtx(vm_locked, &api_page_pool);
 
-	mm_stage1_locked = mm_lock_stage1();
+	if (!vm_id_is_current_world(owner_vm_id)) {
+		send_pa_begin = pa_from_va(va_from_ptr(vm->mailbox.send));
+		send_pa_end = pa_add(send_pa_begin, HF_MAILBOX_SIZE);
+		recv_pa_begin = pa_from_va(va_from_ptr(vm->mailbox.recv));
+		recv_pa_end = pa_add(recv_pa_begin, HF_MAILBOX_SIZE);
 
-	/* Reset stage 2 mapping only for virtual FF-A instances. */
-	if (vm_id_is_current_world(owner_vm_id)) {
-		/*
-		 * Set the memory region of the buffers back to the default mode
-		 * for the VM. Since this memory region was already mapped for
-		 * the RXTX buffers we can safely remap them.
-		 */
-		CHECK(vm_identity_map(vm_locked, send_pa_begin, send_pa_end,
-				      MM_MODE_R | MM_MODE_W | MM_MODE_X,
-				      &api_page_pool, NULL));
+		mm_stage1_locked = mm_lock_stage1();
 
-		CHECK(vm_identity_map(vm_locked, recv_pa_begin, recv_pa_end,
-				      MM_MODE_R | MM_MODE_W | MM_MODE_X,
-				      &api_page_pool, NULL));
-	} else {
 		ret = arch_other_world_vm_configure_rxtx_unmap(
 			vm_locked, &api_page_pool, send_pa_begin, send_pa_end,
 			recv_pa_begin, recv_pa_end);
 		if (ret.func != FFA_SUCCESS_32) {
+			mm_unlock_stage1(&mm_stage1_locked);
 			goto out;
 		}
+
+		/* Unmap the buffers in the partition manager. */
+		CHECK(mm_unmap(mm_stage1_locked, send_pa_begin, send_pa_end,
+			       &api_page_pool));
+		CHECK(mm_unmap(mm_stage1_locked, recv_pa_begin, recv_pa_end,
+			       &api_page_pool));
+
+		vm->mailbox.send = NULL;
+		vm->mailbox.recv = NULL;
+
+		mm_unlock_stage1(&mm_stage1_locked);
 	}
 
-	/* Unmap the buffers in the partition manager. */
-	CHECK(mm_unmap(mm_stage1_locked, send_pa_begin, send_pa_end,
-		       &api_page_pool));
-	CHECK(mm_unmap(mm_stage1_locked, recv_pa_begin, recv_pa_end,
-		       &api_page_pool));
-
-	vm->mailbox.send = NULL;
-	vm->mailbox.recv = NULL;
 	ffa_vm_nwd_free(vm_locked);
 
 	/* Forward buffer unmapping to SPMC if coming from a VM. */
 	ffa_setup_rxtx_unmap_forward(vm_locked);
 
-	mm_unlock_stage1(&mm_stage1_locked);
-
 out:
 	vm_unlock(&vm_locked);