1111645Sphk/*- 2111645Sphk * Copyright (c) 2003 Poul-Henning Kamp 3247405Salfred * Copyright (c) 2013 iXsystems.com, 4247405Salfred * author: Alfred Perlstein <alfred@freebsd.org> 5247405Salfred * 6111645Sphk * All rights reserved. 7111645Sphk * 8111645Sphk * Redistribution and use in source and binary forms, with or without 9111645Sphk * modification, are permitted provided that the following conditions 10111645Sphk * are met: 11111645Sphk * 1. Redistributions of source code must retain the above copyright 12111645Sphk * notice, this list of conditions and the following disclaimer. 13111645Sphk * 2. Redistributions in binary form must reproduce the above copyright 14111645Sphk * notice, this list of conditions and the following disclaimer in the 15111645Sphk * documentation and/or other materials provided with the distribution. 16111645Sphk * 17111645Sphk * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18111645Sphk * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19111645Sphk * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20111645Sphk * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21111645Sphk * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22111645Sphk * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23111645Sphk * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24111645Sphk * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25111645Sphk * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26111645Sphk * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27111645Sphk * SUCH DAMAGE. 28111645Sphk * 29111645Sphk * $FreeBSD$ 30111645Sphk */ 31111645Sphk#ifndef _SYS_WATCHDOG_H 32116805Sphk#define _SYS_WATCHDOG_H 33111645Sphk 34111645Sphk#include <sys/ioccom.h> 35111645Sphk 36126370Sphk#define _PATH_WATCHDOG "fido" 37126370Sphk 38247405Salfred#define WDIOCPATPAT _IOW('W', 42, u_int) /* pat the watchdog */ 39247405Salfred#define WDIOC_SETTIMEOUT _IOW('W', 43, int) /* set/reset the timer */ 40247405Salfred#define WDIOC_GETTIMEOUT _IOR('W', 44, int) /* get total timeout */ 41247405Salfred#define WDIOC_GETTIMELEFT _IOR('W', 45, int) /* get time left */ 42247405Salfred#define WDIOC_GETPRETIMEOUT _IOR('W', 46, int) /* get the pre-timeout */ 43247405Salfred#define WDIOC_SETPRETIMEOUT _IOW('W', 47, int) /* set the pre-timeout */ 44247405Salfred/* set the action when a pre-timeout occurs see: WD_SOFT_* */ 45247405Salfred#define WDIOC_SETPRETIMEOUTACT _IOW('W', 48, int) 46111645Sphk 47247405Salfred/* use software watchdog instead of hardware */ 48247405Salfred#define WDIOC_SETSOFT _IOW('W', 49, int) 49247405Salfred#define WDIOC_SETSOFTTIMEOUTACT _IOW('W', 50, int) 50247405Salfred 51111645Sphk#define WD_ACTIVE 0x8000000 52111645Sphk /* 53111645Sphk * Watchdog reset, timeout set to value in WD_INTERVAL field. 54111645Sphk * The kernel will arm the watchdog and unless the userland 55111645Sphk * program calls WDIOCPATPAT again before the timer expires 56111645Sphk * the system will reinitialize. 57111645Sphk */ 58111645Sphk 59111645Sphk#define WD_PASSIVE 0x0400000 60111645Sphk /* 61111645Sphk * Set the watchdog in passive mode. 62111645Sphk * The kernel will chose an appropriate timeout duration and 63111645Sphk * periodically reset the timer provided everything looks all 64111645Sphk * right to the kernel. 65111645Sphk */ 66111645Sphk 67221121Sattilio#define WD_LASTVAL 0x0200000 68221121Sattilio /* 69221121Sattilio * Use the already last used timeout value. 70221121Sattilio * The kernel will use as timeout the last valid timeout provided. 71221121Sattilio */ 72221121Sattilio 73111645Sphk#define WD_INTERVAL 0x00000ff 74111645Sphk /* 75111645Sphk * Mask for duration bits. 76111645Sphk * The watchdog will have a nominal patience of 2^N * nanoseconds. 77111645Sphk * Example: N == 30 gives a patience of 2^30 nanoseconds ~= 1 second. 78111645Sphk * NB: Expect variance in the +/- 10-20% range. 79111645Sphk */ 80111645Sphk 81111645Sphk/* Handy macros for humans not used to power of two nanoseconds */ 82111645Sphk#define WD_TO_NEVER 0 83111645Sphk#define WD_TO_1MS 20 84111645Sphk#define WD_TO_125MS 27 85111645Sphk#define WD_TO_250MS 28 86111645Sphk#define WD_TO_500MS 29 87111645Sphk#define WD_TO_1SEC 30 88111645Sphk#define WD_TO_2SEC 31 89111645Sphk#define WD_TO_4SEC 32 90111645Sphk#define WD_TO_8SEC 33 91111645Sphk#define WD_TO_16SEC 34 92111645Sphk#define WD_TO_32SEC 35 93247405Salfred#define WD_TO_64SEC 36 94247405Salfred#define WD_TO_128SEC 37 95111645Sphk 96247405Salfred/* action on pre-timeout trigger */ 97247405Salfred#define WD_SOFT_PANIC 0x01 /* panic */ 98247405Salfred#define WD_SOFT_DDB 0x02 /* enter debugger */ 99247405Salfred#define WD_SOFT_LOG 0x04 /* log(9) */ 100247405Salfred#define WD_SOFT_PRINTF 0x08 /* printf(9) */ 101247405Salfred#define WD_SOFT_MASK 0x0f /* all of the above */ 102247405Salfred 103126370Sphk#ifdef _KERNEL 104126370Sphk 105126370Sphk#include <sys/eventhandler.h> 106126370Sphk 107126370Sphktypedef void (*watchdog_fn)(void *, u_int, int *); 108126370Sphk 109126370SphkEVENTHANDLER_DECLARE(watchdog_list, watchdog_fn); 110221121Sattilio 111221121Sattiliou_int wdog_kern_last_timeout(void); 112221121Sattilioint wdog_kern_pat(u_int utim); 113126370Sphk#endif 114126370Sphk 115111645Sphk#endif /* _SYS_WATCHDOG_H */ 116