test(ff-a): check execution state property of partitions

FF-A Version 1.1 adds several additional flags to
the properties field of the partition information
descriptors. Test that execution state flag is set
when FF-A v1.1 is specified and zero when FF-A v1.0
descriptors are being used.

Currently only 64-bit execution state is supported for
FF-A compliant partitions.

Signed-off-by: Kathleen Capella <kathleen.capella@arm.com>
Change-Id: Ice1b9a5a417e89cb26dd642be49348e8bfa282b9
diff --git a/include/runtime_services/ffa_helpers.h b/include/runtime_services/ffa_helpers.h
index 1635bf8..3da5c18 100644
--- a/include/runtime_services/ffa_helpers.h
+++ b/include/runtime_services/ffa_helpers.h
@@ -133,21 +133,21 @@
 #define FFA_FEATURE_MEI 0x3U
 
 /** Partition property: partition supports receipt of direct requests. */
-#define FFA_PARTITION_DIRECT_REQ_RECV 0x1
+#define FFA_PARTITION_DIRECT_REQ_RECV (UINT32_C(1) << 0)
 
 /** Partition property: partition can send direct requests. */
-#define FFA_PARTITION_DIRECT_REQ_SEND 0x2
+#define FFA_PARTITION_DIRECT_REQ_SEND (UINT32_C(1) << 1)
 
 /** Partition property: partition can send and receive indirect messages. */
-#define FFA_PARTITION_INDIRECT_MSG 0x4
+#define FFA_PARTITION_INDIRECT_MSG (UINT32_C(1) << 2)
 
 /** Partition property: partition can receive notifications. */
-#define FFA_PARTITION_NOTIFICATION 0x8
+#define FFA_PARTITION_NOTIFICATION (UINT32_C(1) << 3)
 
