feat(realm): added support to invoke RSI RDEV ABIs

- Updated DA RSI data types with RMM spec 1.1-alp11.1.
- Added support to call DA RSI RDEV ABIs like
  SMC_RSI_RDEV_CONTINUE
  SMC_RSI_RDEV_STOP
  SMC_RSI_RDEV_START
  SMC_RSI_RDEV_GET_INTERFACE_REPORT
  SMC_RSI_RDEV_LOCK
  SMC_RSI_RDEV_GET_INFO
  SMC_RSI_RDEV_GET_MEASUREMENTS
  SMC_RSI_RDEV_GET_STATE
  SMC_RSI_RDEV_GET_INSTANCE_ID

Signed-off-by: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com>
Change-Id: I60664262c24f287637e91d53ecab0c8b980e58b7
diff --git a/realm/realm_rsi.c b/realm/realm_rsi.c
index 3ca4e8a..7316203 100644
--- a/realm/realm_rsi.c
+++ b/realm/realm_rsi.c
@@ -32,6 +32,22 @@
 	return res.ret1;
 }
 
+/* This function returns RSI feature register at 'feature_reg_index' */
+u_register_t rsi_features(u_register_t feature_reg_index,
+			  u_register_t *feature_reg_value_ret)
+{
+	smc_ret_values res = {};
+
+	res = tftf_smc(&(smc_args) {SMC_RSI_FEATURES, feature_reg_index,
+				    0UL, 0UL, 0UL, 0UL, 0UL, 0UL});
+	/* This command always returns RSI_SUCCESS */
+	if (res.ret0 == RSI_SUCCESS) {
+		*feature_reg_value_ret = res.ret1;
+	}
+
+	return res.ret0;
+}
+
 /* This function call Host and request to exit Realm with proper exit code */
 u_register_t rsi_exit_to_host(enum host_call_cmd exit_code)
 {
@@ -228,3 +244,126 @@
 			 register_encoding, value});
 	return res.ret0;
 }
+
+/* This function return instance ID of Realm device */
+u_register_t rsi_rdev_get_instance_id(u_register_t rdev_id,
+				      u_register_t *rdev_inst_id)
+{
+	smc_ret_values res = {};
+
+	res = tftf_smc(&(smc_args)
+		{SMC_RSI_RDEV_GET_INSTANCE_ID, rdev_id, 0UL, 0UL, 0UL, 0UL,
+		 0UL, 0UL});
+
+	if (res.ret0 == RSI_SUCCESS) {
+		*rdev_inst_id = res.ret1;
+	}
+
+	return res.ret0;
+}
+
+/* This function return state of the Realm device */
+u_register_t rsi_rdev_get_state(u_register_t rdev_id, u_register_t rdev_inst_id,
+				u_register_t *rdev_rsi_state)
+{
+	smc_ret_values res = {};
+
+	res = tftf_smc(&(smc_args)
+		{SMC_RSI_RDEV_GET_STATE, rdev_id, rdev_inst_id, 0UL, 0UL, 0UL,
+		 0UL, 0UL});
+
+	if (res.ret0 == RSI_SUCCESS) {
+		*rdev_rsi_state = res.ret1;
+	}
+
+	return res.ret0;
+}
+
+/* This function triggers RDEV interruptible operation to get_measurements */
+u_register_t rsi_rdev_get_measurements(u_register_t rdev_id,
+				       u_register_t rdev_inst_id,
+				       u_register_t meas_params_ptr)
+{
+	smc_ret_values res = {};
+
+	res = tftf_smc(&(smc_args)
+		{SMC_RSI_RDEV_GET_MEASUREMENTS, rdev_id, rdev_inst_id,
+		 meas_params_ptr, 0UL, 0UL, 0UL, 0UL});
+
+	return res.ret0;
+}
+
+/* This function triggers RDEV interruptible operation to get_measurements */
+u_register_t rsi_rdev_get_info(u_register_t rdev_id, u_register_t rdev_inst_id,
+			       u_register_t rdev_info_ptr)
+{
+	smc_ret_values res = {};
+
+	res = tftf_smc(&(smc_args)
+		       {SMC_RSI_RDEV_GET_INFO, rdev_id, rdev_inst_id,
+			rdev_info_ptr, 0UL, 0UL, 0UL, 0UL});
+
+	return res.ret0;
+}
+
+/* This function triggers RDEV interruptible operation to lock */
+u_register_t rsi_rdev_lock(u_register_t rdev_id, u_register_t rdev_inst_id)
+{
+	smc_ret_values res = {};
+
+	res = tftf_smc(&(smc_args)
+		{SMC_RSI_RDEV_LOCK, rdev_id, rdev_inst_id,
+		 0UL, 0UL, 0UL, 0UL, 0UL});
+
+	return res.ret0;
+}
+
+/* This function triggers RDEV interruptible operation to get interface report */
+u_register_t rsi_rdev_get_interface_report(u_register_t rdev_id,
+					   u_register_t rdev_inst_id,
+					   u_register_t tdisp_version_max)
+{
+	smc_ret_values res = {};
+
+	res = tftf_smc(&(smc_args)
+		{SMC_RSI_RDEV_GET_INTERFACE_REPORT, rdev_id, rdev_inst_id,
+		 tdisp_version_max, 0UL, 0UL, 0UL, 0UL});
+
+	return res.ret0;
+}
+
+/* This function triggers RDEV interruptible operation to start */
+u_register_t rsi_rdev_start(u_register_t rdev_id, u_register_t rdev_inst_id)
+{
+	smc_ret_values res = {};
+
+	res = tftf_smc(&(smc_args)
+		{SMC_RSI_RDEV_START, rdev_id, rdev_inst_id,
+		 0UL, 0UL, 0UL, 0UL, 0UL});
+
+	return res.ret0;
+}
+
+/* This function triggers RDEV interruptible operation to stop the TDI */
+u_register_t rsi_rdev_stop(u_register_t rdev_id, u_register_t rdev_inst_id)
+{
+	smc_ret_values res = {};
+
+	res = tftf_smc(&(smc_args)
+		{SMC_RSI_RDEV_STOP, rdev_id, rdev_inst_id,
+		 0UL, 0UL, 0UL, 0UL, 0UL});
+
+	return res.ret0;
+}
+
+/* This function exits the REC to do vdev communicate */
+u_register_t rsi_rdev_continue(u_register_t rdev_id, u_register_t rdev_inst_id)
+{
+	smc_ret_values res = {};
+
+	res = tftf_smc(&(smc_args)
+		       {SMC_RSI_RDEV_CONTINUE, rdev_id, rdev_inst_id, 0UL, 0UL,
+			0UL, 0UL, 0UL});
+
+	return res.ret0;
+}