1 /* $NetBSD: console.c,v 1.13 2021/09/04 02:19:56 tsutsui Exp $ */ 2 3 /* 4 * Copyright (c) 2000 Soren S. Jorvang. 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 AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28 #include <sys/cdefs.h> 29 __KERNEL_RCSID(0, "$NetBSD: console.c,v 1.13 2021/09/04 02:19:56 tsutsui Exp $"); 30 31 #include <sys/param.h> 32 #include <sys/systm.h> 33 #include <sys/device.h> 34 #include <sys/conf.h> 35 36 #include <sys/bus.h> 37 #include <machine/nvram.h> 38 #include <machine/bootinfo.h> 39 40 #include <dev/cons.h> 41 42 #include <cobalt/dev/com_mainbusvar.h> 43 #include <machine/z8530var.h> 44 45 #include "com_mainbus.h" 46 #include "zsc.h" 47 #include "nullcons.h" 48 49 int console_present = 0; /* Do we have a console? */ 50 51 struct consdev constab[] = { 52 #if NCOM_MAINBUS > 0 53 { 54 .cn_probe = com_mainbus_cnprobe, 55 .cn_init = com_mainbus_cninit, 56 .cn_getc = NULL, 57 .cn_putc = NULL, 58 .cn_pollc = NULL, 59 .cn_bell = NULL, 60 .cn_halt = NULL, 61 .cn_flush = NULL, 62 .cn_dev = 0, 63 .cn_pri = CN_DEAD 64 }, 65 #endif 66 #if NZSC > 0 67 { 68 .cn_probe = zscnprobe, 69 .cn_init = zscninit, 70 .cn_getc = zscngetc, 71 .cn_putc = zscnputc, 72 .cn_pollc = nullcnpollc, 73 .cn_bell = NULL, 74 .cn_halt = NULL, 75 .cn_flush = NULL, 76 .cn_dev = NODEV, 77 .cn_pri = CN_DEAD 78 }, 79 #endif 80 #if NNULLCONS > 0 81 { 82 .cn_probe = nullcnprobe, 83 .cn_init = nullcninit, 84 .cn_getc = NULL, 85 .cn_putc = NULL, 86 .cn_pollc = NULL, 87 .cn_bell = NULL, 88 .cn_halt = NULL, 89 .cn_flush = NULL, 90 .cn_dev = 0, 91 .cn_pri = CN_DEAD 92 }, 93 #endif 94 { 95 .cn_probe = NULL, 96 .cn_init = NULL, 97 .cn_getc = NULL, 98 .cn_putc = NULL, 99 .cn_pollc = NULL, 100 .cn_bell = NULL, 101 .cn_halt = NULL, 102 .cn_flush = NULL, 103 .cn_dev = 0, 104 .cn_pri = CN_DEAD 105 } 106 }; 107 108 #define CONSOLE_PROBE 0x0020001c /* console flag passed by firmware */ 109 110 void 111 consinit(void) 112 { 113 struct btinfo_flags *bi_flags; 114 static int initted; 115 116 if (initted) 117 return; 118 initted = 1; 119 120 /* 121 * Linux code has a comment that serial console must be probed 122 * early, otherwise the value which allows to detect serial port 123 * could be overwritten. Okay, probe here and record the result 124 * for the future use. 125 * 126 * Note that if the kernel was booted with a boot loader, 127 * the latter *has* to provide a flag indicating whether console 128 * is present or not because the value might be overwritten by 129 * the loaded kernel. 130 */ 131 bi_flags = lookup_bootinfo(BTINFO_FLAGS); 132 if (bi_flags == NULL) { 133 /* No boot information, probe console now */ 134 console_present = 135 *(volatile uint32_t *)MIPS_PHYS_TO_KSEG1(CONSOLE_PROBE); 136 } else { 137 /* Get the value determined by the boot loader. */ 138 console_present = bi_flags->bi_flags & BI_SERIAL_CONSOLE; 139 } 140 141 cninit(); 142 } 143