Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/powerpc Separate probing for the console device and...



details:   https://anonhg.NetBSD.org/src/rev/0bcfd3b10d8b
branches:  trunk
changeset: 953321:0bcfd3b10d8b
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Fri Mar 05 18:10:06 2021 +0000

description:
Separate probing for the console device and initializing it, so that
ofwoea_initppc() can have more control over which of those steps are
performed during initialization.  Probing happens before setting up
the exception vectors, initializing happens after.

diffstat:

 sys/arch/powerpc/include/ofw_cons.h   |    7 +-
 sys/arch/powerpc/oea/ofw_consinit.c   |  139 ++++++++++++++++++++-------------
 sys/arch/powerpc/oea/ofwoea_machdep.c |   16 ++-
 3 files changed, 96 insertions(+), 66 deletions(-)

diffs (truncated from 358 to 300 lines):

diff -r 1fd24e45f61e -r 0bcfd3b10d8b sys/arch/powerpc/include/ofw_cons.h
--- a/sys/arch/powerpc/include/ofw_cons.h       Fri Mar 05 18:08:21 2021 +0000
+++ b/sys/arch/powerpc/include/ofw_cons.h       Fri Mar 05 18:10:06 2021 +0000
@@ -1,9 +1,10 @@
-/* $NetBSD: ofw_cons.h,v 1.2 2007/10/17 19:56:41 garbled Exp $ */
+/* $NetBSD: ofw_cons.h,v 1.3 2021/03/05 18:10:06 thorpej Exp $ */
 
 #ifndef _POWERPC_OFW_CONS_H_
 #define _POWERPC_OFW_CONS_H_
 
-void ofwoea_consinit(void);
-int ofkbd_cngetc(dev_t dev);
+void   ofwoea_cnprobe(void);
+void   ofwoea_consinit(void);
+int    ofkbd_cngetc(dev_t dev);
 
 #endif /* _POWERPC_OFW_CONS_H_ */
diff -r 1fd24e45f61e -r 0bcfd3b10d8b sys/arch/powerpc/oea/ofw_consinit.c
--- a/sys/arch/powerpc/oea/ofw_consinit.c       Fri Mar 05 18:08:21 2021 +0000
+++ b/sys/arch/powerpc/oea/ofw_consinit.c       Fri Mar 05 18:10:06 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ofw_consinit.c,v 1.23 2021/02/19 18:05:42 thorpej Exp $ */
+/* $NetBSD: ofw_consinit.c,v 1.24 2021/03/05 18:10:06 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofw_consinit.c,v 1.23 2021/02/19 18:05:42 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofw_consinit.c,v 1.24 2021/03/05 18:10:06 thorpej Exp $");
 
 #include "adb.h"
 #include "adbkbd.h"
@@ -91,9 +91,9 @@
 
 extern int console_node, console_instance;
 
-int ofkbd_ihandle;
+int ofkbd_ihandle = -1;
 
-static void cninit_kd(void);
+static void ofwoea_cnprobe_keyboard(void);
 
 /*#define OFDEBUG*/
 
@@ -117,39 +117,51 @@
 #define OFPRINTF while(0) printf
 #endif
 
+static bool use_serial_console;
+static struct consdev *selected_serial_consdev;
+
+static int (*selected_keyboard)(void);
+
+/* XXX Gross. */
+#if NPCKBC > 0
+static int
+ofwoea_pckbd_cnattach(void)
+{
+       return pckbc_cnattach(&genppc_isa_io_space_tag, IO_KBD, KBCMDP,
+           PCKBC_KBD_SLOT, 0);
+}
+#endif
+
 void
-cninit(void)
+ofwoea_cnprobe(void)
 {
        char name[32];
 
        OFPRINTF("console node: %08x\n", console_node);
 
        if (console_node == -1)
-               goto nocons;
+               return;
 
        memset(name, 0, sizeof(name));
        if (OF_getprop(console_node, "device_type", name, sizeof(name)) == -1)
-               goto nocons;
+               return;
 
        OFPRINTF("console type: %s\n", name);
 
        if (strcmp(name, "serial") == 0) {
+               use_serial_console = true;
 #ifdef PMAC_G5
                /* The MMU hasn't been initialized yet, use failsafe for now */
                extern struct consdev failsafe_cons;
-               cn_tab = &failsafe_cons;
-               (*cn_tab->cn_probe)(cn_tab);
-               (*cn_tab->cn_init)(cn_tab);
-               aprint_verbose("Early G5 console initialized\n");
+               selected_serial_consdev = &failsafe_cons;
+               aprint_verbose("Early G5 console selected\n");
                return;
 #endif /* PMAC_G5 */
 
 #if (NZSTTY > 0) && !defined(MAMBO)
                OF_getprop(console_node, "name", name, sizeof(name));
                if (strcmp(name, "ch-a") == 0 || strcmp(name, "ch-b") == 0) {
-                       cn_tab = &consdev_zs;
-                       (*cn_tab->cn_probe)(cn_tab);
-                       (*cn_tab->cn_init)(cn_tab);
+                       selected_serial_consdev = &consdev_zs;
                }
                return;
 #endif /* NZTTY */
@@ -157,17 +169,24 @@
                /* fallback to OFW boot console (already set) */
                return;
        }
-       else
-               cninit_kd();
-nocons:
-       return;
+
+       /*
+        * We're going to use a display console.  Probe for the keyboard
+        * we'll use.
+        */
+       ofwoea_cnprobe_keyboard();
 }
 
