[BACK]Return to consinit.c CVS log [TXT][DIR] Up to [local] / sys / arch / sparc64 / dev

Annotation of sys/arch/sparc64/dev/consinit.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: consinit.c,v 1.10 2005/04/26 15:16:20 miod 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/file.h>
        !            40: #include <sys/ioctl.h>
        !            41: #include <sys/kernel.h>
        !            42: #include <sys/proc.h>
        !            43: #include <sys/tty.h>
        !            44: #include <sys/time.h>
        !            45: #include <sys/syslog.h>
        !            46:
        !            47: #include <machine/autoconf.h>
        !            48: #include <machine/openfirm.h>
        !            49: #include <machine/bsd_openprom.h>
        !            50: #include <machine/conf.h>
        !            51: #include <machine/cpu.h>
        !            52: #include <machine/eeprom.h>
        !            53: #include <machine/psl.h>
        !            54: #include <machine/z8530var.h>
        !            55: #include <machine/sparc64.h>
        !            56:
        !            57: #include <dev/cons.h>
        !            58:
        !            59: #include <sparc64/dev/cons.h>
        !            60:
        !            61: #include <dev/usb/ukbdvar.h>
        !            62:
        !            63: cons_decl(prom_);
        !            64:
        !            65: int stdin = NULL, stdout = NULL;
        !            66:
        !            67: /*
        !            68:  * The console is set to this one initially,
        !            69:  * which lets us use the PROM until consinit()
        !            70:  * is called to select a real console.
        !            71:  */
        !            72: struct consdev consdev_prom = {
        !            73:        prom_cnprobe,
        !            74:        prom_cninit,
        !            75:        prom_cngetc,
        !            76:        prom_cnputc,
        !            77:        prom_cnpollc,
        !            78:        NULL
        !            79: };
        !            80:
        !            81: /*
        !            82:  * The console table pointer is statically initialized
        !            83:  * to point to the PROM (output only) table, so that
        !            84:  * early calls to printf will work.
        !            85:  */
        !            86: struct consdev *cn_tab = &consdev_prom;
        !            87:
        !            88: void
        !            89: prom_cnprobe(struct consdev *cd)
        !            90: {
        !            91: #if NPCONS > 0
        !            92:        int maj;
        !            93:
        !            94:        for (maj = 0; maj < nchrdev; maj++)
        !            95:                if (cdevsw[maj].d_open == pconsopen)
        !            96:                        break;
        !            97:        cd->cn_dev = makedev(maj, 0);
        !            98:        cd->cn_pri = CN_INTERNAL;
        !            99: #endif
        !           100: }
        !           101:
        !           102: int
        !           103: prom_cngetc(dev_t dev)
        !           104: {
        !           105:        unsigned char ch = '\0';
        !           106:        int l;
        !           107: #ifdef DDB
        !           108:        static int nplus = 0;
        !           109: #endif
        !           110:
        !           111:        while ((l = OF_read(stdin, &ch, 1)) != 1)
        !           112:                /* void */;
        !           113: #ifdef DDB
        !           114:        if (ch == '+') {
        !           115:                if (nplus++ > 3)
        !           116:                        Debugger();
        !           117:        } else
        !           118:                nplus = 0;
        !           119: #endif
        !           120:        if (ch == '\r')
        !           121:                ch = '\n';
        !           122:        if (ch == '\b')
        !           123:                ch = '\177';
        !           124:        return ch;
        !           125: }
        !           126:
        !           127: void
        !           128: prom_cninit(struct consdev *cn)
        !           129: {
        !           130:        if (!stdin) stdin = OF_stdin();
        !           131:        if (!stdout) stdout = OF_stdout();
        !           132: }
        !           133:
        !           134: /*
        !           135:  * PROM console output putchar.
        !           136:  */
        !           137: void
        !           138: prom_cnputc(dev_t dev, int c)
        !           139: {
        !           140:        int s;
        !           141:        char c0 = (c & 0x7f);
        !           142:
        !           143: #if 0
        !           144:        if (!stdout) stdout = OF_stdout();
        !           145: #endif
        !           146:        s = splhigh();
        !           147:        OF_write(stdout, &c0, 1);
        !           148:        splx(s);
        !           149: }
        !           150:
        !           151: void
        !           152: prom_cnpollc(dev_t dev, int on)
        !           153: {
        !           154:        if (on) {
        !           155:                 /* Entering debugger. */
        !           156:                 fb_unblank();
        !           157:        } else {
        !           158:                 /* Resuming kernel. */
        !           159:        }
        !           160: #if NPCONS > 0
        !           161:        pcons_cnpollc(dev, on);
        !           162: #endif
        !           163: }
        !           164:
        !           165: /*****************************************************************/
        !           166:
        !           167: #ifdef DEBUG
        !           168: #define        DBPRINT(x)      prom_printf x
        !           169: #else
        !           170: #define        DBPRINT(x)
        !           171: #endif
        !           172:
        !           173: /*
        !           174:  * This function replaces sys/dev/cninit.c
        !           175:  * Determine which device is the console using
        !           176:  * the PROM "input source" and "output sink".
        !           177:  */
        !           178: void
        !           179: consinit()
        !           180: {
        !           181:        register int chosen;
        !           182:        char buffer[128];
        !           183:        extern int stdinnode, fbnode;
        !           184:        char *consname = "unknown";
        !           185:
        !           186:        DBPRINT(("consinit()\r\n"));
        !           187:        if (cn_tab != &consdev_prom) return;
        !           188:
        !           189:        DBPRINT(("setting up stdin\r\n"));
        !           190:        chosen = OF_finddevice("/chosen");
        !           191:        OF_getprop(chosen, "stdin",  &stdin, sizeof(stdin));
        !           192:        DBPRINT(("stdin instance = %x\r\n", stdin));
        !           193:
        !           194:        if ((stdinnode = OF_instance_to_package(stdin)) == 0) {
        !           195:                printf("WARNING: no PROM stdin\n");
        !           196:        }
        !           197: #if NUKBD > 0
        !           198:        else {
        !           199:                if (OF_getprop(stdinnode, "compatible", buffer,
        !           200:                    sizeof(buffer)) != -1 && strncmp("usb", buffer, 3) == 0)
        !           201:                        ukbd_cnattach();
        !           202:        }
        !           203: #endif
        !           204:
        !           205:        DBPRINT(("setting up stdout\r\n"));
        !           206:        OF_getprop(chosen, "stdout", &stdout, sizeof(stdout));
        !           207:
        !           208:        DBPRINT(("stdout instance = %x\r\n", stdout));
        !           209:
        !           210:        if ((fbnode = OF_instance_to_package(stdout)) == 0)
        !           211:                printf("WARNING: no PROM stdout\n");
        !           212:
        !           213:        DBPRINT(("stdout package = %x\r\n", fbnode));
        !           214:
        !           215:        if (stdinnode && (OF_getproplen(stdinnode,"keyboard") >= 0)) {
        !           216:                consname = "keyboard/display";
        !           217:        } else if (fbnode &&
        !           218:                   (OF_instance_to_path(stdin, buffer, sizeof(buffer)) >= 0)) {
        !           219:                consname = buffer;
        !           220:        }
        !           221:        printf("console is %s\n", consname);
        !           222:
        !           223:        /* Initialize PROM console */
        !           224:        (*cn_tab->cn_probe)(cn_tab);
        !           225:        (*cn_tab->cn_init)(cn_tab);
        !           226: }

CVSweb