[RFC] winbond watchdog driver for FreeBSD/i386 and FreeBSD/amd64

Xin LI delphij at delphij.net
Tue Jun 28 22:32:42 UTC 2011


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Hi,

I'd like to request for comments on the attached driver, which supports
watchdogs on several Winbond super I/O chip models and have been tested
on a few of recent Supermicro motherboards.

Cheers,
- -- 
Xin LI <delphij at delphij.net>	https://www.delphij.net/
FreeBSD - The Power to Serve!		Live free or die
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.17 (FreeBSD)

iQEcBAEBCAAGBQJOClaJAAoJEATO+BI/yjfBhUkH/16ECciGDOCh2TxvKbnUmE5M
vNpZdhRjliEcMHh3YLGz9Zj/LOlZ97EjRYd2UBq5r5sf5cLhgUaKNoy7MblyHXy3
SPrkjY1IDlwLAVAeU9sJ5JjhPSh8xt/aDKnolXucutUqeZQlITQoesbJR2u7WEV7
Miyrm5/ypGObWhKz2v4dJGuHMl00uOrQpRaHurABkI8r+En9VlaJPHzcUEvpg4yq
qomlAxpIA1ojCzor2CRDjvKS3N77hdy9Fh8rfhoLHZUalzWgNVOLsigLw26DuAcR
bjBUgPKBFfVgeLuqJKQ3wHcGye48vujS4rlhdA4dtExhgoz0IkrmTpQcQysK71c=
=LVyb
-----END PGP SIGNATURE-----
-------------- next part --------------
From 343b2e7b6ed19e4b6ca2bf76c0ca6b8544dd4320 Mon Sep 17 00:00:00 2001
From: Xin LI <d at delphij.net>
Date: Mon, 27 Jun 2011 21:54:13 -0700
Subject: [PATCH] Driver for Winbond watchdog.

---
 share/man/man4/Makefile        |    3 +
 share/man/man4/winbondwd.4     |   88 ++++++++++
 sys/amd64/conf/NOTES           |    2 +
 sys/conf/files.amd64           |    1 +
 sys/conf/files.i386            |    1 +
 sys/dev/winbondwd/winbondwd.c  |  368 ++++++++++++++++++++++++++++++++++++++++
 sys/dev/winbondwd/winbondwd.h  |   47 +++++
 sys/i386/conf/NOTES            |    2 +
 sys/modules/Makefile           |    3 +
 sys/modules/winbondwd/Makefile |    8 +
 10 files changed, 523 insertions(+), 0 deletions(-)
 create mode 100644 share/man/man4/winbondwd.4
 create mode 100644 sys/dev/winbondwd/winbondwd.c
 create mode 100644 sys/dev/winbondwd/winbondwd.h
 create mode 100644 sys/modules/winbondwd/Makefile

diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile
index 7ccccfb..777e2fd 100644
--- a/share/man/man4/Makefile
+++ b/share/man/man4/Makefile
@@ -447,6 +447,7 @@ MAN=	aac.4 \
 	tun.4 \
 	twa.4 \
 	twe.4 \
+	tws.4 \
 	tx.4 \
 	txp.4 \
 	u3g.4 \
@@ -503,6 +504,7 @@ MAN=	aac.4 \
 	watchdog.4 \
 	wb.4 \
 	wi.4 \
+	${_winbondwd.4} \
 	witness.4 \
 	wlan.4 \
 	wlan_acl.4 \
@@ -706,6 +708,7 @@ _speaker.4=	speaker.4
 _spkr.4=	spkr.4
 _tpm.4=		tpm.4
 _urtw.4=	urtw.4
+_winbondwd.4=	winbondwd.4
 _wpi.4=		wpi.4
 _xen.4=		xen.4
 
