feat(rmi): add specific tests for FEAT_LPA2 on RMI tests

This patch also adds four new tests for RMM:

  * Test realm creation with no FEAT_LPA2 and -1 RTT starting level
  * Test realm creation with no FEAT_LPA2 and S2SZ > 48 bits
  * Test creating a realm with FEAT_LPA2 disabled but
    FEAT_LPA2 is present on platform
  * Test creating a realm with FEAT_LPA2 enabled but FEAT_LPA2
    is not present on platform.

Signed-off-by: Javier Almansa Sobrino <javier.almansasobrino@arm.com>
Change-Id: I6c017a16cb5511977bb37f5e146afd5e60b06b97
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_lpa2_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_lpa2_tests.c
new file mode 100644
index 0000000..58014e8
--- /dev/null
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_lpa2_tests.c
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2023, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <debug.h>
+#include <test_helpers.h>
+
+#include <host_realm_helper.h>
+#include <host_realm_mem_layout.h>
+
+static struct realm realm;
+
+/*
+ * @Test_Aim@ Test realm creation with no LPA2 and -1 RTT starting level
+ */
+test_result_t host_test_realm_no_lpa2_invalid_sl(void)
+{
+	u_register_t rec_flag[1] = {RMI_RUNNABLE};
+
+	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+
+	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
+			(u_register_t)PAGE_POOL_BASE,
+			(u_register_t)PAGE_POOL_MAX_SIZE,
+			0UL, RTT_MIN_LEVEL_LPA2, rec_flag, 1U)) {
+		return TEST_RESULT_SUCCESS;
+	}
+
+	(void)host_destroy_realm(&realm);
+	return TEST_RESULT_FAIL;
+}
+
+/*
+ * @Test_Aim@ Test realm creation with no LPA2 and S2SZ > 48 bits
+ */
+test_result_t host_test_realm_no_lpa2_invalid_s2sz(void)
+{
+	u_register_t rec_flag[1] = {RMI_RUNNABLE};
+
+	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+
+	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
+			(u_register_t)PAGE_POOL_BASE,
+			(u_register_t)PAGE_POOL_MAX_SIZE,
+			INPLACE(RMI_FEATURE_REGISTER_0_S2SZ, 50UL),
+			RTT_MIN_LEVEL, rec_flag, 1U)) {
+		return TEST_RESULT_SUCCESS;
+	}
+
+	(void)host_destroy_realm(&realm);
+	return TEST_RESULT_FAIL;
+}
+
+/*
+ * @Test_Aim@ Test creating a Realm with LPA2 disabled but FEAT_LPA2 present
+ * on the platform.
+ * The Realm creation should succeed.
+ */
+test_result_t host_test_non_lpa2_realm_on_lpa2plat(void)
+{
+	u_register_t rec_flag[1] = {RMI_RUNNABLE};
+	struct realm realm;
+
+	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+
+	if (is_feat_52b_on_4k_2_supported() == false) {
+		return TEST_RESULT_SKIPPED;
+	}
+
+	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
+			(u_register_t)PAGE_POOL_BASE,
+			(u_register_t)PAGE_POOL_MAX_SIZE,
+			INPLACE(RMI_FEATURE_REGISTER_0_S2SZ, 48UL),
+			RTT_MIN_LEVEL, rec_flag, 1U)) {
+		return TEST_RESULT_FAIL;
+	}
+
+	if (!host_destroy_realm(&realm)) {
+		ERROR("%s(): failed to destroy realm\n", __func__);
+		return TEST_RESULT_FAIL;
+	}
+
+	return TEST_RESULT_SUCCESS;
+}
+
+/*
+ * @Test_Aim@ Test creating a Realm payload with LPA2 enabled on a platform
+ * which does not implement FEAT_LPA2.
+ * Realm creation must fail.
+ */
+test_result_t host_test_lpa2_realm_on_non_lpa2plat(void)
+{
+	u_register_t rec_flag[1] = {RMI_RUNNABLE};
+	struct realm realm;
+	u_register_t feature_flag = INPLACE(RMI_FEATURE_REGISTER_0_S2SZ, 48UL);
+
+	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		return TEST_RESULT_SKIPPED;
+	} else {
+		feature_flag |= RMI_FEATURE_REGISTER_0_LPA2;
+	}
+
+	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
+			(u_register_t)PAGE_POOL_BASE,
+			(u_register_t)PAGE_POOL_MAX_SIZE,
+			feature_flag, RTT_MIN_LEVEL, rec_flag, 1U)) {
+		return TEST_RESULT_SUCCESS;
+	}
+
+	(void)host_destroy_realm(&realm);
+	return TEST_RESULT_FAIL;
+}
+
diff --git a/tftf/tests/tests-realm-payload.mk b/tftf/tests/tests-realm-payload.mk
index a6d4d47..4d92552 100644
--- a/tftf/tests/tests-realm-payload.mk
+++ b/tftf/tests/tests-realm-payload.mk
@@ -14,6 +14,7 @@
 		host_realm_payload_tests.c				\
 		host_realm_spm.c					\
 		host_realm_payload_simd_tests.c				\
+		host_realm_lpa2_tests.c					\
 	)
 
 TESTS_SOURCES	+=							\
diff --git a/tftf/tests/tests-realm-payload.xml b/tftf/tests/tests-realm-payload.xml
index 7eba425..a4c12ad 100644
--- a/tftf/tests/tests-realm-payload.xml
+++ b/tftf/tests/tests-realm-payload.xml
@@ -117,5 +117,14 @@
 	  function="host_realm_pauth_fault" />
 	  <testcase name="Check if DIT Bit is preserved in RL/NS"
 	  function="host_realm_enable_dit" />
+	  <!-- Test case related to FEAT_LPA2 -->
+	  <testcase name="Test realm creation with no FEAT_LPA2 and -1 RTT starting level"
+	  function="host_test_realm_no_lpa2_invalid_sl" />
+	  <testcase name="Test realm creation with no FEAT_LPA2 and S2SZ > 48 bits"
+	  function="host_test_realm_no_lpa2_invalid_s2sz" />
+	  <testcase name="Test Realm creation with LPA2 disabled but FEAT_LPA2 present on platform"
+	  function="host_test_non_lpa2_realm_on_lpa2plat" />
+	  <testcase name="Test Realm creation with LPA2 enabled but FEAT_LPA2 absent on platform"
+	  function="host_test_lpa2_realm_on_non_lpa2plat" />
   </testsuite>
 </testsuites>