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