Module Name:    src
Committed By:   martin
Date:           Sun Feb 13 12:24:25 UTC 2022

Modified Files:
        src/sys/arch/macppc/dev: zs.c
        src/sys/arch/powerpc/include: ofw_cons.h
        src/sys/arch/powerpc/oea: ofw_consinit.c

Log Message:
PR port-macppc/56091: on G5 macs we currently can not easily make
early serial console work, so keep the OF based "failsafe" console
but note that we would like to switch over.
Once zs attaches, use the new device mapping and do a belated init
of the zs console globals, and then switch over to real zs based
serial console.


To generate a diff of this commit:
cvs rdiff -u -r1.54 -r1.55 src/sys/arch/macppc/dev/zs.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/powerpc/include/ofw_cons.h
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/powerpc/oea/ofw_consinit.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/macppc/dev/zs.c
diff -u src/sys/arch/macppc/dev/zs.c:1.54 src/sys/arch/macppc/dev/zs.c:1.55
--- src/sys/arch/macppc/dev/zs.c:1.54	Sat Sep 11 20:28:04 2021
+++ src/sys/arch/macppc/dev/zs.c	Sun Feb 13 12:24:24 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: zs.c,v 1.54 2021/09/11 20:28:04 andvar Exp $	*/
+/*	$NetBSD: zs.c,v 1.55 2022/02/13 12:24:24 martin Exp $	*/
 
 /*
  * Copyright (c) 1996, 1998 Bill Studenmund
@@ -49,7 +49,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zs.c,v 1.54 2021/09/11 20:28:04 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zs.c,v 1.55 2022/02/13 12:24:24 martin Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -73,6 +73,7 @@ __KERNEL_RCSID(0, "$NetBSD: zs.c,v 1.54 
 
 #include <dev/cons.h>
 #include <dev/ofw/openfirm.h>
+#include <powerpc/ofw_cons.h>
 #include <dev/ic/z8530reg.h>
 
 #include <machine/z8530var.h>
@@ -115,11 +116,28 @@ int	zs_cons_canabort = 1;
 #else
 int	zs_cons_canabort = 0;
 #endif /* ZS_CONSOLE_ABORT*/
+#if PMAC_G5
+static void zscn_delayed_init(struct zsdevice *zsd);
+#endif
 
 /* device to which the console is attached--if serial. */
 /* Mac stuff */
 
 static int zs_get_speed(struct zs_chanstate *);
+void zscnprobe(struct consdev *cp);
+void zscninit(struct consdev *cp);
+int zscngetc(dev_t dev);
+void zscnputc(dev_t dev, int c);
+#define zscnpollc	nullcnpollc
+cons_decl(zs);
+
+struct consdev consdev_zs = {
+	zscnprobe,
+	zscninit,
+	zscngetc,
+	zscnputc,
+	zscnpollc,
+};
 
 /*
  * Even though zsparam will set up the clock multiples, etc., we
@@ -251,6 +269,12 @@ zsc_attach(device_t parent, device_t sel
 
 	aprint_normal(" irq %d,%d\n", intr[0][0], intr[1][0]);
 
+#if PMAC_G5
+	extern struct consdev failsafe_cons;
+	if (ofwoea_use_serial_console && cn_tab == &failsafe_cons)
+		zscn_delayed_init(zsd);
+#endif
+
 	/*
 	 * Initialize software state for each channel.
 	 */
@@ -827,9 +851,6 @@ zs_write_data(struct zs_chanstate *cs, u
  * XXX - Well :-P  :-)  -wrs
  ****************************************************************/
 
