1/*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (C) 2008 by Nathan Whitehorn. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 19 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 21 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 22 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 24 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> 28__FBSDID("$FreeBSD$"); 29 30#include <sys/param.h> 31#include <sys/kdb.h> 32#include <sys/kernel.h> 33#include <sys/priv.h> 34#include <sys/systm.h> 35#include <sys/types.h> 36#include <sys/conf.h> 37#include <sys/cons.h> 38#include <sys/consio.h> 39#include <sys/tty.h> 40 41#include <dev/ofw/openfirm.h> 42 43#include <ddb/ddb.h> 44 45#include "mambocall.h" 46 47#define MAMBOBURSTLEN 128 /* max number of bytes to write in one chunk */ 48 49#define MAMBO_CONSOLE_WRITE 0 50#define MAMBO_CONSOLE_READ 60 51 52static tsw_outwakeup_t mambotty_outwakeup; 53 54static struct ttydevsw mambo_ttydevsw = { 55 .tsw_flags = TF_NOPREFIX, 56 .tsw_outwakeup = mambotty_outwakeup, 57}; 58 59static int polltime; 60static struct callout mambo_callout; 61static struct tty *tp = NULL; 62 63#if defined(KDB) 64static int alt_break_state; 65#endif 66 67static void mambo_timeout(void *); 68 69static cn_probe_t mambo_cnprobe; 70static cn_init_t mambo_cninit; 71static cn_term_t mambo_cnterm; 72static cn_getc_t mambo_cngetc; 73static cn_putc_t mambo_cnputc; 74static cn_grab_t mambo_cngrab; 75static cn_ungrab_t mambo_cnungrab; 76 77CONSOLE_DRIVER(mambo); 78 79static void 80cn_drvinit(void *unused) 81{ 82 83 if (mambo_consdev.cn_pri != CN_DEAD && 84 mambo_consdev.cn_name[0] != '\0') { 85 if (OF_finddevice("/mambo") == -1) 86 return; 87 88 tp = tty_alloc(&mambo_ttydevsw, NULL); 89 tty_init_console(tp, 0); 90 tty_makedev(tp, NULL, "%s", "mambocons"); 91 92 polltime = 1; 93 94 callout_init(&mambo_callout, 1); 95 callout_reset(&mambo_callout, polltime, mambo_timeout, NULL); 96 } 97} 98 99SYSINIT(cndev, SI_SUB_CONFIGURE, SI_ORDER_MIDDLE, cn_drvinit, NULL); 100 101static void 102mambotty_outwakeup(struct tty *tp) 103{ 104 int len; 105 u_char buf[MAMBOBURSTLEN]; 106 107 for (;;) { 108 len = ttydisc_getc(tp, buf, sizeof buf); 109 if (len == 0) 110 break; 111 mambocall(MAMBO_CONSOLE_WRITE, buf, (register_t)len, 1UL); 112 } 113} 114 115static void 116mambo_timeout(void *v) 117{ 118 int c; 119 120 tty_lock(tp); 121 while ((c = mambo_cngetc(NULL)) != -1) 122 ttydisc_rint(tp, c, 0); 123 ttydisc_rint_done(tp); 124 tty_unlock(tp); 125 126 callout_reset(&mambo_callout, polltime, mambo_timeout, NULL); 127} 128 129static void 130mambo_cnprobe(struct consdev *cp) 131{ 132 if (OF_finddevice("/mambo") == -1) { 133 cp->cn_pri = CN_DEAD; 134 return; 135 } 136 137 cp->cn_pri = CN_NORMAL; 138} 139 140static void 141mambo_cninit(struct consdev *cp) 142{ 143 144 /* XXX: This is the alias, but that should be good enough */ 145 strcpy(cp->cn_name, "mambocons"); 146} 147 148static void 149mambo_cnterm(struct consdev *cp) 150{ 151} 152 153static void 154mambo_cngrab(struct consdev *cp) 155{ 156} 157 158static void 159mambo_cnungrab(struct consdev *cp) 160{ 161} 162 163static int 164mambo_cngetc(struct consdev *cp) 165{ 166 int ch; 167 168 ch = mambocall(MAMBO_CONSOLE_READ); 169 170 if (ch > 0 && ch < 0xff) { 171#if defined(KDB) 172 kdb_alt_break(ch, &alt_break_state); 173#endif 174 return (ch); 175 } 176 177 return (-1); 178} 179 180static void 181mambo_cnputc(struct consdev *cp, int c) 182{ 183 char cbuf; 184 185 cbuf = c; 186 mambocall(MAMBO_CONSOLE_WRITE, &cbuf, 1UL, 1UL); 187} 188