/*
 * Copyright (c) 2022 Arm Limited (or its affiliates). All rights reserved.
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/ztest.h>

#include "zephyr/arch/arm64/arm-smccc.h"

/* SMC function IDs for Standard Service queries */
#define ARM_STD_SMC_CALL_COUNT		0x8400ff00UL
#define ARM_STD_SMC_VERSION		0x8400ff03UL
#define ARM_STD_SMC_UNKNOWN		0xffffffffUL

#define SMC_UNK				-1

typedef void (*smc_call_method_t)(unsigned long, unsigned long,
				  unsigned long, unsigned long,
				  unsigned long, unsigned long,
				  unsigned long, unsigned long,
				  struct arm_smccc_res *);

#ifdef CONFIG_SMC_CALL_USE_HVC
	smc_call_method_t smc_call = arm_smccc_hvc;
#else
	smc_call_method_t smc_call = arm_smccc_smc;
#endif

ZTEST(arm64_smc_call, test_smc_call_func)
{
	struct arm_smccc_res res;

	smc_call(ARM_STD_SMC_CALL_COUNT, 0, 0, 0, 0, 0, 0, 0, &res);
	zassert_true(res.a0 > 0, "Wrong smc call count");

	smc_call(ARM_STD_SMC_VERSION, 0, 0, 0, 0, 0, 0, 0, &res);
	zassert_true((res.a0 >= 0 && res.a1 >= 0),
		"Wrong smc call version");

	smc_call(ARM_STD_SMC_UNKNOWN, 0, 0, 0, 0, 0, 0, 0, &res);
	zassert_true(res.a0 == SMC_UNK, "Wrong return code from smc call");
}

ZTEST_SUITE(arm64_smc_call, NULL, NULL, NULL, NULL, NULL);
