xref: /qemu/tests/tcg/xtensa/test_timer.S (revision abff1abf)
1#include "macros.inc"
2
3#define CCOUNT_SHIFT 4
4#define WAIT_LOOPS 20
5#define level1 kernel
6#define INTERRUPT_LEVEL(n) glue3(XCHAL_INT, n, _LEVEL)
7
8.macro      make_ccount_delta target, delta
9    rsr     \delta, ccount
10    rsr     \target, ccount
11    sub     \delta, \target, \delta
12    slli    \delta, \delta, CCOUNT_SHIFT
13    add     \target, \target, \delta
14.endm
15
16test_suite timer
17
18#if XCHAL_HAVE_CCOUNT
19
20test ccount
21    rsr     a3, ccount
22    rsr     a4, ccount
23    assert  ne, a3, a4
24test_end
25
26test ccount_write
27    rsr     a3, ccount
28    rsr     a4, ccount
29    sub     a4, a4, a3
30    movi    a2, 0x12345678
31    wsr     a2, ccount
32    esync
33    rsr     a3, ccount
34    sub     a3, a3, a2
35    slli    a4, a4, 2
36    assert  ltu, a3, a4
37test_end
38
39#if XCHAL_NUM_TIMERS
40
41test ccount_update_deadline
42    movi    a2, 0
43    wsr     a2, intenable
44    rsr     a2, interrupt
45    wsr     a2, intclear
46    movi    a2, 0
47#if XCHAL_NUM_TIMERS > 1
48    wsr     a2, ccompare1
49#endif
50#if XCHAL_NUM_TIMERS > 2
51    wsr     a2, ccompare2
52#endif
53    movi    a2, 0x12345678
54    wsr     a2, ccompare0
55    rsr     a3, interrupt
56    assert  eqi, a3, 0
57    movi    a2, 0x12345677
58    wsr     a2, ccount
59    esync
60    nop
61    rsr     a2, interrupt
62    movi    a3, 1 << XCHAL_TIMER0_INTERRUPT
63    assert  eq, a2, a3
64test_end
65
66test ccompare
67    movi    a2, 0
68    wsr     a2, intenable
69    rsr     a2, interrupt
70    wsr     a2, intclear
71    movi    a2, 0
72#if XCHAL_NUM_TIMERS > 1
73    wsr     a2, ccompare1
74#endif
75#if XCHAL_NUM_TIMERS > 2
76    wsr     a2, ccompare2
77#endif
78
79    make_ccount_delta a2, a15
80    wsr     a2, ccompare0
811:
82    rsr     a3, interrupt
83    rsr     a4, ccount
84    rsr     a5, interrupt
85    sub     a4, a4, a2
86    bgez    a4, 2f
87    assert  eqi, a3, 0
88    j       1b
892:
90    assert  nei, a5, 0
91test_end
92
93#if INTERRUPT_LEVEL(XCHAL_TIMER0_INTERRUPT) == 1
94test ccompare0_interrupt
95    set_vector kernel, 2f
96    movi    a2, 0
97    wsr     a2, intenable
98    rsr     a2, interrupt
99    wsr     a2, intclear
100    movi    a2, 0
101#if XCHAL_NUM_TIMERS > 1
102    wsr     a2, ccompare1
103#endif
104#if XCHAL_NUM_TIMERS > 2
105    wsr     a2, ccompare2
106#endif
107
108    movi    a3, WAIT_LOOPS
109    make_ccount_delta a2, a15
110    wsr     a2, ccompare0
111    rsync
112    rsr     a2, interrupt
113    assert  eqi, a2, 0
114
115    movi    a2, 1 << XCHAL_TIMER0_INTERRUPT
116    wsr     a2, intenable
117    rsil    a2, 0
118    loop    a3, 1f
119    nop
1201:
121    test_fail
1222:
123    rsr     a2, exccause
124    assert  eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */
125test_end
126#endif
127
128#if XCHAL_NUM_TIMERS > 1
129
130test ccompare1_interrupt
131    set_vector glue(level, INTERRUPT_LEVEL(XCHAL_TIMER1_INTERRUPT)), 2f
132    movi    a2, 0
133    wsr     a2, intenable
134    rsr     a2, interrupt
135    wsr     a2, intclear
136    movi    a2, 0
137    wsr     a2, ccompare0
138#if XCHAL_NUM_TIMERS > 2
139    wsr     a2, ccompare2
140#endif
141
142    movi    a3, WAIT_LOOPS
143    make_ccount_delta a2, a15
144    wsr     a2, ccompare1
145    rsync
146    rsr     a2, interrupt
147    assert  eqi, a2, 0
148    movi    a2, 1 << XCHAL_TIMER1_INTERRUPT
149    wsr     a2, intenable
150    rsil    a2, INTERRUPT_LEVEL(XCHAL_TIMER1_INTERRUPT) - 1
151    loop    a3, 1f
152    nop
1531:
154    test_fail
1552:
156test_end
157
158#endif
159#if XCHAL_NUM_TIMERS > 2
160
161test ccompare2_interrupt
162    set_vector glue(level, INTERRUPT_LEVEL(XCHAL_TIMER2_INTERRUPT)), 2f
163    movi    a2, 0
164    wsr     a2, intenable
165    rsr     a2, interrupt
166    wsr     a2, intclear
167    movi    a2, 0
168    wsr     a2, ccompare0
169    wsr     a2, ccompare1
170
171    movi    a3, WAIT_LOOPS
172    make_ccount_delta a2, a15
173    wsr     a2, ccompare2
174    rsync
175    rsr     a2, interrupt
176    assert  eqi, a2, 0
177    movi    a2, 1 << XCHAL_TIMER2_INTERRUPT
178    wsr     a2, intenable
179    rsil    a2, INTERRUPT_LEVEL(XCHAL_TIMER2_INTERRUPT) - 1
180    loop    a3, 1f
181    nop
1821:
183    test_fail
1842:
185test_end
186
187#endif
188
189test ccompare_interrupt_masked
190    set_vector kernel, 2f
191    movi    a2, 0
192    wsr     a2, intenable
193    rsr     a2, interrupt
194    wsr     a2, intclear
195    movi    a2, 0
196#if XCHAL_NUM_TIMERS > 2
197    wsr     a2, ccompare2
198#endif
199
200    movi    a3, 2 * WAIT_LOOPS
201    make_ccount_delta a2, a15
202#if XCHAL_NUM_TIMERS > 1
203    wsr     a2, ccompare1
204#endif
205    add     a2, a2, a15
206    wsr     a2, ccompare0
207    rsync
208    rsr     a2, interrupt
209    assert  eqi, a2, 0
210
211    movi    a2, 1 << XCHAL_TIMER0_INTERRUPT
212    wsr     a2, intenable
213    rsil    a2, 0
214    loop    a3, 1f
215    nop
2161:
217    test_fail
2182:
219    rsr     a2, exccause
220    assert  eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */
221test_end
222
223test ccompare_interrupt_masked_waiti
224    set_vector kernel, 2f
225    movi    a2, 0
226    wsr     a2, intenable
227    rsr     a2, interrupt
228    wsr     a2, intclear
229    movi    a2, 0
230#if XCHAL_NUM_TIMERS > 2
231    wsr     a2, ccompare2
232#endif
233
234    movi    a3, 2 * WAIT_LOOPS
235    make_ccount_delta a2, a15
236#if XCHAL_NUM_TIMERS > 1
237    wsr     a2, ccompare1
238#endif
239    add     a2, a2, a15
240    wsr     a2, ccompare0
241    rsync
242    rsr     a2, interrupt
243    assert  eqi, a2, 0
244
245    movi    a2, 1 << XCHAL_TIMER0_INTERRUPT
246    wsr     a2, intenable
247    waiti   0
248    test_fail
2492:
250    rsr     a2, exccause
251    assert  eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */
252test_end
253
254#endif
255#endif
256
257test_suite_end
258