-#define zscnpollc	nullcnpollc
-cons_decl(zs);
-
 static int stdin, stdout;
 
 /*
@@ -968,17 +989,6 @@ zs_abort(struct zs_chanstate *cs)
 #endif
 }
 
-extern int ofccngetc(dev_t);
-extern void ofccnputc(dev_t, int);
-
-struct consdev consdev_zs = {
-	zscnprobe,
-	zscninit,
-	zscngetc,
-	zscnputc,
-	zscnpollc,
-};
-
 void
 zscnprobe(struct consdev *cp)
 {
@@ -1037,3 +1047,40 @@ zscninit(struct consdev *cp)
 		return;
 	zs_conschan = (void *)(reg[2] + zs_offset);
 }
+
+#if PMAC_G5
+/*
+ * Do a delayed (now that the device is properly mapped) init of the
+ * global zs console state, basically the equivalent of calling
+ *	zscnprobe(&consdev_zs); zscninit(&consdev_zs);
+ * but with the mapped address of the device passed in as zsd.
+ */
+static void
+zscn_delayed_init(struct zsdevice *zsd)
+{
+	int chosen, escc_ch;
+	char name[16];
+
+	if ((chosen = OF_finddevice("/chosen")) == -1)
+		return;
+
+	if (OF_getprop(chosen, "stdin", &stdin, sizeof(stdin)) == -1)
+		return;
+
+	if (OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)) == -1)
+		return;
+
+	if ((escc_ch = OF_instance_to_package(stdin)) == -1)
+		return;
+
+	memset(name, 0, sizeof(name));
+	if (OF_getprop(escc_ch, "name", name, sizeof(name)) == -1)
+		return;
+
+	zs_conschannel = strcmp(name, "ch-b") == 0;
+	zs_conschan = (zs_conschannel == 0) ?
+	    &zsd->zs_chan_a :
+	    &zsd->zs_chan_b;
+	cn_tab = &consdev_zs;
+}
+#endif

Index: src/sys/arch/powerpc/include/ofw_cons.h
diff -u src/sys/arch/powerpc/include/ofw_cons.h:1.3 src/sys/arch/powerpc/include/ofw_cons.h:1.4
--- src/sys/arch/powerpc/include/ofw_cons.h:1.3	Fri Mar  5 18:10:06 2021
+++ src/sys/arch/powerpc/include/ofw_cons.h	Sun Feb 13 12:24:24 2022
@@ -1,8 +1,9 @@
-/* $NetBSD: ofw_cons.h,v 1.3 2021/03/05 18:10:06 thorpej Exp $ */
+/* $NetBSD: ofw_cons.h,v 1.4 2022/02/13 12:24:24 martin Exp $ */
 
 #ifndef _POWERPC_OFW_CONS_H_
 #define _POWERPC_OFW_CONS_H_
 
+extern bool ofwoea_use_serial_console;
 void	ofwoea_cnprobe(void);
 void	ofwoea_consinit(void);
 int	ofkbd_cngetc(dev_t dev);

Index: src/sys/arch/powerpc/oea/ofw_consinit.c
diff -u src/sys/arch/powerpc/oea/ofw_consinit.c:1.24 src/sys/arch/powerpc/oea/ofw_consinit.c:1.25
--- src/sys/arch/powerpc/oea/ofw_consinit.c:1.24	Fri Mar  5 18:10:06 2021
+++ src/sys/arch/powerpc/oea/ofw_consinit.c	Sun Feb 13 12:24:24 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: ofw_consinit.c,v 1.24 2021/03/05 18:10:06 thorpej Exp $ */
+/* $NetBSD: ofw_consinit.c,v 1.25 2022/02/13 12:24:24 martin 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.24 2021/03/05 18:10:06 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofw_consinit.c,v 1.25 2022/02/13 12:24:24 martin Exp $");
 
 #include "adb.h"
 #include "adbkbd.h"
@@ -117,7 +117,7 @@ void ofprint(const char *blah, ...)
 #define OFPRINTF while(0) printf
 #endif
 
-static bool use_serial_console;
+bool ofwoea_use_serial_console;
 static struct consdev *selected_serial_consdev;
 
 static int (*selected_keyboard)(void);
@@ -149,12 +149,13 @@ ofwoea_cnprobe(void)
 	OFPRINTF("console type: %s\n", name);
 
 	if (strcmp(name, "serial") == 0) {
-		use_serial_console = true;
+		ofwoea_use_serial_console = true;
 #ifdef PMAC_G5
 		/* The MMU hasn't been initialized yet, use failsafe for now */
 		extern struct consdev failsafe_cons;
 		selected_serial_consdev = &failsafe_cons;
-		aprint_verbose("Early G5 console selected\n");
+		aprint_verbose("Early G5 console selected "
+		    "(keeping OF console for now)\n");
 		return;
 #endif /* PMAC_G5 */
 
@@ -388,7 +389,7 @@ ofkbd_cngetc(dev_t dev)
 void
 cninit(void)
 {
-	if (use_serial_console) {
+	if (ofwoea_use_serial_console) {
 		if (selected_serial_consdev != NULL) {
 			cn_tab = selected_serial_consdev;
 			(*cn_tab->cn_probe)(cn_tab);

Reply via email to