So far we were only testing the CVAL register. Add a test which programs
a (relative) TVAL value to check this functionality as well.
Also we go into WFI and wait for the interrupt to release us from it.
The timer tests are run with a 2 second timeout on the host side, so
that any failure in coming back would be covered.

Signed-off-by: Andre Przywara <andre.przyw...@arm.com>
---
 arm/timer.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/arm/timer.c b/arm/timer.c
index 1c9ef44..275d049 100644
--- a/arm/timer.c
+++ b/arm/timer.c
@@ -211,6 +211,7 @@ static void test_timer(struct timer_info *info)
        u64 now = info->read_counter();
        u64 time_10s = read_sysreg(cntfrq_el0) * 10;
        u64 later = now + time_10s;
+       s32 left;
 
        /* We don't want the irq handler to fire because that will change the
         * timer state and we want to test the timer output signal.  We can
@@ -236,6 +237,15 @@ static void test_timer(struct timer_info *info)
 
        /* Disable the timer again */
        info->write_ctl(0);
+
+       /* Test TVAL and IRQ trigger */
+       info->irq_received = false;
+       info->write_tval(read_sysreg(cntfrq_el0) / 100);        /* 10 ms */
+       info->write_ctl(ARCH_TIMER_CTL_ENABLE);
+       wfi();
+       left = info->read_tval();
+       report("interrupt received after TVAL/WFI", info->irq_received);
+       report("timer has expired (%d)", left < 0, left);
 }
 
 static void test_vtimer(void)
-- 
2.14.4


Reply via email to