summaryrefslogtreecommitdiff
path: root/sys/arch/sgi
diff options
context:
space:
mode:
authorJasper Lievisse Adriaanse <jasper@cvs.openbsd.org>2007-12-18 08:29:03 +0000
committerJasper Lievisse Adriaanse <jasper@cvs.openbsd.org>2007-12-18 08:29:03 +0000
commite08e626c1e0d6bd9408366747ec127b22bc76ef4 (patch)
treea66faefe5e2af39123dd45be7d1f54b5321aa7b4 /sys/arch/sgi
parent163e5cb01d451ff0ae1cd7e8d2d7ee8599d92891 (diff)
add power(4), a driver for the power button found on SGI O2's.
when machdep.kbdreset is set, and the correct interrupt is fired, the machine gets shut down. with help from and ok jsing@, ok miod@
Diffstat (limited to 'sys/arch/sgi')
-rw-r--r--sys/arch/sgi/conf/GENERIC3
-rw-r--r--sys/arch/sgi/conf/files.sgi7
-rw-r--r--sys/arch/sgi/dev/power.c142
-rw-r--r--sys/arch/sgi/sgi/machdep.c7
4 files changed, 156 insertions, 3 deletions
diff --git a/sys/arch/sgi/conf/GENERIC b/sys/arch/sgi/conf/GENERIC
index 163cae86788..7b2184935a7 100644
--- a/sys/arch/sgi/conf/GENERIC
+++ b/sys/arch/sgi/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.23 2007/11/27 15:31:00 jsing Exp $
+# $OpenBSD: GENERIC,v 1.24 2007/12/18 08:29:02 jasper Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -57,6 +57,7 @@ mavb0 at macebus0 sys 0x18 base 0x00300000 irq 7
mkbc0 at macebus0 disable sys 0x18 base 0x00320000 irq 6
com0 at macebus0 sys 0x18 base 0x00390000 irq 5
com1 at macebus0 sys 0x18 base 0x00398000 irq 5
+power0 at macebus0 sys 0x18 irq 6
#### PCI Bus
macepcibr0 at macebus0 # MACE controller PCI Bus bridge.
diff --git a/sys/arch/sgi/conf/files.sgi b/sys/arch/sgi/conf/files.sgi
index 0ce6823dca3..b069e5e4d2a 100644
--- a/sys/arch/sgi/conf/files.sgi
+++ b/sys/arch/sgi/conf/files.sgi
@@ -1,4 +1,4 @@
-# $OpenBSD: files.sgi,v 1.16 2007/12/14 16:16:28 jsing Exp $
+# $OpenBSD: files.sgi,v 1.17 2007/12/18 08:29:02 jasper Exp $
#
# maxpartitions must be first item in files.${ARCH}
#
@@ -114,6 +114,11 @@ device mkbc: pckbcslot
attach mkbc at macebus
file arch/sgi/dev/mkbc.c mkbc needs-flag
+# Power button
+device power
+attach power at macebus
+file arch/sgi/dev/power.c power
+
# Raster operations
include "dev/rasops/files.rasops"
include "dev/wsfont/files.wsfont"
diff --git a/sys/arch/sgi/dev/power.c b/sys/arch/sgi/dev/power.c
new file mode 100644
index 00000000000..cabfd435a4f
--- /dev/null
+++ b/sys/arch/sgi/dev/power.c
@@ -0,0 +1,142 @@
+/* $OpenBSD: power.c,v 1.1 2007/12/18 08:29:02 jasper Exp $ */
+
+/*
+ * Copyright (c) 2007 Jasper Lievisse Adriaanse <jasper@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/device.h>
+#include <sys/conf.h>
+#include <sys/proc.h>
+#include <sys/signalvar.h>
+
+#include <machine/bus.h>
+#include <machine/autoconf.h>
+
+#include <mips64/archtype.h>
+#include <mips64/dev/clockvar.h>
+
+#include <sgi/localbus/crimebus.h>
+#include <sgi/localbus/macebus.h>
+
+/*
+ * Powerbutton driver for the SGI O2
+ */
+
+#define DS1687_EXT_CTRL 0x4a
+#define DS1687_KICKSTART 0x01
+
+struct power_softc {
+ struct device sc_dev;
+ bus_space_tag_t sc_st;
+ bus_space_handle_t sc_sh;
+ bus_space_handle_t sc_isash;
+};
+
+int power_match(struct device *, void *, void *);
+void power_attach(struct device *, struct device *, void *);
+int power_intr(void *aux);
+
+struct cfattach power_ca = {
+ sizeof(struct power_softc),
+ power_match,
+ power_attach
+};
+
+struct cfdriver power_cd = {
+ NULL, "power", DV_DULL
+};
+
+int
+power_match(struct device *parent, void *match, void *aux)
+{
+ struct confargs *ca = aux;
+
+ /* Powerbutton only on SGI_O2, for now that is */
+ if (ca->ca_sys == SGI_O2)
+ return (1);
+
+ return (0);
+}
+
+void
+power_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct power_softc *sc = (void *)self;
+ struct confargs *ca = aux;
+ int sc_irq;
+ void *rv = NULL;
+
+ printf(": ");
+
+ sc->sc_st = ca->ca_iot;
+ sc_irq = ca->ca_intr;
+
+ /* Map subregion to clock address space. */
+ extern bus_space_handle_t clock_h;
+ if (bus_space_subregion(sc->sc_st, clock_h, 0, 0x50, &sc->sc_sh)) {
+ printf("failed to map clock address space!\n");
+ return;
+ }
+
+ /* Map subregion to ISA control registers. */
+ extern bus_space_handle_t mace_h;
+ if (bus_space_subregion(sc->sc_st, mace_h, 0, 0x80, &sc->sc_isash)) {
+ printf("failed to map ISA control registers!\n");
+ return;
+ }
+
+ /* Establish the interrupt. */
+ rv = macebus_intr_establish(NULL, sc_irq, IST_EDGE, IPL_TTY, power_intr,
+ sc, sc->sc_dev.dv_xname);
+ if (rv == NULL)
+ printf("unable to establish interrupt\n");
+ else
+ printf("using irq %d\n", sc_irq);
+}
+
+int
+power_intr(void *arg)
+{
+ struct power_softc *sc = (void *)arg;
+ u_int64_t val;
+ extern int kbd_reset;
+
+ /* Check to see if this interrupt is for us. */
+ val = bus_space_read_8(sc->sc_st, sc->sc_isash, MACE_ISA_INT_STAT);
+ if (val & MACE_ISA_INT_RTC) {
+
+ /*
+ * Prevent further interrupts by clearing the kickstart flag
+ * in the DS1687's extended control register.
+ */
+ val = bus_space_read_1(sc->sc_st, sc->sc_sh, DS1687_EXT_CTRL);
+ bus_space_write_1(sc->sc_st, sc->sc_sh, DS1687_EXT_CTRL,
+ val & ~DS1687_KICKSTART);
+
+ if (kbd_reset == 1) {
+ kbd_reset = 0;
+ psignal(initproc, SIGUSR2);
+ }
+
+ return(1);
+ }
+
+ return(0);
+}
+
diff --git a/sys/arch/sgi/sgi/machdep.c b/sys/arch/sgi/sgi/machdep.c
index f0ffd8c09ac..66b200715b1 100644
--- a/sys/arch/sgi/sgi/machdep.c
+++ b/sys/arch/sgi/sgi/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.51 2007/12/14 10:13:17 jsing Exp $ */
+/* $OpenBSD: machdep.c,v 1.52 2007/12/18 08:29:02 jasper Exp $ */
/*
* Copyright (c) 2003-2004 Opsycon AB (www.opsycon.se / www.opsycon.com)
@@ -126,6 +126,7 @@ struct user *proc0paddr;
struct user *curprocpaddr;
int console_ok; /* Set when console initialized. */
int bootdriveoffs = 0;
+int kbd_reset;
int32_t *environment;
struct sys_rec sys_config;
@@ -818,6 +819,10 @@ cpu_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p)
return ENOTDIR; /* Overloaded */
switch (name[0]) {
+ case CPU_KBDRESET:
+ if (securelevel > 0)
+ return (sysctl_rdint(oldp, oldlenp, newp, kbd_reset));
+ return (sysctl_int(oldp, oldlenp, newp, newlen, &kbd_reset));
default:
return EOPNOTSUPP;
}