test(ff-a): ffa_partition_info_get returns correct descriptor

Add test to check that the correct partition information
descriptor is returned according the the version an endpoint
has set itself when calling FFA_VERSION. Also check that v1.1
descriptors constain the uuid as specified in table 13.34
"Partition information descriptor" from FF-A BET0 EAC
Specification.

Signed-off-by: Daniel Boulby <daniel.boulby@arm.com>
Change-Id: Ic1c3d7e7547c938440e729071f5c1fc5ec8c1236
diff --git a/test/vmapi/ffa_secure_partitions/setup_and_discovery.c b/test/vmapi/ffa_secure_partitions/setup_and_discovery.c
index a3ddd0e..a3fbe4a 100644
--- a/test/vmapi/ffa_secure_partitions/setup_and_discovery.c
+++ b/test/vmapi/ffa_secure_partitions/setup_and_discovery.c
@@ -20,6 +20,39 @@
 	EXPECT_FFA_ERROR(ffa_rx_release(), FFA_DENIED);
 }
 
+static void check_v1_1_partition_info_descriptors(
+	const struct ffa_partition_info *partitions)
+{
+	struct ffa_uuid uuid;
+
+	/* Expect the PVM as first partition. */
+	EXPECT_EQ(partitions[0].vm_id, hf_vm_get_id());
+	EXPECT_EQ(partitions[0].vcpu_count, 8);
+	ffa_uuid_init(0xb4b5671e, 0x4a904fe1, 0xb81ffb13, 0xdae1dacb, &uuid);
+	EXPECT_EQ(partitions[0].uuid.uuid[0], uuid.uuid[0]);
+	EXPECT_EQ(partitions[0].uuid.uuid[1], uuid.uuid[1]);
+	EXPECT_EQ(partitions[0].uuid.uuid[2], uuid.uuid[2]);
+	EXPECT_EQ(partitions[0].uuid.uuid[3], uuid.uuid[3]);
+
+	/* Expect a SP as second partition. */
+	EXPECT_EQ(partitions[1].vm_id, SP_ID(1));
+	EXPECT_EQ(partitions[1].vcpu_count, 8);
+	ffa_uuid_init(0xa609f132, 0x6b4f, 0x4c14, 0x9489, &uuid);
+	EXPECT_EQ(partitions[1].uuid.uuid[0], uuid.uuid[0]);
+	EXPECT_EQ(partitions[1].uuid.uuid[1], uuid.uuid[1]);
+	EXPECT_EQ(partitions[1].uuid.uuid[2], uuid.uuid[2]);
+	EXPECT_EQ(partitions[1].uuid.uuid[3], uuid.uuid[3]);
+
+	/* Expect secondary SP as third partition */
+	EXPECT_EQ(partitions[2].vm_id, SP_ID(2));
+	EXPECT_EQ(partitions[2].vcpu_count, 8);
+	ffa_uuid_init(0x9458bb2d, 0x353b4ee2, 0xaa25710c, 0x99b73ddc, &uuid);
+	EXPECT_EQ(partitions[2].uuid.uuid[0], uuid.uuid[0]);
+	EXPECT_EQ(partitions[2].uuid.uuid[1], uuid.uuid[1]);
+	EXPECT_EQ(partitions[2].uuid.uuid[2], uuid.uuid[2]);
+	EXPECT_EQ(partitions[2].uuid.uuid[3], uuid.uuid[3]);
+}
+
 TEST(ffa, ffa_partition_info_get_uuid_null)
 {
 	struct mailbox_buffers mb;
@@ -45,16 +78,7 @@
 	EXPECT_EQ(ret.arg2, 3);
 
 	/* 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, SP_ID(1));
-	EXPECT_EQ(partitions[1].vcpu_count, 8);
-
-	/* Expect secondary SP as third partition */
-	EXPECT_EQ(partitions[2].vm_id, SP_ID(2));
-	EXPECT_EQ(partitions[2].vcpu_count, 8);
+	check_v1_1_partition_info_descriptors(partitions);
 
 	EXPECT_EQ(ffa_rx_release().func, FFA_SUCCESS_32);
 }
@@ -119,6 +143,10 @@
 	/* Expect a secure partition. */
 	EXPECT_EQ(partitions[0].vm_id, HF_SPMC_VM_ID + 1);
 	EXPECT_EQ(partitions[0].vcpu_count, 8);
+	EXPECT_EQ(partitions[0].uuid.uuid[0], uuid.uuid[0]);
+	EXPECT_EQ(partitions[0].uuid.uuid[1], uuid.uuid[1]);
+	EXPECT_EQ(partitions[0].uuid.uuid[2], uuid.uuid[2]);
+	EXPECT_EQ(partitions[0].uuid.uuid[3], uuid.uuid[3]);
 
 	EXPECT_EQ(ffa_rx_release().func, FFA_SUCCESS_32);
 }
@@ -136,6 +164,71 @@
 	EXPECT_EQ(ret.func, FFA_ERROR_32);
 }
 