-
+/*
+ * XXX This routine is a complete disaster, filled with platform-specific
+ * XXX stuff.  Fix, plz.
+ */
 static void
-cninit_kd(void)
+ofwoea_cnprobe_keyboard(void)
 {
-       int kstdin, node;
+       extern int ofw_stdin;
+
+       int node, kstdin = ofw_stdin;
        char name[16];
 #if (NAKBD > 0) || (NADBKBD > 0)
        int akbd;
@@ -178,22 +197,8 @@
 #endif
 
        /*
-        * Attach the console output now (so we can see debugging messages,
-        * if any).
-        */
-#if NWSDISPLAY > 0
-       rascons_cnattach();
-#endif
-
-       /*
         * We must determine which keyboard type we have.
         */
-       if (OF_getprop(ofw_chosen, "stdin", &kstdin, sizeof(kstdin))
-           != sizeof(kstdin)) {
-               printf("WARNING: no `stdin' property in /chosen\n");
-               return;
-       }
-
        node = OF_instance_to_package(kstdin);
        memset(name, 0, sizeof(name));
        OF_getprop(node, "name", name, sizeof(name));
@@ -207,22 +212,21 @@
 #if NAKBD > 0
        if (strcmp(name, "adb") == 0) {
                printf("console keyboard type: ADB\n");
-               akbd_cnattach();
+               selected_keyboard = akbd_cnattach;
                goto kbd_found;
        }
 #endif
 #if NADBKBD > 0
        if (strcmp(name, "adb") == 0) {
                printf("console keyboard type: ADB\n");
-               adbkbd_cnattach();
+               selected_keyboard = adbkbd_cnattach;
                goto kbd_found;
        }
 #endif
 #if NPCKBC > 0
        if (strcmp(name, "isa") == 0) {
                printf("console keyboard type: PC Keyboard\n");
-               pckbc_cnattach(&genppc_isa_io_space_tag, IO_KBD, KBCMDP,
-                   PCKBC_KBD_SLOT, 0);
+               selected_keyboard = ofwoea_pckbd_cnattach;
                goto kbd_found;
        }
 #endif
@@ -281,17 +285,17 @@
                if (adb_node > 0) {
                        printf("ADB support found\n");
 #if NAKBD > 0
-                       akbd_cnattach();
+                       selected_keyboard = akbd_cnattach;
 #endif
 #if NADBKBD > 0
-                       adbkbd_cnattach();
+                       selected_keyboard = adbkbd_cnattach;
 #endif
                } else {
                        /* must be USB */
                        printf("No ADB support present, assuming USB "
                               "keyboard\n");
 #if NUKBD > 0
-                       ukbd_cnattach();
+                       selected_keyboard = ukbd_cnattach;
 #endif
                }
                goto kbd_found;
@@ -310,7 +314,7 @@
            OF_instance_to_package(ukbds->ihandle) != -1) {
                printf("usb-kbd-ihandles matches\n");
                printf("console keyboard type: USB\n");
-               ukbd_cnattach();
+               selected_keyboard = ukbd_cnattach;
                goto kbd_found;
        }
        /* Try old method name. */
@@ -320,7 +324,7 @@
                printf("usb-kbd-ihandle matches\n");
                printf("console keyboard type: USB\n");
                kstdin = ukbd;
-               ukbd_cnattach();
+               selected_keyboard = ukbd_cnattach;
                goto kbd_found;
        }
 #endif
@@ -333,10 +337,10 @@
                printf("console keyboard type: ADB\n");
                kstdin = akbd;
 #if NAKBD > 0
-               akbd_cnattach();
+               selected_keyboard = akbd_cnattach;
 #endif
 #if NADBKBD > 0
-               adbkbd_cnattach();
+               selected_keyboard = adbkbd_cnattach;
 #endif
                goto kbd_found;
        }
@@ -349,7 +353,7 @@
         */
        printf("defaulting to USB...");
        printf("console keyboard type: USB\n");
-       ukbd_cnattach();
+       selected_keyboard = ukbd_cnattach;
        goto kbd_found;
 #endif
 
@@ -359,17 +363,8 @@
        printf("no console keyboard\n");
        return;
 
-kbd_found:;
-#if NAKBD + NUKBD + NADBKBD + NPCKBC > 0
-       /*
-        * XXX This is a little gross, but we don't get to call
-        * XXX wskbd_cnattach() twice.
-        */
+kbd_found:
        ofkbd_ihandle = kstdin;
-#if NWSDISPLAY > 0
-       wsdisplay_set_cons_kbd(ofkbd_cngetc, NULL, NULL);
-#endif
-#endif
 }
 
 /*
@@ -381,6 +376,8 @@
        u_char c = '\0';
        int len;
 
+       KASSERT(ofkbd_ihandle != -1);
+
        do {
                len = OF_read(ofkbd_ihandle, &c, 1);
        } while (len != 1);
@@ -389,6 +386,34 @@
 }
 
 void
+cninit(void)
+{
+       if (use_serial_console) {
+               if (selected_serial_consdev != NULL) {
+                       cn_tab = selected_serial_consdev;
+                       (*cn_tab->cn_probe)(cn_tab);
+                       (*cn_tab->cn_init)(cn_tab);
+               }
+               return;
+       }
+
+#if NWSDISPLAY > 0
+       rascons_cnattach();
+#endif
+       if (selected_keyboard != NULL) {
+               (*selected_keyboard)();
+



Home | Main Index | Thread Index | Old Index