-/**
- * Partition info descriptor as defined in Table 13.34 of the v1.1 BETA0
- * FF-A Specification
- */
+/** Partition property: partition runs in the AArch64 execution state. */
+#define FFA_PARTITION_AARCH64_EXEC (UINT32_C(1) << 8)
+
+/** Partition info descriptor as defined in FF-A v1.1 EAC0 Table 13.37 */
 struct ffa_partition_info {
 	/** The ID of the VM the information is about */
 	ffa_id_t id;
@@ -160,8 +160,15 @@
 };
 
 /**
+ * Bits[31:3] of partition properties must be zero for FF-A v1.0.
+ * This corresponds to table 8.25 "Partition information descriptor"
+ * in DEN0077A FF-A 1.0 REL specification.
+ */
+#define FFA_PARTITION_v1_0_RES_MASK (~(UINT32_C(0x7)))
+
+/**
  * Partition info descriptor as defined in Table 8.25 of the v1.0
- * FF-A Specification
+ * FF-A Specification (DEN0077A).
  */
 struct ffa_partition_info_v1_0 {
 	/** The ID of the VM the information is about */
diff --git a/spm/common/sp_tests/sp_test_ffa.c b/spm/common/sp_tests/sp_test_ffa.c
index dd98459..80211a8 100644
--- a/spm/common/sp_tests/sp_test_ffa.c
+++ b/spm/common/sp_tests/sp_test_ffa.c
@@ -30,7 +30,8 @@
 	{
 		.id = SP_ID(1),
 		.exec_context = PRIMARY_EXEC_CTX_COUNT,
-		.properties = (FFA_PARTITION_DIRECT_REQ_RECV |
+		.properties = (FFA_PARTITION_AARCH64_EXEC |
+			       FFA_PARTITION_DIRECT_REQ_RECV |
 			       FFA_PARTITION_DIRECT_REQ_SEND |
 			       FFA_PARTITION_NOTIFICATION),
 		.uuid = sp_uuids[0]
@@ -39,7 +40,8 @@
 	{
 		.id = SP_ID(2),
 		.exec_context = SECONDARY_EXEC_CTX_COUNT,
-		.properties = (FFA_PARTITION_DIRECT_REQ_RECV |
+		.properties = (FFA_PARTITION_AARCH64_EXEC |
+			       FFA_PARTITION_DIRECT_REQ_RECV |
 			       FFA_PARTITION_DIRECT_REQ_SEND |
 			       FFA_PARTITION_NOTIFICATION),
 		.uuid = sp_uuids[1]
@@ -48,7 +50,8 @@
 	{
 		.id = SP_ID(3),
 		.exec_context = TERTIARY_EXEC_CTX_COUNT,
-		.properties = (FFA_PARTITION_DIRECT_REQ_RECV |
+		.properties = (FFA_PARTITION_AARCH64_EXEC |
+			       FFA_PARTITION_DIRECT_REQ_RECV |
 			       FFA_PARTITION_DIRECT_REQ_SEND |
 			       FFA_PARTITION_NOTIFICATION),
 		.uuid = sp_uuids[2]
@@ -57,7 +60,8 @@
 	{
 		.id = SP_ID(4),
 		.exec_context = IVY_EXEC_CTX_COUNT,
-		.properties = (FFA_PARTITION_DIRECT_REQ_RECV |
+		.properties = (FFA_PARTITION_AARCH64_EXEC |
+			       FFA_PARTITION_DIRECT_REQ_RECV |
 			       FFA_PARTITION_DIRECT_REQ_SEND),
 		.uuid = sp_uuids[3]
 	}
diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c b/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
index b80f9c4..1300f70 100644
--- a/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
+++ b/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
@@ -27,7 +27,8 @@
 	{
 		.id = SP_ID(1),
 		.exec_context = PRIMARY_EXEC_CTX_COUNT,
-		.properties = FFA_PARTITION_DIRECT_REQ_RECV |
+		.properties = FFA_PARTITION_AARCH64_EXEC |
+			      FFA_PARTITION_DIRECT_REQ_RECV |
 			      FFA_PARTITION_NOTIFICATION,
 		.uuid = sp_uuids[0]
 	},
@@ -35,7 +36,8 @@
 	{
 		.id = SP_ID(2),
 		.exec_context = SECONDARY_EXEC_CTX_COUNT,
-		.properties = FFA_PARTITION_DIRECT_REQ_RECV |
+		.properties = FFA_PARTITION_AARCH64_EXEC |
+			      FFA_PARTITION_DIRECT_REQ_RECV |
 			      FFA_PARTITION_NOTIFICATION,
 		.uuid = sp_uuids[1]
 	},
@@ -43,7 +45,8 @@
 	{
 		.id = SP_ID(3),
 		.exec_context = TERTIARY_EXEC_CTX_COUNT,
-		.properties = FFA_PARTITION_DIRECT_REQ_RECV |
+		.properties = FFA_PARTITION_AARCH64_EXEC |
+			      FFA_PARTITION_DIRECT_REQ_RECV |
 			      FFA_PARTITION_NOTIFICATION,
 		.uuid = sp_uuids[2]
 	},
@@ -51,7 +54,8 @@
 	{
 		.id = SP_ID(4),
 		.exec_context = IVY_EXEC_CTX_COUNT,
-		.properties = FFA_PARTITION_DIRECT_REQ_RECV,
+		.properties = FFA_PARTITION_AARCH64_EXEC |
+			      FFA_PARTITION_DIRECT_REQ_RECV,
 		.uuid = sp_uuids[3]
 	}
 };
@@ -399,6 +403,10 @@
 			(const struct ffa_partition_info_v1_0 *)(mb.recv);
 
 		for (unsigned int i = 0U; i < expected_size; i++) {
+			uint32_t expected_properties_v1_0 =
+				ffa_expected_partition_info[i].properties &
+				~FFA_PARTITION_v1_0_RES_MASK;
+
 			if (info[i].id != ffa_expected_partition_info[i].id) {
 				ERROR("Wrong ID. Expected %x, got %x\n",
 				      ffa_expected_partition_info[i].id,
@@ -413,9 +421,9 @@
 				result = TEST_RESULT_FAIL;
 			}
 			if (info[i].properties !=
-			    ffa_expected_partition_info[i].properties) {
+			    expected_properties_v1_0) {
 				ERROR("Wrong properties. Expected %d, got %d\n",
-				      ffa_expected_partition_info[i].properties,
+				      expected_properties_v1_0,
 				      info[i].properties);
 				result = TEST_RESULT_FAIL;
 			}