summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Wright <jason@cvs.openbsd.org>2004-09-28 02:06:37 +0000
committerJason Wright <jason@cvs.openbsd.org>2004-09-28 02:06:37 +0000
commit73f389532f3f44af70b43fc73e53a184e6d2e659 (patch)
treec38171bbefaaa8f11ca327bb4e19eb02dfd827a5
parent4f864e2ef0d4b2a7bd5457c36aefdc3b2b6a819f (diff)
driver for "clock-board" (mainly blinky lights, but also has information about the chassis)
-rw-r--r--sys/arch/sparc64/conf/files.sparc646
-rw-r--r--sys/arch/sparc64/dev/clkbrd.c177
-rw-r--r--sys/arch/sparc64/dev/clkbrdreg.h40
-rw-r--r--sys/arch/sparc64/dev/clkbrdvar.h39
-rw-r--r--sys/arch/sparc64/sparc64/machdep.c22
5 files changed, 279 insertions, 5 deletions
diff --git a/sys/arch/sparc64/conf/files.sparc64 b/sys/arch/sparc64/conf/files.sparc64
index 1f7e0a9fe65..796a91b3045 100644
--- a/sys/arch/sparc64/conf/files.sparc64
+++ b/sys/arch/sparc64/conf/files.sparc64
@@ -1,4 +1,4 @@
-# $OpenBSD: files.sparc64,v 1.52 2004/09/27 21:12:40 jason Exp $
+# $OpenBSD: files.sparc64,v 1.53 2004/09/28 02:06:36 jason Exp $
# $NetBSD: files.sparc64,v 1.50 2001/08/10 20:53:50 eeh Exp $
# maxpartitions must be first item in files.${ARCH}
@@ -30,6 +30,10 @@ file arch/sparc64/dev/fhc_central.c fhc_central
attach fhc at mainbus with fhc_mainbus
file arch/sparc64/dev/fhc_mainbus.c fhc_mainbus
+device clkbrd
+attach clkbrd at fhc
+file arch/sparc64/dev/clkbrd.c clkbrd needs-flag
+
device pcons
attach pcons at mainbus
file arch/sparc64/dev/pcons.c pcons needs-flag
diff --git a/sys/arch/sparc64/dev/clkbrd.c b/sys/arch/sparc64/dev/clkbrd.c
new file mode 100644
index 00000000000..70b18ce9ec4
--- /dev/null
+++ b/sys/arch/sparc64/dev/clkbrd.c
@@ -0,0 +1,177 @@
+/* $OpenBSD: clkbrd.c,v 1.1 2004/09/28 02:06:36 jason Exp $ */
+
+/*
+ * Copyright (c) 2004 Jason L. Wright (jason@thought.net)
+ * 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 ``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 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.
+ */
+
+#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/timeout.h>
+#include <sys/malloc.h>
+
+#include <machine/bus.h>
+#include <machine/autoconf.h>
+#include <machine/openfirm.h>
+
+#include <sparc64/dev/fhcvar.h>
+#include <sparc64/dev/clkbrdreg.h>
+#include <sparc64/dev/clkbrdvar.h>
+
+extern int sparc_led_blink;
+
+int clkbrd_match(struct device *, void *, void *);
+void clkbrd_attach(struct device *, struct device *, void *);
+
+struct cfattach clkbrd_ca = {
+ sizeof(struct clkbrd_softc), clkbrd_match, clkbrd_attach
+};
+
+struct cfdriver clkbrd_cd = {
+ NULL, "clkbrd", DV_DULL
+};
+
+int
+clkbrd_match(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
+{
+ struct fhc_attach_args *fa = aux;
+
+ if (strcmp(fa->fa_name, "clock-board") == 0)
+ return (1);
+ return (0);
+}
+
+void
+clkbrd_attach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
+{
+ struct clkbrd_softc *sc = (struct clkbrd_softc *)self;
+ struct fhc_attach_args *fa = aux;
+ int i, slots;
+ u_int8_t r;
+
+ sc->sc_bt = fa->fa_bustag;
+
+ timeout_set(&sc->sc_to, clkbrd_led_blink, sc);
+
+ if (fa->fa_nreg < 1) {
+ printf(": no registers\n");
+ return;
+ }
+
+ if (fhc_bus_map(sc->sc_bt, fa->fa_reg[0].fbr_slot,
+ fa->fa_reg[0].fbr_offset, fa->fa_reg[0].fbr_size, 0,
+ &sc->sc_creg)) {
+ printf(": can't map ctrl regs\n");
+ return;
+ }
+
+ if (fa->fa_nreg > 2) {
+ if (fhc_bus_map(sc->sc_bt, fa->fa_reg[2].fbr_slot,
+ fa->fa_reg[2].fbr_offset, fa->fa_reg[2].fbr_size, 0,
+ &sc->sc_vreg)) {
+ printf(": can't map vreg\n");
+ return;
+ }
+ sc->sc_has_vreg = 1;
+ }
+
+ r = bus_space_read_1(sc->sc_bt, sc->sc_creg, CLK_STS1);
+ switch (r & 0xc0) {
+ case 0x40:
+ slots = 16;
+ break;
+ case 0xc0:
+ slots = 8;
+ break;
+ case 0x80:
+ if (sc->sc_has_vreg) {
+ r = bus_space_read_1(sc->sc_bt, sc->sc_vreg, 0);
+ if (r != 0) {
+ if (r & 0x80)
+ slots = 4;
+ else
+ slots = 5;
+ break;
+ }
+ }
+ default:
+ slots = 4;
+ }
+
+ printf(": slots %d\n", slots);
+
+ for (i = 0; i < fa->fa_nreg; i++) {
+ printf(" r[%d] slot %x offset %x size %x\n",
+ i, fa->fa_reg[i].fbr_slot, fa->fa_reg[i].fbr_offset,
+ fa->fa_reg[i].fbr_size);
+ }
+
+ if (sparc_led_blink)
+ clkbrd_led_blink(sc);
+}
+
+void
+clkbrd_led_blink(void *vsc)
+{
+ struct clkbrd_softc *sc = vsc;
+ int i, s;
+ u_int8_t r;
+
+ if (sc == NULL) {
+ for (i = 0; i < clkbrd_cd.cd_ndevs; i++) {
+ sc = clkbrd_cd.cd_devs[i];
+ if (sc != NULL)
+ clkbrd_led_blink(sc);
+ }
+ return;
+ }
+
+ s = splhigh();
+ r = bus_space_read_1(sc->sc_bt, sc->sc_creg, CLK_CTRL);
+ r ^= CLK_CTRL_RLED;
+ bus_space_write_1(sc->sc_bt, sc->sc_creg, CLK_CTRL, r);
+ bus_space_read_1(sc->sc_bt, sc->sc_creg, CLK_CTRL);
+ splx(s);
+
+ if (!sparc_led_blink)
+ return;
+
+ /*
+ * Blink rate is:
+ * full cycle every second if completely idle (loadav = 0)
+ * full cycle every 2 seconds if loadav = 1
+ * full cycle every 3 seconds if loadav = 2
+ * etc.
+ */
+ s = (((averunnable.ldavg[0] + FSCALE) * hz) >> (FSHIFT + 1));
+ timeout_add(&sc->sc_to, s);
+}
diff --git a/sys/arch/sparc64/dev/clkbrdreg.h b/sys/arch/sparc64/dev/clkbrdreg.h
new file mode 100644
index 00000000000..f5c647d2496
--- /dev/null
+++ b/sys/arch/sparc64/dev/clkbrdreg.h
@@ -0,0 +1,40 @@
+/* $OpenBSD: clkbrdreg.h,v 1.1 2004/09/28 02:06:36 jason Exp $ */
+
+/*
+ * Copyright (c) 2004 Jason L. Wright (jason@thought.net)
+ * 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 ``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 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.
+ */
+
+#define CLK_CTRL 0x00
+#define CLK_STS1 0x10
+#define CLK_STS2 0x20
+#define CLK_PSTS1 0x30
+#define CLK_PPRES 0x40
+#define CLK_TEMP 0x50
+#define CLK_IRQ 0x60
+#define CLK_PSTS2 0x70
+
+#define CLK_CTRL_LLED 0x04 /* left led (reversed) */
+#define CLK_CTRL_MLED 0x02 /* middle led */
+#define CLK_CTRL_RLED 0x01 /* right led */
diff --git a/sys/arch/sparc64/dev/clkbrdvar.h b/sys/arch/sparc64/dev/clkbrdvar.h
new file mode 100644
index 00000000000..9a31aa07af0
--- /dev/null
+++ b/sys/arch/sparc64/dev/clkbrdvar.h
@@ -0,0 +1,39 @@
+/* $OpenBSD: clkbrdvar.h,v 1.1 2004/09/28 02:06:36 jason Exp $ */
+
+/*
+ * Copyright (c) 2004 Jason L. Wright (jason@thought.net)
+ * 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 ``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 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.
+ */
+
+struct clkbrd_softc {
+ struct device sc_dv;
+ bus_space_tag_t sc_bt;
+ bus_space_handle_t sc_creg;
+ bus_space_handle_t sc_vreg;
+ int sc_node;
+ int sc_has_vreg;
+ struct timeout sc_to;
+};
+
+void clkbrd_led_blink(void *);
diff --git a/sys/arch/sparc64/sparc64/machdep.c b/sys/arch/sparc64/sparc64/machdep.c
index b03577c4762..8a9996a2b76 100644
--- a/sys/arch/sparc64/sparc64/machdep.c
+++ b/sys/arch/sparc64/sparc64/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.71 2004/09/27 21:12:40 jason Exp $ */
+/* $OpenBSD: machdep.c,v 1.72 2004/09/28 02:06:36 jason Exp $ */
/* $NetBSD: machdep.c,v 1.108 2001/07/24 19:30:14 eeh Exp $ */
/*-
@@ -80,6 +80,7 @@
#include "auxio.h"
#include "fhc.h"
+#include "clkbrd.h"
#include <sys/param.h>
#include <sys/extent.h>
@@ -195,7 +196,7 @@ int physmem;
u_long _randseed;
extern caddr_t msgbufaddr;
-#if (NAUXIO > 0) || (NFHC > 0)
+#if (NAUXIO > 0) || (NFHC > 0) || (NCLKBRD > 0)
int sparc_led_blink;
#endif
@@ -207,6 +208,10 @@ int sparc_led_blink;
#include <sparc64/dev/fhcvar.h>
#endif
+#if NCLKBRD > 0
+#include <sparc64/dev/clkbrdvar.h>
+#endif
+
#ifdef APERTURE
#ifdef INSECURE
int allowaperture = 1;
@@ -553,7 +558,7 @@ cpu_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p)
return (ENOENT);
return (sysctl_rdstring(oldp, oldlenp, newp, cp));
case CPU_LED_BLINK:
-#if NAUXIO > 0
+#if (NAUXIO > 0) || (NFHC > 0) || (NCLKBRD > 0)
oldval = sparc_led_blink;
ret = sysctl_int(oldp, oldlenp, newp, newlen,
&sparc_led_blink);
@@ -562,8 +567,17 @@ cpu_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p)
* If we were false and are now true, call auxio_led_blink().
* auxio_led_blink() will catch the other case itself.
*/
- if (!oldval && sparc_led_blink > oldval)
+ if (!oldval && sparc_led_blink > oldval) {
+#if NAUXIO > 0
auxio_led_blink(NULL);
+#endif
+#if NFHC > 0
+ fhc_led_blink(NULL);
+#endif
+#if NCLKBRD > 0
+ clkbrd_led_blink(NULL);
+#endif
+ }
return (ret);
#else
return (EOPNOTSUPP);