/*
 * Initialize_tl.c
 */

#include "shared/Initialize_tl.h"
#include "tz_dk_errors.h"

// #include <Iccc_Interface.h>
// #include <process_msr.h>
#include <tlc_tz_common.h>

extern uint32_t check_license_kap(
	void
);

typedef enum ta_trustboot_flag_type {
	TEXT_TRUSTBOOT_SUCCESS,
	TEXT_TRUSTBOOT_FAILURE,
	TEXT_TRUSTBOOT_UNDEFINED = 0xFFFFFFFF,
} ta_trustboot_flag_t;

tciReturnCode_t digitalkey_init(void)
{
	tciReturnCode_t ret = TZ_DIGITALKEY_NOT_INITIALIZED;
	int32_t is_svb = 0;
	uint32_t warranty_bit = 1;
	uint32_t tb_flag = TEXT_TRUSTBOOT_FAILURE;
/*
	if (ICCC_SUCCESS == Iccc_ReadData_TA(WARRANTY_BIT, &warranty_bit))
	{
		if(warranty_bit != 0) {
			return ret;
		}
	}
	else {
		return ret;
	}

	is_svb = is_svb_enabled();

	if (is_svb < 0) { // failure
		return ret ;
	}

	if (is_svb == 1) { // SVB_MAGIC match suing SVB instead of Trust boot
		if (ICCC_SUCCESS == Iccc_ReadData_TA(TRUSTBOOT_FLAG, &tb_flag)) {
			if (tb_flag == TEXT_TRUSTBOOT_SUCCESS) {
				ret = RET_TL_TZ_DIGITALKEY_OK;
			}
			else {
				return ret;
			}
		}
		else {
			return ret;
		}
	}
	*/
	return ret;
}

uint32_t process_Initialize(
	tl_dk_ctx_t * ctx,
	tz_init_payload_t * sendmsg,
	tz_init_payload_t * respmsg
)
{
	/* Slight abuse of return code
	 * Because of standards and our common init logic
	 */
	tciReturnCode_t ret = TZ_DIGITALKEY_SUCCESS;

	if (0 != ctx->digitalkey_init_count) {
		ret = TZ_DIGITALKEY_ALREADY_INITIALIZED;
		ctx->digitalkey_init_count++;
		goto exit;
	}

	ret = digitalkey_init();
	/* Slight abuse of return code
	 * Because TZ_COMMON_OK == RET_TL_TZ_DIGITALKEY_OK
	 * and it doesn't make sense to include tlc_tz_common.h here
	 */
	if (RET_TL_TZ_DIGITALKEY_OK != ret) {
		ret = TZ_DIGITALKEY_FUNCTION_FAILED;
		goto exit;
	}

	if (RET_TL_TZ_DIGITALKEY_OK != tl_digitalkey_ctx_initialize(ctx)) {
		ret = TZ_DIGITALKEY_FUNCTION_FAILED;
		goto exit;
	}
	ret = RET_TL_TZ_DIGITALKEY_OK;
	ctx->digitalkey_init_count++;

exit:
	respmsg->payload.resp.return_code = ret;
	return ret;
}
