/*
 * Copyright (c) 2019 The Fuchsia Authors
 *
 * SPDX-License-Identifier:	BSD-3-Clause
 */

#include <tee/ta_helper.h>

int ta_open(const struct tee_optee_ta_uuid *uuid,
	    struct ta_context *out_context)
{
	struct udevice *tee;
	struct tee_open_session_arg arg = { 0 };
	int rc;

	if (!uuid || !out_context) {
		return -EINVAL;
	}

	tee = tee_find_device(NULL, NULL, NULL, NULL);
	if (!tee) {
		fprintf(stderr, "Error: No TEE device not found.\n");
		return -ENODEV;
	}

	tee_optee_ta_uuid_to_octets(arg.uuid, uuid);
	rc = tee_open_session(tee, &arg, 0, NULL);
	if (rc || arg.ret) {
		fprintf(stderr, "Error: Failed to open TA: %s.\n",
			tee_explain_error(rc, arg.ret, arg.ret_origin));
		return -EBUSY;
	}

	out_context->tee = tee;
	out_context->session = arg.session;

	return 0;
}

void ta_close(struct ta_context *context)
{
	if (context && context->tee) {
		tee_close_session(context->tee, context->session);
	}
}

int ta_invoke(const struct ta_context *context, uint32_t func,
	      uint32_t num_params, struct tee_param *params)
{
	struct tee_invoke_arg arg = { 0 };
	int rc;

	if (!context || !context->tee) {
		return -EINVAL;
	}

	arg.func = func;
	arg.session = context->session;

	rc = tee_invoke_func(context->tee, &arg, num_params, params);
	if (rc || arg.ret) {
		fprintf(stderr,
			"Error: failed to invoke command 0x%x: %s.\n", func,
			tee_explain_error(rc, arg.ret, arg.ret_origin));
		return -EBUSY;
	}

	return 0;
}

int ta_call(const struct tee_optee_ta_uuid *uuid, uint32_t func,
	    uint32_t num_params, struct tee_param *params)
{
	int rc;
	struct ta_context context = { 0 };

	rc = ta_open(uuid, &context);
	if (rc) {
		return rc;
	}

	rc = ta_invoke(&context, func, num_params, params);

	ta_close(&context);

	return rc;
}
