mirror of
				https://github.com/qemu/qemu.git
				synced 2025-10-31 12:07:31 +00:00 
			
		
		
		
	 dd21074972
			
		
	
	
		dd21074972
		
	
	
	
	
		
			
			Tests that require global_qtest or the related wrapper functions now use the libqtest-single.h header that is dedicated for everything related to global_qtest. The core libqtest.c and libqtest.h files are now completely indepedent from global_qtest, so that the core library is now not depending on a global state anymore. Message-Id: <20190904130047.25808-7-thuth@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
		
			
				
	
	
		
			1091 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1091 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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-single.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);
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * Add a qtest test that comes in two versions: one with
 | |
|  * a timer scaler setting, and one with the timer nonscaled.
 | |
|  */
 | |
| static void add_scaler_test(const char *str, bool scale,
 | |
|                             void (*fn)(const void *))
 | |
| {
 | |
|     char *name;
 | |
|     int *scaler = scale ? &scaled : &nonscaled;
 | |
| 
 | |
|     name = g_strdup_printf("%s=%d", str, *scaler);
 | |
|     qtest_add_data_func(name, scaler, fn);
 | |
|     g_free(name);
 | |
| }
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|     int ret;
 | |
|     int scale;
 | |
| 
 | |
|     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);
 | |
| 
 | |
|     for (scale = 0; scale < 2; scale++) {
 | |
|         add_scaler_test("mptimer/oneshot scaler",
 | |
|                         scale, test_timer_oneshot);
 | |
|         add_scaler_test("mptimer/pause scaler",
 | |
|                         scale, test_timer_pause);
 | |
|         add_scaler_test("mptimer/reload scaler",
 | |
|                         scale, test_timer_reload);
 | |
|         add_scaler_test("mptimer/periodic scaler",
 | |
|                         scale, test_timer_periodic);
 | |
|         add_scaler_test("mptimer/oneshot_to_periodic scaler",
 | |
|                         scale, test_timer_oneshot_to_periodic);
 | |
|         add_scaler_test("mptimer/periodic_to_oneshot scaler",
 | |
|                         scale, test_timer_periodic_to_oneshot);
 | |
|         add_scaler_test("mptimer/set_oneshot_counter_to_0 scaler",
 | |
|                         scale, test_timer_set_oneshot_counter_to_0);
 | |
|         add_scaler_test("mptimer/set_periodic_counter_to_0 scaler",
 | |
|                         scale, test_timer_set_periodic_counter_to_0);
 | |
|         add_scaler_test("mptimer/noload_oneshot scaler",
 | |
|                         scale, test_timer_noload_oneshot);
 | |
|         add_scaler_test("mptimer/noload_periodic scaler",
 | |
|                         scale, test_timer_noload_periodic);
 | |
|         add_scaler_test("mptimer/zero_load_oneshot scaler",
 | |
|                         scale, test_timer_zero_load_oneshot);
 | |
|         add_scaler_test("mptimer/zero_load_periodic scaler",
 | |
|                         scale, test_timer_zero_load_periodic);
 | |
|         add_scaler_test("mptimer/zero_load_oneshot_to_nonzero scaler",
 | |
|                         scale, test_timer_zero_load_oneshot_to_nonzero);
 | |
|         add_scaler_test("mptimer/zero_load_periodic_to_nonzero scaler",
 | |
|                         scale, test_timer_zero_load_periodic_to_nonzero);
 | |
|         add_scaler_test("mptimer/nonzero_load_oneshot_to_zero scaler",
 | |
|                         scale, test_timer_nonzero_load_oneshot_to_zero);
 | |
|         add_scaler_test("mptimer/nonzero_load_periodic_to_zero scaler",
 | |
|                         scale, test_timer_nonzero_load_periodic_to_zero);
 | |
|         add_scaler_test("mptimer/set_periodic_counter_on_the_fly scaler",
 | |
|                         scale, test_timer_set_periodic_counter_on_the_fly);
 | |
|         add_scaler_test("mptimer/enable_and_set_counter scaler",
 | |
|                         scale, test_timer_enable_and_set_counter);
 | |
|         add_scaler_test("mptimer/set_counter_and_enable scaler",
 | |
|                         scale, test_timer_set_counter_and_enable);
 | |
|         add_scaler_test("mptimer/oneshot_with_counter_0_on_start scaler",
 | |
|                         scale, test_timer_oneshot_with_counter_0_on_start);
 | |
|         add_scaler_test("mptimer/periodic_with_counter_0_on_start scaler",
 | |
|                         scale, test_timer_periodic_with_counter_0_on_start);
 | |
|         add_scaler_test("mptimer/periodic_counter scaler",
 | |
|                         scale, test_periodic_counter);
 | |
|         add_scaler_test("mptimer/set_counter_periodic_with_zero_load scaler",
 | |
|                         scale, test_timer_set_counter_periodic_with_zero_load);
 | |
|         add_scaler_test("mptimer/set_oneshot_load_to_0 scaler",
 | |
|                         scale, test_timer_set_oneshot_load_to_0);
 | |
|         add_scaler_test("mptimer/set_periodic_load_to_0 scaler",
 | |
|                         scale, test_timer_set_periodic_load_to_0);
 | |
|         add_scaler_test("mptimer/zero_load_mode_switch scaler",
 | |
|                         scale, test_timer_zero_load_mode_switch);
 | |
|     }
 | |
| 
 | |
|     qtest_start("-machine vexpress-a9");
 | |
|     ret = g_test_run();
 | |
|     qtest_end();
 | |
| 
 | |
|     return ret;
 | |
| }
 |