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/config.h>
35 #include <linux/module.h>
36 #include <linux/moduleparam.h>
37 #include <linux/ipmi.h>
38 #include <linux/ipmi_smi.h>
39 #include <linux/watchdog.h>
40 #include <linux/miscdevice.h>
41 #include <linux/init.h>
42 #include <linux/rwsem.h>
43 #include <linux/errno.h>
44 #include <asm/uaccess.h>
45 #include <linux/notifier.h>
46 #include <linux/nmi.h>
47 #include <linux/reboot.h>
48 #include <linux/wait.h>
49 #include <linux/poll.h>
50 #ifdef CONFIG_X86_LOCAL_APIC
54 #define PFX "IPMI Watchdog: "
57 * The IPMI command/response information for the watchdog timer.
60 /* values for byte 1 of the set command, byte 2 of the get response. */
61 #define WDOG_DONT_LOG (1 << 7)
62 #define WDOG_DONT_STOP_ON_SET (1 << 6)
63 #define WDOG_SET_TIMER_USE(byte, use) \
64 byte = ((byte) & 0xf8) | ((use) & 0x7)
65 #define WDOG_GET_TIMER_USE(byte) ((byte) & 0x7)
66 #define WDOG_TIMER_USE_BIOS_FRB2 1
67 #define WDOG_TIMER_USE_BIOS_POST 2
68 #define WDOG_TIMER_USE_OS_LOAD 3
69 #define WDOG_TIMER_USE_SMS_OS 4
70 #define WDOG_TIMER_USE_OEM 5
72 /* values for byte 2 of the set command, byte 3 of the get response. */
73 #define WDOG_SET_PRETIMEOUT_ACT(byte, use) \
74 byte = ((byte) & 0x8f) | (((use) & 0x7) << 4)
75 #define WDOG_GET_PRETIMEOUT_ACT(byte) (((byte) >> 4) & 0x7)
76 #define WDOG_PRETIMEOUT_NONE 0
77 #define WDOG_PRETIMEOUT_SMI 1
78 #define WDOG_PRETIMEOUT_NMI 2
79 #define WDOG_PRETIMEOUT_MSG_INT 3
81 /* Operations that can be performed on a pretimout. */
82 #define WDOG_PREOP_NONE 0
83 #define WDOG_PREOP_PANIC 1
84 #define WDOG_PREOP_GIVE_DATA 2 /* Cause data to be available to
85 read. Doesn't work in NMI
88 /* Actions to perform on a full timeout. */
89 #define WDOG_SET_TIMEOUT_ACT(byte, use) \
90 byte = ((byte) & 0xf8) | ((use) & 0x7)
91 #define WDOG_GET_TIMEOUT_ACT(byte) ((byte) & 0x7)
92 #define WDOG_TIMEOUT_NONE 0
93 #define WDOG_TIMEOUT_RESET 1
94 #define WDOG_TIMEOUT_POWER_DOWN 2
95 #define WDOG_TIMEOUT_POWER_CYCLE 3
97 /* Byte 3 of the get command, byte 4 of the get response is the
98 pre-timeout in seconds. */
100 /* Bits for setting byte 4 of the set command, byte 5 of the get response. */
101 #define WDOG_EXPIRE_CLEAR_BIOS_FRB2 (1 << 1)
102 #define WDOG_EXPIRE_CLEAR_BIOS_POST (1 << 2)
103 #define WDOG_EXPIRE_CLEAR_OS_LOAD (1 << 3)
104 #define WDOG_EXPIRE_CLEAR_SMS_OS (1 << 4)
105 #define WDOG_EXPIRE_CLEAR_OEM (1 << 5)
107 /* Setting/getting the watchdog timer value. This is for bytes 5 and
108 6 (the timeout time) of the set command, and bytes 6 and 7 (the
109 timeout time) and 8 and 9 (the current countdown value) of the
110 response. The timeout value is given in seconds (in the command it
111 is 100ms intervals). */
112 #define WDOG_SET_TIMEOUT(byte1, byte2, val) \
113 (byte1) = (((val) * 10) & 0xff), (byte2) = (((val) * 10) >> 8)
114 #define WDOG_GET_TIMEOUT(byte1, byte2) \
115 (((byte1) | ((byte2) << 8)) / 10)
117 #define IPMI_WDOG_RESET_TIMER 0x22
118 #define IPMI_WDOG_SET_TIMER 0x24
119 #define IPMI_WDOG_GET_TIMER 0x25
121 /* These are here until the real ones get into the watchdog.h interface. */
122 #ifndef WDIOC_GETTIMEOUT
123 #define WDIOC_GETTIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 20, int)
125 #ifndef WDIOC_SET_PRETIMEOUT
126 #define WDIOC_SET_PRETIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 21, int)
128 #ifndef WDIOC_GET_PRETIMEOUT
129 #define WDIOC_GET_PRETIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 22, int)
132 static int nowayout = WATCHDOG_NOWAYOUT;
134 static ipmi_user_t watchdog_user = NULL;
136 /* Default the timeout to 10 seconds. */
137 static int timeout = 10;
139 /* The pre-timeout is disabled by default. */
140 static int pretimeout = 0;
142 /* Default action is to reset the board on a timeout. */
143 static unsigned char action_val = WDOG_TIMEOUT_RESET;
145 static char action[16] = "reset";
147 static unsigned char preaction_val = WDOG_PRETIMEOUT_NONE;
149 static char preaction[16] = "pre_none";
151 static unsigned char preop_val = WDOG_PREOP_NONE;
153 static char preop[16] = "preop_none";
154 static DEFINE_SPINLOCK(ipmi_read_lock);
155 static char data_to_read = 0;
156 static DECLARE_WAIT_QUEUE_HEAD(read_q);
157 static struct fasync_struct *fasync_q = NULL;
158 static char pretimeout_since_last_heartbeat = 0;
159 static char expect_close;
161 /* If true, the driver will start running as soon as it is configured
163 static int start_now = 0;
165 module_param(timeout, int, 0);
166 MODULE_PARM_DESC(timeout, "Timeout value in seconds.");
167 module_param(pretimeout, int, 0);
168 MODULE_PARM_DESC(pretimeout, "Pretimeout value in seconds.");
169 module_param_string(action, action, sizeof(action), 0);
170 MODULE_PARM_DESC(action, "Timeout action. One of: "
171 "reset, none, power_cycle, power_off.");
172 module_param_string(preaction, preaction, sizeof(preaction), 0);
173 MODULE_PARM_DESC(preaction, "Pretimeout action. One of: "
174 "pre_none, pre_smi, pre_nmi, pre_int.");
175 module_param_string(preop, preop, sizeof(preop), 0);
176 MODULE_PARM_DESC(preop, "Pretimeout driver operation. One of: "
177 "preop_none, preop_panic, preop_give_data.");
178 module_param(start_now, int, 0);
179 MODULE_PARM_DESC(start_now, "Set to 1 to start the watchdog as"
180 "soon as the driver is loaded.");
181 module_param(nowayout, int, 0);
182 MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
184 /* Default state of the timer. */
185 static unsigned char ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
187 /* If shutting down via IPMI, we ignore the heartbeat. */
188 static int ipmi_ignore_heartbeat = 0;
190 /* Is someone using the watchdog? Only one user is allowed. */
191 static unsigned long ipmi_wdog_open = 0;
193 /* If set to 1, the heartbeat command will set the state to reset and
194 start the timer. The timer doesn't normally run when the driver is
195 first opened until the heartbeat is set the first time, this
196 variable is used to accomplish this. */
197 static int ipmi_start_timer_on_heartbeat = 0;
199 /* IPMI version of the BMC. */
200 static unsigned char ipmi_version_major;
201 static unsigned char ipmi_version_minor;
204 static int ipmi_heartbeat(void);
205 static void panic_halt_ipmi_heartbeat(void);
208 /* We use a semaphore to make sure that only one thing can send a set
209 timeout at one time, because we only have one copy of the data.
210 The semaphore is claimed when the set_timeout is sent and freed
211 when both messages are free. */
212 static atomic_t set_timeout_tofree = ATOMIC_INIT(0);
213 static DECLARE_MUTEX(set_timeout_lock);
214 static void set_timeout_free_smi(struct ipmi_smi_msg *msg)
216 if (atomic_dec_and_test(&set_timeout_tofree))
217 up(&set_timeout_lock);
219 static void set_timeout_free_recv(struct ipmi_recv_msg *msg)
221 if (atomic_dec_and_test(&set_timeout_tofree))
222 up(&set_timeout_lock);
224 static struct ipmi_smi_msg set_timeout_smi_msg =
226 .done = set_timeout_free_smi
228 static struct ipmi_recv_msg set_timeout_recv_msg =
230 .done = set_timeout_free_recv
233 static int i_ipmi_set_timeout(struct ipmi_smi_msg *smi_msg,
234 struct ipmi_recv_msg *recv_msg,
235 int *send_heartbeat_now)
237 struct kernel_ipmi_msg msg;
238 unsigned char data[6];
240 struct ipmi_system_interface_addr addr;
245 WDOG_SET_TIMER_USE(data[0], WDOG_TIMER_USE_SMS_OS);
247 if ((ipmi_version_major > 1)
248 || ((ipmi_version_major == 1) && (ipmi_version_minor >= 5)))
250 /* This is an IPMI 1.5-only feature. */
251 data[0] |= WDOG_DONT_STOP_ON_SET;
252 } else if (ipmi_watchdog_state != WDOG_TIMEOUT_NONE) {
253 /* In ipmi 1.0, setting the timer stops the watchdog, we
254 need to start it back up again. */
259 WDOG_SET_TIMEOUT_ACT(data[1], ipmi_watchdog_state);
260 if ((pretimeout > 0) && (ipmi_watchdog_state != WDOG_TIMEOUT_NONE)) {
261 WDOG_SET_PRETIMEOUT_ACT(data[1], preaction_val);
262 data[2] = pretimeout;
264 WDOG_SET_PRETIMEOUT_ACT(data[1], WDOG_PRETIMEOUT_NONE);
265 data[2] = 0; /* No pretimeout. */
268 WDOG_SET_TIMEOUT(data[4], data[5], timeout);
270 addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
271 addr.channel = IPMI_BMC_CHANNEL;
275 msg.cmd = IPMI_WDOG_SET_TIMER;
277 msg.data_len = sizeof(data);
278 rv = ipmi_request_supply_msgs(watchdog_user,
279 (struct ipmi_addr *) &addr,
287 printk(KERN_WARNING PFX "set timeout error: %d\n",
291 if (send_heartbeat_now)
292 *send_heartbeat_now = hbnow;
297 /* Parameters to ipmi_set_timeout */
298 #define IPMI_SET_TIMEOUT_NO_HB 0
299 #define IPMI_SET_TIMEOUT_HB_IF_NECESSARY 1
300 #define IPMI_SET_TIMEOUT_FORCE_HB 2
302 static int ipmi_set_timeout(int do_heartbeat)
304 int send_heartbeat_now;
308 /* We can only send one of these at a time. */
309 down(&set_timeout_lock);
311 atomic_set(&set_timeout_tofree, 2);
313 rv = i_ipmi_set_timeout(&set_timeout_smi_msg,
314 &set_timeout_recv_msg,
315 &send_heartbeat_now);
317 up(&set_timeout_lock);
319 if ((do_heartbeat == IPMI_SET_TIMEOUT_FORCE_HB)
320 || ((send_heartbeat_now)
321 && (do_heartbeat == IPMI_SET_TIMEOUT_HB_IF_NECESSARY)))
323 rv = ipmi_heartbeat();
330 static void dummy_smi_free(struct ipmi_smi_msg *msg)
333 static void dummy_recv_free(struct ipmi_recv_msg *msg)
336 static struct ipmi_smi_msg panic_halt_smi_msg =
338 .done = dummy_smi_free
340 static struct ipmi_recv_msg panic_halt_recv_msg =
342 .done = dummy_recv_free
345 /* Special call, doesn't claim any locks. This is only to be called
346 at panic or halt time, in run-to-completion mode, when the caller
347 is the only CPU and the only thing that will be going is these IPMI
349 static void panic_halt_ipmi_set_timeout(void)
351 int send_heartbeat_now;
354 rv = i_ipmi_set_timeout(&panic_halt_smi_msg,
355 &panic_halt_recv_msg,
356 &send_heartbeat_now);
358 if (send_heartbeat_now)
359 panic_halt_ipmi_heartbeat();
363 /* We use a semaphore to make sure that only one thing can send a
364 heartbeat at one time, because we only have one copy of the data.
365 The semaphore is claimed when the set_timeout is sent and freed
366 when both messages are free. */
367 static atomic_t heartbeat_tofree = ATOMIC_INIT(0);
368 static DECLARE_MUTEX(heartbeat_lock);
369 static DECLARE_MUTEX_LOCKED(heartbeat_wait_lock);
370 static void heartbeat_free_smi(struct ipmi_smi_msg *msg)
372 if (atomic_dec_and_test(&heartbeat_tofree))
373 up(&heartbeat_wait_lock);
375 static void heartbeat_free_recv(struct ipmi_recv_msg *msg)
377 if (atomic_dec_and_test(&heartbeat_tofree))
378 up(&heartbeat_wait_lock);
380 static struct ipmi_smi_msg heartbeat_smi_msg =
382 .done = heartbeat_free_smi
384 static struct ipmi_recv_msg heartbeat_recv_msg =
386 .done = heartbeat_free_recv
389 static struct ipmi_smi_msg panic_halt_heartbeat_smi_msg =
391 .done = dummy_smi_free
393 static struct ipmi_recv_msg panic_halt_heartbeat_recv_msg =
395 .done = dummy_recv_free
398 static int ipmi_heartbeat(void)
400 struct kernel_ipmi_msg msg;
402 struct ipmi_system_interface_addr addr;
404 if (ipmi_ignore_heartbeat) {
408 if (ipmi_start_timer_on_heartbeat) {
409 ipmi_start_timer_on_heartbeat = 0;
410 ipmi_watchdog_state = action_val;
411 return ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB);
412 } else if (pretimeout_since_last_heartbeat) {
413 /* A pretimeout occurred, make sure we set the timeout.
414 We don't want to set the action, though, we want to
415 leave that alone (thus it can't be combined with the
417 pretimeout_since_last_heartbeat = 0;
418 return ipmi_set_timeout(IPMI_SET_TIMEOUT_HB_IF_NECESSARY);
421 down(&heartbeat_lock);
423 atomic_set(&heartbeat_tofree, 2);
425 /* Don't reset the timer if we have the timer turned off, that
426 re-enables the watchdog. */
427 if (ipmi_watchdog_state == WDOG_TIMEOUT_NONE) {
432 addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
433 addr.channel = IPMI_BMC_CHANNEL;
437 msg.cmd = IPMI_WDOG_RESET_TIMER;
440 rv = ipmi_request_supply_msgs(watchdog_user,
441 (struct ipmi_addr *) &addr,
450 printk(KERN_WARNING PFX "heartbeat failure: %d\n",
455 /* Wait for the heartbeat to be sent. */
456 down(&heartbeat_wait_lock);
458 if (heartbeat_recv_msg.msg.data[0] != 0) {
459 /* Got an error in the heartbeat response. It was already
460 reported in ipmi_wdog_msg_handler, but we should return
470 static void panic_halt_ipmi_heartbeat(void)
472 struct kernel_ipmi_msg msg;
473 struct ipmi_system_interface_addr addr;
476 /* Don't reset the timer if we have the timer turned off, that
477 re-enables the watchdog. */
478 if (ipmi_watchdog_state == WDOG_TIMEOUT_NONE)
481 addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
482 addr.channel = IPMI_BMC_CHANNEL;
486 msg.cmd = IPMI_WDOG_RESET_TIMER;
489 ipmi_request_supply_msgs(watchdog_user,
490 (struct ipmi_addr *) &addr,
494 &panic_halt_heartbeat_smi_msg,
495 &panic_halt_heartbeat_recv_msg,
499 static struct watchdog_info ident=
501 .options = 0, /* WDIOF_SETTIMEOUT, */
502 .firmware_version = 1,
506 static int ipmi_ioctl(struct inode *inode, struct file *file,
507 unsigned int cmd, unsigned long arg)
509 void __user *argp = (void __user *)arg;
514 case WDIOC_GETSUPPORT:
515 i = copy_to_user(argp, &ident, sizeof(ident));
516 return i ? -EFAULT : 0;
518 case WDIOC_SETTIMEOUT:
519 i = copy_from_user(&val, argp, sizeof(int));
523 return ipmi_set_timeout(IPMI_SET_TIMEOUT_HB_IF_NECESSARY);
525 case WDIOC_GETTIMEOUT:
526 i = copy_to_user(argp, &timeout, sizeof(timeout));
531 case WDIOC_SET_PRETIMEOUT:
532 i = copy_from_user(&val, argp, sizeof(int));
536 return ipmi_set_timeout(IPMI_SET_TIMEOUT_HB_IF_NECESSARY);
538 case WDIOC_GET_PRETIMEOUT:
539 i = copy_to_user(argp, &pretimeout, sizeof(pretimeout));
544 case WDIOC_KEEPALIVE:
545 return ipmi_heartbeat();
547 case WDIOC_SETOPTIONS:
548 i = copy_from_user(&val, argp, sizeof(int));
551 if (val & WDIOS_DISABLECARD)
553 ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
554 ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB);
555 ipmi_start_timer_on_heartbeat = 0;
558 if (val & WDIOS_ENABLECARD)
560 ipmi_watchdog_state = action_val;
561 ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB);
565 case WDIOC_GETSTATUS:
567 i = copy_to_user(argp, &val, sizeof(val));
577 static ssize_t ipmi_write(struct file *file,
578 const char __user *buf,
588 /* In case it was set long ago */
591 for (i = 0; i != len; i++) {
594 if (get_user(c, buf + i))
600 rv = ipmi_heartbeat();
608 static ssize_t ipmi_read(struct file *file,
619 /* Reading returns if the pretimeout has gone off, and it only does
620 it once per pretimeout. */
621 spin_lock(&ipmi_read_lock);
623 if (file->f_flags & O_NONBLOCK) {
628 init_waitqueue_entry(&wait, current);
629 add_wait_queue(&read_q, &wait);
630 while (!data_to_read) {
631 set_current_state(TASK_INTERRUPTIBLE);
632 spin_unlock(&ipmi_read_lock);
634 spin_lock(&ipmi_read_lock);
636 remove_wait_queue(&read_q, &wait);
638 if (signal_pending(current)) {
646 spin_unlock(&ipmi_read_lock);
649 if (copy_to_user(buf, &data_to_read, 1))
658 static int ipmi_open(struct inode *ino, struct file *filep)
660 switch (iminor(ino)) {
662 if (test_and_set_bit(0, &ipmi_wdog_open))
665 /* Don't start the timer now, let it start on the
667 ipmi_start_timer_on_heartbeat = 1;
668 return nonseekable_open(ino, filep);
675 static unsigned int ipmi_poll(struct file *file, poll_table *wait)
677 unsigned int mask = 0;
679 poll_wait(file, &read_q, wait);
681 spin_lock(&ipmi_read_lock);
683 mask |= (POLLIN | POLLRDNORM);
684 spin_unlock(&ipmi_read_lock);
689 static int ipmi_fasync(int fd, struct file *file, int on)
693 result = fasync_helper(fd, file, on, &fasync_q);
698 static int ipmi_close(struct inode *ino, struct file *filep)
700 if (iminor(ino)==WATCHDOG_MINOR)
702 if (expect_close == 42) {
703 ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
704 ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB);
706 printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n");
709 clear_bit(0, &ipmi_wdog_open);
712 ipmi_fasync (-1, filep, 0);
718 static struct file_operations ipmi_wdog_fops = {
719 .owner = THIS_MODULE,
725 .release = ipmi_close,
726 .fasync = ipmi_fasync,
729 static struct miscdevice ipmi_wdog_miscdev = {
730 .minor = WATCHDOG_MINOR,
732 .fops = &ipmi_wdog_fops
735 static DECLARE_RWSEM(register_sem);
737 static void ipmi_wdog_msg_handler(struct ipmi_recv_msg *msg,
740 if (msg->msg.data[0] != 0) {
741 printk(KERN_ERR PFX "response: Error %x on cmd %x\n",
746 ipmi_free_recv_msg(msg);
749 static void ipmi_wdog_pretimeout_handler(void *handler_data)
751 if (preaction_val != WDOG_PRETIMEOUT_NONE) {
752 if (preop_val == WDOG_PREOP_PANIC)
753 panic("Watchdog pre-timeout");
754 else if (preop_val == WDOG_PREOP_GIVE_DATA) {
755 spin_lock(&ipmi_read_lock);
757 wake_up_interruptible(&read_q);
758 kill_fasync(&fasync_q, SIGIO, POLL_IN);
760 spin_unlock(&ipmi_read_lock);
764 /* On some machines, the heartbeat will give
765 an error and not work unless we re-enable
766 the timer. So do so. */
767 pretimeout_since_last_heartbeat = 1;
770 static struct ipmi_user_hndl ipmi_hndlrs =
772 .ipmi_recv_hndl = ipmi_wdog_msg_handler,
773 .ipmi_watchdog_pretimeout = ipmi_wdog_pretimeout_handler
776 static void ipmi_register_watchdog(int ipmi_intf)
780 down_write(®ister_sem);
784 rv = ipmi_create_user(ipmi_intf, &ipmi_hndlrs, NULL, &watchdog_user);
786 printk(KERN_CRIT PFX "Unable to register with ipmi\n");
790 ipmi_get_version(watchdog_user,
792 &ipmi_version_minor);
794 rv = misc_register(&ipmi_wdog_miscdev);
796 ipmi_destroy_user(watchdog_user);
797 watchdog_user = NULL;
798 printk(KERN_CRIT PFX "Unable to register misc device\n");
802 up_write(®ister_sem);
804 if ((start_now) && (rv == 0)) {
805 /* Run from startup, so start the timer now. */
806 start_now = 0; /* Disable this function after first startup. */
807 ipmi_watchdog_state = action_val;
808 ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB);
809 printk(KERN_INFO PFX "Starting now!\n");
813 #ifdef HAVE_NMI_HANDLER
815 ipmi_nmi(void *dev_id, struct pt_regs *regs, int cpu, int handled)
817 /* If we are not expecting a timeout, ignore it. */
818 if (ipmi_watchdog_state == WDOG_TIMEOUT_NONE)
821 /* If no one else handled the NMI, we assume it was the IPMI
823 if ((!handled) && (preop_val == WDOG_PREOP_PANIC)) {
824 /* On some machines, the heartbeat will give
825 an error and not work unless we re-enable
826 the timer. So do so. */
827 pretimeout_since_last_heartbeat = 1;
828 panic(PFX "pre-timeout");
834 static struct nmi_handler ipmi_nmi_handler =
836 .link = LIST_HEAD_INIT(ipmi_nmi_handler.link),
837 .dev_name = "ipmi_watchdog",
840 .priority = 0, /* Call us last. */
844 static int wdog_reboot_handler(struct notifier_block *this,
848 static int reboot_event_handled = 0;
850 if ((watchdog_user) && (!reboot_event_handled)) {
851 /* Make sure we only do this once. */
852 reboot_event_handled = 1;
854 if (code == SYS_DOWN || code == SYS_HALT) {
855 /* Disable the WDT if we are shutting down. */
856 ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
857 panic_halt_ipmi_set_timeout();
859 /* Set a long timer to let the reboot happens, but
860 reboot if it hangs. */
863 ipmi_watchdog_state = WDOG_TIMEOUT_RESET;
864 panic_halt_ipmi_set_timeout();
870 static struct notifier_block wdog_reboot_notifier = {
871 .notifier_call = wdog_reboot_handler,
876 static int wdog_panic_handler(struct notifier_block *this,
880 static int panic_event_handled = 0;
882 /* On a panic, if we have a panic timeout, make sure that the thing
883 reboots, even if it hangs during that panic. */
884 if (watchdog_user && !panic_event_handled) {
885 /* Make sure the panic doesn't hang, and make sure we
886 do this only once. */
887 panic_event_handled = 1;
891 ipmi_watchdog_state = WDOG_TIMEOUT_RESET;
892 panic_halt_ipmi_set_timeout();
898 static struct notifier_block wdog_panic_notifier = {
899 .notifier_call = wdog_panic_handler,
901 .priority = 150 /* priority: INT_MAX >= x >= 0 */
905 static void ipmi_new_smi(int if_num)
907 ipmi_register_watchdog(if_num);
910 static void ipmi_smi_gone(int if_num)
912 /* This can never be called, because once the watchdog is
913 registered, the interface can't go away until the watchdog
917 static struct ipmi_smi_watcher smi_watcher =
919 .owner = THIS_MODULE,
920 .new_smi = ipmi_new_smi,
921 .smi_gone = ipmi_smi_gone
924 static int __init ipmi_wdog_init(void)
928 if (strcmp(action, "reset") == 0) {
929 action_val = WDOG_TIMEOUT_RESET;
930 } else if (strcmp(action, "none") == 0) {
931 action_val = WDOG_TIMEOUT_NONE;
932 } else if (strcmp(action, "power_cycle") == 0) {
933 action_val = WDOG_TIMEOUT_POWER_CYCLE;
934 } else if (strcmp(action, "power_off") == 0) {
935 action_val = WDOG_TIMEOUT_POWER_DOWN;
937 action_val = WDOG_TIMEOUT_RESET;
938 printk(KERN_INFO PFX "Unknown action '%s', defaulting to"
942 if (strcmp(preaction, "pre_none") == 0) {
943 preaction_val = WDOG_PRETIMEOUT_NONE;
944 } else if (strcmp(preaction, "pre_smi") == 0) {
945 preaction_val = WDOG_PRETIMEOUT_SMI;
946 #ifdef HAVE_NMI_HANDLER
947 } else if (strcmp(preaction, "pre_nmi") == 0) {
948 preaction_val = WDOG_PRETIMEOUT_NMI;
950 } else if (strcmp(preaction, "pre_int") == 0) {
951 preaction_val = WDOG_PRETIMEOUT_MSG_INT;
953 preaction_val = WDOG_PRETIMEOUT_NONE;
954 printk(KERN_INFO PFX "Unknown preaction '%s', defaulting to"
955 " none\n", preaction);
958 if (strcmp(preop, "preop_none") == 0) {
959 preop_val = WDOG_PREOP_NONE;
960 } else if (strcmp(preop, "preop_panic") == 0) {
961 preop_val = WDOG_PREOP_PANIC;
962 } else if (strcmp(preop, "preop_give_data") == 0) {
963 preop_val = WDOG_PREOP_GIVE_DATA;
965 preop_val = WDOG_PREOP_NONE;
966 printk(KERN_INFO PFX "Unknown preop '%s', defaulting to"
970 #ifdef HAVE_NMI_HANDLER
971 if (preaction_val == WDOG_PRETIMEOUT_NMI) {
972 if (preop_val == WDOG_PREOP_GIVE_DATA) {
973 printk(KERN_WARNING PFX "Pretimeout op is to give data"
974 " but NMI pretimeout is enabled, setting"
975 " pretimeout op to none\n");
976 preop_val = WDOG_PREOP_NONE;
978 #ifdef CONFIG_X86_LOCAL_APIC
979 if (nmi_watchdog == NMI_IO_APIC) {
980 printk(KERN_WARNING PFX "nmi_watchdog is set to IO APIC"
981 " mode (value is %d), that is incompatible"
982 " with using NMI in the IPMI watchdog."
983 " Disabling IPMI nmi pretimeout.\n",
985 preaction_val = WDOG_PRETIMEOUT_NONE;
988 rv = request_nmi(&ipmi_nmi_handler);
990 printk(KERN_WARNING PFX "Can't register nmi handler\n");
993 #ifdef CONFIG_X86_LOCAL_APIC
999 rv = ipmi_smi_watcher_register(&smi_watcher);
1001 #ifdef HAVE_NMI_HANDLER
1002 if (preaction_val == WDOG_PRETIMEOUT_NMI)
1003 release_nmi(&ipmi_nmi_handler);
1005 printk(KERN_WARNING PFX "can't register smi watcher\n");
1009 register_reboot_notifier(&wdog_reboot_notifier);
1010 notifier_chain_register(&panic_notifier_list, &wdog_panic_notifier);
1012 printk(KERN_INFO PFX "driver initialized\n");
1017 static __exit void ipmi_unregister_watchdog(void)
1021 down_write(®ister_sem);
1023 #ifdef HAVE_NMI_HANDLER
1024 if (preaction_val == WDOG_PRETIMEOUT_NMI)
1025 release_nmi(&ipmi_nmi_handler);
1028 notifier_chain_unregister(&panic_notifier_list, &wdog_panic_notifier);
1029 unregister_reboot_notifier(&wdog_reboot_notifier);
1031 if (! watchdog_user)
1034 /* Make sure no one can call us any more. */
1035 misc_deregister(&ipmi_wdog_miscdev);
1037 /* Wait to make sure the message makes it out. The lower layer has
1038 pointers to our buffers, we want to make sure they are done before
1039 we release our memory. */
1040 while (atomic_read(&set_timeout_tofree))
1041 schedule_timeout_uninterruptible(1);
1043 /* Disconnect from IPMI. */
1044 rv = ipmi_destroy_user(watchdog_user);
1046 printk(KERN_WARNING PFX "error unlinking from IPMI: %d\n",
1049 watchdog_user = NULL;
1052 up_write(®ister_sem);
1055 static void __exit ipmi_wdog_exit(void)
1057 ipmi_smi_watcher_unregister(&smi_watcher);
1058 ipmi_unregister_watchdog();
1060 module_exit(ipmi_wdog_exit);
1061 module_init(ipmi_wdog_init);
1062 MODULE_LICENSE("GPL");
1063 MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>");
1064 MODULE_DESCRIPTION("watchdog timer based upon the IPMI interface.");