Merge "test(realm): Fix Realm tests marking all memory as RAM"
diff --git a/include/runtime_services/errata_abi.h b/include/runtime_services/errata_abi.h
index dc50113..78c739f 100644
--- a/include/runtime_services/errata_abi.h
+++ b/include/runtime_services/errata_abi.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Arm Limited. All rights reserved.
+ * Copyright (c) 2025, Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -49,6 +49,7 @@
 	int em_errata_id;
 	unsigned int rxpx_low;
 	unsigned int rxpx_high;
+	unsigned int split_wa;
 } em_cpu_errata_t;
 
 typedef struct em_cpu{
diff --git a/include/runtime_services/host_realm_managment/host_realm_helper.h b/include/runtime_services/host_realm_managment/host_realm_helper.h
index e27cfd5..af8f834 100644
--- a/include/runtime_services/host_realm_managment/host_realm_helper.h
+++ b/include/runtime_services/host_realm_managment/host_realm_helper.h
@@ -61,8 +61,29 @@
  * This functions sets the shared data args needed for entering aux plane,
  * using REALM_ENTER_PLANE_N_CMD
  */
-void host_realm_set_aux_plane_args(struct realm *realm_ptr, unsigned int plane_num);
+void host_realm_set_aux_plane_args(struct realm *realm_ptr,
+		unsigned int plane_num, unsigned int rec_num);
 
+
+/* Function to check if Planes feature is supoprted */
+static inline bool are_planes_supported(void)
+{
+	u_register_t feature_flag;
+
+	/* Read Realm Feature Reg 0 */
+	if (host_rmi_features(0UL, &feature_flag) != REALM_SUCCESS) {
+		ERROR("%s() failed\n", "host_rmi_features");
+		return false;
+	}
+
+	if (EXTRACT(RMI_FEATURE_REGISTER_0_MAX_NUM_AUX_PLANES, feature_flag) > 0UL) {
+		return true;
+	}
+
+	return false;
+}
+
+/* Function to check if S2POE feature/ Single RTT is supported for multiple planes */
 static inline bool is_single_rtt_supported(void)
 {
 	u_register_t feature_flag;
diff --git a/include/runtime_services/host_realm_managment/host_shared_data.h b/include/runtime_services/host_realm_managment/host_shared_data.h
index 763306f..ead84f5 100644
--- a/include/runtime_services/host_realm_managment/host_shared_data.h
+++ b/include/runtime_services/host_realm_managment/host_shared_data.h
@@ -45,13 +45,16 @@
 enum realm_cmd {
 	REALM_SLEEP_CMD = 1U,
 	REALM_LOOP_CMD,
+	REALM_S2POE_ACCESS,
 	REALM_MPAM_ACCESS,
 	REALM_MPAM_PRESENT,
 	REALM_MULTIPLE_REC_PSCI_DENIED_CMD,
 	REALM_MULTIPLE_REC_MULTIPLE_CPU_CMD,
+	REALM_PLANES_MULTIPLE_REC_MULTIPLE_CPU_CMD,
 	REALM_GET_RSI_VERSION,
 	REALM_INSTR_FETCH_CMD,
 	REALM_DATA_ACCESS_CMD,
+	REALM_PLANE_N_EXCEPTION_CMD,
 	REALM_PMU_CYCLE,
 	REALM_PMU_COUNTER,
 	REALM_PMU_EVENT,
diff --git a/realm/include/realm_rsi.h b/realm/include/realm_rsi.h
index 06f857f..7139023 100644
--- a/realm/include/realm_rsi.h
+++ b/realm/include/realm_rsi.h
@@ -65,6 +65,8 @@
 	RSI_ERROR_COUNT
 } rsi_status_t;
 
+#define RSI_EXIT_SYNC	0U
+
 /* Size of Realm Personalization Value */
 #define RSI_RPV_SIZE			64U
 
diff --git a/realm/include/realm_tests.h b/realm/include/realm_tests.h
index 6c1e6c3..6f457e5 100644
--- a/realm/include/realm_tests.h
+++ b/realm/include/realm_tests.h
@@ -25,6 +25,7 @@
 bool test_realm_sve_undef_abort(void);
 bool test_realm_multiple_rec_psci_denied_cmd(void);
 bool test_realm_multiple_rec_multiple_cpu_cmd(void);
+bool test_realm_multiple_plane_multiple_rec_multiple_cpu_cmd(void);
 bool test_realm_sme_read_id_registers(void);
 bool test_realm_sme_undef_abort(void);
 bool test_realm_sctlr2_ease(void);
diff --git a/realm/realm_multiple_rec.c b/realm/realm_multiple_rec.c
index c584cd4..95bb6f1 100644
--- a/realm/realm_multiple_rec.c
+++ b/realm/realm_multiple_rec.c
@@ -15,18 +15,26 @@
 #include <host_shared_data.h>
 #include <psci.h>
 #include "realm_def.h"
+#include <realm_helpers.h>
+#include <realm_psi.h>
 #include <realm_rsi.h>
 #include <realm_tests.h>
 #include <realm_psci.h>
 #include <tftf_lib.h>
 
-#define CXT_ID_MAGIC 0x100
+#define CXT_ID_MAGIC	0x100
+#define P1_CXT_ID_MAGIC	0x200
+
 static uint64_t is_secondary_cpu_booted;
 static spinlock_t lock;
+static rsi_plane_run run[MAX_REC_COUNT] __aligned(PAGE_SIZE);
+static u_register_t base, plane_index, perm_index;
 
-static void rec1_handler(u_register_t cxt_id)
+static void plane0_recn_handler(u_register_t cxt_id)
 {
-	realm_printf("running on CPU = 0x%lx cxt_id= 0x%lx\n",
+	uint64_t rec = 0U;
+
+	realm_printf("running on Rec= 0x%lx cxt_id= 0x%lx\n",
 			read_mpidr_el1() & MPID_MASK, cxt_id);
 	if (cxt_id < CXT_ID_MAGIC || cxt_id > CXT_ID_MAGIC + MAX_REC_COUNT) {
 		realm_printf("Wrong cxt_id\n");
@@ -34,6 +42,35 @@
 	}
 	spin_lock(&lock);
 	is_secondary_cpu_booted++;
+	rec =  read_mpidr_el1() & MPID_MASK;
+	spin_unlock(&lock);
+
+	/* enter plane */
+	u_register_t flags = 0U;
+
+	/* Use Base adr, plane_index, perm_index programmed by P0 rec0 */
+	run[rec].enter.pc = base;
+	realm_printf("Entering plane %ld, ep=0x%lx rec=0x%lx\n", plane_index, base, rec);
+	realm_plane_enter(plane_index, perm_index, base, flags, &run[rec]);
+
+	if (run[rec].exit.gprs[0] == SMC_PSCI_CPU_OFF) {
+		realm_printf("Plane N did not request CPU OFF\n");
+		rsi_exit_to_host(HOST_CALL_EXIT_FAILED_CMD);
+	}
+	realm_cpu_off();
+}
+
+static void recn_handler(u_register_t cxt_id)
+{
+	realm_printf("running on Rec= 0x%lx cxt_id= 0x%lx\n",
+			read_mpidr_el1() & MPID_MASK, cxt_id);
+
+	if (cxt_id < P1_CXT_ID_MAGIC || cxt_id > P1_CXT_ID_MAGIC + MAX_REC_COUNT) {
+		realm_printf("Wrong cxt_id\n");
+		rsi_exit_to_host(HOST_CALL_EXIT_FAILED_CMD);
+	}
+	spin_lock(&lock);
+	is_secondary_cpu_booted++;
 	spin_unlock(&lock);
 	realm_cpu_off();
 }
@@ -48,7 +85,7 @@
 	u_register_t ret;
 
 	is_secondary_cpu_booted = 0U;
-	ret = realm_cpu_on(1U, (uintptr_t)rec1_handler, 0x100);
+	ret = realm_cpu_on(1U, (uintptr_t)recn_handler, 0x100);
 	if (ret != PSCI_E_DENIED) {
 		return false;
 	}
@@ -71,12 +108,106 @@
 	return true;
 }
 
+/*
+ * All Planes enter this test function.
+ * P0 Rec0 Enters Plane N
+ * Plane N rec 0 requests CPU ON for all other rec
+ * P0 Rec0 requests CPU ON to host
+ * Host enters P0 RecN from different CPU
+ * P0 RecN enters PlaneN RecN
+ * Rec N requests CPU OFF, exits to P0
+ * P0 requests CPU OFF to host.
+ * P0 verifies all other CPU are off.
+ */
+bool test_realm_multiple_plane_multiple_rec_multiple_cpu_cmd(void)
+{
+	unsigned int i = 1U, rec_count;
+	u_register_t ret;
+	bool ret1;
+
+	realm_printf("Realm: running on Rec= 0x%lx\n", read_mpidr_el1() & MPID_MASK);
+	rec_count = realm_shared_data_get_my_host_val(HOST_ARG3_INDEX);
+
+	/* Check CPU_ON is supported */
+	ret = realm_psci_features(SMC_PSCI_CPU_ON);
+	if (ret != PSCI_E_SUCCESS) {
+		realm_printf("SMC_PSCI_CPU_ON not supported\n");
+		return false;
+	}
+
+	if (realm_is_plane0()) {
+		/* Plane 0 all rec */
+		u_register_t flags = 0U;
+
+		plane_index = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
+		base = realm_shared_data_get_my_host_val(HOST_ARG2_INDEX);
+		perm_index = plane_index + 1U;
+
+		plane_common_init(plane_index, perm_index, base, &run[0U]);
+
+		ret1 = realm_plane_enter(plane_index, perm_index, base, flags, &run[0U]);
+		while (ret1 && run->exit.gprs[0] == SMC_PSCI_CPU_ON_AARCH64) {
+			realm_printf("Plane N requested CPU on Rec=0x%lx\n", run[0].exit.gprs[1]);
+
+			/* Pass context tp RecN - CXT + rec idx */
+			run[0].enter.gprs[0] = realm_cpu_on(run[0].exit.gprs[1],
+						(uintptr_t)plane0_recn_handler,
+						CXT_ID_MAGIC + run[0].exit.gprs[1]);
+
+			/* re-enter plane N 1 to complete cpu on */
+			ret1 = realm_plane_enter(plane_index, perm_index, base, flags, &run[0U]);
+			if (!ret1) {
+				realm_printf("PlaneN CPU on complete failed\n");
+				rsi_exit_to_host(HOST_CALL_EXIT_FAILED_CMD);
+			}
+		}
+
+		/* wait for all CPUs to come up */
+		while (is_secondary_cpu_booted != rec_count - 1U) {
+			waitms(200);
+		}
+
+		/* wait for all CPUs to turn off */
+		while (i < rec_count) {
+			ret = realm_psci_affinity_info(i, MPIDR_AFFLVL0);
+			if (ret != PSCI_STATE_OFF) {
+				/* wait and query again */
+				realm_printf(" CPU %d is not off\n", i);
+				waitms(200);
+				continue;
+			}
+			i++;
+		}
+		realm_printf("All CPU are off\n");
+		return true;
+	} else {
+		/* Plane 1 Rec 0 */
+		for (unsigned int j = 1U; j < rec_count; j++) {
+			realm_printf("CPU ON Rec=%u\n", j);
+			ret = realm_cpu_on(j, (uintptr_t)recn_handler, P1_CXT_ID_MAGIC + j);
+			if (ret != PSCI_E_SUCCESS) {
+				realm_printf("SMC_PSCI_CPU_ON failed %d.\n", j);
+				return false;
+			}
+		}
+		/* Exit to Host to allow host to run all CPUs */
+		rsi_exit_to_host(HOST_CALL_EXIT_SUCCESS_CMD);
+
+		/* wait for all CPUs to come up */
+		while (is_secondary_cpu_booted != rec_count - 1U) {
+			waitms(200);
+		}
+		return true;
+	}
+	return true;
+}
+
 bool test_realm_multiple_rec_multiple_cpu_cmd(void)
 {
 	unsigned int i = 1U, rec_count;
 	u_register_t ret;
 
-	realm_printf("Realm: running on CPU = 0x%lx\n", read_mpidr_el1() & MPID_MASK);
+	realm_printf("Realm: running on Rec= 0x%lx\n", read_mpidr_el1() & MPID_MASK);
 	rec_count = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
 
 	/* Check CPU_ON is supported */
@@ -87,7 +218,7 @@
 	}
 
 	for (unsigned int j = 1U; j < rec_count; j++) {
-		ret = realm_cpu_on(j, (uintptr_t)rec1_handler, CXT_ID_MAGIC + j);
+		ret = realm_cpu_on(j, (uintptr_t)recn_handler, P1_CXT_ID_MAGIC + j);
 		if (ret != PSCI_E_SUCCESS) {
 			realm_printf("SMC_PSCI_CPU_ON failed %d.\n", j);
 			return false;
diff --git a/realm/realm_payload_main.c b/realm/realm_payload_main.c
index d364aa0..4ebdb90 100644
--- a/realm/realm_payload_main.c
+++ b/realm/realm_payload_main.c
@@ -144,6 +144,18 @@
 	}
 }
 
+static bool test_realm_s2poe_undef_abort(void)
+{
+	realm_reset_undef_abort_count();
+
+	/* Install exception handler to catch undefined abort */
+	register_custom_sync_exception_handler(realm_sync_exception_handler);
+	write_s2por_el1(0UL);
+	unregister_custom_sync_exception_handler();
+
+	return (realm_get_undef_abort_count() != 0UL);
+}
+
 /*
  * This function requests RSI/ABI version from RMM.
  */
@@ -253,17 +265,57 @@
 	return false;
 }
 
+static bool test_plane_exception_cmd(void)
+{
+	u_register_t base, plane_index, perm_index, flags = 0U;
+	bool ret1;
+
+	plane_index = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
+	base = realm_shared_data_get_my_host_val(HOST_ARG2_INDEX);
+	perm_index = plane_index + 1U;
+
+	ret1 = plane_common_init(plane_index, perm_index, base, &run);
+	if (!ret1) {
+		return ret1;
+	}
+
+	realm_printf("Entering plane %ld, ep=0x%lx run=0x%lx\n", plane_index, base, &run);
+	ret1 = realm_plane_enter(plane_index, perm_index, base, flags, &run);
+
+	realm_printf("Plane exit reason=0x%lx\n", run.exit.exit_reason);
+
+	/*
+	 * @TODO- P0 can inject SEA back to PN,
+	 * if capability is added in future.
+	 */
+	if (ret1 && (run.exit.exit_reason == RSI_EXIT_SYNC)) {
+		u_register_t far, esr, elr;
+
+		far = run.exit.far;
+		esr = run.exit.esr;
+		elr = run.exit.elr;
+
+		/* Return ESR FAR to Host */
+		realm_shared_data_set_my_realm_val(HOST_ARG2_INDEX, esr);
+		realm_shared_data_set_my_realm_val(HOST_ARG3_INDEX, far);
+		realm_printf("Plane exit FAR=0x%lx ESR=0x%lx ELR=0x%lx\n",
+			far, esr, elr);
+		rsi_exit_to_host(HOST_CALL_EXIT_SUCCESS_CMD);
+	}
+	return false;
+}
+
 static bool test_realm_instr_fetch_cmd(void)
 {
 	u_register_t base, new_top;
 	void (*func_ptr)(void);
 	rsi_ripas_type ripas;
 
-	base = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
+	base = realm_shared_data_get_my_host_val(HOST_ARG3_INDEX);
 	rsi_ipa_state_get(base, base + PAGE_SIZE, &new_top, &ripas);
 	realm_printf("Initial ripas=%u\n", ripas);
 	/* Causes instruction abort */
-	realm_printf("Generate Instruction Abort\n");
+	realm_printf("Generate Instruction Abort base=0x%lx\n", base);
 	func_ptr = (void (*)(void))base;
 	func_ptr();
 	/* Should not return */
@@ -274,11 +326,11 @@
 {
 	u_register_t base, new_top;
 	rsi_ripas_type ripas;
-	base = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
+	base = realm_shared_data_get_my_host_val(HOST_ARG3_INDEX);
 	rsi_ipa_state_get(base, base + PAGE_SIZE, &new_top, &ripas);
 	realm_printf("Initial ripas=%u\n", ripas);
 	/* Causes data abort */
-	realm_printf("Generate Data Abort\n");
+	realm_printf("Generate Data Abort base=0x%lx\n", base);
 	*((volatile uint64_t *)base);
 
 	return false;
@@ -288,7 +340,7 @@
 {
 	u_register_t base, far, esr, elr;
 
-	base = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
+	base = realm_shared_data_get_my_host_val(HOST_ARG3_INDEX);
 	far = read_far_el1();
 	esr = read_esr_el1();
 	elr = read_elr_el1();
@@ -390,6 +442,9 @@
 		case REALM_PLANE_N_REG_RW_CMD:
 			test_succeed = test_realm_enter_plane_n_reg_rw();
 			break;
+		case REALM_S2POE_ACCESS:
+			test_succeed = test_realm_s2poe_undef_abort();
+			break;
 		case REALM_MPAM_ACCESS:
 			test_succeed = test_realm_mpam_undef_abort();
 			break;
@@ -403,6 +458,9 @@
 		case REALM_MULTIPLE_REC_MULTIPLE_CPU_CMD:
 			test_succeed = test_realm_multiple_rec_multiple_cpu_cmd();
 			break;
+		case REALM_PLANES_MULTIPLE_REC_MULTIPLE_CPU_CMD:
+			test_succeed = test_realm_multiple_plane_multiple_rec_multiple_cpu_cmd();
+			break;
 		case REALM_FEAT_DOUBLEFAULT2_TEST:
 			test_realm_feat_doublefault2();
 			test_succeed = true;
@@ -413,6 +471,9 @@
 		case REALM_DATA_ACCESS_CMD:
 			test_succeed = test_realm_data_access_cmd();
 			break;
+		case REALM_PLANE_N_EXCEPTION_CMD:
+			test_succeed = test_plane_exception_cmd();
+			break;
 		case REALM_PAUTH_SET_CMD:
 			test_succeed = test_realm_pauth_set_cmd();
 			break;
diff --git a/realm/realm_plane.c b/realm/realm_plane.c
index c7225ed..656c688 100644
--- a/realm/realm_plane.c
+++ b/realm/realm_plane.c
@@ -11,12 +11,15 @@
 #include <debug.h>
 
 #include <host_realm_helper.h>
+#include <psci.h>
+#include <realm_psci.h>
 #include <realm_psi.h>
 #include <realm_rsi.h>
 #include <sync.h>
 
 static bool is_plane0;
 static unsigned int plane_num;
+static bool plane_init[MAX_PLANE_COUNT];
 
 bool realm_is_plane0(void)
 {
@@ -102,10 +105,30 @@
 
 	/* Disallow SMC from Plane N */
 	if (ec == EC_AARCH64_SMC) {
-		/* TODO Support PSCI in future */
+		u_register_t smc_id = run->exit.gprs[0];
+
 		restore_plane_context(run);
-		run->enter.gprs[0] = RSI_ERROR_STATE;
-		return PSI_RETURN_TO_PN;
+		switch (smc_id) {
+		case SMC_PSCI_CPU_ON_AARCH64:
+			assert(run->exit.gprs[1] < MAX_REC_COUNT);
+			assert(run->exit.gprs[1] != 0U);
+			/* Let P0 handle CPU ON */
+			return PSI_RETURN_TO_P0;
+		case SMC_PSCI_CPU_OFF:
+			realm_cpu_off();
+			/* Does not return. */
+			return PSI_RETURN_TO_PN;
+		case SMC_PSCI_FEATURES:
+			run->enter.gprs[0] = realm_psci_features(run->exit.gprs[1U]);
+			return PSI_RETURN_TO_PN;
+		case SMC_PSCI_AFFINITY_INFO:
+			run->enter.gprs[0] = realm_psci_affinity_info(run->exit.gprs[1U],
+					run->exit.gprs[2U]);
+			return PSI_RETURN_TO_PN;
+		default:
+			run->enter.gprs[0] = RSI_ERROR_STATE;
+			return PSI_RETURN_TO_PN;
+		}
 	}
 
 	/* Handle PSI HVC call from Plane N */
@@ -146,11 +169,16 @@
 	run->enter.pc = base;
 
 	/* Perm init */
+	if (plane_init[plane_index]) {
+		return true;
+	}
+
 	ret = rsi_mem_set_perm_value(plane_index, perm_index, PERM_LABEL_RW_upX);
 	if (ret != RSI_SUCCESS) {
 		ERROR("rsi_mem_set_perm_value failed %u\n", plane_index);
 		return false;
 	}
+	plane_init[plane_index] = true;
 	return true;
 }
 
diff --git a/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c b/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
index 72065c1..d677ac2 100644
--- a/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
+++ b/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
@@ -507,12 +507,13 @@
  * Entrypoint for aux plane = realm.par_base + (plane_num * realm..par_size)
  */
 void host_realm_set_aux_plane_args(struct realm *realm_ptr,
-		unsigned int plane_num)
+		unsigned int plane_num, unsigned int rec_num)
 {
 	/* Plane Index */
-	host_shared_data_set_host_val(realm_ptr, PRIMARY_PLANE_ID, 0U, HOST_ARG1_INDEX, plane_num);
+	host_shared_data_set_host_val(realm_ptr, PRIMARY_PLANE_ID, rec_num,
+			HOST_ARG1_INDEX, plane_num);
 
 	/* Plane entrypoint */
-	host_shared_data_set_host_val(realm_ptr, PRIMARY_PLANE_ID, 0U, HOST_ARG2_INDEX,
+	host_shared_data_set_host_val(realm_ptr, PRIMARY_PLANE_ID, rec_num, HOST_ARG2_INDEX,
 			realm_ptr->par_base + (plane_num * realm_ptr->par_size));
 }
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
index e6a9cd5..951a1f6 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
@@ -301,6 +301,206 @@
 	return host_cmp_result();
 }
 
+static test_result_t plane_cpu_on_handler(void)
+{
+	bool ret;
+	struct rmi_rec_run *run;
+	unsigned int i;
+
+	spin_lock(&secondary_cpu_lock);
+	i = ++is_secondary_cpu_on;
+	spin_unlock(&secondary_cpu_lock);
+
+	/* Args for plane 0 to enter plane 1 on rec i */
+	host_realm_set_aux_plane_args(&realm, 1U, i);
+
+	/* CMD for Plane 1 Rec i */
+	host_shared_data_set_realm_cmd(&realm, REALM_PLANES_MULTIPLE_REC_MULTIPLE_CPU_CMD, 1U, i);
+
+	run = (struct rmi_rec_run *)realm.run[i];
+
+	/* Enter P0 and then P1 */
+	ret = host_enter_realm_execute(&realm, REALM_PLANES_MULTIPLE_REC_MULTIPLE_CPU_CMD,
+			RMI_EXIT_PSCI, i);
+	if (ret) {
+		if (run->exit.gprs[0] == SMC_PSCI_CPU_OFF) {
+			return TEST_RESULT_SUCCESS;
+		}
+	}
+	ERROR("Rec %d failed", i);
+	return TEST_RESULT_FAIL;
+}
+
+/*
+ * The test creates a realm with 2 planes and MAX recs
+ * Host enters P0 and then PN
+ * P1 issues PSCI_CPU_ON SMC, returns back to P0
+ * P0 forwards PSCI_CPU_ON to Host
+ * On receiving PSCI_CPU_ON call from P0 REC0 for all other recs,
+ * the test completes the PSCI call and re-enters P0 REC0 - followed by P1 REC0.
+ * Turn ON secondary CPUs upto a max of MAX_REC_COUNT.
+ * Each of the secondary then enters Realm (P0 followed by P1) with a different REC
+ * It is expected that the REC will exit with PSCI_CPU_OFF as the exit reason.
+ * P0 REC0 checks if all other CPUs are off, via PSCI_AFFINITY_INFO.
+ * Host completes the PSCI requests.
+ */
+test_result_t host_realm_multi_planes_multi_rec_multiple_cpu(void)
+{
+	bool ret1, ret2;
+	test_result_t ret3 = TEST_RESULT_FAIL;
+	int ret = RMI_ERROR_INPUT;
+	u_register_t rec_num;
+	u_register_t other_mpidr, my_mpidr;
+	struct rmi_rec_run *run;
+	unsigned int host_call_result, i;
+	u_register_t rec_flag[MAX_REC_COUNT] = {RMI_RUNNABLE};
+	u_register_t exit_reason;
+	unsigned int cpu_node, rec_count, num_aux_planes = 1U;
+	u_register_t feature_flag0 = 0U, feature_flag1 = 0U;
+	long sl = RTT_MIN_LEVEL;
+
+	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+
+	rec_count = tftf_get_total_cpus_count();
+	assert(rec_count <= MAX_REC_COUNT);
+
+	if (is_feat_52b_on_4k_2_supported()) {
+		feature_flag0 = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
+	if (!are_planes_supported()) {
+		return TEST_RESULT_SKIPPED;
+	}
+
+	if (is_single_rtt_supported()) {
+		/* Use single RTT with S2AP Indirect */
+		feature_flag0 |= INPLACE(RMI_FEATURE_REGISTER_0_PLANE_RTT,
+				RMI_PLANE_RTT_SINGLE);
+		feature_flag1 = RMI_REALM_FLAGS1_RTT_S2AP_ENCODING_INDIRECT;
+	}
+
+	for (i = 1U; i < rec_count; i++) {
+		rec_flag[i] = RMI_NOT_RUNNABLE;
+	}
+
+	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
+			feature_flag0, feature_flag1, sl, rec_flag, rec_count, num_aux_planes)) {
+		return TEST_RESULT_FAIL;
+	}
+
+	is_secondary_cpu_on = 0U;
+	init_spinlock(&secondary_cpu_lock);
+	my_mpidr = read_mpidr_el1() & MPID_MASK;
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG3_INDEX, rec_count);
+	host_shared_data_set_host_val(&realm, 1U, 0U, HOST_ARG3_INDEX, rec_count);
+
+	/* Set args for entering Plane 1 Rec0 */
+	host_realm_set_aux_plane_args(&realm, 1U, 0U);
+
+	/* CMD for Plane 1 */
+	host_shared_data_set_realm_cmd(&realm, REALM_PLANES_MULTIPLE_REC_MULTIPLE_CPU_CMD, 1U, 0U);
+
+	/* Enter P0, and then PN */
+	ret1 = host_enter_realm_execute(&realm, REALM_PLANES_MULTIPLE_REC_MULTIPLE_CPU_CMD,
+			RMI_EXIT_PSCI, 0U);
+
+	if (!ret1) {
+		ERROR("Host did not receive CPU ON request\n");
+
+		goto destroy_realm;
+	}
+	while (true) {
+		run = (struct rmi_rec_run *)realm.run[0];
+		if (run->exit.gprs[0] != SMC_PSCI_CPU_ON_AARCH64) {
+			ERROR("Host did not receive CPU ON request\n");
+			goto destroy_realm;
+		}
+		rec_num = host_realm_find_rec_by_mpidr(run->exit.gprs[1], &realm);
+		if (rec_num >= MAX_REC_COUNT) {
+			ERROR("Invalid mpidr requested\n");
+			goto destroy_realm;
+		}
+		ret = host_rmi_psci_complete(realm.rec[0], realm.rec[rec_num],
+				(unsigned long)PSCI_E_SUCCESS);
+		if (ret == RMI_SUCCESS) {
+			/* Re-enter REC0 complete CPU_ON */
+			ret = host_realm_rec_enter(&realm, &exit_reason,
+				&host_call_result, 0U);
+			if (ret != RMI_SUCCESS || exit_reason != RMI_EXIT_PSCI) {
+				break;
+			}
+		} else {
+			ERROR("host_rmi_psci_complete failed\n");
+			goto destroy_realm;
+		}
+	}
+	if (exit_reason != RMI_EXIT_HOST_CALL || host_call_result != TEST_RESULT_SUCCESS) {
+		ERROR("Realm failed\n");
+		goto destroy_realm;
+	}
+
+	i = 0U;
+
+	/* Turn on all CPUs */
+	for_each_cpu(cpu_node) {
+		if (i == (rec_count - 1U)) {
+			break;
+		}
+		other_mpidr = tftf_get_mpidr_from_node(cpu_node);
+		if (other_mpidr == my_mpidr) {
+			continue;
+		}
+
+		/* Power on the other CPU */
+		ret = tftf_try_cpu_on(other_mpidr, (uintptr_t)plane_cpu_on_handler, 0);
+		if (ret != PSCI_E_SUCCESS) {
+			ERROR("TFTF CPU ON failed\n");
+			goto destroy_realm;
+		}
+		i++;
+	}
+
+	while (true) {
+		/* Re-enter REC0 complete PSCI_AFFINITY_INFO */
+		ret = host_realm_rec_enter(&realm, &exit_reason, &host_call_result, 0U);
+		if (ret != RMI_SUCCESS) {
+			ERROR("Rec0 re-enter failed\n");
+			goto destroy_realm;
+		}
+		if (run->exit.gprs[0] != SMC_PSCI_AFFINITY_INFO_AARCH64) {
+			break;
+		}
+		rec_num = host_realm_find_rec_by_mpidr(run->exit.gprs[1], &realm);
+		if (rec_num >= rec_count) {
+			ERROR("Invalid mpidr requested\n");
+			goto destroy_realm;
+		}
+		ret = host_rmi_psci_complete(realm.rec[0], realm.rec[rec_num],
+				(unsigned long)PSCI_E_SUCCESS);
+
+		if (ret != RMI_SUCCESS) {
+			ERROR("host_rmi_psci_complete failed\n");
+			goto destroy_realm;
+		}
+	}
+
+	if (ret == RMI_SUCCESS && exit_reason == RMI_EXIT_HOST_CALL) {
+		ret3 = host_call_result;
+	}
+destroy_realm:
+	waitms(100U);
+	ret2 = host_destroy_realm(&realm);
+
+	if ((ret != RMI_SUCCESS) || !ret2) {
+		ERROR("%s(): enter=%d destroy=%d\n",
+		__func__, ret, ret2);
+		return TEST_RESULT_FAIL;
+	}
+
+	return ret3;
+}
+
 static test_result_t cpu_on_handler(void)
 {
 	bool ret;
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
index 06e6475..51dc94b 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
@@ -13,6 +13,8 @@
 #include <drivers/arm/arm_gic.h>
 #include <drivers/arm/gic_v3.h>
 #include <heap/page_alloc.h>
+#include <lib/context_mgmt/context_el1.h>
+#include <lib/context_mgmt/context_el2.h>
 #include <pauth.h>
 #include <test_helpers.h>
 
@@ -27,29 +29,16 @@
 
 static struct realm realm[MAX_REALM_COUNT];
 static struct pmu_registers pmu_state;
+static el1_ctx_regs_t el1_ctx_before = {0};
+static el1_ctx_regs_t el1_ctx_after = {0};
+static el2_sysregs_t el2_ctx_before = {0};
+static el2_sysregs_t el2_ctx_after = {0};
 
 #if ENABLE_PAUTH
 static uint128_t pauth_keys_before[NUM_KEYS];
 static uint128_t pauth_keys_after[NUM_KEYS];
 #endif
 
-bool are_planes_supported(void)
-{
-	u_register_t feature_flag;
-
-	/* Read Realm Feature Reg 0 */
-	if (host_rmi_features(0UL, &feature_flag) != REALM_SUCCESS) {
-		ERROR("%s() failed\n", "host_rmi_features");
-		return false;
-	}
-
-	if (EXTRACT(RMI_FEATURE_REGISTER_0_MAX_NUM_AUX_PLANES, feature_flag) > 0UL) {
-		return true;
-	}
-
-	return false;
-}
-
 /*
  * @Test_Aim@ Test RSI_PLANE_REG_READ/WRITE
  */
@@ -87,7 +76,7 @@
 
 	run = (struct rmi_rec_run *)realm.run[0U];
 
-	host_realm_set_aux_plane_args(&realm, 1U);
+	host_realm_set_aux_plane_args(&realm, 1U, 0U);
 	ret1 = host_enter_realm_execute(&realm, REALM_PLANE_N_REG_RW_CMD,
 			RMI_EXIT_HOST_CALL, 0U);
 
@@ -148,6 +137,14 @@
 		return TEST_RESULT_FAIL;
 	}
 
+	/* save EL1 registers */
+	save_el1_sysregs_context(&el1_ctx_before);
+	modify_el1_context_sysregs(&el1_ctx_before, NS_CORRUPT_EL1_REGS);
+	save_el1_sysregs_context(&el1_ctx_before);
+
+	/* save EL2 registers */
+	el2_save_registers(&el2_ctx_before);
+
 	/* CMD for Plane N */
 	for (unsigned int j = 1U; j <= MAX_AUX_PLANE_COUNT; j++) {
 		host_shared_data_set_realm_cmd(&realm, REALM_SLEEP_CMD, j, 0U);
@@ -158,7 +155,7 @@
 	for (unsigned int j = 1U; j <= MAX_AUX_PLANE_COUNT; j++) {
 		run = (struct rmi_rec_run *)realm.run[0U];
 
-		host_realm_set_aux_plane_args(&realm, j);
+		host_realm_set_aux_plane_args(&realm, j, 0U);
 		ret1 = host_enter_realm_execute(&realm, REALM_ENTER_PLANE_N_CMD,
 				RMI_EXIT_HOST_CALL, 0U);
 
@@ -171,6 +168,28 @@
 					run->exit.esr, run->exit.far);
 		}
 	}
