root/include/linux/watchdog.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. watchdog_active
  2. watchdog_hw_running
  3. watchdog_set_nowayout
  4. watchdog_stop_on_reboot
  5. watchdog_stop_on_unregister
  6. watchdog_timeout_invalid
  7. watchdog_pretimeout_invalid
  8. watchdog_set_drvdata
  9. watchdog_get_drvdata
  10. watchdog_notify_pretimeout

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  *      Generic watchdog defines. Derived from..
   4  *
   5  * Berkshire PC Watchdog Defines
   6  * by Ken Hollis <khollis@bitgate.com>
   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 /** struct watchdog_ops - The watchdog-devices operations
  26  *
  27  * @owner:      The module owner.
  28  * @start:      The routine for starting the watchdog device.
  29  * @stop:       The routine for stopping the watchdog device.
  30  * @ping:       The routine that sends a keepalive ping to the watchdog device.
  31  * @status:     The routine that shows the status of the watchdog device.
  32  * @set_timeout:The routine for setting the watchdog devices timeout value (in seconds).
  33  * @set_pretimeout:The routine for setting the watchdog devices pretimeout.
  34  * @get_timeleft:The routine that gets the time left before a reset (in seconds).
  35  * @restart:    The routine for restarting the machine.
  36  * @ioctl:      The routines that handles extra ioctl calls.
  37  *
  38  * The watchdog_ops structure contains a list of low-level operations
  39  * that control a watchdog device. It also contains the module that owns
  40  * these operations. The start and stop function are mandatory, all other
  41  * functions are optional.
  42  */
  43 struct watchdog_ops {
  44         struct module *owner;
  45         /* mandatory operations */
  46         int (*start)(struct watchdog_device *);
  47         int (*stop)(struct watchdog_device *);
  48         /* optional operations */
  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 /** struct watchdog_device - The structure that defines a watchdog device
  59  *
  60  * @id:         The watchdog's ID. (Allocated by watchdog_register_device)
  61  * @parent:     The parent bus device
  62  * @groups:     List of sysfs attribute groups to create when creating the
  63  *              watchdog device.
  64  * @info:       Pointer to a watchdog_info structure.
  65  * @ops:        Pointer to the list of watchdog operations.
  66  * @gov:        Pointer to watchdog pretimeout governor.
  67  * @bootstatus: Status of the watchdog device at boot.
  68  * @timeout:    The watchdog devices timeout value (in seconds).
  69  * @pretimeout: The watchdog devices pre_timeout value.
  70  * @min_timeout:The watchdog devices minimum timeout value (in seconds).
  71  * @max_timeout:The watchdog devices maximum timeout value (in seconds)
  72  *              as configurable from user space. Only relevant if
  73  *              max_hw_heartbeat_ms is not provided.
  74  * @min_hw_heartbeat_ms:
  75  *              Hardware limit for minimum time between heartbeats,
  76  *              in milli-seconds.
  77  * @max_hw_heartbeat_ms:
  78  *              Hardware limit for maximum timeout, in milli-seconds.
  79  *              Replaces max_timeout if specified.
  80  * @reboot_nb:  The notifier block to stop watchdog on reboot.
  81  * @restart_nb: The notifier block to register a restart function.
  82  * @driver_data:Pointer to the drivers private data.
  83  * @wd_data:    Pointer to watchdog core internal data.
  84  * @status:     Field that contains the devices internal status bits.
  85  * @deferred:   Entry in wtd_deferred_reg_list which is used to
  86  *              register early initialized watchdogs.
  87  *
  88  * The watchdog_device structure contains all information about a
  89  * watchdog timer device.
  90  *
  91  * The driver-data field may not be accessed directly. It must be accessed
  92  * via the watchdog_set_drvdata and watchdog_get_drvdata helpers.
  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 /* Bit numbers for status flags */
 114 #define WDOG_ACTIVE             0       /* Is the watchdog running/active */
 115 #define WDOG_NO_WAY_OUT         1       /* Is 'nowayout' feature set ? */
 116 #define WDOG_STOP_ON_REBOOT     2       /* Should be stopped on reboot */
 117 #define WDOG_HW_RUNNING         3       /* True if HW watchdog running */
 118 #define WDOG_STOP_ON_UNREGISTER 4       /* Should be stopped on unregister */
 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 /* Use the following function to check whether or not the watchdog is active */
 126 static inline bool watchdog_active(struct watchdog_device *wdd)
 127 {
 128         return test_bit(WDOG_ACTIVE, &wdd->status);
 129 }
 130 
 131 /*
 132  * Use the following function to check whether or not the hardware watchdog
 133  * is running
 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 /* Use the following function to set the nowayout feature */
 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 /* Use the following function to stop the watchdog on reboot */
 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 /* Use the following function to stop the watchdog when unregistering it */
 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 /* Use the following function to check if a timeout value is invalid */
 160 static inline bool watchdog_timeout_invalid(struct watchdog_device *wdd, unsigned int t)
 161 {
 162         /*
 163          * The timeout is invalid if
 164          * - the requested value is larger than UINT_MAX / 1000
 165          *   (since internal calculations are done in milli-seconds),
 166          * or
 167          * - the requested value is smaller than the configured minimum timeout,
 168          * or
 169          * - a maximum hardware timeout is not configured, a maximum timeout
 170          *   is configured, and the requested value is larger than the
 171          *   configured maximum timeout.
 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 /* Use the following function to check if a pretimeout value is invalid */
 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 /* Use the following functions to manipulate watchdog driver specific data */
 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 /* Use the following functions to report watchdog pretimeout event */
 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 /* drivers/watchdog/watchdog_core.c */
 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 /* devres register variant */
 214 int devm_watchdog_register_device(struct device *dev, struct watchdog_device *);
 215 
 216 #endif  /* ifndef _LINUX_WATCHDOG_H */

/* [<][>][^][v][top][bottom][index][help] */