Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/sparc64/dev implement `options BLINK' for sparc64 f...
details: https://anonhg.NetBSD.org/src/rev/92fc08a9ab77
branches: trunk
changeset: 516367:92fc08a9ab77
user: mrg <mrg%NetBSD.org@localhost>
date: Mon Oct 22 07:31:41 2001 +0000
description:
implement `options BLINK' for sparc64 for ebus & sbus. tested on a U2
(sbus) and a U5 (ebus).
diffstat:
sys/arch/sparc64/dev/auxio.c | 146 ++++++++++++++++++++++++++++-----------
sys/arch/sparc64/dev/auxioreg.h | 14 +---
sys/arch/sparc64/dev/auxiovar.h | 73 --------------------
3 files changed, 107 insertions(+), 126 deletions(-)
diffs (truncated from 314 to 300 lines):
diff -r 40b27ba8899e -r 92fc08a9ab77 sys/arch/sparc64/dev/auxio.c
--- a/sys/arch/sparc64/dev/auxio.c Mon Oct 22 07:11:46 2001 +0000
+++ b/sys/arch/sparc64/dev/auxio.c Mon Oct 22 07:31:41 2001 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: auxio.c,v 1.1 2000/04/15 03:08:13 mrg Exp $ */
+/* $NetBSD: auxio.c,v 1.2 2001/10/22 07:31:41 mrg Exp $ */
/*
- * Copyright (c) 2000 Matthew R. Green
+ * Copyright (c) 2000, 2001 Matthew R. Green
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -29,11 +29,14 @@
*/
/*
- * AUXIO registers support on the sbus & ebus2.
+ * AUXIO registers support on the sbus & ebus2, used for the floppy driver
+ * and to control the system LED, for the BLINK option.
*/
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/callout.h>
#include <sys/errno.h>
#include <sys/device.h>
#include <sys/malloc.h>
@@ -41,30 +44,107 @@
#include <machine/autoconf.h>
#include <machine/cpu.h>
-#include <sparc64/dev/ebusreg.h>
+#include <dev/ebus/ebusreg.h>
#include <sparc64/dev/ebusvar.h>
#include <sparc64/dev/sbusvar.h>
#include <sparc64/dev/auxioreg.h>
-#include <sparc64/dev/auxiovar.h>
+
+/*
+ * on sun4u, auxio exists with one register (LED) on the sbus, and 5
+ * registers on the ebus2 (pci) (LED, PCIMODE, FREQUENCY, SCSI
+ * OSCILLATOR, and TEMP SENSE.
+ */
+
+struct auxio_softc {
+ struct device sc_dev;
+
+ /* parent's tag */
+ bus_space_tag_t sc_tag;
+
+ /* handles to the various auxio regsiter sets */
+ bus_space_handle_t sc_led;
+ bus_space_handle_t sc_pci;
+ bus_space_handle_t sc_freq;
+ bus_space_handle_t sc_scsi;
+ bus_space_handle_t sc_temp;
+
+ int sc_flags;
+#define AUXIO_LEDONLY 0x1
+#define AUXIO_EBUS 0x2
+#define AUXIO_SBUS 0x4
+};
#define AUXIO_ROM_NAME "auxio"
-/*
- * ebus code.
- */
-int auxio_ebus_match __P((struct device *, struct cfdata *, void *));
-void auxio_ebus_attach __P((struct device *, struct device *, void *));
-int auxio_sbus_match __P((struct device *, struct cfdata *, void *));
-void auxio_sbus_attach __P((struct device *, struct device *, void *));
+void auxio_attach_common(struct auxio_softc *);
+int auxio_ebus_match(struct device *, struct cfdata *, void *);
+void auxio_ebus_attach(struct device *, struct device *, void *);
+int auxio_sbus_match(struct device *, struct cfdata *, void *);
+void auxio_sbus_attach(struct device *, struct device *, void *);
struct cfattach auxio_ebus_ca = {
sizeof(struct auxio_softc), auxio_ebus_match, auxio_ebus_attach
};
-
struct cfattach auxio_sbus_ca = {
sizeof(struct auxio_softc), auxio_sbus_match, auxio_sbus_attach
};
+#ifdef BLINK
+static struct callout blink_ch = CALLOUT_INITIALIZER;
+
+static void auxio_blink(void *);
+
+static void
+auxio_blink(x)
+ void *x;
+{
+ struct auxio_softc *sc = x;
+ int s;
+ u_int32_t led;
+
+ s = splhigh();
+ if (sc->sc_flags & AUXIO_EBUS)
+ led = le32toh(bus_space_read_4(sc->sc_tag, sc->sc_led, 0));
+ else
+ led = bus_space_read_1(sc->sc_tag, sc->sc_led, 0);
+ if (led & AUXIO_LED_LED)
+ led = 0;
+ else
+ led = AUXIO_LED_LED;
+ if (sc->sc_flags & AUXIO_EBUS)
+ bus_space_write_4(sc->sc_tag, sc->sc_led, 0, htole32(led));
+ else
+ bus_space_write_1(sc->sc_tag, sc->sc_led, 0, led);
+ splx(s);
+
+ /*
+ * 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));
+ callout_reset(&blink_ch, s, auxio_blink, sc);
+}
+#endif
+
+void
+auxio_attach_common(sc)
+ struct auxio_softc *sc;
+{
+ static int do_once = 1;
+
+#ifdef BLINK
+ /* only start one blinker */
+ if (do_once) {
+ auxio_blink(sc);
+ do_once = 0;
+ }
+#endif
+ printf("\n");
+}
+
int
auxio_ebus_match(parent, cf, aux)
struct device *parent;
@@ -95,17 +175,16 @@
sc->sc_flags = AUXIO_LEDONLY|AUXIO_EBUS;
} else {
sc->sc_flags = AUXIO_EBUS;
- sc->sc_registers.auxio_pci = (u_int32_t *)(u_long)ea->ea_vaddrs[1];
- sc->sc_registers.auxio_freq = (u_int32_t *)(u_long)ea->ea_vaddrs[2];
- sc->sc_registers.auxio_scsi = (u_int32_t *)(u_long)ea->ea_vaddrs[3];
- sc->sc_registers.auxio_temp = (u_int32_t *)(u_long)ea->ea_vaddrs[4];
+ sc->sc_pci = (bus_space_handle_t)(u_long)ea->ea_vaddrs[1];
+ sc->sc_freq = (bus_space_handle_t)(u_long)ea->ea_vaddrs[2];
+ sc->sc_scsi = (bus_space_handle_t)(u_long)ea->ea_vaddrs[3];
+ sc->sc_temp = (bus_space_handle_t)(u_long)ea->ea_vaddrs[4];
}
- sc->sc_registers.auxio_led = (u_int32_t *)(u_long)ea->ea_vaddrs[0];
+ sc->sc_led = (bus_space_handle_t)(u_long)ea->ea_vaddrs[0];
- if (!auxio_reg)
- auxio_reg = (u_char *)(u_long)ea->ea_vaddrs[0];
+ sc->sc_tag = ea->ea_bustag;
- printf("\n");
+ auxio_attach_common(sc);
}
int
@@ -133,31 +212,16 @@
}
if (sa->sa_nreg != 1 || sa->sa_npromvaddrs != 1) {
- printf(": not 1 (%d/%d) registers??", sa->sa_nreg, sa->sa_npromvaddrs);
+ printf(": not 1 (%d/%d) registers??", sa->sa_nreg,
+ sa->sa_npromvaddrs);
return;
}
/* sbus auxio only has one set of registers */
sc->sc_flags = AUXIO_LEDONLY|AUXIO_SBUS;
- sc->sc_registers.auxio_led = (u_int32_t *)(u_long)sa->sa_promvaddr;
-
- if (!auxio_reg)
- auxio_reg = (u_char *)(u_long)sa->sa_promvaddr;
-
- printf("\n");
-}
+ sc->sc_led = (bus_space_handle_t)(u_long)sa->sa_promvaddr;
-/*
- * old interface; used by fd driver for now
- */
-unsigned int
-auxregbisc(bis, bic)
- int bis, bic;
-{
- register int v, s = splhigh();
+ sc->sc_tag = sa->sa_bustag;
- v = *auxio_reg;
- *auxio_reg = ((v | bis) & ~bic) | AUXIO_LED_MB1;
- splx(s);
- return v;
+ auxio_attach_common(sc);
}
diff -r 40b27ba8899e -r 92fc08a9ab77 sys/arch/sparc64/dev/auxioreg.h
--- a/sys/arch/sparc64/dev/auxioreg.h Mon Oct 22 07:11:46 2001 +0000
+++ b/sys/arch/sparc64/dev/auxioreg.h Mon Oct 22 07:31:41 2001 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: auxioreg.h,v 1.3 2000/04/15 03:08:13 mrg Exp $ */
+/* $NetBSD: auxioreg.h,v 1.4 2001/10/22 07:31:41 mrg Exp $ */
/*
* Copyright (c) 2000 Matthew R. Green
@@ -46,17 +46,7 @@
#define AUXIO_POWER_COURTESY_OFF 0x1
#define AUXIO_LED 0x00726000
-#define AUXIO_LED_LED 0x0
-#define AUXIO_LED_MB1 0xf0 /* must be set on write */
-/* XXX: these may be useless on Ebus2 auxio! find out! */
-#define AUXIO_LED_FHD 0x20 /* floppy: high density (unreliable?)*/
-#define AUXIO_LED_FDC 0x10 /* floppy: diskette was changed */
-#define AUXIO_LED_FDS 0x08 /* floppy: drive select */
-#define AUXIO_LED_FTC 0x04 /* floppy: drives Terminal Count pin */
-#define AUXIO_LED_FEJ 0x02 /* floppy: eject disk */
-#if 0
-#define AUXIO_LED_LED 0x01 /* front panel LED */
-#endif
+#define AUXIO_LED_LED 1
#define AUXIO_PCI 0x00728000
#define AUXIO_PCI_SLOT0 0x0 /* two bits each */
diff -r 40b27ba8899e -r 92fc08a9ab77 sys/arch/sparc64/dev/auxiovar.h
--- a/sys/arch/sparc64/dev/auxiovar.h Mon Oct 22 07:11:46 2001 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/* $NetBSD: auxiovar.h,v 1.4 2000/04/15 03:08:13 mrg Exp $ */
-
-/*
- * Copyright (c) 2000 Matthew R. Green
- * 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. 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.
- */
-
-/*
- * on sun4u, auxio exists with one register (LED) on the sbus, and 5
- * registers on the ebus2 (pci) (LED, PCIMODE, FREQUENCY, SCSI
- * OSCILLATOR, and TEMP SENSE.
- *
- * clients of the auxio registers (eg, blinken lights, or the sbus
- * floppy) should search in auxio_cd for their matching auxio register
- * (to deal with multiple auxio's that may appear.)
- */
-
-struct auxio_registers {
-#if 0 /* these do not exist on the Ebus2 */
- volatile u_int32_t *auxio_fd;
- volatile u_int32_t *auxio_audio;
- volatile u_int32_t *auxio_power;
-#endif
- volatile u_int32_t *auxio_led;
- volatile u_int32_t *auxio_pci;
- volatile u_int32_t *auxio_freq;
- volatile u_int32_t *auxio_scsi;
- volatile u_int32_t *auxio_temp;
-};
-
-struct auxio_softc {
- struct device sc_dev;
- struct auxio_registers sc_registers;
- int sc_flags;
-#define AUXIO_LEDONLY 0x1
-#define AUXIO_EBUS 0x2
Home |
Main Index |
Thread Index |
Old Index