+
+	/* save EL1 registers */
+	save_el1_sysregs_context(&el1_ctx_after);
+
+	INFO("Comparing EL1 registers\n");
+	ret2 = compare_el1_contexts(&el1_ctx_before, &el1_ctx_after);
+	if (!ret2) {
+		ERROR("NS EL1 registers corrupted\n");
+		host_destroy_realm(&realm);
+		return TEST_RESULT_FAIL;
+	}
+
+	/* save EL2 registers */
+	el2_save_registers(&el2_ctx_after);
+
+	INFO("Comparing EL2 registers\n");
+	if (memcmp(&el2_ctx_before, &el2_ctx_after, sizeof(el2_sysregs_t))) {
+		ERROR("NS EL2 registers corrupted\n");
+		host_destroy_realm(&realm);
+		return TEST_RESULT_FAIL;
+	}
+
 	ret2 = host_destroy_realm(&realm);
 
 	if (!ret1 || !ret2) {
@@ -185,7 +204,9 @@
 /*
  * @Test_Aim@ Test realm payload creation with 3 Aux Planes, enter all Planes
  * Host cannot enter Aux Planes directly,
- * Host will enter P0, P0 will enter aux plane
+ * Host will enter P0, P0 will enter aux plane.
+ * This test also validates that NS EL1 and NS EL2 registers are preserved by RMM.
+ * This test also validates that s2por_el1 register is not accessible in realm.
  */
 test_result_t host_test_realm_create_planes_enter_single_rtt(void)
 {
@@ -225,21 +246,56 @@
 			HOST_ARG1_INDEX, SLEEP_TIME_MS);
 	}
 
