summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugh Graham <hugh@cvs.openbsd.org>2001-08-25 13:33:38 +0000
committerHugh Graham <hugh@cvs.openbsd.org>2001-08-25 13:33:38 +0000
commit2f9f539a801e8c00430eacc3a70495465ca02e4e (patch)
treea8c95a4e7bd59da4baa2c4974425216c11ff94b4
parent1195029145310bb1c26d5da6e89f13372126bc9b (diff)
Bring in some useful stuff from NetBSD. Mostly work by Matt Thomas,
and concerned with intvec counting. Also some ANSIfication.
-rw-r--r--sys/arch/vax/boot/boot/autoconf.c49
-rw-r--r--sys/arch/vax/if/if_le.c7
-rw-r--r--sys/arch/vax/if/if_ze.c5
-rw-r--r--sys/arch/vax/if/sgec.c25
-rw-r--r--sys/arch/vax/if/sgecvar.h5
-rw-r--r--sys/arch/vax/include/frame.h21
-rw-r--r--sys/arch/vax/include/ioa.h4
-rw-r--r--sys/arch/vax/include/nexus.h27
-rw-r--r--sys/arch/vax/include/scb.h33
-rw-r--r--sys/arch/vax/include/trap.h24
-rw-r--r--sys/arch/vax/include/vsbus.h60
-rw-r--r--sys/arch/vax/qbus/dz.c158
-rw-r--r--sys/arch/vax/qbus/dz_uba.c15
-rw-r--r--sys/arch/vax/qbus/dzvar.h15
-rw-r--r--sys/arch/vax/qbus/uba.c84
-rw-r--r--sys/arch/vax/qbus/ubavar.h35
-rw-r--r--sys/arch/vax/qbus/uda.c52
-rw-r--r--sys/arch/vax/stand/boot/autoconf.c49
-rw-r--r--sys/arch/vax/uba/uba.c14
-rw-r--r--sys/arch/vax/uba/ubareg.h6
-rw-r--r--sys/arch/vax/vax/clock.c25
-rw-r--r--sys/arch/vax/vax/genassym.cf4
-rw-r--r--sys/arch/vax/vax/gencons.c202
-rw-r--r--sys/arch/vax/vax/ibus.c31
-rw-r--r--sys/arch/vax/vax/intvec.s16
-rw-r--r--sys/arch/vax/vax/ka49.c9
-rw-r--r--sys/arch/vax/vax/ka53.c8
-rw-r--r--sys/arch/vax/vax/ka650.c26
-rw-r--r--sys/arch/vax/vax/ka680.c6
-rw-r--r--sys/arch/vax/vax/ka820.c108
-rw-r--r--sys/arch/vax/vax/scb.c42
-rw-r--r--sys/arch/vax/vax/subr.s27
-rw-r--r--sys/arch/vax/vsa/asc_vsbus.c7
-rw-r--r--sys/arch/vax/vsa/dz_ibus.c18
-rw-r--r--sys/arch/vax/vsa/if_le_vsbus.c6
-rw-r--r--sys/arch/vax/vsa/if_ze_vsbus.c14
-rw-r--r--sys/arch/vax/vsa/ncr.c29
-rw-r--r--sys/arch/vax/vsa/vsbus.c14
38 files changed, 702 insertions, 578 deletions
diff --git a/sys/arch/vax/boot/boot/autoconf.c b/sys/arch/vax/boot/boot/autoconf.c
index 44dc0e0ba06..85cc3b0c0e6 100644
--- a/sys/arch/vax/boot/boot/autoconf.c
+++ b/sys/arch/vax/boot/boot/autoconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: autoconf.c,v 1.4 2001/01/28 01:21:32 hugh Exp $ */
+/* $OpenBSD: autoconf.c,v 1.5 2001/08/25 13:33:36 hugh Exp $ */
/* $NetBSD: autoconf.c,v 1.5 1999/08/23 19:09:27 ragge Exp $ */
/*
* Copyright (c) 1994, 1998 Ludd, University of Lule}, Sweden.
@@ -37,8 +37,7 @@
#include "sys/param.h"
#include "../../include/mtpr.h"
#include "../../include/sid.h"
-#include "../../include/trap.h"
-#include "../../include/frame.h"
+#include "../../include/scb.h"
#include "vaxstand.h"
extern const struct ivec_dsp idsptch; /* since we are not KERNEL */
@@ -191,10 +190,10 @@ scbinit()
int i;
/*
- * Allocate space. We need one page for the SCB, and 128*16 == 2k
+ * Allocate space. We need one page for the SCB, and 128*20 == 2.5k
* for the vectors. The SCB must be on a page boundary.
*/
- i = alloc(VAX_NBPG * 6) + VAX_PGOFSET;
+ i = (int)alloc(VAX_NBPG + 128*sizeof(scb_vec[0])) + VAX_PGOFSET;
i &= ~VAX_PGOFSET;
mtpr(i, PR_SCBB);
@@ -203,9 +202,11 @@ scbinit()
for (i = 0; i < 128; i++) {
scb[i] = &scb_vec[i];
- (int)scb[i] |= 1; /* Only interrupt stack */
- memcpy(&scb_vec[i], &idsptch, sizeof(struct ivec_dsp));
+ (int)scb[i] |= SCB_ISTACK; /* Only interrupt stack */
+ scb_vec[i] = idsptch;
scb_vec[i].hoppaddr = scb_stray;
+ scb_vec[i].pushlarg = (void *) (i * 4);
+ scb_vec[i].ev = NULL;
}
scb_vec[0xc0/4].hoppaddr = rtimer;
@@ -238,19 +239,23 @@ rtimer()
}
asm("
+ .align 2
.globl _idsptch, _eidsptch
_idsptch:
- pushr $0x3f
- pushl $1
- .long 0x9f01fb01
- .long 0x12345678
-#
-# gas do not accept this :-/ use hexcode instead
-# nop
-# calls $1, *$0x12345678
- popr $0x3f
- rei
+ pushr $0x3f
+ .word 0x9f16
+ .long _cmn_idsptch
+ .long 0
+ .long 0
+ .long 0
_eidsptch:
+
+_cmn_idsptch:
+ movl (sp)+,r0
+ pushl 4(r0)
+ calls $1,*(r0)
+ popr $0x3f
+ rei
");
/*
@@ -261,14 +266,10 @@ void
scb_stray(arg)
int arg;
{
- static struct callsframe *cf;
- static int vector, ipl, *a;
+ static int vector, ipl;
- cf = FRAMEOFFSET(arg);
- a = &cf->ca_arg1;
ipl = mfpr(PR_IPL);
- vector = ((cf->ca_pc - (u_int)scb_vec)/4) & ~3;
- printf("stray interrupt: pc %x vector 0x%x, ipl %d\n",
- cf->ca_pc, vector, ipl);
+ vector = (int) arg;
+ printf("stray interrupt: vector 0x%x, ipl %d\n", vector, ipl);
}
diff --git a/sys/arch/vax/if/if_le.c b/sys/arch/vax/if/if_le.c
index f370c74eb64..f37a00d2f6e 100644
--- a/sys/arch/vax/if/if_le.c
+++ b/sys/arch/vax/if/if_le.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_le.c,v 1.5 2000/04/27 03:14:43 bjc Exp $ */
+/* $OpenBSD: if_le.c,v 1.6 2001/08/25 13:33:36 hugh Exp $ */
/* $NetBSD: if_le.c,v 1.14 1999/08/14 18:40:23 ragge Exp $ */
/*-
@@ -108,6 +108,7 @@
struct le_softc {
struct am7990_softc sc_am7990; /* Must be first */
+ struct evcnt sc_intrcnt;
volatile u_short *sc_rap;
volatile u_short *sc_rdp;
};
@@ -184,7 +185,9 @@ le_ibus_attach(parent, self, aux)
i = scb_vecref(&vec, &br);
if (i == 0 || vec == 0)
return;
- scb_vecalloc(vec, (void *)am7990_intr, sc, SCB_ISTACK);
+ scb_vecalloc(vec, (void *)am7990_intr, sc,
+ SCB_ISTACK, &sc->sc_intrcnt);
+ evcnt_attach(self, "intr", &sc->sc_intrcnt);
printf(": vec %o ipl %x\n%s", vec, br, self->dv_xname);
/*
diff --git a/sys/arch/vax/if/if_ze.c b/sys/arch/vax/if/if_ze.c
index 9421b1d786f..6853271ccdd 100644
--- a/sys/arch/vax/if/if_ze.c
+++ b/sys/arch/vax/if/if_ze.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_ze.c,v 1.2 2001/05/20 14:19:43 hugh Exp $ */
+/* $OpenBSD: if_ze.c,v 1.3 2001/08/25 13:33:36 hugh Exp $ */
/* $NetBSD: if_ze.c,v 1.3 2000/01/24 02:54:03 matt Exp $ */
/*
* Copyright (c) 1999 Ludd, University of Lule}, Sweden. All rights reserved.
@@ -127,7 +127,8 @@ zeattach(parent, self, aux)
vax_unmap_physmem((vaddr_t)ea, 1);
- scb_vecalloc(SGECVEC, (void (*)(void *)) sgec_intr, sc, SCB_ISTACK);
+ scb_vecalloc(SGECVEC, (void (*)(void *)) sgec_intr, sc,
+ SCB_ISTACK, &sc->sc_intrcnt);
sgec_attach(sc);
}
diff --git a/sys/arch/vax/if/sgec.c b/sys/arch/vax/if/sgec.c
index 0352be31789..7259a99acd5 100644
--- a/sys/arch/vax/if/sgec.c
+++ b/sys/arch/vax/if/sgec.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: sgec.c,v 1.2 2001/02/20 19:39:35 mickey Exp $ */
-/* $NetBSD: sgec.c,v 1.1 1999/08/08 11:41:29 ragge Exp $ */
+/* $OpenBSD: sgec.c,v 1.3 2001/08/25 13:33:36 hugh Exp $ */
+/* $NetBSD: sgec.c,v 1.5 2000/06/04 02:14:14 matt Exp $ */
/*
* Copyright (c) 1999 Ludd, University of Lule}, Sweden. All rights reserved.
*
@@ -173,6 +173,10 @@ sgec_attach(sc)
}
}
+ /* For vmstat -i
+ */
+ evcnt_attach(&sc->sc_dev, "intr", &sc->sc_intrcnt);
+
/*
* Create ring loops of the buffer chains.
* This is only done once.
@@ -306,6 +310,7 @@ zestart(ifp)
paddr_t buffer;
struct mbuf *m, *m0;
int idx, len, s, i, totlen, error;
+ int old_inq = sc->sc_inq;
short orword;
s = splimp();
@@ -388,7 +393,7 @@ zestart(ifp)
if (sc->sc_inq == (TXDESCS - 1))
ifp->if_flags |= IFF_OACTIVE;
-out: if (sc->sc_inq)
+out: if (old_inq < sc->sc_inq)
ifp->if_timer = 5; /* If transmit logic dies */
splx(s);
}
@@ -412,6 +417,7 @@ sgec_intr(sc)
while ((zc->zc_recv[sc->sc_nextrx].ze_framelen &
ZE_FRAMELEN_OW) == 0) {
+ ifp->if_ipackets++;
m = sc->sc_rxmbuf[sc->sc_nextrx];
len = zc->zc_recv[sc->sc_nextrx].ze_framelen;
ze_add_rxbuf(sc, sc->sc_nextrx);
@@ -424,9 +430,9 @@ sgec_intr(sc)
if (ifp->if_bpf) {
bpf_mtap(ifp->if_bpf, m);
if ((ifp->if_flags & IFF_PROMISC) != 0 &&
+ ((eh->ether_dhost[0] & 1) == 0) &&
bcmp(sc->sc_ac.ac_enaddr, eh->ether_dhost,
- ETHER_ADDR_LEN) != 0 &&
- ((eh->ether_dhost[0] & 1) == 0)) {
+ ETHER_ADDR_LEN) != 0) {
m_freem(m);
continue;
}
@@ -458,17 +464,20 @@ sgec_intr(sc)
if (++sc->sc_lastack == TXDESCS)
sc->sc_lastack = 0;
- /* XXX collect statistics */
if ((zc->zc_xmit[idx].ze_tdes1 & ZE_TDES1_DT) ==
ZE_TDES1_DT_SETUP)
continue;
+ /* XXX collect statistics */
+ if (zc->zc_xmit[idx].ze_tdes1 & ZE_TDES1_LS)
+ ifp->if_opackets++;
bus_dmamap_unload(sc->sc_dmat, sc->sc_xmtmap[idx]);
if (sc->sc_txmbuf[idx]) {
m_freem(sc->sc_txmbuf[idx]);
sc->sc_txmbuf[idx] = 0;
}
}
- ifp->if_timer = 0;
+ if (sc->sc_inq == 0)
+ ifp->if_timer = 0;
ifp->if_flags &= ~IFF_OACTIVE;
zestart(ifp); /* Put in more in queue */
}
@@ -480,7 +489,7 @@ sgec_intr(sc)
*/
int
zeioctl(ifp, cmd, data)
- register struct ifnet *ifp;
+ struct ifnet *ifp;
u_long cmd;
caddr_t data;
{
diff --git a/sys/arch/vax/if/sgecvar.h b/sys/arch/vax/if/sgecvar.h
index 7cf93770817..fdee7fa4a43 100644
--- a/sys/arch/vax/if/sgecvar.h
+++ b/sys/arch/vax/if/sgecvar.h
@@ -1,5 +1,5 @@
-/* $OpenBSD: sgecvar.h,v 1.1 2000/04/27 03:14:44 bjc Exp $ */
-/* $NetBSD: sgecvar.h,v 1.1 1999/08/08 11:41:30 ragge Exp $ */
+/* $OpenBSD: sgecvar.h,v 1.2 2001/08/25 13:33:36 hugh Exp $ */
+/* $NetBSD: sgecvar.h,v 1.2 2000/06/04 02:14:14 matt Exp $ */
/*
* Copyright (c) 1999 Ludd, University of Lule}, Sweden. All rights reserved.
*
@@ -44,6 +44,7 @@ struct ze_cdata {
struct ze_softc {
struct device sc_dev; /* Configuration common part */
+ struct evcnt sc_intrcnt; /* Interrupt counters */
struct arpcom sc_ac; /* Ethernet common part */
#define sc_if sc_ac.ac_if /* network-visible interface */
bus_space_tag_t sc_iot;
diff --git a/sys/arch/vax/include/frame.h b/sys/arch/vax/include/frame.h
index fd092b47dbc..f83892f8195 100644
--- a/sys/arch/vax/include/frame.h
+++ b/sys/arch/vax/include/frame.h
@@ -1,5 +1,5 @@
-/* $OpenBSD: frame.h,v 1.2 1997/05/29 00:04:39 niklas Exp $ */
-/* $NetBSD: frame.h,v 1.1 1995/11/12 15:07:30 ragge Exp $ */
+/* $OpenBSD: frame.h,v 1.3 2001/08/25 13:33:36 hugh Exp $ */
+/* $NetBSD: frame.h,v 1.2 2000/06/04 19:30:15 matt Exp $ */
/*
* Copyright (c) 1995 Ludd, University of Lule}, Sweden.
* All rights reserved.
@@ -31,6 +31,9 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#ifndef _VAX_FRAME_H_
+#define _VAX_FRAME_H_
+
/*
* Description of calls frame on stack. This is the
* standard way of making procedure calls on vax systems.
@@ -46,6 +49,16 @@ struct callsframe {
/* This can be followed by more arguments */
};
-/* Offset to beginning of calls frame from first arg */
-#define FRAMEOFFSET(arg1) ((struct callsframe *)((unsigned int)&(arg1) - 24))
+struct icallsframe {
+ struct callsframe ica_frame; /* std call frame */
+ unsigned int ica_r0; /* interrupt saved r0 */
+ unsigned int ica_r1; /* interrupt saved r1 */
+ unsigned int ica_r2; /* interrupt saved r2 */
+ unsigned int ica_r3; /* interrupt saved r3 */
+ unsigned int ica_r4; /* interrupt saved r4 */
+ unsigned int ica_r5; /* interrupt saved r5 */
+ unsigned int ica_pc; /* interrupt saved pc */
+ unsigned int ica_psl; /* interrupt saved psl */
+};
+#endif /* _VAX_FRAME_H */
diff --git a/sys/arch/vax/include/ioa.h b/sys/arch/vax/include/ioa.h
index e818d109080..5518d18a36f 100644
--- a/sys/arch/vax/include/ioa.h
+++ b/sys/arch/vax/include/ioa.h
@@ -1,5 +1,5 @@
-/* $OpenBSD: ioa.h,v 1.6 2001/08/12 12:03:03 heko Exp $ */
-/* $NetBSD: ioa.h,v 1.5 1999/04/12 20:57:52 pk Exp $ */
+/* $OpenBSD: ioa.h,v 1.7 2001/08/25 13:33:36 hugh Exp $ */
+/* $NetBSD: ioa.h,v 1.6 2000/01/24 02:40:32 matt Exp $ */
/*-
* Copyright (c) 1982, 1986 The Regents of the University of California.
* All rights reserved.
diff --git a/sys/arch/vax/include/nexus.h b/sys/arch/vax/include/nexus.h
index 7c50f1e1fec..9a377317deb 100644
--- a/sys/arch/vax/include/nexus.h
+++ b/sys/arch/vax/include/nexus.h
@@ -1,5 +1,5 @@
-/* $OpenBSD: nexus.h,v 1.8 2000/04/26 03:08:42 bjc Exp $ */
-/* $NetBSD: nexus.h,v 1.15 1999/08/07 10:36:46 ragge Exp $ */
+/* $OpenBSD: nexus.h,v 1.9 2001/08/25 13:33:36 hugh Exp $ */
+/* $NetBSD: nexus.h,v 1.17 2000/06/04 17:58:19 ragge Exp $ */
/*-
* Copyright (c) 1982, 1986 The Regents of the University of California.
@@ -38,6 +38,9 @@
#ifndef _VAX_NEXUS_H_
#define _VAX_NEXUS_H_
+
+#include <machine/bus.h>
+
/*
* Different definitions for nicer autoconf probing.
*/
@@ -97,10 +100,10 @@ struct nexus {
};
struct sbi_attach_args {
- u_int nexnum; /* This nexus TR number */
- u_int type; /* This nexus type */
- int nexinfo; /* Some info sent between attach & match */
- void *nexaddr; /* Virtual address of this nexus */
+ int sa_nexnum; /* This nexus TR number */
+ int sa_type; /* This nexus type */
+ bus_space_tag_t sa_iot;
+ bus_space_handle_t sa_ioh;
};
/* Memory device struct. This should be somewhere else */
@@ -118,9 +121,6 @@ struct bp_conf {
int bp_addr;
};
-extern caddr_t *nex_vec;
-#define nex_vec_num(ipl, nexnum) nex_vec[(ipl-14)*16+nexnum]
-
#endif
/*
@@ -136,7 +136,7 @@ extern caddr_t *nex_vec;
#define NEX_CFGFLT (0xfc000000)
#ifndef _LOCORE
-#if defined(VAX780) || defined(VAX8600)
+#if VAX780 || VAX8600
#define NEXFLT_BITS \
"\20\40PARFLT\37WSQFLT\36URDFLT\35ISQFLT\34MXTFLT\33XMTFLT"
#endif
@@ -182,9 +182,10 @@ extern caddr_t *nex_vec;
#define NEX_MEM256I 0x74 /* 256K chips, interleaved */
/* Memory classes */
-#define M780C 0
-#define M780EL 1
-#define M780EU 2
+#define M_NONE 0
+#define M780C 1
+#define M780EL 2
+#define M780EU 3
/* Memory recover defines */
#define MCHK_PANIC -1
diff --git a/sys/arch/vax/include/scb.h b/sys/arch/vax/include/scb.h
index 745c2a372aa..c870085725f 100644
--- a/sys/arch/vax/include/scb.h
+++ b/sys/arch/vax/include/scb.h
@@ -1,5 +1,5 @@
-/* $OpenBSD: scb.h,v 1.5 2000/04/26 03:08:42 bjc Exp $ */
-/* $NetBSD: scb.h,v 1.6 2000/01/24 02:40:32 matt Exp $ */
+/* $OpenBSD: scb.h,v 1.6 2001/08/25 13:33:36 hugh Exp $ */
+/* $NetBSD: scb.h,v 1.11 2000/07/10 09:14:34 ragge Exp $ */
/*
* Copyright (c) 1994 Ludd, University of Lule}, Sweden.
@@ -108,13 +108,34 @@ struct scb {
#define SCB_KSTACK 0
#define SCB_ISTACK 1
+#define vecnum(bus, ipl, tr) (256+(ipl-0x14)*64+tr*4+bus*256)
+
+/*
+ * This struct is used when setting up interrupt vectors dynamically.
+ * It put a opaque 32 bit quanity on the stack and also has a placeholder
+ * for evcnt structure.
+ */
+struct ivec_dsp {
+ char pushr; /* pushr */
+ char pushrarg; /* $0x3f */
+ char jsb;
+ char mode;
+ long displacement;
+ void (*hoppaddr)(void *);
+ void *pushlarg;
+ struct evcnt *ev;
+};
+
#ifdef _KERNEL
+extern const struct ivec_dsp idsptch;
extern struct scb *scb;
+extern struct ivec_dsp *scb_vec;
+extern struct evcnt devipl_intrcnts[4]; /* IPL 2[0123] */
-extern paddr_t scb_init __P((paddr_t));
-extern int scb_vecref __P((int *, int *));
-extern void scb_fake __P((int, int));
-extern void scb_vecalloc __P((int, void(*)(void *), void *, int));
+extern paddr_t scb_init (paddr_t);
+extern int scb_vecref (int *, int *);
+extern void scb_fake (int, int);
+extern void scb_vecalloc (int, void(*)(void *), void *, int, struct evcnt *);
#endif /* _KERNEL */
#endif /* _VAX_SCB_H */
diff --git a/sys/arch/vax/include/trap.h b/sys/arch/vax/include/trap.h
index 5b19bbb71e3..499c7e6d80d 100644
--- a/sys/arch/vax/include/trap.h
+++ b/sys/arch/vax/include/trap.h
@@ -1,5 +1,5 @@
-/* $OpenBSD: trap.h,v 1.10 2000/04/26 03:08:43 bjc Exp $ */
-/* $NetBSD: trap.h,v 1.17 2000/01/24 02:40:32 matt Exp $ */
+/* $OpenBSD: trap.h,v 1.11 2001/08/25 13:33:36 hugh Exp $ */
+/* $NetBSD: trap.h,v 1.18 2000/06/04 02:19:26 matt Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
@@ -92,26 +92,6 @@ struct trapframe {
long psl; /* User psl */
};
-/*
- * This struct is used when setting up interrupt vectors dynamically.
- * It pushes a longword between 0-63 on the stack; this number is
- * normally used as the ctlr number on devices. This use effectively
- * limits the number of interruptable ctlrs on one unibus to 64.
- */
-struct ivec_dsp {
- char pushr; /* pushr */
- char pushrarg; /* $0x3f */
- char jsb;
- char mode;
- long displacement;
- void (*hoppaddr) __P((void *));
- void *pushlarg;
-};
-
-#ifdef _KERNEL
-extern const struct ivec_dsp idsptch;
-#endif
-
#endif /* _LOCORE */
#endif /* _VAX_TRAP_H_ */
diff --git a/sys/arch/vax/include/vsbus.h b/sys/arch/vax/include/vsbus.h
index 1c0eb6af228..2b99b7d7758 100644
--- a/sys/arch/vax/include/vsbus.h
+++ b/sys/arch/vax/include/vsbus.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: vsbus.h,v 1.5 2000/10/09 23:11:57 bjc Exp $ */
+/* $OpenBSD: vsbus.h,v 1.6 2001/08/25 13:33:36 hugh Exp $ */
/* $NetBSD: vsbus.h,v 1.13 2000/06/25 16:00:46 ragge Exp $ */
/*
* Copyright (c) 1996 Ludd, University of Lule}, Sweden.
@@ -44,29 +44,6 @@
#include <machine/bus.h>
#include <machine/sgmap.h>
-struct vsbus_softc {
- struct device sc_dev;
-#if 0
- volatile struct vs_cpu *sc_cpu;
-#endif
- u_char *sc_intmsk; /* Mask register */
- u_char *sc_intclr; /* Clear interrupt register */
- u_char *sc_intreq; /* Interrupt request register */
- u_char sc_mask; /* Interrupts to enable after autoconf */
- vaddr_t sc_vsregs; /* Where the VS_REGS are mapped */
- vaddr_t sc_dmaaddr; /* Mass storage virtual DMA area */
- vsize_t sc_dmasize; /* Size of the DMA area */
-
- struct vax_bus_dma_tag sc_dmatag;
- struct vax_sgmap sc_sgmap;
-};
-
-struct vsbus_dma {
- SIMPLEQ_ENTRY(vsbus_dma) vd_q;
- void (*vd_go)(void *);
- void *vd_arg;
-};
-
struct confargs {
char ca_name[16]; /* device name */
int ca_intslot; /* device interrupt-slot */
@@ -143,14 +120,33 @@ struct vsbus_attach_args {
#define SMADDR 0x30000000
#define SMSIZE 0x20000 /* Actually 256k, only 128k used */
+struct vsbus_softc {
+ struct device sc_dev;
+ u_char *sc_intmsk; /* Mask register */
+ u_char *sc_intclr; /* Clear interrupt register */
+ u_char *sc_intreq; /* Interrupt request register */
+ u_char sc_mask; /* Interrupts to enable after autoconf */
+ vaddr_t sc_vsregs; /* Where the VS_REGS are mapped */
+ vaddr_t sc_dmaaddr; /* Mass storage virtual DMA area */
+ vsize_t sc_dmasize; /* Size of the DMA area */
+
+ struct vax_bus_dma_tag sc_dmatag;
+ struct vax_sgmap sc_sgmap;
+};
+
+struct vsbus_dma {
+ SIMPLEQ_ENTRY(vsbus_dma) vd_q;
+ void (*vd_go)(void *);
+ void *vd_arg;
+};
+
#ifdef _KERNEL
-void vsbus_dma_init __P((struct vsbus_softc *, unsigned ptecnt));
-u_char vsbus_setmask __P((unsigned char));
-void vsbus_clrintr __P((unsigned char));
-void vsbus_intr __P((void *));
-void vsbus_copytoproc __P((struct proc *, caddr_t, caddr_t, int));
-void vsbus_copyfromproc __P((struct proc *, caddr_t, caddr_t, int));
-void vsbus_dma_start __P((struct vsbus_dma *));
-void vsbus_dma_intr __P((void));
+void vsbus_dma_init(struct vsbus_softc *, unsigned ptecnt);
+u_char vsbus_setmask(int);
+void vsbus_clrintr(int);
+void vsbus_copytoproc(struct proc *, caddr_t, caddr_t, int);
+void vsbus_copyfromproc(struct proc *, caddr_t, caddr_t, int);
+void vsbus_dma_start(struct vsbus_dma *);
+void vsbus_dma_intr(void);
#endif
#endif /* _VAX_VSBUS_H_ */
diff --git a/sys/arch/vax/qbus/dz.c b/sys/arch/vax/qbus/dz.c
index 1beb48682de..5367934003b 100644
--- a/sys/arch/vax/qbus/dz.c
+++ b/sys/arch/vax/qbus/dz.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: dz.c,v 1.5 2001/08/19 23:54:27 miod Exp $ */
-/* $NetBSD: dz.c,v 1.19 2000/01/24 02:40:29 matt Exp $ */
+/* $OpenBSD: dz.c,v 1.6 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: dz.c,v 1.23 2000/06/04 02:14:12 matt Exp $ */
/*
* Copyright (c) 1996 Ken C. Wellsch. All rights reserved.
* Copyright (c) 1992, 1993
@@ -110,10 +110,10 @@ static struct speedtab dzspeedtab[] =
{ -1, -1 }
};
-static void dzstart __P((struct tty *));
-static int dzparam __P((struct tty *, struct termios *));
-static unsigned dzmctl __P((struct dz_softc *, int, int, int));
-static void dzscan __P((void *));
+static void dzstart(struct tty *);
+static int dzparam(struct tty *, struct termios *);
+static unsigned dzmctl(struct dz_softc *, int, int, int);
+static void dzscan(void *);
struct cfdriver dz_cd = {
NULL, "dz", DV_TTY
@@ -133,10 +133,9 @@ struct timeout dz_timeout;
#define DZ_DZV 4 /* Q-bus DZV-11 or DZQ-11 */
void
-dzattach(sc)
- struct dz_softc *sc;
+dzattach(struct dz_softc *sc)
{
- register int n;
+ int n;
sc->sc_rxint = sc->sc_brk = 0;
@@ -150,6 +149,9 @@ dzattach(sc)
for (n = 0; n < sc->sc_type; n++)
sc->sc_dz[n].dz_tty = ttymalloc();
+ evcnt_attach(&sc->sc_dev, "rintr", &sc->sc_rintrcnt);
+ evcnt_attach(&sc->sc_dev, "tintr", &sc->sc_tintrcnt);
+
/* Alas no interrupt on modem bit changes, so we manually scan */
if (dz_timer == 0) {
@@ -164,13 +166,12 @@ dzattach(sc)
/* Receiver Interrupt */
void
-dzrint(arg)
- void *arg;
+dzrint(void *arg)
{
struct dz_softc *sc = arg;
- register struct tty *tp;
- register int cc, line;
- register unsigned c;
+ struct tty *tp;
+ int cc, line;
+ unsigned c;
int overrun = 0;
sc->sc_rxint++;
@@ -220,13 +221,12 @@ dzrint(arg)
/* Transmitter Interrupt */
void
-dzxint(arg)
- void *arg;
+dzxint(void *arg)
{
- register struct dz_softc *sc = arg;
- register struct tty *tp;
- register struct clist *cl;
- register int line, ch, csr;
+ struct dz_softc *sc = arg;
+ struct tty *tp;
+ struct clist *cl;
+ int line, ch, csr;
u_char tcr;
/*
@@ -270,9 +270,6 @@ dzxint(arg)
tcr &= ~(1 << line);
DZ_WRITE_BYTE(dr_tcr, tcr);
- if (sc->sc_dz[line].dz_catch)
- continue;
-
if (tp->t_state & TS_FLUSH)
tp->t_state &= ~TS_FLUSH;
else
@@ -286,13 +283,10 @@ dzxint(arg)
}
int
-dzopen(dev, flag, mode, p)
- dev_t dev;
- int flag, mode;
- struct proc *p;
+dzopen(dev_t dev, int flag, int mode, struct proc *p)
{
- register struct tty *tp;
- register int unit, line;
+ struct tty *tp;
+ int unit, line;
struct dz_softc *sc;
int s, error = 0;
@@ -344,14 +338,11 @@ dzopen(dev, flag, mode, p)
/*ARGSUSED*/
int
-dzclose(dev, flag, mode, p)
- dev_t dev;
- int flag, mode;
- struct proc *p;
+dzclose(dev_t dev, int flag, int mode, struct proc *p)
{
struct dz_softc *sc;
- register struct tty *tp;
- register int unit, line;
+ struct tty *tp;
+ int unit, line;
unit = DZ_I2C(minor(dev));
@@ -373,11 +364,9 @@ dzclose(dev, flag, mode, p)
}
int
-dzread (dev, uio, flag)
- dev_t dev;
- struct uio *uio;
+dzread(dev_t dev, struct uio *uio, int flag)
{
- register struct tty *tp;
+ struct tty *tp;
struct dz_softc *sc;
sc = dz_cd.cd_devs[DZ_I2C(minor(dev))];
@@ -387,11 +376,9 @@ dzread (dev, uio, flag)
}
int
-dzwrite (dev, uio, flag)
- dev_t dev;
- struct uio *uio;
+dzwrite(dev_t dev, struct uio *uio, int flag)
{
- register struct tty *tp;
+ struct tty *tp;
struct dz_softc *sc;
sc = dz_cd.cd_devs[DZ_I2C(minor(dev))];
@@ -402,16 +389,11 @@ dzwrite (dev, uio, flag)
/*ARGSUSED*/
int
-dzioctl (dev, cmd, data, flag, p)
- dev_t dev;
- u_long cmd;
- caddr_t data;
- int flag;
- struct proc *p;
+dzioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
{
struct dz_softc *sc;
- register struct tty *tp;
- register int unit, line;
+ struct tty *tp;
+ int unit, line;
int error;
unit = DZ_I2C(minor(dev));
@@ -467,8 +449,7 @@ dzioctl (dev, cmd, data, flag, p)
}
struct tty *
-dztty (dev)
- dev_t dev;
+dztty(dev_t dev)
{
struct dz_softc *sc = dz_cd.cd_devs[DZ_I2C(minor(dev))];
struct tty *tp = sc->sc_dz[DZ_PORT(minor(dev))].dz_tty;
@@ -478,27 +459,20 @@ dztty (dev)
/*ARGSUSED*/
int
-dzstop(tp, flag)
- register struct tty *tp;
+dzstop(struct tty *tp, int flag)
{
- int s;
-
- s = spltty();
if (tp->t_state & TS_BUSY)
if (!(tp->t_state & TS_TTSTOP))
tp->t_state |= TS_FLUSH;
- splx(s);
-
- return 0;
+ return(0);
}
void
-dzstart(tp)
- register struct tty *tp;
+dzstart(struct tty *tp)
{
- register struct dz_softc *sc;
- register struct clist *cl;
- register int unit, line, s;
+ struct dz_softc *sc;
+ struct clist *cl;
+ int unit, line, s;
char state;
unit = DZ_I2C(minor(tp->t_dev));
@@ -530,16 +504,14 @@ dzstart(tp)
}
static int
-dzparam(tp, t)
- register struct tty *tp;
- register struct termios *t;
+dzparam(struct tty *tp, struct termios *t)
{
struct dz_softc *sc;
- register int cflag = t->c_cflag;
+ int cflag = t->c_cflag;
int unit, line;
int ispeed = ttspeedtab(t->c_ispeed, dzspeedtab);
int ospeed = ttspeedtab(t->c_ospeed, dzspeedtab);
- register unsigned lpr;
+ unsigned lpr;
int s;
unit = DZ_I2C(minor(tp->t_dev));
@@ -592,13 +564,11 @@ dzparam(tp, t)
}
static unsigned
-dzmctl(sc, line, bits, how)
- register struct dz_softc *sc;
- int line, bits, how;
+dzmctl(struct dz_softc *sc, int line, int bits, int how)
{
- register unsigned status;
- register unsigned mbits;
- register unsigned bit;
+ unsigned status;
+ unsigned mbits;
+ unsigned bit;
int s;
s = spltty();
@@ -671,12 +641,11 @@ dzmctl(sc, line, bits, how)
* Check to see if modem status bits have changed.
*/
static void
-dzscan(arg)
- void *arg;
+dzscan(void *arg)
{
- register struct dz_softc *sc;
- register struct tty *tp;
- register int n, bit, port;
+ struct dz_softc *sc;
+ struct tty *tp;
+ int n, bit, port;
unsigned csr;
int s;
@@ -728,3 +697,28 @@ dzscan(arg)
timeout_add(&dz_timeout, hz);
return;
}
+
+/*
+ * Called after an ubareset. The DZ card is reset, but the only thing
+ * that must be done is to start the receiver and transmitter again.
+ * No DMA setup to care about.
+ */
+void
+dzreset(struct device *dev)
+{
+ struct dz_softc *sc = (void *)dev;
+ struct tty *tp;
+ int i;
+
+ for (i = 0; i < sc->sc_type; i++) {
+ tp = sc->sc_dz[i].dz_tty;
+
+ if (((tp->t_state & TS_ISOPEN) == 0))
+ continue;
+
+ dzparam(tp, &tp->t_termios);
+ dzmctl(sc, i, DML_DTR, DMSET);
+ tp->t_state &= ~TS_BUSY;
+ dzstart(tp); /* Kick off transmitter again */
+ }
+}
diff --git a/sys/arch/vax/qbus/dz_uba.c b/sys/arch/vax/qbus/dz_uba.c
index d9595840a52..910e6fe9285 100644
--- a/sys/arch/vax/qbus/dz_uba.c
+++ b/sys/arch/vax/qbus/dz_uba.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: dz_uba.c,v 1.1 2000/04/27 03:14:47 bjc Exp $ */
-/* $NetBSD: dz_uba.c,v 1.8 2000/01/24 02:40:29 matt Exp $ */
+/* $OpenBSD: dz_uba.c,v 1.2 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: dz_uba.c,v 1.11 2000/06/04 06:17:02 matt Exp $ */
/*
* Copyright (c) 1998 Ludd, University of Lule}, Sweden. All rights reserved.
* Copyright (c) 1996 Ken C. Wellsch. All rights reserved.
@@ -74,7 +74,7 @@ dz_uba_match(parent, cf, aux)
struct uba_attach_args *ua = aux;
bus_space_tag_t iot = ua->ua_iot;
bus_space_handle_t ioh = ua->ua_ioh;
- register int n;
+ int n;
iot = iot; /* Silly GCC */
/* Reset controller to initialize, enable TX interrupts */
@@ -113,7 +113,7 @@ dz_uba_attach(parent, self, aux)
void *aux;
{
struct dz_softc *sc = (void *)self;
- register struct uba_attach_args *ua = aux;
+ struct uba_attach_args *ua = aux;
sc->sc_iot = ua->ua_iot;
sc->sc_ioh = ua->ua_ioh;
@@ -130,8 +130,11 @@ dz_uba_attach(parent, self, aux)
sc->sc_type = DZ_DZ;
/* Now register the TX & RX interrupt handlers */
- uba_intr_establish(ua->ua_icookie, ua->ua_cvec, dzxint, sc);
- uba_intr_establish(ua->ua_icookie, ua->ua_cvec - 4, dzrint, sc);
+ uba_intr_establish(ua->ua_icookie, ua->ua_cvec,
+ dzxint, sc, &sc->sc_tintrcnt);
+ uba_intr_establish(ua->ua_icookie, ua->ua_cvec - 4,
+ dzrint, sc, &sc->sc_rintrcnt);
+ uba_reset_establish(dzreset, self);
dzattach(sc);
}
diff --git a/sys/arch/vax/qbus/dzvar.h b/sys/arch/vax/qbus/dzvar.h
index f429b085830..2ece7a31ff3 100644
--- a/sys/arch/vax/qbus/dzvar.h
+++ b/sys/arch/vax/qbus/dzvar.h
@@ -1,5 +1,5 @@
-/* $OpenBSD: dzvar.h,v 1.2 2001/05/16 22:15:18 hugh Exp $ */
-/* $NetBSD: dzvar.h,v 1.6 2000/01/24 02:40:29 matt Exp $ */
+/* $OpenBSD: dzvar.h,v 1.3 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: dzvar.h,v 1.8 2000/06/04 02:14:12 matt Exp $ */
/*
* Copyright (c) 1996 Ken C. Wellsch. All rights reserved.
* Copyright (c) 1992, 1993
@@ -51,6 +51,8 @@
struct dz_softc {
struct device sc_dev; /* Autoconf blaha */
+ struct evcnt sc_rintrcnt; /* recevive interrupt counts */
+ struct evcnt sc_tintrcnt; /* transmit interrupt counts */
struct dz_regs sc_dr; /* reg pointers */
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
@@ -62,7 +64,7 @@ struct dz_softc {
struct dz_softc *dz_sc; /* backpointer to softc */
int dz_line; /* sub-driver unit number */
void *dz_private; /* sub-driver data pointer */
- int (*dz_catch) __P((void *, int)); /* Fast catch recv */
+ int (*dz_catch)(void *, int); /* Fast catch recv */
struct tty * dz_tty; /* what we work on */
#ifdef notyet
caddr_t dz_mem; /* pointers to clist output */
@@ -71,6 +73,7 @@ struct dz_softc {
} sc_dz[NDZLINE];
};
-void dzattach __P((struct dz_softc *));
-void dzrint __P((void *));
-void dzxint __P((void *));
+void dzattach(struct dz_softc *);
+void dzrint(void *);
+void dzxint(void *);
+void dzreset(struct device *);
diff --git a/sys/arch/vax/qbus/uba.c b/sys/arch/vax/qbus/uba.c
index 13844d68105..cb71db90a7c 100644
--- a/sys/arch/vax/qbus/uba.c
+++ b/sys/arch/vax/qbus/uba.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: uba.c,v 1.1 2000/04/27 03:14:49 bjc Exp $ */
-/* $NetBSD: uba.c,v 1.49 2000/01/24 02:40:30 matt Exp $ */
+/* $OpenBSD: uba.c,v 1.2 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: uba.c,v 1.52 2000/06/04 02:14:12 matt Exp $ */
/*
* Copyright (c) 1996 Jonathan Stone.
* Copyright (c) 1994, 1996 Ludd, University of Lule}, Sweden.
@@ -61,8 +61,8 @@
#include <arch/vax/qbus/ubavar.h>
-static int ubasearch __P((struct device *, struct cfdata *, void *));
-static int ubaprint __P((void *, const char *));
+static int ubasearch (struct device *, struct cfdata *, void *);
+static int ubaprint (void *, const char *);
struct cfdriver uba_cd = {
NULL, "uba", DV_DULL
@@ -75,8 +75,7 @@ struct cfdriver uba_cd = {
* Unibus systems, Qbus systems have more map registers than usable.
*/
void
-uba_enqueue(uu)
- struct uba_unit *uu;
+uba_enqueue(struct uba_unit *uu)
{
struct uba_softc *uh;
int s;
@@ -95,8 +94,7 @@ uba_enqueue(uu)
* This routine must be called at splimp.
*/
void
-uba_done(uh)
- struct uba_softc *uh;
+uba_done(struct uba_softc *uh)
{
struct uba_unit *uu;
@@ -110,24 +108,44 @@ uba_done(uh)
}
/*
+ * Each device that needs some handling if an ubareset occurs must
+ * register for reset first through this routine.
+ */
+void
+uba_reset_establish(void (*reset)(struct device *), struct device *dev)
+{
+ struct uba_softc *uh = (void *)dev->dv_parent;
+ struct uba_reset *ur;
+
+ ur = malloc(sizeof(struct uba_reset), M_DEVBUF, M_NOWAIT);
+ ur->ur_dev = dev;
+ ur->ur_reset = reset;
+
+ SIMPLEQ_INSERT_TAIL(&uh->uh_resetq, ur, ur_resetq);
+}
+
+/*
* Generate a reset on uba number uban. Then
* call each device that asked to be called during attach,
* giving it a chance to clean up so as to be able to continue.
*/
void
-ubareset(uban)
- int uban;
+ubareset(struct uba_softc *uh)
{
- register struct uba_softc *uh = uba_cd.cd_devs[uban];
- int s, i;
+ struct uba_reset *ur;
+ int s;
s = splimp();
SIMPLEQ_INIT(&uh->uh_resq);
printf("%s: reset", uh->uh_dev.dv_xname);
(*uh->uh_ubainit)(uh);
- for (i = 0; i < uh->uh_resno; i++)
- (*uh->uh_reset[i])(uh->uh_resarg[i]);
+ ur = SIMPLEQ_FIRST(&uh->uh_resetq);
+ if (ur) do {
+ printf(" %s", ur->ur_dev->dv_xname);
+ (*ur->ur_reset)(ur->ur_dev);
+ } while ((ur = SIMPLEQ_NEXT(ur, ur_resetq)));
+
printf("\n");
splx(s);
}
@@ -137,9 +155,7 @@ ubareset(uban)
* Calls the scan routine to search for uba devices.
*/
void
-uba_attach(sc, iopagephys)
- struct uba_softc *sc;
- paddr_t iopagephys;
+uba_attach(struct uba_softc *sc, paddr_t iopagephys)
{
/*
@@ -149,6 +165,7 @@ uba_attach(sc, iopagephys)
*/
sc->uh_lastiv = 0x200;
SIMPLEQ_INIT(&sc->uh_resq);
+ SIMPLEQ_INIT(&sc->uh_resetq);
/*
* Allocate place for unibus I/O space in virtual space.
@@ -168,10 +185,7 @@ uba_attach(sc, iopagephys)
}
int
-ubasearch(parent, cf, aux)
- struct device *parent;
- struct cfdata *cf;
- void *aux;
+ubasearch(struct device *parent, struct cfdata *cf, void *aux)
{
struct uba_softc *sc = (struct uba_softc *)parent;
struct uba_attach_args ua;
@@ -180,7 +194,6 @@ ubasearch(parent, cf, aux)
ua.ua_ioh = ubdevreg(cf->cf_loc[0]) + sc->uh_ioh;
ua.ua_iot = sc->uh_iot;
ua.ua_dmat = sc->uh_dmat;
- ua.ua_reset = NULL;
if (badaddr((caddr_t)ua.ua_ioh, 2) ||
(sc->uh_errchk ? (*sc->uh_errchk)(sc):0))
@@ -200,24 +213,6 @@ ubasearch(parent, cf, aux)
goto fail;
if (vec == 0)
goto fail;
-
- if (ua.ua_reset) { /* device wants ubareset */
- if (sc->uh_resno == 0) {
-#define RESETSIXE 128
- sc->uh_reset = malloc(sizeof(void *) * RESETSIXE,
- M_DEVBUF, M_NOWAIT);
- sc->uh_resarg = malloc(sizeof(void *) * RESETSIXE,
- M_DEVBUF, M_NOWAIT);
- }
- if (sc->uh_resno < RESETSIXE) {
- sc->uh_resarg[sc->uh_resno] = cf->cf_unit;
- sc->uh_reset[sc->uh_resno++] = ua.ua_reset;
- } else {
- printf("%s: Expand reset table, skipping reset %s%d\n",
- sc->uh_dev.dv_xname, cf->cf_driver->cd_name,
- cf->cf_unit);
- }
- }
ua.ua_br = br;
ua.ua_cvec = vec;
@@ -239,9 +234,7 @@ forgetit:
* Print out some interesting info common to all unibus devices.
*/
int
-ubaprint(aux, uba)
- void *aux;
- const char *uba;
+ubaprint(void *aux, const char *uba)
{
struct uba_attach_args *ua = aux;
@@ -254,11 +247,12 @@ ubaprint(aux, uba)
* Move to machdep eventually
*/
void
-uba_intr_establish(icookie, vec, ifunc, iarg)
+uba_intr_establish(icookie, vec, ifunc, iarg, ev)
void *icookie;
int vec;
void (*ifunc)(void *iarg);
void *iarg;
+ struct evcnt *ev;
{
- scb_vecalloc(vec, ifunc, iarg, SCB_ISTACK);
+ scb_vecalloc(vec, ifunc, iarg, SCB_ISTACK, ev);
}
diff --git a/sys/arch/vax/qbus/ubavar.h b/sys/arch/vax/qbus/ubavar.h
index 942b8eb7af7..90a086a003d 100644
--- a/sys/arch/vax/qbus/ubavar.h
+++ b/sys/arch/vax/qbus/ubavar.h
@@ -1,5 +1,5 @@
-/* $OpenBSD: ubavar.h,v 1.1 2000/04/27 03:14:49 bjc Exp $ */
-/* $NetBSD: ubavar.h,v 1.26 2000/01/24 02:40:30 matt Exp $ */
+/* $OpenBSD: ubavar.h,v 1.2 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: ubavar.h,v 1.29 2000/06/04 06:17:04 matt Exp $ */
/*
* Copyright (c) 1982, 1986 Regents of the University of California.
@@ -70,10 +70,9 @@
*/
struct uba_softc {
struct device uh_dev; /* Device struct, autoconfig */
+ struct evcnt uh_intrcnt; /* interrupt counting */
SIMPLEQ_HEAD(, uba_unit) uh_resq; /* resource wait chain */
- void (**uh_reset) __P((int));/* UBA reset function array */
- int *uh_resarg; /* array of ubareset args */
- int uh_resno; /* Number of devices to reset */
+ SIMPLEQ_HEAD(, uba_reset) uh_resetq; /* ubareset queue */
int uh_lastiv; /* last free interrupt vector */
int (*uh_errchk) __P((struct uba_softc *));
void (*uh_beforescan) __P((struct uba_softc *));
@@ -103,6 +102,16 @@ struct uba_unit {
};
/*
+ * Reset structure. All devices that needs to be reinitialized
+ * after an ubareset registers with this struct.
+ */
+struct uba_reset {
+ SIMPLEQ_ENTRY(uba_reset) ur_resetq;
+ void (*ur_reset)(struct device *);
+ struct device *ur_dev;
+};
+
+/*
* uba_attach_args is used during autoconfiguration. It is sent
* from ubascan() to each (possible) device.
*/
@@ -111,8 +120,6 @@ struct uba_attach_args {
bus_addr_t ua_ioh; /* I/O regs addr */
bus_dma_tag_t ua_dmat;
void *ua_icookie; /* Cookie for interrupt establish */
- /* UBA reset routine, filled in by probe */
- void (*ua_reset) __P((int));
int ua_iaddr; /* Full CSR address of device */
int ua_br; /* IPL this dev interrupted on */
int ua_cvec; /* Vector for this device */
@@ -135,14 +142,12 @@ struct uba_attach_args {
#define ubdevreg(addr) ((addr) & 017777)
#ifdef _KERNEL
-#define b_forw b_hash.le_next /* Nice to have when handling uba queues */
-
-void uba_intr_establish __P((void *, int, void (*)(void *), void *));
-void uba_attach __P((struct uba_softc *, unsigned long));
-void uba_enqueue __P((struct uba_unit *));
-void uba_done __P((struct uba_softc *));
-void ubareset __P((int));
-
+void uba_intr_establish(void *, int, void (*)(void *), void *, struct evcnt *);
+void uba_reset_establish(void (*)(struct device *), struct device *);
+void uba_attach(struct uba_softc *, unsigned long);
+void uba_enqueue(struct uba_unit *);
+void uba_done(struct uba_softc *);
+void ubareset(struct uba_softc *);
#endif /* _KERNEL */
#endif /* _QBUS_UBAVAR_H */
diff --git a/sys/arch/vax/qbus/uda.c b/sys/arch/vax/qbus/uda.c
index ae91879ef04..791e5c03dee 100644
--- a/sys/arch/vax/qbus/uda.c
+++ b/sys/arch/vax/qbus/uda.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: uda.c,v 1.1 2000/04/27 03:14:49 bjc Exp $ */
-/* $NetBSD: uda.c,v 1.32 2000/01/24 02:40:30 matt Exp $ */
+/* $OpenBSD: uda.c,v 1.2 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: uda.c,v 1.36 2000/06/04 06:17:05 matt Exp $ */
/*
* Copyright (c) 1996 Ludd, University of Lule}, Sweden.
* Copyright (c) 1988 Regents of the University of California.
@@ -63,6 +63,7 @@
*/
struct uda_softc {
struct device sc_dev; /* Autoconfig info */
+ struct evcnt sc_intrcnt; /* Interrupt counting */
struct uba_unit sc_unit; /* Struct common for UBA to communicate */
struct mscp_pack *sc_uuda; /* Unibus address of uda struct */
struct mscp_pack sc_uda; /* Struct for uda communication */
@@ -79,10 +80,8 @@ struct uda_softc {
static int udamatch __P((struct device *, struct cfdata *, void *));
static void udaattach __P((struct device *, struct device *, void *));
-static void udareset __P((int));
-static void mtcreset __P((int));
-static void reset __P((struct uda_softc *));
-static void intr __P((void *));
+static void udareset(struct device *);
+static void udaintr __P((void *));
int udaready __P((struct uba_unit *));
void udactlrdone __P((struct device *));
int udaprint __P((void *, const char *));
@@ -177,12 +176,6 @@ again:
}
/* should have interrupted by now */
- if (strcmp(cf->cf_driver->cd_name, mtc_cd.cd_name)) {
- ua->ua_reset = udareset;
- } else {
- ua->ua_reset = mtcreset;
- }
-
return 1;
bad:
if (++tries < 2)
@@ -206,7 +199,10 @@ udaattach(parent, self, aux)
uh->uh_lastiv -= 4; /* remove dynamic interrupt vector */
- uba_intr_establish(ua->ua_icookie, ua->ua_cvec, intr, sc);
+ uba_intr_establish(ua->ua_icookie, ua->ua_cvec,
+ udaintr, sc, &sc->sc_intrcnt);
+ uba_reset_establish(udareset, &sc->sc_dev);
+ evcnt_attach(&sc->sc_dev, "intr", &sc->sc_intrcnt);
sc->sc_iot = ua->ua_iot;
sc->sc_iph = ua->ua_ioh;
@@ -299,7 +295,7 @@ udago(usc, mxi)
*/
if (sc->sc_inq == 0) {
err = bus_dmamap_load(sc->sc_dmat, mxi->mxi_dmam,
- bp->b_un.b_addr,
+ bp->b_data,
bp->b_bcount, bp->b_proc, BUS_DMA_NOWAIT);
if (err == 0) {
mscp_dgo(sc->sc_softc, mxi);
@@ -331,7 +327,7 @@ udaready(uu)
struct buf *bp = mxi->mxi_bp;
int err;
- err = bus_dmamap_load(sc->sc_dmat, mxi->mxi_dmam, bp->b_un.b_addr,
+ err = bus_dmamap_load(sc->sc_dmat, mxi->mxi_dmam, bp->b_data,
bp->b_bcount, bp->b_proc, BUS_DMA_NOWAIT);
if (err)
return 0;
@@ -396,8 +392,8 @@ udasaerror(usc, doreset)
int doreset;
{
struct uda_softc *sc = (void *)usc;
- register int code = bus_space_read_2(sc->sc_iot, sc->sc_sah, 0);
- register struct saerr *e;
+ int code = bus_space_read_2(sc->sc_iot, sc->sc_sah, 0);
+ struct saerr *e;
if ((code & MP_ERR) == 0)
return;
@@ -421,7 +417,7 @@ udasaerror(usc, doreset)
* interrupts, and process responses.
*/
static void
-intr(arg)
+udaintr(arg)
void *arg;
{
struct uda_softc *sc = arg;
@@ -456,26 +452,10 @@ intr(arg)
* A Unibus reset has occurred on UBA uban. Reinitialise the controller(s)
* on that Unibus, and requeue outstanding I/O.
*/
-void
-udareset(ctlr)
- int ctlr;
-{
- reset(uda_cd.cd_devs[ctlr]);
-}
-
-void
-mtcreset(ctlr)
- int ctlr;
-{
- reset(mtc_cd.cd_devs[ctlr]);
-}
-
static void
-reset(sc)
- struct uda_softc *sc;
+udareset(struct device *dev)
{
- printf(" %s", sc->sc_dev.dv_xname);
-
+ struct uda_softc *sc = (void *)dev;
/*
* Our BDP (if any) is gone; our command (if any) is
* flushed; the device is no longer mapped; and the
diff --git a/sys/arch/vax/stand/boot/autoconf.c b/sys/arch/vax/stand/boot/autoconf.c
index 44dc0e0ba06..85cc3b0c0e6 100644
--- a/sys/arch/vax/stand/boot/autoconf.c
+++ b/sys/arch/vax/stand/boot/autoconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: autoconf.c,v 1.4 2001/01/28 01:21:32 hugh Exp $ */
+/* $OpenBSD: autoconf.c,v 1.5 2001/08/25 13:33:36 hugh Exp $ */
/* $NetBSD: autoconf.c,v 1.5 1999/08/23 19:09:27 ragge Exp $ */
/*
* Copyright (c) 1994, 1998 Ludd, University of Lule}, Sweden.
@@ -37,8 +37,7 @@
#include "sys/param.h"
#include "../../include/mtpr.h"
#include "../../include/sid.h"
-#include "../../include/trap.h"
-#include "../../include/frame.h"
+#include "../../include/scb.h"
#include "vaxstand.h"
extern const struct ivec_dsp idsptch; /* since we are not KERNEL */
@@ -191,10 +190,10 @@ scbinit()
int i;
/*
- * Allocate space. We need one page for the SCB, and 128*16 == 2k
+ * Allocate space. We need one page for the SCB, and 128*20 == 2.5k
* for the vectors. The SCB must be on a page boundary.
*/
- i = alloc(VAX_NBPG * 6) + VAX_PGOFSET;
+ i = (int)alloc(VAX_NBPG + 128*sizeof(scb_vec[0])) + VAX_PGOFSET;
i &= ~VAX_PGOFSET;
mtpr(i, PR_SCBB);
@@ -203,9 +202,11 @@ scbinit()
for (i = 0; i < 128; i++) {
scb[i] = &scb_vec[i];
- (int)scb[i] |= 1; /* Only interrupt stack */
- memcpy(&scb_vec[i], &idsptch, sizeof(struct ivec_dsp));
+ (int)scb[i] |= SCB_ISTACK; /* Only interrupt stack */
+ scb_vec[i] = idsptch;
scb_vec[i].hoppaddr = scb_stray;
+ scb_vec[i].pushlarg = (void *) (i * 4);
+ scb_vec[i].ev = NULL;
}
scb_vec[0xc0/4].hoppaddr = rtimer;
@@ -238,19 +239,23 @@ rtimer()
}
asm("
+ .align 2
.globl _idsptch, _eidsptch
_idsptch:
- pushr $0x3f
- pushl $1
- .long 0x9f01fb01
- .long 0x12345678
-#
-# gas do not accept this :-/ use hexcode instead
-# nop
-# calls $1, *$0x12345678
- popr $0x3f
- rei
+ pushr $0x3f
+ .word 0x9f16
+ .long _cmn_idsptch
+ .long 0
+ .long 0
+ .long 0
_eidsptch:
+
+_cmn_idsptch:
+ movl (sp)+,r0
+ pushl 4(r0)
+ calls $1,*(r0)
+ popr $0x3f
+ rei
");
/*
@@ -261,14 +266,10 @@ void
scb_stray(arg)
int arg;
{
- static struct callsframe *cf;
- static int vector, ipl, *a;
+ static int vector, ipl;
- cf = FRAMEOFFSET(arg);
- a = &cf->ca_arg1;
ipl = mfpr(PR_IPL);
- vector = ((cf->ca_pc - (u_int)scb_vec)/4) & ~3;
- printf("stray interrupt: pc %x vector 0x%x, ipl %d\n",
- cf->ca_pc, vector, ipl);
+ vector = (int) arg;
+ printf("stray interrupt: vector 0x%x, ipl %d\n", vector, ipl);
}
diff --git a/sys/arch/vax/uba/uba.c b/sys/arch/vax/uba/uba.c
index 5d06ea578aa..54dd5a55021 100644
--- a/sys/arch/vax/uba/uba.c
+++ b/sys/arch/vax/uba/uba.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: uba.c,v 1.9 2000/04/27 03:14:51 bjc Exp $ */
-/* $NetBSD: uba.c,v 1.42 1999/02/02 18:37:20 ragge Exp $ */
+/* $OpenBSD: uba.c,v 1.10 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: uba.c,v 1.43 2000/01/24 02:40:36 matt Exp $ */
/*
* Copyright (c) 1996 Jonathan Stone.
* Copyright (c) 1994, 1996 Ludd, University of Lule}, Sweden.
@@ -201,10 +201,9 @@ void
uba_dw780int(uba)
int uba;
{
- int br, vec, arg;
+ int br, vec;
struct uba_softc *sc = uba_cd.cd_devs[uba];
struct uba_regs *ur = sc->uh_uba;
- void (*func) __P((int));
br = mfpr(PR_IPL);
vec = ur->uba_brrvr[br - 0x14];
@@ -216,10 +215,9 @@ uba_dw780int(uba)
if (cold)
scb_fake(vec + sc->uh_ibase, br);
else {
- struct ivec_dsp *scb_vec = (struct ivec_dsp *)((int)scb + 512);
- func = scb_vec[vec/4].hoppaddr;
- arg = scb_vec[vec/4].pushlarg;
- (*func)(arg);
+ struct ivec_dsp *scb_vec = (struct ivec_dsp *)((int)scb + 512 + vec * 4);
+ (*scb_vec->hoppaddr)(scb_vec->pushlarg);
+
}
}
diff --git a/sys/arch/vax/uba/ubareg.h b/sys/arch/vax/uba/ubareg.h
index fc882153aff..1eddbc950a6 100644
--- a/sys/arch/vax/uba/ubareg.h
+++ b/sys/arch/vax/uba/ubareg.h
@@ -1,5 +1,5 @@
-/* $OpenBSD: ubareg.h,v 1.8 2000/04/27 03:14:51 bjc Exp $ */
-/* $NetBSD: ubareg.h,v 1.10 1998/10/18 18:51:30 ragge Exp $ */
+/* $OpenBSD: ubareg.h,v 1.9 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: ubareg.h,v 1.11 2000/01/24 02:40:36 matt Exp $ */
/*-
* Copyright (c) 1982, 1986 The Regents of the University of California.
@@ -67,7 +67,7 @@
#define DW730 3 /* has adaptor regs, no sr: 750, 730 */
#endif
-#if VAX630 || VAX650
+#if VAX630 || VAX650 || VAX660 || VAX670
#define QBA 4 /* 22-bit Q-bus, no adaptor regs: uVAX II */
#endif
diff --git a/sys/arch/vax/vax/clock.c b/sys/arch/vax/vax/clock.c
index 42942af7939..239473154bb 100644
--- a/sys/arch/vax/vax/clock.c
+++ b/sys/arch/vax/vax/clock.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: clock.c,v 1.11 2001/02/11 06:34:37 hugh Exp $ */
-/* $NetBSD: clock.c,v 1.28 1999/05/01 16:13:43 ragge Exp $ */
+/* $OpenBSD: clock.c,v 1.12 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: clock.c,v 1.35 2000/06/04 06:16:58 matt Exp $ */
/*
* Copyright (c) 1995 Ludd, University of Lule}, Sweden.
* All rights reserved.
@@ -47,6 +47,8 @@
int yeartonum __P((int));
int numtoyear __P((int));
+struct evcnt clock_intrcnt;
+
/*
* microtime() should return number of usecs in struct timeval.
* We may get wrap-arounds, but that will be fixed with lasttime
@@ -71,6 +73,17 @@ microtime(tvp)
break;
}
#endif
+#ifdef VAX48
+ case VAX_BTYP_48: {
+ /*
+ * PR_ICR doesn't exist. We could use the vc_diagtimu
+ * counter, saving the value on the timer interrupt and
+ * subtracting that from the current value.
+ */
+ i = 0;
+ break;
+ }
+#endif
default:
i = mfpr(PR_ICR);
break;
@@ -162,8 +175,16 @@ delay(i)
void
cpu_initclocks()
{
+ /*
+ * The current evcnt mechanism sucks, so provide a struct
+ * device for vmstat's sake, until it can be replaced.
+ */
+ static struct device clockdev;
+ strcpy(clockdev.dv_xname, "clock");
+
mtpr(-10000, PR_NICR); /* Load in count register */
mtpr(0x800000d1, PR_ICCS); /* Start clock and enable interrupt */
+ evcnt_attach(&clockdev, "intr", &clock_intrcnt);
}
/*
diff --git a/sys/arch/vax/vax/genassym.cf b/sys/arch/vax/vax/genassym.cf
index 38c3413d4a3..888629311e0 100644
--- a/sys/arch/vax/vax/genassym.cf
+++ b/sys/arch/vax/vax/genassym.cf
@@ -1,4 +1,4 @@
-# $OpenBSD: genassym.cf,v 1.1 2000/04/27 01:10:11 bjc Exp $
+# $OpenBSD: genassym.cf,v 1.2 2001/08/25 13:33:37 hugh Exp $
# $NetBSD: genassym.cf,v 1.10 1999/11/19 22:09:55 ragge Exp $
#
# Copyright (c) 1997 Ludd, University of Lule}, Sweden.
@@ -108,6 +108,8 @@ define USPACE USPACE
define ENAMETOOLONG ENAMETOOLONG
+define EV_COUNT offsetof(struct evcnt, ev_count)
+
define SYS_sigreturn SYS_sigreturn
define SYS_exit SYS_exit
diff --git a/sys/arch/vax/vax/gencons.c b/sys/arch/vax/vax/gencons.c
index 2aacbabe813..4962482355b 100644
--- a/sys/arch/vax/vax/gencons.c
+++ b/sys/arch/vax/vax/gencons.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gencons.c,v 1.11 2001/06/15 22:45:33 miod Exp $ */
+/* $OpenBSD: gencons.c,v 1.12 2001/08/25 13:33:37 hugh Exp $ */
/* $NetBSD: gencons.c,v 1.22 2000/01/24 02:40:33 matt Exp $ */
/*
@@ -65,16 +65,10 @@ static int pr_txdb[4] = {PR_TXDB, PR_TXDB1, PR_TXDB2, PR_TXDB3};
static int pr_rxdb[4] = {PR_RXDB, PR_RXDB1, PR_RXDB2, PR_RXDB3};
cons_decl(gen);
-#ifdef DYNAMIC_DEVSW
-bcdev_decl(gencn);
-#else
cdev_decl(gencn);
-#endif
static int gencnparam __P((struct tty *, struct termios *));
static void gencnstart __P((struct tty *));
-void gencnrint __P((void *));
-void gencntint __P((void *));
int
gencnopen(dev, flag, mode, p)
@@ -82,11 +76,11 @@ gencnopen(dev, flag, mode, p)
int flag, mode;
struct proc *p;
{
- int unit;
- struct tty *tp;
+ int unit;
+ struct tty *tp;
- unit = minor(dev);
- if (unit >= maxttys)
+ unit = minor(dev);
+ if (unit >= maxttys)
return ENXIO;
if (gencn_tty[unit] == NULL)
@@ -94,21 +88,21 @@ gencnopen(dev, flag, mode, p)
tp = gencn_tty[unit];
- tp->t_oproc = gencnstart;
- tp->t_param = gencnparam;
- tp->t_dev = dev;
- if ((tp->t_state & TS_ISOPEN) == 0) {
- ttychars(tp);
- tp->t_iflag = TTYDEF_IFLAG;
- tp->t_oflag = TTYDEF_OFLAG;
- tp->t_cflag = TTYDEF_CFLAG;
- tp->t_lflag = TTYDEF_LFLAG;
- tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
- gencnparam(tp, &tp->t_termios);
- ttsetwater(tp);
- } else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0)
- return EBUSY;
- tp->t_state |= TS_CARR_ON;
+ tp->t_oproc = gencnstart;
+ tp->t_param = gencnparam;
+ tp->t_dev = dev;
+ if ((tp->t_state & TS_ISOPEN) == 0) {
+ ttychars(tp);
+ tp->t_iflag = TTYDEF_IFLAG;
+ tp->t_oflag = TTYDEF_OFLAG;
+ tp->t_cflag = TTYDEF_CFLAG;
+ tp->t_lflag = TTYDEF_LFLAG;
+ tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
+ gencnparam(tp, &tp->t_termios);
+ ttsetwater(tp);
+ } else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0)
+ return EBUSY;
+ tp->t_state |= TS_CARR_ON;
if (unit == 0)
consopened = 1;
mtpr(GC_RIE, pr_rxcs[unit]); /* Turn on interrupts */
@@ -123,42 +117,35 @@ gencnclose(dev, flag, mode, p)
int flag, mode;
struct proc *p;
{
- struct tty *tp = gencn_tty[minor(dev)];
+ struct tty *tp = gencn_tty[minor(dev)];
if (minor(dev) == 0)
consopened = 0;
- (*linesw[tp->t_line].l_close)(tp, flag);
- ttyclose(tp);
- return (0);
+ (*linesw[tp->t_line].l_close)(tp, flag);
+ ttyclose(tp);
+ return (0);
}
struct tty *
-gencntty(dev)
- dev_t dev;
+gencntty(dev_t dev)
{
return gencn_tty[minor(dev)];
}
int
-gencnread(dev, uio, flag)
- dev_t dev;
- struct uio *uio;
- int flag;
+gencnread(dev_t dev, struct uio *uio, int flag)
{
- struct tty *tp = gencn_tty[minor(dev)];
+ struct tty *tp = gencn_tty[minor(dev)];
- return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
+ return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
}
int
-gencnwrite(dev, uio, flag)
- dev_t dev;
- struct uio *uio;
- int flag;
+gencnwrite(dev_t dev, struct uio *uio, int flag)
{
- struct tty *tp = gencn_tty[minor(dev)];
+ struct tty *tp = gencn_tty[minor(dev)];
- return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
+ return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
}
int
@@ -169,33 +156,32 @@ gencnioctl(dev, cmd, data, flag, p)
int flag;
struct proc *p;
{
- struct tty *tp = gencn_tty[minor(dev)];
- int error;
-
- error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p);
- if (error >= 0)
- return error;
- error = ttioctl(tp, cmd, data, flag, p);
- if (error >= 0)
+ struct tty *tp = gencn_tty[minor(dev)];
+ int error;
+
+ error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p);
+ if (error >= 0)
+ return error;
+ error = ttioctl(tp, cmd, data, flag, p);
+ if (error >= 0)
return error;
return ENOTTY;
}
void
-gencnstart(tp)
- struct tty *tp;
+gencnstart(struct tty *tp)
{
- struct clist *cl;
- int s, ch;
+ struct clist *cl;
+ int s, ch;
- s = spltty();
- if (tp->t_state & (TS_BUSY|TS_TTSTOP|TS_TIMEOUT))
- goto out;
- cl = &tp->t_outq;
+ s = spltty();
+ if (tp->t_state & (TS_BUSY|TS_TTSTOP|TS_TIMEOUT))
+ goto out;
+ cl = &tp->t_outq;
if(cl->c_cc){
- tp->t_state |= TS_BUSY;
+ tp->t_state |= TS_BUSY;
ch = getc(cl);
mtpr(ch, pr_txdb[minor(tp->t_dev)]);
} else {
@@ -210,8 +196,7 @@ out: splx(s);
}
void
-gencnrint(arg)
- void *arg;
+gencnrint(void *arg)
{
struct tty *tp = *(struct tty **) arg;
int unit = (struct tty **) arg - gencn_tty;
@@ -236,16 +221,13 @@ gencnrint(arg)
}
int
-gencnstop(tp, flag)
- struct tty *tp;
- int flag;
+gencnstop(struct tty *tp, int flag)
{
return 0;
}
void
-gencntint(arg)
- void *arg;
+gencntint(void *arg)
{
struct tty *tp = *(struct tty **) arg;
@@ -255,22 +237,20 @@ gencntint(arg)
}
int
-gencnparam(tp, t)
- struct tty *tp;
- struct termios *t;
+gencnparam(struct tty *tp, struct termios *t)
{
- /* XXX - These are ignored... */
- tp->t_ispeed = t->c_ispeed;
- tp->t_ospeed = t->c_ospeed;
- tp->t_cflag = t->c_cflag;
+ /* XXX - These are ignored... */
+ tp->t_ispeed = t->c_ispeed;
+ tp->t_ospeed = t->c_ospeed;
+ tp->t_cflag = t->c_cflag;
return 0;
}
void
-gencnprobe(cndev)
- struct consdev *cndev;
+gencnprobe(struct consdev *cndev)
{
- if ((vax_cputype < VAX_TYP_UV1) || /* All older has MTPR console */
+ if ((vax_cputype < VAX_TYP_UV2) || /* All older has MTPR console */
+ (vax_boardtype == VAX_BTYP_9RR) ||
(vax_boardtype == VAX_BTYP_630) ||
(vax_boardtype == VAX_BTYP_650) ||
(vax_boardtype == VAX_BTYP_660) ||
@@ -284,33 +264,56 @@ gencnprobe(cndev)
}
void
-gencninit(cndev)
- struct consdev *cndev;
+gencninit(struct consdev *cndev)
{
/* Allocate interrupt vectors */
- scb_vecalloc(SCB_G0R, gencnrint, &gencn_tty[0], SCB_ISTACK);
- scb_vecalloc(SCB_G0T, gencntint, &gencn_tty[0], SCB_ISTACK);
+ scb_vecalloc(SCB_G0R, gencnrint, &gencn_tty[0], SCB_ISTACK, NULL);
+ scb_vecalloc(SCB_G0T, gencntint, &gencn_tty[0], SCB_ISTACK, NULL);
if (vax_cputype == VAX_TYP_8SS) {
maxttys = 4;
- scb_vecalloc(SCB_G1R, gencnrint, &gencn_tty[1], SCB_ISTACK);
- scb_vecalloc(SCB_G1T, gencntint, &gencn_tty[1], SCB_ISTACK);
+ scb_vecalloc(SCB_G1R, gencnrint, &gencn_tty[1], SCB_ISTACK, NULL);
+ scb_vecalloc(SCB_G1T, gencntint, &gencn_tty[1], SCB_ISTACK, NULL);
- scb_vecalloc(SCB_G2R, gencnrint, &gencn_tty[2], SCB_ISTACK);
- scb_vecalloc(SCB_G2T, gencntint, &gencn_tty[2], SCB_ISTACK);
+ scb_vecalloc(SCB_G2R, gencnrint, &gencn_tty[2], SCB_ISTACK, NULL);
+ scb_vecalloc(SCB_G2T, gencntint, &gencn_tty[2], SCB_ISTACK, NULL);
- scb_vecalloc(SCB_G3R, gencnrint, &gencn_tty[3], SCB_ISTACK);
- scb_vecalloc(SCB_G3T, gencntint, &gencn_tty[3], SCB_ISTACK);
+ scb_vecalloc(SCB_G3R, gencnrint, &gencn_tty[3], SCB_ISTACK, NULL);
+ scb_vecalloc(SCB_G3T, gencntint, &gencn_tty[3], SCB_ISTACK, NULL);
}
+ mtpr(0, PR_RXCS);
+ mtpr(0, PR_TXCS);
mtpr(0, PR_TBIA); /* ??? */
}
void
-gencnputc(dev,ch)
- dev_t dev;
- int ch;
+gencnputc(dev_t dev, int ch)
{
+#ifdef VAX8800
+ /*
+ * On KA88 we may get C-S/C-Q from the console.
+ * XXX - this will cause a loop at spltty() in kernel and will
+ * interfere with other console communication. Fortunately
+ * kernel printf's are uncommon.
+ */
+ if (vax_cputype == VAX_TYP_8NN) {
+ int s = spltty();
+
+ while (mfpr(PR_RXCS) & GC_DON) {
+ if ((mfpr(PR_RXDB) & 0x7f) == 19) {
+ while (1) {
+ while ((mfpr(PR_RXCS) & GC_DON) == 0)
+ ;
+ if ((mfpr(PR_RXDB) & 0x7f) == 17)
+ break;
+ }
+ }
+ }
+ splx(s);
+ }
+#endif
+
while ((mfpr(PR_TXCS) & GC_RDY) == 0) /* Wait until xmit ready */
;
mtpr(ch, PR_TXDB); /* xmit character */
@@ -320,8 +323,7 @@ gencnputc(dev,ch)
}
int
-gencngetc(dev)
- dev_t dev;
+gencngetc(dev_t dev)
{
int i;
@@ -334,15 +336,13 @@ gencngetc(dev)
}
void
-gencnpollc(dev, pollflag)
- dev_t dev;
- int pollflag;
+gencnpollc(dev_t dev, int pollflag)
{
- if (pollflag) {
- mtpr(0, PR_RXCS);
- mtpr(0, PR_TXCS);
+ if (pollflag) {
+ mtpr(0, PR_RXCS);
+ mtpr(0, PR_TXCS);
} else if (consopened) {
- mtpr(GC_RIE, PR_RXCS);
- mtpr(GC_TIE, PR_TXCS);
+ mtpr(GC_RIE, PR_RXCS);
+ mtpr(GC_TIE, PR_TXCS);
}
}
diff --git a/sys/arch/vax/vax/ibus.c b/sys/arch/vax/vax/ibus.c
index a3d0d46e083..e804ad2d416 100644
--- a/sys/arch/vax/vax/ibus.c
+++ b/sys/arch/vax/vax/ibus.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: ibus.c,v 1.3 2001/02/11 06:34:37 hugh Exp $ */
-/* $NetBSD: ibus.c,v 1.2 1999/08/14 18:42:46 ragge Exp $ */
+/* $OpenBSD: ibus.c,v 1.4 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: ibus.c,v 1.7 2001/02/04 20:36:32 ragge Exp $ */
/*
* Copyright (c) 1999 Ludd, University of Lule}, Sweden.
* All rights reserved.
@@ -39,9 +39,9 @@
#include <machine/cpu.h>
#include <machine/sid.h>
-static int ibus_print __P((void *, const char *));
-static int ibus_match __P((struct device *, struct cfdata *, void *));
-static void ibus_attach __P((struct device *, struct device *, void*));
+static int ibus_print(void *, const char *);
+static int ibus_match(struct device *, struct cfdata *, void *);
+static void ibus_attach(struct device *, struct device *, void*);
struct cfdriver ibus_cd = {
NULL, "ibus", DV_DULL
@@ -52,9 +52,7 @@ struct cfattach ibus_ca = {
};
int
-ibus_print(aux, name)
- void *aux;
- const char *name;
+ibus_print(void *aux, const char *name)
{
struct bp_conf *bp = aux;
@@ -66,19 +64,17 @@ ibus_print(aux, name)
int
-ibus_match(parent, cf, aux)
- struct device *parent;
- struct cfdata *cf;
- void *aux;
+ibus_match(struct device *parent, struct cfdata *cf, void *aux)
{
if (vax_bustype == VAX_IBUS)
return 1;
return 0;
}
-#define MVNIADDR 0x20084400
-#define SGECADDR 0x20008000
-#define SHACADDR 0x20004200
+#define MVNIADDR 0x20084400
+#define SGECADDR 0x20008000
+#define SHACADDR 0x20004200
+#define SHAC1303ADDR 0x20008200
void
ibus_attach(parent, self, aux)
@@ -112,7 +108,10 @@ ibus_attach(parent, self, aux)
* The same procedure for SHAC.
*/
bp.type = "shac";
- va = vax_map_physmem(SHACADDR, 1);
+ if (vax_boardtype == VAX_BTYP_1303)
+ va = vax_map_physmem(SHAC1303ADDR, 1);
+ else
+ va = vax_map_physmem(SHACADDR, 1);
if (badaddr((caddr_t)va + 0x48, 4) == 0)
config_found(self, &bp, ibus_print);
vax_unmap_physmem(va, 1);
diff --git a/sys/arch/vax/vax/intvec.s b/sys/arch/vax/vax/intvec.s
index 8f8a1ca6256..4cf915f418a 100644
--- a/sys/arch/vax/vax/intvec.s
+++ b/sys/arch/vax/vax/intvec.s
@@ -1,4 +1,4 @@
-/* $OpenBSD: intvec.s,v 1.13 2000/10/24 01:50:19 hugh Exp $ */
+/* $OpenBSD: intvec.s,v 1.14 2001/08/25 13:33:37 hugh Exp $ */
/* $NetBSD: intvec.s,v 1.39 1999/06/28 08:20:48 itojun Exp $ */
/*
@@ -214,8 +214,9 @@ ENTRY(privinflt) # Privileged/unimplemented instruction
* put in a need for an extra check when the fault is gotten during
* PTE reference. Handled in pmap.c.
*/
- .align 2
-transl_v: .globl transl_v # Translation violation, 20
+ .align 2
+ .globl transl_v # 20: Translation violation
+transl_v:
pushr $0x3f
pushl 28(sp)
pushl 28(sp)
@@ -228,8 +229,9 @@ transl_v: .globl transl_v # Translation violation, 20
1: popr $0x3f
brb access_v
- .align 2
-access_v:.globl access_v # Access cntrl viol fault, 24
+ .align 2
+ .globl access_v # 24: Access cntrl viol fault
+access_v:
blbs (sp), ptelen
pushl $T_ACCFLT
bbc $1,4(sp),1f
@@ -273,7 +275,7 @@ ENTRY(cmrerr)
rei
ENTRY(sbiflt);
- movab sbifltmsg, -(sp)
+ pushab sbifltmsg
calls $1, _panic
TRAPCALL(astintr, T_ASTFLT)
@@ -316,6 +318,8 @@ ENTRY(netint)
.globl hardclock
hardclock: mtpr $0xc1,$PR_ICCS # Reset interrupt flag
pushr $0x3f
+ incl _clock_intrcnt+EV_COUNT # count the number of clock interrupts
+# adwc $0,_clock_intrcnt+EV_COUNT+4
#ifdef VAX46
cmpl _vax_boardtype,$VAX_BTYP_46
bneq 1f
diff --git a/sys/arch/vax/vax/ka49.c b/sys/arch/vax/vax/ka49.c
index 48bc1c8b77e..3887d37b821 100644
--- a/sys/arch/vax/vax/ka49.c
+++ b/sys/arch/vax/vax/ka49.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ka49.c,v 1.2 2001/06/25 00:43:19 mickey Exp $ */
+/* $OpenBSD: ka49.c,v 1.3 2001/08/25 13:33:37 hugh Exp $ */
/*
* Copyright (c) 1999 Ludd, University of Lule}, Sweden.
* All rights reserved.
@@ -60,7 +60,7 @@ struct cpu_dep ka49_calls = {
ka49_conf,
chip_clkread,
chip_clkwrite,
- 16, /* ~VUPS */
+ 32, /* ~VUPS */
2, /* SCB pages */
ka49_halt,
ka49_reboot,
@@ -209,12 +209,11 @@ ka49_mchk(addr)
void
ka49_steal_pages()
{
-
/*
* Get the soft and hard memory error vectors now.
*/
- scb_vecalloc(0x54, ka49_softmem, 0, 0);
- scb_vecalloc(0x60, ka49_hardmem, 0, 0);
+ scb_vecalloc(0x54, ka49_softmem, NULL, 0, NULL);
+ scb_vecalloc(0x60, ka49_hardmem, NULL, 0, NULL);
/* Turn on caches (to speed up execution a bit) */
ka49_cache_enable();
diff --git a/sys/arch/vax/vax/ka53.c b/sys/arch/vax/vax/ka53.c
index 60331470026..214a6dc7d81 100644
--- a/sys/arch/vax/vax/ka53.c
+++ b/sys/arch/vax/vax/ka53.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ka53.c,v 1.3 2001/06/25 00:43:19 mickey Exp $ */
+/* $OpenBSD: ka53.c,v 1.4 2001/08/25 13:33:37 hugh Exp $ */
/* $NetBSD: ka53.c,v 1.2 2000/06/04 02:19:27 matt Exp $ */
/*
* Copyright (c) 2000 Ludd, University of Lule}, Sweden.
@@ -79,7 +79,7 @@ ka53_conf()
{volatile int *hej = (void *)mfpr(PR_ISP); *hej = *hej; hej[-1] = hej[-1];}
/* This vector (qbus related?) comes out of nowhere, ignore it for now */
- scb_vecalloc(0x0, (void *)nullop, 0, SCB_ISTACK);
+ scb_vecalloc(0x0, (void *)nullop, NULL, SCB_ISTACK, NULL);
switch((vax_siedata >> 8) & 0xFF) {
case VAX_STYP_50:
@@ -229,8 +229,8 @@ ka53_steal_pages()
* Get the soft and hard memory error vectors now.
*/
- scb_vecalloc(0x54, ka53_softmem, 0, 0);
- scb_vecalloc(0x60, ka53_hardmem, 0, 0);
+ scb_vecalloc(0x54, ka53_softmem, NULL, 0, NULL);
+ scb_vecalloc(0x60, ka53_hardmem, NULL, 0, NULL);
/* Turn on caches (to speed up execution a bit) */
diff --git a/sys/arch/vax/vax/ka650.c b/sys/arch/vax/vax/ka650.c
index e0ffa4a5b72..7605a24b481 100644
--- a/sys/arch/vax/vax/ka650.c
+++ b/sys/arch/vax/vax/ka650.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: ka650.c,v 1.7 2000/04/27 01:10:12 bjc Exp $ */
-/* $NetBSD: ka650.c,v 1.20 1999/08/07 10:36:49 ragge Exp $ */
+/* $OpenBSD: ka650.c,v 1.8 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: ka650.c,v 1.25 2001/04/27 15:02:37 ragge Exp $ */
/*
* Copyright (c) 1988 The Regents of the University of California.
* All rights reserved.
@@ -110,8 +110,7 @@ uvaxIII_conf()
syssub == VAX_SIE_KA640 ? 4 : 5,
syssub == VAX_SIE_KA655 ? 5 : 0,
(vax_cpudata & 0xff), GETFRMREV(vax_siedata));
- if (syssub != VAX_SIE_KA640)
- ka650setcache(CACHEON);
+ ka650setcache(CACHEON);
if (ctob(physmem) > ka650merr_ptr->merr_qbmbr) {
printf("physmem(0x%x) > qbmbr(0x%x)\n",
ctob(physmem), (int)ka650merr_ptr->merr_qbmbr);
@@ -250,25 +249,30 @@ uvaxIII_mchk(cmcf)
* Enable 1st level cache too.
*/
void
-ka650setcache(state)
+ka650setcache(int state)
{
- register int i;
+ int syssub = GETSYSSUBT(vax_siedata);
+ int i;
/*
* Before doing anything, disable the cache.
*/
mtpr(0, PR_CADR);
- ka650cbd_ptr->cbd_cacr = CACR_CPE;
+ if (syssub != VAX_SIE_KA640)
+ ka650cbd_ptr->cbd_cacr = CACR_CPE;
/*
* Check what we want to do, enable or disable.
*/
if (state == CACHEON) {
- for (i = 0; i < (KA650_CACHESIZE / sizeof(KA650_CACHE_ptr[0]));
- i += 2)
- KA650_CACHE_ptr[i] = 0;
- ka650cbd_ptr->cbd_cacr = CACR_CEN;
mtpr(CADR_SEN2 | CADR_SEN1 | CADR_CENI | CADR_CEND, PR_CADR);
+ if (syssub != VAX_SIE_KA640) {
+ for (i = 0;
+ i < (KA650_CACHESIZE / sizeof(KA650_CACHE_ptr[0]));
+ i += 2)
+ KA650_CACHE_ptr[i] = 0;
+ ka650cbd_ptr->cbd_cacr = CACR_CEN;
+ }
}
}
diff --git a/sys/arch/vax/vax/ka680.c b/sys/arch/vax/vax/ka680.c
index eff212da9ac..0cc8f9aa5c0 100644
--- a/sys/arch/vax/vax/ka680.c
+++ b/sys/arch/vax/vax/ka680.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ka680.c,v 1.5 2001/06/25 00:43:19 mickey Exp $ */
+/* $OpenBSD: ka680.c,v 1.6 2001/08/25 13:33:37 hugh Exp $ */
/* $NetBSD: ka680.c,v 1.3 2001/01/28 21:01:53 ragge Exp $ */
/*
* Copyright (c) 2000 Ludd, University of Lule}, Sweden.
@@ -245,8 +245,8 @@ ka680_steal_pages()
/*
* Get the soft and hard memory error vectors now.
*/
- scb_vecalloc(0x54, ka680_softmem, 0, 0);
- scb_vecalloc(0x60, ka680_hardmem, 0, 0);
+ scb_vecalloc(0x54, ka680_softmem, NULL, 0, NULL);
+ scb_vecalloc(0x60, ka680_hardmem, NULL, 0, NULL);
/* Turn on caches (to speed up execution a bit) */
ka680_cache_enable();
diff --git a/sys/arch/vax/vax/ka820.c b/sys/arch/vax/vax/ka820.c
index 27db9a89263..5de12c0f1ea 100644
--- a/sys/arch/vax/vax/ka820.c
+++ b/sys/arch/vax/vax/ka820.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: ka820.c,v 1.4 2000/04/27 01:10:12 bjc Exp $ */
-/* $NetBSD: ka820.c,v 1.17 1999/09/06 19:52:52 ragge Exp $ */
+/* $OpenBSD: ka820.c,v 1.5 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: ka820.c,v 1.22 2000/06/04 02:19:27 matt Exp $ */
/*
* Copyright (c) 1988 Regents of the University of California.
* All rights reserved.
@@ -67,19 +67,25 @@
struct ka820port *ka820port_ptr;
struct rx50device *rx50device_ptr;
-
-static int ka820_match __P((struct device *, struct cfdata *, void *));
-static void ka820_attach __P((struct device *, struct device *, void*));
-static void rxcdintr __P((int));
-void crxintr __P((int));
+static volatile struct ka820clock *ka820_clkpage;
+
+static int ka820_match __P((struct device *, struct cfdata *, void *));
+static void ka820_attach __P((struct device *, struct device *, void*));
+static void ka820_memerr __P((void));
+static void ka820_conf __P((void));
+static int ka820_mchk __P((caddr_t));
+static int ka820_clkread(time_t base);
+static void ka820_clkwrite(void);
+static void rxcdintr __P((void *));
+static void vaxbierr(void *);
struct cpu_dep ka820_calls = {
0,
ka820_mchk,
ka820_memerr,
- NULL,
- chip_clkread,
- chip_clkwrite,
+ ka820_conf,
+ ka820_clkread,
+ ka820_clkwrite,
3, /* ~VUPS */
5, /* SCB pages */
};
@@ -124,16 +130,16 @@ ka820_attach(parent, self, aux)
struct bi_attach_args *ba = aux;
register int csr;
u_short rev;
- extern char cpu_model[];
rev = bus_space_read_4(ba->ba_iot, ba->ba_ioh, BIREG_DTYPE) >> 16;
- strcpy(cpu_model,"VAX 8200");
+ strcpy(cpu_model, "VAX 8200");
cpu_model[6] = rev & 0x8000 ? '5' : '0';
printf(": ka82%c (%s) cpu rev %d, u patch rev %d, sec patch %d\n",
cpu_model[6], mastercpu == ba->ba_nodenr ? "master" : "slave",
((rev >> 11) & 15), ((rev >> 1) &1023), rev & 1);
/* reset the console and enable the RX50 */
+ ka820port_ptr = (void *)vax_map_physmem(KA820_PORTADDR, 1);
csr = ka820port_ptr->csr;
csr &= ~KA820PORT_RSTHALT; /* ??? */
csr |= KA820PORT_CONSCLR | KA820PORT_CRDCLR | KA820PORT_CONSEN |
@@ -145,18 +151,30 @@ ka820_attach(parent, self, aux)
bus_space_read_4(ba->ba_iot, ba->ba_ioh, BIREG_VAXBICSR) |
BICSR_SEIE | BICSR_HEIE);
- /* XXX - should be done somewhere else */
- scb_vecalloc(SCB_RX50, crxintr, 0, SCB_ISTACK);
+}
- clk_adrshift = 0; /* clk regs are addressed at short's */
- clk_tweak = 1; /* ...but not exactly in each short */
- clk_page = (short *)vax_map_physmem((paddr_t)KA820_CLOCKADDR, 1);
+void
+ka820_conf()
+{
+ /*
+ * Setup parameters necessary to read time from clock chip.
+ */
+ ka820_clkpage = (void *)vax_map_physmem(KA820_CLOCKADDR, 1);
/* Steal the interrupt vectors that are unique for us */
- scb_vecalloc(KA820_INT_RXCD, rxcdintr, 0, SCB_ISTACK);
+ scb_vecalloc(KA820_INT_RXCD, rxcdintr, NULL, SCB_ISTACK, NULL);
+ scb_vecalloc(0x50, vaxbierr, NULL, SCB_ISTACK, NULL);
+ /* XXX - should be done somewhere else */
+ scb_vecalloc(SCB_RX50, crxintr, NULL, SCB_ISTACK, NULL);
rx50device_ptr = (void *)vax_map_physmem(KA820_RX50ADDR, 1);
- ka820port_ptr = (void *)vax_map_physmem(KA820_PORTADDR, 1);
+}
+
+void
+vaxbierr(void *arg)
+{
+ if (cold == 0)
+ panic("vaxbierr");
}
#ifdef notdef
@@ -374,10 +392,60 @@ ka820_mchk(cmcf)
*/
void
rxcdintr(arg)
- int arg;
+ void *arg;
{
register int c = mfpr(PR_RXCD);
/* not sure what (if anything) to do with these */
printf("rxcd node %x c=0x%x\n", (c >> 8) & 0xf, c & 0xff);
}
+
+int
+ka820_clkread(time_t base)
+{
+ struct clock_ymdhms c;
+ int s;
+
+ while (ka820_clkpage->csr0 & KA820CLK_0_BUSY)
+ ;
+ s = splhigh();
+ c.dt_sec = ka820_clkpage->sec;
+ c.dt_min = ka820_clkpage->min;
+ c.dt_hour = ka820_clkpage->hr;
+ c.dt_wday = ka820_clkpage->dayofwk;
+ c.dt_day = ka820_clkpage->day;
+ c.dt_mon = ka820_clkpage->mon;
+ c.dt_year = ka820_clkpage->yr;
+ splx(s);
+
+ /* strange conversion */
+ c.dt_sec = ((c.dt_sec << 7) | (c.dt_sec >> 1)) & 0377;
+ c.dt_min = ((c.dt_min << 7) | (c.dt_min >> 1)) & 0377;
+ c.dt_hour = ((c.dt_hour << 7) | (c.dt_hour >> 1)) & 0377;
+ c.dt_wday = ((c.dt_wday << 7) | (c.dt_wday >> 1)) & 0377;
+ c.dt_day = ((c.dt_day << 7) | (c.dt_day >> 1)) & 0377;
+ c.dt_mon = ((c.dt_mon << 7) | (c.dt_mon >> 1)) & 0377;
+ c.dt_year = ((c.dt_year << 7) | (c.dt_year >> 1)) & 0377;
+
+ time.tv_sec = clock_ymdhms_to_secs(&c);
+ return CLKREAD_OK;
+}
+
+void
+ka820_clkwrite(void)
+{
+ struct clock_ymdhms c;
+
+ clock_secs_to_ymdhms(time.tv_sec, &c);
+
+ ka820_clkpage->csr1 = KA820CLK_1_SET;
+ ka820_clkpage->sec = ((c.dt_sec << 1) | (c.dt_sec >> 7)) & 0377;
+ ka820_clkpage->min = ((c.dt_min << 1) | (c.dt_min >> 7)) & 0377;
+ ka820_clkpage->hr = ((c.dt_hour << 1) | (c.dt_hour >> 7)) & 0377;
+ ka820_clkpage->dayofwk = ((c.dt_wday << 1) | (c.dt_wday >> 7)) & 0377;
+ ka820_clkpage->day = ((c.dt_day << 1) | (c.dt_day >> 7)) & 0377;
+ ka820_clkpage->mon = ((c.dt_mon << 1) | (c.dt_mon >> 7)) & 0377;
+ ka820_clkpage->yr = ((c.dt_year << 1) | (c.dt_year >> 7)) & 0377;
+
+ ka820_clkpage->csr1 = KA820CLK_1_GO;
+}
diff --git a/sys/arch/vax/vax/scb.c b/sys/arch/vax/vax/scb.c
index 115c9b3bc54..f7884dcedb8 100644
--- a/sys/arch/vax/vax/scb.c
+++ b/sys/arch/vax/vax/scb.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: scb.c,v 1.2 2001/06/25 00:43:19 mickey Exp $ */
-/* $NetBSD: scb.c,v 1.9 2000/01/24 02:40:34 matt Exp $ */
+/* $OpenBSD: scb.c,v 1.3 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: scb.c,v 1.12 2000/06/04 06:16:59 matt Exp $ */
/*
* Copyright (c) 1999 Ludd, University of Lule}, Sweden.
* All rights reserved.
@@ -37,6 +37,7 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
+#include <sys/device.h>
#include <machine/trap.h>
#include <machine/scb.h>
@@ -45,16 +46,17 @@
#include <machine/sid.h>
#include <machine/mtpr.h>
-static void scb_stray __P((void *));
+struct scb *scb;
+struct ivec_dsp *scb_vec;
-static struct ivec_dsp *scb_vec;
+static void scb_stray __P((void *));
static volatile int vector, ipl, gotintr;
+
/*
* Generates a new SCB.
*/
paddr_t
-scb_init(avail_start)
- paddr_t avail_start;
+scb_init(paddr_t avail_start)
{
struct ivec_dsp **ivec = (struct ivec_dsp **)avail_start;
struct ivec_dsp **old = (struct ivec_dsp **)KERNBASE;
@@ -72,6 +74,7 @@ scb_init(avail_start)
scb_vec[i] = idsptch;
scb_vec[i].hoppaddr = scb_stray;
scb_vec[i].pushlarg = (void *) (i * 4);
+ scb_vec[i].ev = NULL;
}
/*
* Copy all pre-set interrupt vectors to the new SCB.
@@ -86,7 +89,8 @@ scb_init(avail_start)
mtpr(avail_start, PR_SCBB);
/* Return new avail_start. Also save space for the dispatchers. */
- return avail_start + (scb_size * 5) * VAX_NBPG;
+ return avail_start + (1 + sizeof(struct ivec_dsp) / sizeof(void *))
+ * scb_size * VAX_NBPG;
};
/*
@@ -94,19 +98,19 @@ scb_init(avail_start)
* This function must _not_ save any registers (in the reg save mask).
*/
void
-scb_stray(arg)
- void *arg;
+scb_stray(void *arg)
{
- struct callsframe *cf = FRAMEOFFSET(arg);
- int *a = &cf->ca_arg1;
-
gotintr = 1;
vector = ((int) arg) & ~3;
ipl = mfpr(PR_IPL);
+
if (cold == 0)
printf("stray interrupt: vector 0x%x, ipl %d\n", vector, ipl);
- else
- a[8] = (a[8] & 0xffe0ffff) | ipl << 16;
+ else {
+ struct icallsframe *icf = (void *) __builtin_frame_address(0);
+
+ icf->ica_psl = (icf->ica_psl & ~PSL_IPL) | ipl << 16;
+ }
mtpr(ipl + 1, PR_IPL);
}
@@ -147,16 +151,18 @@ scb_vecref(rvec, ripl)
* Sets a vector to the specified function.
* Arg may not be greater than 63.
*/
+
void
-scb_vecalloc(vecno, func, arg, stack)
+scb_vecalloc(vecno, func, arg, stack, ev)
int vecno;
- void (*func) __P((void *));
+ void (*func)(void *);
void *arg;
int stack;
+ struct evcnt *ev;
{
struct ivec_dsp *dsp = &scb_vec[vecno / 4];
- u_int *iscb = (u_int *)scb; /* XXX */
dsp->hoppaddr = func;
dsp->pushlarg = arg;
- iscb[vecno/4] = (u_int)(dsp) | stack;
+ dsp->ev = ev;
+ ((u_int *) scb)[vecno/4] = (u_int)(dsp) | stack;
}
diff --git a/sys/arch/vax/vax/subr.s b/sys/arch/vax/vax/subr.s
index e1cef336322..34b3604693d 100644
--- a/sys/arch/vax/vax/subr.s
+++ b/sys/arch/vax/vax/subr.s
@@ -1,4 +1,4 @@
-/* $OpenBSD: subr.s,v 1.14 2001/06/15 22:45:34 miod Exp $ */
+/* $OpenBSD: subr.s,v 1.15 2001/08/25 13:33:37 hugh Exp $ */
/* $NetBSD: subr.s,v 1.32 1999/03/25 00:41:48 mrg Exp $ */
/*
@@ -118,21 +118,26 @@ _ultrix_esigcode:
.globl _idsptch, _eidsptch
_idsptch: pushr $0x3f
- .word 0x9f16
- .long _cmn_idsptch
- .long 0
- .long 0
+ .word 0x9f16 # jsb to absolute address
+ .long _cmn_idsptch # the absolute address
+ .long 0 # the callback interrupt routine
+ .long 0 # its argument
+ .long 0 # ptr to correspond evcnt struct
_eidsptch:
_cmn_idsptch:
- movl (sp)+,r0
- pushl 4(r0)
- calls $1,*(r0)
- popr $0x3f
- rei
+ movl (sp)+,r0 # get pointer to idspvec
+ movl 8(r0),r1 # get evcnt pointer
+ beql 1f # no ptr, skip increment
+ incl EV_COUNT(r1) # increment low longword
+# adwc $0,EV_COUNT+4(r1) # add any carry to hi longword
+1: pushl 4(r0) # push argument
+ calls $1,*(r0) # call interrupt routine
+ popr $0x3f # pop registers
+ rei # return from interrut
ENTRY(badaddr,R2|R3) # Called with addr,b/w/l
- mfpr $0x12,r0
+ mfpr $0x12,r0 # splhigh()
mtpr $0x1f,$0x12
movl 4(ap),r2 # First argument, the address
movl 8(ap),r1 # Sec arg, b,w,l
diff --git a/sys/arch/vax/vsa/asc_vsbus.c b/sys/arch/vax/vsa/asc_vsbus.c
index 3e330022c7e..00ffed74ce3 100644
--- a/sys/arch/vax/vsa/asc_vsbus.c
+++ b/sys/arch/vax/vsa/asc_vsbus.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: asc_vsbus.c,v 1.3 2001/02/11 06:34:37 hugh Exp $ */
-/* $NetBSD: asc_vsbus.c,v 1.20 2000/07/26 21:50:48 matt Exp $ */
+/* $OpenBSD: asc_vsbus.c,v 1.4 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: asc_vsbus.c,v 1.22 2001/02/04 20:36:32 ragge Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -284,7 +284,8 @@ asc_vsbus_attach(struct device *parent, struct device *self, void *aux)
sc->sc_freq /= 1000000;
scb_vecalloc(va->va_cvec, (void (*)(void *)) ncr53c9x_intr,
- &asc->sc_ncr53c9x, SCB_ISTACK);
+ &asc->sc_ncr53c9x, SCB_ISTACK, &asc->sc_intrcnt);
+ evcnt_attach(self, "intr", &asc->sc_intrcnt);
/*
* XXX More of this should be in ncr53c9x_attach(), but
diff --git a/sys/arch/vax/vsa/dz_ibus.c b/sys/arch/vax/vsa/dz_ibus.c
index 0be9c27a6d7..e6e3383aca4 100644
--- a/sys/arch/vax/vsa/dz_ibus.c
+++ b/sys/arch/vax/vsa/dz_ibus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dz_ibus.c,v 1.6 2001/06/15 22:45:34 miod Exp $ */
+/* $OpenBSD: dz_ibus.c,v 1.7 2001/08/25 13:33:37 hugh Exp $ */
/* $NetBSD: dz_ibus.c,v 1.15 1999/08/27 17:50:42 ragge Exp $ */
/*
* Copyright (c) 1998 Ludd, University of Lule}, Sweden.
@@ -14,8 +14,8 @@
* 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 at Ludd, University of
- * Lule}, Sweden and its contributors.
+ * This product includes software developed at Ludd, University of
+ * Lule}, Sweden and its contributors.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
@@ -51,6 +51,7 @@
#include <machine/vsbus.h>
#include <machine/cpu.h>
#include <machine/scb.h>
+#include <machine/nexus.h>
#include <machine/../vax/gencons.h>
@@ -62,8 +63,8 @@
#include "dzkbd.h"
#include "dzms.h"
-static int dz_vsbus_match __P((struct device *, struct cfdata *, void *));
-static void dz_vsbus_attach __P((struct device *, struct device *, void *));
+static int dz_vsbus_match(struct device *, struct cfdata *, void *);
+static void dz_vsbus_attach(struct device *, struct device *, void *);
static vaddr_t dz_regs; /* Used for console */
@@ -175,8 +176,11 @@ dz_vsbus_attach(parent, self, aux)
sc->sc_type = DZ_DZV;
sc->sc_dsr = 0x0f; /* XXX check if VS has modem ctrl bits */
- scb_vecalloc(va->va_cvec, dzxint, sc, SCB_ISTACK);
- scb_vecalloc(va->va_cvec - 4, dzrint, sc, SCB_ISTACK);
+ scb_vecalloc(va->va_cvec, dzxint, sc, SCB_ISTACK,
+ &sc->sc_tintrcnt);
+ scb_vecalloc(va->va_cvec - 4, dzrint, sc, SCB_ISTACK,
+ &sc->sc_rintrcnt);
+
printf("\n%s: 4 lines", self->dv_xname);
dzattach(sc);
diff --git a/sys/arch/vax/vsa/if_le_vsbus.c b/sys/arch/vax/vsa/if_le_vsbus.c
index 8a3d1224a95..4fa5949eb34 100644
--- a/sys/arch/vax/vsa/if_le_vsbus.c
+++ b/sys/arch/vax/vsa/if_le_vsbus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_le_vsbus.c,v 1.3 2001/02/11 06:34:38 hugh Exp $ */
+/* $OpenBSD: if_le_vsbus.c,v 1.4 2001/08/25 13:33:37 hugh Exp $ */
/* $NetBSD: if_le_vsbus.c,v 1.10 2000/06/29 07:14:18 mrg Exp $ */
/*-
@@ -225,7 +225,9 @@ le_vsbus_attach(parent, self, aux)
sc->sc_am7990.sc_wrcsr = lewrcsr;
sc->sc_am7990.sc_nocarrier = NULL;
- scb_vecalloc(va->va_cvec, (void (*)(void *)) am7990_intr, sc, SCB_ISTACK);
+ scb_vecalloc(va->va_cvec, (void (*)(void *)) am7990_intr, sc,
+ SCB_ISTACK, &sc->sc_intrcnt);
+ evcnt_attach(self, "intr", &sc->sc_intrcnt);
/*
* Allocate a (DMA-safe) block for all descriptors and buffers.
diff --git a/sys/arch/vax/vsa/if_ze_vsbus.c b/sys/arch/vax/vsa/if_ze_vsbus.c
index 64414a4e448..34d6ccb6156 100644
--- a/sys/arch/vax/vsa/if_ze_vsbus.c
+++ b/sys/arch/vax/vsa/if_ze_vsbus.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: if_ze_vsbus.c,v 1.1 2000/04/27 02:34:50 bjc Exp $ */
-/* $NetBSD: if_ze_vsbus.c,v 1.2 2000/01/24 02:40:35 matt Exp $ */
+/* $OpenBSD: if_ze_vsbus.c,v 1.2 2001/08/25 13:33:37 hugh Exp $ */
+/* $NetBSD: if_ze_vsbus.c,v 1.5 2000/07/26 21:50:49 matt Exp $ */
/*
* Copyright (c) 1999 Ludd, University of Lule}, Sweden. All rights reserved.
*
@@ -63,8 +63,8 @@
#define NISA_ROM 0x27800000
#define SGECVEC 0x108
-static int zematch __P((struct device *, void *, void *));
-static void zeattach __P((struct device *, struct device *, void *));
+static int zematch(struct device *, void *, void *);
+static void zeattach(struct device *, struct device *, void *);
struct cfattach ze_vsbus_ca = {
sizeof(struct ze_softc), zematch, zeattach
@@ -103,6 +103,7 @@ zeattach(parent, self, aux)
{
struct ze_softc *sc = (struct ze_softc *)self;
struct vsbus_attach_args *va = aux;
+ extern struct vax_bus_dma_tag vax_bus_dma_tag;
int *ea, i;
/*
@@ -110,10 +111,11 @@ zeattach(parent, self, aux)
*/
sc->sc_ioh = vax_map_physmem(SGECADDR, 1);
sc->sc_iot = 0; /* :-) */
- sc->sc_dmat = va->va_dmat;
+ sc->sc_dmat = &vax_bus_dma_tag;
sc->sc_intvec = SGECVEC;
- scb_vecalloc(va->va_cvec, (void (*)(void *)) sgec_intr, sc, SCB_ISTACK);
+ scb_vecalloc(va->va_cvec, (void (*)(void *)) sgec_intr,
+ sc, SCB_ISTACK, &sc->sc_intrcnt);
/*
* Map in, read and release ethernet rom address.
diff --git a/sys/arch/vax/vsa/ncr.c b/sys/arch/vax/vsa/ncr.c
index 7bacbaf2a43..b38fb32635e 100644
--- a/sys/arch/vax/vsa/ncr.c
+++ b/sys/arch/vax/vsa/ncr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ncr.c,v 1.9 2001/02/15 13:15:03 hugh Exp $ */
+/* $OpenBSD: ncr.c,v 1.10 2001/08/25 13:33:37 hugh Exp $ */
/* $NetBSD: ncr.c,v 1.32 2000/06/25 16:00:43 ragge Exp $ */
/*-
@@ -91,6 +91,7 @@ struct si_dma_handle {
struct si_softc {
struct ncr5380_softc ncr_sc;
+ struct evcnt ncr_intrcnt;
caddr_t ncr_addr;
int ncr_off;
int ncr_dmaaddr;
@@ -108,18 +109,18 @@ struct si_softc {
static int ncr_dmasize;
-static int si_match __P((struct device *, void *, void *));
-static void si_attach __P((struct device *, struct device *, void *));
-static void si_minphys __P((struct buf *));
+static int si_match(struct device *, void *, void *);
+static void si_attach(struct device *, struct device *, void *);
+static void si_minphys(struct buf *);
-static void si_dma_alloc __P((struct ncr5380_softc *));
-static void si_dma_free __P((struct ncr5380_softc *));
-static void si_dma_setup __P((struct ncr5380_softc *));
-static void si_dma_start __P((struct ncr5380_softc *));
-static void si_dma_poll __P((struct ncr5380_softc *));
-static void si_dma_eop __P((struct ncr5380_softc *));
-static void si_dma_stop __P((struct ncr5380_softc *));
-static void si_dma_go __P((void *));
+static void si_dma_alloc(struct ncr5380_softc *);
+static void si_dma_free(struct ncr5380_softc *);
+static void si_dma_setup(struct ncr5380_softc *);
+static void si_dma_start(struct ncr5380_softc *);
+static void si_dma_poll(struct ncr5380_softc *);
+static void si_dma_eop(struct ncr5380_softc *);
+static void si_dma_stop(struct ncr5380_softc *);
+static void si_dma_go(void *);
#define NCR5380_READ(sc, reg) bus_space_read_1(sc->sc_regt, \
0, sc->ncr_sc.reg)
@@ -182,7 +183,9 @@ si_attach(parent, self, aux)
int tweak, target;
/* enable interrupts on vsbus too */
- scb_vecalloc(va->va_cvec, (void (*)(void *)) ncr5380_intr, sc, SCB_ISTACK);
+ scb_vecalloc(va->va_cvec, (void (*)(void *)) ncr5380_intr, sc,
+ SCB_ISTACK, &sc->ncr_intrcnt);
+ evcnt_attach(self, "intr", &sc->ncr_intrcnt);
/*
* DMA area mapin.
diff --git a/sys/arch/vax/vsa/vsbus.c b/sys/arch/vax/vsa/vsbus.c
index 43e18bf8584..bbf9fe688e8 100644
--- a/sys/arch/vax/vsa/vsbus.c
+++ b/sys/arch/vax/vsa/vsbus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vsbus.c,v 1.6 2001/02/11 06:34:38 hugh Exp $ */
+/* $OpenBSD: vsbus.c,v 1.7 2001/08/25 13:33:37 hugh Exp $ */
/* $NetBSD: vsbus.c,v 1.29 2000/06/29 07:14:37 mrg Exp $ */
/*
* Copyright (c) 1996, 1999 Ludd, University of Lule}, Sweden.
@@ -67,13 +67,13 @@
#include <machine/vsbus.h>
-int vsbus_match __P((struct device *, struct cfdata *, void *));
-void vsbus_attach __P((struct device *, struct device *, void *));
-int vsbus_print __P((void *, const char *));
-int vsbus_search __P((struct device *, void *, void *));
+int vsbus_match(struct device *, struct cfdata *, void *);
+void vsbus_attach(struct device *, struct device *, void *);
+int vsbus_print(void *, const char *);
+int vsbus_search(struct device *, void *, void *);
-void ka410_attach __P((struct device *, struct device *, void *));
-void ka43_attach __P((struct device *, struct device *, void *));
+void ka410_attach(struct device *, struct device *, void *);
+void ka43_attach(struct device *, struct device *, void *);
static struct vax_bus_dma_tag vsbus_bus_dma_tag = {
0,