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
20struct watchdog_ops;
21struct watchdog_device;
22struct watchdog_core_data;
23struct watchdog_governor;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43struct watchdog_ops {
44 struct module *owner;
45
46 int (*start)(struct watchdog_device *);
47
48 int (*stop)(struct watchdog_device *);
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
94struct 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
126static inline bool watchdog_active(struct watchdog_device *wdd)
127{
128 return test_bit(WDOG_ACTIVE, &wdd->status);
129}
130
131
132
133
134
135static inline bool watchdog_hw_running(struct watchdog_device *wdd)
136{
137 return test_bit(WDOG_HW_RUNNING, &wdd->status);
138}
139
140
141static 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
148static inline void watchdog_stop_on_reboot(struct watchdog_device *wdd)
149{
150 set_bit(WDOG_STOP_ON_REBOOT, &wdd->status);
151}
152
153
154static inline void watchdog_stop_on_unregister(struct watchdog_device *wdd)
155{
156 set_bit(WDOG_STOP_ON_UNREGISTER, &wdd->status);
157}
158
159
160static 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
179static 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
186static inline void watchdog_set_drvdata(struct watchdog_device *wdd, void *data)
187{
188 wdd->driver_data = data;
189}
190
191static 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)
198void watchdog_notify_pretimeout(struct watchdog_device *wdd);
199#else
200static 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
207void watchdog_set_restart_priority(struct watchdog_device *wdd, int priority);
208extern int watchdog_init_timeout(struct watchdog_device *wdd,
209 unsigned int timeout_parm, struct device *dev);
210extern int watchdog_register_device(struct watchdog_device *);
211extern void watchdog_unregister_device(struct watchdog_device *);
212
213int watchdog_set_last_hw_keepalive(struct watchdog_device *, unsigned int);
214
215
216int devm_watchdog_register_device(struct device *dev, struct watchdog_device *);
217
218#endif
219