summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/hp300/hp300/isr.c228
-rw-r--r--sys/arch/hp300/include/autoconf.h50
-rw-r--r--sys/arch/hp300/stand/itevar.h231
3 files changed, 509 insertions, 0 deletions
diff --git a/sys/arch/hp300/hp300/isr.c b/sys/arch/hp300/hp300/isr.c
new file mode 100644
index 00000000000..5b284c86c53
--- /dev/null
+++ b/sys/arch/hp300/hp300/isr.c
@@ -0,0 +1,228 @@
+/* $NetBSD: isr.c,v 1.1 1996/02/14 02:56:48 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1995, 1996 Jason R. Thorpe.
+ * All rights reserved.
+ *
+ * Portions:
+ * Copyright (c) 1994 Gordon W. Ross.
+ * Copyright (c) 1993 Adam Glass.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgements:
+ * This product includes software developed by Adam Glass.
+ * This product includes software developed for the NetBSD Project
+ * by Jason R. Thorpe.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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.
+ */
+
+/*
+ * Link and dispatch interrupts.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/malloc.h>
+#include <sys/vmmeter.h>
+#include <machine/cpu.h>
+#include <net/netisr.h>
+
+#include <hp300/hp300/isr.h>
+
+typedef LIST_HEAD(, isr) isr_list_t;
+isr_list_t isr_list[NISR];
+
+extern int intrcnt[]; /* from locore.s */
+
+void
+isrinit()
+{
+ int i;
+
+ /* Initialize the ISR lists. */
+ for (i = 0; i < NISR; ++i) {
+ LIST_INIT(&isr_list[i]);
+ }
+}
+
+/*
+ * Establish an interrupt handler.
+ * Called by driver attach functions.
+ */
+void
+isrlink(func, arg, ipl, priority)
+ int (*func) __P((void *));
+ void *arg;
+ int ipl;
+ int priority;
+{
+ struct isr *newisr, *curisr;
+ isr_list_t *list;
+
+ if ((ipl < 0) || (ipl >= NISR))
+ panic("isrlink: bad ipl %d", ipl);
+
+ newisr = (struct isr *)malloc(sizeof(struct isr), M_DEVBUF, M_NOWAIT);
+ if (newisr == NULL)
+ panic("isrlink: can't allocate space for isr");
+
+ /* Fill in the new entry. */
+ newisr->isr_func = func;
+ newisr->isr_arg = arg;
+ newisr->isr_ipl = ipl;
+ newisr->isr_priority = priority;
+
+ /*
+ * Some devices are particularly sensitive to interrupt
+ * handling latency. The DCA, for example, can lose many
+ * characters if its interrupt isn't handled with reasonable
+ * speed.
+ *
+ * To work around this problem, each device can give itself a
+ * "priority". An unbuffered DCA would give itself a higher
+ * priority than a SCSI device, for example.
+ *
+ * This is necessary because of the flat spl scheme employed by
+ * the hp300. Each device can be set from ipl 3 to ipl 5, which
+ * in turn means that splbio, splnet, and spltty must all be at
+ * spl5.
+ *
+ * Don't blame me...I just work here.
+ */
+
+ /*
+ * Get the appropriate ISR list. If the list is empty, no
+ * additional work is necessary; we simply insert ourselves
+ * at the head of the list.
+ */
+ list = &isr_list[ipl];
+ if (list->lh_first == NULL) {
+ LIST_INSERT_HEAD(list, newisr, isr_link);
+ return;
+ }
+
+ /*
+ * A little extra work is required. We traverse the list
+ * and place ourselves after any ISRs with our current (or
+ * higher) priority.
+ */
+ for (curisr = list->lh_first; curisr->isr_link.le_next != NULL;
+ curisr = curisr->isr_link.le_next) {
+ if (newisr->isr_priority > curisr->isr_priority) {
+ LIST_INSERT_BEFORE(curisr, newisr, isr_link);
+ return;
+ }
+ }
+
+ /*
+ * We're the least important entry, it seems. We just go
+ * on the end.
+ */
+ LIST_INSERT_AFTER(curisr, newisr, isr_link);
+}
+
+/*
+ * This is the dispatcher called by the low-level
+ * assembly language interrupt routine.
+ */
+void
+isrdispatch(evec)
+ int evec; /* format | vector offset */
+{
+ struct isr *isr;
+ isr_list_t *list;
+ int handled, ipl, vec;
+ static int straycount, unexpected;
+
+ vec = (evec & 0xfff) >> 2;
+ if ((vec < ISRLOC) || (vec >= (ISRLOC + NISR)))
+ panic("isrdispatch: bad vec 0x%x\n");
+ ipl = vec - ISRLOC;
+
+ intrcnt[ipl]++;
+ cnt.v_intr++;
+
+ list = &isr_list[ipl];
+ if (list->lh_first == NULL) {
+ printf("intrhand: ipl %d unexpected\n", ipl);
+ if (++unexpected > 10)
+ panic("isrdispatch: too many unexpected interrupts");
+ return;
+ }
+
+ /* Give all the handlers a chance. */
+ for (isr = list->lh_first ; isr != NULL; isr = isr->isr_link.le_next)
+ handled |= (*isr->isr_func)(isr->isr_arg);
+
+ if (handled)
+ straycount = 0;
+ else if (++straycount > 50)
+ panic("isrdispatch: too many stray interrupts");
+ else
+ printf("isrdispatch: stray level %d interrupt\n", ipl);
+}
+
+/*
+ * XXX Why on earth isn't this in a common file?!
+ */
+void
+netintr()
+{
+#ifdef INET
+ if (netisr & (1 << NETISR_ARP)) {
+ netisr &= ~(1 << NETISR_ARP);
+ arpintr();
+ }
+ if (netisr & (1 << NETISR_IP)) {
+ netisr &= ~(1 << NETISR_IP);
+ ipintr();
+ }
+#endif
+#ifdef NS
+ if (netisr & (1 << NETISR_NS)) {
+ netisr &= ~(1 << NETISR_NS);
+ nsintr();
+ }
+#endif
+#ifdef ISO
+ if (netisr & (1 << NETISR_ISO)) {
+ netisr &= ~(1 << NETISR_ISO);
+ clnlintr();
+ }
+#endif
+#ifdef CCITT
+ if (netisr & (1 << NETISR_CCITT)) {
+ netisr &= ~(1 << NETISR_CCITT);
+ ccittintr();
+ }
+#endif
+#include "ppp.h"
+#if NPPP > 0
+ if (netisr & (1 << NETISR_PPP)) {
+ netisr &= ~(1 << NETISR_PPP);
+ pppintr();
+ }
+#endif
+}
diff --git a/sys/arch/hp300/include/autoconf.h b/sys/arch/hp300/include/autoconf.h
new file mode 100644
index 00000000000..01f3daf9125
--- /dev/null
+++ b/sys/arch/hp300/include/autoconf.h
@@ -0,0 +1,50 @@
+/* $NetBSD: autoconf.h,v 1.3 1996/03/03 16:49:17 thorpej Exp $ */
+
+/*-
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 REGENTS OR CONTRIBUTORS 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.
+ */
+
+#ifdef _KERNEL
+extern int conscode; /* select code of console device */
+extern int consinit_active; /* hint for drivers */
+extern caddr_t conaddr; /* KVA of console device */
+extern int convasize; /* size of mapping at conaddr */
+extern int conforced; /* console has been forced */
+
+void hp300_cninit __P((void));
+void console_scan __P((int (*)(int, caddr_t, void *), void *));
+caddr_t iomap __P((caddr_t, int));
+void iounmap __P((caddr_t, int));
+#endif /* _KERNEL */
diff --git a/sys/arch/hp300/stand/itevar.h b/sys/arch/hp300/stand/itevar.h
new file mode 100644
index 00000000000..cebbb2ec6cd
--- /dev/null
+++ b/sys/arch/hp300/stand/itevar.h
@@ -0,0 +1,231 @@
+/* $NetBSD: itevar.h,v 1.1 1996/03/03 04:23:42 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1988 University of Utah.
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * the Systems Programming Group of the University of Utah Computer
+ * Science Department.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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.
+ *
+ * from: Utah $Hdr: itevar.h 1.15 92/12/20$
+ *
+ * @(#)itevar.h 8.1 (Berkeley) 6/10/93
+ */
+
+/*
+ * Standalone version of hp300 ITE.
+ */
+
+#define ITEUNIT(dev) minor(dev)
+
+#define getbyte(ip, offset) \
+ ((*(ip)->isw->ite_readbyte)(ip, offset))
+
+#define getword(ip, offset) \
+ ((getbyte(ip, offset) << 8) | getbyte(ip, (offset) + 2))
+
+#define writeglyph(ip, offset, fontbuf) \
+ ((*(ip)->isw->ite_writeglyph)((ip), (offset), (fontbuf)))
+
+struct ite_data {
+ int flags;
+ struct tty *tty;
+ struct itesw *isw;
+ struct grf_data *grf;
+ caddr_t regbase, fbbase;
+ short curx, cury;
+ short cursorx, cursory;
+ short cblankx, cblanky;
+ short rows, cols;
+ short cpl;
+ short dheight, dwidth;
+ short fbheight, fbwidth;
+ short ftheight, ftwidth;
+ short fontx, fonty;
+ short attribute;
+ u_char *attrbuf;
+ short planemask;
+ short pos;
+ char imode, escape, fpd, hold;
+ caddr_t devdata; /* display dependent data */
+};
+
+struct itesw {
+ int ite_hwid;
+ void (*ite_init) __P((struct ite_data *));
+ void (*ite_deinit) __P((struct ite_data *));
+ void (*ite_clear) __P((struct ite_data *, int, int, int, int));
+ void (*ite_putc) __P((struct ite_data *, int, int, int, int));
+ void (*ite_cursor) __P((struct ite_data *, int));
+ void (*ite_scroll) __P((struct ite_data *, int, int, int, int));
+ u_char (*ite_readbyte) __P((struct ite_data *, int));
+ void (*ite_writeglyph) __P((struct ite_data *, u_char *, u_char *));
+};
+
+/* Flags */
+#define ITE_ALIVE 0x01 /* hardware exists */
+#define ITE_INITED 0x02 /* device has been initialized */
+#define ITE_CONSOLE 0x04 /* device can be console */
+#define ITE_ISCONS 0x08 /* device is console */
+#define ITE_ACTIVE 0x10 /* device is being used as ITE */
+#define ITE_INGRF 0x20 /* device in use as non-ITE */
+#define ITE_CURSORON 0x40 /* cursor being tracked */
+
+#define attrloc(ip, y, x) \
+ (ip->attrbuf + ((y) * ip->cols) + (x))
+
+#define attrclr(ip, sy, sx, h, w) \
+ bzero(ip->attrbuf + ((sy) * ip->cols) + (sx), (h) * (w))
+
+#define attrmov(ip, sy, sx, dy, dx, h, w) \
+ bcopy(ip->attrbuf + ((sy) * ip->cols) + (sx), \
+ ip->attrbuf + ((dy) * ip->cols) + (dx), \
+ (h) * (w))
+
+#define attrtest(ip, attr) \
+ ((* (u_char *) attrloc(ip, ip->cury, ip->curx)) & attr)
+
+#define attrset(ip, attr) \
+ ((* (u_char *) attrloc(ip, ip->cury, ip->curx)) = attr)
+
+/*
+ * X and Y location of character 'c' in the framebuffer, in pixels.
+ */
+#define charX(ip,c) \
+ (((c) % (ip)->cpl) * (ip)->ftwidth + (ip)->fontx)
+
+#define charY(ip,c) \
+ (((c) / (ip)->cpl) * (ip)->ftheight + (ip)->fonty)
+
+/*
+ * The cursor is just an inverted space.
+ */
+#define draw_cursor(ip) { \
+ WINDOWMOVER(ip, ip->cblanky, ip->cblankx, \
+ ip->cury * ip->ftheight, \
+ ip->curx * ip->ftwidth, \
+ ip->ftheight, ip->ftwidth, RR_XOR); \
+ ip->cursorx = ip->curx; \
+ ip->cursory = ip->cury; }
+
+#define erase_cursor(ip) \
+ WINDOWMOVER(ip, ip->cblanky, ip->cblankx, \
+ ip->cursory * ip->ftheight, \
+ ip->cursorx * ip->ftwidth, \
+ ip->ftheight, ip->ftwidth, RR_XOR);
+
+/* Character attributes */
+#define ATTR_NOR 0x0 /* normal */
+#define ATTR_INV 0x1 /* inverse */
+#define ATTR_UL 0x2 /* underline */
+#define ATTR_ALL (ATTR_INV | ATTR_UL)
+
+/* Keyboard attributes */
+#define ATTR_KPAD 0x4 /* keypad transmit */
+
+/* Replacement Rules */
+#define RR_CLEAR 0x0
+#define RR_COPY 0x3
+#define RR_XOR 0x6
+#define RR_COPYINVERTED 0xc
+
+#define SCROLL_UP 0x01
+#define SCROLL_DOWN 0x02
+#define SCROLL_LEFT 0x03
+#define SCROLL_RIGHT 0x04
+#define DRAW_CURSOR 0x05
+#define ERASE_CURSOR 0x06
+#define MOVE_CURSOR 0x07
+
+#define KBD_SSHIFT 4 /* bits to shift status */
+#define KBD_CHARMASK 0x7F
+
+/* keyboard status */
+#define KBD_SMASK 0xF /* service request status mask */
+#define KBD_CTRLSHIFT 0x8 /* key + CTRL + SHIFT */
+#define KBD_CTRL 0x9 /* key + CTRL */
+#define KBD_SHIFT 0xA /* key + SHIFT */
+#define KBD_KEY 0xB /* key only */
+
+#define KBD_CAPSLOCK 0x18
+
+#define KBD_EXT_LEFT_DOWN 0x12
+#define KBD_EXT_LEFT_UP 0x92
+#define KBD_EXT_RIGHT_DOWN 0x13
+#define KBD_EXT_RIGHT_UP 0x93
+
+#define TABSIZE 8
+#define TABEND(ip) ((ip)->tty->t_winsize.ws_col - TABSIZE)
+
+extern struct ite_data ite_data[];
+extern struct itesw itesw[];
+extern int nitesw;
+
+/*
+ * Prototypes.
+ */
+u_char ite_readbyte __P((struct ite_data *, int));
+void ite_writeglyph __P((struct ite_data *, u_char *, u_char *));
+
+/*
+ * Framebuffer-specific ITE prototypes.
+ */
+void topcat_init __P((struct ite_data *));
+void topcat_clear __P((struct ite_data *, int, int, int, int));
+void topcat_putc __P((struct ite_data *, int, int, int, int));
+void topcat_cursor __P((struct ite_data *, int));
+void topcat_scroll __P((struct ite_data *, int, int, int, int));
+
+void gbox_init __P((struct ite_data *));
+void gbox_clear __P((struct ite_data *, int, int, int, int));
+void gbox_putc __P((struct ite_data *, int, int, int, int));
+void gbox_cursor __P((struct ite_data *, int));
+void gbox_scroll __P((struct ite_data *, int, int, int, int));
+
+void rbox_init __P((struct ite_data *));
+void rbox_clear __P((struct ite_data *, int, int, int, int));
+void rbox_putc __P((struct ite_data *, int, int, int, int));
+void rbox_cursor __P((struct ite_data *, int));
+void rbox_scroll __P((struct ite_data *, int, int, int, int));
+
+void dvbox_clear __P((struct ite_data *, int, int, int, int));
+void dvbox_putc __P((struct ite_data *, int, int, int, int));
+void dvbox_cursor __P((struct ite_data *, int));
+void dvbox_scroll __P((struct ite_data *, int, int, int, int));
+
+void hyper_init __P((struct ite_data *));
+void hyper_clear __P((struct ite_data *, int, int, int, int));
+void hyper_putc __P((struct ite_data *, int, int, int, int));
+void hyper_cursor __P((struct ite_data *, int));
+void hyper_scroll __P((struct ite_data *, int, int, int, int));
+