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