feat(rmm): update API of data/rtt functions

This patch modifies API of RMI_DATA_DESTROY,
RMI_RTT_DESTROY and RMI_RTT_FOLD commands
according to RMM Specification 1.0-eac1.

Signed-off-by: AlexeiFedorov <Alexei.Fedorov@arm.com>
Change-Id: Id71a9a0524d767fcbdfd727d6ad3608e7be4e4b4
diff --git a/runtime/core/handler.c b/runtime/core/handler.c
index 49c6c8e..a38b56e 100644
--- a/runtime/core/handler.c
+++ b/runtime/core/handler.c
@@ -137,10 +137,10 @@
 	HANDLER(REC_ENTER,		2, 0, smc_rec_enter,		 false, true),
 	HANDLER(DATA_CREATE,		5, 0, smc_data_create,		 false, false),
 	HANDLER(DATA_CREATE_UNKNOWN,	3, 0, smc_data_create_unknown,	 false, false),
-	HANDLER(DATA_DESTROY,		2, 0, smc_data_destroy,		 false, true),
+	HANDLER(DATA_DESTROY,		2, 2, smc_data_destroy,		 false, true),
 	HANDLER(RTT_CREATE,		4, 0, smc_rtt_create,		 false, true),
-	HANDLER(RTT_DESTROY,		4, 0, smc_rtt_destroy,		 false, true),
-	HANDLER(RTT_FOLD,		4, 0, smc_rtt_fold,		 false, true),
+	HANDLER(RTT_DESTROY,		3, 2, smc_rtt_destroy,		 false, true),
+	HANDLER(RTT_FOLD,		3, 1, smc_rtt_fold,		 false, true),
 	HANDLER(RTT_MAP_UNPROTECTED,	4, 0, smc_rtt_map_unprotected,	 false, false),
 	HANDLER(RTT_UNMAP_UNPROTECTED,	3, 0, smc_rtt_unmap_unprotected, false, false),
 	HANDLER(RTT_READ_ENTRY,		3, 4, smc_rtt_read_entry,	 false, true),
diff --git a/runtime/include/smc-handler.h b/runtime/include/smc-handler.h
index 390dc4c..b61c814 100644
--- a/runtime/include/smc-handler.h
+++ b/runtime/include/smc-handler.h
@@ -23,8 +23,9 @@
 				      unsigned long data_addr,
 				      unsigned long map_addr);
 
-unsigned long smc_data_destroy(unsigned long rd_addr,
-			       unsigned long map_addr);
+void smc_data_destroy(unsigned long rd_addr,
+		      unsigned long map_addr,
+		      struct smc_result *ret_struct);
 
 unsigned long smc_granule_delegate(unsigned long addr);
 
@@ -33,7 +34,7 @@
 unsigned long smc_realm_activate(unsigned long rd_addr);
 
 unsigned long smc_realm_create(unsigned long rd_addr,
-			     unsigned long realm_params_addr);
+				unsigned long realm_params_addr);
 
 unsigned long smc_realm_destroy(unsigned long rd_addr);
 
@@ -54,15 +55,15 @@
 			     unsigned long map_addr,
 			     unsigned long ulevel);
 
-unsigned long smc_rtt_destroy(unsigned long rtt_addr,
-			      unsigned long rd_addr,
-			      unsigned long map_addr,
-			      unsigned long ulevel);
+void smc_rtt_destroy(unsigned long rd_addr,
+		     unsigned long map_addr,
+		     unsigned long ulevel,
+		     struct smc_result *ret_struct);
 
-unsigned long smc_rtt_fold(unsigned long rtt_addr,
-			   unsigned long rd_addr,
-			   unsigned long map_addr,
-			   unsigned long ulevel);
+void smc_rtt_fold(unsigned long rd_addr,
+		  unsigned long map_addr,
+		  unsigned long ulevel,
+		  struct smc_result *ret_struct);
 
 unsigned long smc_rtt_map_unprotected(unsigned long rd_addr,
 				      unsigned long map_addr,
diff --git a/runtime/rmi/rtt.c b/runtime/rmi/rtt.c
index a0e3e1f..fbf4956 100644
--- a/runtime/rmi/rtt.c
+++ b/runtime/rmi/rtt.c
@@ -256,10 +256,10 @@
 	return ret;
 }
 
-unsigned long smc_rtt_fold(unsigned long rtt_addr,
-			   unsigned long rd_addr,
-			   unsigned long map_addr,
-			   unsigned long ulevel)
+void smc_rtt_fold(unsigned long rd_addr,
+		  unsigned long map_addr,
+		  unsigned long ulevel,
+		  struct smc_result *res)
 {
 	struct granule *g_rd;
 	struct granule *g_tbl;
@@ -268,14 +268,15 @@
 	struct rtt_walk wi;
 	unsigned long *table, *parent_s2tt, parent_s2tte;
 	long level = (long)ulevel;
-	unsigned long ipa_bits;
+	unsigned long ipa_bits, rtt_addr;
 	unsigned long ret;
 	struct realm_s2_context s2_ctx;
 	int sl;
 
 	g_rd = find_lock_granule(rd_addr, GRANULE_STATE_RD);
 	if (g_rd == NULL) {
-		return RMI_ERROR_INPUT;
+		res->x[0] = RMI_ERROR_INPUT;
+		return;
 	}
 
 	rd = granule_map(g_rd, SLOT_RD);
@@ -283,7 +284,8 @@
 	if (!validate_rtt_structure_cmds(map_addr, level, rd)) {
 		buffer_unmap(rd);
 		granule_unlock(g_rd);
-		return RMI_ERROR_INPUT;
+		res->x[0] = RMI_ERROR_INPUT;
+		return;
 	}
 
 	g_table_root = rd->s2_ctx.g_rtt;
@@ -309,16 +311,7 @@
 		goto out_unmap_parent_table;
 	}
 
