4 * A watchdog timer based upon the IPMI interface.
6 * Author: MontaVista Software, Inc.
7 * Corey Minyard <minyard@mvista.com>
10 * Copyright 2002 MontaVista Software Inc.
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version.
18 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
19 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
24 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
26 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
27 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 * You should have received a copy of the GNU General Public License along
30 * with this program; if not, write to the Free Software Foundation, Inc.,
31 * 675 Mass Ave, Cambridge, MA 02139, USA.
34 #include <linux/module.h>
35 #include <linux/moduleparam.h>
36 #include <linux/ipmi.h>
37 #include <linux/ipmi_smi.h>
38 #include <linux/watchdog.h>
39 #include <linux/miscdevice.h>
40 #include <linux/init.h>
41 #include <linux/completion.h>
42 #include <linux/kdebug.h>
43 #include <linux/rwsem.h>
44 #include <linux/errno.h>
45 #include <asm/uaccess.h>
46 #include <linux/notifier.h>
47 #include <linux/nmi.h>
48 #include <linux/reboot.h>
49 #include <linux/wait.h>
50 #include <linux/poll.h>
51 #include <linux/string.h>
52 #include <linux/ctype.h>
53 #include <asm/atomic.h>
55 #ifdef CONFIG_X86_LOCAL_APIC
59 #define PFX "IPMI Watchdog: "
62 * The IPMI command/response information for the watchdog timer.
65 /* values for byte 1 of the set command, byte 2 of the get response. */
66 #define WDOG_DONT_LOG (1 << 7)
67 #define WDOG_DONT_STOP_ON_SET (1 << 6)
68 #define WDOG_SET_TIMER_USE(byte, use) \
69 byte = ((byte) & 0xf8) | ((use) & 0x7)
70 #define WDOG_GET_TIMER_USE(byte) ((byte) & 0x7)
71 #define WDOG_TIMER_USE_BIOS_FRB2 1
72 #define WDOG_TIMER_USE_BIOS_POST 2
73 #define WDOG_TIMER_USE_OS_LOAD 3
74 #define WDOG_TIMER_USE_SMS_OS 4
75 #define WDOG_TIMER_USE_OEM 5
77 /* values for byte 2 of the set command, byte 3 of the get response. */
78 #define WDOG_SET_PRETIMEOUT_ACT(byte, use) \
79 byte = ((byte) & 0x8f) | (((use) & 0x7) << 4)
80 #define WDOG_GET_PRETIMEOUT_ACT(byte) (((byte) >> 4) & 0x7)
81 #define WDOG_PRETIMEOUT_NONE 0
82 #define WDOG_PRETIMEOUT_SMI 1
83 #define WDOG_PRETIMEOUT_NMI 2
84 #define WDOG_PRETIMEOUT_MSG_INT 3
86 /* Operations that can be performed on a pretimout. */
87 #define WDOG_PREOP_NONE 0
88 #define WDOG_PREOP_PANIC 1
89 #define WDOG_PREOP_GIVE_DATA 2 /* Cause data to be available to
90 read. Doesn't work in NMI
93 /* Actions to perform on a full timeout. */
94 #define WDOG_SET_TIMEOUT_ACT(byte, use) \
95 byte = ((byte) & 0xf8) | ((use) & 0x7)
96 #define WDOG_GET_TIMEOUT_ACT(byte) ((byte) & 0x7)
97 #define WDOG_TIMEOUT_NONE 0
98 #define WDOG_TIMEOUT_RESET 1
99 #define WDOG_TIMEOUT_POWER_DOWN 2
100 #define WDOG_TIMEOUT_POWER_CYCLE 3
102 /* Byte 3 of the get command, byte 4 of the get response is the
103 pre-timeout in seconds. */
105 /* Bits for setting byte 4 of the set command, byte 5 of the get response. */
106 #define WDOG_EXPIRE_CLEAR_BIOS_FRB2 (1 << 1)
107 #define WDOG_EXPIRE_CLEAR_BIOS_POST (1 << 2)
108 #define WDOG_EXPIRE_CLEAR_OS_LOAD (1 << 3)
109 #define WDOG_EXPIRE_CLEAR_SMS_OS (1 << 4)
110 #define WDOG_EXPIRE_CLEAR_OEM (1 << 5)
112 /* Setting/getting the watchdog timer value. This is for bytes 5 and
113 6 (the timeout time) of the set command, and bytes 6 and 7 (the
114 timeout time) and 8 and 9 (the current countdown value) of the
115 response. The timeout value is given in seconds (in the command it
116 is 100ms intervals). */
117 #define WDOG_SET_TIMEOUT(byte1, byte2, val) \
118 (byte1) = (((val) * 10) & 0xff), (byte2) = (((val) * 10) >> 8)
119 #define WDOG_GET_TIMEOUT(byte1, byte2) \
120 (((byte1) | ((byte2) << 8)) / 10)
122 #define IPMI_WDOG_RESET_TIMER 0x22
123 #define IPMI_WDOG_SET_TIMER 0x24
124 #define IPMI_WDOG_GET_TIMER 0x25
126 /* These are here until the real ones get into the watchdog.h interface. */
127 #ifndef WDIOC_GETTIMEOUT
128 #define WDIOC_GETTIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 20, int)
130 #ifndef WDIOC_SET_PRETIMEOUT
131 #define WDIOC_SET_PRETIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 21, int)
133 #ifndef WDIOC_GET_PRETIMEOUT
134 #define WDIOC_GET_PRETIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 22, int)
137 static int nowayout = WATCHDOG_NOWAYOUT;
139 static ipmi_user_t watchdog_user;
140 static int watchdog_ifnum;
142 /* Default the timeout to 10 seconds. */
143 static int timeout = 10;
145 /* The pre-timeout is disabled by default. */
146 static int pretimeout;
148 /* Default action is to reset the board on a timeout. */
149 static unsigned char action_val = WDOG_TIMEOUT_RESET;
151 static char action[16] = "reset";
153 static unsigned char preaction_val = WDOG_PRETIMEOUT_NONE;
155 static char preaction[16] = "pre_none";
157 static unsigned char preop_val = WDOG_PREOP_NONE;
159 static char preop[16] = "preop_none";
160 static DEFINE_SPINLOCK(ipmi_read_lock);
161 static char data_to_read;
162 static DECLARE_WAIT_QUEUE_HEAD(read_q);
163 static struct fasync_struct *fasync_q;
164 static char pretimeout_since_last_heartbeat;
165 static char expect_close;
167 static int ifnum_to_use = -1;
169 /* Parameters to ipmi_set_timeout */
170 #define IPMI_SET_TIMEOUT_NO_HB 0
171 #define IPMI_SET_TIMEOUT_HB_IF_NECESSARY 1
172 #define IPMI_SET_TIMEOUT_FORCE_HB 2
174 static int ipmi_set_timeout(int do_heartbeat);
175 static void ipmi_register_watchdog(int ipmi_intf);
176 static void ipmi_unregister_watchdog(int ipmi_intf);
178 /* If true, the driver will start running as soon as it is configured
180 static int start_now;
182 static int set_param_int(const char *val, struct kernel_param *kp)
190 l = simple_strtoul(val, &endp, 0);
194 *((int *)kp->arg) = l;
196 rv = ipmi_set_timeout(IPMI_SET_TIMEOUT_HB_IF_NECESSARY);
201 static int get_param_int(char *buffer, struct kernel_param *kp)
203 return sprintf(buffer, "%i", *((int *)kp->arg));
206 typedef int (*action_fn)(const char *intval, char *outval);
208 static int action_op(const char *inval, char *outval);
209 static int preaction_op(const char *inval, char *outval);
210 static int preop_op(const char *inval, char *outval);
211 static void check_parms(void);
213 static int set_param_str(const char *val, struct kernel_param *kp)
215 action_fn fn = (action_fn) kp->arg;
220 strncpy(valcp, val, 16);
231 rv = ipmi_set_timeout(IPMI_SET_TIMEOUT_HB_IF_NECESSARY);
237 static int get_param_str(char *buffer, struct kernel_param *kp)
239 action_fn fn = (action_fn) kp->arg;
242 rv = fn(NULL, buffer);
245 return strlen(buffer);
249 static int set_param_wdog_ifnum(const char *val, struct kernel_param *kp)
251 int rv = param_set_int(val, kp);
254 if ((ifnum_to_use < 0) || (ifnum_to_use == watchdog_ifnum))
257 ipmi_unregister_watchdog(watchdog_ifnum);
258 ipmi_register_watchdog(ifnum_to_use);
262 module_param_call(ifnum_to_use, set_param_wdog_ifnum, get_param_int,
263 &ifnum_to_use, 0644);
264 MODULE_PARM_DESC(ifnum_to_use, "The interface number to use for the watchdog "
265 "timer. Setting to -1 defaults to the first registered "
268 module_param_call(timeout, set_param_int, get_param_int, &timeout, 0644);
269 MODULE_PARM_DESC(timeout, "Timeout value in seconds.");
271 module_param_call(pretimeout, set_param_int, get_param_int, &pretimeout, 0644);
272 MODULE_PARM_DESC(pretimeout, "Pretimeout value in seconds.");
274 module_param_call(action, set_param_str, get_param_str, action_op, 0644);
275 MODULE_PARM_DESC(action, "Timeout action. One of: "
276 "reset, none, power_cycle, power_off.");
278 module_param_call(preaction, set_param_str, get_param_str, preaction_op, 0644);
279 MODULE_PARM_DESC(preaction, "Pretimeout action. One of: "
280 "pre_none, pre_smi, pre_nmi, pre_int.");
282 module_param_call(preop, set_param_str, get_param_str, preop_op, 0644);
283 MODULE_PARM_DESC(preop, "Pretimeout driver operation. One of: "
284 "preop_none, preop_panic, preop_give_data.");
286 module_param(start_now, int, 0444);
287 MODULE_PARM_DESC(start_now, "Set to 1 to start the watchdog as"
288 "soon as the driver is loaded.");
290 module_param(nowayout, int, 0644);
291 MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started "
292 "(default=CONFIG_WATCHDOG_NOWAYOUT)");
294 /* Default state of the timer. */
295 static unsigned char ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
297 /* If shutting down via IPMI, we ignore the heartbeat. */
298 static int ipmi_ignore_heartbeat;
300 /* Is someone using the watchdog? Only one user is allowed. */
301 static unsigned long ipmi_wdog_open;
303 /* If set to 1, the heartbeat command will set the state to reset and
304 start the timer. The timer doesn't normally run when the driver is
305 first opened until the heartbeat is set the first time, this
306 variable is used to accomplish this. */
307 static int ipmi_start_timer_on_heartbeat;
309 /* IPMI version of the BMC. */
310 static unsigned char ipmi_version_major;
311 static unsigned char ipmi_version_minor;
313 /* If a pretimeout occurs, this is used to allow only one panic to happen. */
314 static atomic_t preop_panic_excl = ATOMIC_INIT(-1);
316 static int ipmi_heartbeat(void);
318 /* We use a mutex to make sure that only one thing can send a set
319 timeout at one time, because we only have one copy of the data.
320 The mutex is claimed when the set_timeout is sent and freed
321 when both messages are free. */
322 static atomic_t set_timeout_tofree = ATOMIC_INIT(0);
323 static DEFINE_MUTEX(set_timeout_lock);
324 static DECLARE_COMPLETION(set_timeout_wait);
325 static void set_timeout_free_smi(struct ipmi_smi_msg *msg)
327 if (atomic_dec_and_test(&set_timeout_tofree))
328 complete(&set_timeout_wait);
330 static void set_timeout_free_recv(struct ipmi_recv_msg *msg)
332 if (atomic_dec_and_test(&set_timeout_tofree))
333 complete(&set_timeout_wait);
335 static struct ipmi_smi_msg set_timeout_smi_msg =
337 .done = set_timeout_free_smi
339 static struct ipmi_recv_msg set_timeout_recv_msg =
341 .done = set_timeout_free_recv
344 static int i_ipmi_set_timeout(struct ipmi_smi_msg *smi_msg,
345 struct ipmi_recv_msg *recv_msg,
346 int *send_heartbeat_now)
348 struct kernel_ipmi_msg msg;
349 unsigned char data[6];
351 struct ipmi_system_interface_addr addr;
356 WDOG_SET_TIMER_USE(data[0], WDOG_TIMER_USE_SMS_OS);
358 if ((ipmi_version_major > 1)
359 || ((ipmi_version_major == 1) && (ipmi_version_minor >= 5)))
361 /* This is an IPMI 1.5-only feature. */
362 data[0] |= WDOG_DONT_STOP_ON_SET;
363 } else if (ipmi_watchdog_state != WDOG_TIMEOUT_NONE) {
364 /* In ipmi 1.0, setting the timer stops the watchdog, we
365 need to start it back up again. */
370 WDOG_SET_TIMEOUT_ACT(data[1], ipmi_watchdog_state);
371 if ((pretimeout > 0) && (ipmi_watchdog_state != WDOG_TIMEOUT_NONE)) {
372 WDOG_SET_PRETIMEOUT_ACT(data[1], preaction_val);
373 data[2] = pretimeout;
375 WDOG_SET_PRETIMEOUT_ACT(data[1], WDOG_PRETIMEOUT_NONE);
376 data[2] = 0; /* No pretimeout. */
379 WDOG_SET_TIMEOUT(data[4], data[5], timeout);
381 addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
382 addr.channel = IPMI_BMC_CHANNEL;
386 msg.cmd = IPMI_WDOG_SET_TIMER;
388 msg.data_len = sizeof(data);
389 rv = ipmi_request_supply_msgs(watchdog_user,
390 (struct ipmi_addr *) &addr,
398 printk(KERN_WARNING PFX "set timeout error: %d\n",
402 if (send_heartbeat_now)
403 *send_heartbeat_now = hbnow;
408 static int ipmi_set_timeout(int do_heartbeat)
410 int send_heartbeat_now;
414 /* We can only send one of these at a time. */
415 mutex_lock(&set_timeout_lock);
417 atomic_set(&set_timeout_tofree, 2);
419 rv = i_ipmi_set_timeout(&set_timeout_smi_msg,
420 &set_timeout_recv_msg,
421 &send_heartbeat_now);
423 mutex_unlock(&set_timeout_lock);
427 wait_for_completion(&set_timeout_wait);
429 if ((do_heartbeat == IPMI_SET_TIMEOUT_FORCE_HB)
430 || ((send_heartbeat_now)
431 && (do_heartbeat == IPMI_SET_TIMEOUT_HB_IF_NECESSARY)))
433 rv = ipmi_heartbeat();
435 mutex_unlock(&set_timeout_lock);
441 static atomic_t panic_done_count = ATOMIC_INIT(0);
443 static void panic_smi_free(struct ipmi_smi_msg *msg)
445 atomic_dec(&panic_done_count);
447 static void panic_recv_free(struct ipmi_recv_msg *msg)
449 atomic_dec(&panic_done_count);
452 static struct ipmi_smi_msg panic_halt_heartbeat_smi_msg =
454 .done = panic_smi_free
456 static struct ipmi_recv_msg panic_halt_heartbeat_recv_msg =
458 .done = panic_recv_free
461 static void panic_halt_ipmi_heartbeat(void)
463 struct kernel_ipmi_msg msg;
464 struct ipmi_system_interface_addr addr;
467 /* Don't reset the timer if we have the timer turned off, that
468 re-enables the watchdog. */
469 if (ipmi_watchdog_state == WDOG_TIMEOUT_NONE)
472 addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
473 addr.channel = IPMI_BMC_CHANNEL;
477 msg.cmd = IPMI_WDOG_RESET_TIMER;
480 rv = ipmi_request_supply_msgs(watchdog_user,
481 (struct ipmi_addr *) &addr,
485 &panic_halt_heartbeat_smi_msg,
486 &panic_halt_heartbeat_recv_msg,
489 atomic_add(2, &panic_done_count);
492 static struct ipmi_smi_msg panic_halt_smi_msg =
494 .done = panic_smi_free
496 static struct ipmi_recv_msg panic_halt_recv_msg =
498 .done = panic_recv_free
501 /* Special call, doesn't claim any locks. This is only to be called
502 at panic or halt time, in run-to-completion mode, when the caller
503 is the only CPU and the only thing that will be going is these IPMI
505 static void panic_halt_ipmi_set_timeout(void)
507 int send_heartbeat_now;
510 /* Wait for the messages to be free. */
511 while (atomic_read(&panic_done_count) != 0)
512 ipmi_poll_interface(watchdog_user);
513 rv = i_ipmi_set_timeout(&panic_halt_smi_msg,
514 &panic_halt_recv_msg,
515 &send_heartbeat_now);
517 atomic_add(2, &panic_done_count);
518 if (send_heartbeat_now)
519 panic_halt_ipmi_heartbeat();
521 printk(KERN_WARNING PFX
522 "Unable to extend the watchdog timeout.");
523 while (atomic_read(&panic_done_count) != 0)
524 ipmi_poll_interface(watchdog_user);
527 /* We use a semaphore to make sure that only one thing can send a
528 heartbeat at one time, because we only have one copy of the data.
529 The semaphore is claimed when the set_timeout is sent and freed
530 when both messages are free. */
531 static atomic_t heartbeat_tofree = ATOMIC_INIT(0);
532 static DEFINE_MUTEX(heartbeat_lock);
533 static DECLARE_COMPLETION(heartbeat_wait);
534 static void heartbeat_free_smi(struct ipmi_smi_msg *msg)
536 if (atomic_dec_and_test(&heartbeat_tofree))
537 complete(&heartbeat_wait);
539 static void heartbeat_free_recv(struct ipmi_recv_msg *msg)
541 if (atomic_dec_and_test(&heartbeat_tofree))
542 complete(&heartbeat_wait);
544 static struct ipmi_smi_msg heartbeat_smi_msg =
546 .done = heartbeat_free_smi
548 static struct ipmi_recv_msg heartbeat_recv_msg =
550 .done = heartbeat_free_recv
553 static int ipmi_heartbeat(void)
555 struct kernel_ipmi_msg msg;
557 struct ipmi_system_interface_addr addr;
559 if (ipmi_ignore_heartbeat) {
563 if (ipmi_start_timer_on_heartbeat) {
564 ipmi_start_timer_on_heartbeat = 0;
565 ipmi_watchdog_state = action_val;
566 return ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB);
567 } else if (pretimeout_since_last_heartbeat) {
568 /* A pretimeout occurred, make sure we set the timeout.
569 We don't want to set the action, though, we want to
570 leave that alone (thus it can't be combined with the
572 pretimeout_since_last_heartbeat = 0;
573 return ipmi_set_timeout(IPMI_SET_TIMEOUT_HB_IF_NECESSARY);
576 mutex_lock(&heartbeat_lock);
578 atomic_set(&heartbeat_tofree, 2);
580 /* Don't reset the timer if we have the timer turned off, that
581 re-enables the watchdog. */
582 if (ipmi_watchdog_state == WDOG_TIMEOUT_NONE) {
583 mutex_unlock(&heartbeat_lock);
587 addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
588 addr.channel = IPMI_BMC_CHANNEL;
592 msg.cmd = IPMI_WDOG_RESET_TIMER;
595 rv = ipmi_request_supply_msgs(watchdog_user,
596 (struct ipmi_addr *) &addr,
604 mutex_unlock(&heartbeat_lock);
605 printk(KERN_WARNING PFX "heartbeat failure: %d\n",
610 /* Wait for the heartbeat to be sent. */
611 wait_for_completion(&heartbeat_wait);
613 if (heartbeat_recv_msg.msg.data[0] != 0) {
614 /* Got an error in the heartbeat response. It was already
615 reported in ipmi_wdog_msg_handler, but we should return
620 mutex_unlock(&heartbeat_lock);
625 static struct watchdog_info ident =
627 .options = 0, /* WDIOF_SETTIMEOUT, */
628 .firmware_version = 1,
632 static int ipmi_ioctl(struct inode *inode, struct file *file,
633 unsigned int cmd, unsigned long arg)
635 void __user *argp = (void __user *)arg;
640 case WDIOC_GETSUPPORT:
641 i = copy_to_user(argp, &ident, sizeof(ident));
642 return i ? -EFAULT : 0;
644 case WDIOC_SETTIMEOUT:
645 i = copy_from_user(&val, argp, sizeof(int));
649 return ipmi_set_timeout(IPMI_SET_TIMEOUT_HB_IF_NECESSARY);
651 case WDIOC_GETTIMEOUT:
652 i = copy_to_user(argp, &timeout, sizeof(timeout));
657 case WDIOC_SET_PRETIMEOUT:
658 i = copy_from_user(&val, argp, sizeof(int));
662 return ipmi_set_timeout(IPMI_SET_TIMEOUT_HB_IF_NECESSARY);
664 case WDIOC_GET_PRETIMEOUT:
665 i = copy_to_user(argp, &pretimeout, sizeof(pretimeout));
670 case WDIOC_KEEPALIVE:
671 return ipmi_heartbeat();
673 case WDIOC_SETOPTIONS:
674 i = copy_from_user(&val, argp, sizeof(int));
677 if (val & WDIOS_DISABLECARD)
679 ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
680 ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB);
681 ipmi_start_timer_on_heartbeat = 0;
684 if (val & WDIOS_ENABLECARD)
686 ipmi_watchdog_state = action_val;
687 ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB);
691 case WDIOC_GETSTATUS:
693 i = copy_to_user(argp, &val, sizeof(val));
703 static ssize_t ipmi_write(struct file *file,
704 const char __user *buf,
714 /* In case it was set long ago */
717 for (i = 0; i != len; i++) {
720 if (get_user(c, buf + i))
726 rv = ipmi_heartbeat();
734 static ssize_t ipmi_read(struct file *file,
745 /* Reading returns if the pretimeout has gone off, and it only does
746 it once per pretimeout. */
747 spin_lock(&ipmi_read_lock);
749 if (file->f_flags & O_NONBLOCK) {
754 init_waitqueue_entry(&wait, current);
755 add_wait_queue(&read_q, &wait);
756 while (!data_to_read) {
757 set_current_state(TASK_INTERRUPTIBLE);
758 spin_unlock(&ipmi_read_lock);
760 spin_lock(&ipmi_read_lock);
762 remove_wait_queue(&read_q, &wait);
764 if (signal_pending(current)) {
772 spin_unlock(&ipmi_read_lock);
775 if (copy_to_user(buf, &data_to_read, 1))
784 static int ipmi_open(struct inode *ino, struct file *filep)
786 switch (iminor(ino)) {
788 if (test_and_set_bit(0, &ipmi_wdog_open))
791 /* Don't start the timer now, let it start on the
793 ipmi_start_timer_on_heartbeat = 1;
794 return nonseekable_open(ino, filep);
801 static unsigned int ipmi_poll(struct file *file, poll_table *wait)
803 unsigned int mask = 0;
805 poll_wait(file, &read_q, wait);
807 spin_lock(&ipmi_read_lock);
809 mask |= (POLLIN | POLLRDNORM);
810 spin_unlock(&ipmi_read_lock);
815 static int ipmi_fasync(int fd, struct file *file, int on)
819 result = fasync_helper(fd, file, on, &fasync_q);
824 static int ipmi_close(struct inode *ino, struct file *filep)
826 if (iminor(ino) == WATCHDOG_MINOR) {
827 if (expect_close == 42) {
828 ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
829 ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB);
832 "Unexpected close, not stopping watchdog!\n");
835 clear_bit(0, &ipmi_wdog_open);
838 ipmi_fasync (-1, filep, 0);
844 static const struct file_operations ipmi_wdog_fops = {
845 .owner = THIS_MODULE,
851 .release = ipmi_close,
852 .fasync = ipmi_fasync,
855 static struct miscdevice ipmi_wdog_miscdev = {
856 .minor = WATCHDOG_MINOR,
858 .fops = &ipmi_wdog_fops
861 static void ipmi_wdog_msg_handler(struct ipmi_recv_msg *msg,
864 if (msg->msg.data[0] != 0) {
865 printk(KERN_ERR PFX "response: Error %x on cmd %x\n",
870 ipmi_free_recv_msg(msg);
873 static void ipmi_wdog_pretimeout_handler(void *handler_data)
875 if (preaction_val != WDOG_PRETIMEOUT_NONE) {
876 if (preop_val == WDOG_PREOP_PANIC) {
877 if (atomic_inc_and_test(&preop_panic_excl))
878 panic("Watchdog pre-timeout");
879 } else if (preop_val == WDOG_PREOP_GIVE_DATA) {
880 spin_lock(&ipmi_read_lock);
882 wake_up_interruptible(&read_q);
883 kill_fasync(&fasync_q, SIGIO, POLL_IN);
885 spin_unlock(&ipmi_read_lock);
889 /* On some machines, the heartbeat will give
890 an error and not work unless we re-enable
891 the timer. So do so. */
892 pretimeout_since_last_heartbeat = 1;
895 static struct ipmi_user_hndl ipmi_hndlrs =
897 .ipmi_recv_hndl = ipmi_wdog_msg_handler,
898 .ipmi_watchdog_pretimeout = ipmi_wdog_pretimeout_handler
901 static void ipmi_register_watchdog(int ipmi_intf)
908 if ((ifnum_to_use >= 0) && (ifnum_to_use != ipmi_intf))
911 watchdog_ifnum = ipmi_intf;
913 rv = ipmi_create_user(ipmi_intf, &ipmi_hndlrs, NULL, &watchdog_user);
915 printk(KERN_CRIT PFX "Unable to register with ipmi\n");
919 ipmi_get_version(watchdog_user,
921 &ipmi_version_minor);
923 rv = misc_register(&ipmi_wdog_miscdev);
925 ipmi_destroy_user(watchdog_user);
926 watchdog_user = NULL;
927 printk(KERN_CRIT PFX "Unable to register misc device\n");
931 if ((start_now) && (rv == 0)) {
932 /* Run from startup, so start the timer now. */
933 start_now = 0; /* Disable this function after first startup. */
934 ipmi_watchdog_state = action_val;
935 ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB);
936 printk(KERN_INFO PFX "Starting now!\n");
940 static void ipmi_unregister_watchdog(int ipmi_intf)
947 if (watchdog_ifnum != ipmi_intf)
950 /* Make sure no one can call us any more. */
951 misc_deregister(&ipmi_wdog_miscdev);
953 /* Wait to make sure the message makes it out. The lower layer has
954 pointers to our buffers, we want to make sure they are done before
955 we release our memory. */
956 while (atomic_read(&set_timeout_tofree))
957 schedule_timeout_uninterruptible(1);
959 /* Disconnect from IPMI. */
960 rv = ipmi_destroy_user(watchdog_user);
962 printk(KERN_WARNING PFX "error unlinking from IPMI: %d\n",
965 watchdog_user = NULL;
971 #ifdef HAVE_NMI_HANDLER
973 ipmi_nmi(void *dev_id, int cpu, int handled)
975 /* If we are not expecting a timeout, ignore it. */
976 if (ipmi_watchdog_state == WDOG_TIMEOUT_NONE)
979 /* If no one else handled the NMI, we assume it was the IPMI
981 if ((!handled) && (preop_val == WDOG_PREOP_PANIC)) {
982 /* On some machines, the heartbeat will give
983 an error and not work unless we re-enable
984 the timer. So do so. */
985 pretimeout_since_last_heartbeat = 1;
986 if (atomic_inc_and_test(&preop_panic_excl))
987 panic(PFX "pre-timeout");
993 static struct nmi_handler ipmi_nmi_handler =
995 .link = LIST_HEAD_INIT(ipmi_nmi_handler.link),
996 .dev_name = "ipmi_watchdog",
999 .priority = 0, /* Call us last. */
1001 int nmi_handler_registered;
1004 static int wdog_reboot_handler(struct notifier_block *this,
1008 static int reboot_event_handled = 0;
1010 if ((watchdog_user) && (!reboot_event_handled)) {
1011 /* Make sure we only do this once. */
1012 reboot_event_handled = 1;
1014 if (code == SYS_POWER_OFF || code == SYS_HALT) {
1015 /* Disable the WDT if we are shutting down. */
1016 ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
1017 panic_halt_ipmi_set_timeout();
1018 } else if (ipmi_watchdog_state != WDOG_TIMEOUT_NONE) {
1019 /* Set a long timer to let the reboot happens, but
1020 reboot if it hangs, but only if the watchdog
1021 timer was already running. */
1024 ipmi_watchdog_state = WDOG_TIMEOUT_RESET;
1025 panic_halt_ipmi_set_timeout();
1031 static struct notifier_block wdog_reboot_notifier = {
1032 .notifier_call = wdog_reboot_handler,
1037 static int wdog_panic_handler(struct notifier_block *this,
1038 unsigned long event,
1041 static int panic_event_handled = 0;
1043 /* On a panic, if we have a panic timeout, make sure to extend
1044 the watchdog timer to a reasonable value to complete the
1045 panic, if the watchdog timer is running. Plus the
1046 pretimeout is meaningless at panic time. */
1047 if (watchdog_user && !panic_event_handled &&
1048 ipmi_watchdog_state != WDOG_TIMEOUT_NONE) {
1049 /* Make sure we do this only once. */
1050 panic_event_handled = 1;
1054 panic_halt_ipmi_set_timeout();
1060 static struct notifier_block wdog_panic_notifier = {
1061 .notifier_call = wdog_panic_handler,
1063 .priority = 150 /* priority: INT_MAX >= x >= 0 */
1067 static void ipmi_new_smi(int if_num, struct device *device)
1069 ipmi_register_watchdog(if_num);
1072 static void ipmi_smi_gone(int if_num)
1074 ipmi_unregister_watchdog(if_num);
1077 static struct ipmi_smi_watcher smi_watcher =
1079 .owner = THIS_MODULE,
1080 .new_smi = ipmi_new_smi,
1081 .smi_gone = ipmi_smi_gone
1084 static int action_op(const char *inval, char *outval)
1087 strcpy(outval, action);
1092 if (strcmp(inval, "reset") == 0)
1093 action_val = WDOG_TIMEOUT_RESET;
1094 else if (strcmp(inval, "none") == 0)
1095 action_val = WDOG_TIMEOUT_NONE;
1096 else if (strcmp(inval, "power_cycle") == 0)
1097 action_val = WDOG_TIMEOUT_POWER_CYCLE;
1098 else if (strcmp(inval, "power_off") == 0)
1099 action_val = WDOG_TIMEOUT_POWER_DOWN;
1102 strcpy(action, inval);
1106 static int preaction_op(const char *inval, char *outval)
1109 strcpy(outval, preaction);
1114 if (strcmp(inval, "pre_none") == 0)
1115 preaction_val = WDOG_PRETIMEOUT_NONE;
1116 else if (strcmp(inval, "pre_smi") == 0)
1117 preaction_val = WDOG_PRETIMEOUT_SMI;
1118 #ifdef HAVE_NMI_HANDLER
1119 else if (strcmp(inval, "pre_nmi") == 0)
1120 preaction_val = WDOG_PRETIMEOUT_NMI;
1122 else if (strcmp(inval, "pre_int") == 0)
1123 preaction_val = WDOG_PRETIMEOUT_MSG_INT;
1126 strcpy(preaction, inval);
1130 static int preop_op(const char *inval, char *outval)
1133 strcpy(outval, preop);
1138 if (strcmp(inval, "preop_none") == 0)
1139 preop_val = WDOG_PREOP_NONE;
1140 else if (strcmp(inval, "preop_panic") == 0)
1141 preop_val = WDOG_PREOP_PANIC;
1142 else if (strcmp(inval, "preop_give_data") == 0)
1143 preop_val = WDOG_PREOP_GIVE_DATA;
1146 strcpy(preop, inval);
1150 static void check_parms(void)
1152 #ifdef HAVE_NMI_HANDLER
1156 if (preaction_val == WDOG_PRETIMEOUT_NMI) {
1158 if (preop_val == WDOG_PREOP_GIVE_DATA) {
1159 printk(KERN_WARNING PFX "Pretimeout op is to give data"
1160 " but NMI pretimeout is enabled, setting"
1161 " pretimeout op to none\n");
1162 preop_op("preop_none", NULL);
1165 #ifdef CONFIG_X86_LOCAL_APIC
1166 if (nmi_watchdog == NMI_IO_APIC) {
1167 printk(KERN_WARNING PFX "nmi_watchdog is set to IO APIC"
1168 " mode (value is %d), that is incompatible"
1169 " with using NMI in the IPMI watchdog."
1170 " Disabling IPMI nmi pretimeout.\n",
1172 preaction_val = WDOG_PRETIMEOUT_NONE;
1177 if (do_nmi && !nmi_handler_registered) {
1178 rv = request_nmi(&ipmi_nmi_handler);
1180 printk(KERN_WARNING PFX
1181 "Can't register nmi handler\n");
1184 nmi_handler_registered = 1;
1185 } else if (!do_nmi && nmi_handler_registered) {
1186 release_nmi(&ipmi_nmi_handler);
1187 nmi_handler_registered = 0;
1192 static int __init ipmi_wdog_init(void)
1196 if (action_op(action, NULL)) {
1197 action_op("reset", NULL);
1198 printk(KERN_INFO PFX "Unknown action '%s', defaulting to"
1199 " reset\n", action);
1202 if (preaction_op(preaction, NULL)) {
1203 preaction_op("pre_none", NULL);
1204 printk(KERN_INFO PFX "Unknown preaction '%s', defaulting to"
1205 " none\n", preaction);
1208 if (preop_op(preop, NULL)) {
1209 preop_op("preop_none", NULL);
1210 printk(KERN_INFO PFX "Unknown preop '%s', defaulting to"
1216 register_reboot_notifier(&wdog_reboot_notifier);
1217 atomic_notifier_chain_register(&panic_notifier_list,
1218 &wdog_panic_notifier);
1220 rv = ipmi_smi_watcher_register(&smi_watcher);
1222 #ifdef HAVE_NMI_HANDLER
1223 if (preaction_val == WDOG_PRETIMEOUT_NMI)
1224 release_nmi(&ipmi_nmi_handler);
1226 atomic_notifier_chain_unregister(&panic_notifier_list,
1227 &wdog_panic_notifier);
1228 unregister_reboot_notifier(&wdog_reboot_notifier);
1229 printk(KERN_WARNING PFX "can't register smi watcher\n");
1233 printk(KERN_INFO PFX "driver initialized\n");
1238 static void __exit ipmi_wdog_exit(void)
1240 ipmi_smi_watcher_unregister(&smi_watcher);
1241 ipmi_unregister_watchdog(watchdog_ifnum);
1243 #ifdef HAVE_NMI_HANDLER
1244 if (nmi_handler_registered)
1245 release_nmi(&ipmi_nmi_handler);
1248 atomic_notifier_chain_unregister(&panic_notifier_list,
1249 &wdog_panic_notifier);
1250 unregister_reboot_notifier(&wdog_reboot_notifier);
1252 module_exit(ipmi_wdog_exit);
1253 module_init(ipmi_wdog_init);
1254 MODULE_LICENSE("GPL");
1255 MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>");
1256 MODULE_DESCRIPTION("watchdog timer based upon the IPMI interface.");