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