linux/include/linux/watchdog.h
<<
>>
Prefs
   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
  20struct watchdog_ops;
  21struct watchdog_device;
  22struct watchdog_core_data;
  23struct 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 */
  43struct 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 * The lock field is for watchdog core internal use only and should not be
  95 * touched.
  96 */
  97struct watchdog_device {
  98        int id;
  99        struct device *parent;
 100        const struct attribute_group **groups;
 101        const struct watchdog_info *info;
 102        const struct watchdog_ops *ops;
 103        const struct watchdog_governor *gov;
 104        unsigned int bootstatus;
 105        unsigned int timeout;
 106        unsigned int pretimeout;
 107        unsigned int min_timeout;
 108        unsigned int max_timeout;
 109        unsigned int min_hw_heartbeat_ms;
 110        unsigned int max_hw_heartbeat_ms;
 111        struct notifier_block reboot_nb;
 112        struct notifier_block restart_nb;
 113        void *driver_data;
 114        struct watchdog_core_data *wd_data;
 115        unsigned long status;
 116/* Bit numbers for status flags */
 117#define WDOG_ACTIVE             0       /* Is the watchdog running/active */
 118#define WDOG_NO_WAY_OUT         1       /* Is 'nowayout' feature set ? */
 119#define WDOG_STOP_ON_REBOOT     2       /* Should be stopped on reboot */
 120#define WDOG_HW_RUNNING         3       /* True if HW watchdog running */
 121#define WDOG_STOP_ON_UNREGISTER 4       /* Should be stopped on unregister */
 122        struct list_head deferred;
 123};
 124
 125#define WATCHDOG_NOWAYOUT               IS_BUILTIN(CONFIG_WATCHDOG_NOWAYOUT)
 126#define WATCHDOG_NOWAYOUT_INIT_STATUS   (WATCHDOG_NOWAYOUT << WDOG_NO_WAY_OUT)
 127
 128/* Use the following function to check whether or not the watchdog is active */
 129static inline bool watchdog_active(struct watchdog_device *wdd)
 130{
 131        return test_bit(WDOG_ACTIVE, &wdd->status);
 132}
 133
 134/*
 135 * Use the following function to check whether or not the hardware watchdog
 136 * is running
 137 */
 138static inline bool watchdog_hw_running(struct watchdog_device *wdd)
 139{
 140        return test_bit(WDOG_HW_RUNNING, &wdd->status);
 141}
 142
 143/* Use the following function to set the nowayout feature */
 144static inline void watchdog_set_nowayout(struct watchdog_device *wdd, bool nowayout)
 145{
 146        if (nowayout)
 147                set_bit(WDOG_NO_WAY_OUT, &wdd->status);
 148}
 149
 150/* Use the following function to stop the watchdog on reboot */
 151static inline void watchdog_stop_on_reboot(struct watchdog_device *wdd)
 152{
 153        set_bit(WDOG_STOP_ON_REBOOT, &wdd->status);
 154}
 155
 156/* Use the following function to stop the watchdog when unregistering it */
 157static inline void watchdog_stop_on_unregister(struct watchdog_device *wdd)
 158{
 159        set_bit(WDOG_STOP_ON_UNREGISTER, &wdd->status);
 160}
 161
 162/* Use the following function to check if a timeout value is invalid */
 163static inline bool watchdog_timeout_invalid(struct watchdog_device *wdd, unsigned int t)
 164{
 165        /*
 166         * The timeout is invalid if
 167         * - the requested value is larger than UINT_MAX / 1000
 168         *   (since internal calculations are done in milli-seconds),
 169         * or
 170         * - the requested value is smaller than the configured minimum timeout,
 171         * or
 172         * - a maximum hardware timeout is not configured, a maximum timeout
 173         *   is configured, and the requested value is larger than the
 174         *   configured maximum timeout.
 175         */
 176        return t > UINT_MAX / 1000 || t < wdd->min_timeout ||
 177                (!wdd->max_hw_heartbeat_ms && wdd->max_timeout &&
 178                 t > wdd->max_timeout);
 179}
 180
 181/* Use the following function to check if a pretimeout value is invalid */
 182static inline bool watchdog_pretimeout_invalid(struct watchdog_device *wdd,
 183                                               unsigned int t)
 184{
 185        return t && wdd->timeout && t >= wdd->timeout;
 186}
 187
 188/* Use the following functions to manipulate watchdog driver specific data */
 189static inline void watchdog_set_drvdata(struct watchdog_device *wdd, void *data)
 190{
 191        wdd->driver_data = data;
 192}
 193
 194static inline void *watchdog_get_drvdata(struct watchdog_device *wdd)
 195{
 196        return wdd->driver_data;
 197}
 198
 199/* Use the following functions to report watchdog pretimeout event */
 200#if IS_ENABLED(CONFIG_WATCHDOG_PRETIMEOUT_GOV)
 201void watchdog_notify_pretimeout(struct watchdog_device *wdd);
 202#else
 203static inline void watchdog_notify_pretimeout(struct watchdog_device *wdd)
 204{
 205        pr_alert("watchdog%d: pretimeout event\n", wdd->id);
 206}
 207#endif
 208
 209/* drivers/watchdog/watchdog_core.c */
 210void watchdog_set_restart_priority(struct watchdog_device *wdd, int priority);
 211extern int watchdog_init_timeout(struct watchdog_device *wdd,
 212                                  unsigned int timeout_parm, struct device *dev);
 213extern int watchdog_register_device(struct watchdog_device *);
 214extern void watchdog_unregister_device(struct watchdog_device *);
 215
 216/* devres register variant */
 217int devm_watchdog_register_device(struct device *dev, struct watchdog_device *);
 218
 219#endif  /* ifndef _LINUX_WATCHDOG_H */
 220