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.
*/