Merge "docs: update toolchain requirements"
diff --git a/include/lib/xlat_tables/xlat_tables_defs.h b/include/lib/xlat_tables/xlat_tables_defs.h
index c9b91cc..cde10da 100644
--- a/include/lib/xlat_tables/xlat_tables_defs.h
+++ b/include/lib/xlat_tables/xlat_tables_defs.h
@@ -196,7 +196,6 @@
  * For Normal WB cacheability attribute, set bit[4] to 1 and bits[3:2] to 0b10.
  */
 #define S2TTE_MEMATTR_FWB_NORMAL_WB	((1UL << 4) | (2UL << 2))
-#define S2TTE_ATTR_FWB_WB_RW_LPA2	(S2TTE_MEMATTR_FWB_NORMAL_WB | S2TTE_AP_RW)
-#define S2TTE_ATTR_FWB_WB_RW		(S2TTE_ATTR_FWB_WB_RW_LPA2 | S2TTE_SH_IS)
+#define S2TTE_ATTR_FWB_WB_RW		(S2TTE_MEMATTR_FWB_NORMAL_WB | S2TTE_AP_RW)
 
 #endif /* XLAT_TABLES_DEFS_H */
diff --git a/include/runtime_services/host_realm_managment/host_realm_rmi.h b/include/runtime_services/host_realm_managment/host_realm_rmi.h
index 5cb0292..484deeb 100644
--- a/include/runtime_services/host_realm_managment/host_realm_rmi.h
+++ b/include/runtime_services/host_realm_managment/host_realm_rmi.h
@@ -293,19 +293,23 @@
 #define RMI_FEATURE_REGISTER_0_SVE_VL_SHIFT		10UL
 #define RMI_FEATURE_REGISTER_0_SVE_VL_WIDTH		4UL
 #define RMI_FEATURE_REGISTER_0_NUM_BPS_SHIFT		14UL
-#define RMI_FEATURE_REGISTER_0_NUM_BPS_WIDTH		4UL
-#define RMI_FEATURE_REGISTER_0_NUM_WPS_SHIFT		18UL
-#define RMI_FEATURE_REGISTER_0_NUM_WPS_WIDTH		4UL
-#define RMI_FEATURE_REGISTER_0_PMU_EN			BIT(22)
-#define RMI_FEATURE_REGISTER_0_PMU_NUM_CTRS_SHIFT	23UL
+#define RMI_FEATURE_REGISTER_0_NUM_BPS_WIDTH		6UL
+#define RMI_FEATURE_REGISTER_0_NUM_WPS_SHIFT		20UL
+#define RMI_FEATURE_REGISTER_0_NUM_WPS_WIDTH		6UL
+#define RMI_FEATURE_REGISTER_0_PMU_EN			BIT(26)
+#define RMI_FEATURE_REGISTER_0_PMU_NUM_CTRS_SHIFT	27UL
 #define RMI_FEATURE_REGISTER_0_PMU_NUM_CTRS_WIDTH	5UL
-#define RMI_FEATURE_REGISTER_0_HASH_SHA_256		BIT(28)
-#define RMI_FEATURE_REGISTER_0_HASH_SHA_512		BIT(29)
+#define RMI_FEATURE_REGISTER_0_HASH_SHA_256		BIT(32)
+#define RMI_FEATURE_REGISTER_0_HASH_SHA_512		BIT(33)
+#define RMI_FEATURE_REGISTER_0_GICV3_NUM_LRS_SHIFT	34UL
+#define RMI_FEATURE_REGISTER_0_GICV3_NUM_LRS_WIDTH	4UL
+#define RMI_FEATURE_REGISTER_0_MAX_RECS_ORDER_SHIFT	38UL
+#define RMI_FEATURE_REGISTER_0_MAX_RECS_ORDER_WIDTH	4UL
 
 /*
  * Format of feature_flag[63:32].
- * Value -1 indicates not set field, and parameter will be set
- * from the corresponding field of feature register 0.
+ * Value -1 (0 in case of NUM_BPS and NUM_WPS) indicates not set field,
+ * and parameter will be set from the corresponding field of feature register 0.
  */
 #define FEATURE_SVE_VL_SHIFT				32UL
 #define FEATURE_SVE_VL_WIDTH				8UL
diff --git a/realm/include/realm_rsi.h b/realm/include/realm_rsi.h
index 8436db9..92a078b 100644
--- a/realm/include/realm_rsi.h
+++ b/realm/include/realm_rsi.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, Arm Limited. All rights reserved.
+ * Copyright (c) 2022-2024, Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  *
@@ -64,19 +64,18 @@
 	RSI_ERROR_COUNT
 } rsi_status_t;
 
