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 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 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 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 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 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 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 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 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 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 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 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 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