diff options
-rw-r--r-- | sys/arch/pmax/conf/DS3100 | 2 | ||||
-rw-r--r-- | sys/arch/pmax/conf/GENERIC | 2 | ||||
-rw-r--r-- | sys/arch/pmax/conf/GENERIC.NFS | 2 | ||||
-rw-r--r-- | sys/arch/pmax/conf/GENERIC.rz0 | 2 | ||||
-rw-r--r-- | sys/arch/pmax/conf/files.pmax | 5 | ||||
-rw-r--r-- | sys/arch/pmax/dev/led.c | 133 | ||||
-rw-r--r-- | sys/arch/pmax/dev/led.h | 39 | ||||
-rw-r--r-- | sys/arch/pmax/include/cpu.h | 6 | ||||
-rw-r--r-- | sys/arch/pmax/pmax/machdep.c | 18 | ||||
-rw-r--r-- | sys/arch/pmax/pmax/mainbus.c | 3 | ||||
-rw-r--r-- | sys/arch/pmax/pmax/pmax_trap.c | 11 |
11 files changed, 219 insertions, 4 deletions
diff --git a/sys/arch/pmax/conf/DS3100 b/sys/arch/pmax/conf/DS3100 index 0f3f93c6548..d507349319e 100644 --- a/sys/arch/pmax/conf/DS3100 +++ b/sys/arch/pmax/conf/DS3100 @@ -91,6 +91,8 @@ rz6 at oldscsibus? target ? drive ? tz0 at oldscsibus? target ? drive ? tz1 at oldscsibus? target ? drive ? +led0 at mainbus0 # [23]100 back panel leds + pseudo-device loop 1 pseudo-device sl 1 # serial-line ip ports pseudo-device ppp 1 # point ot point ip ports diff --git a/sys/arch/pmax/conf/GENERIC b/sys/arch/pmax/conf/GENERIC index f7b8a8744e9..1a36aeefaf4 100644 --- a/sys/arch/pmax/conf/GENERIC +++ b/sys/arch/pmax/conf/GENERIC @@ -124,6 +124,8 @@ rz6 at oldscsibus? target ? drive ? tz0 at oldscsibus? target ? drive ? tz1 at oldscsibus? target ? drive ? +led0 at mainbus0 # [23]100 back panel leds + pseudo-device loop 1 pseudo-device sl 1 # serial-line ip ports pseudo-device ppp 1 # point ot point ip ports diff --git a/sys/arch/pmax/conf/GENERIC.NFS b/sys/arch/pmax/conf/GENERIC.NFS index fc3e5c63d15..9c7563a85e9 100644 --- a/sys/arch/pmax/conf/GENERIC.NFS +++ b/sys/arch/pmax/conf/GENERIC.NFS @@ -122,6 +122,8 @@ rz6 at oldscsibus? target ? drive ? tz0 at oldscsibus? target ? drive ? tz1 at oldscsibus? target ? drive ? +led0 at mainbus0 # [23]100 back panel leds + pseudo-device loop 1 pseudo-device sl 1 # serial-line ip ports pseudo-device ppp 1 # point ot point ip ports diff --git a/sys/arch/pmax/conf/GENERIC.rz0 b/sys/arch/pmax/conf/GENERIC.rz0 index 3a6958750cd..c16494e3fc2 100644 --- a/sys/arch/pmax/conf/GENERIC.rz0 +++ b/sys/arch/pmax/conf/GENERIC.rz0 @@ -123,6 +123,8 @@ rz6 at oldscsibus? target ? drive ? tz0 at oldscsibus? target ? drive ? tz1 at oldscsibus? target ? drive ? +led0 at mainbus0 # [23]100 back panel leds + pseudo-device loop 1 pseudo-device sl 1 # serial-line ip ports pseudo-device ppp 1 # point ot point ip ports diff --git a/sys/arch/pmax/conf/files.pmax b/sys/arch/pmax/conf/files.pmax index b482eb9ec9a..bca52fcc1f8 100644 --- a/sys/arch/pmax/conf/files.pmax +++ b/sys/arch/pmax/conf/files.pmax @@ -101,6 +101,11 @@ file arch/pmax/dev/rz.c rz needs-count # Optional device-drivers # +# Back panel LEDS on KN01 boxes +device led +attach led at mainbus +file arch/pmax/dev/led.c led needs-count + # DC7085 (DZ-like four-port serial device) on mainbus on non-IOASIC machines. # For the 3MAX (aka kn02 aka 5k/200) pretend that it's on an ASIC. device dc diff --git a/sys/arch/pmax/dev/led.c b/sys/arch/pmax/dev/led.c new file mode 100644 index 00000000000..991a7dcb2fe --- /dev/null +++ b/sys/arch/pmax/dev/led.c @@ -0,0 +1,133 @@ +/* $OpenBSD: led.c,v 1.1 1998/06/04 03:49:48 jason Exp $ */ + +/* + * Copyright (c) 1998 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Jason L. Wright + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * 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/param.h> +#include <sys/device.h> +#include <sys/kernel.h> +#include <sys/systm.h> + +#include <machine/autoconf.h> +#include <pmax/pmax/kn01.h> +#include <pmax/pmax/pmaxtype.h> +#include <pmax/dev/led.h> + +/* + * This is the driver for the "led" register available on the kn01 machines. + */ + +static int ledmatch __P((struct device *, void *, void *)); +static void ledattach __P((struct device *, struct device *, void *)); + +struct cfattach led_ca = { + sizeof(struct device), ledmatch, ledattach +}; + +struct cfdriver led_cd = { + NULL, "led", DV_DULL +}; + +/* from machdep */ +extern int pmax_boardtype; + +static char led_attached = 0; +static int led_index = 0; +u_short led_current = 0xff; +int pmax_led_blink; + +/* + * These led patterns produce a line that scrolls across the display, then + * back again. Note that a value of 0 for a particular bit lights the + * corresponding LED, and 1 leaves it dark. + */ +static char led_patterns[] = + { 0xff, 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe, + 0xff, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f, }; + +static int +ledmatch(parent, match, aux) + struct device *parent; + void *match; + void *aux; +{ + struct confargs *ca = aux; + + if (pmax_boardtype == DS_PMAX) /* only handle [23]100 now */ + return (strcmp("led", ca->ca_name) == 0); + return (0); +} + +/* ARGSUSED */ +static void +ledattach(parent, self, aux) + struct device *parent, *self; + void *aux; +{ + led_attached = 1; + printf("\n"); + + /* In case it's initialized to true... */ + if (pmax_led_blink) + led_pmax_cycle((caddr_t)0); +} + +/* + * Check to see whether we were configured and whether machdep.led_blink != 0. + * If so, put a new pattern into the register and schedule ourselves to + * be called again later. The timeout is set to: [(1/8) * loadavg] seconds. + */ +void +led_pmax_cycle(zero) + void *zero; +{ + int s; + unsigned short csr; + + if (!led_attached) + return; + + if (!pmax_led_blink) + led_current = 0xff; + else { + led_index = (led_index + 1) % sizeof(led_patterns); + led_current = led_patterns[led_index] & KN01_CSR_LEDS_MASK; + } + + csr = *((volatile u_short *) MIPS_PHYS_TO_KSEG1(KN01_SYS_CSR)); + csr = (csr & ~KN01_CSR_LEDS_MASK) | led_current; + *((volatile u_short *) MIPS_PHYS_TO_KSEG1(KN01_SYS_CSR)) = csr; + + if (pmax_led_blink) { + s = (((averunnable.ldavg[0] + FSCALE) * hz) >> (FSHIFT + 3)); + timeout(led_pmax_cycle, (caddr_t)0, s); + } +} diff --git a/sys/arch/pmax/dev/led.h b/sys/arch/pmax/dev/led.h new file mode 100644 index 00000000000..dceeb9f6843 --- /dev/null +++ b/sys/arch/pmax/dev/led.h @@ -0,0 +1,39 @@ +/* $OpenBSD: led.h,v 1.1 1998/06/04 03:49:48 jason Exp $ */ + +/* + * Copyright (c) 1998 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Jason L. Wright + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * 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. + */ + +/* + * pmax diag register on kn01 machines. + */ + +extern int pmax_led_blink; +void led_pmax_cycle __P((void *)); diff --git a/sys/arch/pmax/include/cpu.h b/sys/arch/pmax/include/cpu.h index d1fec14aa49..75a88148245 100644 --- a/sys/arch/pmax/include/cpu.h +++ b/sys/arch/pmax/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.7 1998/05/18 00:28:11 millert Exp $ */ +/* $OpenBSD: cpu.h,v 1.8 1998/06/04 03:49:48 jason Exp $ */ /* $NetBSD: cpu.h,v 1.15 1996/03/23 20:28:19 jonathan Exp $ */ /*- @@ -152,11 +152,13 @@ union cpuprid { * CTL_MACHDEP definitions. */ #define CPU_CONSDEV 1 /* dev_t: console terminal device */ -#define CPU_MAXID 2 /* number of valid machdep ids */ +#define CPU_LED_BLINK 2 +#define CPU_MAXID 3 /* number of valid machdep ids */ #define CTL_MACHDEP_NAMES { \ { 0, 0 }, \ { "console_device", CTLTYPE_STRUCT }, \ + { "led_blink", CTLTYPE_INT }, \ } diff --git a/sys/arch/pmax/pmax/machdep.c b/sys/arch/pmax/pmax/machdep.c index a8e03ca072c..c104d16a6f5 100644 --- a/sys/arch/pmax/pmax/machdep.c +++ b/sys/arch/pmax/pmax/machdep.c @@ -87,6 +87,7 @@ #include <pmax/stand/dec_prom.h> #include <pmax/dev/ascreg.h> +#include <pmax/dev/led.h> #include <machine/autoconf.h> #include <machine/locore.h> @@ -102,7 +103,6 @@ #include <pmax/pmax/pmaxtype.h> #include <pmax/pmax/cons.h> - #include "pm.h" #include "cfb.h" #include "mfb.h" @@ -112,6 +112,7 @@ #include "scc.h" #include "le_ioasic.h" #include "asc.h" +#include "led.h" extern void fbPutc(); @@ -898,6 +899,9 @@ cpu_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) size_t newlen; struct proc *p; { +#if (NLED > 0) + int ret, oldval; +#endif /* all sysctl names at this level are terminal */ if (namelen != 1) @@ -907,6 +911,18 @@ cpu_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) case CPU_CONSDEV: return (sysctl_rdstruct(oldp, oldlenp, newp, &cn_tab->cn_dev, sizeof cn_tab->cn_dev)); + case CPU_LED_BLINK: +#if (NLED > 0) + oldval = pmax_led_blink; + ret = sysctl_int(oldp, oldlenp, newp, newlen, &pmax_led_blink); + + /* + * If we were false and are now true, call led_blink(). + * led_blink() itself will catch the other case. + */ + led_pmax_cycle((caddr_t *)0); + return (ret); +#endif default: return (EOPNOTSUPP); } diff --git a/sys/arch/pmax/pmax/mainbus.c b/sys/arch/pmax/pmax/mainbus.c index 2211578c06d..297a1a33a83 100644 --- a/sys/arch/pmax/pmax/mainbus.c +++ b/sys/arch/pmax/pmax/mainbus.c @@ -157,7 +157,7 @@ mbattach(parent, self, aux) } -#define KN01_MAXDEVS 8 +#define KN01_MAXDEVS 9 struct confargs kn01_devs[KN01_MAXDEVS] = { /* name slot offset addr intpri */ { "pm", 0, 0, (u_int)KV(KN01_PHYS_FBUF_START), 3, }, @@ -167,6 +167,7 @@ struct confargs kn01_devs[KN01_MAXDEVS] = { { "mc146818", 4, 0, (u_int)KV(KN01_SYS_CLOCK), 16, }, { "dc", 5, 0, (u_int)KV(0x15000000), 4, }, { "dc", 6, 0, (u_int)KV(0x15200000), 5, }, + { "led", 6, 0, 0, -1, }, #ifdef notyet /* * XXX Ultrix configures at 0x86400400. the first 0x400 byte are diff --git a/sys/arch/pmax/pmax/pmax_trap.c b/sys/arch/pmax/pmax/pmax_trap.c index b33445dfd0c..7985d186b5c 100644 --- a/sys/arch/pmax/pmax/pmax_trap.c +++ b/sys/arch/pmax/pmax/pmax_trap.c @@ -91,6 +91,7 @@ struct ifnet; struct ethercom; #include "sii.h" #include "le_pmax.h" #include "dc_ds.h" +#include "led.h" #include <sys/cdefs.h> #include <sys/syslog.h> @@ -777,6 +778,11 @@ kn03_intr(mask, pc, statusReg, causeReg) *---------------------------------------------------------------------- */ #ifdef DS3100 + +#if (NLED > 0) +extern unsigned short led_current; +#endif + static void pmax_errintr() { @@ -791,7 +797,12 @@ pmax_errintr() *(unsigned *)MIPS_PHYS_TO_KSEG1(KN01_SYS_ERRADR)); panic("Mem error interrupt"); } +#if (NLED > 0) + *sysCSRPtr = ((csr & ~KN01_CSR_MBZ) & ~(KN01_CSR_LEDS_MASK)) + | led_current; +#else *sysCSRPtr = (csr & ~KN01_CSR_MBZ) | 0xff; +#endif } #endif /* DS3100 */ |