+/* Size of Realm Personalization Value */
+#define RSI_RPV_SIZE			64U
+
 struct rsi_realm_config {
 	/* IPA width in bits */
-	SET_MEMBER(unsigned long ipa_width, 0, 0x1000);	/* Offset 0 */
+	SET_MEMBER(unsigned long ipa_width, 0, 8);	/* Offset 0 */
+	/* Hash algorithm */
+	SET_MEMBER(unsigned long algorithm, 8, 0x200);	/* Offset 8 */
+	/* Realm Personalization Value */
+	SET_MEMBER(unsigned char rpv[RSI_RPV_SIZE], 0x200, 0x1000); /* Offset 0x200 */
 };
 
-/*
- * arg0 == IPA address of target region
- * arg1 == Size of target region in bytes
- * arg2 == RIPAS value
- * ret0 == Status / error
- * ret1 == Top of modified IPA range
- */
-
 #define RSI_HOST_CALL_NR_GPRS		31U
 
 struct rsi_host_call {
@@ -90,23 +89,49 @@
 
 /*
  * arg0 == struct rsi_host_call address
+ * ret0 == Status / error
  */
 #define RSI_HOST_CALL		SMC_RSI_FID(9U)
 
-
+/*
+ * arg0: Requested interface version
+ * ret0: Status / error
+ * ret1: Lower implemented interface revision
+ * ret2: Higher implemented interface revision
+ */
 #define RSI_VERSION		SMC_RSI_FID(0U)
 
 /*
  * arg0 == struct rsi_realm_config address
+ * ret0 == Status / error
  */
 #define RSI_REALM_CONFIG	SMC_RSI_FID(6U)
+
+/*
+ * arg0 == Base IPA address of target region
+ * arg1 == Top address of target region
+ * arg2 == RIPAS value
+ * arg3 == flags
+ * ret0 == Status / error
+ * ret1 == Base of IPA region which was not modified by the command
+ * ret2 == RSI response
+ */
 #define RSI_IPA_STATE_SET	SMC_RSI_FID(7U)
+
+/*
+ * arg0 == Base of target IPA region
+ * arg1 == End of target IPA region
+ * ret0 == Status / error
+ * ret1 == Top of IPA region which has the reported RIPAS value
+ * ret2 == RIPAS value
+ */
 #define RSI_IPA_STATE_GET	SMC_RSI_FID(8U)
 
 typedef enum {
 	RSI_EMPTY = 0U,
 	RSI_RAM,
-	RSI_DESTROYED
+	RSI_DESTROYED,
+	RSI_DEV
 } rsi_ripas_type;
 
 typedef enum {
@@ -117,16 +142,19 @@
 #define RSI_NO_CHANGE_DESTROYED	0UL
 #define RSI_CHANGE_DESTROYED	1UL
 
-/* Request RIPAS of a target IPA range to be changed to a specified value. */
+/* Request RIPAS of a target IPA range to be changed to a specified value */
 u_register_t rsi_ipa_state_set(u_register_t base,
-			   u_register_t top,
-			   rsi_ripas_type ripas,
-			   u_register_t flag,
-			   u_register_t *new_base,
-			   rsi_ripas_respose_type *response);
+				u_register_t top,
+				rsi_ripas_type ripas,
+				u_register_t flag,
+				u_register_t *new_base,
+				rsi_ripas_respose_type *response);
 
-/* Request RIPAS of a target IPA */
-u_register_t rsi_ipa_state_get(u_register_t adr, rsi_ripas_type *ripas);
+/* Request RIPAS of a target IPA range */
+u_register_t rsi_ipa_state_get(u_register_t base,
+				u_register_t top,
+				u_register_t *out_top,
+				rsi_ripas_type *ripas);
 
 /* This function return RSI_ABI_VERSION */
 u_register_t rsi_get_version(u_register_t req_ver);
diff --git a/realm/realm_payload_main.c b/realm/realm_payload_main.c
index 5eec5b8..47f9b9f 100644
--- a/realm/realm_payload_main.c
+++ b/realm/realm_payload_main.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, Arm Limited. All rights reserved.
+ * Copyright (c) 2022-2024, Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  *
@@ -63,70 +63,76 @@
 
 bool test_realm_set_ripas(void)
 {
-	u_register_t ret, base, new_base, top;
+	u_register_t ret, base, new_base, top, new_top;
 	rsi_ripas_respose_type response;
 	rsi_ripas_type ripas;
 
 	base = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
 	top = realm_shared_data_get_my_host_val(HOST_ARG2_INDEX);
-	realm_printf("base=0x%lx top =0x%lx\n", base, top);
-	ret = rsi_ipa_state_get(base, &ripas);
+	realm_printf("base=0x%lx top=0x%lx\n", base, top);
+	ret = rsi_ipa_state_get(base, top, &new_top, &ripas);
 	if (ripas != RSI_EMPTY) {
 		return false;
 	}
 
 	ret = rsi_ipa_state_set(base, top, RSI_RAM,
-		RSI_NO_CHANGE_DESTROYED, &new_base, &response);
-	if (ret != RSI_SUCCESS || response != RSI_ACCEPT) {
+				RSI_NO_CHANGE_DESTROYED, &new_base, &response);
+	if ((ret != RSI_SUCCESS) || (response != RSI_ACCEPT)) {
 		return false;
 	}
+
 	while (new_base < top) {
-		realm_printf("new_base=0x%lx top =0x%lx\n", new_base, top);
+		realm_printf("new_base=0x%lx top=0x%lx\n", new_base, top);
 		ret = rsi_ipa_state_set(new_base, top, RSI_RAM,
 				RSI_NO_CHANGE_DESTROYED, &new_base, &response);
-		if (ret != RSI_SUCCESS || response != RSI_ACCEPT) {
+		if ((ret != RSI_SUCCESS) || (response != RSI_ACCEPT)) {
 			realm_printf("rsi_ipa_state_set failed\n");
 			return false;
 		}
 	}
 
-	/* Verify that RIAS has changed for range base-top. */
-	for (unsigned int i = 0U; (base + (PAGE_SIZE * i) < top); i++) {
-		ret = rsi_ipa_state_get(base + (PAGE_SIZE * i), &ripas);
-		if (ret != RSI_SUCCESS || ripas != RSI_RAM) {
-			realm_printf("rsi_ipa_state_get failed base=0x%lx, ripas=0x%x\n",
-					base + (PAGE_SIZE * i), ripas);
-			return false;
-		}
+	/* Verify that RIAS has changed for range base-top */
+	ret = rsi_ipa_state_get(base, top, &new_top, &ripas);
+	if ((ret != RSI_SUCCESS) || (ripas != RSI_RAM) || (new_top != top)) {
+		realm_printf("rsi_ipa_state_get failed base=0x%lx top=0x%lx",
+				"new_top=0x%lx ripas=%u ret=0x%lx\n",
+				base, top, ripas);
+		return false;
 	}
+
 	return true;
 }
 
 bool test_realm_reject_set_ripas(void)
 {
-	u_register_t ret, base, new_base;
+	u_register_t ret, base, top, new_base, new_top;
 	rsi_ripas_respose_type response;
 	rsi_ripas_type ripas;
 
 	base = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
-	ret = rsi_ipa_state_get(base, &ripas);
-	if (ret != RSI_SUCCESS || ripas != RSI_EMPTY) {
-		realm_printf("Wrong initial ripas=0x%lx\n", ripas);
+	top = base + PAGE_SIZE;
+	ret = rsi_ipa_state_get(base, top, &new_top, &ripas);
+	if ((ret != RSI_SUCCESS) || (ripas != RSI_EMPTY)) {
+		realm_printf("Wrong initial ripas=%u\n", ripas);
 		return false;
 	}
-	ret = rsi_ipa_state_set(base, base + PAGE_SIZE, RSI_RAM,
-		RSI_NO_CHANGE_DESTROYED, &new_base, &response);
-	if (ret == RSI_SUCCESS && response == RSI_REJECT) {
-		realm_printf("rsi_ipa_state_set passed response = %d\n", response);
-		ret = rsi_ipa_state_get(base, &ripas);
-		if (ret == RSI_SUCCESS && ripas == RSI_EMPTY) {
+	ret = rsi_ipa_state_set(base, top, RSI_RAM,
+				RSI_NO_CHANGE_DESTROYED, &new_base, &response);
+	if ((ret == RSI_SUCCESS) && (response == RSI_REJECT)) {
+		realm_printf("rsi_ipa_state_set passed response=%u\n", response);
+		ret = rsi_ipa_state_get(base, top, &new_top, &ripas);
+		if ((ret == RSI_SUCCESS) && (ripas == RSI_EMPTY) &&
+						(new_top == top)) {
 			return true;
 		} else {
-			realm_printf("rsi_ipa_state_get failed ripas = %d\n", ripas);
+			realm_printf("rsi_ipa_state_get failed top=0x%lx",
+					"new_top=0x%lx ripas=%u ret=0x%lx\n",
+					ripas);
 			return false;
 		}
 	}
-	realm_printf("rsi_ipa_state_set failed ret=0x%lx, response = %d\n", ret, response);
+	realm_printf("rsi_ipa_state_set failed ret=0x%lx response=%u\n",
+			ret, response);
 	return false;
 }
 
@@ -143,36 +149,34 @@
 	return false;
 }
 
-
 static bool test_realm_instr_fetch_cmd(void)
 {
-	u_register_t base;
+	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);
-	rsi_ipa_state_get(base, &ripas);
-	realm_printf("Initial ripas=0x%lx\n", ripas);
-	/* causes instruction abort */
+	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");
 	func_ptr = (void (*)(void))base;
 	func_ptr();
-	/* should not return */
+	/* Should not return */
 	return false;
 }
 
 static bool test_realm_data_access_cmd(void)
 {
-	u_register_t base;
+	u_register_t base, new_top;
 	rsi_ripas_type ripas;
-
 	base = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
-	rsi_ipa_state_get(base, &ripas);
-	realm_printf("Initial ripas=0x%lx\n", ripas);
-	/* causes data abort */
+	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");
 	*((volatile uint64_t *)base);
-	/* should not return */
+	/* Should not return */
 	return false;
 }
 
@@ -185,14 +189,14 @@
 	esr = read_esr_el1();
 
 	if (far == base) {
-		/* return ESR to Host */
+		/* Return ESR to Host */
 		realm_shared_data_set_my_realm_val(HOST_ARG2_INDEX, esr);
 		rsi_exit_to_host(HOST_CALL_EXIT_SUCCESS_CMD);
 	}
-	realm_printf("Realm Abort fail incorrect FAR=0x%lx ESR+0x%lx\n", far, esr);
+	realm_printf("Realm Abort fail incorrect FAR=0x%lx ESR=0x%lx\n", far, esr);
 	rsi_exit_to_host(HOST_CALL_EXIT_FAILED_CMD);
 
-	/* Should not return. */
+	/* Should not return */
 	return false;
 }
 
diff --git a/realm/realm_rsi.c b/realm/realm_rsi.c
index cd4342f..b2a49d4 100644
--- a/realm/realm_rsi.c
+++ b/realm/realm_rsi.c
@@ -22,7 +22,7 @@
 	if (res.ret0 == SMC_UNKNOWN) {
 		return SMC_UNKNOWN;
 	}
-	/* Return lower version. */
+	/* Return lower version */
 	return res.ret1;
 }
 
@@ -71,15 +71,19 @@
 	return res.ret0;
 }
 
-/* This function will return RIPAS of IPA */
-u_register_t rsi_ipa_state_get(u_register_t adr, rsi_ripas_type *ripas)
+/* This function will return RIPAS of IPA range */
+u_register_t rsi_ipa_state_get(u_register_t base,
+				u_register_t top,
+				u_register_t *out_top,
+				rsi_ripas_type *ripas)
 {
 	smc_ret_values res = {};
 
 	res = tftf_smc(&(smc_args)
-			{RSI_IPA_STATE_GET, adr});
+			{RSI_IPA_STATE_GET, base, top});
 	if (res.ret0 == RSI_SUCCESS) {
-		*ripas = res.ret1;
+		*out_top = res.ret1;
+		*ripas = res.ret2;
 	}
 	return res.ret0;
 }
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 8a1d1c4..9c7ceba 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
@@ -194,7 +194,7 @@
 
 	/* Requested number of breakpoints */
 	value = EXTRACT(FEATURE_NUM_BPS, feature_flag);
