| /* 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); |
| } |