blob: 246afe2b99086218292d46c99658a6beb766d5c9 [file] [log] [blame]
Madhukar Pappireddye9c18122024-09-10 16:28:48 -05001/*
2 * Copyright (c) 2024, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include "cactus_message_loop.h"
8#include "cactus_test_cmds.h"
9#include "debug.h"
J-Alves891856d2024-11-12 14:02:46 +000010#include <spm_helpers.h>
Madhukar Pappireddye9c18122024-09-10 16:28:48 -050011
12uint32_t ms_to_ticks(uint64_t ms)
13{
14 return ms * read_cntfrq_el0() / 1000;
15}
16
17CACTUS_CMD_HANDLER(set_virtual_timer, CACTUS_SET_ARCH_TIMER_CMD)
18{
19 uint64_t deadline_ms = cactus_get_timer_deadline(*args);
20 uint64_t wait_time = cactus_get_timer_wait_time(*args);
21 uint32_t ticks = ms_to_ticks(deadline_ms);
22
J-Alves891856d2024-11-12 14:02:46 +000023 /* Disable the arch timer. */
Madhukar Pappireddye9c18122024-09-10 16:28:48 -050024 write_cntp_ctl_el0(0);
J-Alves891856d2024-11-12 14:02:46 +000025
26 /* Enable the arch timer virtual interrupt. */
27 spm_interrupt_enable(TIMER_VIRTUAL_INTID, true, 0);
28
Madhukar Pappireddye9c18122024-09-10 16:28:48 -050029 write_cntp_tval_el0(ticks);
30 write_cntp_ctl_el0(1);
31
32 if (wait_time != 0U) {
33 waitms(wait_time);
34 }
35
36 return cactus_response(ffa_dir_msg_dest(*args),
37 ffa_dir_msg_source(*args),
38 CACTUS_SUCCESS);
39}