Add test for Errata management firmware interface.

Add test to check the em_cpu_erratum_features for
a multiprocessor system.

Signed-off-by: Sona Mathew <sonarebecca.mathew@arm.com>
Change-Id: Id09fdb837f44fff63c5ca4249accbca046cc06ef
diff --git a/tftf/tests/runtime_services/standard_service/errata_abi/api_tests/test_errata_abi_functionality.c b/tftf/tests/runtime_services/standard_service/errata_abi/api_tests/test_errata_abi_functionality.c
index f60332a..4619b20 100644
--- a/tftf/tests/runtime_services/standard_service/errata_abi/api_tests/test_errata_abi_functionality.c
+++ b/tftf/tests/runtime_services/standard_service/errata_abi/api_tests/test_errata_abi_functionality.c
@@ -7,14 +7,20 @@
 #include <assert.h>
 #include <errno.h>
 #include <stdio.h>
+#include <events.h>
+#include <platform.h>
+#include <power_management.h>
+#include <psci.h>
+#include <smccc.h>
+#include <test_helpers.h>
+#include <tftf_lib.h>
+#include <platform_def.h>
 #include <string.h>
 #include <arch_helpers.h>
 #include <debug.h>
 #include <errata_abi.h>
-#include <platform.h>
-#include <psci.h>
-#include <smccc.h>
-#include <tftf_lib.h>
+
+static event_t cpu_has_entered_test[PLATFORM_CORE_COUNT];
 
 /* Forward flag */
 #define FORWARD_FLAG_EL1	0x00
@@ -377,7 +383,6 @@
 	},
 };
 
-
 /*
  * Test function checks for the em_version implemented
  * - Test fails if the version returned is < 1.0.
@@ -424,22 +429,14 @@
 {
 	test_result_t return_val = TEST_RESULT_FAIL;
 	smc_ret_values ret_val;
-	int32_t version_return = tftf_em_abi_version();
-
-	if (version_return == EM_NOT_SUPPORTED)
-		return TEST_RESULT_SKIPPED;
-
-	if (!(tftf_em_abi_feature_implemented(EM_CPU_ERRATUM_FEATURES)))
-		return TEST_RESULT_FAIL;
 
 	uint32_t midr_val = read_midr();
-
-	INFO("MIDR value = %x\n", midr_val);
-
 	uint16_t rxpx_val_extracted = EXTRACT_REV_VAR(midr_val);
-
 	midr_val = EXTRACT_PARTNO(midr_val);
 
+	u_register_t mpid = read_mpidr_el1() & MPID_MASK;
+	unsigned int core_pos = platform_get_core_pos(mpid);
+
 	INFO("Partnum extracted = %x and rxpx extracted val = %x\n\n", midr_val, \
 							rxpx_val_extracted);
 	switch (midr_val) {
@@ -582,6 +579,7 @@
 		ret_val = tftf_em_abi_cpu_feature_implemented \
 				(cpu_ptr->cpu_errata[i].em_errata_id, \
 				FORWARD_FLAG_EL1);
+
 		switch (ret_val.ret0) {
 
 		case EM_NOT_AFFECTED:
@@ -618,6 +616,47 @@
 		INFO("errata_id = %d and test_em_cpu_erratum_features = %ld\n",\
 			cpu_ptr->cpu_errata[i].em_errata_id, ret_val.ret0);
 	}
-
+	/* Signal to the lead CPU that the calling CPU has entered the test */
+	tftf_send_event(&cpu_has_entered_test[core_pos]);
 	return return_val;
 }
+
+test_result_t test_errata_abi_features(void)
+{
+	unsigned int lead_mpid;
+	unsigned int cpu_mpid, cpu_node, core_pos;
+	int psci_ret;
+
+	int32_t version_return = tftf_em_abi_version();
+
+	SKIP_TEST_IF_LESS_THAN_N_CPUS(1);
+
+	if (version_return == EM_NOT_SUPPORTED) {
+		return TEST_RESULT_SKIPPED;
+	}
+
+	if (!(tftf_em_abi_feature_implemented(EM_CPU_ERRATUM_FEATURES))) {
+		return TEST_RESULT_FAIL;
+	}
+
+	lead_mpid = read_mpidr_el1() & MPID_MASK;
+	/* Power on all CPUs */
+	for_each_cpu(cpu_node) {
+		cpu_mpid = tftf_get_mpidr_from_node(cpu_node);
+
+		/* Skip lead CPU as it is already powered on */
+		if (cpu_mpid == lead_mpid)
+			continue;
+
+		psci_ret = tftf_cpu_on(cpu_mpid, (uintptr_t)test_em_cpu_features, 0);
+		if (psci_ret != PSCI_E_SUCCESS) {
+			tftf_testcase_printf("Failed to power on CPU 0x%x (%d)\n", \
+			cpu_mpid, psci_ret);
+			return TEST_RESULT_FAIL;
+		}
+
+		core_pos = platform_get_core_pos(cpu_mpid);
+		tftf_wait_for_event(&cpu_has_entered_test[core_pos]);
+	}
+	return TEST_RESULT_SUCCESS;
+}
diff --git a/tftf/tests/tests-errata_abi.xml b/tftf/tests/tests-errata_abi.xml
index 3689390..d196475 100644
--- a/tftf/tests/tests-errata_abi.xml
+++ b/tftf/tests/tests-errata_abi.xml
@@ -9,8 +9,7 @@
 <testsuites>
   <testsuite name="EM-ABI" description="Errata ABI Feature Implementation">
      <testcase name="Version" function="test_em_version" />
-     <testcase name="Features" function="test_em_features" />
-     <testcase name="EM_cpu_features" function="test_em_cpu_features" />
+   <testcase name="EM_cpu_features" function="test_errata_abi_features" />
   </testsuite>
 
 </testsuites>