diff options
author | Jordan Hargrave <jordan@cvs.openbsd.org> | 2005-11-28 22:11:08 +0000 |
---|---|---|
committer | Jordan Hargrave <jordan@cvs.openbsd.org> | 2005-11-28 22:11:08 +0000 |
commit | 3041c48ce5b0a123c17eab50976a3bdf76afce4c (patch) | |
tree | d9f83e34dddb2d9fd1a599c372faf8984134eaf9 /sys | |
parent | 55dc395e79bd4e950c8686622a2d46560a99cd70 (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.c | 61 | ||||
-rw-r--r-- | sys/arch/i386/i386/esmreg.h | 39 |
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; |