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