summaryrefslogtreecommitdiff
path: root/sys/arch/vax
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2008-08-18 23:04:29 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2008-08-18 23:04:29 +0000
commit9901ccb8a55028463955f3ea4cbd066a479e8a48 (patch)
treec37942f0e57a285f9314c3db6bd99c5447398879 /sys/arch/vax
parentf144144965ffe5dc6058fe0cd7216a9bbd2acc46 (diff)
Shuffle the dz console code (both serial and keyboard) to be more independent
of the console device attachment, and to be able to work on system where there are more than one dz device of the same type, one of it being the console one. This also allows a different register layout than the dz@ibus one to be used for the dz console device.
Diffstat (limited to 'sys/arch/vax')
-rw-r--r--sys/arch/vax/conf/files.vax8
-rw-r--r--sys/arch/vax/dec/dzcons.c292
-rw-r--r--sys/arch/vax/dec/dzinput.c100
-rw-r--r--sys/arch/vax/dec/dzkbd.c25
-rw-r--r--sys/arch/vax/dec/dzkbdvar.h17
-rw-r--r--sys/arch/vax/dec/files.dec5
-rw-r--r--sys/arch/vax/vax/wscons_machdep.c4
-rw-r--r--sys/arch/vax/vsa/dz_ibus.c346
8 files changed, 483 insertions, 314 deletions
diff --git a/sys/arch/vax/conf/files.vax b/sys/arch/vax/conf/files.vax
index 66102cb369a..5524e546c7d 100644
--- a/sys/arch/vax/conf/files.vax
+++ b/sys/arch/vax/conf/files.vax
@@ -1,4 +1,4 @@
-# $OpenBSD: files.vax,v 1.45 2008/04/25 14:51:35 jmc Exp $
+# $OpenBSD: files.vax,v 1.46 2008/08/18 23:04:26 miod Exp $
# $NetBSD: files.vax,v 1.60 1999/08/27 20:04:32 ragge Exp $
#
# new style config file for vax architecture
@@ -17,6 +17,8 @@ device cpu
device mem
device mba {drive = -1}
+define dzcons
+
# SBI and related devices
device sbi {tr = -1}
attach sbi at mainbus with sbi_mainbus
@@ -116,7 +118,7 @@ device ts: tape
attach ts at uba
file arch/vax/uba/ts.c ts needs-flag
-attach dz at vsbus with dz_vsbus
+attach dz at vsbus with dz_vsbus: dzcons
file arch/vax/vsa/dz_ibus.c dz_vsbus
# VXT serial
@@ -201,6 +203,8 @@ attach lkms at qsc with qscms
file arch/vax/dec/dzms.c dzms needs-flag
file arch/vax/vxt/qscms.c qscms needs-flag
+file arch/vax/dec/dzinput.c dzkbd | dzms
+
# These devices aren't tested (or even compiled!)
# They are just included here to make some files happy ;)
#
diff --git a/sys/arch/vax/dec/dzcons.c b/sys/arch/vax/dec/dzcons.c
new file mode 100644
index 00000000000..54778d3ac7b
--- /dev/null
+++ b/sys/arch/vax/dec/dzcons.c
@@ -0,0 +1,292 @@
+/* $OpenBSD: dzcons.c,v 1.1 2008/08/18 23:04:28 miod Exp $ */
+/* $NetBSD: dz_ibus.c,v 1.15 1999/08/27 17:50:42 ragge Exp $ */
+/*
+ * Copyright (c) 1998 Ludd, University of Lule}, Sweden.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed 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
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Console routines for system using DZ11-like controllers, with the
+ * same register mapping as found on VAXstations.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/device.h>
+
+#include <dev/cons.h>
+
+#include <machine/mtpr.h>
+#include <machine/sid.h>
+#include <machine/vsbus.h>
+#include <machine/ka420.h>
+#ifdef VAX60
+#include <vax/mbus/mbusreg.h>
+#include <vax/mbus/mbusvar.h>
+#endif
+
+#include <vax/qbus/dzreg.h>
+#include <vax/qbus/dzvar.h>
+
+#include <vax/dec/dzkbdvar.h>
+
+vaddr_t dz_console_regs; /* console registers mapping */
+
+#define REG(name) short name; short X##name##X;
+static volatile struct ss_dz {/* base address of DZ-controller: 0x200a0000 */
+ REG(csr); /* 00 Csr: control/status register */
+ REG(rbuf); /* 04 Rbuf/Lpr: receive buffer/line param reg. */
+ REG(tcr); /* 08 Tcr: transmit console register */
+ REG(tdr); /* 0C Msr/Tdr: modem status reg/transmit data reg */
+ REG(lpr0); /* 10 Lpr0: */
+ REG(lpr1); /* 14 Lpr0: */
+ REG(lpr2); /* 18 Lpr0: */
+ REG(lpr3); /* 1C Lpr0: */
+} *dz;
+#undef REG
+
+cdev_decl(dz);
+cons_decl(dz);
+
+extern int getmajor(void *); /* conf.c */
+
+int dzcngetc_internal(int);
+
+/*
+ * Receive a character on the given line (blocking call).
+ * Used by both serial and keyboard cngetc routines.
+ */
+int
+dzcngetc_internal(int line)
+{
+ u_short rbuf;
+
+ for (;;) {
+ while ((dz->csr & DZ_CSR_RX_DONE) == 0)
+ ; /* Wait for char */
+ rbuf = dz->rbuf;
+ if (((rbuf >> 8) & 3) != line)
+ continue;
+ return (rbuf & 0xff);
+ }
+}
+
+/*
+ * Returns whether the dz attachment may have a keyboard plugged in.
+ * There are no specific parameters identifying the dz chip, since
+ * - VAXstation can only have one non-qbus dz chip.
+ * - ...except for the KA60 (VAXstation 3500), which can have keyboards
+ * connected to all I/O modules, if more than one.
+ * - ...and QBus dz attachments do not invoke this function as they know
+ * they are ``regular'' serial lines only.
+ */
+int
+dz_can_have_kbd()
+{
+ switch (vax_boardtype) {
+ case VAX_BTYP_410:
+ case VAX_BTYP_420:
+ case VAX_BTYP_43:
+ if ((vax_confdata & KA420_CFG_MULTU) == 0)
+ return (1);
+ break;
+
+ case VAX_BTYP_46:
+ if ((vax_siedata & 0xff) == VAX_VTYP_46)
+ return (1);
+ break;
+ case VAX_BTYP_48:
+ if (((vax_siedata >> 8) & 0xff) == VAX_STYP_48)
+ return (1);
+ break;
+
+ case VAX_BTYP_49:
+#ifdef VAX60
+ case VAX_BTYP_60:
+#endif
+ return (1);
+
+ default:
+ break;
+ }
+
+ return (0);
+}
+
+int
+dzcngetc(dev)
+ dev_t dev;
+{
+ int c = 0, s;
+ int line = minor(dev);
+
+ s = spltty();
+ do {
+ c = dzcngetc_internal(line) & 0x7f;
+ } while (c == 17 || c == 19); /* ignore XON/XOFF */
+ splx(s);
+
+ if (c == 13)
+ c = 10;
+
+ return (c);
+}
+
+void
+dzcnprobe(cndev)
+ struct consdev *cndev;
+{
+ extern vaddr_t iospace;
+ int diagcons, major;
+ paddr_t ioaddr = 0x200a0000;
+
+ if ((major = getmajor(dzopen)) < 0)
+ return;
+
+ switch (vax_boardtype) {
+ case VAX_BTYP_410:
+ case VAX_BTYP_420:
+ case VAX_BTYP_43:
+ diagcons = (vax_confdata & KA420_CFG_L3CON ? 3 : 0);
+ break;
+
+ case VAX_BTYP_46:
+ case VAX_BTYP_48:
+ diagcons = (vax_confdata & 0x100 ? 3 : 0);
+ break;
+
+ case VAX_BTYP_49:
+ ioaddr = 0x25000000;
+ diagcons = (vax_confdata & 8 ? 3 : 0);
+ break;
+
+ case VAX_BTYP_1303:
+ ioaddr = 0x25000000;
+ diagcons = 3;
+ break;
+
+#ifdef VAX60
+ case VAX_BTYP_60:
+ ioaddr = MBUS_SLOT_BASE(mbus_ioslot) + 0x600000;
+ diagcons = 3; /* XXX force serial for now */
+ break;
+#endif
+
+ default:
+ return;
+ }
+
+ cndev->cn_pri = diagcons != 0 ? CN_HIGHPRI : CN_LOWPRI;
+ cndev->cn_dev = makedev(major, dz_can_have_kbd() ? 3 : diagcons);
+ dz_console_regs = iospace;
+ ioaccess(iospace, ioaddr, 1);
+}
+
+void
+dzcninit(cndev)
+ struct consdev *cndev;
+{
+ dzcninit_internal(minor(cndev->cn_dev));
+}
+
+void
+dzcninit_internal(int line)
+{
+ int speed;
+
+ dz = (void *)dz_console_regs;
+
+ speed = line == 0 ? DZ_LPR_B4800 : DZ_LPR_B9600;
+
+ dz->csr = 0; /* Disable scanning until initting is done */
+ dz->tcr = 1 << line; /* Turn on xmitter */
+ dz->csr = DZ_CSR_MSE; /* Turn scanning back on */
+ dz->rbuf = DZ_LPR_RX_ENABLE | (speed << 8) | DZ_LPR_8_BIT_CHAR | line;
+}
+
+/*
+ * IMPORTANT! Do not use major(dev) in dzcnputc(), as dzputc() only provides
+ * meaningful minor when invoking dzcnputc().
+ */
+void
+dzcnputc(dev,ch)
+ dev_t dev;
+ int ch;
+{
+ int timeout = 1<<15; /* don't hang the machine! */
+ int s;
+ int mino = minor(dev);
+ u_short tcr;
+
+ if (mfpr(PR_MAPEN) == 0)
+ return;
+
+ /*
+ * If we are past boot stage, dz* will interrupt,
+ * therefore we block.
+ */
+ s = spltty();
+ tcr = dz->tcr; /* remember which lines to scan */
+ dz->tcr = (1 << mino);
+
+ while ((dz->csr & DZ_CSR_TX_READY) == 0) /* Wait until ready */
+ if (--timeout < 0)
+ break;
+ dz->tdr = ch; /* Put the character */
+ timeout = 1<<15;
+ while ((dz->csr & DZ_CSR_TX_READY) == 0) /* Wait until ready */
+ if (--timeout < 0)
+ break;
+
+ dz->tcr = tcr;
+ splx(s);
+}
+
+void
+dzcnpollc(dev, pollflag)
+ dev_t dev;
+ int pollflag;
+{
+ static u_char mask;
+
+ switch (vax_boardtype) {
+#ifdef VAX60
+ case VAX_BTYP_60:
+ break;
+#endif
+
+ default:
+ if (pollflag)
+ mask = vsbus_setmask(0);
+ else
+ vsbus_setmask(mask);
+ break;
+ }
+}
diff --git a/sys/arch/vax/dec/dzinput.c b/sys/arch/vax/dec/dzinput.c
new file mode 100644
index 00000000000..de6b88acd30
--- /dev/null
+++ b/sys/arch/vax/dec/dzinput.c
@@ -0,0 +1,100 @@
+/* $OpenBSD: dzinput.c,v 1.1 2008/08/18 23:04:28 miod Exp $ */
+/* $NetBSD: dz_ibus.c,v 1.15 1999/08/27 17:50:42 ragge Exp $ */
+/*
+ * Copyright (c) 1998 Ludd, University of Lule}, Sweden.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed 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
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Common input routines used by dzkbd and dzms devices.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/tty.h>
+#include <sys/conf.h>
+#include <sys/device.h>
+
+#include <machine/bus.h>
+
+#include <vax/qbus/dzreg.h>
+#include <vax/qbus/dzvar.h>
+
+#include <vax/dec/dzkbdvar.h>
+
+#include <dev/cons.h>
+
+cons_decl(dz);
+
+int
+dz_print(void *aux, const char *name)
+{
+ struct dzkm_attach_args *dz_args = aux;
+
+ if (name != NULL)
+ printf(dz_args->daa_line == 0 ? "lkkbd at %s" : "lkms at %s",
+ name);
+ else
+ printf(" line %d", dz_args->daa_line);
+
+ return (UNCONF);
+}
+
+void
+dzputc(struct dz_linestate *ls, int ch)
+{
+ int line;
+ u_short tcr;
+ int s;
+
+ /*
+ * If the dz has already been attached, the MI
+ * driver will do the transmitting...
+ */
+ if (ls && ls->dz_sc) {
+ s = spltty();
+ line = ls->dz_line;
+ putc(ch, &ls->dz_tty->t_outq);
+ tcr = DZ_READ_WORD(ls->dz_sc, dr_tcr);
+ if (!(tcr & (1 << line)))
+ DZ_WRITE_WORD(ls->dz_sc, dr_tcr, tcr | (1 << line));
+ dzxint(ls->dz_sc);
+ splx(s);
+ return;
+ }
+
+ /*
+ * Otherwise, use dzcnputc to do the transmitting.
+ * This situation only happens for a console keyboard, which is
+ * why the minor is hardcoded to the line number. Also, dzcnputc()
+ * does not care about the major number, so we skip a not-so-cheap
+ * getminor() call.
+ */
+ dzcnputc(makedev(0 /*getmajor(dzopen)*/, 0), ch);
+}
diff --git a/sys/arch/vax/dec/dzkbd.c b/sys/arch/vax/dec/dzkbd.c
index 22ba50eb035..e5336ee04d8 100644
--- a/sys/arch/vax/dec/dzkbd.c
+++ b/sys/arch/vax/dec/dzkbd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dzkbd.c,v 1.12 2006/08/27 16:50:43 miod Exp $ */
+/* $OpenBSD: dzkbd.c,v 1.13 2008/08/18 23:04:28 miod Exp $ */
/* $NetBSD: dzkbd.c,v 1.1 2000/12/02 17:03:55 ragge Exp $ */
/*
@@ -189,13 +189,19 @@ dzkbd_attach(struct device *parent, struct device *self, void *aux)
}
int
-dzkbd_cnattach(struct dz_linestate *ls)
+dzkbd_cnattach()
{
+ /*
+ * Early operation (especially keyboard initialization)
+ * requires the help of the serial console routines, which
+ * need to be initialized to work with the keyboard line.
+ */
+ dzcninit_internal(0);
dzkbd_console_internal.dzi_ks.attmt.sendchar = dzkbd_sendchar;
- dzkbd_console_internal.dzi_ks.attmt.cookie = ls;
+ dzkbd_console_internal.dzi_ks.attmt.cookie = NULL;
lk201_init(&dzkbd_console_internal.dzi_ks);
- dzkbd_console_internal.dzi_ls = ls;
+ dzkbd_console_internal.dzi_ls = NULL;
wskbd_cnattach(&dzkbd_consops, &dzkbd_console_internal,
&dzkbd_keymapdata);
@@ -216,10 +222,17 @@ void
dzkbd_cngetc(void *v, u_int *type, int *data)
{
struct dzkbd_internal *dzi = v;
- int c;
+#if 0
+ int line = dzi->dzi_ls != NULL ? dzi->dzi_ls->dz_line : 0;
+#else
+ int line = 0; /* keyboard */
+#endif
+ int c, s;
do {
- c = dzgetc(dzi->dzi_ls);
+ s = spltty();
+ c = dzcngetc_internal(line);
+ splx(s);
} while (lk201_decode(&dzi->dzi_ks, 1, 0, c, type, data) == LKD_NODATA);
}
diff --git a/sys/arch/vax/dec/dzkbdvar.h b/sys/arch/vax/dec/dzkbdvar.h
index 2b8a80f3ef5..5d12b631752 100644
--- a/sys/arch/vax/dec/dzkbdvar.h
+++ b/sys/arch/vax/dec/dzkbdvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: dzkbdvar.h,v 1.2 2006/07/29 17:06:25 miod Exp $ */
+/* $OpenBSD: dzkbdvar.h,v 1.3 2008/08/18 23:04:28 miod Exp $ */
/* $NetBSD: dzkbdvar.h,v 1.2 2001/03/06 07:40:52 matt Exp $ */
struct dzkm_attach_args {
@@ -7,11 +7,14 @@ struct dzkm_attach_args {
#define DZKBD_CONSOLE 1
};
+/* dzcons.c */
+int dz_can_have_kbd(void);
+void dzcninit_internal(int);
+int dzcngetc_internal(int);
+/* dzinput.c */
+void dzputc(struct dz_linestate *, int);
+int dz_print(void *, const char *);
-/* These functions must be present for the keyboard/mouse to work */
-int dzgetc(struct dz_linestate *);
-void dzputc(struct dz_linestate *, int);
-
-/* Exported functions */
-int dzkbd_cnattach(struct dz_linestate *);
+/* dzkbd.c */
+int dzkbd_cnattach(void);
diff --git a/sys/arch/vax/dec/files.dec b/sys/arch/vax/dec/files.dec
index f5cf9618b67..fe2848d1163 100644
--- a/sys/arch/vax/dec/files.dec
+++ b/sys/arch/vax/dec/files.dec
@@ -1,10 +1,13 @@
-# $OpenBSD: files.dec,v 1.4 2006/08/27 16:52:15 miod Exp $
+# $OpenBSD: files.dec,v 1.5 2008/08/18 23:04:28 miod Exp $
# $NetBSD: files.dec,v 1.4 1999/08/04 07:17:51 nisimura Exp $
#
# Config file and device description for machine-independent
# code for devices for Digital Equipment Corp. systems.
# Included by ports that need it.
+# Console on DZ11-like serial ports
+file arch/vax/dec/dzcons.c dzcons
+
# LK201 keyboard
file arch/vax/dec/lk201_ws.c lkkbd
file arch/vax/dec/wskbdmap_lk201.c lkkbd
diff --git a/sys/arch/vax/vax/wscons_machdep.c b/sys/arch/vax/vax/wscons_machdep.c
index fd626539e67..ab24b9c71a3 100644
--- a/sys/arch/vax/vax/wscons_machdep.c
+++ b/sys/arch/vax/vax/wscons_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wscons_machdep.c,v 1.4 2008/01/23 16:37:57 jsing Exp $ */
+/* $OpenBSD: wscons_machdep.c,v 1.5 2008/08/18 23:04:28 miod Exp $ */
/*
* Copyright (c) 2006 Miodrag Vallat.
*
@@ -129,7 +129,7 @@ wscninit(struct consdev *cp)
switch (vax_bustype) {
case VAX_VSBUS:
#if NDZKBD > 0
- dzkbd_cnattach(0); /* Connect keyboard and screen together */
+ dzkbd_cnattach();
#endif
break;
case VAX_VXTBUS:
diff --git a/sys/arch/vax/vsa/dz_ibus.c b/sys/arch/vax/vsa/dz_ibus.c
index 006ec51707e..c9ac16cd849 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.25 2008/08/15 22:44:12 miod Exp $ */
+/* $OpenBSD: dz_ibus.c,v 1.26 2008/08/18 23:04:28 miod Exp $ */
/* $NetBSD: dz_ibus.c,v 1.15 1999/08/27 17:50:42 ragge Exp $ */
/*
* Copyright (c) 1998 Ludd, University of Lule}, Sweden.
@@ -31,92 +31,49 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
-
#include <sys/param.h>
-#include <sys/proc.h>
#include <sys/systm.h>
-#include <sys/ioctl.h>
-#include <sys/tty.h>
-#include <sys/file.h>
-#include <sys/conf.h>
#include <sys/device.h>
-#include <sys/reboot.h>
-
-#include <dev/cons.h>
-#include <machine/mtpr.h>
#include <machine/sid.h>
-#include <machine/uvax.h>
#include <machine/vsbus.h>
#include <machine/cpu.h>
#include <machine/scb.h>
-#include <machine/nexus.h>
-#include <machine/ka420.h>
-
-#include <vax/vax/gencons.h>
#include <vax/qbus/dzreg.h>
#include <vax/qbus/dzvar.h>
#include <vax/dec/dzkbdvar.h>
+#include <dev/cons.h>
+
#include "dzkbd.h"
#include "dzms.h"
-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 */
+int dz_vsbus_match(struct device *, struct cfdata *, void *);
+void dz_vsbus_attach(struct device *, struct device *, void *);
struct cfattach dz_vsbus_ca = {
sizeof(struct dz_softc), (cfmatch_t)dz_vsbus_match, dz_vsbus_attach
};
-#define REG(name) short name; short X##name##X;
-static volatile struct ss_dz {/* base address of DZ-controller: 0x200a0000 */
- REG(csr); /* 00 Csr: control/status register */
- REG(rbuf); /* 04 Rbuf/Lpr: receive buffer/line param reg. */
- REG(tcr); /* 08 Tcr: transmit console register */
- REG(tdr); /* 0C Msr/Tdr: modem status reg/transmit data reg */
- REG(lpr0); /* 10 Lpr0: */
- REG(lpr1); /* 14 Lpr0: */
- REG(lpr2); /* 18 Lpr0: */
- REG(lpr3); /* 1C Lpr0: */
-} *dz;
-#undef REG
-
-cons_decl(dz);
-cdev_decl(dz);
-
-int dz_can_have_kbd(void);
-
-extern int getmajor(void *); /* conf.c */
-
-#if NDZKBD > 0 || NDZMS > 0
-static int
-dz_print(void *aux, const char *name)
-{
- struct dzkm_attach_args *dz_args = aux;
-
- if (name != NULL)
- printf(dz_args->daa_line == 0 ? "lkkbd at %s" : "lkms at %s",
- name);
- else
- printf(" line %d", dz_args->daa_line);
-
- return (UNCONF);
-}
-#endif
+#define DZ_VSBUS_CSR 0
+#define DZ_VSBUS_RBUF 4
+#define DZ_VSBUS_DTR 9
+#define DZ_VSBUS_BREAK 13
+#define DZ_VSBUS_TBUF 12
+#define DZ_VSBUS_TCR 8
+#define DZ_VSBUS_DCD 13
+#define DZ_VSBUS_RING 13
-static int
+int
dz_vsbus_match(parent, cf, aux)
struct device *parent;
struct cfdata *cf;
void *aux;
{
struct vsbus_attach_args *va = aux;
- struct ss_dz *dzP;
+ volatile uint16_t *dzP;
short i;
#if VAX53 || VAX49
@@ -126,21 +83,21 @@ dz_vsbus_match(parent, cf, aux)
return 0; /* don't probe unnecessarily */
#endif
- dzP = (struct ss_dz *)va->va_addr;
- i = dzP->tcr;
- dzP->csr = DZ_CSR_MSE|DZ_CSR_TXIE;
- dzP->tcr = 0;
+ dzP = (volatile uint16_t *)va->va_addr;
+ i = dzP[DZ_VSBUS_TCR / 2];
+ dzP[DZ_VSBUS_CSR / 2] = DZ_CSR_MSE|DZ_CSR_TXIE;
+ dzP[DZ_VSBUS_TCR / 2] = 0;
DELAY(1000);
- dzP->tcr = 1;
+ dzP[DZ_VSBUS_TCR / 2] = 1;
DELAY(100000);
- dzP->tcr = i;
+ dzP[DZ_VSBUS_TCR / 2] = i;
/* If the device doesn't exist, no interrupt has been generated */
return 1;
}
-static void
+void
dz_vsbus_attach(parent, self, aux)
struct device *parent, *self;
void *aux;
@@ -150,40 +107,45 @@ dz_vsbus_attach(parent, self, aux)
#if NDZKBD > 0 || NDZMS > 0
struct dzkm_attach_args daa;
#endif
+ extern vaddr_t dz_console_regs;
+ vaddr_t dz_regs;
printf(": ");
+ /*
+ * This assumes that systems where dz@vsbus exist and can be
+ * the console device, can only have one instance of dz@vsbus.
+ * So far, so good.
+ */
+ if (dz_console_regs != 0) {
+ dz_regs = dz_console_regs;
+ printf("console, ");
+ } else
+ dz_regs = vax_map_physmem(va->va_paddr, 1);
+
/*
* XXX - This is evil and ugly, but...
* due to the nature of how bus_space_* works on VAX, this will
* be perfectly good until everything is converted.
*/
-
- if (dz_regs == 0) /* This isn't console */
- dz_regs = vax_map_physmem(va->va_paddr, 1);
- else
- printf("console, ");
-
sc->sc_ioh = dz_regs;
- sc->sc_dr.dr_csr = 0;
- sc->sc_dr.dr_rbuf = 4;
- sc->sc_dr.dr_dtr = 9;
- sc->sc_dr.dr_break = 13;
- sc->sc_dr.dr_tbuf = 12;
- sc->sc_dr.dr_tcr = 8;
- sc->sc_dr.dr_dcd = 13;
- sc->sc_dr.dr_ring = 13;
+ sc->sc_dr.dr_csr = DZ_VSBUS_CSR;
+ sc->sc_dr.dr_rbuf = DZ_VSBUS_RBUF;
+ sc->sc_dr.dr_dtr = DZ_VSBUS_DTR;
+ sc->sc_dr.dr_break = DZ_VSBUS_BREAK;
+ sc->sc_dr.dr_tbuf = DZ_VSBUS_TBUF;
+ sc->sc_dr.dr_tcr = DZ_VSBUS_TCR;
+ sc->sc_dr.dr_dcd = DZ_VSBUS_DCD;
+ sc->sc_dr.dr_ring = DZ_VSBUS_RING;
sc->sc_type = DZ_DZV;
sc->sc_dsr = 0x0f; /* XXX check if VS has modem ctrl bits */
sc->sc_rcvec = va->va_cvec;
- scb_vecalloc(sc->sc_rcvec, dzxint, sc, SCB_ISTACK,
- &sc->sc_tintrcnt);
+ scb_vecalloc(sc->sc_rcvec, dzxint, sc, SCB_ISTACK, &sc->sc_tintrcnt);
sc->sc_tcvec = va->va_cvec - 4;
- scb_vecalloc(sc->sc_tcvec, dzrint, sc, SCB_ISTACK,
- &sc->sc_rintrcnt);
+ scb_vecalloc(sc->sc_tcvec, dzrint, sc, SCB_ISTACK, &sc->sc_rintrcnt);
evcount_attach(&sc->sc_rintrcnt, sc->sc_dev.dv_xname,
(void *)&sc->sc_rcvec, &evcount_intr);
evcount_attach(&sc->sc_tintrcnt, sc->sc_dev.dv_xname,
@@ -197,18 +159,18 @@ dz_vsbus_attach(parent, self, aux)
#if NDZKBD > 0
extern struct consdev wsdisplay_cons;
- dz->rbuf = DZ_LPR_RX_ENABLE | (DZ_LPR_B4800 << 8)
- | DZ_LPR_8_BIT_CHAR;
daa.daa_line = 0;
+ DZ_WRITE_WORD(sc, dr_rbuf, DZ_LPR_RX_ENABLE |
+ (DZ_LPR_B4800 << 8) | DZ_LPR_8_BIT_CHAR | daa.daa_line);
daa.daa_flags =
(cn_tab == &wsdisplay_cons ? DZKBD_CONSOLE : 0);
config_found(self, &daa, dz_print);
#endif
#if NDZMS > 0
- dz->rbuf = DZ_LPR_RX_ENABLE | (DZ_LPR_B4800 << 8) |
- DZ_LPR_8_BIT_CHAR | DZ_LPR_PARENB | DZ_LPR_OPAR |
- 1 /* line */;
daa.daa_line = 1;
+ DZ_WRITE_WORD(sc, dr_rbuf, DZ_LPR_RX_ENABLE |
+ (DZ_LPR_B4800 << 8) | DZ_LPR_8_BIT_CHAR | DZ_LPR_PARENB |
+ DZ_LPR_OPAR | daa.daa_line);
daa.daa_flags = 0;
config_found(self, &daa, dz_print);
#endif
@@ -221,211 +183,3 @@ dz_vsbus_attach(parent, self, aux)
splx(s);
#endif
}
-
-int
-dzcngetc(dev)
- dev_t dev;
-{
- int c = 0, s;
- int mino = minor(dev);
- u_short rbuf;
-
- s = spltty();
- do {
- while ((dz->csr & DZ_CSR_RX_DONE) == 0)
- ; /* Wait for char */
- rbuf = dz->rbuf;
- if (((rbuf >> 8) & 3) != mino)
- continue;
- c = rbuf & 0x7f;
- } while (c == 17 || c == 19); /* ignore XON/XOFF */
- splx(s);
-
- if (c == 13)
- c = 10;
-
- return (c);
-}
-
-int
-dz_can_have_kbd()
-{
- switch (vax_boardtype) {
- case VAX_BTYP_410:
- case VAX_BTYP_420:
- case VAX_BTYP_43:
- if ((vax_confdata & KA420_CFG_MULTU) == 0)
- return (1);
- break;
-
- case VAX_BTYP_46:
- if ((vax_siedata & 0xff) == VAX_VTYP_46)
- return (1);
- break;
- case VAX_BTYP_48:
- if (((vax_siedata >> 8) & 0xff) == VAX_STYP_48)
- return (1);
- break;
-
- case VAX_BTYP_49:
- return (1);
-
- default:
- break;
- }
-
- return (0);
-}
-
-void
-dzcnprobe(cndev)
- struct consdev *cndev;
-{
- extern vaddr_t iospace;
- int diagcons, major;
- paddr_t ioaddr = 0x200a0000;
-
- if ((major = getmajor(dzopen)) < 0)
- return;
-
- switch (vax_boardtype) {
- case VAX_BTYP_410:
- case VAX_BTYP_420:
- case VAX_BTYP_43:
- diagcons = (vax_confdata & KA420_CFG_L3CON ? 3 : 0);
- break;
-
- case VAX_BTYP_46:
- case VAX_BTYP_48:
- diagcons = (vax_confdata & 0x100 ? 3 : 0);
- break;
-
- case VAX_BTYP_49:
- ioaddr = 0x25000000;
- diagcons = (vax_confdata & 8 ? 3 : 0);
- break;
-
- case VAX_BTYP_1303:
- ioaddr = 0x25000000;
- diagcons = 3;
- break;
-
- default:
- return;
- }
- cndev->cn_pri = diagcons != 0 ? CN_HIGHPRI : CN_LOWPRI;
- cndev->cn_dev = makedev(major, dz_can_have_kbd() ? 3 : diagcons);
- dz_regs = iospace;
- dz = (void *)dz_regs;
- ioaccess(iospace, ioaddr, 1);
-}
-
-void
-dzcninit(cndev)
- struct consdev *cndev;
-{
- dz = (void *)dz_regs;
-
- dz->csr = 0; /* Disable scanning until initting is done */
- dz->tcr = (1 << minor(cndev->cn_dev)); /* Turn on xmitter */
- dz->csr = DZ_CSR_MSE; /* Turn scanning back on */
- dz->rbuf = DZ_LPR_RX_ENABLE | (DZ_LPR_B9600 << 8) |
- DZ_LPR_8_BIT_CHAR | minor(cndev->cn_dev) /* line */;
-}
-
-void
-dzcnputc(dev,ch)
- dev_t dev;
- int ch;
-{
- int timeout = 1<<15; /* don't hang the machine! */
- int s;
- int mino = minor(dev);
- u_short tcr;
-
- if (mfpr(PR_MAPEN) == 0)
- return;
-
- /*
- * If we are past boot stage, dz* will interrupt,
- * therefore we block.
- */
- s = spltty();
- tcr = dz->tcr; /* remember which lines to scan */
- dz->tcr = (1 << mino);
-
- while ((dz->csr & DZ_CSR_TX_READY) == 0) /* Wait until ready */
- if (--timeout < 0)
- break;
- dz->tdr = ch; /* Put the character */
- timeout = 1<<15;
- while ((dz->csr & DZ_CSR_TX_READY) == 0) /* Wait until ready */
- if (--timeout < 0)
- break;
-
- dz->tcr = tcr;
- splx(s);
-}
-
-void
-dzcnpollc(dev, pollflag)
- dev_t dev;
- int pollflag;
-{
- static u_char mask;
-
- if (pollflag)
- mask = vsbus_setmask(0);
- else
- vsbus_setmask(mask);
-}
-
-#if NDZKBD > 0 || NDZMS > 0
-int
-dzgetc(struct dz_linestate *ls)
-{
- int line;
- int s;
- u_short rbuf;
-
- if (ls != NULL)
- line = ls->dz_line;
- else
- line = 0; /* keyboard */
-
- s = spltty();
- for (;;) {
- for(; (dz->csr & DZ_CSR_RX_DONE) == 0;)
- ;
- rbuf = dz->rbuf;
- if (((rbuf >> 8) & 3) == line) {
- splx(s);
- return (rbuf & 0xff);
- }
- }
-}
-
-void
-dzputc(struct dz_linestate *ls, int ch)
-{
- int line;
- u_short tcr;
- int s;
-
- /* if the dz has already been attached, the MI
- driver will do the transmitting: */
- if (ls && ls->dz_sc) {
- s = spltty();
- line = ls->dz_line;
- putc(ch, &ls->dz_tty->t_outq);
- tcr = dz->tcr;
- if (!(tcr & (1 << line)))
- dz->tcr = tcr | (1 << line);
- dzxint(ls->dz_sc);
- splx(s);
- return;
- }
- /* use dzcnputc to do the transmitting: */
- dzcnputc(makedev(getmajor(dzopen), 0), ch);
-}
-#endif /* NDZKBD > 0 || NDZMS > 0 */