Merge "docs: update requirements documentation"
diff --git a/tftf/framework/main.c b/tftf/framework/main.c
index 2350b96..f75cb07 100644
--- a/tftf/framework/main.c
+++ b/tftf/framework/main.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2020, Arm Limited. All rights reserved.
+ * Copyright (c) 2018-2022, Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -25,6 +25,8 @@
 #include <tftf_lib.h>
 #include <timer.h>
 
+#define MIN_RETRY_TO_POWER_ON_LEAD_CPU       10
+
 /* version information for TFTF */
 extern const char version_string[];
 
@@ -309,6 +311,7 @@
 static void __dead2 hand_over_to_lead_cpu(void)
 {
 	int ret;
+	unsigned int tftf_cpu_pwr_on_ctr = 0U;
 	unsigned int mpid = read_mpidr_el1() & MPID_MASK;
 	unsigned int core_pos = platform_get_core_pos(mpid);
 
@@ -321,8 +324,24 @@
 	 * doesn't matter because it will be overwritten by prepare_next_test().
 	 * Pass a NULL pointer to easily catch the problem in case something
 	 * goes wrong.
+	 *
+	 * In CI with four world system (Normal, Secure, Root and Realm), on few
+	 * instances, while the framework tries to turn on the CPU for next-test
+	 * it fails to do so and receives error code (-4 : ALREADY_ON).
+	 * This is due to the fact that the lead-cpu is still powering down as
+	 * per EL-3 but invisible to EL-2. Hence retrying it in a loop with a
+	 * small delay in bewteen for certain iterations will resolve it.
 	 */
-	ret = tftf_cpu_on(lead_cpu_mpid, 0, 0);
+	while (tftf_cpu_pwr_on_ctr < MIN_RETRY_TO_POWER_ON_LEAD_CPU) {
+		ret = tftf_cpu_on(lead_cpu_mpid, 0, 0);
+		if (ret == PSCI_E_SUCCESS) {
+			break;
+		} else {
+			tftf_cpu_pwr_on_ctr += 1;
+			waitms(1);
+		}
+	}
+
 	if (ret != PSCI_E_SUCCESS) {
 		ERROR("CPU%u: Failed to power on lead CPU%u (%d)\n",
 			core_pos, platform_get_core_pos(lead_cpu_mpid), ret);