This source file includes following definitions.
- watchdog_active
- watchdog_hw_running
- watchdog_set_nowayout
- watchdog_stop_on_reboot
- watchdog_stop_on_unregister
- watchdog_timeout_invalid
- watchdog_pretimeout_invalid
- watchdog_set_drvdata
- watchdog_get_drvdata
- watchdog_notify_pretimeout
1
2
3
4
5
6
7
8
9 #ifndef _LINUX_WATCHDOG_H
10 #define _LINUX_WATCHDOG_H
11
12
13 #include <linux/bitops.h>
14 #include <linux/cdev.h>
15 #include <linux/device.h>
16 #include <linux/kernel.h>
17 #include <linux/notifier.h>
18 #include <uapi/linux/watchdog.h>
19
20 struct watchdog_ops;
21 struct watchdog_device;
22 struct watchdog_core_data;
23 struct watchdog_governor;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 struct watchdog_ops {
44 struct module *owner;
45
46 int (*start)(struct watchdog_device *);
47 int (*stop)(struct watchdog_device *);
48
49 int (*ping)(struct watchdog_device *);
50 unsigned int (*status)(struct watchdog_device *);
51 int (*set_timeout)(struct watchdog_device *, unsigned int);
52 int (*set_pretimeout)(struct watchdog_device *, unsigned int);
53 unsigned int (*get_timeleft)(struct watchdog_device *);
54 int (*restart)(struct watchdog_device *, unsigned long, void *);
55 long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long);
56 };
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 struct watchdog_device {
95 int id;
96 struct device *parent;
97 const struct attribute_group **groups;
98 const struct watchdog_info *info;
99 const struct watchdog_ops *ops;
100 const struct watchdog_governor *gov;
101 unsigned int bootstatus;
102 unsigned int timeout;
103 unsigned int pretimeout;
104 unsigned int min_timeout;
105 unsigned int max_timeout;
106 unsigned int min_hw_heartbeat_ms;
107 unsigned int max_hw_heartbeat_ms;
108 struct notifier_block reboot_nb;
109 struct notifier_block restart_nb;
110 void *driver_data;
111 struct watchdog_core_data *wd_data;
112 unsigned long status;
113
114 #define WDOG_ACTIVE 0
115 #define WDOG_NO_WAY_OUT 1
116 #define WDOG_STOP_ON_REBOOT 2
117 #define WDOG_HW_RUNNING 3
118 #define WDOG_STOP_ON_UNREGISTER 4
119 struct list_head deferred;
120 };
121
122 #define WATCHDOG_NOWAYOUT IS_BUILTIN(CONFIG_WATCHDOG_NOWAYOUT)
123 #define WATCHDOG_NOWAYOUT_INIT_STATUS (WATCHDOG_NOWAYOUT << WDOG_NO_WAY_OUT)
124
125
126 static inline bool watchdog_active(struct watchdog_device *wdd)
127 {
128 return test_bit(WDOG_ACTIVE, &wdd->status);
129 }
130
131
132
133
134
135 static inline bool watchdog_hw_running(struct watchdog_device *wdd)
136 {
137 return test_bit(WDOG_HW_RUNNING, &wdd->status);
138 }
139
140
141 static inline void watchdog_set_nowayout(struct watchdog_device *wdd, bool nowayout)
142 {
143 if (nowayout)
144 set_bit(WDOG_NO_WAY_OUT, &wdd->status);
145 }
146
147
148 static inline void watchdog_stop_on_reboot(struct watchdog_device *wdd)
149 {
150 set_bit(WDOG_STOP_ON_REBOOT, &wdd->status);
151 }
152
153
154 static inline void watchdog_stop_on_unregister(struct watchdog_device *wdd)
155 {
156 set_bit(WDOG_STOP_ON_UNREGISTER, &wdd->status);
157 }
158
159
160 static inline bool watchdog_timeout_invalid(struct watchdog_device *wdd, unsigned int t)
161 {
162
163
164
165
166
167
168
169
170
171
172
173 return t > UINT_MAX / 1000 || t < wdd->min_timeout ||
174 (!wdd->max_hw_heartbeat_ms && wdd->max_timeout &&
175 t > wdd->max_timeout);
176 }
177
178
179 static inline bool watchdog_pretimeout_invalid(struct watchdog_device *wdd,
180 unsigned int t)
181 {
182 return t && wdd->timeout && t >= wdd->timeout;
183 }
184
185
186 static inline void watchdog_set_drvdata(struct watchdog_device *wdd, void *data)
187 {
188 wdd->driver_data = data;
189 }
190
191 static inline void *watchdog_get_drvdata(struct watchdog_device *wdd)
192 {
193 return wdd->driver_data;
194 }
195
196
197 #if IS_ENABLED(CONFIG_WATCHDOG_PRETIMEOUT_GOV)
198 void watchdog_notify_pretimeout(struct watchdog_device *wdd);
199 #else
200 static inline void watchdog_notify_pretimeout(struct watchdog_device *wdd)
201 {
202 pr_alert("watchdog%d: pretimeout event\n", wdd->id);
203 }
204 #endif
205
206
207 void watchdog_set_restart_priority(struct watchdog_device *wdd, int priority);
208 extern int watchdog_init_timeout(struct watchdog_device *wdd,
209 unsigned int timeout_parm, struct device *dev);
210 extern int watchdog_register_device(struct watchdog_device *);
211 extern void watchdog_unregister_device(struct watchdog_device *);
212
213
214 int devm_watchdog_register_device(struct device *dev, struct watchdog_device *);
215
216 #endif