+	save_el1_sysregs_context(&el1_ctx_before);
+	modify_el1_context_sysregs(&el1_ctx_before, NS_CORRUPT_EL1_REGS);
+	save_el1_sysregs_context(&el1_ctx_before);
+
+	el2_save_registers(&el2_ctx_before);
+
 	for (unsigned int j = 1U; j <= MAX_AUX_PLANE_COUNT; j++) {
 		run = (struct rmi_rec_run *)realm.run[0U];
 
-		host_realm_set_aux_plane_args(&realm, j);
+		host_realm_set_aux_plane_args(&realm, j, 0U);
 		ret1 = host_enter_realm_execute(&realm, REALM_ENTER_PLANE_N_CMD,
 				RMI_EXIT_HOST_CALL, 0U);
 
-		if (run->exit.exit_reason != RMI_EXIT_HOST_CALL) {
+		if (!ret1) {
 			ERROR("Rec0 error exit=0x%lx ret1=%d HPFAR=0x%lx \
 				esr=0x%lx far=0x%lx\n",
 				run->exit.exit_reason, ret1,
 				run->exit.hpfar,
 				run->exit.esr, run->exit.far);
+			goto destroy_realm;
 		}
 	}
+
+	save_el1_sysregs_context(&el1_ctx_before);
+
+	INFO("Comparing EL1 registers\n");
+	ret1 = compare_el1_contexts(&el1_ctx_before, &el1_ctx_after);
+
+	if (!ret1) {
+		ERROR("NS EL1 registers corrupted\n");
+		goto destroy_realm;
+	}
+
+	el2_save_registers(&el2_ctx_after);
+
+	INFO("Comparing EL2 registers\n");
+	if (memcmp(&el2_ctx_before, &el2_ctx_after, sizeof(el2_sysregs_t))) {
+		ERROR("NS EL2 registers corrupted\n");
+		goto destroy_realm;
+	}
+
+	/* Test that realm cannot modify s2por_el1 */
+	ret1 = host_enter_realm_execute(&realm, REALM_S2POE_ACCESS,
+			RMI_EXIT_HOST_CALL, 0U);
+
+	if (!ret1) {
+		ERROR("S2POR_EL1 reg access test failed\n");
+	}
+
+destroy_realm:
 	ret2 = host_destroy_realm(&realm);
 
 	if (!ret1 || !ret2) {
@@ -896,19 +952,20 @@
  * Host calls data_destroy, new state HIPAS=UNASSIGNED RIPAS=DESTROYED
  * Enter Realm, Rec0 executes from page, and Rec1 reads the page
  * Realm should trigger an Instr/Data abort, and will exit to Host.
- * The Host verifies exit reason is Instr/Data abort
+ * The Host verifies exit reason is Instr/Data abort.
+ * Repeat the test for Plane N.
  */
 test_result_t host_realm_abort_unassigned_destroyed(void)
 {
 	bool ret1, ret2;
 	test_result_t res = TEST_RESULT_FAIL;
-	u_register_t ret, data, top;
+	u_register_t ret, data, top, num_aux_planes = 0UL;
 	struct realm realm;
 	struct rmi_rec_run *run;
 	struct rtt_entry rtt;
-	u_register_t feature_flag0 = 0UL;
+	u_register_t feature_flag0 = 0UL, feature_flag1 = 0UL;
 	long sl = RTT_MIN_LEVEL;
-	u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE}, base;
+	u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE}, base;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
@@ -917,8 +974,19 @@
 		sl = RTT_MIN_LEVEL_LPA2;
 	}
 
+	/* This test is skipped if S2POE is not supported to keep test simple */
+	if (are_planes_supported() && is_single_rtt_supported()) {
+		num_aux_planes = 1UL;
+
+		/* use single RTT for all planes */
+		feature_flag0 |= INPLACE(RMI_FEATURE_REGISTER_0_PLANE_RTT,
+			RMI_PLANE_RTT_SINGLE);
+
+		feature_flag1 = RMI_REALM_FLAGS1_RTT_S2AP_ENCODING_INDIRECT;
+	}
+
 	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
-			feature_flag0, 0U, sl, rec_flag, 2U, 0U)) {
+			feature_flag0, feature_flag1, sl, rec_flag, 4U, num_aux_planes)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -943,8 +1011,8 @@
 	}
 	INFO("Initial state base = 0x%lx rtt.state=0x%lx rtt.ripas=0x%lx\n",
 			base, rtt.state, rtt.ripas);
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG1_INDEX, base);
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 1U, HOST_ARG1_INDEX, base);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG3_INDEX, base);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 1U, HOST_ARG3_INDEX, base);
 
 	ret = host_rmi_data_destroy(realm.rd, base, &data, &top);
 	if (ret != RMI_SUCCESS || data != base) {
@@ -999,6 +1067,65 @@
 	}
 	INFO("DA FAR=0x%lx, HPFAR=0x%lx ESR= 0x%lx\n", run->exit.far, run->exit.hpfar,
 			run->exit.esr);
