summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/hppa/dev/asp.c170
1 files changed, 94 insertions, 76 deletions
diff --git a/sys/arch/hppa/dev/asp.c b/sys/arch/hppa/dev/asp.c
index 49e137e9bd0..3e34183298e 100644
--- a/sys/arch/hppa/dev/asp.c
+++ b/sys/arch/hppa/dev/asp.c
@@ -1,7 +1,7 @@
-/* $OpenBSD: asp.c,v 1.1 1998/11/23 02:55:43 mickey Exp $ */
+/* $OpenBSD: asp.c,v 1.2 1999/05/05 02:19:02 mickey Exp $ */
/*
- * Copyright (c) 1998 Michael Shalayeff
+ * Copyright (c) 1998,1999 Michael Shalayeff
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -40,36 +40,72 @@
#include <machine/autoconf.h>
#include <hppa/dev/cpudevs.h>
+#include <hppa/dev/viper.h>
#include <hppa/gsc/gscbusvar.h>
-struct asp_softc {
- struct device sc_dv;
+struct asp_hwr {
+ u_int8_t asp_reset;
+ u_int8_t asp_resv[31];
+ u_int8_t asp_version;
+ u_int8_t asp_resv1[15];
+ u_int8_t asp_scsidsync;
+ u_int8_t asp_resv2[15];
+ u_int8_t asp_error;
+};
- bus_space_tag_t sc_iot;
- bus_space_handle_t sc_ioh;
- bus_space_handle_t sc_cioh;
+struct asp_trs {
+ u_int32_t asp_irr;
+ u_int32_t asp_imr;
+ u_int32_t asp_ipr;
+ u_int32_t asp_icr;
+ u_int32_t asp_iar;
+ u_int32_t asp_resv[3];
+ u_int8_t asp_cled;
+#define ASP_LEDDATA 1
+#define ASP_LEDSTROBE 2
+#define ASP_LEDPULSE 8
+ u_int8_t asp_resv1[3];
+ struct {
+ u_int :20,
+ asp_spu : 3, /* SPU ID board jumper */
+#define ASP_SPUCOBRA 0
+#define ASP_SPUCORAL 1
+#define ASP_SPUBUSH 2
+#define ASP_SPUHARDBALL 3
+#define ASP_SPUSCORPIO 4
+#define ASP_SPUCORAL2 5
+ asp_sw : 1, /* front switch is normal */
+ asp_clk : 1, /* SCSI clock is doubled */
+ asp_lan : 2, /* LAN iface selector */
+#define ASP_LANINVAL 0
+#define ASP_LANAUI 1
+#define ASP_LANTHIN 2
+#define ASP_LANMISS 3
+ asp_lanf: 1, /* LAN AUI fuse is ok */
+ asp_spwr: 1, /* SCSI power ok */
+ asp_scsi: 3; /* SCSI ctrl ID */
+ } _asp_ios;
+#define asp_spu _asp_ios.asp_spu
+#define asp_sw _asp_ios.asp_sw
+#define asp_clk _asp_ios.asp_clk
+#define asp_lan _asp_ios.asp_lan
+#define asp_lanf _asp_ios.asp_lanf
+#define asp_spwr _asp_ios.asp_spwr
+#define asp_scsi _asp_ios.asp_scsi
+};
+struct asp_softc {
+ struct device sc_dev;
struct gscbus_ic sc_ic;
+ struct asp_hwr volatile *sc_hw;
+ struct asp_trs volatile *sc_trs;
u_int8_t sc_leds;
};
-/* ASP "Primary Controller" definitions */
+/* ASP "Primary Controller" HPA */
#define ASP_CHPA 0xF0800000
-#define ASP_IRR 0x000
-#define ASP_IMR 0x004
-#define ASP_IPR 0x008
-#define ASP_LEDS 0x020
-#define ASP_LED_DATA 0x01
-#define ASP_LED_STROBE 0x02
-#define ASP_LED_PULSE 0x08
-
-/* ASP registers definitions */
-#define ASP_RESET 0x000
-#define ASP_VERSION 0x020
-#define ASP_DSYNC 0x030
-#define ASP_ERROR 0x040
int aspmatch __P((struct device *, void *, void *));
void aspattach __P((struct device *, struct device *, void *));
@@ -82,7 +118,6 @@ struct cfdriver asp_cd = {
NULL, "asp", DV_DULL
};
-void asp_intr_attach __P((void *v, u_int in));
void asp_intr_establish __P((void *v, u_int32_t mask));
void asp_intr_disestablish __P((void *v, u_int32_t mask));
u_int32_t asp_intr_check __P((void *v));
@@ -96,17 +131,11 @@ aspmatch(parent, cfdata, aux)
{
struct confargs *ca = aux;
/* struct cfdata *cf = cfdata; */
- bus_space_handle_t ioh;
if (ca->ca_type.iodc_type != HPPA_TYPE_BHA ||
ca->ca_type.iodc_sv_model != HPPA_BHA_ASP)
return 0;
- if (bus_space_map(ca->ca_iot, ca->ca_hpa, IOMOD_HPASIZE, 0, &ioh))
- return 0;
-
- bus_space_unmap(ca->ca_iot, ioh, IOMOD_HPASIZE);
-
return 1;
}
@@ -119,28 +148,39 @@ aspattach(parent, self, aux)
register struct confargs *ca = aux;
register struct asp_softc *sc = (struct asp_softc *)self;
struct gsc_attach_args ga;
- u_int ver;
+ bus_space_handle_t ioh;
+ register u_int32_t irr;
+ register int s;
- sc->sc_leds = 0;
- sc->sc_iot = ca->ca_iot;
- if (bus_space_map(sc->sc_iot, ca->ca_hpa, IOMOD_HPASIZE, 0,
- &sc->sc_ioh))
- panic("aspattach: unable to map bus space");
+ if (bus_space_map(ca->ca_iot, ca->ca_hpa, IOMOD_HPASIZE, 0, &ioh)) {
+#ifdef DEBUG
+ printf("aspattach: can't map IO space\n");
+#endif
+ return;
+ }
+
+ sc->sc_trs = (struct asp_trs *)ASP_CHPA;
+ sc->sc_hw = (struct asp_hwr *)ca->ca_hpa;
- if (bus_space_map(sc->sc_iot, ASP_CHPA, IOMOD_HPASIZE, 0,
- &sc->sc_cioh))
- panic("aspattach: unable to map bus space");
+ sc->sc_leds = 0;
/* reset ASP */
- bus_space_write_1(sc->sc_iot, sc->sc_ioh, ASP_RESET, 1);
+ sc->sc_hw->asp_reset = 1;
+ delay(400000);
- ver = bus_space_read_4(sc->sc_iot, sc->sc_ioh, ASP_VERSION);
- printf(": hpa 0x%x, rev %d\n", ca->ca_hpa,
- (ver & 0xf0) >> 4, ver & 0xf);
+ s = splhigh();
+ viper_setintrwnd(1 << ca->ca_irq);
+
+ sc->sc_trs->asp_imr = ~0;
+ irr = sc->sc_trs->asp_irr;
+ sc->sc_trs->asp_imr = 0;
+ splx(s);
+
+ printf (": rev %d, spu %d, lan %d, scsi %d\n", sc->sc_hw->asp_version,
+ sc->sc_trs->asp_spu,sc->sc_trs->asp_lan, sc->sc_trs->asp_scsi);
sc->sc_ic.gsc_type = gsc_asp;
sc->sc_ic.gsc_dv = sc;
- sc->sc_ic.gsc_intr_attach = asp_intr_attach;
sc->sc_ic.gsc_intr_establish = asp_intr_establish;
sc->sc_ic.gsc_intr_disestablish = asp_intr_disestablish;
sc->sc_ic.gsc_intr_check = asp_intr_check;
@@ -159,44 +199,24 @@ heartbeat(int on)
register struct asp_softc *sc;
sc = asp_cd.cd_devs[0];
- if (sc) {
- register u_int8_t r = sc->sc_leds ^= ASP_LED_PULSE, b;
+ if (asp_cd.cd_ndevs && sc) {
+ register u_int8_t r = sc->sc_leds ^= ASP_LEDPULSE, b;
for (b = 0x80; b; b >>= 1) {
- bus_space_write_1(sc->sc_iot, sc->sc_cioh, ASP_LEDS,
- (r & b)? 1 : 0);
- bus_space_write_1(sc->sc_iot, sc->sc_cioh, ASP_LEDS,
- ASP_LED_STROBE | ((r & b)? 1 : 0));
+ sc->sc_trs->asp_cled = (r & b)? 1 : 0;
+ sc->sc_trs->asp_cled = ASP_LEDSTROBE | (r & b)? 1 : 0;
}
}
}
#endif
void
-asp_intr_attach(v, irq)
- void *v;
- u_int irq;
-{
- register struct asp_softc *sc = v;
- int s;
-
- s = splhigh();
- cpu_setintrwnd(1 << irq);
-
- bus_space_write_4(sc->sc_iot, sc->sc_cioh, ASP_IMR, ~0);
- bus_space_read_4 (sc->sc_iot, sc->sc_cioh, ASP_IRR);
- bus_space_write_4(sc->sc_iot, sc->sc_cioh, ASP_IMR, 0);
- splx(s);
-}
-
-void
asp_intr_establish(v, mask)
void *v;
u_int32_t mask;
{
register struct asp_softc *sc = v;
- mask |= bus_space_read_4(sc->sc_iot, sc->sc_cioh, ASP_IMR);
- bus_space_write_4(sc->sc_iot, sc->sc_cioh, ASP_IMR, mask);
+ sc->sc_trs->asp_imr |= mask;
}
void
@@ -206,8 +226,7 @@ asp_intr_disestablish(v, mask)
{
register struct asp_softc *sc = v;
- mask &= ~bus_space_read_4(sc->sc_iot, sc->sc_cioh, ASP_IMR);
- bus_space_write_4(sc->sc_iot, sc->sc_cioh, ASP_IMR, mask);
+ sc->sc_trs->asp_imr &= ~mask;
}
u_int32_t
@@ -215,13 +234,13 @@ asp_intr_check(v)
void *v;
{
register struct asp_softc *sc = v;
- register u_int32_t mask, imr;
+ register u_int32_t irr, imr;
- imr = bus_space_read_4(sc->sc_iot, sc->sc_cioh, ASP_IMR);
- mask = bus_space_read_4(sc->sc_iot, sc->sc_cioh, ASP_IRR);
- bus_space_write_4(sc->sc_iot, sc->sc_cioh, ASP_IMR, imr & ~mask);
+ imr = sc->sc_trs->asp_imr;
+ irr = sc->sc_trs->asp_irr;
+ sc->sc_trs->asp_imr = imr & ~irr;
- return mask;
+ return irr;
}
void
@@ -231,6 +250,5 @@ asp_intr_ack(v, mask)
{
register struct asp_softc *sc = v;
- mask |= bus_space_read_4(sc->sc_iot, sc->sc_cioh, ASP_IMR);
- bus_space_write_4(sc->sc_iot, sc->sc_cioh, ASP_IMR, mask);
+ sc->sc_trs->asp_imr |= mask;
}