From babedca81c4a20c2c8e8f240d691b14d0a560019 Mon Sep 17 00:00:00 2001 From: miod Date: Mon, 18 Aug 2008 23:04:26 +0000 Subject: [PATCH] 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. --- sys/arch/vax/conf/files.vax | 8 +- sys/arch/vax/dec/dzcons.c | 292 +++++++++++++++++++++++++ sys/arch/vax/dec/dzinput.c | 100 +++++++++ sys/arch/vax/dec/dzkbd.c | 25 ++- sys/arch/vax/dec/dzkbdvar.h | 17 +- sys/arch/vax/dec/files.dec | 5 +- sys/arch/vax/vax/wscons_machdep.c | 4 +- sys/arch/vax/vsa/dz_ibus.c | 346 +++++------------------------- 8 files changed, 483 insertions(+), 314 deletions(-) create mode 100644 sys/arch/vax/dec/dzcons.c create mode 100644 sys/arch/vax/dec/dzinput.c 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 +#include +#include +#include + +#include + +#include +#include +#include +#include +#ifdef VAX60 +#include +#include +#endif + +#include +#include + +#include + +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 +#include +#include +#include +#include + +#include + +#include +#include + +#include + +#include + +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 -#include #include -#include -#include -#include -#include #include -#include - -#include -#include #include -#include #include #include #include -#include -#include - -#include #include #include #include +#include + #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 */ -- 2.20.1