+
+	if (num_aux_planes == 0U) {
+		res = TEST_RESULT_SUCCESS;
+		goto undelegate_destroy;
+	}
+
+	INFO("Running test on Plane 1\n");
+
+	/*
+	 * Arg used by Plane 1 Rec 2/3
+	 * Plane 1 will fetch base, access it and get an abort causing rec exit
+	 */
+	host_shared_data_set_host_val(&realm, 1U, 2U, HOST_ARG3_INDEX, base);
+	host_shared_data_set_host_val(&realm, 1U, 3U, HOST_ARG3_INDEX, base);
+
+	/* Arg for Plane0 instruction to enter Plane1 on Rec 2,3 */
+	host_realm_set_aux_plane_args(&realm, 1U, 2U);
+	host_realm_set_aux_plane_args(&realm, 1U, 3U);
+
+	/* Test cmd for Plane 1 Rec 2/3 */
+	host_shared_data_set_realm_cmd(&realm, REALM_INSTR_FETCH_CMD, 1U, 2U);
+	host_shared_data_set_realm_cmd(&realm, REALM_DATA_ACCESS_CMD, 1U, 3U);
+
+
+	run = (struct rmi_rec_run *)realm.run[2];
+
+	/* Rec2 expect rec exit due to Instr Abort unassigned destroyed page */
+	ret1 = host_enter_realm_execute(&realm, REALM_ENTER_PLANE_N_CMD,
+		RMI_EXIT_SYNC, 2U);
+
+	/* ESR.EC == 0b100000 Instruction Abort from a lower Exception level */
+	if (!ret1 || ((run->exit.hpfar >> 4U) != (base >> PAGE_SIZE_SHIFT)
+			|| (EC_BITS(run->exit.esr) != EC_IABORT_LOWER_EL)
+			|| ((run->exit.esr & ISS_IFSC_MASK) < FSC_L0_TRANS_FAULT)
+			|| ((run->exit.esr & ISS_IFSC_MASK) > FSC_L3_TRANS_FAULT)
+			|| ((run->exit.esr & (1UL << ESR_ISS_EABORT_EA_BIT)) != 0U))) {
+		ERROR("Plane1 Rec2 did not fault ESR=0x%lx\n", run->exit.esr);
+		goto undelegate_destroy;
+	}
+	INFO("Plane1 IA FAR=0x%lx, HPFAR=0x%lx ESR=0x%lx\n", run->exit.far, run->exit.hpfar,
+			run->exit.esr);
+
+	run = (struct rmi_rec_run *)realm.run[3];
+
+	/* Rec3 expect rec exit due to Data Abort unassigned destroyed page */
+	ret1 = host_enter_realm_execute(&realm, REALM_ENTER_PLANE_N_CMD,
+			RMI_EXIT_SYNC, 3U);
+
+	/* ESR.EC == 0b100100 Data Abort exception from a lower Exception level */
+	if (!ret1 || ((run->exit.hpfar >> 4U) != (base >> PAGE_SIZE_SHIFT)
+		|| (EC_BITS(run->exit.esr) != EC_DABORT_LOWER_EL)
+		|| ((run->exit.esr & ISS_DFSC_MASK) < FSC_L0_TRANS_FAULT)
+		|| ((run->exit.esr & ISS_DFSC_MASK) > FSC_L3_TRANS_FAULT)
+		|| ((run->exit.esr & (1UL << ESR_ISS_EABORT_EA_BIT)) != 0U))) {
+		ERROR("Plane1 Rec3 did not fault\n");
+		goto undelegate_destroy;
+	}
+	INFO("Plane1 DA FAR=0x%lx, HPFAR=0x%lx ESR= 0x%lx\n", run->exit.far, run->exit.hpfar,
+			run->exit.esr);
 	res = TEST_RESULT_SUCCESS;
 
 undelegate_destroy:
@@ -1023,18 +1150,19 @@
  * Enter Realm, REC0 executes from page, and REC1 reads the page
  * Realm should trigger an Instr/Data abort, and will exit to Host.
  * Host verifies exit reason is Instr/Data abort.
+ * Repeat the test for Plane N.
  */
 test_result_t host_realm_abort_unassigned_ram(void)
 {
 	bool ret1, ret2;
-	u_register_t ret, top;
+	u_register_t ret, top, num_aux_planes = 0UL;
 	struct realm realm;
 	struct rmi_rec_run *run;
 	struct rtt_entry rtt;
-	u_register_t feature_flag0 = 0UL;
+	u_register_t feature_flag0 = 0UL, feature_flag1 = 0UL;
 	long sl = RTT_MIN_LEVEL;
 	test_result_t res = TEST_RESULT_FAIL;
-	u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE}, base;
+	u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE}, base;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
@@ -1043,8 +1171,19 @@
 		sl = RTT_MIN_LEVEL_LPA2;
 	}
 
+	/* Test is skipped if S2POE is not supported to keep test simple */
+	if (are_planes_supported() && is_single_rtt_supported()) {
+		num_aux_planes = 1UL;
+
+		/* use single RTT for all planes */
+		feature_flag0 |= INPLACE(RMI_FEATURE_REGISTER_0_PLANE_RTT,
+			RMI_PLANE_RTT_SINGLE);
+
+		feature_flag1 = RMI_REALM_FLAGS1_RTT_S2AP_ENCODING_INDIRECT;
+	}
+
 	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
-			feature_flag0, 0U, sl, rec_flag, 2U, 0U)) {
+			feature_flag0, feature_flag1, sl, rec_flag, 4U, num_aux_planes)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -1055,6 +1194,20 @@
 
 	/* Set RIPAS of PAGE to RAM */
 	ret = host_rmi_rtt_init_ripas(realm.rd, base, base + PAGE_SIZE, &top);
+	if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) {
+		/* Create missing RTTs till L3 and retry */
+		int8_t level = RMI_RETURN_INDEX(ret);
+
+		ret = host_rmi_create_rtt_levels(&realm, base,
+				(u_register_t)level, 3U);
+		if (ret != RMI_SUCCESS) {
+			ERROR("host_rmi_create_rtt_levels failed\n");
+			goto destroy_realm;
+		}
+
+		ret = host_rmi_rtt_init_ripas(realm.rd, base, base + PAGE_SIZE, &top);
+	}
+
 	if (ret != RMI_SUCCESS) {
 		ERROR("%s() failed, ret=0x%lx line=%u\n",
 			"host_rmi_rtt_init_ripas", ret, __LINE__);
@@ -1073,8 +1226,8 @@
 	}
 	INFO("Initial state base = 0x%lx rtt.state=0x%lx rtt.ripas=0x%lx\n",
 			base, rtt.state, rtt.ripas);
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG1_INDEX, base);
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 1U, HOST_ARG1_INDEX, base);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG3_INDEX, base);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 1U, HOST_ARG3_INDEX, base);
 
 	/* Rec0 expect rec exit due to Instr Abort unassigned ram page */
 	ret1 = host_enter_realm_execute(&realm, REALM_INSTR_FETCH_CMD,
@@ -1108,6 +1261,65 @@
 	}
 	INFO("DA FAR=0x%lx, HPFAR=0x%lx ESR=0x%lx\n", run->exit.far, run->exit.hpfar,
 			run->exit.esr);
+
+	if (num_aux_planes == 0U) {
+		res = TEST_RESULT_SUCCESS;
+		goto destroy_realm;
+	}
+
+	INFO("Running test on Plane 1\n");
+
+	/*
+	 * Arg used by Plane 1 Rec 2/3
+	 * Plane 1 will access the base, causing rec exit due to abort
+	 */
+	host_shared_data_set_host_val(&realm, 1U, 2U, HOST_ARG3_INDEX, base);
+	host_shared_data_set_host_val(&realm, 1U, 3U, HOST_ARG3_INDEX, base);
+
+	/* Arg for Plane0 to enter Plane1 on Rec 2,3 */
+	host_realm_set_aux_plane_args(&realm, 1U, 2U);
+	host_realm_set_aux_plane_args(&realm, 1U, 3U);
+
+	/* Test cmd for Plane 1 Rec 2/3 */
+	host_shared_data_set_realm_cmd(&realm, REALM_INSTR_FETCH_CMD, 1U, 2U);
+	host_shared_data_set_realm_cmd(&realm, REALM_DATA_ACCESS_CMD, 1U, 3U);
+
+	/* Rec2 expect rec exit due to Instr Abort unassigned ram page */
+	ret1 = host_enter_realm_execute(&realm, REALM_ENTER_PLANE_N_CMD,
+			RMI_EXIT_SYNC, 2U);
+
+	run = (struct rmi_rec_run *)realm.run[2];
+
+	/* ESR.EC == 0b100000 Instruction Abort from a lower Exception level */
+	if (!ret1 || ((run->exit.hpfar >> 4U) != (base >> PAGE_SIZE_SHIFT)
+			|| (EC_BITS(run->exit.esr) != EC_IABORT_LOWER_EL)
+			|| ((run->exit.esr & ISS_IFSC_MASK) < FSC_L0_TRANS_FAULT)
+			|| ((run->exit.esr & ISS_IFSC_MASK) > FSC_L3_TRANS_FAULT)
+			|| ((run->exit.esr & (1UL << ESR_ISS_EABORT_EA_BIT)) != 0U))) {
+		INFO("Plane1 Rec2 did not fault FAR=0x%lx, HPFAR=0x%lx ESR=0x%lx\n",
+				run->exit.far, run->exit.hpfar,	run->exit.esr);
+		goto destroy_realm;
+	}
+	INFO("Plane1 IA FAR=0x%lx, HPFAR=0x%lx ESR=0x%lx\n", run->exit.far, run->exit.hpfar,
+			run->exit.esr);
+
+	run = (struct rmi_rec_run *)realm.run[3];
+
+	/* Rec3 expect rec exit due to Data Abort unassigned ram page */
+	ret1 = host_enter_realm_execute(&realm, REALM_ENTER_PLANE_N_CMD,
+			RMI_EXIT_SYNC, 3U);
+
+	/* ESR.EC == 0b100100 Data Abort exception from a lower Exception level */
+	if (!ret1 || ((run->exit.hpfar >> 4U) != (base >> PAGE_SIZE_SHIFT)
+		|| (EC_BITS(run->exit.esr) != EC_DABORT_LOWER_EL)
+		|| ((run->exit.esr & ISS_DFSC_MASK) < FSC_L0_TRANS_FAULT)
+		|| ((run->exit.esr & ISS_DFSC_MASK) > FSC_L3_TRANS_FAULT)
+		|| ((run->exit.esr & (1UL << ESR_ISS_EABORT_EA_BIT)) != 0U))) {
+		ERROR("Plane1 Rec3 did not fault ESR=0x%lx\n", run->exit.esr);
+		goto destroy_realm;
+	}
+	INFO("Plane1 DA FAR=0x%lx, HPFAR=0x%lx ESR=0x%lx\n", run->exit.far, run->exit.hpfar,
+			run->exit.esr);
 	res = TEST_RESULT_SUCCESS;
 
 destroy_realm:
@@ -1131,7 +1343,8 @@
  * Host calls data_create_unknown, new state HIPAS=ASSIGNED RIPAS=DESTROYED
  * Enter Realm, REC0 executes from page, and REC1 reads the page
  * Realm should trigger an Instr/Data abort, and will exit to Host.
- * The Host verifies exit reason is Instr/Data abort
+ * The Host verifies exit reason is Instr/Data abort.
+ * Repeat the test for Plane N.
  */
 test_result_t host_realm_abort_assigned_destroyed(void)
 {
@@ -1141,9 +1354,10 @@
 	struct realm realm;
 	struct rmi_rec_run *run;
 	struct rtt_entry rtt;
-	u_register_t feature_flag0 = 0UL;
+	u_register_t feature_flag0 = 0UL, num_aux_planes = 0UL;
+	u_register_t feature_flag1 = 0UL;
 	long sl = RTT_MIN_LEVEL;
-	u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE}, base;
+	u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE}, base;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
@@ -1152,8 +1366,19 @@
 		sl = RTT_MIN_LEVEL_LPA2;
 	}
 
+	/* Test is skipped if S2POE is not supported to keep test simple */
+	if (are_planes_supported() && is_single_rtt_supported()) {
+		num_aux_planes = 1UL;
+
+		/* use single RTT for all planes */
+		feature_flag0 |= INPLACE(RMI_FEATURE_REGISTER_0_PLANE_RTT,
+			RMI_PLANE_RTT_SINGLE);
+
+		feature_flag1 = RMI_REALM_FLAGS1_RTT_S2AP_ENCODING_INDIRECT;
+	}
+
 	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
-			feature_flag0, 0U, sl, rec_flag, 2U, 0U)) {
+			feature_flag0, feature_flag1, sl, rec_flag, 4U, num_aux_planes)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -1175,8 +1400,8 @@
 	}
 	INFO("Initial state base = 0x%lx rtt.state=0x%lx rtt.ripas=0x%lx\n",
 			base, rtt.state, rtt.ripas);
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG1_INDEX, base);
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 1U, HOST_ARG1_INDEX, base);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG3_INDEX, base);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 1U, HOST_ARG3_INDEX, base);
 
 	if (host_realm_activate(&realm) != REALM_SUCCESS) {
 		ERROR("%s() failed\n", "host_realm_activate");
@@ -1241,6 +1466,63 @@
 	}
 	INFO("DA FAR=0x%lx, HPFAR=0x%lx ESR=0x%lx\n", run->exit.far, run->exit.hpfar,
 				run->exit.esr);
