Merge tag 'topic/drm-misc-2016-04-01' of git://anongit.freedesktop.org/drm-intel...
[deliverable/linux.git] / include / linux / watchdog.h
index b585fa2507eea4fd841b6cd27c4919e137e0a8ee..51732d6c9555decf5264da14a8d611524fab9b4e 100644 (file)
@@ -10,8 +10,9 @@
 
 
 #include <linux/bitops.h>
-#include <linux/device.h>
 #include <linux/cdev.h>
+#include <linux/device.h>
+#include <linux/kernel.h>
 #include <linux/notifier.h>
 #include <uapi/linux/watchdog.h>
 
@@ -46,7 +47,7 @@ struct watchdog_ops {
        unsigned int (*status)(struct watchdog_device *);
        int (*set_timeout)(struct watchdog_device *, unsigned int);
        unsigned int (*get_timeleft)(struct watchdog_device *);
-       int (*restart)(struct watchdog_device *);
+       int (*restart)(struct watchdog_device *, unsigned long, void *);
        long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long);
 };
 
@@ -61,14 +62,21 @@ struct watchdog_ops {
  * @bootstatus:        Status of the watchdog device at boot.
  * @timeout:   The watchdog devices timeout value (in seconds).
  * @min_timeout:The watchdog devices minimum timeout value (in seconds).
- * @max_timeout:The watchdog devices maximum timeout value (in seconds).
+ * @max_timeout:The watchdog devices maximum timeout value (in seconds)
+ *             as configurable from user space. Only relevant if
+ *             max_hw_heartbeat_ms is not provided.
+ * @min_hw_heartbeat_ms:
+ *             Minimum time between heartbeats, in milli-seconds.
+ * @max_hw_heartbeat_ms:
+ *             Hardware limit for maximum timeout, in milli-seconds.
+ *             Replaces max_timeout if specified.
  * @reboot_nb: The notifier block to stop watchdog on reboot.
  * @restart_nb:        The notifier block to register a restart function.
  * @driver_data:Pointer to the drivers private data.
  * @wd_data:   Pointer to watchdog core internal data.
  * @status:    Field that contains the devices internal status bits.
- * @deferred: entry in wtd_deferred_reg_list which is used to
- *                        register early initialized watchdogs.
+ * @deferred:  Entry in wtd_deferred_reg_list which is used to
+ *             register early initialized watchdogs.
  *
  * The watchdog_device structure contains all information about a
  * watchdog timer device.
@@ -89,6 +97,8 @@ struct watchdog_device {
        unsigned int timeout;
        unsigned int min_timeout;
        unsigned int max_timeout;
+       unsigned int min_hw_heartbeat_ms;
+       unsigned int max_hw_heartbeat_ms;
        struct notifier_block reboot_nb;
        struct notifier_block restart_nb;
        void *driver_data;
@@ -98,6 +108,7 @@ struct watchdog_device {
 #define WDOG_ACTIVE            0       /* Is the watchdog running/active */
 #define WDOG_NO_WAY_OUT                1       /* Is 'nowayout' feature set ? */
 #define WDOG_STOP_ON_REBOOT    2       /* Should be stopped on reboot */
+#define WDOG_HW_RUNNING                3       /* True if HW watchdog running */
        struct list_head deferred;
 };
 
@@ -110,6 +121,15 @@ static inline bool watchdog_active(struct watchdog_device *wdd)
        return test_bit(WDOG_ACTIVE, &wdd->status);
 }
 
+/*
+ * Use the following function to check whether or not the hardware watchdog
+ * is running
+ */
+static inline bool watchdog_hw_running(struct watchdog_device *wdd)
+{
+       return test_bit(WDOG_HW_RUNNING, &wdd->status);
+}
+
 /* Use the following function to set the nowayout feature */
 static inline void watchdog_set_nowayout(struct watchdog_device *wdd, bool nowayout)
 {
@@ -128,13 +148,18 @@ static inline bool watchdog_timeout_invalid(struct watchdog_device *wdd, unsigne
 {
        /*
         * The timeout is invalid if
+        * - the requested value is larger than UINT_MAX / 1000
+        *   (since internal calculations are done in milli-seconds),
+        * or
         * - the requested value is smaller than the configured minimum timeout,
         * or
-        * - a maximum timeout is configured, and the requested value is larger
-        *   than the maximum timeout.
+        * - a maximum hardware timeout is not configured, a maximum timeout
+        *   is configured, and the requested value is larger than the
+        *   configured maximum timeout.
         */
-       return t < wdd->min_timeout ||
-               (wdd->max_timeout && t > wdd->max_timeout);
+       return t > UINT_MAX / 1000 || t < wdd->min_timeout ||
+               (!wdd->max_hw_heartbeat_ms && wdd->max_timeout &&
+                t > wdd->max_timeout);
 }
 
 /* Use the following functions to manipulate watchdog driver specific data */
This page took 0.026093 seconds and 5 git commands to generate.