xref: /qemu/tests/tcg/xtensa/test_timer.S (revision 11314643c35401b18c5374f4ec82ee7d3d5d2692)
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