diff --git a/share/man/man4/winbondwd.4 b/share/man/man4/winbondwd.4
new file mode 100644
index 0000000..6fd2719
--- /dev/null
+++ b/share/man/man4/winbondwd.4
@@ -0,0 +1,88 @@
+.\"-
+.\" Copyright (c) 2011 Xin LI <delphij at FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd July 1, 2011
+.Dt WINBONDWD 4
+.Os
+.Sh NAME
+.Nm winbondwd
+.Nd device driver for the Winbond Super I/O watchdog timer
+.Sh SYNOPSIS
+To compile this driver into the kernel,
+place the following line in your
+kernel configuration file:
+.Bd -ragged -offset indent
+.Cd "device winbondwd"
+.Ed
+.Pp
+Alternatively, to load the driver as a
+module at boot time, place the following line in
+.Xr loader.conf 5 :
+.Bd -literal -offset indent
+winbondwd_load="YES"
+.Ed
+.Sh DESCRIPTION
+The
+.Nm
+driver provides
+.Xr watchdog 4
+support for the watchdog interrupt timer present on
+all Winbond super I/O controllers.
+.Pp
+The Winbond super I/O controller have a built-in watchdog timer,
+which can be enabled and disabled by user's program and set between
+1 to 255 seconds or 1 to 255 minutes.
+Supported watchdog intervals range from 1 to 255 seconds.
+.Pp
+On some systems the watchdog timer is enabled and set to 5 minutes
+by BIOS on boot.
+The
+.Nm
+driver will detect and print out the existing setting, however, 
+it will not make any changes unless told by the userland through
+the
+.Xr watchdog 4
+interface,
+for instance by using the
+.Xr watchdogd 8
+daemon.
+.Sh SEE ALSO
+.Xr watchdog 4 ,
+.Xr watchdog 8 ,
+.Xr watchdogd 8 ,
+.Xr watchdog 9
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Fx 9.0 .
+.Sh AUTHORS
+.An -nosplit
+The
+.Nm
+driver and this manual page were written by
+.An Xin LI Aq delphij at FreeBSD.org .
diff --git a/sys/amd64/conf/NOTES b/sys/amd64/conf/NOTES
index 4a47ace..3b25aea 100644
--- a/sys/amd64/conf/NOTES
+++ b/sys/amd64/conf/NOTES
@@ -453,9 +453,11 @@ device		tpm
 #
 # ichwd: Intel ICH watchdog timer
 # amdsbwd: AMD SB7xx watchdog timer
+# winbondwd: Winbond watchdog timer
 #
 device		ichwd
 device		amdsbwd
+device		winbondwd
 
 #
 # Temperature sensors:
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 1388d01..18dbea6 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -223,6 +223,7 @@ dev/tpm/tpm.c			optional	tpm
 dev/tpm/tpm_acpi.c		optional	tpm acpi
 dev/tpm/tpm_isa.c		optional	tpm isa
 dev/uart/uart_cpu_amd64.c	optional	uart
+dev/winbondwd/winbondwd.c	optional	winbondwd
 dev/wpi/if_wpi.c		optional	wpi
 isa/syscons_isa.c		optional	sc
 isa/vga_isa.c			optional	vga
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 41a1772..112115d 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -238,6 +238,7 @@ dev/tpm/tpm_isa.c		optional tpm isa
 dev/uart/uart_cpu_i386.c	optional uart
 dev/acpica/acpi_if.m		standard
 dev/acpi_support/acpi_wmi_if.m	standard
+dev/winbondwd/winbondwd.c	optional winbondwd
 dev/wpi/if_wpi.c		optional wpi
 i386/acpica/acpi_machdep.c	optional acpi
 acpi_wakecode.o			optional acpi				\
