diff options
author | Jason Wright <jason@cvs.openbsd.org> | 2004-09-28 02:06:37 +0000 |
---|---|---|
committer | Jason Wright <jason@cvs.openbsd.org> | 2004-09-28 02:06:37 +0000 |
commit | 73f389532f3f44af70b43fc73e53a184e6d2e659 (patch) | |
tree | c38171bbefaaa8f11ca327bb4e19eb02dfd827a5 | |
parent | 4f864e2ef0d4b2a7bd5457c36aefdc3b2b6a819f (diff) |
driver for "clock-board" (mainly blinky lights, but also has information about the chassis)
-rw-r--r-- | sys/arch/sparc64/conf/files.sparc64 | 6 | ||||
-rw-r--r-- | sys/arch/sparc64/dev/clkbrd.c | 177 | ||||
-rw-r--r-- | sys/arch/sparc64/dev/clkbrdreg.h | 40 | ||||
-rw-r--r-- | sys/arch/sparc64/dev/clkbrdvar.h | 39 | ||||
-rw-r--r-- | sys/arch/sparc64/sparc64/machdep.c | 22 |
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); |