plat-ti: Switch to using SMCCC compatible calls

Previously on our TI evil vendor Linux tree we would use a sentinel value
in r12 to signal if a call was meant for OP-TEE or the legacy ROM. A path
to using SMCCC compatible calls from Linux is being implemented.
Switch the OP-TEE side over.

Signed-off-by: Andrew F. Davis <afd@ti.com>
Acked-by: Jens Wiklander <jens.wiklander@linaro.org>
diff --git a/core/arch/arm/plat-ti/sm_platform_handler_a15.c b/core/arch/arm/plat-ti/sm_platform_handler_a15.c
index 6dc1ee3..e6df149 100644
--- a/core/arch/arm/plat-ti/sm_platform_handler_a15.c
+++ b/core/arch/arm/plat-ti/sm_platform_handler_a15.c
@@ -27,29 +27,46 @@
  */
 
 #include <arm32.h>
+#include <kernel/thread.h>
+#include <sm/optee_smc.h>
 #include <sm/sm.h>
+#include <trace.h>
+
 #include "api_monitor_index_a15.h"
 
-enum sm_handler_ret sm_platform_handler(struct sm_ctx *ctx)
+static enum sm_handler_ret ti_sip_handler(struct thread_smc_args *smc_args)
 {
-	if (ctx->nsec.r12 == 0x200)
-		return SM_HANDLER_PENDING_SMC;
+	uint16_t sip_func = OPTEE_SMC_FUNC_NUM(smc_args->a0);
 
-	switch (ctx->nsec.r12) {
+	switch (sip_func) {
 	case API_MONITOR_ACTLR_SETREGISTER_INDEX:
-		write_actlr(ctx->nsec.r0);
+		write_actlr(smc_args->a1);
 		isb();
-		ctx->nsec.r0 = API_HAL_RET_VALUE_OK;
+		smc_args->a0 = OPTEE_SMC_RETURN_OK;
 		break;
 	case API_MONITOR_TIMER_SETCNTFRQ_INDEX:
-		write_cntfrq(ctx->nsec.r0);
+		write_cntfrq(smc_args->a1);
 		isb();
-		ctx->nsec.r0 = API_HAL_RET_VALUE_OK;
+		smc_args->a0 = OPTEE_SMC_RETURN_OK;
 		break;
 	default:
-		ctx->nsec.r0 = API_HAL_RET_VALUE_SERVICE_UNKNWON;
+		EMSG("Invalid SIP function code: 0x%04"PRIx16, sip_func);
+		smc_args->a0 = OPTEE_SMC_RETURN_EBADCMD;
 		break;
 	}
 
 	return SM_HANDLER_SMC_HANDLED;
 }
+
+enum sm_handler_ret sm_platform_handler(struct sm_ctx *ctx)
+{
+	uint32_t *nsec_r0 = (uint32_t *)(&ctx->nsec.r0);
+	uint16_t smc_owner = OPTEE_SMC_OWNER_NUM(*nsec_r0);
+
+	switch (smc_owner) {
+	case OPTEE_SMC_OWNER_SIP:
+		return ti_sip_handler((struct thread_smc_args *)nsec_r0);
+	default:
+		return SM_HANDLER_PENDING_SMC;
+	}
+}
diff --git a/core/arch/arm/plat-ti/sm_platform_handler_a9.c b/core/arch/arm/plat-ti/sm_platform_handler_a9.c
index 21d7d42..493e626 100644
--- a/core/arch/arm/plat-ti/sm_platform_handler_a9.c
+++ b/core/arch/arm/plat-ti/sm_platform_handler_a9.c
@@ -29,69 +29,77 @@
 #include <arm32.h>
 #include <io.h>
 #include <kernel/cache_helpers.h>
+#include <kernel/thread.h>
 #include <kernel/tz_ssvce_def.h>
 #include <kernel/tz_ssvce_pl310.h>
 #include <platform_config.h>
+#include <sm/optee_smc.h>
 #include <sm/pm.h>
 #include <sm/sm.h>
 #include <mm/core_memprot.h>
+#include <trace.h>
+
 #include "api_monitor_index_a9.h"
 
 uint32_t suspend_regs[16];
 
-enum sm_handler_ret sm_platform_handler(struct sm_ctx *ctx)
+static enum sm_handler_ret ti_sip_handler(struct thread_smc_args *smc_args)
 {
-	if (ctx->nsec.r12 == 0x200)
-		return SM_HANDLER_PENDING_SMC;
+	uint16_t sip_func = OPTEE_SMC_FUNC_NUM(smc_args->a0);
 
-	switch (ctx->nsec.r12) {
-	case 0x0:
-		switch (ctx->nsec.r0) {
-		case SECURE_SVC_PM_LATE_SUSPEND:
-			sm_pm_cpu_do_suspend(suspend_regs);
-			cache_op_inner(DCACHE_AREA_CLEAN,
-				       suspend_regs,
-				       sizeof(suspend_regs));
-			cache_op_outer(DCACHE_AREA_CLEAN,
-				       virt_to_phys(suspend_regs),
-				       sizeof(suspend_regs));
-			ctx->nsec.r0 = API_HAL_RET_VALUE_OK;
-			break;
-		default:
-			ctx->nsec.r0 = API_HAL_RET_VALUE_SERVICE_UNKNWON;
-			break;
-		}
+	switch (sip_func) {
+	case SECURE_SVC_PM_LATE_SUSPEND:
+		sm_pm_cpu_do_suspend(suspend_regs);
+		cache_op_inner(DCACHE_AREA_CLEAN, suspend_regs,
+			       sizeof(suspend_regs));
+		cache_op_outer(DCACHE_AREA_CLEAN, virt_to_phys(suspend_regs),
+			       sizeof(suspend_regs));
+		smc_args->a0 = OPTEE_SMC_RETURN_OK;
 		break;
 	case API_MONITOR_L2CACHE_SETDEBUG_INDEX:
-		io_write32(pl310_base() + PL310_DEBUG_CTRL, ctx->nsec.r0);
-		ctx->nsec.r0 = API_HAL_RET_VALUE_OK;
+		io_write32(pl310_base() + PL310_DEBUG_CTRL, smc_args->a1);
+		smc_args->a0 = OPTEE_SMC_RETURN_OK;
 		break;
 	case API_MONITOR_L2CACHE_CLEANINVBYPA_INDEX:
-		arm_cl2_cleaninvbypa(pl310_base(), ctx->nsec.r0,
-				     ctx->nsec.r0 + ctx->nsec.r1);
-		ctx->nsec.r0 = API_HAL_RET_VALUE_OK;
+		arm_cl2_cleaninvbypa(pl310_base(), smc_args->a1,
+				     smc_args->a1 + smc_args->a2);
+		smc_args->a0 = OPTEE_SMC_RETURN_OK;
 		break;
 	case API_MONITOR_L2CACHE_SETCONTROL_INDEX:
-		io_write32(pl310_base() + PL310_CTRL, ctx->nsec.r0);
-		ctx->nsec.r0 = API_HAL_RET_VALUE_OK;
+		io_write32(pl310_base() + PL310_CTRL, smc_args->a1);
+		smc_args->a0 = OPTEE_SMC_RETURN_OK;
 		break;
 	case API_MONITOR_L2CACHE_SETAUXILIARYCONTROL_INDEX:
-		io_write32(pl310_base() + PL310_AUX_CTRL, ctx->nsec.r0);
-		ctx->nsec.r0 = API_HAL_RET_VALUE_OK;
+		io_write32(pl310_base() + PL310_AUX_CTRL, smc_args->a1);
+		smc_args->a0 = OPTEE_SMC_RETURN_OK;
 		break;
 	case API_MONITOR_L2CACHE_SETLATENCY_INDEX:
-		io_write32(pl310_base() + PL310_TAG_RAM_CTRL, ctx->nsec.r0);
-		io_write32(pl310_base() + PL310_DATA_RAM_CTRL, ctx->nsec.r1);
-		ctx->nsec.r0 = API_HAL_RET_VALUE_OK;
+		io_write32(pl310_base() + PL310_TAG_RAM_CTRL, smc_args->a1);
+		io_write32(pl310_base() + PL310_DATA_RAM_CTRL, smc_args->a2);
+		smc_args->a0 = OPTEE_SMC_RETURN_OK;
 		break;
 	case API_MONITOR_L2CACHE_SETPREFETCHCONTROL_INDEX:
-		io_write32(pl310_base() + PL310_PREFETCH_CTRL, ctx->nsec.r0);
-		ctx->nsec.r0 = API_HAL_RET_VALUE_OK;
+		io_write32(pl310_base() + PL310_PREFETCH_CTRL, smc_args->a1);
+		smc_args->a0 = OPTEE_SMC_RETURN_OK;
 		break;
 	default:
-		ctx->nsec.r0 = API_HAL_RET_VALUE_SERVICE_UNKNWON;
+		EMSG("Invalid SIP function code: 0x%04"PRIx16, sip_func);
+		smc_args->a0 = OPTEE_SMC_RETURN_EBADCMD;
 		break;
 	}
 
 	return SM_HANDLER_SMC_HANDLED;
 }
+
+enum sm_handler_ret sm_platform_handler(struct sm_ctx *ctx)
+{
+	uint32_t *nsec_r0 = (uint32_t *)(&ctx->nsec.r0);
+	uint16_t smc_owner = OPTEE_SMC_OWNER_NUM(*nsec_r0);
+
+	switch (smc_owner) {
+	case OPTEE_SMC_OWNER_SIP:
+		return ti_sip_handler((struct thread_smc_args *)nsec_r0);
+	default:
+		return SM_HANDLER_PENDING_SMC;
+	}
+}