1 /* $OpenBSD: consinit.c,v 1.17 2017/12/30 20:46:59 guenther Exp $ */ 2 /* $NetBSD: consinit.c,v 1.9 2000/10/20 05:32:35 mrg Exp $ */ 3 4 /*- 5 * Copyright (c) 1999 Eduardo E. Horvath 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. The name of the author may not be used to endorse or promote products 17 * derived from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 26 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32 #include "pcons.h" 33 #include "ukbd.h" 34 35 #include <sys/param.h> 36 #include <sys/systm.h> 37 #include <sys/conf.h> 38 #include <sys/device.h> 39 #include <sys/ioctl.h> 40 #include <sys/kernel.h> 41 #include <sys/proc.h> 42 #include <sys/tty.h> 43 #include <sys/time.h> 44 #include <sys/syslog.h> 45 46 #include <machine/autoconf.h> 47 #include <machine/openfirm.h> 48 #include <machine/conf.h> 49 #include <machine/cpu.h> 50 #include <machine/psl.h> 51 #include <machine/z8530var.h> 52 #include <machine/sparc64.h> 53 54 #include <dev/cons.h> 55 56 #include <sparc64/dev/cons.h> 57 58 #include <dev/usb/ukbdvar.h> 59 60 cons_decl(prom_); 61 62 int stdin = 0, stdout = 0; 63 64 /* 65 * The console is set to this one initially, 66 * which lets us use the PROM until consinit() 67 * is called to select a real console. 68 */ 69 struct consdev consdev_prom = { 70 prom_cnprobe, 71 prom_cninit, 72 prom_cngetc, 73 prom_cnputc, 74 prom_cnpollc, 75 NULL 76 }; 77 78 /* 79 * The console table pointer is statically initialized 80 * to point to the PROM (output only) table, so that 81 * early calls to printf will work. 82 */ 83 struct consdev *cn_tab = &consdev_prom; 84 85 void 86 prom_cnprobe(struct consdev *cd) 87 { 88 #if NPCONS > 0 89 int maj; 90 91 for (maj = 0; maj < nchrdev; maj++) 92 if (cdevsw[maj].d_open == pconsopen) 93 break; 94 cd->cn_dev = makedev(maj, 0); 95 cd->cn_pri = CN_MIDPRI; 96 #endif 97 } 98 99 int 100 prom_cngetc(dev_t dev) 101 { 102 unsigned char ch = '\0'; 103 int l; 104 #ifdef DDB 105 static int nplus = 0; 106 #endif 107 108 while ((l = OF_read(stdin, &ch, 1)) != 1) 109 /* void */; 110 #ifdef DDB 111 if (ch == '+') { 112 if (nplus++ > 3) 113 db_enter(); 114 } else 115 nplus = 0; 116 #endif 117 if (ch == '\r') 118 ch = '\n'; 119 if (ch == '\b') 120 ch = '\177'; 121 return ch; 122 } 123 124 void 125 prom_cninit(struct consdev *cn) 126 { 127 if (!stdin) stdin = OF_stdin(); 128 if (!stdout) stdout = OF_stdout(); 129 } 130 131 /* 132 * PROM console output putchar. 133 */ 134 void 135 prom_cnputc(dev_t dev, int c) 136 { 137 int s; 138 char c0 = (c & 0x7f); 139 140 #if 0 141 if (!stdout) stdout = OF_stdout(); 142 #endif 143 s = splhigh(); 144 OF_write(stdout, &c0, 1); 145 splx(s); 146 } 147 148 void 149 prom_cnpollc(dev_t dev, int on) 150 { 151 if (on) { 152 /* Entering debugger. */ 153 fb_unblank(); 154 } else { 155 /* Resuming kernel. */ 156 } 157 #if NPCONS > 0 158 pcons_cnpollc(dev, on); 159 #endif 160 } 161 162 /*****************************************************************/ 163 164 #ifdef DEBUG 165 #define DBPRINT(x) prom_printf x 166 #else 167 #define DBPRINT(x) 168 #endif 169 170 /* 171 * This function replaces sys/dev/cninit.c 172 * Determine which device is the console using 173 * the PROM "input source" and "output sink". 174 */ 175 void 176 consinit(void) 177 { 178 register int chosen; 179 char buffer[128]; 180 extern int stdinnode, fbnode; 181 char *consname = "unknown"; 182 183 DBPRINT(("consinit()\r\n")); 184 if (cn_tab != &consdev_prom) return; 185 186 DBPRINT(("setting up stdin\r\n")); 187 chosen = OF_finddevice("/chosen"); 188 OF_getprop(chosen, "stdin", &stdin, sizeof(stdin)); 189 DBPRINT(("stdin instance = %x\r\n", stdin)); 190 191 if ((stdinnode = OF_instance_to_package(stdin)) == 0) { 192 printf("WARNING: no PROM stdin\n"); 193 } 194 #if NUKBD > 0 195 else { 196 if (OF_getprop(stdinnode, "compatible", buffer, 197 sizeof(buffer)) != -1 && strncmp("usb", buffer, 3) == 0) 198 ukbd_cnattach(); 199 } 200 #endif 201 202 DBPRINT(("setting up stdout\r\n")); 203 OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)); 204 205 DBPRINT(("stdout instance = %x\r\n", stdout)); 206 207 if ((fbnode = OF_instance_to_package(stdout)) == 0) 208 printf("WARNING: no PROM stdout\n"); 209 210 DBPRINT(("stdout package = %x\r\n", fbnode)); 211 212 if (stdinnode && (OF_getproplen(stdinnode,"keyboard") >= 0)) { 213 consname = "keyboard/display"; 214 } else if (fbnode && 215 (OF_instance_to_path(stdin, buffer, sizeof(buffer)) >= 0)) { 216 consname = buffer; 217 } 218 printf("console is %s\n", consname); 219 220 /* Initialize PROM console */ 221 (*cn_tab->cn_probe)(cn_tab); 222 (*cn_tab->cn_init)(cn_tab); 223 } 224