Home | History | Annotate | Line # | Download | only in oea
ofw_consinit.c revision 1.4.2.2
      1  1.4.2.2      mjf /* $NetBSD: ofw_consinit.c,v 1.4.2.2 2007/12/08 18:17:40 mjf Exp $ */
      2      1.2  garbled 
      3      1.2  garbled /*-
      4      1.2  garbled  * Copyright (c) 2007 The NetBSD Foundation, Inc.
      5      1.2  garbled  * All rights reserved.
      6      1.2  garbled  *
      7      1.2  garbled  * This code is derived from software contributed to The NetBSD Foundation
      8      1.2  garbled  * by Tim Rightnour
      9      1.2  garbled  *
     10      1.2  garbled  * Redistribution and use in source and binary forms, with or without
     11      1.2  garbled  * modification, are permitted provided that the following conditions
     12      1.2  garbled  * are met:
     13      1.2  garbled  * 1. Redistributions of source code must retain the above copyright
     14      1.2  garbled  *    notice, this list of conditions and the following disclaimer.
     15      1.2  garbled  * 2. Redistributions in binary form must reproduce the above copyright
     16      1.2  garbled  *    notice, this list of conditions and the following disclaimer in the
     17      1.2  garbled  *    documentation and/or other materials provided with the distribution.
     18      1.2  garbled  * 3. All advertising materials mentioning features or use of this software
     19      1.2  garbled  *    must display the following acknowledgement:
     20      1.2  garbled  *        This product includes software developed by the NetBSD
     21      1.2  garbled  *        Foundation, Inc. and its contributors.
     22      1.2  garbled  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23      1.2  garbled  *    contributors may be used to endorse or promote products derived
     24      1.2  garbled  *    from this software without specific prior written permission.
     25      1.2  garbled  *
     26      1.2  garbled  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27      1.2  garbled  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28      1.2  garbled  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29      1.2  garbled  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30      1.2  garbled  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31      1.2  garbled  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32      1.2  garbled  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33      1.2  garbled  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34      1.2  garbled  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35      1.2  garbled  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36      1.2  garbled  * POSSIBILITY OF SUCH DAMAGE.
     37      1.2  garbled  */
     38      1.2  garbled 
     39      1.2  garbled #include <sys/cdefs.h>
     40  1.4.2.2      mjf __KERNEL_RCSID(0, "$NetBSD: ofw_consinit.c,v 1.4.2.2 2007/12/08 18:17:40 mjf Exp $");
     41      1.2  garbled 
     42      1.2  garbled #include <sys/param.h>
     43      1.2  garbled #include <sys/buf.h>
     44      1.2  garbled #include <sys/tty.h>
     45      1.2  garbled 
     46      1.2  garbled #include <machine/autoconf.h>
     47      1.2  garbled #include <machine/trap.h>
     48      1.2  garbled #include <machine/bus.h>
     49      1.2  garbled 
     50      1.2  garbled #include <powerpc/ofw_cons.h>
     51      1.2  garbled 
     52      1.2  garbled #include <dev/cons.h>
     53      1.2  garbled #include <dev/ofw/openfirm.h>
     54      1.2  garbled 
     55      1.2  garbled #include <dev/wscons/wsksymvar.h>
     56      1.2  garbled #include <dev/wscons/wscons_callbacks.h>
     57      1.2  garbled 
     58      1.2  garbled #include <machine/stdarg.h>
     59      1.2  garbled 
     60      1.2  garbled #include "akbd.h"
     61      1.2  garbled #include "adbkbd.h"
     62  1.4.2.1      mjf #include "wsdisplay.h"
     63      1.2  garbled #include "ofb.h"
     64      1.2  garbled #include "isa.h"
     65      1.2  garbled 
     66      1.2  garbled #include "zsc.h"
     67      1.2  garbled #if NZSC > 0
     68      1.2  garbled #include <machine/z8530var.h>
     69      1.2  garbled #endif
     70      1.2  garbled 
     71      1.2  garbled #include "adb.h"
     72      1.2  garbled #if (NADB > 0)
     73      1.2  garbled #include <macppc/dev/adbvar.h>
     74      1.2  garbled #endif
     75      1.2  garbled 
     76      1.2  garbled #include "ukbd.h"
     77      1.2  garbled #if (NUKBD > 0)
     78      1.2  garbled #include <dev/usb/ukbdvar.h>
     79      1.2  garbled struct usb_kbd_ihandles {
     80      1.2  garbled 	struct usb_kbd_ihandles *next;
     81      1.2  garbled 	int ihandle;
     82      1.2  garbled };
     83      1.2  garbled #endif
     84      1.2  garbled 
     85      1.2  garbled #include "zstty.h"
     86      1.2  garbled #if (NZSTTY > 0)
     87      1.2  garbled #include <dev/ic/z8530reg.h>
     88      1.2  garbled extern struct consdev consdev_zs;
     89      1.2  garbled #endif
     90      1.2  garbled 
     91      1.2  garbled #include "pckbc.h"
     92      1.2  garbled #if (NPCKBC > 0)
     93      1.2  garbled #include <dev/isa/isareg.h>
     94      1.2  garbled #include <dev/ic/i8042reg.h>
     95      1.2  garbled #include <dev/ic/pckbcvar.h>
     96      1.2  garbled #endif
     97      1.2  garbled 
     98      1.2  garbled extern int console_node, console_instance;
     99      1.2  garbled 
    100      1.3  garbled int chosen, stdin, stdout;
    101      1.2  garbled int ofkbd_ihandle;
    102      1.2  garbled 
    103      1.2  garbled static void cninit_kd(void);
    104      1.2  garbled static void ofwoea_bootstrap_console(void);
    105      1.3  garbled static int ofwbootcons_cngetc(dev_t);
    106      1.3  garbled static void ofwbootcons_cnputc(dev_t, int);
    107      1.2  garbled 
    108      1.2  garbled /*#define OFDEBUG*/
    109      1.2  garbled 
    110      1.3  garbled struct consdev consdev_ofwbootcons = {
    111      1.3  garbled 	NULL, NULL,
    112      1.3  garbled 	ofwbootcons_cngetc,
    113      1.3  garbled 	ofwbootcons_cnputc,
    114      1.3  garbled 	nullcnpollc,
    115      1.3  garbled 	NULL, NULL, NULL, NODEV, CN_INTERNAL,
    116      1.3  garbled };
    117      1.3  garbled 
    118      1.2  garbled #ifdef OFDEBUG
    119      1.2  garbled void ofprint(const char *, ...);
    120      1.2  garbled 
    121      1.2  garbled void ofprint(const char *blah, ...)
    122      1.2  garbled {
    123      1.2  garbled 	va_list va;
    124      1.2  garbled 	char buf[256];
    125      1.2  garbled 	int len;
    126      1.2  garbled 
    127      1.2  garbled 	va_start(va, blah);
    128      1.2  garbled 	len = vsnprintf(buf, sizeof(buf), blah, va);
    129      1.2  garbled 	OF_write(console_instance, buf, len);
    130      1.2  garbled }
    131      1.2  garbled 
    132      1.2  garbled #define OFPRINTF ofprint
    133      1.2  garbled #else
    134      1.2  garbled #define OFPRINTF while(0) printf
    135      1.2  garbled #endif
    136      1.2  garbled 
    137      1.2  garbled void
    138      1.2  garbled cninit(void)
    139      1.2  garbled {
    140  1.4.2.2      mjf 	char name[32];
    141      1.2  garbled 
    142      1.2  garbled 	ofwoea_bootstrap_console();
    143      1.2  garbled 
    144      1.2  garbled 	OFPRINTF("console node: %08x\n", console_node);
    145      1.2  garbled 
    146      1.2  garbled 	if (console_node == -1)
    147      1.2  garbled 		goto nocons;
    148      1.2  garbled 
    149  1.4.2.2      mjf 	memset(name, 0, sizeof(name));
    150  1.4.2.2      mjf 	if (OF_getprop(console_node, "device_type", name, sizeof(name)) == -1)
    151      1.2  garbled 		goto nocons;
    152      1.2  garbled 
    153  1.4.2.2      mjf 	OFPRINTF("console type: %s\n", name);
    154      1.2  garbled 
    155  1.4.2.2      mjf 	if (strcmp(name, "serial") == 0) {
    156      1.2  garbled 		struct consdev *cp;
    157      1.2  garbled 
    158      1.3  garbled #ifdef PMAC_G5
    159      1.2  garbled 		/* The MMU hasn't been initialized yet, use failsafe for now */
    160      1.2  garbled 		cp = &failsafe_cons;
    161      1.2  garbled 		cn_tab = cp;
    162      1.2  garbled 		(*cp->cn_probe)(cp);
    163      1.2  garbled 		(*cp->cn_init)(cp);
    164      1.2  garbled 		aprint_verbose("Early G5 console initialized\n");
    165      1.3  garbled 		return;
    166      1.3  garbled #endif /* PMAC_G5 */
    167      1.3  garbled 
    168      1.3  garbled #if (NZSTTY > 0) && !defined(MAMBO)
    169      1.2  garbled 		OF_getprop(console_node, "name", name, sizeof(name));
    170      1.2  garbled 		if (strcmp(name, "ch-a") == 0 || strcmp(name, "ch-b") == 0) {
    171      1.2  garbled 			cp = &consdev_zs;
    172      1.2  garbled 			(*cp->cn_probe)(cp);
    173      1.2  garbled 			(*cp->cn_init)(cp);
    174      1.2  garbled 			cn_tab = cp;
    175      1.2  garbled 		}
    176      1.2  garbled 		return;
    177      1.2  garbled #endif /* NZTTY */
    178      1.2  garbled 
    179  1.4.2.2      mjf 		/* fallback to OFW boot console */
    180  1.4.2.2      mjf 		cp = &consdev_ofwbootcons;
    181  1.4.2.2      mjf 		cn_tab = cp;
    182      1.2  garbled 		return;
    183      1.2  garbled 	}
    184  1.4.2.2      mjf 	else
    185  1.4.2.2      mjf 		cninit_kd();
    186      1.2  garbled nocons:
    187      1.2  garbled 	return;
    188      1.2  garbled }
    189      1.2  garbled 
    190      1.2  garbled 
    191      1.2  garbled static void
    192      1.2  garbled cninit_kd(void)
    193      1.2  garbled {
    194      1.3  garbled 	int kstdin, node;
    195      1.2  garbled 	char name[16];
    196      1.2  garbled #if (NAKBD > 0) || (NADBKBD > 0)
    197      1.2  garbled 	int akbd;
    198      1.2  garbled #endif
    199      1.2  garbled #if NUKBD > 0
    200      1.2  garbled 	struct usb_kbd_ihandles *ukbds;
    201      1.2  garbled 	int ukbd;
    202      1.2  garbled #endif
    203      1.2  garbled 
    204      1.2  garbled 	/*
    205      1.2  garbled 	 * Attach the console output now (so we can see debugging messages,
    206      1.2  garbled 	 * if any).
    207      1.2  garbled 	 */
    208  1.4.2.1      mjf #if NWSDISPLAY > 0
    209  1.4.2.2      mjf 	rascons_cnattach();
    210      1.4  garbled #endif
    211      1.2  garbled 
    212      1.2  garbled 	/*
    213      1.2  garbled 	 * We must determine which keyboard type we have.
    214      1.2  garbled 	 */
    215      1.3  garbled 	if (OF_getprop(chosen, "stdin", &kstdin, sizeof(kstdin))
    216      1.3  garbled 	    != sizeof(kstdin)) {
    217      1.2  garbled 		printf("WARNING: no `stdin' property in /chosen\n");
    218      1.2  garbled 		return;
    219      1.2  garbled 	}
    220      1.2  garbled 
    221      1.3  garbled 	node = OF_instance_to_package(kstdin);
    222      1.2  garbled 	memset(name, 0, sizeof(name));
    223      1.2  garbled 	OF_getprop(node, "name", name, sizeof(name));
    224      1.2  garbled 	if (strcmp(name, "keyboard") != 0) {
    225      1.2  garbled 		printf("WARNING: stdin is not a keyboard: %s\n", name);
    226      1.2  garbled 		return;
    227      1.2  garbled 	}
    228      1.2  garbled 
    229      1.2  garbled #if NAKBD > 0
    230      1.2  garbled 	memset(name, 0, sizeof(name));
    231      1.2  garbled 	OF_getprop(OF_parent(node), "name", name, sizeof(name));
    232      1.2  garbled 	if (strcmp(name, "adb") == 0) {
    233      1.2  garbled 		printf("console keyboard type: ADB\n");
    234      1.2  garbled 		akbd_cnattach();
    235      1.2  garbled 		goto kbd_found;
    236      1.2  garbled 	}
    237      1.2  garbled #endif
    238      1.2  garbled #if NADBKBD > 0
    239      1.2  garbled 	memset(name, 0, sizeof(name));
    240      1.2  garbled 	OF_getprop(OF_parent(node), "name", name, sizeof(name));
    241      1.2  garbled 	if (strcmp(name, "adb") == 0) {
    242      1.2  garbled 		printf("console keyboard type: ADB\n");
    243      1.2  garbled 		adbkbd_cnattach();
    244      1.2  garbled 		goto kbd_found;
    245      1.2  garbled 	}
    246      1.2  garbled #endif
    247      1.2  garbled #if NPCKBC > 0
    248      1.2  garbled 	memset(name, 0, sizeof(name));
    249      1.2  garbled 	OF_getprop(OF_parent(node), "name", name, sizeof(name));
    250      1.2  garbled 	if (strcmp(name, "keyboard") == 0) {
    251      1.2  garbled 		printf("console keyboard type: PC Keyboard\n");
    252      1.2  garbled 		pckbc_cnattach(&genppc_isa_io_space_tag, IO_KBD, KBCMDP,
    253      1.2  garbled 		    PCKBC_KBD_SLOT);
    254      1.2  garbled 		goto kbd_found;
    255      1.2  garbled 	}
    256      1.2  garbled #endif
    257      1.2  garbled 
    258      1.2  garbled 	/*
    259      1.2  garbled 	 * It is not obviously an ADB/PC keyboard. Could be USB,
    260      1.2  garbled 	 * or ADB on some firmware versions (e.g.: iBook G4)
    261      1.2  garbled 	 * This is not enough, we have a few more problems:
    262      1.2  garbled 	 *
    263      1.2  garbled 	 *	(1) The stupid Macintosh firmware uses a
    264      1.2  garbled 	 *	    `psuedo-hid' (no typo) or `pseudo-hid',
    265      1.2  garbled 	 *	    which apparently merges all keyboards
    266      1.2  garbled 	 *	    input into a single input stream.
    267      1.2  garbled 	 *	    Because of this, we can't actually
    268      1.2  garbled 	 *	    determine which controller or keyboard
    269      1.2  garbled 	 *	    is really the console keyboard!
    270      1.2  garbled 	 *
    271      1.2  garbled 	 *	(2) Even if we could, the keyboard can be USB,
    272      1.2  garbled 	 *	    and this requires a lot of the kernel to
    273      1.2  garbled 	 *	    be running in order for it to work.
    274      1.2  garbled 	 *
    275      1.2  garbled 	 *      (3) If the keyboard is behind isa, we don't have enough
    276      1.2  garbled 	 * 	    kernel setup to use it yet, so punt to the ofroutines.
    277      1.2  garbled 	 *
    278      1.2  garbled 	 * So, what we do is this:
    279      1.2  garbled 	 *
    280      1.2  garbled 	 *	(1) First check for OpenFirmware implementation
    281      1.2  garbled 	 *	    that will not let us distinguish between
    282      1.2  garbled 	 *	    USB and ADB. In that situation, try attaching
    283      1.2  garbled 	 *	    anything as we can, and hope things get better
    284      1.2  garbled 	 *	    at autoconfiguration time.
    285      1.2  garbled 	 *
    286      1.2  garbled 	 *	(2) Assume the keyboard is USB.
    287      1.2  garbled 	 *	    Tell the ukbd driver that it is the console.
    288      1.2  garbled 	 *	    At autoconfiguration time, it will attach the
    289      1.2  garbled 	 *	    first USB keyboard instance as the console
    290      1.2  garbled 	 *	    keyboard.
    291      1.2  garbled 	 *
    292      1.2  garbled 	 *	(3) Until then, so that we have _something_, we
    293      1.2  garbled 	 *	    use the OpenFirmware I/O facilities to read
    294      1.2  garbled 	 *	    the keyboard.
    295      1.2  garbled 	 */
    296      1.2  garbled 
    297      1.2  garbled 	/*
    298      1.2  garbled 	 * stdin is /pseudo-hid/keyboard.  There is no
    299      1.2  garbled 	 * `adb-kbd-ihandle or `usb-kbd-ihandles methods
    300      1.2  garbled 	 * available. Try attaching as ADB.
    301      1.2  garbled 	 *
    302      1.2  garbled 	 * XXX This must be called before pmap_bootstrap().
    303      1.2  garbled 	 */
    304      1.2  garbled 	if (strcmp(name, "pseudo-hid") == 0) {
    305      1.2  garbled 		printf("console keyboard type: unknown, assuming ADB\n");
    306      1.2  garbled #if NAKBD > 0
    307      1.2  garbled 		akbd_cnattach();
    308      1.2  garbled #endif
    309      1.2  garbled #if NADBKBD > 0
    310      1.2  garbled 		adbkbd_cnattach();
    311      1.2  garbled #endif
    312      1.2  garbled 		goto kbd_found;
    313      1.2  garbled 	}
    314      1.2  garbled 
    315      1.2  garbled 	/*
    316      1.2  garbled 	 * stdin is /psuedo-hid/keyboard.  Test `adb-kbd-ihandle and
    317      1.2  garbled 	 * `usb-kbd-ihandles to figure out the real keyboard(s).
    318      1.2  garbled 	 *
    319      1.2  garbled 	 * XXX This must be called before pmap_bootstrap().
    320      1.2  garbled 	 */
    321      1.2  garbled 
    322      1.2  garbled #if NUKBD > 0
    323      1.2  garbled 	if (OF_call_method("`usb-kbd-ihandles", stdin, 0, 1, &ukbds) >= 0 &&
    324      1.2  garbled 	    ukbds != NULL && ukbds->ihandle != 0 &&
    325      1.2  garbled 	    OF_instance_to_package(ukbds->ihandle) != -1) {
    326      1.2  garbled 		printf("usb-kbd-ihandles matches\n");
    327      1.2  garbled 		printf("console keyboard type: USB\n");
    328      1.2  garbled 		ukbd_cnattach();
    329      1.2  garbled 		goto kbd_found;
    330      1.2  garbled 	}
    331      1.2  garbled 	/* Try old method name. */
    332      1.3  garbled 	if (OF_call_method("`usb-kbd-ihandle", kstdin, 0, 1, &ukbd) >= 0 &&
    333      1.2  garbled 	    ukbd != 0 &&
    334      1.2  garbled 	    OF_instance_to_package(ukbd) != -1) {
    335      1.2  garbled 		printf("usb-kbd-ihandle matches\n");
    336      1.2  garbled 		printf("console keyboard type: USB\n");
    337      1.3  garbled 		kstdin = ukbd;
    338      1.2  garbled 		ukbd_cnattach();
    339      1.2  garbled 		goto kbd_found;
    340      1.2  garbled 	}
    341      1.2  garbled #endif
    342      1.2  garbled 
    343      1.2  garbled #if (NAKBD > 0) || (NADBKBD > 0)
    344      1.3  garbled 	if (OF_call_method("`adb-kbd-ihandle", kstdin, 0, 1, &akbd) >= 0 &&
    345      1.2  garbled 	    akbd != 0 &&
    346      1.2  garbled 	    OF_instance_to_package(akbd) != -1) {
    347      1.2  garbled 		printf("adb-kbd-ihandle matches\n");
    348      1.2  garbled 		printf("console keyboard type: ADB\n");
    349      1.3  garbled 		kstdin = akbd;
    350      1.2  garbled #if NAKBD > 0
    351      1.2  garbled 		akbd_cnattach();
    352      1.2  garbled #endif
    353      1.2  garbled #if NADBKBD > 0
    354      1.2  garbled 		adbkbd_cnattach();
    355      1.2  garbled #endif
    356      1.2  garbled 		goto kbd_found;
    357      1.2  garbled 	}
    358      1.2  garbled #endif
    359      1.2  garbled 
    360      1.2  garbled #if NUKBD > 0
    361      1.2  garbled 	/*
    362      1.2  garbled 	 * XXX Old firmware does not have `usb-kbd-ihandles method.  Assume
    363      1.2  garbled 	 * XXX USB keyboard anyway.
    364      1.2  garbled 	 */
    365      1.2  garbled 	printf("defaulting to USB...");
    366      1.2  garbled 	printf("console keyboard type: USB\n");
    367      1.2  garbled 	ukbd_cnattach();
    368      1.2  garbled 	goto kbd_found;
    369      1.2  garbled #endif
    370      1.2  garbled 
    371      1.2  garbled 	/*
    372      1.2  garbled 	 * No keyboard is found.  Just return.
    373      1.2  garbled 	 */
    374      1.2  garbled 	printf("no console keyboard\n");
    375      1.2  garbled 	return;
    376      1.2  garbled 
    377      1.2  garbled kbd_found:;
    378      1.2  garbled #if NAKBD + NUKBD + NADBKBD > 0
    379      1.2  garbled 	/*
    380      1.2  garbled 	 * XXX This is a little gross, but we don't get to call
    381      1.2  garbled 	 * XXX wskbd_cnattach() twice.
    382      1.2  garbled 	 */
    383      1.3  garbled 	ofkbd_ihandle = kstdin;
    384      1.2  garbled #if NWSDISPLAY > 0
    385      1.2  garbled 	wsdisplay_set_cons_kbd(ofkbd_cngetc, NULL, NULL);
    386      1.2  garbled #endif
    387      1.2  garbled #endif
    388      1.2  garbled }
    389      1.2  garbled 
    390      1.2  garbled /*
    391      1.2  garbled  * Bootstrap console keyboard routines, using OpenFirmware I/O.
    392      1.2  garbled  */
    393      1.2  garbled int
    394      1.2  garbled ofkbd_cngetc(dev_t dev)
    395      1.2  garbled {
    396      1.2  garbled 	u_char c = '\0';
    397      1.2  garbled 	int len;
    398      1.2  garbled 
    399      1.2  garbled 	do {
    400      1.2  garbled 		len = OF_read(ofkbd_ihandle, &c, 1);
    401      1.2  garbled 	} while (len != 1);
    402      1.2  garbled 
    403      1.2  garbled 	return c;
    404      1.2  garbled }
    405      1.2  garbled 
    406      1.3  garbled /*
    407      1.3  garbled  * Bootstrap console support functions
    408      1.3  garbled  */
    409      1.3  garbled 
    410      1.3  garbled static int
    411      1.3  garbled ofwbootcons_cngetc(dev_t dev)
    412      1.3  garbled {
    413      1.3  garbled 	unsigned char ch = '\0';
    414      1.3  garbled 	int l;
    415      1.3  garbled 
    416      1.3  garbled 	while ((l = OF_read(stdin, &ch, 1)) != 1)
    417      1.3  garbled 		if (l != -2 && l != 0)
    418      1.3  garbled 			return -1;
    419      1.3  garbled 	return ch;
    420      1.3  garbled }
    421      1.3  garbled 
    422      1.3  garbled static void
    423      1.3  garbled ofwbootcons_cnputc(dev_t dev, int c)
    424      1.3  garbled {
    425      1.3  garbled 	char ch = c;
    426      1.3  garbled 
    427      1.3  garbled 	OF_write(stdout, &ch, 1);
    428      1.3  garbled }
    429      1.3  garbled 
    430      1.2  garbled void
    431      1.2  garbled ofwoea_consinit(void)
    432      1.2  garbled {
    433      1.2  garbled 	static int initted = 0;
    434      1.2  garbled 
    435      1.2  garbled 	if (initted)
    436      1.2  garbled 		return;
    437      1.2  garbled 
    438      1.2  garbled 	initted = 1;
    439      1.2  garbled 	cninit();
    440      1.2  garbled }
    441      1.2  garbled 
    442      1.2  garbled static void
    443      1.2  garbled ofwoea_bootstrap_console(void)
    444      1.2  garbled {
    445      1.3  garbled 	int node;
    446      1.2  garbled 
    447      1.2  garbled 	chosen = OF_finddevice("/chosen");
    448      1.2  garbled 	if (chosen == -1)
    449      1.2  garbled 		goto nocons;
    450      1.2  garbled 
    451      1.2  garbled 	if (OF_getprop(chosen, "stdout", &stdout,
    452      1.2  garbled 	    sizeof(stdout)) != sizeof(stdout))
    453      1.2  garbled 		goto nocons;
    454      1.3  garbled 	if (OF_getprop(chosen, "stdin", &stdin,
    455      1.3  garbled 	    sizeof(stdin)) != sizeof(stdin))
    456      1.3  garbled 		goto nocons;
    457      1.2  garbled 	node = OF_instance_to_package(stdout);
    458      1.2  garbled 	console_node = node;
    459      1.2  garbled 	console_instance = stdout;
    460      1.2  garbled 
    461      1.2  garbled 	return;
    462      1.2  garbled nocons:
    463      1.2  garbled 	panic("No /chosen could be found!\n");
    464      1.2  garbled 	console_node = -1;
    465      1.2  garbled 	return;
    466      1.2  garbled }
    467