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 struct notifier_block pm_nb;
111 void *driver_data;
112 struct watchdog_core_data *wd_data;
113 unsigned long status;
114
115#define WDOG_ACTIVE 0
116#define WDOG_NO_WAY_OUT 1
117#define WDOG_STOP_ON_REBOOT 2
118#define WDOG_HW_RUNNING 3
119#define WDOG_STOP_ON_UNREGISTER 4
120#define WDOG_NO_PING_ON_SUSPEND 5
121 struct list_head deferred;
122};
123
124#define WATCHDOG_NOWAYOUT IS_BUILTIN(CONFIG_WATCHDOG_NOWAYOUT)
125#define WATCHDOG_NOWAYOUT_INIT_STATUS (WATCHDOG_NOWAYOUT << WDOG_NO_WAY_OUT)
126
127
128static inline bool watchdog_active(struct watchdog_device *wdd)
129{
130 return test_bit(WDOG_ACTIVE, &wdd->status);
131}
132
133
134
135
136
137static inline bool watchdog_hw_running(struct watchdog_device *wdd)
138{
139 return test_bit(WDOG_HW_RUNNING, &wdd->status);
140}
141
142
143static inline void watchdog_set_nowayout(struct watchdog_device *wdd, bool nowayout)
144{
145 if (nowayout)
146 set_bit(WDOG_NO_WAY_OUT, &wdd->status);
147}
148
149
150static inline void watchdog_stop_on_reboot(struct watchdog_device *wdd)
151{
152 set_bit(WDOG_STOP_ON_REBOOT, &wdd->status);
153}
154
155
156static inline void watchdog_stop_on_unregister(struct watchdog_device *wdd)
157{
158 set_bit(WDOG_STOP_ON_UNREGISTER, &wdd->status);
159}
160
161
162static inline void watchdog_stop_ping_on_suspend(struct watchdog_device *wdd)
163{
164 set_bit(WDOG_NO_PING_ON_SUSPEND, &wdd->status);
165}
166
167
168static inline bool watchdog_timeout_invalid(struct watchdog_device *wdd, unsigned int t)
169{
170
171
172
173
174
175
176
177
178
179
180
181 return t > UINT_MAX / 1000 || t < wdd->min_timeout ||
182 (!wdd->max_hw_heartbeat_ms && wdd->max_timeout &&
183 t > wdd->max_timeout);
184}
185
186
187static inline bool watchdog_pretimeout_invalid(struct watchdog_device *wdd,
188 unsigned int t)
189{
190 return t && wdd->timeout && t >= wdd->timeout;
191}
192
193
194static inline void watchdog_set_drvdata(struct watchdog_device *wdd, void *data)
195{
196 wdd->driver_data = data;
197}
198
199static inline void *watchdog_get_drvdata(struct watchdog_device *wdd)
200{
201 return wdd->driver_data;
202}
203
204
205#if IS_ENABLED(CONFIG_WATCHDOG_PRETIMEOUT_GOV)
206void watchdog_notify_pretimeout(struct watchdog_device *wdd);
207#else
208static inline void watchdog_notify_pretimeout(struct watchdog_device *wdd)
209{
210 pr_alert("watchdog%d: pretimeout event\n", wdd->id);
211}
212#endif
213
214
215void watchdog_set_restart_priority(struct watchdog_device *wdd, int priority);
216extern int watchdog_init_timeout(struct watchdog_device *wdd,
217 unsigned int timeout_parm, struct device *dev);
218extern int watchdog_register_device(struct watchdog_device *);
219extern void watchdog_unregister_device(struct watchdog_device *);
220int watchdog_dev_suspend(struct watchdog_device *wdd);
221int watchdog_dev_resume(struct watchdog_device *wdd);
222
223int watchdog_set_last_hw_keepalive(struct watchdog_device *, unsigned int);
224
225
226int devm_watchdog_register_device(struct device *dev, struct watchdog_device *);
227
228#endif
229