1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include "qemu/osdep.h"
18#include "qemu/bitops.h"
19#include "libqtest-single.h"
20
21
22
23
24
25#define WDOG_BASE 0x40000000
26
27#define WDOGLOAD 0
28#define WDOGVALUE 4
29#define WDOGCONTROL 8
30#define WDOGINTCLR 0xc
31#define WDOGRIS 0x10
32#define WDOGMIS 0x14
33#define WDOGLOCK 0xc00
34
35#define SSYS_BASE 0x400fe000
36#define RCC 0x60
37#define SYSDIV_SHIFT 23
38#define SYSDIV_LENGTH 4
39
40static void test_watchdog(void)
41{
42 g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
43
44 writel(WDOG_BASE + WDOGCONTROL, 1);
45 writel(WDOG_BASE + WDOGLOAD, 1000);
46
47
48 clock_step(500 * 80 + 1);
49 g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
50 g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 500);
51
52
53 clock_step(500 * 80);
54 g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 1);
55 g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 0);
56
57
58 clock_step(80);
59 g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 1000);
60
61
62 clock_step(500 * 80);
63 g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 500);
64 g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 1);
65 writel(WDOG_BASE + WDOGINTCLR, 0);
66 g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 1000);
67 g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
68}
69
70static void test_clock_change(void)
71{
72 uint32_t rcc;
73
74
75
76
77
78
79 g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
80
81 writel(WDOG_BASE + WDOGCONTROL, 1);
82 writel(WDOG_BASE + WDOGLOAD, 1000);
83
84
85 clock_step(80 * 500 + 1);
86 g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
87 g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 500);
88
89
90 rcc = readl(SSYS_BASE + RCC);
91 g_assert_cmpuint(extract32(rcc, SYSDIV_SHIFT, SYSDIV_LENGTH), ==, 0xf);
92 rcc = deposit32(rcc, SYSDIV_SHIFT, SYSDIV_LENGTH, 7);
93 writel(SSYS_BASE + RCC, rcc);
94
95
96 clock_step(40 * 500);
97 g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 1);
98
99 g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 0);
100
101
102 clock_step(41);
103 g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 1000);
104
105
106 clock_step(40 * 500);
107 g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 500);
108 g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 1);
109 writel(WDOG_BASE + WDOGINTCLR, 0);
110 g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 1000);
111 g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
112}
113
114int main(int argc, char **argv)
115{
116 int r;
117
118 g_test_init(&argc, &argv, NULL);
119
120 qtest_start("-machine lm3s811evb");
121
122 qtest_add_func("/cmsdk-apb-watchdog/watchdog", test_watchdog);
123 qtest_add_func("/cmsdk-apb-watchdog/watchdog_clock_change",
124 test_clock_change);
125
126 r = g_test_run();
127
128 qtest_end();
129
130 return r;
131}
132