Home | History | Annotate | Line # | Download | only in vsa
dz_vsbus.c revision 1.11.4.1
      1  1.11.4.1  thorpej /*	$NetBSD: dz_vsbus.c,v 1.11.4.1 1999/06/21 01:03:47 thorpej Exp $ */
      2       1.1    ragge /*
      3       1.1    ragge  * Copyright (c) 1998 Ludd, University of Lule}, Sweden.
      4       1.1    ragge  * All rights reserved.
      5       1.1    ragge  *
      6       1.1    ragge  * Redistribution and use in source and binary forms, with or without
      7       1.1    ragge  * modification, are permitted provided that the following conditions
      8       1.1    ragge  * are met:
      9       1.1    ragge  * 1. Redistributions of source code must retain the above copyright
     10       1.1    ragge  *    notice, this list of conditions and the following disclaimer.
     11       1.1    ragge  * 2. Redistributions in binary form must reproduce the above copyright
     12       1.1    ragge  *    notice, this list of conditions and the following disclaimer in the
     13       1.1    ragge  *    documentation and/or other materials provided with the distribution.
     14       1.1    ragge  * 3. All advertising materials mentioning features or use of this software
     15       1.1    ragge  *    must display the following acknowledgement:
     16       1.1    ragge  *      This product includes software developed at Ludd, University of
     17       1.1    ragge  *      Lule}, Sweden and its contributors.
     18       1.1    ragge  * 4. The name of the author may not be used to endorse or promote products
     19       1.1    ragge  *    derived from this software without specific prior written permission
     20       1.1    ragge  *
     21       1.1    ragge  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     22       1.1    ragge  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     23       1.1    ragge  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     24       1.1    ragge  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     25       1.1    ragge  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     26       1.1    ragge  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27       1.1    ragge  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28       1.1    ragge  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29       1.1    ragge  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     30       1.1    ragge  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31       1.1    ragge  */
     32       1.1    ragge 
     33       1.1    ragge 
     34       1.1    ragge 
     35       1.1    ragge #include <sys/param.h>
     36       1.1    ragge #include <sys/proc.h>
     37       1.1    ragge #include <sys/systm.h>
     38       1.1    ragge #include <sys/ioctl.h>
     39       1.1    ragge #include <sys/tty.h>
     40       1.1    ragge #include <sys/file.h>
     41       1.1    ragge #include <sys/conf.h>
     42       1.1    ragge #include <sys/device.h>
     43       1.1    ragge #include <sys/reboot.h>
     44       1.1    ragge 
     45       1.1    ragge #include <dev/cons.h>
     46       1.1    ragge 
     47       1.1    ragge #include <machine/mtpr.h>
     48       1.1    ragge #include <machine/sid.h>
     49       1.1    ragge #include <machine/uvax.h>
     50       1.1    ragge #include <machine/vsbus.h>
     51       1.7    ragge #include <machine/cpu.h>
     52       1.9    ragge #include <machine/scb.h>
     53       1.7    ragge 
     54       1.1    ragge #include <machine/../vax/gencons.h>
     55       1.1    ragge 
     56  1.11.4.1  thorpej #include <dev/qbus/dzreg.h>
     57  1.11.4.1  thorpej #include <dev/qbus/dzvar.h>
     58       1.1    ragge 
     59       1.1    ragge #include "ioconf.h"
     60       1.4    ragge #include "lkc.h"
     61       1.1    ragge 
     62       1.1    ragge static  int     dz_vsbus_match __P((struct device *, struct cfdata *, void *));
     63       1.1    ragge static  void    dz_vsbus_attach __P((struct device *, struct device *, void *));
     64       1.4    ragge static	int	dz_print __P((void *, const char *));
     65       1.1    ragge 
     66       1.7    ragge static	vaddr_t dz_regs; /* Used for console */
     67       1.7    ragge 
     68       1.1    ragge struct  cfattach dz_vsbus_ca = {
     69       1.9    ragge 	sizeof(struct dz_softc), dz_vsbus_match, dz_vsbus_attach
     70       1.1    ragge };
     71       1.1    ragge 
     72       1.9    ragge #define REG(name)     short name; short X##name##X;
     73       1.9    ragge static volatile struct ss_dz {/* base address of DZ-controller: 0x200A0000 */
     74       1.9    ragge 	REG(csr);	/* 00 Csr: control/status register */
     75       1.9    ragge 	REG(rbuf);	/* 04 Rbuf/Lpr: receive buffer/line param reg. */
     76       1.9    ragge 	REG(tcr);	/* 08 Tcr: transmit console register */
     77       1.9    ragge 	REG(tdr);	/* 0C Msr/Tdr: modem status reg/transmit data reg */
     78       1.9    ragge 	REG(lpr0);	/* 10 Lpr0: */
     79       1.9    ragge 	REG(lpr1);	/* 14 Lpr0: */
     80       1.9    ragge 	REG(lpr2);	/* 18 Lpr0: */
     81       1.9    ragge 	REG(lpr3);	/* 1C Lpr0: */
     82       1.9    ragge } *dz;
     83       1.9    ragge #undef REG
     84       1.1    ragge 
     85       1.9    ragge cons_decl(dz);
     86       1.1    ragge 
     87       1.4    ragge int
     88       1.4    ragge dz_print(aux, name)
     89       1.4    ragge 	void *aux;
     90       1.4    ragge 	const char *name;
     91       1.4    ragge {
     92       1.4    ragge 	if (name)
     93       1.4    ragge 		printf ("lkc at %s", name);
     94       1.4    ragge 	return (UNCONF);
     95       1.4    ragge }
     96       1.4    ragge 
     97       1.1    ragge static int
     98       1.1    ragge dz_vsbus_match(parent, cf, aux)
     99       1.9    ragge 	struct device *parent;
    100       1.9    ragge 	struct cfdata *cf;
    101       1.9    ragge 	void *aux;
    102       1.1    ragge {
    103       1.9    ragge 	struct vsbus_attach_args *va = aux;
    104       1.9    ragge 	struct ss_dz *dzP;
    105       1.9    ragge 	short i;
    106       1.9    ragge 
    107       1.9    ragge 	dzP = (struct ss_dz *)va->va_addr;
    108       1.9    ragge 	i = dzP->tcr;
    109       1.9    ragge 	dzP->csr = DZ_CSR_MSE;
    110       1.9    ragge 	dzP->tcr = 0;
    111       1.9    ragge 	DELAY(1000);
    112       1.9    ragge 	dzP->tcr = 1;
    113       1.9    ragge 	DELAY(100000);
    114       1.9    ragge 	dzP->tcr = i;
    115       1.9    ragge 	va->va_ivec = dzxint;
    116       1.9    ragge 
    117       1.9    ragge 	/* If the device doesn't exist, no interrupt has been generated */
    118       1.9    ragge 	return 1;
    119       1.1    ragge }
    120       1.1    ragge 
    121       1.1    ragge static void
    122       1.1    ragge dz_vsbus_attach(parent, self, aux)
    123       1.9    ragge 	struct device *parent, *self;
    124       1.9    ragge 	void *aux;
    125       1.1    ragge {
    126       1.9    ragge 	struct  dz_softc *sc = (void *)self;
    127       1.9    ragge 	struct vsbus_attach_args *va = aux;
    128       1.1    ragge 
    129  1.11.4.1  thorpej 	/*
    130  1.11.4.1  thorpej 	 * XXX - This is evil and ugly, but...
    131  1.11.4.1  thorpej 	 * due to the nature of how bus_space_* works on VAX, this will
    132  1.11.4.1  thorpej 	 * be perfectly good until everything is converted.
    133  1.11.4.1  thorpej 	 */
    134  1.11.4.1  thorpej 	sc->sc_ioh = dz_regs;
    135  1.11.4.1  thorpej 	sc->sc_dr.dr_csr = 0;
    136  1.11.4.1  thorpej 	sc->sc_dr.dr_rbuf = 4;
    137  1.11.4.1  thorpej 	sc->sc_dr.dr_dtr = 9;
    138  1.11.4.1  thorpej 	sc->sc_dr.dr_break = 13;
    139  1.11.4.1  thorpej 	sc->sc_dr.dr_tbuf = 12;
    140  1.11.4.1  thorpej 	sc->sc_dr.dr_tcr = 8;
    141  1.11.4.1  thorpej 	sc->sc_dr.dr_dcd = 13;
    142  1.11.4.1  thorpej 	sc->sc_dr.dr_ring = 13;
    143       1.1    ragge 
    144       1.9    ragge 	sc->sc_type = DZ_DZV;
    145       1.1    ragge 
    146       1.2    ragge 	sc->sc_dsr = 0x0f; /* XXX check if VS has modem ctrl bits */
    147       1.9    ragge 	scb_vecalloc(va->va_cvec - 4, dzrint, self->dv_unit, SCB_ISTACK);
    148       1.9    ragge 	printf("\n%s: 4 lines", self->dv_xname);
    149       1.1    ragge 
    150       1.9    ragge 	dzattach(sc);
    151       1.4    ragge 
    152       1.8    ragge 	if (((vax_confdata & 0x80) == 0) ||/* workstation, have lkc */
    153       1.8    ragge 	    (vax_boardtype == VAX_BTYP_48))
    154  1.11.4.1  thorpej 		if (cn_tab->cn_pri > CN_NORMAL) /* Passed cnsl detect */
    155  1.11.4.1  thorpej 			config_found(self, 0, dz_print);
    156       1.1    ragge }
    157       1.1    ragge 
    158       1.1    ragge int
    159       1.1    ragge dzcngetc(dev)
    160       1.1    ragge 	dev_t dev;
    161       1.1    ragge {
    162       1.6    ragge 	int c = 0;
    163       1.6    ragge 	int mino = minor(dev);
    164       1.6    ragge 	u_short rbuf;
    165       1.1    ragge 
    166       1.1    ragge 	do {
    167       1.1    ragge 		while ((dz->csr & 0x80) == 0)
    168       1.1    ragge 			; /* Wait for char */
    169       1.6    ragge 		rbuf = dz->rbuf;
    170       1.6    ragge 		if (((rbuf >> 8) & 3) != mino)
    171       1.6    ragge 			continue;
    172       1.6    ragge 		c = rbuf & 0x7f;
    173       1.1    ragge 	} while (c == 17 || c == 19);		/* ignore XON/XOFF */
    174       1.1    ragge 
    175       1.1    ragge 	if (c == 13)
    176       1.1    ragge 		c = 10;
    177       1.3    ragge 
    178       1.1    ragge 	return (c);
    179       1.1    ragge }
    180       1.1    ragge 
    181       1.1    ragge #define	DZMAJOR	1
    182       1.1    ragge 
    183       1.1    ragge void
    184       1.1    ragge dzcnprobe(cndev)
    185       1.1    ragge 	struct	consdev *cndev;
    186       1.1    ragge {
    187       1.7    ragge 	extern	vaddr_t iospace;
    188      1.11    ragge 	int diagcons;
    189       1.1    ragge 
    190       1.1    ragge 	switch (vax_boardtype) {
    191       1.1    ragge 	case VAX_BTYP_410:
    192       1.1    ragge 	case VAX_BTYP_420:
    193       1.1    ragge 	case VAX_BTYP_43:
    194      1.11    ragge 		diagcons = (vax_confdata & 0x20 ? 3 : 0);
    195      1.10    ragge 		break;
    196      1.10    ragge 
    197       1.6    ragge 	case VAX_BTYP_46:
    198      1.11    ragge 	case VAX_BTYP_48:
    199      1.11    ragge 		diagcons = (vax_confdata & 0x100 ? 3 : 0);
    200      1.10    ragge 		break;
    201      1.10    ragge 
    202      1.10    ragge 	case VAX_BTYP_49:
    203      1.11    ragge 		diagcons = 3;
    204       1.1    ragge 		break;
    205       1.1    ragge 
    206       1.1    ragge 	default:
    207      1.11    ragge 		cndev->cn_pri = CN_DEAD;
    208      1.11    ragge 		return;
    209       1.1    ragge 	}
    210      1.11    ragge 	if (diagcons)
    211      1.11    ragge 		cndev->cn_pri = CN_REMOTE;
    212      1.11    ragge 	else
    213      1.11    ragge 		cndev->cn_pri = CN_NORMAL;
    214      1.11    ragge 	cndev->cn_dev = makedev(DZMAJOR, diagcons);
    215      1.11    ragge 	dz_regs = iospace;
    216      1.11    ragge 	ioaccess(iospace, 0x200A0000, 1);
    217       1.1    ragge }
    218       1.1    ragge 
    219       1.1    ragge void
    220       1.1    ragge dzcninit(cndev)
    221       1.1    ragge 	struct	consdev *cndev;
    222       1.1    ragge {
    223       1.1    ragge 	dz = (void*)dz_regs;
    224       1.1    ragge 
    225       1.1    ragge 	dz->csr = 0;    /* Disable scanning until initting is done */
    226       1.9    ragge 	dz->tcr = (1 << minor(cndev->cn_dev));    /* Turn on xmitter */
    227       1.1    ragge 	dz->csr = 0x20; /* Turn scanning back on */
    228       1.1    ragge }
    229       1.1    ragge 
    230       1.1    ragge 
    231       1.1    ragge void
    232       1.1    ragge dzcnputc(dev,ch)
    233       1.1    ragge 	dev_t	dev;
    234       1.1    ragge 	int	ch;
    235       1.1    ragge {
    236       1.1    ragge 	int timeout = 1<<15;            /* don't hang the machine! */
    237       1.6    ragge 	int mino = minor(dev);
    238       1.3    ragge 	u_short tcr;
    239       1.1    ragge 
    240       1.1    ragge 	if (mfpr(PR_MAPEN) == 0)
    241       1.1    ragge 		return;
    242       1.1    ragge 
    243       1.3    ragge 	tcr = dz->tcr;	/* remember which lines to scan */
    244       1.6    ragge 	dz->tcr = (1 << mino);
    245       1.3    ragge 
    246       1.1    ragge 	while ((dz->csr & 0x8000) == 0) /* Wait until ready */
    247       1.1    ragge 		if (--timeout < 0)
    248       1.1    ragge 			break;
    249       1.1    ragge 	dz->tdr = ch;                    /* Put the  character */
    250       1.9    ragge 	timeout = 1<<15;
    251       1.9    ragge 	while ((dz->csr & 0x8000) == 0) /* Wait until ready */
    252       1.9    ragge 		if (--timeout < 0)
    253       1.9    ragge 			break;
    254       1.3    ragge 
    255       1.3    ragge 	dz->tcr = tcr;
    256       1.2    ragge }
    257       1.2    ragge 
    258       1.2    ragge void
    259       1.2    ragge dzcnpollc(dev, pollflag)
    260       1.2    ragge 	dev_t dev;
    261       1.2    ragge 	int pollflag;
    262       1.2    ragge {
    263       1.9    ragge 	static	u_char mask;
    264       1.9    ragge 
    265       1.9    ragge 	if (pollflag)
    266       1.9    ragge 		mask = vsbus_setmask(0);
    267       1.9    ragge 	else
    268       1.9    ragge 		vsbus_setmask(mask);
    269       1.1    ragge }
    270       1.4    ragge 
    271       1.4    ragge #if NLKC
    272       1.4    ragge cons_decl(lkc);
    273       1.4    ragge 
    274       1.4    ragge void
    275       1.4    ragge lkccninit(cndev)
    276       1.4    ragge 	struct	consdev *cndev;
    277       1.4    ragge {
    278       1.4    ragge 	dz = (void*)dz_regs;
    279       1.4    ragge 
    280       1.4    ragge 	dz->csr = 0;    /* Disable scanning until initting is done */
    281       1.4    ragge 	dz->tcr = 1;    /* Turn off all but line 0's xmitter */
    282       1.4    ragge 	dz->rbuf = 0x1c18; /* XXX */
    283       1.4    ragge 	dz->csr = 0x20; /* Turn scanning back on */
    284       1.4    ragge }
    285       1.4    ragge 
    286       1.4    ragge int
    287       1.4    ragge lkccngetc(dev)
    288       1.4    ragge 	dev_t dev;
    289       1.4    ragge {
    290       1.5    ragge 	int lkc_decode(int);
    291       1.4    ragge 	int c;
    292       1.9    ragge //	u_char mask;
    293       1.4    ragge 
    294       1.9    ragge 
    295       1.9    ragge //	mask = vsbus_setmask(0);	/* save old state */
    296       1.4    ragge 
    297       1.4    ragge loop:
    298       1.4    ragge 	while ((dz->csr & 0x80) == 0)
    299       1.4    ragge 		; /* Wait for char */
    300       1.4    ragge 
    301       1.5    ragge 	c = lkc_decode(dz->rbuf & 255);
    302       1.5    ragge 	if (c < 1)
    303       1.4    ragge 		goto loop;
    304       1.4    ragge 
    305       1.9    ragge //	vsbus_clrintr(0x80); /* XXX */
    306       1.9    ragge //	vsbus_setmask(mask);
    307       1.4    ragge 
    308       1.4    ragge 	return (c);
    309       1.4    ragge }
    310       1.4    ragge #endif
    311