Cactus: FFA_FEATURES test.

Calls FFA_FEATURES API from the secure virtual FF-A instance which is serviced by SPMC.
Expected responses should be edited according to the feature
implementation progress.
Removing obsolete SPRT version check and cactus_tests_misc.c as a
result.

Signed-off-by: Max Shvetsov <maksims.svecovs@arm.com>
Change-Id: I8a2e569a3bce31a735e1af04994984fda2168296
diff --git a/spm/cactus/cactus_ffa_tests.c b/spm/cactus/cactus_ffa_tests.c
index 411cc9f..46813bb 100644
--- a/spm/cactus/cactus_ffa_tests.c
+++ b/spm/cactus/cactus_ffa_tests.c
@@ -4,8 +4,8 @@
  * SPDX-License-Identifier: BSD-3-Clause
  */
 #include <assert.h>
-#include <errno.h>
 #include <debug.h>
+#include <errno.h>
 #include <ffa_helpers.h>
 #include <sp_helpers.h>
 
@@ -13,6 +13,66 @@
 #define FFA_MAJOR 1U
 #define FFA_MINOR 0U
 
+struct feature_test {
+	const char *test_name;
+	unsigned int feature;
+	unsigned int expected_ret;
+};
+
+static const struct feature_test test_target[] = {
+	{"FFA_ERROR_32 check", FFA_ERROR, FFA_SUCCESS_SMC32},
+	{"FFA_SUCCESS_32 check", FFA_SUCCESS_SMC32, FFA_SUCCESS_SMC32},
+	{"FFA_INTERRUPT_32 check", FFA_INTERRUPT, FFA_SUCCESS_SMC32},
+	{"FFA_VERSION_32 check", FFA_VERSION, FFA_SUCCESS_SMC32},
+	{"FFA_FEATURES_32 check", FFA_FEATURES, FFA_SUCCESS_SMC32},
+	{"FFA_RX_RELEASE_32 check", FFA_RX_RELEASE, FFA_SUCCESS_SMC32},
+	{"FFA_RXTX_MAP_32 check", FFA_RXTX_MAP_SMC32, FFA_ERROR},
+	{"FFA_RXTX_MAP_64 check", FFA_RXTX_MAP_SMC64, FFA_SUCCESS_SMC32},
+	{"FFA_RXTX_UNMAP_32 check", FFA_RXTX_UNMAP, FFA_ERROR},
+	{"FFA_PARTITION_INFO_GET_32 check", FFA_PARTITION_INFO_GET, FFA_SUCCESS_SMC32},
+	{"FFA_ID_GET_32 check", FFA_ID_GET, FFA_SUCCESS_SMC32},
+	{"FFA_MSG_POLL_32 check", FFA_MSG_POLL, FFA_SUCCESS_SMC32},
+	{"FFA_MSG_WAIT_32 check", FFA_MSG_WAIT, FFA_SUCCESS_SMC32},
+	{"FFA_YIELD_32 check", FFA_MSG_YIELD, FFA_SUCCESS_SMC32},
+	{"FFA_RUN_32 check", FFA_MSG_RUN, FFA_SUCCESS_SMC32},
+	{"FFA_MSG_SEND_32 check", FFA_MSG_SEND, FFA_SUCCESS_SMC32},
+	{"FFA_MEM_DONATE_32 check", FFA_MEM_DONATE_SMC32, FFA_SUCCESS_SMC32},
+	{"FFA_MEM_LEND_32 check", FFA_MEM_LEND_SMC32, FFA_SUCCESS_SMC32},
+	{"FFA_MEM_SHARE_32 check", FFA_MEM_SHARE_SMC32, FFA_SUCCESS_SMC32},
+	{"FFA_MEM_RETRIEVE_REQ_32 check", FFA_MEM_RETRIEVE_REQ_SMC32, FFA_SUCCESS_SMC32},
+	{"FFA_MEM_RETRIEVE_RESP_32 check", FFA_MEM_RETRIEVE_RESP, FFA_SUCCESS_SMC32},
+	{"FFA_MEM_RELINQUISH_32 check", FFA_MEM_RELINQUISH, FFA_SUCCESS_SMC32},
+	{"FFA_MEM_RECLAIM_32 check", FFA_MEM_RECLAIM, FFA_SUCCESS_SMC32},
+	{"Check non-existent command", 0xFFFF, FFA_ERROR}
+};
+
+/*
+ * Test FFA_FEATURES interface.
+ */
+static void ffa_features_test(void)
+{
+	const char *test_features = "FFA Features interface";
+	smc_ret_values ffa_ret;
+	unsigned int i, test_target_size =
+		sizeof(test_target) / sizeof(struct feature_test);
+
+	announce_test_section_start(test_features);
+
+	for (i = 0U; i < test_target_size; i++) {
+		announce_test_start(test_target[i].test_name);
+
+		ffa_ret = ffa_features(test_target[i].feature);
+		expect(ffa_ret.ret0, test_target[i].expected_ret);
+		if (test_target[i].expected_ret == FFA_ERROR) {
+			expect(ffa_ret.ret2, FFA_ERROR_NOT_SUPPORTED);
+		}
+
+		announce_test_end(test_target[i].test_name);
+	}
+
+	announce_test_section_end(test_features);
+}
+
 void ffa_tests(void)
 {
 	const char *test_ffa = "FFA Interfaces";
@@ -25,8 +85,9 @@
 	smc_ret_values ret = ffa_version(MAKE_FFA_VERSION(FFA_MAJOR, FFA_MINOR));
 	uint32_t spm_version = (uint32_t)(0xFFFFFFFF & ret.ret0);
 
-	bool ffa_version_compatible = ((spm_version >> FFA_VERSION_MAJOR_SHIFT) == FFA_MAJOR &&
-				       (spm_version & FFA_VERSION_MINOR_MASK) >= FFA_MINOR);
+	bool ffa_version_compatible =
+		((spm_version >> FFA_VERSION_MAJOR_SHIFT) == FFA_MAJOR &&
+		 (spm_version & FFA_VERSION_MINOR_MASK) >= FFA_MINOR);
 
 	NOTICE("FFA_VERSION returned %u.%u; Compatible: %i\n",
 		spm_version >> FFA_VERSION_MAJOR_SHIFT,
@@ -37,5 +98,7 @@
 
 	announce_test_end(test_ffa_version);
 
+	ffa_features_test();
+
 	announce_test_section_end(test_ffa);
 }
diff --git a/spm/cactus/cactus_tests_misc.c b/spm/cactus/cactus_tests_misc.c
deleted file mode 100644
index 39eb752..0000000
--- a/spm/cactus/cactus_tests_misc.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2018, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <assert.h>
-#include <debug.h>
-#include <errno.h>
-#include <sp_helpers.h>
-#include <spm_svc.h>
-#include <sprt_client.h>
-#include <sprt_svc.h>
-#include <stdint.h>
-
-#include "cactus.h"
-#include "cactus_tests.h"
-
-/*
- * Miscellaneous SPM tests.
- */
-void misc_tests(void)
-{
-	int32_t ret;
-
-	const char *test_sect_desc = "miscellaneous";
-
-	announce_test_section_start(test_sect_desc);
-
-	const char *test_version_sprt = "SPRT version check";
-
-	announce_test_start(test_version_sprt);
-	ret = sprt_version();
-	INFO("Version = 0x%x (%u.%u)\n", ret,
-	     (ret >> SPRT_VERSION_MAJOR_SHIFT) & SPRT_VERSION_MAJOR_MASK,
-	     ret & SPRT_VERSION_MINOR_MASK);
-	expect(ret, SPRT_VERSION_COMPILED);
-	announce_test_end(test_version_sprt);
-
-	announce_test_section_end(test_sect_desc);
-}
diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_features.c b/tftf/tests/runtime_services/secure_service/test_ffa_features.c
index b8475de..7d67bf8 100644
--- a/tftf/tests/runtime_services/secure_service/test_ffa_features.c
+++ b/tftf/tests/runtime_services/secure_service/test_ffa_features.c
@@ -22,6 +22,7 @@
 	{"FFA_FEATURES_32 check", FFA_FEATURES, FFA_SUCCESS_SMC32},
 	{"FFA_RX_RELEASE_32 check", FFA_RX_RELEASE, FFA_SUCCESS_SMC32},
 	{"FFA_RXTX_MAP_32 check", FFA_RXTX_MAP_SMC32, FFA_ERROR},
+	{"FFA_RXTX_MAP_64 check", FFA_RXTX_MAP_SMC64, FFA_SUCCESS_SMC32},
 	{"FFA_RXTX_UNMAP_32 check", FFA_RXTX_UNMAP, FFA_ERROR},
 	{"FFA_PARTITION_INFO_GET_32 check", FFA_PARTITION_INFO_GET, FFA_SUCCESS_SMC32},
 	{"FFA_ID_GET_32 check", FFA_ID_GET, FFA_SUCCESS_SMC32},
@@ -36,7 +37,8 @@
 	{"FFA_MEM_RETRIEVE_REQ_32 check", FFA_MEM_RETRIEVE_REQ_SMC32, FFA_SUCCESS_SMC32},
 	{"FFA_MEM_RETRIEVE_RESP_32 check", FFA_MEM_RETRIEVE_RESP, FFA_SUCCESS_SMC32},
 	{"FFA_MEM_RELINQUISH_32 check", FFA_MEM_RELINQUISH, FFA_SUCCESS_SMC32},
-	{"FFA_MEM_RECLAIM_32 check", FFA_MEM_RECLAIM, FFA_SUCCESS_SMC32}
+	{"FFA_MEM_RECLAIM_32 check", FFA_MEM_RECLAIM, FFA_SUCCESS_SMC32},
+	{"Check non-existent command", 0xFFFF, FFA_ERROR}
 };
 
 test_result_t test_ffa_features(void)