1a2e67072SMax Filippov#include "macros.inc" 27d890b40SMax Filippov 372b3b8f2SMax Filippov#define CCOUNT_SHIFT 4 472b3b8f2SMax Filippov#define WAIT_LOOPS 20 502a5a4a8SMax Filippov#define level1 kernel 602a5a4a8SMax Filippov#define INTERRUPT_LEVEL(n) glue3(XCHAL_INT, n, _LEVEL) 772b3b8f2SMax Filippov 872b3b8f2SMax Filippov.macro make_ccount_delta target, delta 972b3b8f2SMax Filippov rsr \delta, ccount 1072b3b8f2SMax Filippov rsr \target, ccount 1172b3b8f2SMax Filippov sub \delta, \target, \delta 1272b3b8f2SMax Filippov slli \delta, \delta, CCOUNT_SHIFT 1372b3b8f2SMax Filippov add \target, \target, \delta 1472b3b8f2SMax Filippov.endm 1572b3b8f2SMax Filippov 167d890b40SMax Filippovtest_suite timer 177d890b40SMax Filippov 1802a5a4a8SMax Filippov#if XCHAL_HAVE_CCOUNT 1902a5a4a8SMax Filippov 207d890b40SMax Filippovtest ccount 217d890b40SMax Filippov rsr a3, ccount 227d890b40SMax Filippov rsr a4, ccount 2372b3b8f2SMax Filippov assert ne, a3, a4 247d890b40SMax Filippovtest_end 257d890b40SMax Filippov 260a362d07SMax Filippovtest ccount_write 270a362d07SMax Filippov rsr a3, ccount 280a362d07SMax Filippov rsr a4, ccount 290a362d07SMax Filippov sub a4, a4, a3 300a362d07SMax Filippov movi a2, 0x12345678 310a362d07SMax Filippov wsr a2, ccount 320a362d07SMax Filippov esync 330a362d07SMax Filippov rsr a3, ccount 340a362d07SMax Filippov sub a3, a3, a2 350a362d07SMax Filippov slli a4, a4, 2 360a362d07SMax Filippov assert ltu, a3, a4 370a362d07SMax Filippovtest_end 380a362d07SMax Filippov 3902a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS 4002a5a4a8SMax Filippov 41*4be4c5b8SMax Filippov#if INTERRUPT_LEVEL(XCHAL_TIMER0_INTERRUPT) == 1 42*4be4c5b8SMax Filippov#define TIMER0_VECTOR kernel 43*4be4c5b8SMax Filippov#else 44*4be4c5b8SMax Filippov#define TIMER0_VECTOR glue(level, INTERRUPT_LEVEL(XCHAL_TIMER0_INTERRUPT)) 45*4be4c5b8SMax Filippov#endif 46*4be4c5b8SMax Filippov 47*4be4c5b8SMax Filippov#if XCHAL_NUM_TIMERS > 1 48*4be4c5b8SMax Filippov#if INTERRUPT_LEVEL(XCHAL_TIMER1_INTERRUPT) == 1 49*4be4c5b8SMax Filippov#define TIMER1_VECTOR kernel 50*4be4c5b8SMax Filippov#else 51*4be4c5b8SMax Filippov#define TIMER1_VECTOR glue(level, INTERRUPT_LEVEL(XCHAL_TIMER1_INTERRUPT)) 52*4be4c5b8SMax Filippov#endif 53*4be4c5b8SMax Filippov#endif 54*4be4c5b8SMax Filippov 55*4be4c5b8SMax Filippov#if XCHAL_NUM_TIMERS > 2 56*4be4c5b8SMax Filippov#if INTERRUPT_LEVEL(XCHAL_TIMER2_INTERRUPT) == 1 57*4be4c5b8SMax Filippov#define TIMER2_VECTOR kernel 58*4be4c5b8SMax Filippov#else 59*4be4c5b8SMax Filippov#define TIMER2_VECTOR glue(level, INTERRUPT_LEVEL(XCHAL_TIMER2_INTERRUPT)) 60*4be4c5b8SMax Filippov#endif 61*4be4c5b8SMax Filippov#endif 62*4be4c5b8SMax Filippov 630a362d07SMax Filippovtest ccount_update_deadline 640a362d07SMax Filippov movi a2, 0 650a362d07SMax Filippov wsr a2, intenable 660a362d07SMax Filippov rsr a2, interrupt 670a362d07SMax Filippov wsr a2, intclear 680a362d07SMax Filippov movi a2, 0 6902a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS > 1 700a362d07SMax Filippov wsr a2, ccompare1 7102a5a4a8SMax Filippov#endif 7202a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS > 2 730a362d07SMax Filippov wsr a2, ccompare2 7402a5a4a8SMax Filippov#endif 750a362d07SMax Filippov movi a2, 0x12345678 760a362d07SMax Filippov wsr a2, ccompare0 770a362d07SMax Filippov rsr a3, interrupt 780a362d07SMax Filippov assert eqi, a3, 0 790a362d07SMax Filippov movi a2, 0x12345677 800a362d07SMax Filippov wsr a2, ccount 810a362d07SMax Filippov esync 820a362d07SMax Filippov nop 830a362d07SMax Filippov rsr a2, interrupt 840a362d07SMax Filippov movi a3, 1 << XCHAL_TIMER0_INTERRUPT 850a362d07SMax Filippov assert eq, a2, a3 860a362d07SMax Filippovtest_end 870a362d07SMax Filippov 887d890b40SMax Filippovtest ccompare 897d890b40SMax Filippov movi a2, 0 907d890b40SMax Filippov wsr a2, intenable 917d890b40SMax Filippov rsr a2, interrupt 927d890b40SMax Filippov wsr a2, intclear 93890c6333SMax Filippov movi a2, 0 9402a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS > 1 957d890b40SMax Filippov wsr a2, ccompare1 9602a5a4a8SMax Filippov#endif 9702a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS > 2 987d890b40SMax Filippov wsr a2, ccompare2 9902a5a4a8SMax Filippov#endif 1007d890b40SMax Filippov 10172b3b8f2SMax Filippov make_ccount_delta a2, a15 1027d890b40SMax Filippov wsr a2, ccompare0 1037d890b40SMax Filippov1: 10472b3b8f2SMax Filippov rsr a3, interrupt 10572b3b8f2SMax Filippov rsr a4, ccount 10672b3b8f2SMax Filippov rsr a5, interrupt 10772b3b8f2SMax Filippov sub a4, a4, a2 10872b3b8f2SMax Filippov bgez a4, 2f 10972b3b8f2SMax Filippov assert eqi, a3, 0 11072b3b8f2SMax Filippov j 1b 1117d890b40SMax Filippov2: 11272b3b8f2SMax Filippov assert nei, a5, 0 1137d890b40SMax Filippovtest_end 1147d890b40SMax Filippov 1157d890b40SMax Filippovtest ccompare0_interrupt 116*4be4c5b8SMax Filippov set_vector TIMER0_VECTOR, 2f 1177d890b40SMax Filippov movi a2, 0 1187d890b40SMax Filippov wsr a2, intenable 1197d890b40SMax Filippov rsr a2, interrupt 1207d890b40SMax Filippov wsr a2, intclear 121890c6333SMax Filippov movi a2, 0 12202a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS > 1 1237d890b40SMax Filippov wsr a2, ccompare1 12402a5a4a8SMax Filippov#endif 12502a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS > 2 1267d890b40SMax Filippov wsr a2, ccompare2 12702a5a4a8SMax Filippov#endif 1287d890b40SMax Filippov 12972b3b8f2SMax Filippov movi a3, WAIT_LOOPS 13072b3b8f2SMax Filippov make_ccount_delta a2, a15 1317d890b40SMax Filippov wsr a2, ccompare0 1327d890b40SMax Filippov rsync 1337d890b40SMax Filippov rsr a2, interrupt 1347d890b40SMax Filippov assert eqi, a2, 0 1357d890b40SMax Filippov 1364f89b41cSMax Filippov movi a2, 1 << XCHAL_TIMER0_INTERRUPT 1377d890b40SMax Filippov wsr a2, intenable 1387d890b40SMax Filippov rsil a2, 0 1397d890b40SMax Filippov1: 140e120c833SMax Filippov addi a3, a3, -1 141e120c833SMax Filippov bnez a3, 1b 1427d890b40SMax Filippov test_fail 1437d890b40SMax Filippov2: 144*4be4c5b8SMax Filippov#if INTERRUPT_LEVEL(XCHAL_TIMER0_INTERRUPT) == 1 1457d890b40SMax Filippov rsr a2, exccause 1467d890b40SMax Filippov assert eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */ 14702a5a4a8SMax Filippov#endif 148*4be4c5b8SMax Filippovtest_end 14902a5a4a8SMax Filippov 15002a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS > 1 1517d890b40SMax Filippov 1527d890b40SMax Filippovtest ccompare1_interrupt 153*4be4c5b8SMax Filippov set_vector TIMER1_VECTOR, 2f 1547d890b40SMax Filippov movi a2, 0 1557d890b40SMax Filippov wsr a2, intenable 1567d890b40SMax Filippov rsr a2, interrupt 1577d890b40SMax Filippov wsr a2, intclear 158890c6333SMax Filippov movi a2, 0 1597d890b40SMax Filippov wsr a2, ccompare0 16002a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS > 2 1617d890b40SMax Filippov wsr a2, ccompare2 16202a5a4a8SMax Filippov#endif 1637d890b40SMax Filippov 16472b3b8f2SMax Filippov movi a3, WAIT_LOOPS 16572b3b8f2SMax Filippov make_ccount_delta a2, a15 1667d890b40SMax Filippov wsr a2, ccompare1 1677d890b40SMax Filippov rsync 1687d890b40SMax Filippov rsr a2, interrupt 1697d890b40SMax Filippov assert eqi, a2, 0 1704f89b41cSMax Filippov movi a2, 1 << XCHAL_TIMER1_INTERRUPT 1717d890b40SMax Filippov wsr a2, intenable 17202a5a4a8SMax Filippov rsil a2, INTERRUPT_LEVEL(XCHAL_TIMER1_INTERRUPT) - 1 1737d890b40SMax Filippov1: 174e120c833SMax Filippov addi a3, a3, -1 175e120c833SMax Filippov bnez a3, 1b 1767d890b40SMax Filippov test_fail 1777d890b40SMax Filippov2: 178*4be4c5b8SMax Filippov#if INTERRUPT_LEVEL(XCHAL_TIMER1_INTERRUPT) == 1 179*4be4c5b8SMax Filippov rsr a2, exccause 180*4be4c5b8SMax Filippov assert eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */ 181*4be4c5b8SMax Filippov#endif 1827d890b40SMax Filippovtest_end 1837d890b40SMax Filippov 18402a5a4a8SMax Filippov#endif 18502a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS > 2 18602a5a4a8SMax Filippov 1877d890b40SMax Filippovtest ccompare2_interrupt 188*4be4c5b8SMax Filippov set_vector TIMER2_VECTOR, 2f 1897d890b40SMax Filippov movi a2, 0 1907d890b40SMax Filippov wsr a2, intenable 1917d890b40SMax Filippov rsr a2, interrupt 1927d890b40SMax Filippov wsr a2, intclear 193890c6333SMax Filippov movi a2, 0 1947d890b40SMax Filippov wsr a2, ccompare0 1957d890b40SMax Filippov wsr a2, ccompare1 1967d890b40SMax Filippov 19772b3b8f2SMax Filippov movi a3, WAIT_LOOPS 19872b3b8f2SMax Filippov make_ccount_delta a2, a15 1997d890b40SMax Filippov wsr a2, ccompare2 2007d890b40SMax Filippov rsync 2017d890b40SMax Filippov rsr a2, interrupt 2027d890b40SMax Filippov assert eqi, a2, 0 2034f89b41cSMax Filippov movi a2, 1 << XCHAL_TIMER2_INTERRUPT 2047d890b40SMax Filippov wsr a2, intenable 20502a5a4a8SMax Filippov rsil a2, INTERRUPT_LEVEL(XCHAL_TIMER2_INTERRUPT) - 1 2067d890b40SMax Filippov1: 207e120c833SMax Filippov addi a3, a3, -1 208e120c833SMax Filippov bnez a3, 1b 2097d890b40SMax Filippov test_fail 2107d890b40SMax Filippov2: 211*4be4c5b8SMax Filippov#if INTERRUPT_LEVEL(XCHAL_TIMER2_INTERRUPT) == 1 212*4be4c5b8SMax Filippov rsr a2, exccause 213*4be4c5b8SMax Filippov assert eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */ 214*4be4c5b8SMax Filippov#endif 2157d890b40SMax Filippovtest_end 2167d890b40SMax Filippov 21702a5a4a8SMax Filippov#endif 21802a5a4a8SMax Filippov 219890c6333SMax Filippovtest ccompare_interrupt_masked 220*4be4c5b8SMax Filippov set_vector TIMER0_VECTOR, 2f 221890c6333SMax Filippov movi a2, 0 222890c6333SMax Filippov wsr a2, intenable 223890c6333SMax Filippov rsr a2, interrupt 224890c6333SMax Filippov wsr a2, intclear 225890c6333SMax Filippov movi a2, 0 22602a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS > 2 227890c6333SMax Filippov wsr a2, ccompare2 22802a5a4a8SMax Filippov#endif 229890c6333SMax Filippov 230e120c833SMax Filippov movi a3, WAIT_LOOPS 23172b3b8f2SMax Filippov make_ccount_delta a2, a15 23202a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS > 1 233890c6333SMax Filippov wsr a2, ccompare1 23402a5a4a8SMax Filippov#endif 23572b3b8f2SMax Filippov add a2, a2, a15 236890c6333SMax Filippov wsr a2, ccompare0 237890c6333SMax Filippov rsync 238890c6333SMax Filippov rsr a2, interrupt 239890c6333SMax Filippov assert eqi, a2, 0 240890c6333SMax Filippov 2414f89b41cSMax Filippov movi a2, 1 << XCHAL_TIMER0_INTERRUPT 242890c6333SMax Filippov wsr a2, intenable 243890c6333SMax Filippov rsil a2, 0 244890c6333SMax Filippov1: 245e120c833SMax Filippov addi a3, a3, -1 246e120c833SMax Filippov bnez a3, 1b 247e120c833SMax Filippov 248890c6333SMax Filippov test_fail 249890c6333SMax Filippov2: 250*4be4c5b8SMax Filippov#if INTERRUPT_LEVEL(XCHAL_TIMER0_INTERRUPT) == 1 251890c6333SMax Filippov rsr a2, exccause 252890c6333SMax Filippov assert eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */ 253*4be4c5b8SMax Filippov#endif 254890c6333SMax Filippovtest_end 255890c6333SMax Filippov 256890c6333SMax Filippovtest ccompare_interrupt_masked_waiti 257*4be4c5b8SMax Filippov set_vector TIMER0_VECTOR, 2f 258890c6333SMax Filippov movi a2, 0 259890c6333SMax Filippov wsr a2, intenable 260890c6333SMax Filippov rsr a2, interrupt 261890c6333SMax Filippov wsr a2, intclear 262890c6333SMax Filippov movi a2, 0 26302a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS > 2 264890c6333SMax Filippov wsr a2, ccompare2 26502a5a4a8SMax Filippov#endif 266890c6333SMax Filippov 26772b3b8f2SMax Filippov make_ccount_delta a2, a15 26802a5a4a8SMax Filippov#if XCHAL_NUM_TIMERS > 1 269890c6333SMax Filippov wsr a2, ccompare1 27002a5a4a8SMax Filippov#endif 27172b3b8f2SMax Filippov add a2, a2, a15 272890c6333SMax Filippov wsr a2, ccompare0 273890c6333SMax Filippov rsync 274890c6333SMax Filippov rsr a2, interrupt 275890c6333SMax Filippov assert eqi, a2, 0 276890c6333SMax Filippov 2774f89b41cSMax Filippov movi a2, 1 << XCHAL_TIMER0_INTERRUPT 278890c6333SMax Filippov wsr a2, intenable 279890c6333SMax Filippov waiti 0 280890c6333SMax Filippov test_fail 281890c6333SMax Filippov2: 282*4be4c5b8SMax Filippov#if INTERRUPT_LEVEL(XCHAL_TIMER0_INTERRUPT) == 1 283890c6333SMax Filippov rsr a2, exccause 284890c6333SMax Filippov assert eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */ 285*4be4c5b8SMax Filippov#endif 286890c6333SMax Filippovtest_end 287890c6333SMax Filippov 28802a5a4a8SMax Filippov#endif 28902a5a4a8SMax Filippov#endif 29002a5a4a8SMax Filippov 2917d890b40SMax Filippovtest_suite_end 292