summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJordan Hargrave <jordan@cvs.openbsd.org>2005-11-28 22:11:08 +0000
committerJordan Hargrave <jordan@cvs.openbsd.org>2005-11-28 22:11:08 +0000
commit3041c48ce5b0a123c17eab50976a3bdf76afce4c (patch)
treed9f83e34dddb2d9fd1a599c372faf8984134eaf9 /sys
parent55dc395e79bd4e950c8686622a2d46560a99cd70 (diff)
Added dlg@ watchdog code for enabling ESM2 watchdog timer
Fixes for watchdog code by jordan@ Spacing fixes in esmreg ok marco@
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/i386/i386/esm.c61
-rw-r--r--sys/arch/i386/i386/esmreg.h39
2 files changed, 82 insertions, 18 deletions
diff --git a/sys/arch/i386/i386/esm.c b/sys/arch/i386/i386/esm.c
index e8a6dba2dd7..9a0562c4af6 100644
--- a/sys/arch/i386/i386/esm.c
+++ b/sys/arch/i386/i386/esm.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: esm.c,v 1.18 2005/11/28 20:37:16 jordan Exp $ */
+/* $OpenBSD: esm.c,v 1.19 2005/11/28 22:11:07 jordan Exp $ */
/*
* Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org>
@@ -28,6 +28,7 @@
#include <dev/isa/isareg.h>
#include <machine/bus.h>
+#include <machine/intr.h>
#include <arch/i386/i386/esmvar.h>
#include <arch/i386/i386/esmreg.h>
@@ -94,6 +95,8 @@ struct esm_softc {
struct esm_sensor *sc_nextsensor;
int sc_retries;
struct timeout sc_timeout;
+
+ int sc_wdog_period;
};
struct cfattach esm_ca = {
@@ -113,6 +116,8 @@ struct cfdriver esm_cd = {
#define EDATARD(s) EREAD((s), ESM2_DATA_REG)
#define EDATAWR(s, v) EWRITE((s), ESM2_DATA_REG, (v))
+int esm_watchdog(void *, int);
+
void esm_refresh(void *);
int esm_get_devmap(struct esm_softc *, int, struct esm_devmap *);
@@ -221,7 +226,9 @@ esm_attach(struct device *parent, struct device *self, void *aux)
return;
}
- printf(": Watchdog shizz goes here\n");
+ sc->sc_wdog_period = 0;
+ wdog_register(sc, esm_watchdog);
+ printf(": Hardware Watchdog\n");
for (i = 0; i <= 0xff; i++) {
if (esm_get_devmap(sc, i, &devmap) != 0)
@@ -238,6 +245,56 @@ esm_attach(struct device *parent, struct device *self, void *aux)
}
}
+
+int
+esm_watchdog(void *arg, int period)
+{
+ struct esm_softc *sc = arg;
+ struct esm_wdog_prop prop;
+ struct esm_wdog_state state;
+ int s;
+
+ if (sc->sc_wdog_period == period) {
+ if (period != 0) {
+ s = splsoftclock();
+ /* tickle the watchdog */
+ EWRITE(sc, ESM2_CTRL_REG, ESM2_TC_HBDB);
+ splx(s);
+ }
+ return (period);
+ }
+
+ memset(&prop, 0, sizeof(prop));
+ memset(&state, 0, sizeof(state));
+
+ if (period < 10 && period > 0)
+ period = 10;
+
+ s = splsoftclock();
+
+ prop.cmd = ESM2_CMD_HWDC;
+ prop.subcmd = ESM2_HWDC_WRITE_PROPERTY;
+ prop.action = (period == 0) ? ESM_WDOG_DISABLE : ESM_WDOG_RESET;
+ prop.time = period;
+
+ if (esm_cmd(sc, &prop, sizeof(prop), NULL, 0, 1) != 0) {
+ splx(s);
+ return (0);
+ }
+
+ state.cmd = ESM2_CMD_HWDC;
+ state.subcmd = ESM2_HWDC_WRITE_STATE;
+ state.state = (period == 0) ? 0 : 1;
+
+ /* we have the hw, this can't (shouldn't) fail */
+ esm_cmd(sc, &state, sizeof(state), NULL, 0, 1);
+
+ splx(s);
+
+ sc->sc_wdog_period = period;
+ return (period);
+}
+
void
esm_refresh(void *arg)
{
diff --git a/sys/arch/i386/i386/esmreg.h b/sys/arch/i386/i386/esmreg.h
index 0712a549763..ffd8f2c02ce 100644
--- a/sys/arch/i386/i386/esmreg.h
+++ b/sys/arch/i386/i386/esmreg.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: esmreg.h,v 1.6 2005/11/28 20:27:43 jordan Exp $ */
+/* $OpenBSD: esmreg.h,v 1.7 2005/11/28 22:11:07 jordan Exp $ */
/*
* Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org>
@@ -42,27 +42,28 @@
#define ESM2_TIM_NMI2SMI (1L << 4)
#define ESM2_TIM_POWER_UP_BITS (ESM2_TIM_HIRQ_PEND)
-#define ESM2_CMD_NOOP 0x00
-#define ESM2_CMD_ECHO 0x01
-#define ESM2_CMD_DEVICEMAP 0x03
-#define ESM2_DEVICEMAP_READ 0
+#define ESM2_CMD_NOOP 0x00
+#define ESM2_CMD_ECHO 0x01
+#define ESM2_CMD_DEVICEMAP 0x03
+#define ESM2_DEVICEMAP_READ 0x00
-#define ESM2_CMD_SMB_BUF 0x20
-#define ESM2_CMD_SMB_BUF_XMIT_RECV 0x21
-#define ESM2_CMD_SMB_XMIT_RECV 0x22
-#define ESM2_SMB_SENSOR_VALUE 0x04
-#define ESM2_SMB_SENSOR_THRESHOLDS 0x19
+#define ESM2_CMD_HWDC 0x05 /* Host Watch Dog Control */
+#define ESM2_HWDC_WRITE_STATE 0x01
+#define ESM2_HWDC_READ_PROPERTY 0x02
+#define ESM2_HWDC_WRITE_PROPERTY 0x03
-#define ESM2_CMD_HWDC 0x05 /* Host Watch Dog Control */
-#define ESM2_HWDC_WRITE_STATE 0x01
-#define ESM2_HWDC_READ_PROPERTY 0x02
-#define ESM2_HWDC_WRITE_PROPERTY 0x03
+#define ESM2_CMD_SMB_BUF 0x20
+#define ESM2_CMD_SMB_BUF_XMIT_RECV 0x21
+#define ESM2_CMD_SMB_XMIT_RECV 0x22
+#define ESM2_SMB_SENSOR_VALUE 0x04
+#define ESM2_SMB_SENSOR_THRESHOLDS 0x19
#define ESM2_MAX_CMD_LEN 0x20
#define ESM2_UUID_LEN 0x08
#define DELL_SYSSTR_ADDR 0xFE076L
#define DELL_SYSID_ADDR 0xFE840L
+
#define DELL_SYSID_2300 0x81
#define DELL_SYSID_4300 0x7C
#define DELL_SYSID_4350 0x84
@@ -88,7 +89,7 @@ struct dell_sysid {
u_int8_t sys_id;
} __packed;
-struct esm_watchdog_prop {
+struct esm_wdog_prop {
u_int8_t cmd;
u_int8_t reserved;
u_int8_t subcmd;
@@ -96,7 +97,13 @@ struct esm_watchdog_prop {
u_int32_t time;
} __packed;
-struct esm_watchdog_state {
+#define ESM_WDOG_DISABLE 0x00
+#define ESM_WDOG_PWROFF (1L << 1)
+#define ESM_WDOG_PWRCYCLE (1L << 2)
+#define ESM_WDOG_RESET (1L << 3)
+#define ESM_WDOG_NOTIFY (1L << 4)
+
+struct esm_wdog_state {
u_int8_t cmd;
u_int8_t reserved;
u_int8_t subcmd;