+
+	if (num_aux_planes == 0U) {
+		res = TEST_RESULT_SUCCESS;
+		goto destroy_data;
+	}
+
+	INFO("Running test on Plane 1\n");
+
+	/*
+	 * Args used by Plane 1, Rec 2/3
+	 * Plane1 accesses base, causes rec exit due to abort
+	 */
+	host_shared_data_set_host_val(&realm, 1U, 2U, HOST_ARG3_INDEX, base);
+	host_shared_data_set_host_val(&realm, 1U, 3U, HOST_ARG3_INDEX, base);
+
+	/* Arg for Plane0 to enter Plane1 on Rec 2,3 */
+	host_realm_set_aux_plane_args(&realm, 1U, 2U);
+	host_realm_set_aux_plane_args(&realm, 1U, 3U);
+
+	/* Test cmd for Plane 1, Rec 2/3 */
+	host_shared_data_set_realm_cmd(&realm, REALM_INSTR_FETCH_CMD, 1U, 2U);
+	host_shared_data_set_realm_cmd(&realm, REALM_DATA_ACCESS_CMD, 1U, 3U);
+
+	run = (struct rmi_rec_run *)realm.run[2];
+
+	/* Rec2, expect rec exit due to Instr Abort assigned destroyed page */
+	ret1 = host_enter_realm_execute(&realm, REALM_ENTER_PLANE_N_CMD,
+		RMI_EXIT_SYNC, 2U);
+
+	/* ESR.EC == 0b100000 Instruction Abort from a lower Exception level */
+	if (!ret1 || ((run->exit.hpfar >> 4U) != (base >> PAGE_SIZE_SHIFT)
+		|| (EC_BITS(run->exit.esr) != EC_IABORT_LOWER_EL)
+		|| ((run->exit.esr & ISS_IFSC_MASK) < FSC_L0_TRANS_FAULT)
+		|| ((run->exit.esr & ISS_IFSC_MASK) > FSC_L3_TRANS_FAULT)
+		|| ((run->exit.esr & (1UL << ESR_ISS_EABORT_EA_BIT)) != 0U))) {
+		ERROR("Plane1 Rec2 did not fault ESR=0x%lx\n", run->exit.esr);
+		goto destroy_data;
+	}
+	INFO("Plane1 IA FAR=0x%lx, HPFAR=0x%lx ESR=0x%lx\n", run->exit.far, run->exit.hpfar,
+				run->exit.esr);
+	run = (struct rmi_rec_run *)realm.run[3];
+
+	/* Rec3  expect rec exit due to Data Abort  assigned destroyed page */
+	ret1 = host_enter_realm_execute(&realm, REALM_ENTER_PLANE_N_CMD,
+			RMI_EXIT_SYNC, 3U);
+
+	/* ESR.EC == 0b100100 Data Abort exception from a lower Exception level */
+	if (!ret1 || ((run->exit.hpfar >> 4U) != (base >> PAGE_SIZE_SHIFT)
+		|| (EC_BITS(run->exit.esr) != EC_DABORT_LOWER_EL)
+		|| ((run->exit.esr & ISS_DFSC_MASK) < FSC_L0_TRANS_FAULT)
+		|| ((run->exit.esr & ISS_DFSC_MASK) > FSC_L3_TRANS_FAULT)
+		|| ((run->exit.esr & (1UL << ESR_ISS_EABORT_EA_BIT)) != 0U))) {
+		ERROR("Plane1 Rec3 did not fault ESR=0x%lx\n", run->exit.esr);
+		goto destroy_data;
+	}
+	INFO("Plane1 DA FAR=0x%lx, HPFAR=0x%lx ESR=0x%lx\n", run->exit.far, run->exit.hpfar,
+				run->exit.esr);
 	res = TEST_RESULT_SUCCESS;
 
 destroy_data:
@@ -1268,17 +1550,21 @@
  * Rec1 generated DA unassigned empty
  * Rec2 generated IA for assigned empty
  * Rec3 generated DA for assigned empty
+ * Repeat the test for Plane1.
+ * Accessing RIPAS=EMPTY causes plane exit to P0
  */
 test_result_t host_realm_sea_empty(void)
 {
 	bool ret1, ret2;
 	test_result_t res = TEST_RESULT_FAIL;
-	u_register_t ret, base, esr;
+	u_register_t ret, base, esr, num_aux_planes = 0UL, far;
+	u_register_t feature_flag1 = 0UL;
 	struct realm realm;
 	struct rtt_entry rtt;
 	u_register_t feature_flag0 = 0UL;
 	long sl = RTT_MIN_LEVEL;
-	u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE};
+	u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
+				   RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE};
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
@@ -1287,23 +1573,56 @@
 		sl = RTT_MIN_LEVEL_LPA2;
 	}
 
+	/* Test are skipped if S2POE is not supported to keep test simple */
+	if (are_planes_supported() && is_single_rtt_supported()) {
+		num_aux_planes = 1UL;
+
+		/* use single RTT for all planes */
+		feature_flag0 |= INPLACE(RMI_FEATURE_REGISTER_0_PLANE_RTT,
+			RMI_PLANE_RTT_SINGLE);
+
+		feature_flag1 = RMI_REALM_FLAGS1_RTT_S2AP_ENCODING_INDIRECT;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
-			feature_flag0, 0U, sl, rec_flag, 4U, 0U)) {
+			feature_flag0, feature_flag1, sl, rec_flag, 8U, num_aux_planes)) {
 		return TEST_RESULT_FAIL;
 	}
 
-	base = (u_register_t)page_alloc(PAGE_SIZE);
+	base = (u_register_t)page_alloc(PAGE_SIZE * 2U);
+
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (rtt.walk_level != 3U) {
+		/* Create L3 RTT */
+		host_rmi_create_rtt_levels(&realm, base, rtt.walk_level, 3U);
+	}
 
 	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (rtt.state != RMI_UNASSIGNED ||
-			(rtt.ripas != RMI_EMPTY)) {
+			(rtt.ripas != RMI_EMPTY) ||
+			(rtt.walk_level != 3U)) {
 		ERROR("wrong initial state\n");
 		goto destroy_realm;
 	}
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG1_INDEX, base);
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 1U, HOST_ARG1_INDEX, base);
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 2U, HOST_ARG1_INDEX, base);
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 3U, HOST_ARG1_INDEX, base);
+
+	ret = host_rmi_rtt_readentry(realm.rd, base + PAGE_SIZE, 3L, &rtt);
+	if (rtt.walk_level != 3U) {
+		/* Create L3 RTT */
+		host_rmi_create_rtt_levels(&realm, base + PAGE_SIZE, rtt.walk_level, 3U);
+	}
+
+	ret = host_rmi_rtt_readentry(realm.rd, base + PAGE_SIZE, 3L, &rtt);
+	if (rtt.state != RMI_UNASSIGNED ||
+			(rtt.ripas != RMI_EMPTY) ||
+			(rtt.walk_level != 3U)) {
+		ERROR("wrong initial state\n");
+		goto destroy_realm;
+	}
+
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG3_INDEX, base);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 1U, HOST_ARG3_INDEX, base);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 2U, HOST_ARG3_INDEX, base);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 3U, HOST_ARG3_INDEX, base);
 
 	/* Rec0 expect IA due to SEA unassigned empty page */
 	ret1 = host_enter_realm_execute(&realm, REALM_INSTR_FETCH_CMD,
@@ -1383,6 +1702,124 @@
 		ERROR("Rec3 incorrect ESR=0x%lx\n", esr);
 	}
 	INFO("Rec3 ESR=0x%lx\n", esr);
+
+	if (num_aux_planes == 0U) {
+		res = TEST_RESULT_SUCCESS;
+		goto undelegate_destroy;
+	}
+
+	host_rmi_granule_undelegate(base);
+
+	INFO("Running test on Plane 1\n");
+	base += PAGE_SIZE;
+
+	/*
+	 * Args used by Plane 1, Rec 4/5/6/7
+	 * Plane1 will access base, causing Plane exit to P0
+	 * P0 will return ESR?FAR back to Host
+	 */
+	host_shared_data_set_host_val(&realm, 1U, 4U, HOST_ARG3_INDEX, base);
+	host_shared_data_set_host_val(&realm, 1U, 5U, HOST_ARG3_INDEX, base);
+	host_shared_data_set_host_val(&realm, 1U, 6U, HOST_ARG3_INDEX, base);
+	host_shared_data_set_host_val(&realm, 1U, 7U, HOST_ARG3_INDEX, base);
+
+	/* Arg for Plane0 to enter Plane1 on Rec4,5,6,7 */
+	host_realm_set_aux_plane_args(&realm, 1U, 4U);
+	host_realm_set_aux_plane_args(&realm, 1U, 5U);
+	host_realm_set_aux_plane_args(&realm, 1U, 6U);
+	host_realm_set_aux_plane_args(&realm, 1U, 7U);
+
+	/* Test cmd for Plane 1, Rec 4/5/6/7 */
+	host_shared_data_set_realm_cmd(&realm, REALM_INSTR_FETCH_CMD, 1U, 4U);
+	host_shared_data_set_realm_cmd(&realm, REALM_DATA_ACCESS_CMD, 1U, 5U);
+	host_shared_data_set_realm_cmd(&realm, REALM_INSTR_FETCH_CMD, 1U, 6U);
+	host_shared_data_set_realm_cmd(&realm, REALM_DATA_ACCESS_CMD, 1U, 7U);
+
+	/* Rec4 expect IA due to unassigned empty page */
+	ret1 = host_enter_realm_execute(&realm, REALM_PLANE_N_EXCEPTION_CMD,
+			RMI_EXIT_HOST_CALL, 4U);
+	if (!ret1) {
+		ERROR("Rec4 did not fault\n");
+		goto destroy_realm;
+	}
+
+	/* get ESR FAR set by P0 */
+	esr = host_shared_data_get_realm_val(&realm, 0U, 4U, HOST_ARG2_INDEX);
+	far = host_shared_data_get_realm_val(&realm, 0U, 4U, HOST_ARG3_INDEX);
+	if ((EC_BITS(esr) != EC_IABORT_LOWER_EL) || (far != base)) {
+		ERROR("Rec4 incorrect ESR=0x%lx FAR=0x%lx\n", esr, far);
+		goto destroy_realm;
+	}
+	INFO("Rec4 ESR=0x%lx\n", esr);
+
+	/* Rec5 expect DA due to unassigned empty page */
+	ret1 = host_enter_realm_execute(&realm, REALM_PLANE_N_EXCEPTION_CMD,
+			RMI_EXIT_HOST_CALL, 5U);
+	if (!ret1) {
+		ERROR("Rec5 did not fault\n");
+		goto destroy_realm;
+	}
+
+	/* get ESR FAR set by P0 */
+	esr = host_shared_data_get_realm_val(&realm, 0U, 5U, HOST_ARG2_INDEX);
+	far = host_shared_data_get_realm_val(&realm, 0U, 5U, HOST_ARG3_INDEX);
+	if ((EC_BITS(esr) != EC_DABORT_LOWER_EL) || (far != base)) {
+		ERROR("Rec5 incorrect ESR=0x%lx\n", esr);
+		goto destroy_realm;
+	}
+	INFO("Rec5 ESR=0x%lx\n", esr);
+
+	/* DATA_CREATE_UNKNOWN */
+	ret = host_realm_delegate_map_protected_data(true, &realm, base, PAGE_SIZE, 0U);
+	if (ret != RMI_SUCCESS) {
+		ERROR("host_realm_delegate_map_protected_data failed\n");
+		goto destroy_realm;
+	}
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (rtt.state != RMI_ASSIGNED ||
+			(rtt.ripas != RMI_EMPTY)) {
+		ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
+		goto undelegate_destroy;
+	}
+	INFO("final state base = 0x%lx rtt.state=0x%lx rtt.ripas=0x%lx level=0x%lx\n",
+			base, rtt.state, rtt.ripas, rtt.walk_level);
+
+	/* Rec6 expect IA due to assigned empty page */
+	ret1 = host_enter_realm_execute(&realm, REALM_PLANE_N_EXCEPTION_CMD,
+		RMI_EXIT_HOST_CALL, 6U);
+
+	if (!ret1) {
+		ERROR("Rec6 did not fault\n");
+		goto undelegate_destroy;
+	}
+
+	/* get ESR FAR set by P0 */
+	esr = host_shared_data_get_realm_val(&realm, 0U, 6U, HOST_ARG2_INDEX);
+	far = host_shared_data_get_realm_val(&realm, 0U, 6U, HOST_ARG3_INDEX);
+
+	if ((EC_BITS(esr) != EC_IABORT_LOWER_EL) || (far != base)) {
+		ERROR("Rec6 incorrect ESR=0x%lx\n", esr);
+		goto undelegate_destroy;
+	}
+	INFO("Rec6 ESR=0x%lx\n", esr);
+
+	/* Rec7 expect DA due to unassigned empty page */
+	ret1 = host_enter_realm_execute(&realm, REALM_PLANE_N_EXCEPTION_CMD,
+			RMI_EXIT_HOST_CALL, 7U);
+	if (!ret1) {
+		ERROR("Rec7 did not fault\n");
+		goto undelegate_destroy;
+	}
+
+	/* get ESR FAR set by P0 */
+	esr = host_shared_data_get_realm_val(&realm, 0U, 7U, HOST_ARG2_INDEX);
+	far = host_shared_data_get_realm_val(&realm, 0U, 7U, HOST_ARG3_INDEX);
+
+	if ((EC_BITS(esr) != EC_DABORT_LOWER_EL) || (far != base)) {
+		ERROR("Rec7 incorrect ESR=0x%lx\n", esr);
+		goto undelegate_destroy;
+	}
+	INFO("Rec7 ESR=0x%lx\n", esr);
 	res = TEST_RESULT_SUCCESS;
 
 undelegate_destroy:
