/* Copyright (c) 2022 Intel Corporation
 * SPDX-License-Identifier: Apache-2.0
 */
#include <zephyr/zephyr.h>
#include <zephyr/ztest.h>
#include <stdlib.h>
#include "tests.h"

cavs_ipc_handler_t ipm_handler;

static bool clock_msg(const struct device *dev, void *arg,
		      uint32_t data, uint32_t ext_data)
{
	*(uint32_t *)arg = data;
	return true;
}

void test_clock_calibrate(void)
{
	static volatile uint32_t host_dt;
	uint32_t cyc0, cyc1, hz, diff;

	/* Prime the host script's timestamp */
	cyc0 = k_cycle_get_32();
	cavs_ipc_send_message(CAVS_HOST_DEV, IPCCMD_TIMESTAMP, 0);

	k_msleep(1000);
	host_dt = 0;
	cavs_ipc_set_message_handler(CAVS_HOST_DEV, clock_msg, (void *)&host_dt);

	/* Now do it again, but with a handler to catch the result */
	cyc1 = k_cycle_get_32();
	cavs_ipc_send_message(CAVS_HOST_DEV, IPCCMD_TIMESTAMP, 0);
	AWAIT(host_dt != 0);
	cavs_ipc_set_message_handler(CAVS_HOST_DEV, NULL, NULL);

	hz = 1000000ULL * (cyc1 - cyc0) / host_dt;
	printk("CLOCK: %lld Hz\n", (1000000ULL * (cyc1 - cyc0)) / host_dt);

	/* Make sure we're within 1% of spec */
	diff = abs(hz - CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC);
	zassert_true((hz / MIN(1, diff)) > 100, "clock rate wrong");
}

void test_main(void)
{
	struct cavs_ipc_data *devdata = CAVS_HOST_DEV->data;

	ipm_handler = devdata->handle_message;

	ztest_test_suite(intel_adsp,
			 ztest_unit_test(test_smp_boot_delay),
			 ztest_unit_test(test_cpu_halt),
			 ztest_unit_test(test_post_boot_ipi),
			 ztest_unit_test(test_cpu_behavior),
			 ztest_unit_test(test_host_ipc),
			 ztest_unit_test(test_clock_calibrate),
			 ztest_unit_test(test_ipm_cavs_host)
			 );

	/* Wait a bit so the python script on host is ready to receive
	 * IPC messages. An IPC message could be used instead of a timer,
	 * but expecting IPC to be working on a test suite that is going
	 * to test IPC may not be indicated.
	 */
	k_msleep(1000);

	ztest_run_test_suite(intel_adsp);
}