+TEST(ffa, ffa_partition_info_get_versioned_descriptors)
+{
+	struct mailbox_buffers mb;
+	struct ffa_value ret;
+	const struct ffa_partition_info_v1_0 *partitions_v1_0;
+	const struct ffa_partition_info *partitions_v1_1;
+	struct ffa_uuid uuid;
+	uint32_t version;
+
+	/*
+	 * First call FF-A version to tell the SPMC our version
+	 * is v1.0.
+	 */
+	version = ffa_version(MAKE_FFA_VERSION(1, 0));
+	EXPECT_EQ(version, FFA_VERSION_COMPILED);
+
+	/* Setup the mailbox (which holds the RX buffer). */
+	mb = set_up_mailbox();
+	partitions_v1_0 = 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, 0);
+	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
+
+	/* Expect three partitions. */
+	EXPECT_EQ(ret.arg2, 3);
+
+	/* Expect the PVM as first partition. */
+	EXPECT_EQ(partitions_v1_0[0].vm_id, hf_vm_get_id());
+	EXPECT_EQ(partitions_v1_0[0].vcpu_count, 8);
+
+	/* Expect a SP as second partition. */
+	EXPECT_EQ(partitions_v1_0[1].vm_id, SP_ID(1));
+	EXPECT_EQ(partitions_v1_0[1].vcpu_count, 8);
+
+	/* Expect secondary SP as third partition. */
+	EXPECT_EQ(partitions_v1_0[2].vm_id, SP_ID(2));
+	EXPECT_EQ(partitions_v1_0[2].vcpu_count, 8);
+
+	EXPECT_EQ(ffa_rx_release().func, FFA_SUCCESS_32);
+
+	/* Set version to v1.1 to see if uuid is now returned. */
+	version = ffa_version(MAKE_FFA_VERSION(1, 1));
+	EXPECT_EQ(version, FFA_VERSION_COMPILED);
+
+	partitions_v1_1 = mb.recv;
+
+	/* Check that expected partition information is returned. */
+	ret = ffa_partition_info_get(&uuid, 0);
+	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
+
+	/* Expect three partitions. */
+	EXPECT_EQ(ret.arg2, 3);
+
+	check_v1_1_partition_info_descriptors(partitions_v1_1);
+
+	EXPECT_EQ(ffa_rx_release().func, FFA_SUCCESS_32);
+}
+
 /*
  * Check FFA_SPM_ID_GET response.
  * DEN0077A FF-A v1.1 Beta0 section 13.9 FFA_SPM_ID_GET.
diff --git a/test/vmapi/primary_only/primary_only.c b/test/vmapi/primary_only/primary_only.c
index b1887d1..e18ceea 100644
--- a/test/vmapi/primary_only/primary_only.c
+++ b/test/vmapi/primary_only/primary_only.c
@@ -347,6 +347,22 @@
 	ret = ffa_rx_release();
 	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
 
+	/*
+	 * Set ffa_version to v1.0 and test the correct descriptor is
+	 * returned
+	 */
+	ffa_version(MAKE_FFA_VERSION(1, 0));
+	ret = ffa_partition_info_get(&uuid, 0);
+	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
+	/* There should only be the primary VM in this test. */
+	EXPECT_EQ(ret.arg2, 1);
+	EXPECT_EQ(partitions[0].vm_id, hf_vm_get_id());
+	/* The primary should have at least one vCPU. */
+	EXPECT_GE(partitions[0].vcpu_count, 1);
+
+	ret = ffa_rx_release();
+	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
+
 	/* Try to get partition information for an unrecognized UUID. */
 	ffa_uuid_init(0, 0, 0, 1, &uuid);
 
diff --git a/test/vmapi/primary_with_secondaries/no_services.c b/test/vmapi/primary_with_secondaries/no_services.c
index 700bced..460c3cf 100644
--- a/test/vmapi/primary_with_secondaries/no_services.c
+++ b/test/vmapi/primary_with_secondaries/no_services.c
@@ -97,6 +97,46 @@
 	EXPECT_FFA_ERROR(ret, FFA_INVALID_PARAMETERS);
 }
 
+TEST(ffa_partition_info_get, get_v1_0_descriptor)
+{
+	struct mailbox_buffers mb;
+	struct ffa_value ret;
+	const struct ffa_partition_info_v1_0 *partitions;
+	struct ffa_uuid uuid;
+
+	/* Set ffa_version to v1.0. */
+	ffa_version(MAKE_FFA_VERSION(1, 0));
+
+	/* A Null UUID requests information for all partitions. */
+	ffa_uuid_init(0, 0, 0, 0, &uuid);
+
+	/* Try to get partition information before the RX buffer is setup. */
+	ret = ffa_partition_info_get(&uuid, 0);
+	EXPECT_FFA_ERROR(ret, FFA_BUSY);
+
+	/* Only getting the partition count should succeed however. */
+	ret = ffa_partition_info_get(&uuid, FFA_PARTITION_COUNT_FLAG);
+	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
+
+	/* Setup the mailbox (which holds the RX buffer). */
+	mb = set_up_mailbox();
+	partitions = mb.recv;
+
+	/* Check that the expected partition information is returned. */
+	ret = ffa_partition_info_get(&uuid, 0);
+	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
+	/* Confirm there are 3 secondary VMs as well as this primary VM. */
+	EXPECT_EQ(ret.arg2, 4);
+	EXPECT_EQ(partitions[0].vm_id, hf_vm_get_id());
+
+	/* The first two secondary VMs should have 1 vCPU, the other one 2. */
+	EXPECT_EQ(partitions[1].vcpu_count, 1);
+	EXPECT_EQ(partitions[2].vcpu_count, 1);
+	EXPECT_EQ(partitions[3].vcpu_count, 2);
+
+	EXPECT_EQ(ffa_rx_release().func, FFA_SUCCESS_32);
+}
+
 /**
  * The primary can't be run by the hypervisor.
  */