xref: /csrg-svn/sys/news3400/bm/bmcons.c (revision 57177)
153889Smckusick /*
253889Smckusick  * Copyright (c) 1992 The Regents of the University of California.
353889Smckusick  * All rights reserved.
453889Smckusick  *
553889Smckusick  * This code is derived from software contributed to Berkeley by
653889Smckusick  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
753889Smckusick  *
853889Smckusick  * %sccs.include.redist.c%
953889Smckusick  *
1053889Smckusick  * from: $Hdr: cons.c,v 4.300 91/06/09 06:34:41 root Rel41 $ SONY
1153889Smckusick  *
12*57177Sutashiro  *	@(#)bmcons.c	7.3 (Berkeley) 12/17/92
1353889Smckusick  */
1453889Smckusick 
1553889Smckusick /*
1653889Smckusick  * console driver
1753889Smckusick  */
18*57177Sutashiro #include <machine/fix_machine_type.h>
19*57177Sutashiro #include <sys/param.h>
20*57177Sutashiro #include <machine/pte.h>
21*57177Sutashiro #include <sys/conf.h>
22*57177Sutashiro #include <sys/proc.h>
23*57177Sutashiro #include <sys/user.h>
24*57177Sutashiro #include <sys/ioctl.h>
25*57177Sutashiro #include <sys/tty.h>
26*57177Sutashiro #include <sys/map.h>
27*57177Sutashiro #include <sys/buf.h>
28*57177Sutashiro #include <sys/clist.h>
29*57177Sutashiro #include <sys/file.h>
30*57177Sutashiro #include <sys/bm.h>
3153889Smckusick 
32*57177Sutashiro #include <news3400/hbdev/rsreg.h>
33*57177Sutashiro #include <news3400/sio/sccparam.h>
3453889Smckusick 
3553889Smckusick #define	CN_RXE		RXE
3653889Smckusick #define	CN_TXE		TXE
3753889Smckusick #define	CN_ON		(RXE|TXE|RTS|DTR)
3853889Smckusick #define	CN_OFF		0
3953889Smckusick #define	CN_RTS		RTS
4053889Smckusick #define	CN_DTR		DTR
4153889Smckusick #define	CN_CTS		CTS
4253889Smckusick #define	CN_DCD		DCD
4353889Smckusick #define	CN_DSR		DSR
4453889Smckusick #define	CN_RI		RI
4553889Smckusick #define	CN_BRK		XBREAK
4653889Smckusick 
4753889Smckusick /*
4853889Smckusick  * Local variables for the driver
4953889Smckusick  */
5053889Smckusick 
5153889Smckusick #define	splcons	spltty
5253889Smckusick 
5353889Smckusick char cn_active[1];
5453889Smckusick char cn_stopped[1];
5553889Smckusick struct tty cn_tty[1];
5653889Smckusick 
5753889Smckusick void	cnstart();
5853889Smckusick int	ttrstrt();
5953889Smckusick int	cnrint(), cnxint(), cnsint();
6053889Smckusick 
6153889Smckusick /*
6253889Smckusick  * Open console. Turn on console if this is the first use of it.
6353889Smckusick  */
6453889Smckusick /*ARGSUSED*/
6553889Smckusick cnopen(dev, flag, mode, p)
6653889Smckusick 	dev_t dev;
6753889Smckusick 	int flag, mode;
6853889Smckusick 	struct proc *p;
6953889Smckusick {
7053889Smckusick 	register struct tty *tp = &cn_tty[0];
7153889Smckusick 
7253889Smckusick 	if (cn_active[0] == 0) {
7353889Smckusick 		if (cn_init() < 0)
7453889Smckusick 			return (ENXIO);
7553889Smckusick 		cn_enable();
7653889Smckusick 		cn_active[0] = 1;
7753889Smckusick 	}
7853889Smckusick 	if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0)
7953889Smckusick 		return (EBUSY);
8053889Smckusick 	tp->t_addr = (caddr_t)0;
8153889Smckusick 	tp->t_oproc = cnstart;
8253889Smckusick 	tp->t_state |= TS_WOPEN;
8353889Smckusick 	/*
8453889Smckusick 	 * If this is first open, initialze tty state to default.
8553889Smckusick 	 */
8653889Smckusick 	if ((tp->t_state & TS_ISOPEN) == 0) {
8753889Smckusick 		tp->t_state |= TS_WOPEN;
8853889Smckusick 		ttychars(tp);
8953889Smckusick 		if (tp->t_ispeed == 0) {
9053889Smckusick 			tp->t_iflag = TTYDEF_IFLAG;
9153889Smckusick 			tp->t_oflag = TTYDEF_OFLAG;
9253889Smckusick 			tp->t_cflag = TTYDEF_CFLAG;
9353889Smckusick 			tp->t_lflag = TTYDEF_LFLAG;
9453889Smckusick 			tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
9553889Smckusick 		}
9653889Smckusick 		cnparam(tp, &tp->t_termios);
9753889Smckusick 		ttsetwater(tp);
9853889Smckusick 	}
9953889Smckusick 	/*
10053889Smckusick 	 * Wait receiver and status interrupt
10153889Smckusick 	 */
10253889Smckusick 	(void) cnmctl(CN_ON, DMSET);
10353889Smckusick 	tp->t_state |= TS_CARR_ON;
10453889Smckusick 	return ((*linesw[tp->t_line].l_open)(dev, tp));
10553889Smckusick }
10653889Smckusick 
10753889Smckusick /*
10853889Smckusick  * Close console.
10953889Smckusick  */
11053889Smckusick /*ARGSUSED*/
11153889Smckusick cnclose(dev, flag)
11253889Smckusick 	dev_t dev;
11353889Smckusick 	int flag;
11453889Smckusick {
11553889Smckusick 	register struct tty *tp = &cn_tty[0];
11653889Smckusick 
11753889Smckusick 	(*linesw[tp->t_line].l_close)(tp);
11853889Smckusick 	(void) cnmctl(CN_BRK, DMBIC);
11953889Smckusick 	ttyclose(tp);
12053889Smckusick 	return (0);
12153889Smckusick }
12253889Smckusick 
12353889Smckusick /*ARGSUSED*/
12453889Smckusick cnread(dev, uio, flag)
12553889Smckusick 	dev_t dev;
12653889Smckusick 	struct uio *uio;
12753889Smckusick 	int flag;
12853889Smckusick {
12953889Smckusick 	register struct tty *tp = &cn_tty[0];
13053889Smckusick 
13153889Smckusick 	return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
13253889Smckusick }
13353889Smckusick 
13453889Smckusick /*ARGSUSED*/
13553889Smckusick cnwrite(dev, uio, flag)
13653889Smckusick 	dev_t dev;
13753889Smckusick 	struct uio *uio;
13853889Smckusick 	int flag;
13953889Smckusick {
14053889Smckusick 	register struct tty *tp = &cn_tty[0];
14153889Smckusick 
14253889Smckusick 	return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
14353889Smckusick }
14453889Smckusick 
14553889Smckusick /*
14653889Smckusick  * console receiver interrupt.
14753889Smckusick  */
14853889Smckusick _cnrint(buf, n)
14953889Smckusick 	register char *buf;
15053889Smckusick 	register int n;
15153889Smckusick {
15253889Smckusick 	register struct tty *tp = &cn_tty[0];
15353889Smckusick 	register int (*rint)();
15453889Smckusick 
15553889Smckusick 	if ((tp->t_state & TS_ISOPEN) == 0) {
15653889Smckusick 		wakeup((caddr_t)&tp->t_rawq);
15753889Smckusick 		cn_enable();
15853889Smckusick 		return;
15953889Smckusick 	}
16053889Smckusick 	/*
16153889Smckusick 	 * Loop fetching characters from the silo for console
16253889Smckusick 	 * until there are no more in the silo.
16353889Smckusick 	 */
16453889Smckusick 	rint = linesw[tp->t_line].l_rint;
16553889Smckusick 	while (--n >= 0)
16653889Smckusick 		(*rint)(*buf++, tp);
16753889Smckusick 	cn_enable();
16853889Smckusick }
16953889Smckusick 
17053889Smckusick /*
17153889Smckusick  * Ioctl for console.
17253889Smckusick  */
17353889Smckusick /*ARGSUSED*/
17453889Smckusick cnioctl(dev, cmd, data, flag)
17553889Smckusick 	dev_t dev;
17653889Smckusick 	caddr_t data;
17753889Smckusick {
17853889Smckusick 	register struct tty *tp = &cn_tty[0];
17953889Smckusick 	int error;
18053889Smckusick 
18153889Smckusick 	error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag);
18253889Smckusick 	if (error >= 0)
18353889Smckusick 		return (error);
18453889Smckusick 	error = ttioctl(tp, cmd, data, flag);
18553889Smckusick 	if (error >= 0)
18653889Smckusick 		return (error);
18753889Smckusick 
18853889Smckusick 	switch (cmd) {
18953889Smckusick 
19053889Smckusick 	case TIOCSBRK:
19153889Smckusick 		(void) cnmctl(CN_BRK, DMBIS);
19253889Smckusick 		break;
19353889Smckusick 
19453889Smckusick 	case TIOCCBRK:
19553889Smckusick 		(void) cnmctl(CN_BRK, DMBIC);
19653889Smckusick 		break;
19753889Smckusick 
19853889Smckusick 	case TIOCSDTR:
19953889Smckusick 		(void) cnmctl(CN_DTR|CN_RTS, DMBIS);
20053889Smckusick 		break;
20153889Smckusick 
20253889Smckusick 	case TIOCCDTR:
20353889Smckusick 		(void) cnmctl(CN_DTR|CN_RTS, DMBIC);
20453889Smckusick 		break;
20553889Smckusick 
20653889Smckusick 	case TIOCMSET:
20753889Smckusick 		(void) cnmctl(dmtocn(*(int *)data), DMSET);
20853889Smckusick 		break;
20953889Smckusick 
21053889Smckusick 	case TIOCMBIS:
21153889Smckusick 		(void) cnmctl(dmtocn(*(int *)data), DMBIS);
21253889Smckusick 		break;
21353889Smckusick 
21453889Smckusick 	case TIOCMBIC:
21553889Smckusick 		(void) cnmctl(dmtocn(*(int *)data), DMBIC);
21653889Smckusick 		break;
21753889Smckusick 
21853889Smckusick 	case TIOCMGET:
21953889Smckusick 		*(int *)data = cntodm(cnmctl(0, DMGET));
22053889Smckusick 		break;
22153889Smckusick 
22253889Smckusick 	default:
22353889Smckusick 		return (ENOTTY);
22453889Smckusick 	}
22553889Smckusick 	return (0);
22653889Smckusick }
22753889Smckusick 
22853889Smckusick dmtocn(bits)
22953889Smckusick 	register int bits;
23053889Smckusick {
23153889Smckusick 	register int b;
23253889Smckusick 
23353889Smckusick 	b = 0;
23453889Smckusick 	if (bits & DML_LE)  b |= CN_TXE|CN_RXE;
23553889Smckusick 	if (bits & DML_DTR) b |= CN_DTR;
23653889Smckusick 	if (bits & DML_RTS) b |= CN_RTS;
23753889Smckusick 	if (bits & DML_CTS) b |= CN_CTS;
23853889Smckusick 	if (bits & DML_CAR) b |= CN_DCD;
23953889Smckusick 	if (bits & DML_RNG) b |= CN_RI;
24053889Smckusick 	if (bits & DML_DSR) b |= CN_DSR;
24153889Smckusick 	return(b);
24253889Smckusick }
24353889Smckusick 
24453889Smckusick cntodm(bits)
24553889Smckusick 	register int bits;
24653889Smckusick {
24753889Smckusick 	register int b;
24853889Smckusick 
24953889Smckusick 	b = 0;
25053889Smckusick 	if (bits & (CN_TXE|CN_RXE)) b |= DML_LE;
25153889Smckusick 	if (bits & CN_DTR) b |= DML_DTR;
25253889Smckusick 	if (bits & CN_RTS) b |= DML_RTS;
25353889Smckusick 	if (bits & CN_CTS) b |= DML_CTS;
25453889Smckusick 	if (bits & CN_DCD) b |= DML_CAR;
25553889Smckusick 	if (bits & CN_RI)  b |= DML_RNG;
25653889Smckusick 	if (bits & CN_DSR) b |= DML_DSR;
25753889Smckusick 	return(b);
25853889Smckusick }
25953889Smckusick 
26053889Smckusick /*
26153889Smckusick  * Set parameters from open or stty into the console hardware
26253889Smckusick  * registers.
26353889Smckusick  */
26453889Smckusick cnparam(tp, t)
26553889Smckusick 	register struct tty *tp;
26653889Smckusick 	register struct termios *t;
26753889Smckusick {
26853889Smckusick 	register int param;
26953889Smckusick 	register int cflag = t->c_cflag;
27053889Smckusick 	int s;
27153889Smckusick 
27253889Smckusick 	/*
27353889Smckusick 	 * Block interrupts so parameters will be set
27453889Smckusick 	 * before the line interrupts.
27553889Smckusick 	 */
27653889Smckusick 	s = splcons();
27753889Smckusick 	if ((tp->t_ispeed)==0) {
27853889Smckusick 		tp->t_cflag |= HUPCL;
27953889Smckusick 		(void) cnmctl(CN_OFF, DMSET);
28053889Smckusick 		(void) splx(s);
28153889Smckusick 		return;
28253889Smckusick 	}
28353889Smckusick 
28453889Smckusick 	param = cn_get_param() &
28553889Smckusick 		~(CHAR_SIZE|PARITY|EVEN|STOPBIT|BAUD_RATE|NOCHECK);
28653889Smckusick 	if ((cflag & CREAD) == 0)
28753889Smckusick 		param &= ~RXE;
28853889Smckusick 	switch (cflag & CSIZE) {
28953889Smckusick 	    case CS5: break;
29053889Smckusick 	    case CS6: param |= C6BIT; break;
29153889Smckusick 	    case CS7: param |= C7BIT; break;
29253889Smckusick 	    case CS8: param |= C8BIT; break;
29353889Smckusick 	}
29453889Smckusick 	if (cflag & PARENB)
29553889Smckusick 		param |= PARITY;
29653889Smckusick 	if ((cflag & PARODD) == 0)
29753889Smckusick 		param |= EVEN;
29853889Smckusick 	if ((tp->t_iflag & INPCK) == 0)
29953889Smckusick 		param |= NOCHECK;
30053889Smckusick 	if (cflag & CSTOPB)
30153889Smckusick 		param |= STOP2;
30253889Smckusick 	else
30353889Smckusick 		param |= STOP1;
30453889Smckusick 	cn_set_param(param);
30553889Smckusick 	(void) splx(s);
30653889Smckusick }
30753889Smckusick 
30853889Smckusick /*
30953889Smckusick  * console transmitter interrupt.
31053889Smckusick  * Restart the idle line.
31153889Smckusick  */
31253889Smckusick _cnxint(count)
31353889Smckusick 	int count;
31453889Smckusick {
31553889Smckusick 	register struct tty *tp = &cn_tty[0];
31653889Smckusick 	int s;
31753889Smckusick 
31853889Smckusick 	cn_stopped[0] = 0;
31953889Smckusick 	tp->t_state &= ~TS_BUSY;
32053889Smckusick 	s = splcons();
32153889Smckusick 	if (tp->t_state & TS_FLUSH)
32253889Smckusick 		tp->t_state &= ~TS_FLUSH;
32353889Smckusick 	else
32453889Smckusick 		ndflush(&tp->t_outq, count);
32553889Smckusick 	(void) splx(s);
32653889Smckusick 	if (tp->t_line)
32753889Smckusick 		(*linesw[tp->t_line].l_start)(tp);
32853889Smckusick 	else
32953889Smckusick 		cnstart(tp);
33053889Smckusick }
33153889Smckusick 
33253889Smckusick /*
33353889Smckusick  * Start (restart) transmission on the console.
33453889Smckusick  */
33553889Smckusick void
33653889Smckusick cnstart(tp)
33753889Smckusick 	register struct tty *tp;
33853889Smckusick {
33953889Smckusick 	register int nch;
34053889Smckusick 	int s;
34153889Smckusick 
34253889Smckusick 	/*
34353889Smckusick 	 * Must hold interrupts in following code to prevent
34453889Smckusick 	 * state of the tp from changing.
34553889Smckusick 	 */
34653889Smckusick 	s = splcons();
34753889Smckusick 	/*
34853889Smckusick 	 * If it's currently active, or delaying, no need to do anything.
34953889Smckusick 	 */
35053889Smckusick 	if (tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP))
35153889Smckusick 		goto out;
35253889Smckusick 	/*
35353889Smckusick 	 * If ther are still characters in the IOP,
35453889Smckusick 	 * just reenable transmit.
35553889Smckusick 	 */
35653889Smckusick 	if (cn_stopped[0]) {
35753889Smckusick 		cn_stopped[0] = 0;
35853889Smckusick 		cn_start();
35953889Smckusick 		goto out;
36053889Smckusick 	}
36153889Smckusick 	/*
36253889Smckusick 	 * If there are sleepers, and output has drained below low
36353889Smckusick 	 * water mark, wake up the sleepers.
36453889Smckusick 	 */
36553889Smckusick 	if (tp->t_outq.c_cc <= tp->t_lowat) {
36653889Smckusick 		if (tp->t_state & TS_ASLEEP) {
36753889Smckusick 			tp->t_state &= ~TS_ASLEEP;
36853889Smckusick 			wakeup((caddr_t)&tp->t_outq);
36953889Smckusick 		}
37053889Smckusick 		selwakeup(&tp->t_wsel);
37153889Smckusick 	}
37253889Smckusick 	/*
37353889Smckusick 	 * Now restart transmission unless the output queue is
37453889Smckusick 	 * empty.
37553889Smckusick 	 */
37653889Smckusick 	if (tp->t_outq.c_cc == 0)
37753889Smckusick 		goto out;
37853889Smckusick 	if (tp->t_flags & (RAW|LITOUT))
37953889Smckusick 		nch = ndqb(&tp->t_outq, 0);
38053889Smckusick 	else {
38153889Smckusick 		nch = ndqb(&tp->t_outq, 0200);
38253889Smckusick 		/*
38353889Smckusick 		 * If first thing on queue is a delay process it.
38453889Smckusick 		 */
38553889Smckusick 		if (nch == 0) {
38653889Smckusick 			nch = getc(&tp->t_outq);
38753889Smckusick 			timeout(ttrstrt, (caddr_t)tp, (nch&0x7f)+6);
38853889Smckusick 			tp->t_state |= TS_TIMEOUT;
38953889Smckusick 			goto out;
39053889Smckusick 		}
39153889Smckusick 	}
39253889Smckusick 	/*
39353889Smckusick 	 * If characters to transmit, restart transmission.
39453889Smckusick 	 */
39553889Smckusick 	if (nch) {
39653889Smckusick 		tp->t_state |= TS_BUSY;
39753889Smckusick 		cn_output(tp, nch);
39853889Smckusick 	}
39953889Smckusick out:
40053889Smckusick 	(void) splx(s);
40153889Smckusick }
40253889Smckusick 
40353889Smckusick /*
40453889Smckusick  * Stop output on a line, e.g. for ^S/^Q or output flush.
40553889Smckusick  */
40653889Smckusick /*ARGSUSED*/
40753889Smckusick cnstop(tp, flag)
40853889Smckusick 	register struct tty *tp;
40953889Smckusick {
41053889Smckusick 	register int s;
41153889Smckusick 
41253889Smckusick 	/*
41353889Smckusick 	 * Block input/output interrupts while messing with state.
41453889Smckusick 	 */
41553889Smckusick 	s = splcons();
41653889Smckusick 	if (tp->t_state & TS_BUSY) {
41753889Smckusick 		cn_stop(0);
41853889Smckusick 		cn_stopped[0] = 1;
41953889Smckusick 		if ((tp->t_state & TS_TTSTOP) == 0) {
42053889Smckusick 			tp->t_state |= TS_FLUSH;
42153889Smckusick 			cn_stop(1);
42253889Smckusick 		}
42353889Smckusick 	}
42453889Smckusick 	(void) splx(s);
42553889Smckusick }
42653889Smckusick 
42753889Smckusick /*
42853889Smckusick  * console modem control
42953889Smckusick  */
43053889Smckusick cnmctl(bits, how)
43153889Smckusick 	int bits, how;
43253889Smckusick {
43353889Smckusick 	register int mbits;
43453889Smckusick 	int s;
43553889Smckusick 
43653889Smckusick 	bits &= (RXE|TXE|RTS|DTR|XBREAK);
43753889Smckusick 
43853889Smckusick 	s = splcons();
43953889Smckusick 
44053889Smckusick 	mbits = cn_get_param();
44153889Smckusick 	switch (how) {
44253889Smckusick 	case DMSET:
44353889Smckusick 		mbits = mbits & ~(RXE|TXE|RTS|DTR|XBREAK) | bits;
44453889Smckusick 		break;
44553889Smckusick 
44653889Smckusick 	case DMBIS:
44753889Smckusick 		mbits |= bits;
44853889Smckusick 		break;
44953889Smckusick 
45053889Smckusick 	case DMBIC:
45153889Smckusick 		mbits &= ~bits;
45253889Smckusick 		break;
45353889Smckusick 
45453889Smckusick 	case DMGET:
45553889Smckusick 		(void) splx(s);
45653889Smckusick 		return(mbits);
45753889Smckusick 	}
45853889Smckusick 	cn_set_param(mbits);
45953889Smckusick 
46053889Smckusick 	(void) splx(s);
46153889Smckusick 	return(mbits);
46253889Smckusick }
46353889Smckusick 
46453889Smckusick /*
46553889Smckusick  * console status interrupt
46653889Smckusick  */
46753889Smckusick _cnsint(stat)
46853889Smckusick 	int stat;
46953889Smckusick {
47053889Smckusick 	register struct tty *tp = &cn_tty[0];
47153889Smckusick 
47253889Smckusick 	if (stat & OVERRUN_ERROR)
47353889Smckusick 		printf("console: fifo overflow\n");
47453889Smckusick 	if (stat & RBREAK)
47553889Smckusick 		(*linesw[tp->t_line].l_rint)
47653889Smckusick 		    (tp->t_flags & RAW ? '\0' : tp->t_cc[VINTR], tp);
47753889Smckusick }
47853889Smckusick 
47953889Smckusick /*
48053889Smckusick  * console control interrupt
48153889Smckusick  */
48253889Smckusick cncint()
48353889Smckusick {
48453889Smckusick 	printf("cncint:\n");
48553889Smckusick }
48653889Smckusick 
48753889Smckusick /*
48853889Smckusick  * Machine dependent functions
48953889Smckusick  *
49053889Smckusick  *	cn_init()
49153889Smckusick  *	cnrint()
49253889Smckusick  *	cnxint()
49353889Smckusick  *	cnsint()
49453889Smckusick  *	cn_enable()
49553889Smckusick  *	cn_output()
49653889Smckusick  *	cn_start()
49753889Smckusick  *	cn_stop()
49853889Smckusick  *	cn_get_param()
49953889Smckusick  *	cn_set_param()
50053889Smckusick  */
50153889Smckusick #ifdef IPC_MRX
502*57177Sutashiro #include <news3400/newsipc/newsipc.h>
503*57177Sutashiro #include <news3400/mrx/h/cio.h>
504*57177Sutashiro #include <news3400/mrx/h/console.h>
50553889Smckusick 
50653889Smckusick #ifdef mips
50753889Smckusick #define ipc_phys(x)	K0_TT0(x)
50853889Smckusick #define ipc_log(x)	TT0_K0(x)
50953889Smckusick #else
51053889Smckusick #define ipc_phys(x)	(caddr_t)((int)(x) & ~0x80000000)
51153889Smckusick #define ipc_log(x)	(caddr_t)((int)(x) | 0x80000000)
51253889Smckusick #endif
51353889Smckusick 
51453889Smckusick #if NBM > 0
51553889Smckusick extern char *ext_fnt_addr[];
51653889Smckusick extern char *ext_fnt24_addr[];
51753889Smckusick #endif /* NBM > 0 */
51853889Smckusick 
51953889Smckusick int	port_cnrecv;
52053889Smckusick int	port_cnxmit;
52153889Smckusick int	port_cnstat;
52253889Smckusick int	port_cnctrl;
52353889Smckusick int	port_cnfont;
52453889Smckusick int	port_cnrecv_iop;
52553889Smckusick int	port_cnxmit_iop;
52653889Smckusick int	port_cnstat_iop;
52753889Smckusick int	port_cnctrl_iop;
52853889Smckusick 
52953889Smckusick int	cnfont();
53053889Smckusick 
53153889Smckusick cn_init()
53253889Smckusick {
53353889Smckusick 	struct cons_ctrl_req req;
53453889Smckusick 	int *reply;
53553889Smckusick 
53653889Smckusick 	port_cnrecv = port_create("@cnrecv", cnrint, -1);
53753889Smckusick 	port_cnxmit = port_create("@cnxmit", cnxint, -1);
53853889Smckusick 	port_cnctrl = port_create("@cnctrl", NULL, 0);
53953889Smckusick 	port_cnstat = port_create("@cnstat", cnsint, -1);
54053889Smckusick 	port_cnfont = port_create("@cnfont", cnfont, -1);
54153889Smckusick 
54253889Smckusick 	/* use NULL action port */
54353889Smckusick 	port_cnrecv_iop = object_query("cons_input");
54453889Smckusick 	port_cnxmit_iop = object_query("cons_output");
54553889Smckusick 	port_cnctrl_iop = object_query("cons_ctrl");
54653889Smckusick 	port_cnstat_iop = object_query("cons_stat");
54753889Smckusick 	req.cons_func = CIO_ASKDEVICE;
54853889Smckusick 	msg_send(port_cnctrl_iop, port_cnctrl, &req, sizeof(req), 0);
54953889Smckusick 	msg_recv(port_cnctrl, NULL, &reply, NULL, 0);
55053889Smckusick 	tty00_is_console = *reply;
55153889Smckusick 	msg_free(port_cnctrl);
55253889Smckusick #if NBM > 0
55353889Smckusick 	req.cons_func = CIO_SET16FNT;
55453889Smckusick 	req.cons_addr = (char *)ipc_phys(ext_fnt_addr);
55553889Smckusick 	msg_send(port_cnctrl_iop, port_cnctrl, &req, sizeof(req), 0);
55653889Smckusick 	msg_recv(port_cnctrl, NULL, NULL, NULL, 0);
55753889Smckusick 	req.cons_func = CIO_SET24FNT;
55853889Smckusick 	req.cons_addr = (char *)ipc_phys(ext_fnt24_addr);
55953889Smckusick 	msg_send(port_cnctrl_iop, port_cnctrl, &req, sizeof(req), 0);
56053889Smckusick 	msg_recv(port_cnctrl, NULL, NULL, NULL, 0);
56153889Smckusick #endif
56253889Smckusick 	return (0);
56353889Smckusick }
56453889Smckusick 
56553889Smckusick cn_enable()
56653889Smckusick {
56753889Smckusick 	int len;
56853889Smckusick 
56953889Smckusick 	len = MAX_CIO;
57053889Smckusick 	msg_send(port_cnrecv_iop, port_cnrecv, &len, sizeof(len), 0);
57153889Smckusick }
57253889Smckusick 
57353889Smckusick cnrint(port)
57453889Smckusick 	int port;
57553889Smckusick {
57653889Smckusick 	int len;
57753889Smckusick 	char *buf;
57853889Smckusick 
57953889Smckusick 	msg_recv(port, NULL, &buf, &len, 0);
58053889Smckusick #ifdef mips
58153889Smckusick 	_cnrint((char *)MACH_CACHED_TO_UNCACHED(buf), len);
58253889Smckusick #else
58353889Smckusick 	dcia();
58453889Smckusick 	_cnrint(buf, len);
58553889Smckusick #endif
58653889Smckusick 	msg_free(port);
58753889Smckusick }
58853889Smckusick 
58953889Smckusick cnxint(port)
59053889Smckusick 	int port;
59153889Smckusick {
59253889Smckusick 	int *len;
59353889Smckusick 
59453889Smckusick 	msg_recv(port, NULL, &len, NULL, 0);
59553889Smckusick 	_cnxint(*len);
59653889Smckusick }
59753889Smckusick 
59853889Smckusick cn_start()
59953889Smckusick {
60053889Smckusick 	int func;
60153889Smckusick 
60253889Smckusick 	func = CIO_START;
60353889Smckusick 	msg_send(port_cnctrl_iop, 0, &func, sizeof(func), 0);
60453889Smckusick }
60553889Smckusick 
60653889Smckusick cn_output(tp, n)
60753889Smckusick 	struct tty *tp;
60853889Smckusick 	int n;
60953889Smckusick {
61053889Smckusick 
61153889Smckusick 	msg_send(port_cnxmit_iop, port_cnxmit, tp->t_outq.c_cf,
61255762Sbostic 	    min(n, MAX_CIO), 0);
61353889Smckusick }
61453889Smckusick 
61553889Smckusick cn_stop(flush)
61653889Smckusick 	int flush;
61753889Smckusick {
61853889Smckusick 	int	func;
61953889Smckusick 
62053889Smckusick 	func = flush ? CIO_FLUSH : CIO_STOP;
62153889Smckusick 	msg_send(port_cnctrl_iop, 0, &func, sizeof(func), 0);
62253889Smckusick }
62353889Smckusick 
62453889Smckusick cnsint(port)
62553889Smckusick 	int port;
62653889Smckusick {
62753889Smckusick 	int *stat;
62853889Smckusick 
62953889Smckusick 	msg_recv(port, NULL, &stat, NULL, 0);
63053889Smckusick 	_cnsint(*stat);
63153889Smckusick 	msg_send(port_cnstat_iop, port_cnstat, NULL, 0, 0);
63253889Smckusick }
63353889Smckusick 
63453889Smckusick cn_get_param()
63553889Smckusick {
63653889Smckusick 	struct cons_ctrl_req req;
63753889Smckusick 	int *reply, param;
63853889Smckusick 
63953889Smckusick 	req.cons_func = CIO_GETPARAMS;
64053889Smckusick 	/* message length 8 means 2 * sizeof(int) : func and status */
64153889Smckusick 	msg_send(port_cnctrl_iop, port_cnctrl, &req, 8, 0);
64253889Smckusick 	msg_recv(port_cnctrl, NULL, &reply, NULL, 0);
64353889Smckusick 	param = *reply;
64453889Smckusick 	msg_free(port_cnctrl);
64553889Smckusick 
64653889Smckusick 	return (param);
64753889Smckusick }
64853889Smckusick 
64953889Smckusick cn_set_param(param)
65053889Smckusick 	int param;
65153889Smckusick {
65253889Smckusick 	struct cons_ctrl_req req;
65353889Smckusick 
65453889Smckusick 	req.cons_func = CIO_SETPARAMS;
65553889Smckusick 	req.cons_status = param;
65653889Smckusick 
65753889Smckusick 	/* message length 8 means 2 * sizeof(int) : func and status */
65853889Smckusick 	msg_send(port_cnctrl_iop, 0, &req, 8, 0);
65953889Smckusick }
66053889Smckusick 
66153889Smckusick cnfont(port)
66253889Smckusick 	int port;
66353889Smckusick {
66453889Smckusick 	int *func;
66553889Smckusick 
66653889Smckusick 	msg_recv(port, NULL, &func, NULL, 0);
66753889Smckusick #if NBM > 0
66853889Smckusick 	switch (*func) {
66953889Smckusick 
67053889Smckusick 	case FONT_JISROMAN:
67153889Smckusick 		font_jisroman();
67253889Smckusick 		font_jisroman24();
67353889Smckusick 		break;
67453889Smckusick 
67553889Smckusick 	case FONT_ASCII:
67653889Smckusick 		font_ascii();
67753889Smckusick 		font_ascii24();
67853889Smckusick 		break;
67953889Smckusick 	}
68053889Smckusick #endif /* NBM > 0 */
68153889Smckusick 	msg_free(port);
68253889Smckusick }
68353889Smckusick #endif /* IPC_MRX */
68453889Smckusick 
68553889Smckusick #ifdef CPU_SINGLE
686*57177Sutashiro #include <news3400/hbdev/rsreg.h>
687*57177Sutashiro #include <news3400/iop/framebuf.h>
688*57177Sutashiro #include <news3400/fb/fbdefs.h>
68953889Smckusick 
69053889Smckusick int lastcount;
69153889Smckusick int start_dimmer = 1;
69253889Smckusick 
69353889Smckusick cn_init()
69453889Smckusick {
69553889Smckusick 
69653889Smckusick 	if (start_dimmer) {
69753889Smckusick 		auto_dimmer();
69853889Smckusick 		start_dimmer = 0;
69953889Smckusick 	}
70053889Smckusick 	return (0);
70153889Smckusick }
70253889Smckusick 
70353889Smckusick cn_enable()
70453889Smckusick {
70553889Smckusick 
70653889Smckusick 	/* nothing to do */
70753889Smckusick }
70853889Smckusick 
70953889Smckusick cnrint(code)
71053889Smckusick 	char code;
71153889Smckusick {
71253889Smckusick 
71353889Smckusick 	_cnrint(&code, 1);
71453889Smckusick }
71553889Smckusick 
71653889Smckusick cnxint()
71753889Smckusick {
71853889Smckusick 
71953889Smckusick 	_cnxint(lastcount);
72053889Smckusick }
72153889Smckusick 
72253889Smckusick cn_start()
72353889Smckusick {
72453889Smckusick 
72553889Smckusick 	/* nothing to do */
72653889Smckusick }
72753889Smckusick 
72853889Smckusick cn_output(tp, n)
72953889Smckusick 	struct tty *tp;
73053889Smckusick 	int n;
73153889Smckusick {
73253889Smckusick 
73353889Smckusick 	lastcount = vt100_write(0, tp->t_outq.c_cf, n);
73453889Smckusick 	cnxint();
73553889Smckusick }
73653889Smckusick 
73753889Smckusick cn_stop(flush)
73853889Smckusick 	int flush;
73953889Smckusick {
74053889Smckusick 
74153889Smckusick 	/* nothing to do */
74253889Smckusick }
74353889Smckusick 
74453889Smckusick cnsint(param)
74553889Smckusick 	int param;
74653889Smckusick {
74753889Smckusick 
74853889Smckusick 	_cnsint(param);
74953889Smckusick }
75053889Smckusick 
75153889Smckusick cn_get_param()
75253889Smckusick {
75353889Smckusick 
75453889Smckusick 	return (bitmap_get_param());
75553889Smckusick }
75653889Smckusick 
75753889Smckusick cn_set_param(param)
75853889Smckusick 	int param;
75953889Smckusick {
76053889Smckusick 
76153889Smckusick 	bitmap_set_param(param);
76253889Smckusick }
76353889Smckusick #endif /* CPU_SINGLE */
764