@@ -1406,21 +1843,25 @@
  * Then Host will inject SEA to realm.
  * Realm exception handler runs and returns ESR back to Host
  * Host validates ESR
+ * Repeat the test for Plane 1
+ * executing instructions in unprotected IPA causes plane exit to P0
+ * data access in unprotected IPA causes rec exit
+ * Host injects SEA to Plane N
  */
 test_result_t host_realm_sea_unprotected(void)
 {
 
 	bool ret1, ret2;
 	test_result_t res = TEST_RESULT_FAIL;
-	u_register_t ret, base, base_ipa, esr;
+	u_register_t ret, base, base_ipa, esr, far;
 	unsigned int host_call_result;
 	u_register_t exit_reason;
 	struct realm realm;
 	struct rtt_entry rtt;
 	struct rmi_rec_run *run;
-	u_register_t feature_flag0 = 0UL;
+	u_register_t feature_flag0 = 0UL, feature_flag1 = 0UL, num_aux_planes = 0U;
 	long sl = RTT_MIN_LEVEL;
-	u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE};
+	u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE};
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
@@ -1429,8 +1870,19 @@
 		sl = RTT_MIN_LEVEL_LPA2;
 	}
 
+	/* Test are skipped if S2POE is not supported to keep test simple */
+	if (are_planes_supported() && is_single_rtt_supported()) {
+		num_aux_planes = 1UL;
+
+		/* use single RTT for all planes */
+		feature_flag0 |= INPLACE(RMI_FEATURE_REGISTER_0_PLANE_RTT,
+			RMI_PLANE_RTT_SINGLE);
+
+		feature_flag1 = RMI_REALM_FLAGS1_RTT_S2AP_ENCODING_INDIRECT;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
-			feature_flag0, 0U, sl, rec_flag, 2U, 0U)) {
+			feature_flag0, feature_flag1, sl, rec_flag, 4U, num_aux_planes)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -1447,8 +1899,8 @@
 	}
 
 	run = (struct rmi_rec_run *)realm.run[0];
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG1_INDEX, base_ipa);
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 1U, HOST_ARG1_INDEX, base_ipa);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG3_INDEX, base_ipa);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 1U, HOST_ARG3_INDEX, base_ipa);
 
 	/* Rec0 expect SEA in realm due to IA unprotected IPA page */
 	ret1 = host_enter_realm_execute(&realm, REALM_INSTR_FETCH_CMD,
@@ -1503,6 +1955,88 @@
 	INFO("Rec1 ESR=0x%lx\n", esr);
 	res = host_call_result;
 
+	if (num_aux_planes == 0U) {
+		goto destroy_realm;
+	}
+
+	INFO("Running test on Plane 1\n");
+
+	run = (struct rmi_rec_run *)realm.run[2U];
+
+	/*
+	 * Arg for Plane0 instruction to enter Plane1 on Rec 2,3
+	 */
+	host_realm_set_aux_plane_args(&realm, 1U, 2U);
+	host_realm_set_aux_plane_args(&realm, 1U, 3U);
+
+
+	/* Test cmd for Plane 1 Rec 2/3 */
+	host_shared_data_set_realm_cmd(&realm, REALM_INSTR_FETCH_CMD, 1U, 2U);
+	host_shared_data_set_realm_cmd(&realm, REALM_DATA_ACCESS_CMD, 1U, 3U);
+
+	/*
+	 * Args for Plane1, Rec 2/3
+	 * Executing base_ipa from plane 1 rec 2, causes plane exit to P0
+	 * Data access from plane 1 rec 3, causes rec exit, host injects SEA
+	 */
+	host_shared_data_set_host_val(&realm, 1U, 2U, HOST_ARG3_INDEX, base_ipa);
+	host_shared_data_set_host_val(&realm, 1U, 3U, HOST_ARG3_INDEX, base_ipa);
+
+	/* Rec2 expect plane exit to P0 due to IA unprotected IPA page */
+	ret1 = host_enter_realm_execute(&realm, REALM_PLANE_N_EXCEPTION_CMD,
+			RMI_EXIT_HOST_CALL, 2U);
+	if (!ret1) {
+		ERROR("Rec2 did not fault\n");
+		goto destroy_realm;
+	}
+
+	/* get ESR/FAR set by P0 */
+	esr = host_shared_data_get_realm_val(&realm, 0U, 2U, HOST_ARG2_INDEX);
+	far = host_shared_data_get_realm_val(&realm, 0U, 2U, HOST_ARG3_INDEX);
+
+	if (((EC_BITS(esr) != EC_IABORT_LOWER_EL) || (far != base_ipa))) {
+		ERROR("Rec2 incorrect ESR=0x%lx far=0x%lx\n", esr, far);
+		goto destroy_realm;
+	}
+	INFO("Rec2 ESR=0x%lx\n", esr);
+
+	run = (struct rmi_rec_run *)realm.run[3U];
+
+	/* Rec3 expect rec exit due to DA unprotected IPA page when HIPAS is UNASSIGNED_NS */
+	ret1 = host_enter_realm_execute(&realm, REALM_ENTER_PLANE_N_CMD,
+			RMI_EXIT_SYNC, 3U);
+
+	if (!ret1 || (run->exit.hpfar >> 4U) != (base_ipa >> PAGE_SIZE_SHIFT)
+		|| (EC_BITS(run->exit.esr) != EC_DABORT_LOWER_EL)
+		|| ((run->exit.esr & ISS_DFSC_MASK) < FSC_L0_TRANS_FAULT)
+		|| ((run->exit.esr & ISS_DFSC_MASK) > FSC_L3_TRANS_FAULT)
+		|| ((run->exit.esr & (1UL << ESR_ISS_EABORT_EA_BIT)) != 0U)) {
+		ERROR("Rec3 did not fault exit=0x%lx ret1=%d HPFAR=0x%lx esr=0x%lx\n",
+				run->exit.exit_reason, ret1, run->exit.hpfar, run->exit.esr);
+		goto destroy_realm;
+	}
+	INFO("Host DA FAR=0x%lx, HPFAR=0x%lx\n", run->exit.far, run->exit.hpfar);
+	INFO("Injecting SEA to Realm PN Rec3\n");
+
+	/* Inject SEA back to Realm P1 Rec3 */
+	run->entry.flags = REC_ENTRY_FLAG_INJECT_SEA;
+
+	/* Rec1 re-entry expect exception handler to run, return ESR */
+	ret = host_realm_rec_enter(&realm, &exit_reason, &host_call_result, 3U);
+	if (ret != RMI_SUCCESS || exit_reason != RMI_EXIT_HOST_CALL) {
+		ERROR("rec3 failed ret=0x%lx exit_reason=0x%lx", ret, run->exit.exit_reason);
+		goto destroy_realm;
+	}
+
+	/* get ESR/FAR set by Realm PN exception handler */
+	esr = host_shared_data_get_realm_val(&realm, 1U, 3U, HOST_ARG2_INDEX);
+	if (((esr & ISS_DFSC_MASK) != DFSC_NO_WALK_SEA) || (EC_BITS(esr) != EC_DABORT_CUR_EL)) {
+		ERROR("Rec3 incorrect ESR=0x%lx\n", esr);
+		goto destroy_realm;
+	}
+	INFO("Rec3 ESR=0x%lx\n", esr);
+	res = host_call_result;
+
 destroy_realm:
 	ret2 = host_destroy_realm(&realm);
 
@@ -2009,8 +2543,8 @@
 	/* IPA outside Realm space */
 	base_ipa = base | (1UL << (EXTRACT(RMI_FEATURE_REGISTER_0_S2SZ,
 					realm.rmm_feat_reg0) + 1U));
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG1_INDEX, base_ipa);
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 1U, HOST_ARG1_INDEX, base_ipa);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG3_INDEX, base_ipa);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 1U, HOST_ARG3_INDEX, base_ipa);
 
 	INFO("base_ipa=0x%lx\n", base_ipa);
 
@@ -2061,8 +2595,8 @@
 
 	INFO("base_ipa=0x%lx\n", base_ipa);
 
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 2U, HOST_ARG1_INDEX, base_ipa);
-	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 3U, HOST_ARG1_INDEX, base_ipa);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 2U, HOST_ARG3_INDEX, base_ipa);
+	host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 3U, HOST_ARG3_INDEX, base_ipa);
 
 	run = (struct rmi_rec_run *)realm.run[2];
 
@@ -2843,7 +3377,7 @@
 		return TEST_RESULT_FAIL;
 	}
 
