xref: /freebsd/sys/powerpc/mambo/mambo_console.c (revision fdafd315ad0d0f28a11b9fb4476a9ab059c62b92)
12c16c8d7SNathan Whitehorn /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
371e3c308SPedro F. Giffuni  *
42c16c8d7SNathan Whitehorn  * Copyright (C) 2008 by Nathan Whitehorn. All rights reserved.
52c16c8d7SNathan Whitehorn  *
62c16c8d7SNathan Whitehorn  * Redistribution and use in source and binary forms, with or without
72c16c8d7SNathan Whitehorn  * modification, are permitted provided that the following conditions
82c16c8d7SNathan Whitehorn  * are met:
92c16c8d7SNathan Whitehorn  * 1. Redistributions of source code must retain the above copyright
102c16c8d7SNathan Whitehorn  *    notice, this list of conditions and the following disclaimer.
112c16c8d7SNathan Whitehorn  * 2. Redistributions in binary form must reproduce the above copyright
122c16c8d7SNathan Whitehorn  *    notice, this list of conditions and the following disclaimer in the
132c16c8d7SNathan Whitehorn  *    documentation and/or other materials provided with the distribution.
142c16c8d7SNathan Whitehorn  *
152c16c8d7SNathan Whitehorn  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
162c16c8d7SNathan Whitehorn  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
172c16c8d7SNathan Whitehorn  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
182c16c8d7SNathan Whitehorn  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
192c16c8d7SNathan Whitehorn  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
202c16c8d7SNathan Whitehorn  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
212c16c8d7SNathan Whitehorn  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
222c16c8d7SNathan Whitehorn  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
232c16c8d7SNathan Whitehorn  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
242c16c8d7SNathan Whitehorn  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
252c16c8d7SNathan Whitehorn  */
262c16c8d7SNathan Whitehorn 
272c16c8d7SNathan Whitehorn #include <sys/param.h>
282c16c8d7SNathan Whitehorn #include <sys/kdb.h>
292c16c8d7SNathan Whitehorn #include <sys/kernel.h>
302c16c8d7SNathan Whitehorn #include <sys/priv.h>
312c16c8d7SNathan Whitehorn #include <sys/systm.h>
322c16c8d7SNathan Whitehorn #include <sys/types.h>
332c16c8d7SNathan Whitehorn #include <sys/conf.h>
342c16c8d7SNathan Whitehorn #include <sys/cons.h>
352c16c8d7SNathan Whitehorn #include <sys/consio.h>
362c16c8d7SNathan Whitehorn #include <sys/tty.h>
372c16c8d7SNathan Whitehorn 
382c16c8d7SNathan Whitehorn #include <dev/ofw/openfirm.h>
392c16c8d7SNathan Whitehorn 
402c16c8d7SNathan Whitehorn #include <ddb/ddb.h>
412c16c8d7SNathan Whitehorn 
422c16c8d7SNathan Whitehorn #include "mambocall.h"
432c16c8d7SNathan Whitehorn 
442c16c8d7SNathan Whitehorn #define MAMBOBURSTLEN	128	/* max number of bytes to write in one chunk */
452c16c8d7SNathan Whitehorn 
462c16c8d7SNathan Whitehorn #define MAMBO_CONSOLE_WRITE	0
472c16c8d7SNathan Whitehorn #define MAMBO_CONSOLE_READ	60
482c16c8d7SNathan Whitehorn 
492c16c8d7SNathan Whitehorn static tsw_outwakeup_t mambotty_outwakeup;
502c16c8d7SNathan Whitehorn 
512c16c8d7SNathan Whitehorn static struct ttydevsw mambo_ttydevsw = {
522c16c8d7SNathan Whitehorn 	.tsw_flags	= TF_NOPREFIX,
532c16c8d7SNathan Whitehorn 	.tsw_outwakeup	= mambotty_outwakeup,
542c16c8d7SNathan Whitehorn };
552c16c8d7SNathan Whitehorn 
562c16c8d7SNathan Whitehorn static int			polltime;
572c16c8d7SNathan Whitehorn static struct callout		mambo_callout;
582c16c8d7SNathan Whitehorn static struct tty 		*tp = NULL;
592c16c8d7SNathan Whitehorn 
604cf75455SRobert Watson #if defined(KDB)
612c16c8d7SNathan Whitehorn static int			alt_break_state;
622c16c8d7SNathan Whitehorn #endif
632c16c8d7SNathan Whitehorn 
642c16c8d7SNathan Whitehorn static void	mambo_timeout(void *);
652c16c8d7SNathan Whitehorn 
662c16c8d7SNathan Whitehorn static cn_probe_t	mambo_cnprobe;
672c16c8d7SNathan Whitehorn static cn_init_t	mambo_cninit;
682c16c8d7SNathan Whitehorn static cn_term_t	mambo_cnterm;
692c16c8d7SNathan Whitehorn static cn_getc_t	mambo_cngetc;
702c16c8d7SNathan Whitehorn static cn_putc_t	mambo_cnputc;
719976156fSAndriy Gapon static cn_grab_t	mambo_cngrab;
729976156fSAndriy Gapon static cn_ungrab_t	mambo_cnungrab;
732c16c8d7SNathan Whitehorn 
742c16c8d7SNathan Whitehorn CONSOLE_DRIVER(mambo);
752c16c8d7SNathan Whitehorn 
762c16c8d7SNathan Whitehorn static void
cn_drvinit(void * unused)772c16c8d7SNathan Whitehorn cn_drvinit(void *unused)
782c16c8d7SNathan Whitehorn {
792c16c8d7SNathan Whitehorn 
802c16c8d7SNathan Whitehorn 	if (mambo_consdev.cn_pri != CN_DEAD &&
812c16c8d7SNathan Whitehorn 	    mambo_consdev.cn_name[0] != '\0') {
822c16c8d7SNathan Whitehorn 		if (OF_finddevice("/mambo") == -1)
832c16c8d7SNathan Whitehorn 			return;
842c16c8d7SNathan Whitehorn 
852c16c8d7SNathan Whitehorn 		tp = tty_alloc(&mambo_ttydevsw, NULL);
862c16c8d7SNathan Whitehorn 		tty_init_console(tp, 0);
872c16c8d7SNathan Whitehorn 		tty_makedev(tp, NULL, "%s", "mambocons");
882c16c8d7SNathan Whitehorn 
892c16c8d7SNathan Whitehorn 		polltime = 1;
902c16c8d7SNathan Whitehorn 
91fd90e2edSJung-uk Kim 		callout_init(&mambo_callout, 1);
922c16c8d7SNathan Whitehorn 		callout_reset(&mambo_callout, polltime, mambo_timeout, NULL);
932c16c8d7SNathan Whitehorn 	}
942c16c8d7SNathan Whitehorn }
952c16c8d7SNathan Whitehorn 
962c16c8d7SNathan Whitehorn SYSINIT(cndev, SI_SUB_CONFIGURE, SI_ORDER_MIDDLE, cn_drvinit, NULL);
972c16c8d7SNathan Whitehorn 
982c16c8d7SNathan Whitehorn static void
mambotty_outwakeup(struct tty * tp)992c16c8d7SNathan Whitehorn mambotty_outwakeup(struct tty *tp)
1002c16c8d7SNathan Whitehorn {
1012c16c8d7SNathan Whitehorn 	int len;
1022c16c8d7SNathan Whitehorn 	u_char buf[MAMBOBURSTLEN];
1032c16c8d7SNathan Whitehorn 
1042c16c8d7SNathan Whitehorn 	for (;;) {
1052c16c8d7SNathan Whitehorn 		len = ttydisc_getc(tp, buf, sizeof buf);
1062c16c8d7SNathan Whitehorn 		if (len == 0)
1072c16c8d7SNathan Whitehorn 			break;
1082c16c8d7SNathan Whitehorn 		mambocall(MAMBO_CONSOLE_WRITE, buf, (register_t)len, 1UL);
1092c16c8d7SNathan Whitehorn 	}
1102c16c8d7SNathan Whitehorn }
1112c16c8d7SNathan Whitehorn 
1122c16c8d7SNathan Whitehorn static void
mambo_timeout(void * v)1132c16c8d7SNathan Whitehorn mambo_timeout(void *v)
1142c16c8d7SNathan Whitehorn {
1152c16c8d7SNathan Whitehorn 	int 	c;
1162c16c8d7SNathan Whitehorn 
1172c16c8d7SNathan Whitehorn 	tty_lock(tp);
1182c16c8d7SNathan Whitehorn 	while ((c = mambo_cngetc(NULL)) != -1)
1192c16c8d7SNathan Whitehorn 		ttydisc_rint(tp, c, 0);
1202c16c8d7SNathan Whitehorn 	ttydisc_rint_done(tp);
1212c16c8d7SNathan Whitehorn 	tty_unlock(tp);
1222c16c8d7SNathan Whitehorn 
1232c16c8d7SNathan Whitehorn 	callout_reset(&mambo_callout, polltime, mambo_timeout, NULL);
1242c16c8d7SNathan Whitehorn }
1252c16c8d7SNathan Whitehorn 
1262c16c8d7SNathan Whitehorn static void
mambo_cnprobe(struct consdev * cp)1272c16c8d7SNathan Whitehorn mambo_cnprobe(struct consdev *cp)
1282c16c8d7SNathan Whitehorn {
1292c16c8d7SNathan Whitehorn 	if (OF_finddevice("/mambo") == -1) {
1302c16c8d7SNathan Whitehorn 		cp->cn_pri = CN_DEAD;
1312c16c8d7SNathan Whitehorn 		return;
1322c16c8d7SNathan Whitehorn 	}
1332c16c8d7SNathan Whitehorn 
1342c16c8d7SNathan Whitehorn 	cp->cn_pri = CN_NORMAL;
1352c16c8d7SNathan Whitehorn }
1362c16c8d7SNathan Whitehorn 
1372c16c8d7SNathan Whitehorn static void
mambo_cninit(struct consdev * cp)1382c16c8d7SNathan Whitehorn mambo_cninit(struct consdev *cp)
1392c16c8d7SNathan Whitehorn {
1402c16c8d7SNathan Whitehorn 
1412c16c8d7SNathan Whitehorn 	/* XXX: This is the alias, but that should be good enough */
1422c16c8d7SNathan Whitehorn 	strcpy(cp->cn_name, "mambocons");
1432c16c8d7SNathan Whitehorn }
1442c16c8d7SNathan Whitehorn 
1452c16c8d7SNathan Whitehorn static void
mambo_cnterm(struct consdev * cp)1462c16c8d7SNathan Whitehorn mambo_cnterm(struct consdev *cp)
1472c16c8d7SNathan Whitehorn {
1482c16c8d7SNathan Whitehorn }
1492c16c8d7SNathan Whitehorn 
1509976156fSAndriy Gapon static void
mambo_cngrab(struct consdev * cp)1519976156fSAndriy Gapon mambo_cngrab(struct consdev *cp)
1529976156fSAndriy Gapon {
1539976156fSAndriy Gapon }
1549976156fSAndriy Gapon 
1559976156fSAndriy Gapon static void
mambo_cnungrab(struct consdev * cp)1569976156fSAndriy Gapon mambo_cnungrab(struct consdev *cp)
1579976156fSAndriy Gapon {
1589976156fSAndriy Gapon }
1599976156fSAndriy Gapon 
1602c16c8d7SNathan Whitehorn static int
mambo_cngetc(struct consdev * cp)1612c16c8d7SNathan Whitehorn mambo_cngetc(struct consdev *cp)
1622c16c8d7SNathan Whitehorn {
1632c16c8d7SNathan Whitehorn 	int ch;
1642c16c8d7SNathan Whitehorn 
1652c16c8d7SNathan Whitehorn 	ch = mambocall(MAMBO_CONSOLE_READ);
1662c16c8d7SNathan Whitehorn 
1672c16c8d7SNathan Whitehorn 	if (ch > 0 && ch < 0xff) {
1684cf75455SRobert Watson #if defined(KDB)
1694cf75455SRobert Watson 		kdb_alt_break(ch, &alt_break_state);
1702c16c8d7SNathan Whitehorn #endif
1712c16c8d7SNathan Whitehorn 		return (ch);
1722c16c8d7SNathan Whitehorn 	}
1732c16c8d7SNathan Whitehorn 
1742c16c8d7SNathan Whitehorn 	return (-1);
1752c16c8d7SNathan Whitehorn }
1762c16c8d7SNathan Whitehorn 
1772c16c8d7SNathan Whitehorn static void
mambo_cnputc(struct consdev * cp,int c)1782c16c8d7SNathan Whitehorn mambo_cnputc(struct consdev *cp, int c)
1792c16c8d7SNathan Whitehorn {
1802c16c8d7SNathan Whitehorn 	char cbuf;
1812c16c8d7SNathan Whitehorn 
1822c16c8d7SNathan Whitehorn 	cbuf = c;
1832c16c8d7SNathan Whitehorn 	mambocall(MAMBO_CONSOLE_WRITE, &cbuf, 1UL, 1UL);
1842c16c8d7SNathan Whitehorn }
185