xref: /qemu/tests/qtest/test-arm-mptimer.c (revision 882fac37296bf05f0c29bd39e9da7b69431935e6)
1*882fac37SDmitry Osipenko /*
2*882fac37SDmitry Osipenko  * QTest testcase for the ARM MPTimer
3*882fac37SDmitry Osipenko  *
4*882fac37SDmitry Osipenko  * Copyright (c) 2016 Dmitry Osipenko <digetx@gmail.com>
5*882fac37SDmitry Osipenko  *
6*882fac37SDmitry Osipenko  * This work is licensed under the terms of the GNU GPL, version 2 or later.
7*882fac37SDmitry Osipenko  * See the COPYING file in the top-level directory.
8*882fac37SDmitry Osipenko  */
9*882fac37SDmitry Osipenko 
10*882fac37SDmitry Osipenko #include "qemu/osdep.h"
11*882fac37SDmitry Osipenko #include "qemu/timer.h"
12*882fac37SDmitry Osipenko #include "libqtest.h"
13*882fac37SDmitry Osipenko 
14*882fac37SDmitry Osipenko #define TIMER_BLOCK_SCALE(s)    ((((s) & 0xff) + 1) * 10)
15*882fac37SDmitry Osipenko 
16*882fac37SDmitry Osipenko #define TIMER_BLOCK_STEP(scaler, steps_nb) \
17*882fac37SDmitry Osipenko     clock_step(TIMER_BLOCK_SCALE(scaler) * (int64_t)(steps_nb) + 1)
18*882fac37SDmitry Osipenko 
19*882fac37SDmitry Osipenko #define TIMER_BASE_PHYS 0x1e000600
20*882fac37SDmitry Osipenko 
21*882fac37SDmitry Osipenko #define TIMER_LOAD      0x00
22*882fac37SDmitry Osipenko #define TIMER_COUNTER   0x04
23*882fac37SDmitry Osipenko #define TIMER_CONTROL   0x08
24*882fac37SDmitry Osipenko #define TIMER_INTSTAT   0x0C
25*882fac37SDmitry Osipenko 
26*882fac37SDmitry Osipenko #define TIMER_CONTROL_ENABLE        (1 << 0)
27*882fac37SDmitry Osipenko #define TIMER_CONTROL_PERIODIC      (1 << 1)
28*882fac37SDmitry Osipenko #define TIMER_CONTROL_IT_ENABLE     (1 << 2)
29*882fac37SDmitry Osipenko #define TIMER_CONTROL_PRESCALER(p)  (((p) & 0xff) << 8)
30*882fac37SDmitry Osipenko 
31*882fac37SDmitry Osipenko #define PERIODIC     1
32*882fac37SDmitry Osipenko #define ONESHOT      0
33*882fac37SDmitry Osipenko #define NOSCALE      0
34*882fac37SDmitry Osipenko 
35*882fac37SDmitry Osipenko static int nonscaled = NOSCALE;
36*882fac37SDmitry Osipenko static int scaled = 122;
37*882fac37SDmitry Osipenko 
38*882fac37SDmitry Osipenko static void timer_load(uint32_t load)
39*882fac37SDmitry Osipenko {
40*882fac37SDmitry Osipenko     writel(TIMER_BASE_PHYS + TIMER_LOAD, load);
41*882fac37SDmitry Osipenko }
42*882fac37SDmitry Osipenko 
43*882fac37SDmitry Osipenko static void timer_start(int periodic, uint32_t scale)
44*882fac37SDmitry Osipenko {
45*882fac37SDmitry Osipenko     uint32_t ctl = TIMER_CONTROL_ENABLE | TIMER_CONTROL_PRESCALER(scale);
46*882fac37SDmitry Osipenko 
47*882fac37SDmitry Osipenko     if (periodic) {
48*882fac37SDmitry Osipenko         ctl |= TIMER_CONTROL_PERIODIC;
49*882fac37SDmitry Osipenko     }
50*882fac37SDmitry Osipenko 
51*882fac37SDmitry Osipenko     writel(TIMER_BASE_PHYS + TIMER_CONTROL, ctl);
52*882fac37SDmitry Osipenko }
53*882fac37SDmitry Osipenko 
54*882fac37SDmitry Osipenko static void timer_stop(void)
55*882fac37SDmitry Osipenko {
56*882fac37SDmitry Osipenko     writel(TIMER_BASE_PHYS + TIMER_CONTROL, 0);
57*882fac37SDmitry Osipenko }
58*882fac37SDmitry Osipenko 
59*882fac37SDmitry Osipenko static void timer_int_clr(void)
60*882fac37SDmitry Osipenko {
61*882fac37SDmitry Osipenko     writel(TIMER_BASE_PHYS + TIMER_INTSTAT, 1);
62*882fac37SDmitry Osipenko }
63*882fac37SDmitry Osipenko 
64*882fac37SDmitry Osipenko static void timer_reset(void)
65*882fac37SDmitry Osipenko {
66*882fac37SDmitry Osipenko     timer_stop();
67*882fac37SDmitry Osipenko     timer_load(0);
68*882fac37SDmitry Osipenko     timer_int_clr();
69*882fac37SDmitry Osipenko }
70*882fac37SDmitry Osipenko 
71*882fac37SDmitry Osipenko static uint32_t timer_get_and_clr_int_sts(void)
72*882fac37SDmitry Osipenko {
73*882fac37SDmitry Osipenko     uint32_t int_sts = readl(TIMER_BASE_PHYS + TIMER_INTSTAT);
74*882fac37SDmitry Osipenko 
75*882fac37SDmitry Osipenko     if (int_sts) {
76*882fac37SDmitry Osipenko         timer_int_clr();
77*882fac37SDmitry Osipenko     }
78*882fac37SDmitry Osipenko 
79*882fac37SDmitry Osipenko     return int_sts;
80*882fac37SDmitry Osipenko }
81*882fac37SDmitry Osipenko 
82*882fac37SDmitry Osipenko static uint32_t timer_counter(void)
83*882fac37SDmitry Osipenko {
84*882fac37SDmitry Osipenko     return readl(TIMER_BASE_PHYS + TIMER_COUNTER);
85*882fac37SDmitry Osipenko }
86*882fac37SDmitry Osipenko 
87*882fac37SDmitry Osipenko static void timer_set_counter(uint32_t value)
88*882fac37SDmitry Osipenko {
89*882fac37SDmitry Osipenko     writel(TIMER_BASE_PHYS + TIMER_COUNTER, value);
90*882fac37SDmitry Osipenko }
91*882fac37SDmitry Osipenko 
92*882fac37SDmitry Osipenko static void test_timer_oneshot(gconstpointer arg)
93*882fac37SDmitry Osipenko {
94*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
95*882fac37SDmitry Osipenko 
96*882fac37SDmitry Osipenko     timer_reset();
97*882fac37SDmitry Osipenko     timer_load(9999999);
98*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
99*882fac37SDmitry Osipenko 
100*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 9999);
101*882fac37SDmitry Osipenko 
102*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
103*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 9990000);
104*882fac37SDmitry Osipenko 
105*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 9990000);
106*882fac37SDmitry Osipenko 
107*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
108*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
109*882fac37SDmitry Osipenko 
110*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 9990000);
111*882fac37SDmitry Osipenko 
112*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
113*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
114*882fac37SDmitry Osipenko }
115*882fac37SDmitry Osipenko 
116*882fac37SDmitry Osipenko static void test_timer_pause(gconstpointer arg)
117*882fac37SDmitry Osipenko {
118*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
119*882fac37SDmitry Osipenko 
120*882fac37SDmitry Osipenko     timer_reset();
121*882fac37SDmitry Osipenko     timer_load(999999999);
122*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
123*882fac37SDmitry Osipenko 
124*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 999);
125*882fac37SDmitry Osipenko 
126*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 999999000);
127*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
128*882fac37SDmitry Osipenko 
129*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 9000);
130*882fac37SDmitry Osipenko 
131*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 999990000);
132*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
133*882fac37SDmitry Osipenko 
134*882fac37SDmitry Osipenko     timer_stop();
135*882fac37SDmitry Osipenko 
136*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 999990000);
137*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
138*882fac37SDmitry Osipenko 
139*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 90000);
140*882fac37SDmitry Osipenko 
141*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 999990000);
142*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
143*882fac37SDmitry Osipenko 
144*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
145*882fac37SDmitry Osipenko 
146*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 999990000);
147*882fac37SDmitry Osipenko 
148*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
149*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
150*882fac37SDmitry Osipenko 
151*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 999990000);
152*882fac37SDmitry Osipenko 
153*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
154*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
155*882fac37SDmitry Osipenko }
156*882fac37SDmitry Osipenko 
157*882fac37SDmitry Osipenko static void test_timer_reload(gconstpointer arg)
158*882fac37SDmitry Osipenko {
159*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
160*882fac37SDmitry Osipenko 
161*882fac37SDmitry Osipenko     timer_reset();
162*882fac37SDmitry Osipenko     timer_load(UINT32_MAX);
163*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
164*882fac37SDmitry Osipenko 
165*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 90000);
166*882fac37SDmitry Osipenko 
167*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 90000);
168*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
169*882fac37SDmitry Osipenko 
170*882fac37SDmitry Osipenko     timer_load(UINT32_MAX);
171*882fac37SDmitry Osipenko 
172*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 90000);
173*882fac37SDmitry Osipenko 
174*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 90000);
175*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
176*882fac37SDmitry Osipenko }
177*882fac37SDmitry Osipenko 
178*882fac37SDmitry Osipenko static void test_timer_periodic(gconstpointer arg)
179*882fac37SDmitry Osipenko {
180*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
181*882fac37SDmitry Osipenko     int repeat = 10;
182*882fac37SDmitry Osipenko 
183*882fac37SDmitry Osipenko     timer_reset();
184*882fac37SDmitry Osipenko     timer_load(100);
185*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
186*882fac37SDmitry Osipenko 
187*882fac37SDmitry Osipenko     while (repeat--) {
188*882fac37SDmitry Osipenko         clock_step(TIMER_BLOCK_SCALE(scaler) * (101 + repeat) + 1);
189*882fac37SDmitry Osipenko 
190*882fac37SDmitry Osipenko         g_assert_cmpuint(timer_counter(), ==, 100 - repeat);
191*882fac37SDmitry Osipenko         g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
192*882fac37SDmitry Osipenko 
193*882fac37SDmitry Osipenko         clock_step(TIMER_BLOCK_SCALE(scaler) * (101 - repeat) - 1);
194*882fac37SDmitry Osipenko     }
195*882fac37SDmitry Osipenko }
196*882fac37SDmitry Osipenko 
197*882fac37SDmitry Osipenko static void test_timer_oneshot_to_periodic(gconstpointer arg)
198*882fac37SDmitry Osipenko {
199*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
200*882fac37SDmitry Osipenko 
201*882fac37SDmitry Osipenko     timer_reset();
202*882fac37SDmitry Osipenko     timer_load(10000);
203*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
204*882fac37SDmitry Osipenko 
205*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1000);
206*882fac37SDmitry Osipenko 
207*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 9000);
208*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
209*882fac37SDmitry Osipenko 
210*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
211*882fac37SDmitry Osipenko 
212*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 14001);
213*882fac37SDmitry Osipenko 
214*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 5000);
215*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
216*882fac37SDmitry Osipenko }
217*882fac37SDmitry Osipenko 
218*882fac37SDmitry Osipenko static void test_timer_periodic_to_oneshot(gconstpointer arg)
219*882fac37SDmitry Osipenko {
220*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
221*882fac37SDmitry Osipenko 
222*882fac37SDmitry Osipenko     timer_reset();
223*882fac37SDmitry Osipenko     timer_load(99999999);
224*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
225*882fac37SDmitry Osipenko 
226*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 999);
227*882fac37SDmitry Osipenko 
228*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 99999000);
229*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
230*882fac37SDmitry Osipenko 
231*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
232*882fac37SDmitry Osipenko 
233*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 99999009);
234*882fac37SDmitry Osipenko 
235*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
236*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
237*882fac37SDmitry Osipenko }
238*882fac37SDmitry Osipenko 
239*882fac37SDmitry Osipenko static void test_timer_prescaler(void)
240*882fac37SDmitry Osipenko {
241*882fac37SDmitry Osipenko     timer_reset();
242*882fac37SDmitry Osipenko     timer_load(9999999);
243*882fac37SDmitry Osipenko     timer_start(ONESHOT, NOSCALE);
244*882fac37SDmitry Osipenko 
245*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(NOSCALE, 9999998);
246*882fac37SDmitry Osipenko 
247*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 1);
248*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
249*882fac37SDmitry Osipenko 
250*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(NOSCALE, 1);
251*882fac37SDmitry Osipenko 
252*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
253*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
254*882fac37SDmitry Osipenko 
255*882fac37SDmitry Osipenko     timer_reset();
256*882fac37SDmitry Osipenko     timer_load(9999999);
257*882fac37SDmitry Osipenko     timer_start(ONESHOT, 0xAB);
258*882fac37SDmitry Osipenko 
259*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(0xAB, 9999998);
260*882fac37SDmitry Osipenko 
261*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 1);
262*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
263*882fac37SDmitry Osipenko 
264*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(0xAB, 1);
265*882fac37SDmitry Osipenko 
266*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
267*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
268*882fac37SDmitry Osipenko }
269*882fac37SDmitry Osipenko 
270*882fac37SDmitry Osipenko static void test_timer_prescaler_on_the_fly(void)
271*882fac37SDmitry Osipenko {
272*882fac37SDmitry Osipenko     timer_reset();
273*882fac37SDmitry Osipenko     timer_load(9999999);
274*882fac37SDmitry Osipenko     timer_start(ONESHOT, NOSCALE);
275*882fac37SDmitry Osipenko 
276*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(NOSCALE, 999);
277*882fac37SDmitry Osipenko 
278*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 9999000);
279*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
280*882fac37SDmitry Osipenko 
281*882fac37SDmitry Osipenko     timer_start(ONESHOT, 0xAB);
282*882fac37SDmitry Osipenko 
283*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(0xAB, 9000);
284*882fac37SDmitry Osipenko 
285*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 9990000);
286*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
287*882fac37SDmitry Osipenko }
288*882fac37SDmitry Osipenko 
289*882fac37SDmitry Osipenko static void test_timer_set_oneshot_counter_to_0(gconstpointer arg)
290*882fac37SDmitry Osipenko {
291*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
292*882fac37SDmitry Osipenko 
293*882fac37SDmitry Osipenko     timer_reset();
294*882fac37SDmitry Osipenko     timer_load(UINT32_MAX);
295*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
296*882fac37SDmitry Osipenko 
297*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
298*882fac37SDmitry Osipenko 
299*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 1);
300*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
301*882fac37SDmitry Osipenko 
302*882fac37SDmitry Osipenko     timer_set_counter(0);
303*882fac37SDmitry Osipenko 
304*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 10);
305*882fac37SDmitry Osipenko 
306*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
307*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
308*882fac37SDmitry Osipenko }
309*882fac37SDmitry Osipenko 
310*882fac37SDmitry Osipenko static void test_timer_set_periodic_counter_to_0(gconstpointer arg)
311*882fac37SDmitry Osipenko {
312*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
313*882fac37SDmitry Osipenko 
314*882fac37SDmitry Osipenko     timer_reset();
315*882fac37SDmitry Osipenko     timer_load(UINT32_MAX);
316*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
317*882fac37SDmitry Osipenko 
318*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
319*882fac37SDmitry Osipenko 
320*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 1);
321*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
322*882fac37SDmitry Osipenko 
323*882fac37SDmitry Osipenko     timer_set_counter(0);
324*882fac37SDmitry Osipenko 
325*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
326*882fac37SDmitry Osipenko 
327*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - (scaler ? 0 : 1));
328*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
329*882fac37SDmitry Osipenko 
330*882fac37SDmitry Osipenko     timer_reset();
331*882fac37SDmitry Osipenko     timer_set_counter(UINT32_MAX);
332*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
333*882fac37SDmitry Osipenko 
334*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
335*882fac37SDmitry Osipenko 
336*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 1);
337*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
338*882fac37SDmitry Osipenko 
339*882fac37SDmitry Osipenko     timer_set_counter(0);
340*882fac37SDmitry Osipenko 
341*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
342*882fac37SDmitry Osipenko 
343*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
344*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
345*882fac37SDmitry Osipenko }
346*882fac37SDmitry Osipenko 
347*882fac37SDmitry Osipenko static void test_timer_noload_oneshot(gconstpointer arg)
348*882fac37SDmitry Osipenko {
349*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
350*882fac37SDmitry Osipenko 
351*882fac37SDmitry Osipenko     timer_reset();
352*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
353*882fac37SDmitry Osipenko 
354*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
355*882fac37SDmitry Osipenko 
356*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
357*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
358*882fac37SDmitry Osipenko 
359*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
360*882fac37SDmitry Osipenko 
361*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
362*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
363*882fac37SDmitry Osipenko }
364*882fac37SDmitry Osipenko 
365*882fac37SDmitry Osipenko static void test_timer_noload_periodic(gconstpointer arg)
366*882fac37SDmitry Osipenko {
367*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
368*882fac37SDmitry Osipenko 
369*882fac37SDmitry Osipenko     timer_reset();
370*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
371*882fac37SDmitry Osipenko 
372*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
373*882fac37SDmitry Osipenko 
374*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
375*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
376*882fac37SDmitry Osipenko 
377*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
378*882fac37SDmitry Osipenko 
379*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
380*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
381*882fac37SDmitry Osipenko }
382*882fac37SDmitry Osipenko 
383*882fac37SDmitry Osipenko static void test_timer_zero_load_oneshot(gconstpointer arg)
384*882fac37SDmitry Osipenko {
385*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
386*882fac37SDmitry Osipenko 
387*882fac37SDmitry Osipenko     timer_reset();
388*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
389*882fac37SDmitry Osipenko 
390*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
391*882fac37SDmitry Osipenko 
392*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
393*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
394*882fac37SDmitry Osipenko 
395*882fac37SDmitry Osipenko     timer_load(0);
396*882fac37SDmitry Osipenko 
397*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
398*882fac37SDmitry Osipenko 
399*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
400*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
401*882fac37SDmitry Osipenko 
402*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
403*882fac37SDmitry Osipenko 
404*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
405*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
406*882fac37SDmitry Osipenko }
407*882fac37SDmitry Osipenko 
408*882fac37SDmitry Osipenko static void test_timer_zero_load_periodic(gconstpointer arg)
409*882fac37SDmitry Osipenko {
410*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
411*882fac37SDmitry Osipenko 
412*882fac37SDmitry Osipenko     timer_reset();
413*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
414*882fac37SDmitry Osipenko 
415*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
416*882fac37SDmitry Osipenko 
417*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
418*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
419*882fac37SDmitry Osipenko 
420*882fac37SDmitry Osipenko     timer_load(0);
421*882fac37SDmitry Osipenko 
422*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
423*882fac37SDmitry Osipenko 
424*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
425*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
426*882fac37SDmitry Osipenko 
427*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
428*882fac37SDmitry Osipenko 
429*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
430*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
431*882fac37SDmitry Osipenko }
432*882fac37SDmitry Osipenko 
433*882fac37SDmitry Osipenko static void test_timer_zero_load_oneshot_to_nonzero(gconstpointer arg)
434*882fac37SDmitry Osipenko {
435*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
436*882fac37SDmitry Osipenko 
437*882fac37SDmitry Osipenko     timer_reset();
438*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
439*882fac37SDmitry Osipenko 
440*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
441*882fac37SDmitry Osipenko 
442*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
443*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
444*882fac37SDmitry Osipenko 
445*882fac37SDmitry Osipenko     timer_load(0);
446*882fac37SDmitry Osipenko 
447*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
448*882fac37SDmitry Osipenko 
449*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
450*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
451*882fac37SDmitry Osipenko 
452*882fac37SDmitry Osipenko     timer_load(999);
453*882fac37SDmitry Osipenko 
454*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1001);
455*882fac37SDmitry Osipenko 
456*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
457*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
458*882fac37SDmitry Osipenko }
459*882fac37SDmitry Osipenko 
460*882fac37SDmitry Osipenko static void test_timer_zero_load_periodic_to_nonzero(gconstpointer arg)
461*882fac37SDmitry Osipenko {
462*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
463*882fac37SDmitry Osipenko     int i;
464*882fac37SDmitry Osipenko 
465*882fac37SDmitry Osipenko     timer_reset();
466*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
467*882fac37SDmitry Osipenko 
468*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
469*882fac37SDmitry Osipenko 
470*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
471*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
472*882fac37SDmitry Osipenko 
473*882fac37SDmitry Osipenko     timer_load(0);
474*882fac37SDmitry Osipenko 
475*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
476*882fac37SDmitry Osipenko 
477*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
478*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
479*882fac37SDmitry Osipenko 
480*882fac37SDmitry Osipenko     timer_load(1999999);
481*882fac37SDmitry Osipenko 
482*882fac37SDmitry Osipenko     for (i = 1; i < 10; i++) {
483*882fac37SDmitry Osipenko         TIMER_BLOCK_STEP(scaler, 2000001);
484*882fac37SDmitry Osipenko 
485*882fac37SDmitry Osipenko         g_assert_cmpuint(timer_counter(), ==, 1999999 - i);
486*882fac37SDmitry Osipenko         g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
487*882fac37SDmitry Osipenko         g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
488*882fac37SDmitry Osipenko     }
489*882fac37SDmitry Osipenko }
490*882fac37SDmitry Osipenko 
491*882fac37SDmitry Osipenko static void test_timer_nonzero_load_oneshot_to_zero(gconstpointer arg)
492*882fac37SDmitry Osipenko {
493*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
494*882fac37SDmitry Osipenko 
495*882fac37SDmitry Osipenko     timer_reset();
496*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
497*882fac37SDmitry Osipenko 
498*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
499*882fac37SDmitry Osipenko 
500*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
501*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
502*882fac37SDmitry Osipenko 
503*882fac37SDmitry Osipenko     timer_load(UINT32_MAX);
504*882fac37SDmitry Osipenko     timer_load(0);
505*882fac37SDmitry Osipenko 
506*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
507*882fac37SDmitry Osipenko 
508*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
509*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
510*882fac37SDmitry Osipenko }
511*882fac37SDmitry Osipenko 
512*882fac37SDmitry Osipenko static void test_timer_nonzero_load_periodic_to_zero(gconstpointer arg)
513*882fac37SDmitry Osipenko {
514*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
515*882fac37SDmitry Osipenko 
516*882fac37SDmitry Osipenko     timer_reset();
517*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
518*882fac37SDmitry Osipenko 
519*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
520*882fac37SDmitry Osipenko 
521*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
522*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
523*882fac37SDmitry Osipenko 
524*882fac37SDmitry Osipenko     timer_load(UINT32_MAX);
525*882fac37SDmitry Osipenko     timer_load(0);
526*882fac37SDmitry Osipenko 
527*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
528*882fac37SDmitry Osipenko 
529*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
530*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
531*882fac37SDmitry Osipenko }
532*882fac37SDmitry Osipenko 
533*882fac37SDmitry Osipenko static void test_timer_set_periodic_counter_on_the_fly(gconstpointer arg)
534*882fac37SDmitry Osipenko {
535*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
536*882fac37SDmitry Osipenko 
537*882fac37SDmitry Osipenko     timer_reset();
538*882fac37SDmitry Osipenko     timer_load(UINT32_MAX / 2);
539*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
540*882fac37SDmitry Osipenko 
541*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
542*882fac37SDmitry Osipenko 
543*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX / 2 - 100);
544*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
545*882fac37SDmitry Osipenko 
546*882fac37SDmitry Osipenko     timer_set_counter(UINT32_MAX);
547*882fac37SDmitry Osipenko 
548*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
549*882fac37SDmitry Osipenko 
550*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 100);
551*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
552*882fac37SDmitry Osipenko }
553*882fac37SDmitry Osipenko 
554*882fac37SDmitry Osipenko static void test_timer_enable_and_set_counter(gconstpointer arg)
555*882fac37SDmitry Osipenko {
556*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
557*882fac37SDmitry Osipenko 
558*882fac37SDmitry Osipenko     timer_reset();
559*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
560*882fac37SDmitry Osipenko 
561*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
562*882fac37SDmitry Osipenko 
563*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
564*882fac37SDmitry Osipenko 
565*882fac37SDmitry Osipenko     timer_set_counter(UINT32_MAX);
566*882fac37SDmitry Osipenko 
567*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
568*882fac37SDmitry Osipenko 
569*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 100);
570*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
571*882fac37SDmitry Osipenko }
572*882fac37SDmitry Osipenko 
573*882fac37SDmitry Osipenko static void test_timer_set_counter_and_enable(gconstpointer arg)
574*882fac37SDmitry Osipenko {
575*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
576*882fac37SDmitry Osipenko 
577*882fac37SDmitry Osipenko     timer_reset();
578*882fac37SDmitry Osipenko     timer_set_counter(UINT32_MAX);
579*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
580*882fac37SDmitry Osipenko 
581*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
582*882fac37SDmitry Osipenko 
583*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 100);
584*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
585*882fac37SDmitry Osipenko }
586*882fac37SDmitry Osipenko 
587*882fac37SDmitry Osipenko static void test_timer_set_counter_disabled(void)
588*882fac37SDmitry Osipenko {
589*882fac37SDmitry Osipenko     timer_reset();
590*882fac37SDmitry Osipenko     timer_set_counter(999999999);
591*882fac37SDmitry Osipenko 
592*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(NOSCALE, 100);
593*882fac37SDmitry Osipenko 
594*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 999999999);
595*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
596*882fac37SDmitry Osipenko }
597*882fac37SDmitry Osipenko 
598*882fac37SDmitry Osipenko static void test_timer_load_disabled(void)
599*882fac37SDmitry Osipenko {
600*882fac37SDmitry Osipenko     timer_reset();
601*882fac37SDmitry Osipenko     timer_load(999999999);
602*882fac37SDmitry Osipenko 
603*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(NOSCALE, 100);
604*882fac37SDmitry Osipenko 
605*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 999999999);
606*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
607*882fac37SDmitry Osipenko }
608*882fac37SDmitry Osipenko 
609*882fac37SDmitry Osipenko static void test_timer_oneshot_with_counter_0_on_start(gconstpointer arg)
610*882fac37SDmitry Osipenko {
611*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
612*882fac37SDmitry Osipenko 
613*882fac37SDmitry Osipenko     timer_reset();
614*882fac37SDmitry Osipenko     timer_load(999);
615*882fac37SDmitry Osipenko     timer_set_counter(0);
616*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
617*882fac37SDmitry Osipenko 
618*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
619*882fac37SDmitry Osipenko 
620*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
621*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
622*882fac37SDmitry Osipenko 
623*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
624*882fac37SDmitry Osipenko 
625*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
626*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
627*882fac37SDmitry Osipenko }
628*882fac37SDmitry Osipenko 
629*882fac37SDmitry Osipenko static void test_timer_periodic_with_counter_0_on_start(gconstpointer arg)
630*882fac37SDmitry Osipenko {
631*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
632*882fac37SDmitry Osipenko     int i;
633*882fac37SDmitry Osipenko 
634*882fac37SDmitry Osipenko     timer_reset();
635*882fac37SDmitry Osipenko     timer_load(UINT32_MAX);
636*882fac37SDmitry Osipenko     timer_set_counter(0);
637*882fac37SDmitry Osipenko 
638*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
639*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
640*882fac37SDmitry Osipenko 
641*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
642*882fac37SDmitry Osipenko 
643*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
644*882fac37SDmitry Osipenko 
645*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
646*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX + (scaler ? 1 : 0) - 100);
647*882fac37SDmitry Osipenko 
648*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
649*882fac37SDmitry Osipenko 
650*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX + (scaler ? 1 : 0) - 200);
651*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
652*882fac37SDmitry Osipenko 
653*882fac37SDmitry Osipenko     timer_reset();
654*882fac37SDmitry Osipenko     timer_load(1999999);
655*882fac37SDmitry Osipenko     timer_set_counter(0);
656*882fac37SDmitry Osipenko 
657*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
658*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
659*882fac37SDmitry Osipenko 
660*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
661*882fac37SDmitry Osipenko 
662*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
663*882fac37SDmitry Osipenko 
664*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
665*882fac37SDmitry Osipenko 
666*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
667*882fac37SDmitry Osipenko 
668*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
669*882fac37SDmitry Osipenko 
670*882fac37SDmitry Osipenko     for (i = 2 - (!!scaler ? 1 : 0); i < 10; i++) {
671*882fac37SDmitry Osipenko         TIMER_BLOCK_STEP(scaler, 2000001);
672*882fac37SDmitry Osipenko 
673*882fac37SDmitry Osipenko         g_assert_cmpuint(timer_counter(), ==, 1999999 - i);
674*882fac37SDmitry Osipenko         g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
675*882fac37SDmitry Osipenko         g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
676*882fac37SDmitry Osipenko     }
677*882fac37SDmitry Osipenko }
678*882fac37SDmitry Osipenko 
679*882fac37SDmitry Osipenko static void test_periodic_counter(gconstpointer arg)
680*882fac37SDmitry Osipenko {
681*882fac37SDmitry Osipenko     const int test_load = 10;
682*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
683*882fac37SDmitry Osipenko     int test_val;
684*882fac37SDmitry Osipenko 
685*882fac37SDmitry Osipenko     timer_reset();
686*882fac37SDmitry Osipenko     timer_load(test_load);
687*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
688*882fac37SDmitry Osipenko 
689*882fac37SDmitry Osipenko     clock_step(1);
690*882fac37SDmitry Osipenko 
691*882fac37SDmitry Osipenko     for (test_val = 0; test_val <= test_load; test_val++) {
692*882fac37SDmitry Osipenko         clock_step(TIMER_BLOCK_SCALE(scaler) * test_load);
693*882fac37SDmitry Osipenko         g_assert_cmpint(timer_counter(), ==, test_val);
694*882fac37SDmitry Osipenko     }
695*882fac37SDmitry Osipenko }
696*882fac37SDmitry Osipenko 
697*882fac37SDmitry Osipenko static void test_timer_set_counter_periodic_with_zero_load(gconstpointer arg)
698*882fac37SDmitry Osipenko {
699*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
700*882fac37SDmitry Osipenko 
701*882fac37SDmitry Osipenko     timer_reset();
702*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
703*882fac37SDmitry Osipenko     timer_load(0);
704*882fac37SDmitry Osipenko 
705*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
706*882fac37SDmitry Osipenko 
707*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
708*882fac37SDmitry Osipenko 
709*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
710*882fac37SDmitry Osipenko 
711*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
712*882fac37SDmitry Osipenko 
713*882fac37SDmitry Osipenko     timer_set_counter(999);
714*882fac37SDmitry Osipenko 
715*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 999);
716*882fac37SDmitry Osipenko 
717*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
718*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
719*882fac37SDmitry Osipenko 
720*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
721*882fac37SDmitry Osipenko 
722*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
723*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
724*882fac37SDmitry Osipenko }
725*882fac37SDmitry Osipenko 
726*882fac37SDmitry Osipenko static void test_timer_set_oneshot_load_to_0(gconstpointer arg)
727*882fac37SDmitry Osipenko {
728*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
729*882fac37SDmitry Osipenko 
730*882fac37SDmitry Osipenko     timer_reset();
731*882fac37SDmitry Osipenko     timer_load(UINT32_MAX);
732*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
733*882fac37SDmitry Osipenko 
734*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
735*882fac37SDmitry Osipenko 
736*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 100);
737*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
738*882fac37SDmitry Osipenko 
739*882fac37SDmitry Osipenko     timer_load(0);
740*882fac37SDmitry Osipenko 
741*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
742*882fac37SDmitry Osipenko 
743*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
744*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
745*882fac37SDmitry Osipenko 
746*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
747*882fac37SDmitry Osipenko 
748*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
749*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
750*882fac37SDmitry Osipenko }
751*882fac37SDmitry Osipenko 
752*882fac37SDmitry Osipenko static void test_timer_set_periodic_load_to_0(gconstpointer arg)
753*882fac37SDmitry Osipenko {
754*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
755*882fac37SDmitry Osipenko 
756*882fac37SDmitry Osipenko     timer_reset();
757*882fac37SDmitry Osipenko     timer_load(UINT32_MAX);
758*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
759*882fac37SDmitry Osipenko 
760*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
761*882fac37SDmitry Osipenko 
762*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, UINT32_MAX - 100);
763*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
764*882fac37SDmitry Osipenko 
765*882fac37SDmitry Osipenko     timer_load(0);
766*882fac37SDmitry Osipenko 
767*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
768*882fac37SDmitry Osipenko 
769*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
770*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
771*882fac37SDmitry Osipenko 
772*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 100);
773*882fac37SDmitry Osipenko 
774*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
775*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
776*882fac37SDmitry Osipenko }
777*882fac37SDmitry Osipenko 
778*882fac37SDmitry Osipenko static void test_deferred_trigger(void)
779*882fac37SDmitry Osipenko {
780*882fac37SDmitry Osipenko     int mode = ONESHOT;
781*882fac37SDmitry Osipenko 
782*882fac37SDmitry Osipenko again:
783*882fac37SDmitry Osipenko     timer_reset();
784*882fac37SDmitry Osipenko     timer_start(mode, 255);
785*882fac37SDmitry Osipenko 
786*882fac37SDmitry Osipenko     clock_step(100);
787*882fac37SDmitry Osipenko 
788*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
789*882fac37SDmitry Osipenko 
790*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(255, 1);
791*882fac37SDmitry Osipenko 
792*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
793*882fac37SDmitry Osipenko 
794*882fac37SDmitry Osipenko     timer_reset();
795*882fac37SDmitry Osipenko     timer_load(2);
796*882fac37SDmitry Osipenko     timer_start(mode, 255);
797*882fac37SDmitry Osipenko 
798*882fac37SDmitry Osipenko     clock_step(100);
799*882fac37SDmitry Osipenko 
800*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
801*882fac37SDmitry Osipenko 
802*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(255, 1);
803*882fac37SDmitry Osipenko 
804*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
805*882fac37SDmitry Osipenko 
806*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(255, 1);
807*882fac37SDmitry Osipenko 
808*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
809*882fac37SDmitry Osipenko 
810*882fac37SDmitry Osipenko     timer_reset();
811*882fac37SDmitry Osipenko     timer_load(UINT32_MAX);
812*882fac37SDmitry Osipenko     timer_start(mode, 255);
813*882fac37SDmitry Osipenko 
814*882fac37SDmitry Osipenko     clock_step(100);
815*882fac37SDmitry Osipenko 
816*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
817*882fac37SDmitry Osipenko 
818*882fac37SDmitry Osipenko     timer_set_counter(0);
819*882fac37SDmitry Osipenko 
820*882fac37SDmitry Osipenko     clock_step(100);
821*882fac37SDmitry Osipenko 
822*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
823*882fac37SDmitry Osipenko 
824*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(255, 1);
825*882fac37SDmitry Osipenko 
826*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
827*882fac37SDmitry Osipenko 
828*882fac37SDmitry Osipenko     timer_reset();
829*882fac37SDmitry Osipenko     timer_load(UINT32_MAX);
830*882fac37SDmitry Osipenko     timer_start(mode, 255);
831*882fac37SDmitry Osipenko 
832*882fac37SDmitry Osipenko     clock_step(100);
833*882fac37SDmitry Osipenko 
834*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
835*882fac37SDmitry Osipenko 
836*882fac37SDmitry Osipenko     timer_load(0);
837*882fac37SDmitry Osipenko 
838*882fac37SDmitry Osipenko     clock_step(100);
839*882fac37SDmitry Osipenko 
840*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
841*882fac37SDmitry Osipenko 
842*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(255, 1);
843*882fac37SDmitry Osipenko 
844*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
845*882fac37SDmitry Osipenko 
846*882fac37SDmitry Osipenko     if (mode == ONESHOT) {
847*882fac37SDmitry Osipenko         mode = PERIODIC;
848*882fac37SDmitry Osipenko         goto again;
849*882fac37SDmitry Osipenko     }
850*882fac37SDmitry Osipenko }
851*882fac37SDmitry Osipenko 
852*882fac37SDmitry Osipenko static void test_timer_zero_load_mode_switch(gconstpointer arg)
853*882fac37SDmitry Osipenko {
854*882fac37SDmitry Osipenko     int scaler = *((int *) arg);
855*882fac37SDmitry Osipenko 
856*882fac37SDmitry Osipenko     timer_reset();
857*882fac37SDmitry Osipenko     timer_load(0);
858*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
859*882fac37SDmitry Osipenko 
860*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
861*882fac37SDmitry Osipenko 
862*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
863*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
864*882fac37SDmitry Osipenko 
865*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
866*882fac37SDmitry Osipenko 
867*882fac37SDmitry Osipenko     timer_start(ONESHOT, scaler);
868*882fac37SDmitry Osipenko 
869*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
870*882fac37SDmitry Osipenko 
871*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
872*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
873*882fac37SDmitry Osipenko 
874*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
875*882fac37SDmitry Osipenko 
876*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
877*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
878*882fac37SDmitry Osipenko 
879*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
880*882fac37SDmitry Osipenko 
881*882fac37SDmitry Osipenko     timer_start(PERIODIC, scaler);
882*882fac37SDmitry Osipenko 
883*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(scaler, 1);
884*882fac37SDmitry Osipenko 
885*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
886*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, !!scaler);
887*882fac37SDmitry Osipenko }
888*882fac37SDmitry Osipenko 
889*882fac37SDmitry Osipenko static void test_timer_zero_load_prescaled_periodic_to_nonscaled_oneshot(void)
890*882fac37SDmitry Osipenko {
891*882fac37SDmitry Osipenko     timer_reset();
892*882fac37SDmitry Osipenko     timer_load(0);
893*882fac37SDmitry Osipenko     timer_start(PERIODIC, 255);
894*882fac37SDmitry Osipenko 
895*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(255, 1);
896*882fac37SDmitry Osipenko 
897*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
898*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
899*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
900*882fac37SDmitry Osipenko 
901*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(255, 1);
902*882fac37SDmitry Osipenko 
903*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
904*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
905*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
906*882fac37SDmitry Osipenko 
907*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(255, 1);
908*882fac37SDmitry Osipenko 
909*882fac37SDmitry Osipenko     timer_start(ONESHOT, NOSCALE);
910*882fac37SDmitry Osipenko 
911*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(NOSCALE, 1);
912*882fac37SDmitry Osipenko 
913*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
914*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
915*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
916*882fac37SDmitry Osipenko 
917*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(NOSCALE, 1);
918*882fac37SDmitry Osipenko 
919*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
920*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
921*882fac37SDmitry Osipenko }
922*882fac37SDmitry Osipenko 
923*882fac37SDmitry Osipenko static void test_timer_zero_load_prescaled_oneshot_to_nonscaled_periodic(void)
924*882fac37SDmitry Osipenko {
925*882fac37SDmitry Osipenko     timer_reset();
926*882fac37SDmitry Osipenko     timer_load(0);
927*882fac37SDmitry Osipenko     timer_start(ONESHOT, 255);
928*882fac37SDmitry Osipenko 
929*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(255, 1);
930*882fac37SDmitry Osipenko 
931*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
932*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
933*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
934*882fac37SDmitry Osipenko 
935*882fac37SDmitry Osipenko     timer_start(PERIODIC, NOSCALE);
936*882fac37SDmitry Osipenko 
937*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(NOSCALE, 1);
938*882fac37SDmitry Osipenko 
939*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
940*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
941*882fac37SDmitry Osipenko }
942*882fac37SDmitry Osipenko 
943*882fac37SDmitry Osipenko static void test_timer_zero_load_nonscaled_oneshot_to_prescaled_periodic(void)
944*882fac37SDmitry Osipenko {
945*882fac37SDmitry Osipenko     timer_reset();
946*882fac37SDmitry Osipenko     timer_load(0);
947*882fac37SDmitry Osipenko     timer_start(ONESHOT, NOSCALE);
948*882fac37SDmitry Osipenko 
949*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(NOSCALE, 1);
950*882fac37SDmitry Osipenko 
951*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
952*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
953*882fac37SDmitry Osipenko 
954*882fac37SDmitry Osipenko     timer_start(PERIODIC, 255);
955*882fac37SDmitry Osipenko 
956*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(255, 1);
957*882fac37SDmitry Osipenko 
958*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
959*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
960*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
961*882fac37SDmitry Osipenko 
962*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(255, 1);
963*882fac37SDmitry Osipenko 
964*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
965*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
966*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
967*882fac37SDmitry Osipenko }
968*882fac37SDmitry Osipenko 
969*882fac37SDmitry Osipenko static void test_timer_zero_load_nonscaled_periodic_to_prescaled_oneshot(void)
970*882fac37SDmitry Osipenko {
971*882fac37SDmitry Osipenko     timer_reset();
972*882fac37SDmitry Osipenko     timer_load(0);
973*882fac37SDmitry Osipenko     timer_start(PERIODIC, NOSCALE);
974*882fac37SDmitry Osipenko 
975*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(NOSCALE, 1);
976*882fac37SDmitry Osipenko 
977*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
978*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
979*882fac37SDmitry Osipenko 
980*882fac37SDmitry Osipenko     timer_start(ONESHOT, 255);
981*882fac37SDmitry Osipenko 
982*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(255, 1);
983*882fac37SDmitry Osipenko 
984*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
985*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 1);
986*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
987*882fac37SDmitry Osipenko 
988*882fac37SDmitry Osipenko     TIMER_BLOCK_STEP(255, 1);
989*882fac37SDmitry Osipenko 
990*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_counter(), ==, 0);
991*882fac37SDmitry Osipenko     g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
992*882fac37SDmitry Osipenko }
993*882fac37SDmitry Osipenko 
994*882fac37SDmitry Osipenko int main(int argc, char **argv)
995*882fac37SDmitry Osipenko {
996*882fac37SDmitry Osipenko     int *scaler = &nonscaled;
997*882fac37SDmitry Osipenko     int ret;
998*882fac37SDmitry Osipenko 
999*882fac37SDmitry Osipenko     g_test_init(&argc, &argv, NULL);
1000*882fac37SDmitry Osipenko 
1001*882fac37SDmitry Osipenko     qtest_add_func("mptimer/deferred_trigger", test_deferred_trigger);
1002*882fac37SDmitry Osipenko     qtest_add_func("mptimer/load_disabled", test_timer_load_disabled);
1003*882fac37SDmitry Osipenko     qtest_add_func("mptimer/set_counter_disabled", test_timer_set_counter_disabled);
1004*882fac37SDmitry Osipenko     qtest_add_func("mptimer/zero_load_prescaled_periodic_to_nonscaled_oneshot",
1005*882fac37SDmitry Osipenko                    test_timer_zero_load_prescaled_periodic_to_nonscaled_oneshot);
1006*882fac37SDmitry Osipenko     qtest_add_func("mptimer/zero_load_prescaled_oneshot_to_nonscaled_periodic",
1007*882fac37SDmitry Osipenko                    test_timer_zero_load_prescaled_oneshot_to_nonscaled_periodic);
1008*882fac37SDmitry Osipenko     qtest_add_func("mptimer/zero_load_nonscaled_oneshot_to_prescaled_periodic",
1009*882fac37SDmitry Osipenko                    test_timer_zero_load_nonscaled_oneshot_to_prescaled_periodic);
1010*882fac37SDmitry Osipenko     qtest_add_func("mptimer/zero_load_nonscaled_periodic_to_prescaled_oneshot",
1011*882fac37SDmitry Osipenko                    test_timer_zero_load_nonscaled_periodic_to_prescaled_oneshot);
1012*882fac37SDmitry Osipenko     qtest_add_func("mptimer/prescaler", test_timer_prescaler);
1013*882fac37SDmitry Osipenko     qtest_add_func("mptimer/prescaler_on_the_fly", test_timer_prescaler_on_the_fly);
1014*882fac37SDmitry Osipenko 
1015*882fac37SDmitry Osipenko tests_with_prescaler_arg:
1016*882fac37SDmitry Osipenko     qtest_add_data_func(
1017*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/oneshot scaler=%d", *scaler),
1018*882fac37SDmitry Osipenko                         scaler, test_timer_oneshot);
1019*882fac37SDmitry Osipenko     qtest_add_data_func(
1020*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/pause scaler=%d", *scaler),
1021*882fac37SDmitry Osipenko                         scaler, test_timer_pause);
1022*882fac37SDmitry Osipenko     qtest_add_data_func(
1023*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/reload scaler=%d", *scaler),
1024*882fac37SDmitry Osipenko                         scaler, test_timer_reload);
1025*882fac37SDmitry Osipenko     qtest_add_data_func(
1026*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/periodic scaler=%d", *scaler),
1027*882fac37SDmitry Osipenko                         scaler, test_timer_periodic);
1028*882fac37SDmitry Osipenko     qtest_add_data_func(
1029*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/oneshot_to_periodic scaler=%d", *scaler),
1030*882fac37SDmitry Osipenko                         scaler, test_timer_oneshot_to_periodic);
1031*882fac37SDmitry Osipenko     qtest_add_data_func(
1032*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/periodic_to_oneshot scaler=%d", *scaler),
1033*882fac37SDmitry Osipenko                         scaler, test_timer_periodic_to_oneshot);
1034*882fac37SDmitry Osipenko     qtest_add_data_func(
1035*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/set_oneshot_counter_to_0 scaler=%d", *scaler),
1036*882fac37SDmitry Osipenko                         scaler, test_timer_set_oneshot_counter_to_0);
1037*882fac37SDmitry Osipenko     qtest_add_data_func(
1038*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/set_periodic_counter_to_0 scaler=%d", *scaler),
1039*882fac37SDmitry Osipenko                         scaler, test_timer_set_periodic_counter_to_0);
1040*882fac37SDmitry Osipenko     qtest_add_data_func(
1041*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/noload_oneshot scaler=%d", *scaler),
1042*882fac37SDmitry Osipenko                         scaler, test_timer_noload_oneshot);
1043*882fac37SDmitry Osipenko     qtest_add_data_func(
1044*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/noload_periodic scaler=%d", *scaler),
1045*882fac37SDmitry Osipenko                         scaler, test_timer_noload_periodic);
1046*882fac37SDmitry Osipenko     qtest_add_data_func(
1047*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/zero_load_oneshot scaler=%d", *scaler),
1048*882fac37SDmitry Osipenko                         scaler, test_timer_zero_load_oneshot);
1049*882fac37SDmitry Osipenko     qtest_add_data_func(
1050*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/zero_load_periodic scaler=%d", *scaler),
1051*882fac37SDmitry Osipenko                         scaler, test_timer_zero_load_periodic);
1052*882fac37SDmitry Osipenko     qtest_add_data_func(
1053*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/zero_load_oneshot_to_nonzero scaler=%d", *scaler),
1054*882fac37SDmitry Osipenko                         scaler, test_timer_zero_load_oneshot_to_nonzero);
1055*882fac37SDmitry Osipenko     qtest_add_data_func(
1056*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/zero_load_periodic_to_nonzero scaler=%d", *scaler),
1057*882fac37SDmitry Osipenko                         scaler, test_timer_zero_load_periodic_to_nonzero);
1058*882fac37SDmitry Osipenko     qtest_add_data_func(
1059*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/nonzero_load_oneshot_to_zero scaler=%d", *scaler),
1060*882fac37SDmitry Osipenko                         scaler, test_timer_nonzero_load_oneshot_to_zero);
1061*882fac37SDmitry Osipenko     qtest_add_data_func(
1062*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/nonzero_load_periodic_to_zero scaler=%d", *scaler),
1063*882fac37SDmitry Osipenko                         scaler, test_timer_nonzero_load_periodic_to_zero);
1064*882fac37SDmitry Osipenko     qtest_add_data_func(
1065*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/set_periodic_counter_on_the_fly scaler=%d", *scaler),
1066*882fac37SDmitry Osipenko                         scaler, test_timer_set_periodic_counter_on_the_fly);
1067*882fac37SDmitry Osipenko     qtest_add_data_func(
1068*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/enable_and_set_counter scaler=%d", *scaler),
1069*882fac37SDmitry Osipenko                         scaler, test_timer_enable_and_set_counter);
1070*882fac37SDmitry Osipenko     qtest_add_data_func(
1071*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/set_counter_and_enable scaler=%d", *scaler),
1072*882fac37SDmitry Osipenko                         scaler, test_timer_set_counter_and_enable);
1073*882fac37SDmitry Osipenko     qtest_add_data_func(
1074*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/oneshot_with_counter_0_on_start scaler=%d", *scaler),
1075*882fac37SDmitry Osipenko                         scaler, test_timer_oneshot_with_counter_0_on_start);
1076*882fac37SDmitry Osipenko     qtest_add_data_func(
1077*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/periodic_with_counter_0_on_start scaler=%d", *scaler),
1078*882fac37SDmitry Osipenko                         scaler, test_timer_periodic_with_counter_0_on_start);
1079*882fac37SDmitry Osipenko     qtest_add_data_func(
1080*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/periodic_counter scaler=%d", *scaler),
1081*882fac37SDmitry Osipenko                         scaler, test_periodic_counter);
1082*882fac37SDmitry Osipenko     qtest_add_data_func(
1083*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/set_counter_periodic_with_zero_load scaler=%d", *scaler),
1084*882fac37SDmitry Osipenko                         scaler, test_timer_set_counter_periodic_with_zero_load);
1085*882fac37SDmitry Osipenko     qtest_add_data_func(
1086*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/set_oneshot_load_to_0 scaler=%d", *scaler),
1087*882fac37SDmitry Osipenko                         scaler, test_timer_set_oneshot_load_to_0);
1088*882fac37SDmitry Osipenko     qtest_add_data_func(
1089*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/set_periodic_load_to_0 scaler=%d", *scaler),
1090*882fac37SDmitry Osipenko                         scaler, test_timer_set_periodic_load_to_0);
1091*882fac37SDmitry Osipenko     qtest_add_data_func(
1092*882fac37SDmitry Osipenko         g_strdup_printf("mptimer/zero_load_mode_switch scaler=%d", *scaler),
1093*882fac37SDmitry Osipenko                         scaler, test_timer_zero_load_mode_switch);
1094*882fac37SDmitry Osipenko 
1095*882fac37SDmitry Osipenko     if (scaler == &nonscaled) {
1096*882fac37SDmitry Osipenko         scaler = &scaled;
1097*882fac37SDmitry Osipenko         goto tests_with_prescaler_arg;
1098*882fac37SDmitry Osipenko     }
1099*882fac37SDmitry Osipenko 
1100*882fac37SDmitry Osipenko     qtest_start("-machine vexpress-a9");
1101*882fac37SDmitry Osipenko     ret = g_test_run();
1102*882fac37SDmitry Osipenko     qtest_end();
1103*882fac37SDmitry Osipenko 
1104*882fac37SDmitry Osipenko     return ret;
1105*882fac37SDmitry Osipenko }
1106