/*
 * Copyright (C) 2014-2018, Samsung Electronics Co., Ltd.
 *
 * Custom Handler main program
 */

#include "handler.h"
#include "kernel_api.h"

#if defined(CONFIG_ESE_TZ_CONTROL)
#include "gpio-ese.h"
#endif
#if defined(CONFIG_FP_TZ_CONTROL)
#include "gpio-fp.h"
#endif

#if defined(CONFIG_MST_TZ_CONTROL)
#include "gpio-mst.h"
#endif

/*
 * Main handler function
 */
DECLARE_HANDLER_MAIN(unsigned int fid, struct custom_handler_params *params)
{
	uint32_t p1 = params->p0;
	uint32_t p2 = params->p1;
	uint32_t p3 = params->p2;
	uint32_t p4 = params->p3;
	uint32_t ret_r0 = 0, ret_r1 = 0, ret_r2 = 0, ret_r3 = 0;
	(void)fid;
	(void)p2;
	(void)p3;
	(void)p4;

	/*
	 * Select subfunction to execute
	 */
	switch(p1) {
#if defined(CONFIG_ESE_TZ_CONTROL)
	case SUBFUN_ESE_SECURE_INIT:
		ret_r0 = set_tzpc_ese_secure(p2);
		break;
#endif

#if defined(CONFIG_MST_TZ_CONTROL)
	case SBUFUN_MST_GPIO_PROTECTION:
		ret_r0 = set_tzpc_mst_secure(p2);
		break;
#endif

#if defined(CONFIG_FP_TZ_CONTROL)
	case MC_FC_FP_HANDLER_MAIN:
		ret_r0 = fp_handler_main(p2,p3);
		break;
#endif

	default:
		ret_r0 = (uint32_t)-1;
	}

	/*
	 * Result is returned to the caller in registers R0-R3
	 */
	params->ret_r0 = ret_r0;
	params->ret_r1 = ret_r1;
	params->ret_r2 = ret_r2;
	params->ret_r3 = ret_r3;
}
