Acceptance tests: show test report on GitLab CI
[qemu/ar7.git] / tests / tcg / xtensa / test_timer.S
blob1ec8e20883ffff0ef7ccdf7c75370487fea6818b
1 #include "macros.inc"
3 #define CCOUNT_SHIFT 4
4 #define WAIT_LOOPS 20
5 #define level1 kernel
6 #define INTERRUPT_LEVEL(n) glue3(XCHAL_INT, n, _LEVEL)
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
16 test_suite timer
18 #if XCHAL_HAVE_CCOUNT
20 test ccount
21     rsr     a3, ccount
22     rsr     a4, ccount
23     assert  ne, a3, a4
24 test_end
26 test 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
37 test_end
39 #if XCHAL_NUM_TIMERS
41 test 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
64 test_end
66 test 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
79     make_ccount_delta a2, a15
80     wsr     a2, ccompare0
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
90     assert  nei, a5, 0
91 test_end
93 #if INTERRUPT_LEVEL(XCHAL_TIMER0_INTERRUPT) == 1
94 test 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
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
115     movi    a2, 1 << XCHAL_TIMER0_INTERRUPT
116     wsr     a2, intenable
117     rsil    a2, 0
118     loop    a3, 1f
119     nop
121     test_fail
123     rsr     a2, exccause
124     assert  eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */
125 test_end
126 #endif
128 #if XCHAL_NUM_TIMERS > 1
130 test 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
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
154     test_fail
156 test_end
158 #endif
159 #if XCHAL_NUM_TIMERS > 2
161 test 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
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
183     test_fail
185 test_end
187 #endif
189 test 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
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
211     movi    a2, 1 << XCHAL_TIMER0_INTERRUPT
212     wsr     a2, intenable
213     rsil    a2, 0
214     loop    a3, 1f
215     nop
217     test_fail
219     rsr     a2, exccause
220     assert  eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */
221 test_end
223 test 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
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
245     movi    a2, 1 << XCHAL_TIMER0_INTERRUPT
246     wsr     a2, intenable
247     waiti   0
248     test_fail
250     rsr     a2, exccause
251     assert  eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */
252 test_end
254 #endif
255 #endif
257 test_suite_end