tidy(ci): organize ffa_secure_partitions test

Made some changes to help with code organization, and promote reuse
as much as possible:
- Split "partition_control.c" into smaller scoped files, per
functionality of test.
- Created "services" folder and moved secure service into it.

Change-Id: I82e3d91ac3a7f68462f7f2c9778834e1a19c1bf1
Signed-off-by: J-Alves <joao.alves@arm.com>
diff --git a/prebuilts b/prebuilts
index 9b5438c..4d08763 160000
--- a/prebuilts
+++ b/prebuilts
@@ -1 +1 @@
-Subproject commit 9b5438cd86a95de67461db9f53d6d1506dcfb0a7
+Subproject commit 4d0876375104e71b97da85567509875aba095a6a
diff --git a/test/vmapi/ffa_secure_partitions/BUILD.gn b/test/vmapi/ffa_secure_partitions/BUILD.gn
index aa609ef..e040c17 100644
--- a/test/vmapi/ffa_secure_partitions/BUILD.gn
+++ b/test/vmapi/ffa_secure_partitions/BUILD.gn
@@ -7,26 +7,15 @@
 import("//build/image/image.gni")
 import("//test/hftest/args.gni")
 
-config("config") {
-  include_dirs = [ "inc" ]
-}
-
-source_set("partition_services") {
-  testonly = true
-  public_configs = [ ":config" ]
-
-  sources = [
-    "partition_services.c",
-  ]
-}
-
 # VM that will control execution of tests in a VM-to-SP set-up
 vm_kernel("vm_primary") {
   testonly = true
-  public_configs = [ ":config" ]
+  public_configs = [ "services:config" ]
 
   sources = [
-    "partition_control.c",
+    "dir_msg.c",
+    "notifications.c",
+    "setup_and_discovery.c",
   ]
 
   deps = [
@@ -39,14 +28,12 @@
 # former SP
 vm_kernel("secure_partitions_services") {
   testonly = true
-  public_configs = [ ":config" ]
-
-  sources = [
-    "secure_partition_services.c",
-  ]
+  public_configs = [ "services:config" ]
 
   deps = [
-    ":partition_services",
+    "services:message_loop",
+    "services:notifications",
+    "services:partition_services",
     "//test/hftest:hftest_secure_service",
   ]
 }
diff --git a/test/vmapi/ffa_secure_partitions/dir_msg.c b/test/vmapi/ffa_secure_partitions/dir_msg.c
new file mode 100644
index 0000000..2934f48
--- /dev/null
+++ b/test/vmapi/ffa_secure_partitions/dir_msg.c
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2021 The Hafnium Authors.
+ *
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file or at
+ * https://opensource.org/licenses/BSD-3-Clause.
+ */
+
+#include "hf/dlog.h"
+#include "hf/ffa.h"
+
+#include "vmapi/hf/call.h"
+
+#include "partition_services.h"
+#include "test/hftest.h"
+#include "test/vmapi/ffa.h"
+
+/**
+ * Communicates with partition via direct messaging to validate functioning of
+ * direct request/response interfaces.
+ */
+TEST(ffa_msg_send_direct_req, succeeds_nwd_to_sp_echo)
+{
+	const uint32_t msg[] = {0x22223333, 0x44445555, 0x66667777, 0x88889999};
+	const ffa_vm_id_t receiver_id = HF_OTHER_WORLD_ID + 1;
+	struct ffa_value res;
+	ffa_vm_id_t own_id = hf_vm_get_id();
+
+	res = sp_echo_cmd_send(own_id, receiver_id, msg[0], msg[1], msg[2],
+			       msg[3]);
+
+	EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
+
+	EXPECT_EQ(res.arg4, msg[0]);
+	EXPECT_EQ(res.arg5, msg[1]);
+	EXPECT_EQ(res.arg6, msg[2]);
+	EXPECT_EQ(res.arg7, msg[3]);
+}
diff --git a/test/vmapi/ffa_secure_partitions/notifications.c b/test/vmapi/ffa_secure_partitions/notifications.c
new file mode 100644
index 0000000..c36fe88
--- /dev/null
+++ b/test/vmapi/ffa_secure_partitions/notifications.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2021 The Hafnium Authors.
+ *
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file or at
+ * https://opensource.org/licenses/BSD-3-Clause.
+ */
+
+#include "hf/dlog.h"
+#include "hf/ffa.h"
+
+#include "vmapi/hf/call.h"
+
+#include "partition_services.h"
+#include "test/hftest.h"
+#include "test/vmapi/ffa.h"
+
+/**
+ * Test to validate notifications signaling from an SP to a VM.
+ */
+TEST(ffa_notifications, signaling_from_sp_to_vm)
+{
+	struct ffa_value res;
+	ffa_vm_id_t own_id = hf_vm_get_id();
+	const ffa_vm_id_t notification_sender = HF_OTHER_WORLD_ID + 1;
+	const ffa_notifications_bitmap_t bitmap = FFA_NOTIFICATION_MASK(20);
+
+	/* Arbitrarily bind notification 20 */
+	res = ffa_notification_bind(notification_sender, own_id, 0, bitmap);
+	EXPECT_EQ(res.func, FFA_SUCCESS_32);
+
+	/* Requesting sender to set notification. */
+	res = sp_notif_set_cmd_send(own_id, notification_sender, own_id,
+				    FFA_NOTIFICATIONS_FLAG_DELAY_SRI, bitmap);
+
+	EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
+	EXPECT_EQ(sp_resp(res), SP_SUCCESS);
+
+	/* Retrieve FF-A endpoints with pending notifications. */
+	res = ffa_notification_info_get();
+	EXPECT_EQ(res.func, FFA_SUCCESS_64);
+
+	/* Retrieving pending notification */
+	res = ffa_notification_get(own_id, 0, FFA_NOTIFICATION_FLAG_BITMAP_SP);
+	EXPECT_EQ(res.func, FFA_SUCCESS_32);
+
+	EXPECT_EQ(ffa_notification_get_from_sp(res), bitmap);
+	EXPECT_EQ(res.arg4, 0);
+	EXPECT_EQ(res.arg5, 0);
+	EXPECT_EQ(res.arg6, 0);
+	EXPECT_EQ(res.arg7, 0);
+
+	res = ffa_notification_unbind(notification_sender, own_id, bitmap);
+	EXPECT_EQ(res.func, FFA_SUCCESS_32);
+}
+
+/**
+ * Validate notifications signaling from VM to an SP.
+ */
+TEST(ffa_notifications, signaling_from_vm_to_sp)
+{
+	struct ffa_value res;
+	ffa_vm_id_t own_id = hf_vm_get_id();
+	const ffa_vm_id_t notification_receiver = HF_OTHER_WORLD_ID + 1;
+	const ffa_notifications_bitmap_t bitmap = FFA_NOTIFICATION_MASK(35);
+
+	/* Request receiver to bind notifications. */
+	res = sp_notif_bind_cmd_send(own_id, notification_receiver, own_id, 0,
+				     bitmap);
+	EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
+	EXPECT_EQ(sp_resp(res), SP_SUCCESS);
+
+	res = ffa_notification_set(own_id, notification_receiver,
+				   FFA_NOTIFICATIONS_FLAG_DELAY_SRI, bitmap);
+	EXPECT_EQ(res.func, FFA_SUCCESS_32);
+
+	res = ffa_notification_info_get();
+	EXPECT_EQ(res.func, FFA_SUCCESS_64);
+
+	/* Request to get notifications pending */
+	res = sp_notif_get_cmd_send(own_id, notification_receiver, 0,
+				    FFA_NOTIFICATION_FLAG_BITMAP_VM);
+
+	EXPECT_EQ(sp_resp(res), SP_SUCCESS);
+	EXPECT_EQ(sp_notif_get_from_sp(res), 0);
+	EXPECT_EQ(sp_notif_get_from_vm(res), bitmap);
+
+	/* Request to unbind notifications */
+	res = sp_notif_unbind_cmd_send(own_id, notification_receiver, own_id,
+				       bitmap);
+	EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
+	EXPECT_EQ(sp_resp(res), SP_SUCCESS);
+}
diff --git a/test/vmapi/ffa_secure_partitions/partition_control.c b/test/vmapi/ffa_secure_partitions/partition_control.c
deleted file mode 100644
index 2bf032a..0000000
--- a/test/vmapi/ffa_secure_partitions/partition_control.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright 2021 The Hafnium Authors.
- *
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file or at
- * https://opensource.org/licenses/BSD-3-Clause.
- */
-
-#include "hf/dlog.h"
-#include "hf/ffa.h"
-
-#include "vmapi/hf/call.h"
-
-#include "partition_services.h"
-#include "test/hftest.h"
-#include "test/vmapi/ffa.h"
-
-TEAR_DOWN(ffa)
-{
-	EXPECT_FFA_ERROR(ffa_rx_release(), FFA_DENIED);
-}
-
-/**
- * Communicates with partition via direct messaging to validate functioning of
- * direct message interfaces.
- */
-TEST(ffa_msg_send_direct_req, succeeds_nwd_to_sp_echo)
-{
-	const uint32_t msg[] = {0x22223333, 0x44445555, 0x66667777, 0x88889999};
-	const ffa_vm_id_t receiver_id = HF_OTHER_WORLD_ID + 1;
-	struct ffa_value res;
-	ffa_vm_id_t own_id = hf_vm_get_id();
-
-	res = sp_echo_cmd_send(own_id, receiver_id, msg[0], msg[1], msg[2],
-			       msg[3]);
-
-	EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
-
-	EXPECT_EQ(res.arg4, msg[0]);
-	EXPECT_EQ(res.arg5, msg[1]);
-	EXPECT_EQ(res.arg6, msg[2]);
-	EXPECT_EQ(res.arg7, msg[3]);
-}
-
-/**
- * Test to validate notifications signaling from an SP to a VM.
- */
-TEST(ffa_notifications, signaling_from_sp_to_vm)
-{
-	struct ffa_value res;
-	ffa_vm_id_t own_id = hf_vm_get_id();
-	const ffa_vm_id_t notification_sender = HF_OTHER_WORLD_ID + 1;
-	const ffa_notifications_bitmap_t bitmap = FFA_NOTIFICATION_MASK(20);
-
-	/* Arbitrarily bind notification 20 */
-	res = ffa_notification_bind(notification_sender, own_id, 0, bitmap);
-	EXPECT_EQ(res.func, FFA_SUCCESS_32);
-
-	/* Requesting sender to set notification. */
-	res = sp_notif_set_cmd_send(own_id, notification_sender, own_id,
-				    FFA_NOTIFICATIONS_FLAG_DELAY_SRI, bitmap);
-
-	EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
-	EXPECT_EQ(sp_resp(res), SP_SUCCESS);
-
-	/* Retrieve FF-A endpoints with pending notifications. */
-	res = ffa_notification_info_get();
-	EXPECT_EQ(res.func, FFA_SUCCESS_64);
-
-	/* Retrieving pending notification */
-	res = ffa_notification_get(own_id, 0, FFA_NOTIFICATION_FLAG_BITMAP_SP);
-	EXPECT_EQ(res.func, FFA_SUCCESS_32);
-
-	EXPECT_EQ(ffa_notification_get_from_sp(res), bitmap);
-	EXPECT_EQ(res.arg4, 0);
-	EXPECT_EQ(res.arg5, 0);
-	EXPECT_EQ(res.arg6, 0);
-	EXPECT_EQ(res.arg7, 0);
-
-	res = ffa_notification_unbind(notification_sender, own_id, bitmap);
-	EXPECT_EQ(res.func, FFA_SUCCESS_32);
-}
-
-/**
- * Validate notifications signaling from VM to an SP.
- */
-TEST(ffa_notifications, signaling_from_vm_to_sp)
-{
-	struct ffa_value res;
-	ffa_vm_id_t own_id = hf_vm_get_id();
-	const ffa_vm_id_t notification_receiver = HF_OTHER_WORLD_ID + 1;
-	const ffa_notifications_bitmap_t bitmap = FFA_NOTIFICATION_MASK(35);
-
-	/* Request receiver to bind notifications. */
-	res = sp_notif_bind_cmd_send(own_id, notification_receiver, own_id, 0,
-				     bitmap);
-	EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
-	EXPECT_EQ(sp_resp(res), SP_SUCCESS);
-
-	res = ffa_notification_set(own_id, notification_receiver,
-				   FFA_NOTIFICATIONS_FLAG_DELAY_SRI, bitmap);
-	EXPECT_EQ(res.func, FFA_SUCCESS_32);
-
-	res = ffa_notification_info_get();
-	EXPECT_EQ(res.func, FFA_SUCCESS_64);
-
-	/* Request to get notifications pending */
-	res = sp_notif_get_cmd_send(own_id, notification_receiver, 0,
-				    FFA_NOTIFICATION_FLAG_BITMAP_VM);
-
-	EXPECT_EQ(sp_resp(res), SP_SUCCESS);
-	EXPECT_EQ(sp_notif_get_from_sp(res), 0);
-	EXPECT_EQ(sp_notif_get_from_vm(res), bitmap);
-
-	/* Request to unbind notifications */
-	res = sp_notif_unbind_cmd_send(own_id, notification_receiver, own_id,
-				       bitmap);
-	EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
-	EXPECT_EQ(sp_resp(res), SP_SUCCESS);
-}
-
-TEST(ffa, ffa_partition_info_get_uuid_null)
-{
-	struct mailbox_buffers mb;
-	struct ffa_value ret;
-	const struct ffa_partition_info *partitions;
-	struct ffa_uuid uuid;
-
-	/* Setup the mailbox (which holds the RX buffer). */
-	mb = set_up_mailbox();
-	partitions = mb.recv;
-
-	/*
-	 * A Null UUID requests information for all partitions
-	 * including VMs and SPs.
-	 */
-	ffa_uuid_init(0, 0, 0, 0, &uuid);
-
-	/* Check that expected partition information is returned. */
-	ret = ffa_partition_info_get(&uuid);
-	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
-
-	/* Expect two partitions. */
-	EXPECT_EQ(ret.arg2, 2);
-
-	/* Expect the PVM as first partition. */
-	EXPECT_EQ(partitions[0].vm_id, hf_vm_get_id());
-	EXPECT_EQ(partitions[0].vcpu_count, 8);
-
-	/* Expect a SP as second partition. */
-	EXPECT_EQ(partitions[1].vm_id, HF_SPMC_VM_ID + 1);
-	EXPECT_EQ(partitions[1].vcpu_count, 8);
-
-	EXPECT_EQ(ffa_rx_release().func, FFA_SUCCESS_32);
-}
-
-TEST(ffa, ffa_partition_info_get_uuid_fixed)
-{
-	struct mailbox_buffers mb;
-	struct ffa_value ret;
-	const struct ffa_partition_info *partitions;
-	struct ffa_uuid uuid;
-
-	/* Setup the mailbox (which holds the RX buffer). */
-	mb = set_up_mailbox();
-	partitions = mb.recv;
-
-	/* Search for a known secure partition UUID. */
-	ffa_uuid_init(0xa609f132, 0x6b4f, 0x4c14, 0x9489, &uuid);
-
-	/* Check that the expected partition information is returned. */
-	ret = ffa_partition_info_get(&uuid);
-	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
-
-	/* Expect one partition. */
-	EXPECT_EQ(ret.arg2, 1);
-
-	/* Expect a secure partition. */
-	EXPECT_EQ(partitions[0].vm_id, HF_SPMC_VM_ID + 1);
-	EXPECT_EQ(partitions[0].vcpu_count, 8);
-
-	EXPECT_EQ(ffa_rx_release().func, FFA_SUCCESS_32);
-}
-
-TEST(ffa, ffa_partition_info_get_uuid_unknown)
-{
-	struct ffa_value ret;
-	struct ffa_uuid uuid;
-
-	/* Search for a unknown partition UUID. */
-	ffa_uuid_init(1, 1, 1, 1, &uuid);
-
-	/* Expect no partition is found with such UUID. */
-	ret = ffa_partition_info_get(&uuid);
-	EXPECT_EQ(ret.func, FFA_ERROR_32);
-}
-
-/*
- * Check FFA_SPM_ID_GET response.
- * DEN0077A FF-A v1.1 Beta0 section 13.9 FFA_SPM_ID_GET.
- */
-TEST(ffa, ffa_spm_id_get)
-{
-	struct ffa_value ret = ffa_spm_id_get();
-
-	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
-
-	/* Expect the SPMC FF-A ID at NS virtual FF-A instance. */
-	EXPECT_EQ(ret.arg2, HF_SPMC_VM_ID);
-}
diff --git a/test/vmapi/ffa_secure_partitions/services/BUILD.gn b/test/vmapi/ffa_secure_partitions/services/BUILD.gn
new file mode 100644
index 0000000..182bf4c
--- /dev/null
+++ b/test/vmapi/ffa_secure_partitions/services/BUILD.gn
@@ -0,0 +1,52 @@
+# Copyright 2021 The Hafnium Authors.
+#
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file or at
+# https://opensource.org/licenses/BSD-3-Clause.
+
+config("config") {
+  include_dirs = [ "inc" ]
+}
+
+source_set("common") {
+  testonly = true
+  public_configs = [ ":config" ]
+  sources = [
+    "common.c",
+  ]
+}
+
+source_set("partition_services") {
+  testonly = true
+  public_configs = [ ":config" ]
+  sources = [
+    "partition_services.c",
+  ]
+
+  deps = [
+    ":common",
+  ]
+}
+
+source_set("notifications") {
+  testonly = true
+  public_configs = [ ":config" ]
+  sources = [
+    "notifications.c",
+  ]
+
+  deps = [
+    ":common",
+  ]
+}
+
+source_set("message_loop") {
+  testonly = true
+  public_configs = [
+    ":config",
+    "//test/hftest:hftest_config",
+  ]
+  sources = [
+    "message_loop.c",
+  ]
+}
diff --git a/test/vmapi/ffa_secure_partitions/services/common.c b/test/vmapi/ffa_secure_partitions/services/common.c
new file mode 100644
index 0000000..bf47a9a
--- /dev/null
+++ b/test/vmapi/ffa_secure_partitions/services/common.c
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2021 The Hafnium Authors.
+ *
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file or at
+ * https://opensource.org/licenses/BSD-3-Clause.
+ */
+
+#include "hf/dlog.h"
+
+#include "vmapi/hf/call.h"
+
+#include "partition_services.h"
+
+struct ffa_value sp_check_ffa_return_resp(ffa_vm_id_t test_source,
+					  ffa_vm_id_t own_id,
+					  struct ffa_value res)
+{
+	if (res.func == FFA_ERROR_32) {
+		dlog_error("FF-A error returned %x\n", ffa_error_code(res));
+		return sp_error(own_id, test_source, ffa_error_code(res));
+	}
+
+	return sp_success(own_id, test_source);
+}
diff --git a/test/vmapi/ffa_secure_partitions/inc/partition_services.h b/test/vmapi/ffa_secure_partitions/services/inc/partition_services.h
similarity index 97%
rename from test/vmapi/ffa_secure_partitions/inc/partition_services.h
rename to test/vmapi/ffa_secure_partitions/services/inc/partition_services.h
index 65ce81b..b89af84 100644
--- a/test/vmapi/ffa_secure_partitions/inc/partition_services.h
+++ b/test/vmapi/ffa_secure_partitions/services/inc/partition_services.h
@@ -168,3 +168,7 @@
 struct ffa_value sp_notif_unbind_cmd(ffa_vm_id_t test_source,
 				     ffa_vm_id_t notif_sender,
 				     ffa_notifications_bitmap_t bitmap);
+
+struct ffa_value sp_check_ffa_return_resp(ffa_vm_id_t test_source,
+					  ffa_vm_id_t own_id,
+					  struct ffa_value res);
diff --git a/test/vmapi/ffa_secure_partitions/secure_partition_services.c b/test/vmapi/ffa_secure_partitions/services/message_loop.c
similarity index 100%
rename from test/vmapi/ffa_secure_partitions/secure_partition_services.c
rename to test/vmapi/ffa_secure_partitions/services/message_loop.c
diff --git a/test/vmapi/ffa_secure_partitions/partition_services.c b/test/vmapi/ffa_secure_partitions/services/notifications.c
similarity index 75%
rename from test/vmapi/ffa_secure_partitions/partition_services.c
rename to test/vmapi/ffa_secure_partitions/services/notifications.c
index 2f7fd21..5ceb252 100644
--- a/test/vmapi/ffa_secure_partitions/partition_services.c
+++ b/test/vmapi/ffa_secure_partitions/services/notifications.c
@@ -6,31 +6,11 @@
  * https://opensource.org/licenses/BSD-3-Clause.
  */
 
-#include "partition_services.h"
-
 #include "hf/dlog.h"
 
 #include "vmapi/hf/call.h"
 
-static struct ffa_value sp_check_ffa_return_resp(ffa_vm_id_t test_source,
-						 ffa_vm_id_t own_id,
-						 struct ffa_value res)
-{
-	if (res.func == FFA_ERROR_32) {
-		dlog_error("FF-A error returned %x", ffa_error_code(res));
-		return sp_error(own_id, test_source, ffa_error_code(res));
-	}
-
-	return sp_success(own_id, test_source);
-}
-
-struct ffa_value sp_echo_cmd(ffa_vm_id_t receiver, uint32_t val1, uint32_t val2,
-			     uint32_t val3, uint32_t val4, uint32_t val5)
-{
-	ffa_vm_id_t own_id = hf_vm_get_id();
-	return ffa_msg_send_direct_resp(own_id, receiver, val1, val2, val3,
-					val4, val5);
-}
+#include "partition_services.h"
 
 struct ffa_value sp_notif_set_cmd(ffa_vm_id_t test_source,
 				  ffa_vm_id_t notif_receiver, uint32_t flags,
diff --git a/test/vmapi/ffa_secure_partitions/services/partition_services.c b/test/vmapi/ffa_secure_partitions/services/partition_services.c
new file mode 100644
index 0000000..6f40fbb
--- /dev/null
+++ b/test/vmapi/ffa_secure_partitions/services/partition_services.c
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2021 The Hafnium Authors.
+ *
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file or at
+ * https://opensource.org/licenses/BSD-3-Clause.
+ */
+
+#include "partition_services.h"
+
+#include "hf/dlog.h"
+
+#include "vmapi/hf/call.h"
+
+struct ffa_value sp_echo_cmd(ffa_vm_id_t receiver, uint32_t val1, uint32_t val2,
+			     uint32_t val3, uint32_t val4, uint32_t val5)
+{
+	ffa_vm_id_t own_id = hf_vm_get_id();
+	return ffa_msg_send_direct_resp(own_id, receiver, val1, val2, val3,
+					val4, val5);
+}
diff --git a/test/vmapi/ffa_secure_partitions/setup_and_discovery.c b/test/vmapi/ffa_secure_partitions/setup_and_discovery.c
new file mode 100644
index 0000000..6617865
--- /dev/null
+++ b/test/vmapi/ffa_secure_partitions/setup_and_discovery.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2021 The Hafnium Authors.
+ *
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file or at
+ * https://opensource.org/licenses/BSD-3-Clause.
+ */
+
+#include "hf/dlog.h"
+#include "hf/ffa.h"
+
+#include "vmapi/hf/call.h"
+
+#include "partition_services.h"
+#include "test/hftest.h"
+#include "test/vmapi/ffa.h"
+
+TEAR_DOWN(ffa)
+{
+	EXPECT_FFA_ERROR(ffa_rx_release(), FFA_DENIED);
+}
+
+TEST(ffa, ffa_partition_info_get_uuid_null)
+{
+	struct mailbox_buffers mb;
+	struct ffa_value ret;
+	const struct ffa_partition_info *partitions;
+	struct ffa_uuid uuid;
+
+	/* Setup the mailbox (which holds the RX buffer). */
+	mb = set_up_mailbox();
+	partitions = mb.recv;
+
+	/*
+	 * A Null UUID requests information for all partitions
+	 * including VMs and SPs.
+	 */
+	ffa_uuid_init(0, 0, 0, 0, &uuid);
+
+	/* Check that expected partition information is returned. */
+	ret = ffa_partition_info_get(&uuid);
+	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
+
+	/* Expect two partitions. */
+	EXPECT_EQ(ret.arg2, 2);
+
+	/* Expect the PVM as first partition. */
+	EXPECT_EQ(partitions[0].vm_id, hf_vm_get_id());
+	EXPECT_EQ(partitions[0].vcpu_count, 8);
+
+	/* Expect a SP as second partition. */
+	EXPECT_EQ(partitions[1].vm_id, HF_SPMC_VM_ID + 1);
+	EXPECT_EQ(partitions[1].vcpu_count, 8);
+
+	EXPECT_EQ(ffa_rx_release().func, FFA_SUCCESS_32);
+}
+
+TEST(ffa, ffa_partition_info_get_uuid_fixed)
+{
+	struct mailbox_buffers mb;
+	struct ffa_value ret;
+	const struct ffa_partition_info *partitions;
+	struct ffa_uuid uuid;
+
+	/* Setup the mailbox (which holds the RX buffer). */
+	mb = set_up_mailbox();
+	partitions = mb.recv;
+
+	/* Search for a known secure partition UUID. */
+	ffa_uuid_init(0xa609f132, 0x6b4f, 0x4c14, 0x9489, &uuid);
+
+	/* Check that the expected partition information is returned. */
+	ret = ffa_partition_info_get(&uuid);
+	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
+
+	/* Expect one partition. */
+	EXPECT_EQ(ret.arg2, 1);
+
+	/* Expect a secure partition. */
+	EXPECT_EQ(partitions[0].vm_id, HF_SPMC_VM_ID + 1);
+	EXPECT_EQ(partitions[0].vcpu_count, 8);
+
+	EXPECT_EQ(ffa_rx_release().func, FFA_SUCCESS_32);
+}
+
+TEST(ffa, ffa_partition_info_get_uuid_unknown)
+{
+	struct ffa_value ret;
+	struct ffa_uuid uuid;
+
+	/* Search for a unknown partition UUID. */
+	ffa_uuid_init(1, 1, 1, 1, &uuid);
+
+	/* Expect no partition is found with such UUID. */
+	ret = ffa_partition_info_get(&uuid);
+	EXPECT_EQ(ret.func, FFA_ERROR_32);
+}
+
+/*
+ * Check FFA_SPM_ID_GET response.
+ * DEN0077A FF-A v1.1 Beta0 section 13.9 FFA_SPM_ID_GET.
+ */
+TEST(ffa, ffa_spm_id_get)
+{
+	struct ffa_value ret = ffa_spm_id_get();
+
+	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
+
+	/* Expect the SPMC FF-A ID at NS virtual FF-A instance. */
+	EXPECT_EQ(ret.arg2, HF_SPMC_VM_ID);
+}