diff options
author | Peter Maydell | 2021-03-08 16:02:52 +0100 |
---|---|---|
committer | Peter Maydell | 2021-03-08 18:20:03 +0100 |
commit | bf7ca80386cd361a429c8eef4798bd2afe0219dc (patch) | |
tree | 126e7c76a603c5e7689297d0e3262034e953b882 /tests | |
parent | tests/qtest/sse-timer-test: Test the system timer (diff) | |
download | qemu-bf7ca80386cd361a429c8eef4798bd2afe0219dc.tar.gz qemu-bf7ca80386cd361a429c8eef4798bd2afe0219dc.tar.xz qemu-bf7ca80386cd361a429c8eef4798bd2afe0219dc.zip |
tests/qtest/sse-timer-test: Test counter scaling changes
Test that when we change the scaling of the system counter that the
system timer responds appropriately.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/qtest/sse-timer-test.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/tests/qtest/sse-timer-test.c b/tests/qtest/sse-timer-test.c index f4f6704b30..a65d7542d5 100644 --- a/tests/qtest/sse-timer-test.c +++ b/tests/qtest/sse-timer-test.c @@ -189,6 +189,37 @@ static void test_timer(void) g_assert_cmpuint(readl(TIMER_BASE + CNTP_AIVAL_HI), ==, 0x42); } +static void test_timer_scale_change(void) +{ + /* + * Test that the timer responds correctly to counter + * scaling changes while it has an active timer. + */ + reset_counter_and_timer(); + /* Give ourselves access to the timer, and enable the counter and timer */ + writel(PERIPHNSPPC0, 1); + writel(COUNTER_BASE + CNTCR, 1); + writel(TIMER_BASE + CNTP_CTL, 1); + /* Set the CompareValue to 4000 ticks */ + writel(TIMER_BASE + CNTP_CVAL_LO, 4000); + writel(TIMER_BASE + CNTP_CVAL_HI, 0); + /* Advance halfway and check ISTATUS is not set */ + clock_step_ticks(2000); + g_assert_cmpuint(readl(TIMER_BASE + CNTP_CTL), ==, 1); + /* Reprogram the counter to run at 1/16th speed */ + writel(COUNTER_BASE + CNTCR, 0); + writel(COUNTER_BASE + CNTSCR, 0x00100000); /* 1/16th normal speed */ + writel(COUNTER_BASE + CNTCR, 5); /* EN, SCEN */ + /* Advance to where the timer would have fired and check it has not */ + clock_step_ticks(2000); + g_assert_cmpuint(readl(TIMER_BASE + CNTP_CTL), ==, 1); + /* Advance to where the timer must fire at the new clock rate */ + clock_step_ticks(29996); + g_assert_cmpuint(readl(TIMER_BASE + CNTP_CTL), ==, 1); + clock_step_ticks(4); + g_assert_cmpuint(readl(TIMER_BASE + CNTP_CTL), ==, 5); +} + int main(int argc, char **argv) { int r; @@ -199,6 +230,7 @@ int main(int argc, char **argv) qtest_add_func("/sse-timer/counter", test_counter); qtest_add_func("/sse-timer/timer", test_timer); + qtest_add_func("/sse-timer/timer-scale-change", test_timer_scale_change); r = g_test_run(); |