diff options
Diffstat (limited to 'tests/test-arm-mptimer.c')
-rw-r--r-- | tests/test-arm-mptimer.c | 1105 |
1 files changed, 0 insertions, 1105 deletions
diff --git a/tests/test-arm-mptimer.c b/tests/test-arm-mptimer.c deleted file mode 100644 index cb8f2df914..0000000000 --- a/tests/test-arm-mptimer.c +++ /dev/null @@ -1,1105 +0,0 @@ -/* - * QTest testcase for the ARM MPTimer - * - * Copyright (c) 2016 Dmitry Osipenko <digetx@gmail.com> - * - * This work is licensed under the terms of the GNU GPL, version 2 or later. - * See the COPYING file in the top-level directory. - */ - -#include "qemu/osdep.h" -#include "qemu/timer.h" -#include "libqtest.h" - -#define TIMER_BLOCK_SCALE(s) ((((s) & 0xff) + 1) * 10) - -#define TIMER_BLOCK_STEP(scaler, steps_nb) \ - clock_step(TIMER_BLOCK_SCALE(scaler) * (int64_t)(steps_nb) + 1) - -#define TIMER_BASE_PHYS 0x1e000600 - -#define TIMER_LOAD 0x00 -#define TIMER_COUNTER 0x04 -#define TIMER_CONTROL 0x08 -#define TIMER_INTSTAT 0x0C - -#define TIMER_CONTROL_ENABLE (1 << 0) -#define TIMER_CONTROL_PERIODIC (1 << 1) -#define TIMER_CONTROL_IT_ENABLE (1 << 2) -#define TIMER_CONTROL_PRESCALER(p) (((p) & 0xff) << 8) - -#define PERIODIC 1 -#define ONESHOT 0 -#define NOSCALE 0 - -static int nonscaled = NOSCALE; -static int scaled = 122; - -static void timer_load(uint32_t load) -{ - writel(TIMER_BASE_PHYS + TIMER_LOAD, load); -} - -static void timer_start(int periodic, uint32_t scale) -{ - uint32_t ctl = TIMER_CONTROL_ENABLE | TIMER_CONTROL_PRESCALER(scale); - - if (periodic) { - ctl |= TIMER_CONTROL_PERIODIC; - } - - writel(TIMER_BASE_PHYS + TIMER_CONTROL, ctl); -} - -static void timer_stop(void) -{ - writel(TIMER_BASE_PHYS + TIMER_CONTROL, 0); -} - -static void timer_int_clr(void) -{ - writel(TIMER_BASE_PHYS + TIMER_INTSTAT, 1); -} - -static void timer_reset(void) -{ - timer_stop(); - timer_load(0); - timer_int_clr(); -} - -static uint32_t timer_get_and_clr_int_sts(void) -{ - uint32_t int_sts = readl(TIMER_BASE_PHYS + TIMER_INTSTAT); - - if (int_sts) { - timer_int_clr(); - } - - return int_sts; -} - -static uint32_t timer_counter(void) -{ - return readl(TIMER_BASE_PHYS + TIMER_COUNTER); -} - -static void timer_set_counter(uint32_t value) -{ - writel(TIMER_BASE_PHYS + TIMER_COUNTER, value); -} - -static void test_timer_oneshot(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_load(9999999); - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 9999); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - g_assert_cmpuint(timer_counter(), ==, 9990000); - - TIMER_BLOCK_STEP(scaler, 9990000); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - - TIMER_BLOCK_STEP(scaler, 9990000); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_pause(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_load(999999999); - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 999); - - g_assert_cmpuint(timer_counter(), ==, 999999000); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(scaler, 9000); - - g_assert_cmpuint(timer_counter(), ==, 999990000); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_stop(); - - g_assert_cmpuint(timer_counter(), ==, 999990000); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(scaler, 90000); - - g_assert_cmpuint(timer_counter(), ==, 999990000); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 999990000); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - g_assert_cmpuint(timer_counter(), ==, 0); - - TIMER_BLOCK_STEP(scaler, 999990000); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - g_assert_cmpuint(timer_counter(), ==, 0); -} - -static void test_timer_reload(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_load(UINT32_MAX); - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 90000); - - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 90000); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_load(UINT32_MAX); - - TIMER_BLOCK_STEP(scaler, 90000); - - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 90000); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_periodic(gconstpointer arg) -{ - int scaler = *((int *) arg); - int repeat = 10; - - timer_reset(); - timer_load(100); - timer_start(PERIODIC, scaler); - - while (repeat--) { - clock_step(TIMER_BLOCK_SCALE(scaler) * (101 + repeat) + 1); - - g_assert_cmpuint(timer_counter(), ==, 100 - repeat); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - - clock_step(TIMER_BLOCK_SCALE(scaler) * (101 - repeat) - 1); - } -} - -static void test_timer_oneshot_to_periodic(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_load(10000); - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 1000); - - g_assert_cmpuint(timer_counter(), ==, 9000); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 14001); - - g_assert_cmpuint(timer_counter(), ==, 5000); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); -} - -static void test_timer_periodic_to_oneshot(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_load(99999999); - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 999); - - g_assert_cmpuint(timer_counter(), ==, 99999000); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 99999009); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); -} - -static void test_timer_prescaler(void) -{ - timer_reset(); - timer_load(9999999); - timer_start(ONESHOT, NOSCALE); - - TIMER_BLOCK_STEP(NOSCALE, 9999998); - - g_assert_cmpuint(timer_counter(), ==, 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(NOSCALE, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - - timer_reset(); - timer_load(9999999); - timer_start(ONESHOT, 0xAB); - - TIMER_BLOCK_STEP(0xAB, 9999998); - - g_assert_cmpuint(timer_counter(), ==, 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(0xAB, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); -} - -static void test_timer_prescaler_on_the_fly(void) -{ - timer_reset(); - timer_load(9999999); - timer_start(ONESHOT, NOSCALE); - - TIMER_BLOCK_STEP(NOSCALE, 999); - - g_assert_cmpuint(timer_counter(), ==, 9999000); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_start(ONESHOT, 0xAB); - - TIMER_BLOCK_STEP(0xAB, 9000); - - g_assert_cmpuint(timer_counter(), ==, 9990000); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_set_oneshot_counter_to_0(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_load(UINT32_MAX); - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_set_counter(0); - - TIMER_BLOCK_STEP(scaler, 10); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); -} - -static void test_timer_set_periodic_counter_to_0(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_load(UINT32_MAX); - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_set_counter(0); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - (scaler ? 0 : 1)); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - timer_reset(); - timer_set_counter(UINT32_MAX); - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_set_counter(0); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); -} - -static void test_timer_noload_oneshot(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_noload_periodic(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); -} - -static void test_timer_zero_load_oneshot(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - g_assert_cmpuint(timer_counter(), ==, 0); - - timer_load(0); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_zero_load_periodic(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - g_assert_cmpuint(timer_counter(), ==, 0); - - timer_load(0); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); -} - -static void test_timer_zero_load_oneshot_to_nonzero(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - timer_load(0); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - g_assert_cmpuint(timer_counter(), ==, 0); - - timer_load(999); - - TIMER_BLOCK_STEP(scaler, 1001); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); -} - -static void test_timer_zero_load_periodic_to_nonzero(gconstpointer arg) -{ - int scaler = *((int *) arg); - int i; - - timer_reset(); - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - g_assert_cmpuint(timer_counter(), ==, 0); - - timer_load(0); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - timer_load(1999999); - - for (i = 1; i < 10; i++) { - TIMER_BLOCK_STEP(scaler, 2000001); - - g_assert_cmpuint(timer_counter(), ==, 1999999 - i); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - } -} - -static void test_timer_nonzero_load_oneshot_to_zero(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - g_assert_cmpuint(timer_counter(), ==, 0); - - timer_load(UINT32_MAX); - timer_load(0); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); -} - -static void test_timer_nonzero_load_periodic_to_zero(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - timer_load(UINT32_MAX); - timer_load(0); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); -} - -static void test_timer_set_periodic_counter_on_the_fly(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_load(UINT32_MAX / 2); - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX / 2 - 100); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_set_counter(UINT32_MAX); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 100); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_enable_and_set_counter(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - timer_set_counter(UINT32_MAX); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 100); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_set_counter_and_enable(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_set_counter(UINT32_MAX); - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 100); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_set_counter_disabled(void) -{ - timer_reset(); - timer_set_counter(999999999); - - TIMER_BLOCK_STEP(NOSCALE, 100); - - g_assert_cmpuint(timer_counter(), ==, 999999999); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_load_disabled(void) -{ - timer_reset(); - timer_load(999999999); - - TIMER_BLOCK_STEP(NOSCALE, 100); - - g_assert_cmpuint(timer_counter(), ==, 999999999); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_oneshot_with_counter_0_on_start(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_load(999); - timer_set_counter(0); - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_periodic_with_counter_0_on_start(gconstpointer arg) -{ - int scaler = *((int *) arg); - int i; - - timer_reset(); - timer_load(UINT32_MAX); - timer_set_counter(0); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - g_assert_cmpuint(timer_counter(), ==, 0); - - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX + (scaler ? 1 : 0) - 100); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX + (scaler ? 1 : 0) - 200); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_reset(); - timer_load(1999999); - timer_set_counter(0); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - for (i = 2 - (!!scaler ? 1 : 0); i < 10; i++) { - TIMER_BLOCK_STEP(scaler, 2000001); - - g_assert_cmpuint(timer_counter(), ==, 1999999 - i); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - } -} - -static void test_periodic_counter(gconstpointer arg) -{ - const int test_load = 10; - int scaler = *((int *) arg); - int test_val; - - timer_reset(); - timer_load(test_load); - timer_start(PERIODIC, scaler); - - clock_step(1); - - for (test_val = 0; test_val <= test_load; test_val++) { - clock_step(TIMER_BLOCK_SCALE(scaler) * test_load); - g_assert_cmpint(timer_counter(), ==, test_val); - } -} - -static void test_timer_set_counter_periodic_with_zero_load(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_start(PERIODIC, scaler); - timer_load(0); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - timer_set_counter(999); - - TIMER_BLOCK_STEP(scaler, 999); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); -} - -static void test_timer_set_oneshot_load_to_0(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_load(UINT32_MAX); - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 100); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_load(0); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_set_periodic_load_to_0(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_load(UINT32_MAX); - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 100); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_load(0); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - TIMER_BLOCK_STEP(scaler, 100); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - g_assert_cmpuint(timer_counter(), ==, 0); -} - -static void test_deferred_trigger(void) -{ - int mode = ONESHOT; - -again: - timer_reset(); - timer_start(mode, 255); - - clock_step(100); - - g_assert_cmpuint(timer_counter(), ==, 0); - - TIMER_BLOCK_STEP(255, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - - timer_reset(); - timer_load(2); - timer_start(mode, 255); - - clock_step(100); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(255, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(255, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - - timer_reset(); - timer_load(UINT32_MAX); - timer_start(mode, 255); - - clock_step(100); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_set_counter(0); - - clock_step(100); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(255, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - - timer_reset(); - timer_load(UINT32_MAX); - timer_start(mode, 255); - - clock_step(100); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_load(0); - - clock_step(100); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(255, 1); - - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - - if (mode == ONESHOT) { - mode = PERIODIC; - goto again; - } -} - -static void test_timer_zero_load_mode_switch(gconstpointer arg) -{ - int scaler = *((int *) arg); - - timer_reset(); - timer_load(0); - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - timer_start(ONESHOT, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(scaler, 1); - - timer_start(PERIODIC, scaler); - - TIMER_BLOCK_STEP(scaler, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler); -} - -static void test_timer_zero_load_prescaled_periodic_to_nonscaled_oneshot(void) -{ - timer_reset(); - timer_load(0); - timer_start(PERIODIC, 255); - - TIMER_BLOCK_STEP(255, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(255, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(255, 1); - - timer_start(ONESHOT, NOSCALE); - - TIMER_BLOCK_STEP(NOSCALE, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(NOSCALE, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_zero_load_prescaled_oneshot_to_nonscaled_periodic(void) -{ - timer_reset(); - timer_load(0); - timer_start(ONESHOT, 255); - - TIMER_BLOCK_STEP(255, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_start(PERIODIC, NOSCALE); - - TIMER_BLOCK_STEP(NOSCALE, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_zero_load_nonscaled_oneshot_to_prescaled_periodic(void) -{ - timer_reset(); - timer_load(0); - timer_start(ONESHOT, NOSCALE); - - TIMER_BLOCK_STEP(NOSCALE, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_start(PERIODIC, 255); - - TIMER_BLOCK_STEP(255, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(255, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -static void test_timer_zero_load_nonscaled_periodic_to_prescaled_oneshot(void) -{ - timer_reset(); - timer_load(0); - timer_start(PERIODIC, NOSCALE); - - TIMER_BLOCK_STEP(NOSCALE, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - timer_start(ONESHOT, 255); - - TIMER_BLOCK_STEP(255, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); - - TIMER_BLOCK_STEP(255, 1); - - g_assert_cmpuint(timer_counter(), ==, 0); - g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0); -} - -int main(int argc, char **argv) -{ - int *scaler = &nonscaled; - int ret; - - g_test_init(&argc, &argv, NULL); - - qtest_add_func("mptimer/deferred_trigger", test_deferred_trigger); - qtest_add_func("mptimer/load_disabled", test_timer_load_disabled); - qtest_add_func("mptimer/set_counter_disabled", test_timer_set_counter_disabled); - qtest_add_func("mptimer/zero_load_prescaled_periodic_to_nonscaled_oneshot", - test_timer_zero_load_prescaled_periodic_to_nonscaled_oneshot); - qtest_add_func("mptimer/zero_load_prescaled_oneshot_to_nonscaled_periodic", - test_timer_zero_load_prescaled_oneshot_to_nonscaled_periodic); - qtest_add_func("mptimer/zero_load_nonscaled_oneshot_to_prescaled_periodic", - test_timer_zero_load_nonscaled_oneshot_to_prescaled_periodic); - qtest_add_func("mptimer/zero_load_nonscaled_periodic_to_prescaled_oneshot", - test_timer_zero_load_nonscaled_periodic_to_prescaled_oneshot); - qtest_add_func("mptimer/prescaler", test_timer_prescaler); - qtest_add_func("mptimer/prescaler_on_the_fly", test_timer_prescaler_on_the_fly); - -tests_with_prescaler_arg: - qtest_add_data_func( - g_strdup_printf("mptimer/oneshot scaler=%d", *scaler), - scaler, test_timer_oneshot); - qtest_add_data_func( - g_strdup_printf("mptimer/pause scaler=%d", *scaler), - scaler, test_timer_pause); - qtest_add_data_func( - g_strdup_printf("mptimer/reload scaler=%d", *scaler), - scaler, test_timer_reload); - qtest_add_data_func( - g_strdup_printf("mptimer/periodic scaler=%d", *scaler), - scaler, test_timer_periodic); - qtest_add_data_func( - g_strdup_printf("mptimer/oneshot_to_periodic scaler=%d", *scaler), - scaler, test_timer_oneshot_to_periodic); - qtest_add_data_func( - g_strdup_printf("mptimer/periodic_to_oneshot scaler=%d", *scaler), - scaler, test_timer_periodic_to_oneshot); - qtest_add_data_func( - g_strdup_printf("mptimer/set_oneshot_counter_to_0 scaler=%d", *scaler), - scaler, test_timer_set_oneshot_counter_to_0); - qtest_add_data_func( - g_strdup_printf("mptimer/set_periodic_counter_to_0 scaler=%d", *scaler), - scaler, test_timer_set_periodic_counter_to_0); - qtest_add_data_func( - g_strdup_printf("mptimer/noload_oneshot scaler=%d", *scaler), - scaler, test_timer_noload_oneshot); - qtest_add_data_func( - g_strdup_printf("mptimer/noload_periodic scaler=%d", *scaler), - scaler, test_timer_noload_periodic); - qtest_add_data_func( - g_strdup_printf("mptimer/zero_load_oneshot scaler=%d", *scaler), - scaler, test_timer_zero_load_oneshot); - qtest_add_data_func( - g_strdup_printf("mptimer/zero_load_periodic scaler=%d", *scaler), - scaler, test_timer_zero_load_periodic); - qtest_add_data_func( - g_strdup_printf("mptimer/zero_load_oneshot_to_nonzero scaler=%d", *scaler), - scaler, test_timer_zero_load_oneshot_to_nonzero); - qtest_add_data_func( - g_strdup_printf("mptimer/zero_load_periodic_to_nonzero scaler=%d", *scaler), - scaler, test_timer_zero_load_periodic_to_nonzero); - qtest_add_data_func( - g_strdup_printf("mptimer/nonzero_load_oneshot_to_zero scaler=%d", *scaler), - scaler, test_timer_nonzero_load_oneshot_to_zero); - qtest_add_data_func( - g_strdup_printf("mptimer/nonzero_load_periodic_to_zero scaler=%d", *scaler), - scaler, test_timer_nonzero_load_periodic_to_zero); - qtest_add_data_func( - g_strdup_printf("mptimer/set_periodic_counter_on_the_fly scaler=%d", *scaler), - scaler, test_timer_set_periodic_counter_on_the_fly); - qtest_add_data_func( - g_strdup_printf("mptimer/enable_and_set_counter scaler=%d", *scaler), - scaler, test_timer_enable_and_set_counter); - qtest_add_data_func( - g_strdup_printf("mptimer/set_counter_and_enable scaler=%d", *scaler), - scaler, test_timer_set_counter_and_enable); - qtest_add_data_func( - g_strdup_printf("mptimer/oneshot_with_counter_0_on_start scaler=%d", *scaler), - scaler, test_timer_oneshot_with_counter_0_on_start); - qtest_add_data_func( - g_strdup_printf("mptimer/periodic_with_counter_0_on_start scaler=%d", *scaler), - scaler, test_timer_periodic_with_counter_0_on_start); - qtest_add_data_func( - g_strdup_printf("mptimer/periodic_counter scaler=%d", *scaler), - scaler, test_periodic_counter); - qtest_add_data_func( - g_strdup_printf("mptimer/set_counter_periodic_with_zero_load scaler=%d", *scaler), - scaler, test_timer_set_counter_periodic_with_zero_load); - qtest_add_data_func( - g_strdup_printf("mptimer/set_oneshot_load_to_0 scaler=%d", *scaler), - scaler, test_timer_set_oneshot_load_to_0); - qtest_add_data_func( - g_strdup_printf("mptimer/set_periodic_load_to_0 scaler=%d", *scaler), - scaler, test_timer_set_periodic_load_to_0); - qtest_add_data_func( - g_strdup_printf("mptimer/zero_load_mode_switch scaler=%d", *scaler), - scaler, test_timer_zero_load_mode_switch); - - if (scaler == &nonscaled) { - scaler = &scaled; - goto tests_with_prescaler_arg; - } - - qtest_start("-machine vexpress-a9"); - ret = g_test_run(); - qtest_end(); - - return ret; -} |