diff --git a/sys/dev/winbondwd/winbondwd.c b/sys/dev/winbondwd/winbondwd.c
new file mode 100644
index 0000000..fa53735
--- /dev/null
+++ b/sys/dev/winbondwd/winbondwd.c
@@ -0,0 +1,368 @@
+/*-
+ * Copyright (c) 2010 iXsystems, Inc.
+ * All rights reserved.
+ *     Written by: Xin LI <delphij at FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Winbond Watchdog Timer (WDT) driver
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <machine/bus.h>
+#include <sys/rman.h>
+#include <machine/resource.h>
+#include <sys/watchdog.h>
+
+#include <isa/isavar.h>
+#include <dev/pci/pcivar.h>
+
+#include <dev/winbondwd/winbondwd.h>
+
+static devclass_t winbondwd_devclass;
+
+#define winbondwd_read_1(sc, off) \
+	    bus_space_read_1((sc)->wb_bst, (sc)->wb_bsh, (off))
+
+#define winbondwd_write_1(sc, off, val) \
+	    bus_space_write_1((sc)->wb_bst, (sc)->wb_bsh, (off), (val))
+
+/*
+ * Enter Winbond Extended Functions State
+ */
+static __inline void
+winbondwd_config_enter(struct winbondwd_softc *sc)
+{
+
+	winbondwd_write_1(sc, 0, 0x87);
+	winbondwd_write_1(sc, 0, 0x87);
+}
+
+/*
+ * Leave Winbond Extended Functions State
+ */
+static __inline void
+winbondwd_config_leave(struct winbondwd_softc *sc)
+{
+
+	winbondwd_write_1(sc, 0, 0xaa);
+}
+
+static __inline unsigned char
+winbondwd_read_reg(struct winbondwd_softc *sc, unsigned char reg)
+{
+
+	winbondwd_write_1(sc, 0, reg);
+	return (winbondwd_read_1(sc, 1));
+}
+
+/*
+ * Write specified extended function register
+ */
+static __inline void
+winbondwd_write_reg(struct winbondwd_softc *sc, unsigned char reg, unsigned char val)
+{
+
+	winbondwd_write_1(sc, 0, reg);
+	winbondwd_write_1(sc, 1, val);
+}
+
+/*
+ * Select the watchdog device (GPIO Port 2, Logical device 8)
+ */
+static void
+winbondwd_select(struct winbondwd_softc *sc)
+{
+
+	winbondwd_config_enter(sc);
+	winbondwd_write_reg(sc, /* LDN bit 7:1 */ 0x7, /* GPIO Port 2 */ 0x8);
+	winbondwd_write_reg(sc, /* CR30 */ 0x30, /* Activate */ 0x1);
+}
+
+/*
+ * Deselect the watchdog device (only a config_leave is needed)
+ */
+static void
+winbondwd_deselect(struct winbondwd_softc *sc)
+{
+
+	winbondwd_config_leave(sc);
+}
+
+/*
+ * Show timeout
+ */
+static void
+winbondwd_show_timeout(struct winbondwd_softc *sc)
+{
+	const char *mode_str;
+	unsigned char timeout, mode;
+
+	winbondwd_select(sc);
+	timeout = winbondwd_read_reg(sc, 0xf6 /* Timeout CR */);
+	if (timeout == 0) {
+		sc->active = 0;
+		if (bootverbose)
+			device_printf(sc->device,
+			    "Winbond watchdog not running\n");
+	} else {
+		sc->active = 1;
+		mode = winbondwd_read_reg(sc, 0xf5 /* Bit 3: count mode */);
+		mode_str = (mode & (1 << 2))? "minute" : "second";
+		device_printf(sc->device,
+		    "Winbond watchdog will timeout after %hhu %s%s\n",
+		    timeout, mode_str, ((timeout > 1)? "s" : ""));
+	}
+	winbondwd_deselect(sc);
+}
+
+/*
+ * Set timeout in seconds; 0 = disable
+ */
+static void
+winbondwd_set_timeout(struct winbondwd_softc *sc, unsigned char timeout)
+{
+	unsigned char mode;
+
+	/* Don't bother to disable if the watchdog is not running */
+	if (sc->active == 0 && timeout == 0)
+		return;
+
+	winbondwd_select(sc);
+	mode = winbondwd_read_reg(sc, 0xf5 /* Bit 3: count mode */);
+	mode &= ~(1 << 2);	/* Choose seconds mode */
+	winbondwd_write_reg(sc, 0xf5, mode);
+
+	winbondwd_write_reg(sc, 0xf6 /* Timeout CR */, timeout);
+	winbondwd_deselect(sc);
+
+	if (bootverbose) {
+		if (timeout == 0)
+			device_printf(sc->device,
+			    "Winbond watchdog disabled.\n");
+		else
+			device_printf(sc->device,
+			    "Winbond watchdog timeout after %hhu seconds.\n",
+			    timeout);
+	}
+
+	sc->active = (timeout == 0) ? 0 : 1;
+}
+
+/*
+ * Watchdog event handler - called by the framework to enable or disable
+ * the watchdog or change the initial timeout value.
+ */
+static void
+winbondwd_event(void *arg, unsigned int cmd, int *error)
+{
+	struct winbondwd_softc *sc = arg;
+	unsigned char rtimeout;
+	uint64_t timeout;
+
+	if (cmd == 0)
+		winbondwd_set_timeout(sc, 0);
+	else {
+		timeout = (uint64_t)1 << (cmd & WD_INTERVAL);
+		if (timeout < (uint64_t)0xff * 1000 * 1000 * 1000) {
+			rtimeout = timeout / (1000 * 1000 * 1000);
+			if (rtimeout == 0)
+				rtimeout = 0xff;
+			winbondwd_set_timeout(sc, rtimeout);
+		} else {
+			device_printf(sc->device,
+			    "Value %u too big, disabling\n", cmd & WD_INTERVAL);
+			/* Proposed timeout can not be satisified */
+			winbondwd_set_timeout(sc, 0);
+		}
+	}
+}
+
+/*
+ * A hack to probe Winbond chip's base port.
+ */
+static unsigned int
+winbondwd_baseport_probe(void)
+{
+	unsigned char val;
+	int i;
+	const unsigned int baseport_candidates[] = { 0x2e, 0x4e, 0 };
+
+	for (i = 0; baseport_candidates[i] != 0; i++) {
+		/*
+		 * Enter config mode.
+		 *
+		 * Output magic number twice to the index register
+		 */
+		outb(baseport_candidates[i], 0x87);
+		outb(baseport_candidates[i], 0x87);
+
+		/*
+		 * I know this is ugly but I didn't found a way to do
+		 * this in a cleaner manner.
+		 */
+		/* Get data from CR 0x20 (Device ID) */
+		outb(baseport_candidates[i], 0x20);
+		val = inb(baseport_candidates[i]+1);
+
+		if (bootverbose)
+			printf("winbondwd0: CR20 probing port 0x%x got 0x%x\n", baseport_candidates[i], val);
+
+		if (val != 0xff) {
+			outb(baseport_candidates[i], 0xaa);
+			return baseport_candidates[i];
+		}
+	}
+
+	return (unsigned int)(-1);
+}
+		
+	
+
+/*
+ * Look for Winbond device.
+ */
+static void
+winbondwd_identify(driver_t *driver, device_t parent)
+{
+	unsigned int baseport;
+	device_t dev;
+
+        if ((dev = device_find_child(parent, driver->name, 0)) == NULL) {
+		if (resource_int_value("winbondwd", 0, "baseport", &baseport) != 0) {
+			baseport = winbondwd_baseport_probe();
+			if (baseport == (unsigned int)(-1)) {
+				printf("winbondwd0: Compatible Winbond Super I/O not found.\n");
+				return;
+			}
+		}
+
+		dev = BUS_ADD_CHILD(parent, 0, driver->name, 0);
+
+		bus_set_resource(dev, SYS_RES_IOPORT, 0, baseport, 2);
+	}
+
+	if (dev == NULL)
+		return;
+}
+
+static int
+winbondwd_probe(device_t dev)
+{
+
+	/* Do not claim some ISA PnP device by accident. */
+	if (isa_get_logicalid(dev) != 0)
+		return (ENXIO);
+	return (0);
+}
+
+static int
+winbondwd_attach(device_t dev)
+{
+	struct winbondwd_softc *sc;
+	unsigned int baseport;
+
+	sc = device_get_softc(dev);
+	sc->device = dev;
+
+	if (resource_int_value("winbondwd", 0, "baseport", &baseport) != 0) {
+		baseport = winbondwd_baseport_probe();
+		if (baseport == (unsigned int)(-1)) {
+			device_printf(dev,
+			    "No compatible Winbond Super I/O found.\n");
+			return (ENXIO);
+		}
+	}
+
+	/* allocate I/O register space */
+	sc->wb_rid = 0;
+	sc->wb_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->wb_rid,
+	    baseport, baseport + 1, 2, RF_ACTIVE | RF_SHAREABLE);
+	if (sc->wb_res == NULL) {
+		device_printf(dev, "Unable to reserve Extended Function Registers\n");
+		goto fail;
+	}
+	sc->wb_bst = rman_get_bustag(sc->wb_res);
+	sc->wb_bsh = rman_get_bushandle(sc->wb_res);
+
+	/* Display the device status */
+	winbondwd_show_timeout(sc);
+
+	/* register the watchdog event handler */
+	sc->ev_tag = EVENTHANDLER_REGISTER(watchdog_list, winbondwd_event, sc, 0);
+
+	return (0);
+
+fail:
+	if (sc->wb_res != NULL)
+		bus_release_resource(dev, SYS_RES_IOPORT,
+		    sc->wb_rid, sc->wb_res);
+	return (ENXIO);
+}
+
+static int
+winbondwd_detach(device_t dev)
+{
+	struct winbondwd_softc *sc;
+
+	sc = device_get_softc(dev);
+
+	/* deregister event handler */
+	if (sc->ev_tag != NULL)
+		EVENTHANDLER_DEREGISTER(watchdog_list, sc->ev_tag);
+	sc->ev_tag = NULL;
+
+	/* Disable the watchdog */
+	if (sc->active)
+		winbondwd_set_timeout(sc, 0);
+
+	/* deallocate I/O register space */
+	bus_release_resource(dev, SYS_RES_IOPORT, sc->wb_rid, sc->wb_res);
+
+	return (0);
+}
+
+static device_method_t winbondwd_methods[] = {
+	DEVMETHOD(device_identify, winbondwd_identify),
+	DEVMETHOD(device_probe,	winbondwd_probe),
+	DEVMETHOD(device_attach, winbondwd_attach),
+	DEVMETHOD(device_detach, winbondwd_detach),
+	DEVMETHOD(device_shutdown, winbondwd_detach),
+	{0,0}
+};
+
+static driver_t winbondwd_driver = {
+	"winbondwd",
+	winbondwd_methods,
+	sizeof(struct winbondwd_softc),
+};
+
+DRIVER_MODULE(winbondwd, isa, winbondwd_driver, winbondwd_devclass, NULL, NULL);
diff --git a/sys/dev/winbondwd/winbondwd.h b/sys/dev/winbondwd/winbondwd.h
new file mode 100644
index 0000000..57a1a23
--- /dev/null
+++ b/sys/dev/winbondwd/winbondwd.h
@@ -0,0 +1,47 @@
+/*-
+ * Copyright (c) 2010 iXsystems, Inc.
+ * All rights reserved.
+ *     Written by: Xin LI <delphij at FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _WINBONDWD_H_
+#define _WINBONDWD_H_
+
+struct winbondwd_softc {
+	device_t		 device;
+
+	int			 active;
+	unsigned int		 timeout;
+
+	int			 wb_rid;
+	struct resource		*wb_res;
+	bus_space_tag_t		 wb_bst;
+	bus_space_handle_t	 wb_bsh;
+
+	eventhandler_tag	 ev_tag;
+};
+
+#endif /* _WINBONDWD_H_ */
diff --git a/sys/i386/conf/NOTES b/sys/i386/conf/NOTES
index 866e641..80d82a2 100644
--- a/sys/i386/conf/NOTES
+++ b/sys/i386/conf/NOTES
@@ -828,9 +828,11 @@ hint.pcf.0.irq="5"
 #
 # ichwd: Intel ICH watchdog timer
 # amdsbwd: AMD SB7xx watchdog timer