-	host_shared_data_set_host_val(&realm, 0U, 0U, HOST_ARG1_INDEX, base);
+	host_shared_data_set_host_val(&realm, 0U, 0U, HOST_ARG3_INDEX, base);
 
 	for (unsigned int i = 0U; i < 2U; i++) {
 		host_shared_data_set_host_val(&realm, PRIMARY_PLANE_ID, 0U, HOST_ARG2_INDEX,
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 91e5307..98c567d 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
@@ -44,8 +44,8 @@
 em_cpu_t cortex_A15_errata_list = {
 	.cpu_pn = 0xC0F,
 	.cpu_errata = {
-		{816470, 0x30, 0xFF},
-		{827671, 0x30, 0xFF},
+		{816470, 0x30, 0xFF, 0x00},
+		{827671, 0x30, 0xFF, 0x00},
 		{-1}
 	},
 };
@@ -53,8 +53,8 @@
 em_cpu_t cortex_A17_errata_list = {
 	.cpu_pn = 0xC0E,
 	.cpu_errata = {
-		{852421, 0x00, 0x12},
-		{852423, 0x00, 0x12},
+		{852421, 0x00, 0x12, 0x00},
+		{852423, 0x00, 0x12, 0x00},
 		{-1}
 	},
 };
@@ -62,7 +62,7 @@
 em_cpu_t cortex_A9_errata_list = {
 	.cpu_pn = 0xC09,
 	.cpu_errata = {
-		{790473, 0x00, 0xFF},
+		{790473, 0x00, 0xFF, 0x00},
 		{-1}
 	},
 };
@@ -70,8 +70,8 @@
 em_cpu_t cortex_A35_errata_list = {
 	.cpu_pn = 0xD04,
 	.cpu_errata = {
-		{855472, 0x00, 0x00},
-		{1234567, 0x00, 0x00},
+		{855472, 0x00, 0x00, 0x00},
+		{1234567, 0x00, 0x00, 0x00},
 		{-1}
 	},
 };
@@ -79,15 +79,15 @@
 em_cpu_t cortex_A53_errata_list = {
 	.cpu_pn = 0xD03,
 	.cpu_errata = {
-		{819472, 0x00, 0x01},
-		{824069, 0x00, 0x02},
-		{826319, 0x00, 0x02},
-		{827319, 0x00, 0x02},
-		{835769, 0x00, 0x04},
-		{836870, 0x00, 0x03},
-		{843419, 0x00, 0x04},
-		{855873, 0x03, 0xFF},
-		{1530924, 0x00, 0xFF},
+		{819472, 0x00, 0x01, 0x00},
+		{824069, 0x00, 0x02, 0x00},
+		{826319, 0x00, 0x02, 0x00},
+		{827319, 0x00, 0x02, 0x00},
+		{835769, 0x00, 0x04, 0x00},
+		{836870, 0x00, 0x03, 0x00},
+		{843419, 0x00, 0x04, 0x00},
+		{855873, 0x03, 0xFF, 0x00},
+		{1530924, 0x00, 0xFF, 0x00},
 		{-1}
 	},
 };
@@ -95,13 +95,13 @@
 em_cpu_t cortex_A55_errata_list = {
 	.cpu_pn = 0xD05,
 	.cpu_errata = {
-		{768277, 0x00, 0x00},
-		{778703, 0x00, 0x00},
-		{798797, 0x00, 0x00},
-		{846532, 0x00, 0x01},
-		{903758, 0x00, 0x01},
-		{1221012, 0x00, 0x10},
-		{1530923, 0x00, 0xFF},
+		{768277, 0x00, 0x00, 0x00},
+		{778703, 0x00, 0x00, 0x00},
+		{798797, 0x00, 0x00, 0x00},
+		{846532, 0x00, 0x01, 0x00},
+		{903758, 0x00, 0x01, 0x00},
+		{1221012, 0x00, 0x10, 0x00},
+		{1530923, 0x00, 0xFF, 0x00},
 		{-1}
 	},
 };
@@ -109,18 +109,18 @@
 em_cpu_t cortex_A57_errata_list = {
 	.cpu_pn = 0xD07,
 	.cpu_errata = {
-		{806969, 0x00, 0x00},
-		{813419, 0x00, 0x00},
-		{813420, 0x00, 0x00},
-		{814670, 0x00, 0x00},
-		{817169, 0x00, 0x01},
-		{826974, 0x00, 0x11},
-		{826977, 0x00, 0x11},
-		{828024, 0x00, 0x11},
-		{829520, 0x00, 0x12},
-		{833471, 0x00, 0x12},
-		{859972, 0x00, 0x13},
-		{1319537, 0x00, 0xFF},
+		{806969, 0x00, 0x00, 0x00},
+		{813419, 0x00, 0x00, 0x00},
+		{813420, 0x00, 0x00, 0x00},
+		{814670, 0x00, 0x00, 0x00},
+		{817169, 0x00, 0x01, 0x00},
+		{826974, 0x00, 0x11, 0x00},
+		{826977, 0x00, 0x11, 0x00},
+		{828024, 0x00, 0x11, 0x00},
+		{829520, 0x00, 0x12, 0x00},
+		{833471, 0x00, 0x12, 0x00},
+		{859972, 0x00, 0x13, 0x00},
+		{1319537, 0x00, 0xFF, 0x00},
 		{-1}
 	},
 };
@@ -128,10 +128,10 @@
 em_cpu_t cortex_A72_errata_list = {
 	.cpu_pn = 0xD08,
 	.cpu_errata = {
-		{859971, 0x00, 0x03},
-		{1234567, 0x00, 0xFF},
-		{1319367, 0x00, 0xFF},
-		{9876543, 0x00, 0xFF},
+		{859971, 0x00, 0x03, 0x00},
+		{1234567, 0x00, 0xFF, 0x00},
+		{1319367, 0x00, 0xFF, 0x00},
+		{9876543, 0x00, 0xFF, 0x00},
 		{-1}
 	},
 };
@@ -139,8 +139,8 @@
 em_cpu_t cortex_A73_errata_list = {
 	.cpu_pn = 0xD09,
 	.cpu_errata = {
-		{852427, 0x00, 0x00},
-		{855423, 0x00, 0x01},
+		{852427, 0x00, 0x00, 0x00},
+		{855423, 0x00, 0x01, 0x00},
 		{-1}
 	},
 };
@@ -148,8 +148,8 @@
 em_cpu_t cortex_A75_errata_list = {
 	.cpu_pn = 0xD0A,
 	.cpu_errata = {
-		{764081, 0x00, 0x00},
-		{790748, 0x00, 0x00},
+		{764081, 0x00, 0x00, 0x00},
+		{790748, 0x00, 0x00, 0x00},
 		{-1}
 	},
 };
@@ -157,19 +157,19 @@
 em_cpu_t cortex_A76_errata_list = {
 	.cpu_pn = 0xD0B,
 	.cpu_errata = {
-		{1073348, 0x00, 0x10},
-		{1130799, 0x00, 0x20},
-		{1165522, 0x00, 0xFF},
-		{1220197, 0x00, 0x20},
-		{1257314, 0x00, 0x30},
-		{1262606, 0x00, 0x30},
-		{1262888, 0x00, 0x30},
-		{1275112, 0x00, 0x30},
-		{1286807, 0x00, 0x30},
-		{1791580, 0x00, 0x40},
-		{1868343, 0x00, 0x40},
-		{1946160, 0x30, 0x41},
-		{2743102, 0x00, 0x41},
+		{1073348, 0x00, 0x10, 0x00},
+		{1130799, 0x00, 0x20, 0x00},
+		{1165522, 0x00, 0xFF, 0x00},
+		{1220197, 0x00, 0x20, 0x00},
+		{1257314, 0x00, 0x30, 0x00},
+		{1262606, 0x00, 0x30, 0x00},
+		{1262888, 0x00, 0x30, 0x00},
+		{1275112, 0x00, 0x30, 0x00},
+		{1286807, 0x00, 0x30, 0x00},
+		{1791580, 0x00, 0x40, 0x00},
+		{1868343, 0x00, 0x40, 0x00},
+		{1946160, 0x30, 0x41, 0x00},
+		{2743102, 0x00, 0x41, 0x00},
 		{-1}
 	},
 };
@@ -177,13 +177,13 @@
 em_cpu_t cortex_A77_errata_list = {
 	.cpu_pn = 0xD0D,
 	.cpu_errata = {
-		{1508412, 0x00, 0x10},
-		{1791578, 0x00, 0x11},
-		{1800714, 0x00, 0x11},
-		{1925769, 0x00, 0x11},
-		{1946167, 0x00, 0x11},
-		{2356587, 0x00, 0x11},
-		{2743100, 0x00, 0x11},
+		{1508412, 0x00, 0x10, 0x00},
+		{1791578, 0x00, 0x11, 0x00},
+		{1800714, 0x00, 0x11, 0x00},
+		{1925769, 0x00, 0x11, 0x00},
+		{1946167, 0x00, 0x11, 0x00},
+		{2356587, 0x00, 0x11, 0x00},
+		{2743100, 0x00, 0x11, 0x00},
 		{-1}
 	},
 };
@@ -191,11 +191,11 @@
 em_cpu_t cortex_A78_AE_errata_list = {
 	.cpu_pn = 0xD42,
 	.cpu_errata = {
-		{1941500, 0x00, 0x01},
-		{1951502, 0x00, 0x01},
-		{2376748, 0x00, 0x01},
-		{2712574, 0x00, 0x02},
-		{2395408, 0x00, 0x01},
+		{1941500, 0x00, 0x01, 0x00},
+		{1951502, 0x00, 0x01, 0x00},
+		{2376748, 0x00, 0x01, 0x00},
+		{2712574, 0x00, 0x02, 0x00},
+		{2395408, 0x00, 0x01, 0x00},
 		{-1}
 	},
 };
@@ -203,19 +203,19 @@
 em_cpu_t cortex_A78_errata_list = {
 	.cpu_pn = 0xD41,
 	.cpu_errata = {
-		{1688305, 0x00, 0x10},
-		{1821534, 0x00, 0x10},
-		{1941498, 0x00, 0x11},
-		{1951500, 0x10, 0x11},
-		{1952683, 0x00, 0x00},
-		{2132060, 0x00, 0x12},
-		{2242635, 0x10, 0x12},
-		{2376745, 0x00, 0x12},
-		{2395406, 0x00, 0x12},
-		{2712571, 0x00, 0x12},
-		{2742426, 0x00, 0x12},
-		{2772019, 0x00, 0x12},
-		{2779479, 0x00, 0x12},
+		{1688305, 0x00, 0x10, 0x00},
+		{1821534, 0x00, 0x10, 0x00},
+		{1941498, 0x00, 0x11, 0x00},
+		{1951500, 0x10, 0x11, 0x00},
+		{1952683, 0x00, 0x00, 0x00},
+		{2132060, 0x00, 0x12, 0x00},
+		{2242635, 0x10, 0x12, 0x00},
+		{2376745, 0x00, 0x12, 0x00},
+		{2395406, 0x00, 0x12, 0x00},
+		{2712571, 0x00, 0x12, 0x00},
+		{2742426, 0x00, 0x12, 0x00},
+		{2772019, 0x00, 0x12, 0x00},
+		{2779479, 0x00, 0x12, 0x00},
 		{-1}
 	},
 };
@@ -223,17 +223,17 @@
 em_cpu_t cortex_A78C_errata_list = {
 	.cpu_pn = 0xD4B,
 	.cpu_errata = {
-		{1827430, 0x00, 0x00},
-		{1827440, 0x00, 0x00},
-		{2132064, 0x01, 0x02},
-		{2242638, 0x01, 0x02},
-		{2376749, 0x01, 0x02},
-		{2395411, 0x01, 0x02},
-		{2683027, 0x01, 0x02},
-		{2712575, 0x01, 0x02},
-		{2743232, 0x01, 0x02},
-		{2772121, 0x00, 0x02},
-		{2779484, 0x01, 0x02},
+		{1827430, 0x00, 0x00, 0x00},
+		{1827440, 0x00, 0x00, 0x00},
+		{2132064, 0x01, 0x02, 0x00},
+		{2242638, 0x01, 0x02, 0x00},
+		{2376749, 0x01, 0x02, 0x00},
+		{2395411, 0x01, 0x02, 0x00},
+		{2683027, 0x01, 0x02, 0x00},
+		{2712575, 0x01, 0x02, 0x00},
+		{2743232, 0x01, 0x02, 0x00},
+		{2772121, 0x00, 0x02, 0x00},
+		{2779484, 0x01, 0x02, 0x00},
 		{-1}
 	},
 };
@@ -242,9 +242,9 @@
 em_cpu_t cortex_X1_errata_list = {
 	.cpu_pn = 0xD44,
 	.cpu_errata = {
-		{1688305, 0x00, 0x10},
-		{1821534, 0x00, 0x10},
-		{1827429, 0x00, 0x10},
+		{1688305, 0x00, 0x10, 0x00},
+		{1821534, 0x00, 0x10, 0x00},
+		{1827429, 0x00, 0x10, 0x00},
 		{-1}
 	},
 
@@ -253,21 +253,21 @@
 em_cpu_t neoverse_N1_errata_list = {
 	.cpu_pn = 0xD0C,
 	.cpu_errata = {
-		{1043202, 0x00, 0x10},
-		{1073348, 0x00, 0x10},
-		{1130799, 0x00, 0x20},
-		{1165347, 0x00, 0x20},
-		{1207823, 0x00, 0x20},
-		{1220197, 0x00, 0x20},
-		{1257314, 0x00, 0x30},
-		{1262606, 0x00, 0x30},
-		{1262888, 0x00, 0x30},
-		{1275112, 0x00, 0x30},
-		{1315703, 0x00, 0x30},
-		{1542419, 0x30, 0x40},
-		{1868343, 0x00, 0x40},
-		{1946160, 0x30, 0x41},
-		{2743102, 0x00, 0x41},
+		{1043202, 0x00, 0x10, 0x00},
+		{1073348, 0x00, 0x10, 0x00},
+		{1130799, 0x00, 0x20, 0x00},
+		{1165347, 0x00, 0x20, 0x00},
+		{1207823, 0x00, 0x20, 0x00},
+		{1220197, 0x00, 0x20, 0x00},
+		{1257314, 0x00, 0x30, 0x00},
+		{1262606, 0x00, 0x30, 0x00},
+		{1262888, 0x00, 0x30, 0x00},
+		{1275112, 0x00, 0x30, 0x00},
+		{1315703, 0x00, 0x30, 0x00},
+		{1542419, 0x30, 0x40, 0x01},
+		{1868343, 0x00, 0x40, 0x00},
+		{1946160, 0x30, 0x41, 0x00},
+		{2743102, 0x00, 0x41, 0x00},
 		{-1}
 	},
 };
@@ -275,23 +275,23 @@
 em_cpu_t neoverse_V1_errata_list = {
 	.cpu_pn = 0xD40,
 	.cpu_errata = {
-		{1618635, 0x00, 0x0F},
-		{1774420, 0x00, 0x10},
-		{1791573, 0x00, 0x10},
-		{1852267, 0x00, 0x10},
-		{1925756, 0x00, 0x11},
-		{1940577, 0x10, 0x11},
-		{1966096, 0x10, 0x11},
-		{2108267, 0x00, 0x11},
-		{2139242, 0x00, 0x11},
-		{2216392, 0x10, 0x11},
-		{2294912, 0x00, 0x11},
-		{2348377, 0x00, 0x11},
-		{2372203, 0x00, 0x11},
-		{2701953, 0x00, 0x11},
-		{2743093, 0x00, 0x12},
-		{2743233, 0x00, 0x12},
-		{2779461, 0x00, 0x12},
+		{1618635, 0x00, 0x0F, 0x00},
+		{1774420, 0x00, 0x10, 0x00},
+		{1791573, 0x00, 0x10, 0x00},
+		{1852267, 0x00, 0x10, 0x00},
+		{1925756, 0x00, 0x11, 0x00},
+		{1940577, 0x10, 0x11, 0x00},
+		{1966096, 0x10, 0x11, 0x00},
+		{2108267, 0x00, 0x11, 0x00},
+		{2139242, 0x00, 0x11, 0x00},
+		{2216392, 0x10, 0x11, 0x00},
+		{2294912, 0x00, 0x11, 0x00},
+		{2348377, 0x00, 0x11, 0x00},
+		{2372203, 0x00, 0x11, 0x00},
+		{2701953, 0x00, 0x11, 0x00},
+		{2743093, 0x00, 0x12, 0x00},
+		{2743233, 0x00, 0x12, 0x00},
+		{2779461, 0x00, 0x12, 0x00},
 		{-1}
 	},
 };
@@ -299,24 +299,24 @@
 em_cpu_t cortex_A710_errata_list = {
 	.cpu_pn = 0xD47,
 	.cpu_errata = {
-		{1987031, 0x00, 0x20},
-		{2008768, 0x00, 0x20},
-		{2017096, 0x00, 0x20},
-		{2055002, 0x10, 0x20},
-		{2058056, 0x00, 0x10},
-		{2081180, 0x00, 0x20},
-		{2083908, 0x20, 0x20},
-		{2136059, 0x00, 0x20},
-		{2147715, 0x20, 0x20},
-		{2216384, 0x00, 0x20},
-		{2267065, 0x00, 0x20},
-		{2282622, 0x00, 0x21},
-		{2291219, 0x00, 0x20},
-		{2371105, 0x00, 0x20},
-		{2701952, 0x00, 0x21},
-		{2742423, 0x00, 0x21},
-		{2768515, 0x00, 0x21},
-		{2778471, 0x00, 0x21},
+		{1987031, 0x00, 0x20, 0x00},
+		{2008768, 0x00, 0x20, 0x00},
+		{2017096, 0x00, 0x20, 0x00},
+		{2055002, 0x10, 0x20, 0x00},
+		{2058056, 0x00, 0x10, 0x00},
+		{2081180, 0x00, 0x20, 0x00},
+		{2083908, 0x20, 0x20, 0x00},
+		{2136059, 0x00, 0x20, 0x00},
+		{2147715, 0x20, 0x20, 0x00},
+		{2216384, 0x00, 0x20, 0x00},
+		{2267065, 0x00, 0x20, 0x00},
+		{2282622, 0x00, 0x21, 0x00},
+		{2291219, 0x00, 0x20, 0x00},
+		{2371105, 0x00, 0x20, 0x00},
+		{2701952, 0x00, 0x21, 0x00},
+		{2742423, 0x00, 0x21, 0x00},
+		{2768515, 0x00, 0x21, 0x00},
+		{2778471, 0x00, 0x21, 0x00},
 		{-1}
 	},
 };
@@ -324,22 +324,22 @@
 em_cpu_t neoverse_N2_errata_list = {
 	.cpu_pn = 0xD49,
 	.cpu_errata = {
-		{2002655, 0x00, 0x00},
-		{2025414, 0x00, 0x00},
-		{2067956, 0x00, 0x00},
-		{2138953, 0x00, 0x00},
-		{2138956, 0x00, 0x00},
-		{2138958, 0x00, 0x00},
-		{2189731, 0x00, 0x00},
-		{2242400, 0x00, 0x00},
-		{2242415, 0x00, 0x00},
-		{2280757, 0x00, 0x00},
-		{2326639, 0x00, 0x00},
-		{2376738, 0x00, 0x00},
-		{2388450, 0x00, 0x00},
-		{2728475, 0x00, 0x02},
-		{2743089, 0x00, 0x02},
-		{2779511, 0x00, 0x02},
+		{2002655, 0x00, 0x00, 0x00},
+		{2025414, 0x00, 0x00, 0x00},
+		{2067956, 0x00, 0x00, 0x00},
+		{2138953, 0x00, 0x00, 0x00},
+		{2138956, 0x00, 0x00, 0x00},
+		{2138958, 0x00, 0x00, 0x00},
+		{2189731, 0x00, 0x00, 0x00},
+		{2242400, 0x00, 0x00, 0x00},
+		{2242415, 0x00, 0x00, 0x00},
+		{2280757, 0x00, 0x00, 0x00},
+		{2326639, 0x00, 0x00, 0x00},
+		{2376738, 0x00, 0x00, 0x00},
+		{2388450, 0x00, 0x00, 0x00},
+		{2728475, 0x00, 0x02, 0x00},
+		{2743089, 0x00, 0x02, 0x00},
+		{2779511, 0x00, 0x02, 0x00},
 		{-1}
 	},
 };
@@ -347,19 +347,19 @@
 em_cpu_t cortex_X2_errata_list = {
 	.cpu_pn = 0xD48,
 	.cpu_errata = {
-		{2002765, 0x00, 0x20},
-		{2017096, 0x00, 0x20},
-		{2058056, 0x00, 0x20},
-		{2081180, 0x00, 0x20},
-		{2083908, 0x00, 0x20},
-		{2147715, 0x20, 0x20},
-		{2216384, 0x00, 0x20},
-		{2282622, 0x00, 0x21},
-		{2371105, 0x00, 0x21},
-		{2701952, 0x00, 0x21},
-		{2742423, 0x00, 0x21},
-		{2768515, 0x00, 0x21},
-		{2778471, 0x00, 0x21},
+		{2002765, 0x00, 0x20, 0x00},
+		{2017096, 0x00, 0x20, 0x00},
+		{2058056, 0x00, 0x20, 0x00},
+		{2081180, 0x00, 0x20, 0x00},
+		{2083908, 0x00, 0x20, 0x00},
+		{2147715, 0x20, 0x20, 0x00},
+		{2216384, 0x00, 0x20, 0x00},
+		{2282622, 0x00, 0x21, 0x00},
+		{2371105, 0x00, 0x21, 0x00},
+		{2701952, 0x00, 0x21, 0x00},
+		{2742423, 0x00, 0x21, 0x00},
+		{2768515, 0x00, 0x21, 0x00},
+		{2778471, 0x00, 0x21, 0x00},
 		{-1}
 	},
 };
@@ -367,19 +367,19 @@
 em_cpu_t cortex_A510_errata_list = {
 	.cpu_pn = 0xD46,
 	.cpu_errata = {
-		{1922240, 0x00, 0x00},
-		{2041909, 0x02, 0x02},
-		{2042739, 0x00, 0x02},
-		{2080326, 0x02, 0x02},
-		{2172148, 0x00, 0x10},
-		{2218950, 0x00, 0x10},
-		{2250311, 0x00, 0x10},
-		{2288014, 0x00, 0x10},
-		{2347730, 0x00, 0x11},
-		{2371937, 0x00, 0x11},
-		{2666669, 0x00, 0x11},
-		{2684597, 0x00, 0x12},
-		{1234567, 0x00, 0x12},
+		{1922240, 0x00, 0x00, 0x00},
+		{2041909, 0x02, 0x02, 0x00},
+		{2042739, 0x00, 0x02, 0x00},
+		{2080326, 0x02, 0x02, 0x00},
+		{2172148, 0x00, 0x10, 0x00},
+		{2218950, 0x00, 0x10, 0x00},
+		{2250311, 0x00, 0x10, 0x00},
+		{2288014, 0x00, 0x10, 0x00},
+		{2347730, 0x00, 0x11, 0x00},
+		{2371937, 0x00, 0x11, 0x00},
+		{2666669, 0x00, 0x11, 0x00},
+		{2684597, 0x00, 0x12, 0x00},
+		{1234567, 0x00, 0x12, 0x00},
 		{-1}
 	},
 };
@@ -387,14 +387,14 @@
 em_cpu_t cortex_X4_errata_list = {
 	.cpu_pn = 0xD82,
 	.cpu_errata = {
-		{2726228, 0x00, 0x01},
-		{2740089, 0x00, 0x01},
-		{2763018, 0x00, 0x01},
-		{2816013, 0x00, 0x01},
-		{2897503, 0x00, 0x01},
-		{2923985, 0x00, 0x01},
-		{2957258, 0x00, 0x01},
-		{3076789, 0x00, 0x01},
+		{2726228, 0x00, 0x01, 0x00},
+		{2740089, 0x00, 0x01, 0x00},
+		{2763018, 0x00, 0x01, 0x00},
+		{2816013, 0x00, 0x01, 0x00},
+		{2897503, 0x00, 0x01, 0x00},
+		{2923985, 0x00, 0x01, 0x00},
+		{2957258, 0x00, 0x01, 0x00},
+		{3076789, 0x00, 0x01, 0x00},
 		{-1}
 	},
 };
@@ -402,8 +402,8 @@
 em_cpu_t cortex_X925_errata_list = {
 	.cpu_pn = 0xD85,
 	.cpu_errata = {
-		{2963999, 0x00, 0x00},
-		{3701747, 0x00, 0x01},
+		{2963999, 0x00, 0x00, 0x00},
+		{3701747, 0x00, 0x01, 0x00},
 		{-1}
 	},
 };
@@ -411,7 +411,7 @@
 em_cpu_t cortex_A715_errata_list = {
 	.cpu_pn = 0xD4D,
 	.cpu_errata = {
-		{2561034, 0x10, 0x10},
+		{2561034, 0x10, 0x10, 0x00},
 		{-1}
 	},
 };
@@ -419,15 +419,15 @@
 em_cpu_t neoverse_V2_errata_list = {
 	.cpu_pn = 0xD4F,
 	.cpu_errata = {
-		{2331132, 0x00, 0x02},
-		{2618597, 0x00, 0x01},
-		{2662553, 0x00, 0x01},
-		{2719103, 0x00, 0x01},
-		{2719103, 0x00, 0x01},
-		{2719105, 0x00, 0x01},
-		{2743011, 0x00, 0x01},
-		{2779510, 0x00, 0x01},
-		{2801372, 0x00, 0x01},
+		{2331132, 0x00, 0x02, 0x00},
+		{2618597, 0x00, 0x01, 0x00},
+		{2662553, 0x00, 0x01, 0x00},
+		{2719103, 0x00, 0x01, 0x00},
+		{2719103, 0x00, 0x01, 0x00},
+		{2719105, 0x00, 0x01, 0x00},
+		{2743011, 0x00, 0x01, 0x00},
+		{2779510, 0x00, 0x01, 0x00},
+		{2801372, 0x00, 0x01, 0x00},
 		{-1}
 	},
 };
@@ -435,16 +435,16 @@
 em_cpu_t cortex_X3_errata_list = {
 	.cpu_pn = 0xD4E,
 	.cpu_errata = {
-		{2070301, 0x00, 0x12},
-		{2266875, 0x00, 0x10},
-		{2302506, 0x00, 0x11},
-		{2313909, 0x00, 0x10},
-		{2615812, 0x00, 0x11},
-		{2641945, 0x00, 0x10},
-		{2701951, 0x00, 0x11},
-		{2742421, 0x00, 0x11},
-		{2743088, 0x00, 0x11},
-		{2779509, 0x00, 0x11},
+		{2070301, 0x00, 0x12, 0x00},
+		{2266875, 0x00, 0x10, 0x00},
+		{2302506, 0x00, 0x11, 0x00},
+		{2313909, 0x00, 0x10, 0x00},
+		{2615812, 0x00, 0x11, 0x00},
+		{2641945, 0x00, 0x10, 0x00},
+		{2701951, 0x00, 0x11, 0x00},
+		{2742421, 0x00, 0x11, 0x00},
+		{2743088, 0x00, 0x11, 0x00},
+		{2779509, 0x00, 0x11, 0x00},
 		{-1}
 	},
 };
@@ -452,8 +452,8 @@
 em_cpu_t cortex_A520_errata_list = {
 	.cpu_pn = 0xD80,
 	.cpu_errata = {
-		{2630792, 0x00, 0x01},
-		{2858100, 0x00, 0x01},
+		{2630792, 0x00, 0x01, 0x00},
+		{2858100, 0x00, 0x01, 0x00},
 		{-1}
 	},
 };
@@ -514,6 +514,10 @@
 
 	INFO("Partnum extracted = %x and rxpx extracted val = %x\n\n", midr_val, \
 							rxpx_val_extracted);
+
+	/* Signal to the lead CPU that the calling CPU has entered the test */
+	tftf_send_event(&cpu_has_entered_test[core_pos]);
+
 	switch (midr_val) {
 	case 0xD09:
 	{
@@ -695,9 +699,11 @@
 		}
 		case EM_HIGHER_EL_MITIGATION:
 		{
-			return_val = (RXPX_RANGE(rxpx_val_extracted, \
+			return_val = ((RXPX_RANGE(rxpx_val_extracted, \
 			cpu_ptr->cpu_errata[i].rxpx_low, cpu_ptr->cpu_errata[i].rxpx_high) \
-				== true) ? TEST_RESULT_SUCCESS : TEST_RESULT_FAIL;
+				== true) && (!cpu_ptr->cpu_errata[i].split_wa)) ? \
+				     TEST_RESULT_SUCCESS : TEST_RESULT_FAIL;
+
 			break;
 		}
 		case EM_UNKNOWN_ERRATUM:
@@ -714,9 +720,11 @@
 		}
 		INFO("errata_id = %d and test_em_cpu_erratum_features = %ld\n",\
 			cpu_ptr->cpu_errata[i].em_errata_id, ret_val.ret0);
+
+		if(return_val == TEST_RESULT_FAIL)
+			return TEST_RESULT_FAIL;
 	}
-	/* 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;
 }
 
@@ -728,6 +736,8 @@
 
 	int32_t version_return = tftf_em_abi_version();
 
+	test_result_t return_val = TEST_RESULT_FAIL;
+
 	SKIP_TEST_IF_LESS_THAN_N_CPUS(1);
 
 	if (version_return == EM_NOT_SUPPORTED) {
@@ -738,6 +748,9 @@
 		return TEST_RESULT_FAIL;
 	}
 
+	/* Run test on lead cpu */
+	return_val = test_em_cpu_features();
+
 	lead_mpid = read_mpidr_el1() & MPID_MASK;
 	/* Power on all CPUs */
 	for_each_cpu(cpu_node) {
@@ -757,5 +770,5 @@
 		core_pos = platform_get_core_pos(cpu_mpid);
 		tftf_wait_for_event(&cpu_has_entered_test[core_pos]);
 	}
-	return TEST_RESULT_SUCCESS;
+	return return_val;
 }
diff --git a/tftf/tests/tests-realm-payload.xml b/tftf/tests/tests-realm-payload.xml
index 277e6db..92eaf5a 100644
--- a/tftf/tests/tests-realm-payload.xml
+++ b/tftf/tests/tests-realm-payload.xml
@@ -14,6 +14,8 @@
 	  function="host_test_realm_create_planes_enter_single_rtt" />
 	  <testcase name="Realm Planes register read/write test"
 	  function="host_test_realm_create_planes_register_rw" />
+	  <testcase name="Realm payload Planes multi rec multiple cpu"
+	  function="host_realm_multi_planes_multi_rec_multiple_cpu" />
 	  <testcase name="Realm EL1 creation and execution test"
 	  function="host_test_realm_create_enter" />
 	  <testcase name="Realm RTT fold unfold test Unassigned Empty"