-	if (value != -1) {
+	if (value != 0) {
 		realm_ptr->num_bps = (unsigned int)value;
 	} else {
 		realm_ptr->num_bps = EXTRACT(RMI_FEATURE_REGISTER_0_NUM_BPS,
@@ -203,7 +203,7 @@
 
 	/* Requested number of watchpoints */
 	value = EXTRACT(FEATURE_NUM_WPS, feature_flag);
-	if (value != -1) {
+	if (value != 0) {
 		realm_ptr->num_wps = (unsigned int)value;
 	} else {
 		realm_ptr->num_wps = EXTRACT(RMI_FEATURE_REGISTER_0_NUM_WPS,
diff --git a/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c b/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c
index 3716444..9cef234 100644
--- a/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c
+++ b/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c
@@ -496,11 +496,12 @@
 	if ((realm->rmm_feat_reg0 & RMI_FEATURE_REGISTER_0_LPA2) != 0L) {
 		desc = (phys & ~OA_50_51_MASK) |
 				INPLACE(TTE_OA_50_51, EXTRACT(OA_50_51, phys));
-		desc |= S2TTE_ATTR_FWB_WB_RW_LPA2;
 	} else {
-		desc = phys | S2TTE_ATTR_FWB_WB_RW;
+		desc = phys;
 	}
 
+	desc |= S2TTE_ATTR_FWB_WB_RW;
+
 	ret = host_rmi_rtt_mapunprotected(rd, map_addr, map_level, desc);
 
 	if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) {