1 /*
2  * QTest testcase for the watchdog timer of HiFive 1 rev b.
3  *
4  * Copyright (c) 2023 SiFive, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2 or later, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License along with
16  * this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #include "qemu/osdep.h"
20 #include "qemu/timer.h"
21 #include "qemu/bitops.h"
22 #include "libqtest.h"
23 #include "hw/registerfields.h"
24 #include "hw/misc/sifive_e_aon.h"
25 
26 FIELD(AON_WDT_WDOGCFG, SCALE, 0, 4)
27 FIELD(AON_WDT_WDOGCFG, RSVD0, 4, 4)
28 FIELD(AON_WDT_WDOGCFG, RSTEN, 8, 1)
29 FIELD(AON_WDT_WDOGCFG, ZEROCMP, 9, 1)
30 FIELD(AON_WDT_WDOGCFG, RSVD1, 10, 2)
31 FIELD(AON_WDT_WDOGCFG, EN_ALWAYS, 12, 1)
32 FIELD(AON_WDT_WDOGCFG, EN_CORE_AWAKE, 13, 1)
33 FIELD(AON_WDT_WDOGCFG, RSVD2, 14, 14)
34 FIELD(AON_WDT_WDOGCFG, IP0, 28, 1)
35 FIELD(AON_WDT_WDOGCFG, RSVD3, 29, 3)
36 
37 #define WDOG_BASE (0x10000000)
38 #define WDOGCFG (0x0)
39 #define WDOGCOUNT (0x8)
40 #define WDOGS (0x10)
41 #define WDOGFEED (0x18)
42 #define WDOGKEY (0x1c)
43 #define WDOGCMP0 (0x20)
44 
45 #define SIFIVE_E_AON_WDOGKEY (0x51F15E)
46 #define SIFIVE_E_AON_WDOGFEED (0xD09F00D)
47 #define SIFIVE_E_LFCLK_DEFAULT_FREQ (32768)
48 
49 static void test_init(QTestState *qts)
50 {
51     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
52     qtest_writel(qts, WDOG_BASE + WDOGCOUNT, 0);
53 
54     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
55     qtest_writel(qts, WDOG_BASE + WDOGCFG, 0);
56 
57     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
58     qtest_writel(qts, WDOG_BASE + WDOGCMP0, 0xBEEF);
59 }
60 
61 static void test_wdogcount(void)
62 {
63     uint64_t tmp;
64     QTestState *qts = qtest_init("-machine sifive_e");
65 
66     test_init(qts);
67 
68     tmp = qtest_readl(qts, WDOG_BASE + WDOGCOUNT);
69     qtest_writel(qts, WDOG_BASE + WDOGCOUNT, 0xBEEF);
70     g_assert(qtest_readl(qts, WDOG_BASE + WDOGCOUNT) == tmp);
71 
72     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
73     qtest_writel(qts, WDOG_BASE + WDOGCOUNT, 0xBEEF);
74     g_assert(0xBEEF == qtest_readl(qts, WDOG_BASE + WDOGCOUNT));
75 
76     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
77     qtest_writel(qts, WDOG_BASE + WDOGCOUNT, 0xAAAAAAAA);
78     g_assert(0x2AAAAAAA == qtest_readl(qts, WDOG_BASE + WDOGCOUNT));
79 
80     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
81     qtest_writel(qts, WDOG_BASE + WDOGFEED, 0xAAAAAAAA);
82     g_assert(0x2AAAAAAA == qtest_readl(qts, WDOG_BASE + WDOGCOUNT));
83 
84     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
85     qtest_writel(qts, WDOG_BASE + WDOGFEED, SIFIVE_E_AON_WDOGFEED);
86     g_assert(0 == qtest_readl(qts, WDOG_BASE + WDOGCOUNT));
87 
88     qtest_quit(qts);
89 }
90 
91 static void test_wdogcfg(void)
92 {
93     uint32_t tmp_cfg;
94     QTestState *qts = qtest_init("-machine sifive_e");
95 
96     test_init(qts);
97 
98     tmp_cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
99     qtest_writel(qts, WDOG_BASE + WDOGCFG, 0xFFFFFFFF);
100     g_assert(qtest_readl(qts, WDOG_BASE + WDOGCFG) == tmp_cfg);
101 
102     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
103     qtest_writel(qts, WDOG_BASE + WDOGCFG, 0xFFFFFFFF);
104     g_assert(0xFFFFFFFF == qtest_readl(qts, WDOG_BASE + WDOGCFG));
105 
106     tmp_cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
107     g_assert(15 == FIELD_EX32(tmp_cfg, AON_WDT_WDOGCFG, SCALE));
108     g_assert(1 == FIELD_EX32(tmp_cfg, AON_WDT_WDOGCFG, RSTEN));
109     g_assert(1 == FIELD_EX32(tmp_cfg, AON_WDT_WDOGCFG, ZEROCMP));
110     g_assert(1 == FIELD_EX32(tmp_cfg, AON_WDT_WDOGCFG, EN_ALWAYS));
111     g_assert(1 == FIELD_EX32(tmp_cfg, AON_WDT_WDOGCFG, EN_CORE_AWAKE));
112     g_assert(1 == FIELD_EX32(tmp_cfg, AON_WDT_WDOGCFG, IP0));
113 
114     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
115     qtest_writel(qts, WDOG_BASE + WDOGCFG, 0);
116     tmp_cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
117     g_assert(0 == FIELD_EX32(tmp_cfg, AON_WDT_WDOGCFG, SCALE));
118     g_assert(0 == FIELD_EX32(tmp_cfg, AON_WDT_WDOGCFG, RSTEN));
119     g_assert(0 == FIELD_EX32(tmp_cfg, AON_WDT_WDOGCFG, ZEROCMP));
120     g_assert(0 == FIELD_EX32(tmp_cfg, AON_WDT_WDOGCFG, EN_ALWAYS));
121     g_assert(0 == FIELD_EX32(tmp_cfg, AON_WDT_WDOGCFG, EN_CORE_AWAKE));
122     g_assert(0 == FIELD_EX32(tmp_cfg, AON_WDT_WDOGCFG, IP0));
123     g_assert(0 == qtest_readl(qts, WDOG_BASE + WDOGCFG));
124 
125     qtest_quit(qts);
126 }
127 
128 static void test_wdogcmp0(void)
129 {
130     uint32_t tmp;
131     QTestState *qts = qtest_init("-machine sifive_e");
132 
133     test_init(qts);
134 
135     tmp = qtest_readl(qts, WDOG_BASE + WDOGCMP0);
136     qtest_writel(qts, WDOG_BASE + WDOGCMP0, 0xBEEF);
137     g_assert(qtest_readl(qts, WDOG_BASE + WDOGCMP0) == tmp);
138 
139     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
140     qtest_writel(qts, WDOG_BASE + WDOGCMP0, 0xBEEF);
141     g_assert(0xBEEF == qtest_readl(qts, WDOG_BASE + WDOGCMP0));
142 
143     qtest_quit(qts);
144 }
145 
146 static void test_wdogkey(void)
147 {
148     QTestState *qts = qtest_init("-machine sifive_e");
149 
150     test_init(qts);
151 
152     g_assert(0 == qtest_readl(qts, WDOG_BASE + WDOGKEY));
153 
154     qtest_writel(qts, WDOG_BASE + WDOGKEY, 0xFFFF);
155     g_assert(0 == qtest_readl(qts, WDOG_BASE + WDOGKEY));
156 
157     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
158     g_assert(1 == qtest_readl(qts, WDOG_BASE + WDOGKEY));
159 
160     qtest_writel(qts, WDOG_BASE + WDOGFEED, 0xAAAAAAAA);
161     g_assert(0 == qtest_readl(qts, WDOG_BASE + WDOGKEY));
162 
163     qtest_quit(qts);
164 }
165 
166 static void test_wdogfeed(void)
167 {
168     QTestState *qts = qtest_init("-machine sifive_e");
169 
170     test_init(qts);
171 
172     g_assert(0 == qtest_readl(qts, WDOG_BASE + WDOGFEED));
173 
174     qtest_writel(qts, WDOG_BASE + WDOGFEED, 0xFFFF);
175     g_assert(0 == qtest_readl(qts, WDOG_BASE + WDOGFEED));
176 
177     qtest_quit(qts);
178 }
179 
180 static void test_scaled_wdogs(void)
181 {
182     uint32_t cfg;
183     uint32_t fake_count = 0x12345678;
184     QTestState *qts = qtest_init("-machine sifive_e");
185 
186     test_init(qts);
187 
188     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
189     qtest_writel(qts, WDOG_BASE + WDOGCOUNT, fake_count);
190     g_assert(qtest_readl(qts, WDOG_BASE + WDOGCOUNT) == fake_count);
191     g_assert((uint16_t)qtest_readl(qts, WDOG_BASE + WDOGS) ==
192              (uint16_t)fake_count);
193 
194     for (int i = 0; i < 16; i++) {
195         cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
196         cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, SCALE, i);
197         qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
198         qtest_writel(qts, WDOG_BASE + WDOGCFG, cfg);
199         g_assert((uint16_t)qtest_readl(qts, WDOG_BASE + WDOGS) ==
200                  (uint16_t)(fake_count >>
201                             FIELD_EX32(cfg, AON_WDT_WDOGCFG, SCALE)));
202     }
203 
204     qtest_quit(qts);
205 }
206 
207 static void test_watchdog(void)
208 {
209     uint32_t cfg;
210     QTestState *qts = qtest_init("-machine sifive_e");
211 
212     test_init(qts);
213 
214     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
215     qtest_writel(qts, WDOG_BASE + WDOGCMP0, SIFIVE_E_LFCLK_DEFAULT_FREQ);
216 
217     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
218     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, SCALE, 0);
219     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, EN_ALWAYS, 1);
220     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
221     qtest_writel(qts, WDOG_BASE + WDOGCFG, cfg);
222 
223     qtest_clock_step(qts, NANOSECONDS_PER_SECOND);
224 
225     g_assert(qtest_readl(qts, WDOG_BASE + WDOGCOUNT) ==
226              SIFIVE_E_LFCLK_DEFAULT_FREQ);
227     g_assert(qtest_readl(qts, WDOG_BASE + WDOGS) ==
228              SIFIVE_E_LFCLK_DEFAULT_FREQ);
229 
230     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
231     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, SCALE));
232     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, RSTEN));
233     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, ZEROCMP));
234     g_assert(1 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_ALWAYS));
235     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_CORE_AWAKE));
236     g_assert(1 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, IP0));
237 
238     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
239     qtest_writel(qts, WDOG_BASE + WDOGCOUNT, 0);
240     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, IP0, 0);
241     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
242     qtest_writel(qts, WDOG_BASE + WDOGCFG, cfg);
243     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
244     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, IP0));
245 
246     qtest_quit(qts);
247 }
248 
249 static void test_scaled_watchdog(void)
250 {
251     uint32_t cfg;
252     QTestState *qts = qtest_init("-machine sifive_e");
253 
254     test_init(qts);
255 
256     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
257     qtest_writel(qts, WDOG_BASE + WDOGCMP0, 10);
258 
259     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
260     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, SCALE, 15);
261     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, EN_ALWAYS, 1);
262     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
263     qtest_writel(qts, WDOG_BASE + WDOGCFG, cfg);
264 
265     qtest_clock_step(qts, NANOSECONDS_PER_SECOND * 10);
266 
267     g_assert(qtest_readl(qts, WDOG_BASE + WDOGCOUNT) ==
268              SIFIVE_E_LFCLK_DEFAULT_FREQ * 10);
269 
270     g_assert(10 == qtest_readl(qts, WDOG_BASE + WDOGS));
271 
272     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
273     g_assert(15 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, SCALE));
274     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, RSTEN));
275     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, ZEROCMP));
276     g_assert(1 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_ALWAYS));
277     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_CORE_AWAKE));
278     g_assert(1 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, IP0));
279 
280     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
281     qtest_writel(qts, WDOG_BASE + WDOGCOUNT, 0);
282     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, IP0, 0);
283     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
284     qtest_writel(qts, WDOG_BASE + WDOGCFG, cfg);
285     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
286     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, IP0));
287 
288     qtest_quit(qts);
289 }
290 
291 static void test_periodic_int(void)
292 {
293     uint32_t cfg;
294     QTestState *qts = qtest_init("-machine sifive_e");
295 
296     test_init(qts);
297 
298     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
299     qtest_writel(qts, WDOG_BASE + WDOGCMP0, SIFIVE_E_LFCLK_DEFAULT_FREQ);
300 
301     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
302     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, SCALE, 0);
303     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, ZEROCMP, 1);
304     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, EN_ALWAYS, 1);
305     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
306     qtest_writel(qts, WDOG_BASE + WDOGCFG, cfg);
307 
308     qtest_clock_step(qts, NANOSECONDS_PER_SECOND);
309 
310     g_assert(0 == qtest_readl(qts, WDOG_BASE + WDOGCOUNT));
311     g_assert(0 == qtest_readl(qts, WDOG_BASE + WDOGS));
312 
313     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
314     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, SCALE));
315     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, RSTEN));
316     g_assert(1 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, ZEROCMP));
317     g_assert(1 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_ALWAYS));
318     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_CORE_AWAKE));
319     g_assert(1 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, IP0));
320 
321     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, IP0, 0);
322     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
323     qtest_writel(qts, WDOG_BASE + WDOGCFG, cfg);
324     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
325     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, IP0));
326 
327     qtest_clock_step(qts, NANOSECONDS_PER_SECOND);
328 
329     g_assert(0 == qtest_readl(qts, WDOG_BASE + WDOGCOUNT));
330     g_assert(0 == qtest_readl(qts, WDOG_BASE + WDOGS));
331 
332     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
333     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, SCALE));
334     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, RSTEN));
335     g_assert(1 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, ZEROCMP));
336     g_assert(1 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_ALWAYS));
337     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_CORE_AWAKE));
338     g_assert(1 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, IP0));
339 
340     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, IP0, 0);
341     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
342     qtest_writel(qts, WDOG_BASE + WDOGCFG, cfg);
343     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
344     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, IP0));
345 
346     qtest_quit(qts);
347 }
348 
349 static void test_enable_disable(void)
350 {
351     uint32_t cfg;
352     QTestState *qts = qtest_init("-machine sifive_e");
353 
354     test_init(qts);
355 
356     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
357     qtest_writel(qts, WDOG_BASE + WDOGCMP0, 10);
358 
359     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
360     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, SCALE, 15);
361     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, EN_ALWAYS, 1);
362     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
363     qtest_writel(qts, WDOG_BASE + WDOGCFG, cfg);
364 
365     qtest_clock_step(qts, NANOSECONDS_PER_SECOND * 2);
366 
367     g_assert(qtest_readl(qts, WDOG_BASE + WDOGCOUNT) ==
368              SIFIVE_E_LFCLK_DEFAULT_FREQ * 2);
369     g_assert(2 == qtest_readl(qts, WDOG_BASE + WDOGS));
370 
371     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
372     g_assert(15 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, SCALE));
373     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, RSTEN));
374     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, ZEROCMP));
375     g_assert(1 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_ALWAYS));
376     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_CORE_AWAKE));
377     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, IP0));
378 
379     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
380     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, EN_ALWAYS, 0);
381     qtest_writel(qts, WDOG_BASE + WDOGCFG, cfg);
382 
383     qtest_clock_step(qts, NANOSECONDS_PER_SECOND * 8);
384 
385     g_assert(qtest_readl(qts, WDOG_BASE + WDOGCOUNT) ==
386              SIFIVE_E_LFCLK_DEFAULT_FREQ * 2);
387     g_assert(2 == qtest_readl(qts, WDOG_BASE + WDOGS));
388 
389     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
390     g_assert(15 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, SCALE));
391     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, RSTEN));
392     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, ZEROCMP));
393     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_ALWAYS));
394     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_CORE_AWAKE));
395     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, IP0));
396 
397     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, EN_ALWAYS, 1);
398     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
399     qtest_writel(qts, WDOG_BASE + WDOGCFG, cfg);
400 
401     qtest_clock_step(qts, NANOSECONDS_PER_SECOND * 8);
402 
403     g_assert(qtest_readl(qts, WDOG_BASE + WDOGCOUNT) ==
404              SIFIVE_E_LFCLK_DEFAULT_FREQ * 10);
405     g_assert(10 == qtest_readl(qts, WDOG_BASE + WDOGS));
406 
407     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
408     g_assert(15 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, SCALE));
409     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, RSTEN));
410     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, ZEROCMP));
411     g_assert(1 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_ALWAYS));
412     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, EN_CORE_AWAKE));
413     g_assert(1 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, IP0));
414 
415     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
416     qtest_writel(qts, WDOG_BASE + WDOGCOUNT, 0);
417     cfg = FIELD_DP32(cfg, AON_WDT_WDOGCFG, IP0, 0);
418     qtest_writel(qts, WDOG_BASE + WDOGKEY, SIFIVE_E_AON_WDOGKEY);
419     qtest_writel(qts, WDOG_BASE + WDOGCFG, cfg);
420     cfg = qtest_readl(qts, WDOG_BASE + WDOGCFG);
421     g_assert(0 == FIELD_EX32(cfg, AON_WDT_WDOGCFG, IP0));
422 
423     qtest_quit(qts);
424 }
425 
426 int main(int argc, char *argv[])
427 {
428     g_test_init(&argc, &argv, NULL);
429     qtest_add_func("/sifive-e-aon-watchdog-test/wdogcount",
430                    test_wdogcount);
431     qtest_add_func("/sifive-e-aon-watchdog-test/wdogcfg",
432                    test_wdogcfg);
433     qtest_add_func("/sifive-e-aon-watchdog-test/wdogcmp0",
434                    test_wdogcmp0);
435     qtest_add_func("/sifive-e-aon-watchdog-test/wdogkey",
436                    test_wdogkey);
437     qtest_add_func("/sifive-e-aon-watchdog-test/wdogfeed",
438                    test_wdogfeed);
439     qtest_add_func("/sifive-e-aon-watchdog-test/scaled_wdogs",
440                    test_scaled_wdogs);
441     qtest_add_func("/sifive-e-aon-watchdog-test/watchdog",
442                    test_watchdog);
443     qtest_add_func("/sifive-e-aon-watchdog-test/scaled_watchdog",
444                    test_scaled_watchdog);
445     qtest_add_func("/sifive-e-aon-watchdog-test/periodic_int",
446                    test_periodic_int);
447     qtest_add_func("/sifive-e-aon-watchdog-test/enable_disable",
448                    test_enable_disable);
449     return g_test_run();
450 }
451