-	/*
-	 * Check that the 'rtt_addr' RTT is used at (map_addr, level).
-	 * Note that this also verifies that the rtt_addr is properly aligned.
-	 */
-	if (rtt_addr != s2tte_pa_table(parent_s2tte, level - 1L)) {
-		ret = pack_return_code(RMI_ERROR_RTT,
-					(unsigned int)(level - 1L));
-		goto out_unmap_parent_table;
-	}
-
+	rtt_addr = s2tte_pa_table(parent_s2tte, level - 1L);
 	g_tbl = find_lock_granule(rtt_addr, GRANULE_STATE_RTT);
 
 	/*
@@ -409,6 +402,7 @@
 	}
 
 	ret = RMI_SUCCESS;
+	res->x[1] = rtt_addr;
 
 	/*
 	 * Break before make.
@@ -434,13 +428,13 @@
 	buffer_unmap(parent_s2tt);
 out_unlock_parent_table:
 	granule_unlock(wi.g_llt);
-	return ret;
+	res->x[0] = ret;
 }
 
-unsigned long smc_rtt_destroy(unsigned long rtt_addr,
-			      unsigned long rd_addr,
-			      unsigned long map_addr,
-			      unsigned long ulevel)
+void smc_rtt_destroy(unsigned long rd_addr,
+		     unsigned long map_addr,
+		     unsigned long ulevel,
+		     struct smc_result *res)
 {
 	struct granule *g_rd;
 	struct granule *g_tbl;
@@ -449,7 +443,7 @@
 	struct rtt_walk wi;
 	unsigned long *table, *parent_s2tt, parent_s2tte;
 	long level = (long)ulevel;
-	unsigned long ipa_bits;
+	unsigned long ipa_bits, rtt_addr;
 	unsigned long ret;
 	struct realm_s2_context s2_ctx;
 	int sl;
@@ -457,7 +451,8 @@
 
 	g_rd = find_lock_granule(rd_addr, GRANULE_STATE_RD);
 	if (g_rd == NULL) {
-		return RMI_ERROR_INPUT;
+		res->x[0] = RMI_ERROR_INPUT;
+		return;
 	}
 
 	rd = granule_map(g_rd, SLOT_RD);
@@ -465,7 +460,8 @@
 	if (!validate_rtt_structure_cmds(map_addr, level, rd)) {
 		buffer_unmap(rd);
 		granule_unlock(g_rd);
-		return RMI_ERROR_INPUT;
+		res->x[0] = RMI_ERROR_INPUT;
+		return;
 	}
 
 	g_table_root = rd->s2_ctx.g_rtt;
@@ -492,14 +488,7 @@
 		goto out_unmap_parent_table;
 	}
 
-	/*
-	 * Check that the 'rtt_addr' RTT is used at (map_addr, level).
-	 * Note that this also verifies that the rtt_addr is properly aligned.
-	 */
-	if (rtt_addr != s2tte_pa_table(parent_s2tte, level - 1L)) {
-		ret = RMI_ERROR_INPUT;
-		goto out_unmap_parent_table;
-	}
+	rtt_addr = s2tte_pa_table(parent_s2tte, level - 1L);
 
 	/*
 	 * Lock the RTT granule. The 'rtt_addr' is verified, thus can be treated
@@ -522,6 +511,7 @@
 	}
 
 	ret = RMI_SUCCESS;
+	res->x[1] = rtt_addr;
 
 	table = granule_map(g_tbl, SLOT_RTT2);
 
@@ -550,7 +540,7 @@
 	buffer_unmap(parent_s2tt);
 out_unlock_parent_table:
 	granule_unlock(wi.g_llt);
-	return ret;
+	res->x[0] = ret;
 }
 
 enum map_unmap_ns_op {
@@ -958,8 +948,9 @@
 	return data_create(rd_addr, data_addr, map_addr, NULL, 0);
 }
 
-unsigned long smc_data_destroy(unsigned long rd_addr,
-			       unsigned long map_addr)
+void smc_data_destroy(unsigned long rd_addr,
+		      unsigned long map_addr,
+		      struct smc_result *res)
 {
 	struct granule *g_data;
 	struct granule *g_rd;
@@ -967,14 +958,14 @@
 	struct rtt_walk wi;
 	unsigned long data_addr, s2tte, *s2tt;
 	struct rd *rd;
-	unsigned long ipa_bits;
-	unsigned long ret;
+	unsigned long ipa_bits, ret;
 	struct realm_s2_context s2_ctx;
 	int sl;
 
 	g_rd = find_lock_granule(rd_addr, GRANULE_STATE_RD);
 	if (g_rd == NULL) {
-		return RMI_ERROR_INPUT;
+		res->x[0] = RMI_ERROR_INPUT;
+		return;
 	}
 
 	rd = granule_map(g_rd, SLOT_RD);
@@ -982,7 +973,8 @@
 	if (!validate_map_addr(map_addr, RTT_PAGE_LEVEL, rd)) {
 		buffer_unmap(rd);
 		granule_unlock(g_rd);
-		return RMI_ERROR_INPUT;
+		res->x[0] = RMI_ERROR_INPUT;
+		return;
 	}
 
 	g_table_root = rd->s2_ctx.g_rtt;
@@ -1032,13 +1024,13 @@
 	granule_unlock_transition(g_data, GRANULE_STATE_DELEGATED);
 
 	ret = RMI_SUCCESS;
+	res->x[1] = data_addr;
 
 out_unmap_ll_table:
 	buffer_unmap(s2tt);
 out_unlock_ll_table:
 	granule_unlock(wi.g_llt);
-
-	return ret;
+	res->x[0] = ret;
 }
 
 /*