+# winbondwd: Winbond watchdog timer
 #
 device		ichwd
 device		amdsbwd
+device		winbondwd
 
 #
 # Temperature sensors:
diff --git a/sys/modules/Makefile b/sys/modules/Makefile
index 2dbc3d9..de533e4 100644
--- a/sys/modules/Makefile
+++ b/sys/modules/Makefile
@@ -320,6 +320,7 @@ SUBDIR=	${_3dfx} \
 	vx \
 	wb \
 	${_wi} \
+	${_winbondwd} \
 	wlan \
 	wlan_acl \
 	wlan_amrr \
@@ -469,6 +470,7 @@ _stg=		stg
 _streams=	streams
 _svr4=		svr4
 _wi=		wi
+_winbondwd=	winbondwd
 _xe=		xe
 .if ${MK_ZFS} != "no" || defined(ALL_MODULES)
 _zfs=		zfs
@@ -623,6 +625,7 @@ _twa=		twa
 _vesa=		vesa
 _x86bios=	x86bios
 _wi=		wi
+_winbondwd=	winbondwd
 _wpi=		wpi
 _wpifw=		wpifw
 .if ${MK_ZFS} != "no" || defined(ALL_MODULES)
diff --git a/sys/modules/winbondwd/Makefile b/sys/modules/winbondwd/Makefile
new file mode 100644
index 0000000..382d37f
--- /dev/null
+++ b/sys/modules/winbondwd/Makefile
@@ -0,0 +1,8 @@
+# $FreeBSD$
+
+.PATH: ${.CURDIR}/../../dev/winbondwd
+
+KMOD=	winbondwd
+SRCS=	winbondwd.c device_if.h bus_if.h pci_if.h isa_if.h
+
+.include <bsd.kmod.mk>
-- 
1.7.5.4


More information about the freebsd-current mailing list