Module Name:    src
Committed By:   jmcneill
Date:           Mon May 29 23:13:03 UTC 2017

Modified Files:
        src/sys/arch/arm/fdt: armv7_fdt.c armv7_fdtvar.h
        src/sys/arch/arm/nvidia: tegra_com.c tegra_platform.c
        src/sys/arch/evbarm/tegra: tegra_machdep.c
        src/sys/dev/fdt: fdt_subr.c fdtvar.h

Log Message:
Move console initialization out of platform code into the console drivers
themselves.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/fdt/armv7_fdt.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/fdt/armv7_fdtvar.h
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/nvidia/tegra_com.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/nvidia/tegra_platform.c
cvs rdiff -u -r1.46 -r1.47 src/sys/arch/evbarm/tegra/tegra_machdep.c
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/fdt/fdt_subr.c
cvs rdiff -u -r1.18 -r1.19 src/sys/dev/fdt/fdtvar.h

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/arm/fdt/armv7_fdt.c
diff -u src/sys/arch/arm/fdt/armv7_fdt.c:1.2 src/sys/arch/arm/fdt/armv7_fdt.c:1.3
--- src/sys/arch/arm/fdt/armv7_fdt.c:1.2	Sun May 28 23:39:30 2017
+++ src/sys/arch/arm/fdt/armv7_fdt.c	Mon May 29 23:13:03 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: armv7_fdt.c,v 1.2 2017/05/28 23:39:30 jmcneill Exp $ */
+/* $NetBSD: armv7_fdt.c,v 1.3 2017/05/29 23:13:03 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: armv7_fdt.c,v 1.2 2017/05/28 23:39:30 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: armv7_fdt.c,v 1.3 2017/05/29 23:13:03 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -47,8 +47,6 @@ static void	armv7_fdt_attach(device_t, d
 CFATTACH_DECL_NEW(armv7_fdt, 0,
     armv7_fdt_match, armv7_fdt_attach, NULL, NULL);
 
-static bool armv7_fdt_found = false;
-
 extern struct bus_space armv7_generic_bs_tag;
 extern struct bus_space armv7_generic_a4x_bs_tag;
 extern struct arm32_bus_dma_tag armv7_generic_dma_tag;
@@ -59,26 +57,22 @@ static struct armv7_platlist armv7_platf
 int
 armv7_fdt_match(device_t parent, cfdata_t cf, void *aux)
 {
-	if (armv7_fdt_found)
-		return 0;
 	return 1;
 }
 
 void
 armv7_fdt_attach(device_t parent, device_t self, void *aux)
 {
-	armv7_fdt_found = true;
+	const struct armv7_platform *plat = armv7_fdt_platform();
+	struct fdt_attach_args faa;
 
 	aprint_naive("\n");
 	aprint_normal("\n");
 
-	struct fdt_attach_args faa = {
-		.faa_name = "",
-		.faa_bst = &armv7_generic_bs_tag,
-		.faa_a4x_bst = &armv7_generic_a4x_bs_tag,
-		.faa_dmat = &armv7_generic_dma_tag,
-		.faa_phandle = OF_peer(0),
-	};
+	plat->init_attach_args(&faa);
+	faa.faa_name = "";
+	faa.faa_phandle = OF_peer(0);
+
 	config_found(self, &faa, NULL);
 }
 

Index: src/sys/arch/arm/fdt/armv7_fdtvar.h
diff -u src/sys/arch/arm/fdt/armv7_fdtvar.h:1.1 src/sys/arch/arm/fdt/armv7_fdtvar.h:1.2
--- src/sys/arch/arm/fdt/armv7_fdtvar.h:1.1	Sun May 28 23:39:30 2017
+++ src/sys/arch/arm/fdt/armv7_fdtvar.h	Mon May 29 23:13:03 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: armv7_fdtvar.h,v 1.1 2017/05/28 23:39:30 jmcneill Exp $ */
+/* $NetBSD: armv7_fdtvar.h,v 1.2 2017/05/29 23:13:03 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared D. McNeill <jmcne...@invisible.ca>
@@ -29,13 +29,19 @@
 #ifndef _ARM_ARMV7_FDTVAR_H
 #define _ARM_ARMV7_FDTVAR_H
 
+/*
+ * Platform-specific data
+ */
+
+struct fdt_attach_args;
+
 struct armv7_platform {
-	const struct pmap_devmap *	(*devmap)(void);
-	void				(*bootstrap)(void);
-	void				(*early_putchar)(char);
-	void				(*device_register)(device_t, void *);
-	void				(*reset)(void);
-	void				(*consinit)(void);
+	const struct pmap_devmap * (*devmap)(void);
+	void			(*bootstrap)(void);
+	void			(*init_attach_args)(struct fdt_attach_args *);
+	void			(*early_putchar)(char);
+	void			(*device_register)(device_t, void *);
+	void			(*reset)(void);
 };
 
 struct armv7_platform_info {

Index: src/sys/arch/arm/nvidia/tegra_com.c
diff -u src/sys/arch/arm/nvidia/tegra_com.c:1.6 src/sys/arch/arm/nvidia/tegra_com.c:1.7
--- src/sys/arch/arm/nvidia/tegra_com.c:1.6	Thu May 25 23:42:44 2017
+++ src/sys/arch/arm/nvidia/tegra_com.c	Mon May 29 23:13:03 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_com.c,v 1.6 2017/05/25 23:42:44 jmcneill Exp $ */
+/* $NetBSD: tegra_com.c,v 1.7 2017/05/29 23:13:03 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: tegra_com.c,v 1.6 2017/05/25 23:42:44 jmcneill Exp $");
+__KERNEL_RCSID(1, "$NetBSD: tegra_com.c,v 1.7 2017/05/29 23:13:03 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -48,9 +48,18 @@ __KERNEL_RCSID(1, "$NetBSD: tegra_com.c,
 
 #include <dev/fdt/fdtvar.h>
 
+#define	PLLP_OUT0_FREQ	408000000
+
 static int tegra_com_match(device_t, cfdata_t, void *);
 static void tegra_com_attach(device_t, device_t, void *);
 
+static const char * const compatible[] = {
+	"nvidia,tegra210-uart",
+	"nvidia,tegra124-uart",
+	"nvidia,tegra20-uart",
+	NULL
+};
+
 struct tegra_com_softc {
 	struct com_softc tsc_sc;
 	void *tsc_ih;
@@ -65,12 +74,6 @@ CFATTACH_DECL_NEW(tegra_com, sizeof(stru
 static int
 tegra_com_match(device_t parent, cfdata_t cf, void *aux)
 {
-	const char * const compatible[] = {
-		"nvidia,tegra210-uart",
-		"nvidia,tegra124-uart",
-		"nvidia,tegra20-uart",
-		NULL
-	};
 	struct fdt_attach_args * const faa = aux;
 
 	return of_match_compatible(faa->faa_phandle, compatible);
@@ -147,3 +150,40 @@ tegra_com_attach(device_t parent, device
 	}
 	aprint_normal_dev(self, "interrupting on %s\n", intrstr);
 }
+
+/*
+ * Console support
+ */
+
+static int
+tegra_com_console_match(int phandle)
+{
+	return of_match_compatible(phandle, compatible);
+}
+
+static void
+tegra_com_console_consinit(struct fdt_attach_args *faa)
+{
+	const u_int freq = PLLP_OUT0_FREQ;
+	const int phandle = faa->faa_phandle;
+	bus_space_tag_t bst = faa->faa_a4x_bst;
+	bus_addr_t addr;
+	tcflag_t flags;
+	int speed;
+
+	fdtbus_get_reg(phandle, 0, &addr, NULL);
+	speed = fdtbus_get_stdout_speed();
+	if (speed < 0)
+		speed = 115200;	/* default */
+	flags = fdtbus_get_stdout_flags();
+
+	if (comcnattach(bst, addr, speed, freq, COM_TYPE_TEGRA, flags))
+		panic("Cannot initialize tegra com console");
+}
+
+static const struct fdt_console tegra_com_console = {
+	.match = tegra_com_console_match,
+	.consinit = tegra_com_console_consinit,
+};
+
+FDT_CONSOLE(tegra_com, &tegra_com_console);

Index: src/sys/arch/arm/nvidia/tegra_platform.c
diff -u src/sys/arch/arm/nvidia/tegra_platform.c:1.1 src/sys/arch/arm/nvidia/tegra_platform.c:1.2
--- src/sys/arch/arm/nvidia/tegra_platform.c:1.1	Sun May 28 23:39:30 2017
+++ src/sys/arch/arm/nvidia/tegra_platform.c	Mon May 29 23:13:03 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_platform.c,v 1.1 2017/05/28 23:39:30 jmcneill Exp $ */
+/* $NetBSD: tegra_platform.c,v 1.2 2017/05/29 23:13:03 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared D. McNeill <jmcne...@invisible.ca>
@@ -33,7 +33,7 @@
 #include "ukbd.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_platform.c,v 1.1 2017/05/28 23:39:30 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_platform.c,v 1.2 2017/05/29 23:13:03 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -57,15 +57,6 @@ __KERNEL_RCSID(0, "$NetBSD: tegra_platfo
 #include <dev/usb/ukbdvar.h>
 #endif
 
-#if NCOM > 0
-#include <dev/ic/ns16550reg.h>
-#include <dev/ic/comreg.h>
-#include <dev/ic/comvar.h>
-#ifndef CONMODE
-#define CONMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
-#endif
-#endif
-
 #define	DEVMAP_ALIGN(a)	((a) & ~L1_S_OFFSET)
 #define	DEVMAP_SIZE(s)	roundup2((s), L1_S_SIZE)
 #define	DEVMAP_ENTRY(va, pa, sz)			\
@@ -107,6 +98,18 @@ tegra_platform_bootstrap(void)
 }
 
 static void
+tegra_platform_init_attach_args(struct fdt_attach_args *faa)
+{
+	extern struct bus_space armv7_generic_bs_tag;
+	extern struct bus_space armv7_generic_a4x_bs_tag;
+	extern struct arm32_bus_dma_tag armv7_generic_dma_tag;
+
+	faa->faa_bst = &armv7_generic_bs_tag;
+	faa->faa_a4x_bst = &armv7_generic_a4x_bs_tag;
+	faa->faa_dmat = &armv7_generic_dma_tag;
+}
+
+static void
 tegra_platform_early_putchar(char c)
 {
 #ifdef CONSADDR
@@ -176,47 +179,13 @@ tegra_platform_reset(void)
 	tegra_pmc_reset();
 }
 
-static void
-tegra_platform_consinit(void)
-{
-	static bool consinit_called = false;
-
-	if (consinit_called)
-		return;
-	consinit_called = true;
-
-#if NCOM > 0
-	bus_addr_t addr;
-	int speed;
-
-#ifdef CONSADDR
-	addr = CONSADDR;
-#else
-	fdtbus_get_reg(fdtbus_get_stdout_phandle(), 0, &addr, NULL);
-#endif
-
-#ifdef CONSPEED
-	speed = CONSPEED;
-#else
-	speed = fdtbus_get_stdout_speed();
-	if (speed < 0)
-		speed = 115200;	/* default */
-#endif
-
-	const bus_space_tag_t bst = &armv7_generic_a4x_bs_tag;
-	const u_int freq = 408000000;	/* 408MHz PLLP_OUT0 */
-	if (comcnattach(bst, addr, speed, freq, COM_TYPE_TEGRA, CONMODE))
-		panic("Serial console cannot be initialized.");
-#endif
-}
-
 static const struct armv7_platform tegra_platform = {
 	.devmap = tegra_platform_devmap,
 	.bootstrap = tegra_platform_bootstrap,
+	.init_attach_args = tegra_platform_init_attach_args,
 	.early_putchar = tegra_platform_early_putchar,
 	.device_register = tegra_platform_device_register,
 	.reset = tegra_platform_reset,
-	.consinit = tegra_platform_consinit,
 };
 
 ARMV7_PLATFORM(tegra124, "nvidia,tegra124", &tegra_platform);

Index: src/sys/arch/evbarm/tegra/tegra_machdep.c
diff -u src/sys/arch/evbarm/tegra/tegra_machdep.c:1.46 src/sys/arch/evbarm/tegra/tegra_machdep.c:1.47
--- src/sys/arch/evbarm/tegra/tegra_machdep.c:1.46	Sun May 28 23:39:30 2017
+++ src/sys/arch/evbarm/tegra/tegra_machdep.c	Mon May 29 23:13:03 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_machdep.c,v 1.46 2017/05/28 23:39:30 jmcneill Exp $ */
+/* $NetBSD: tegra_machdep.c,v 1.47 2017/05/29 23:13:03 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_machdep.c,v 1.46 2017/05/28 23:39:30 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_machdep.c,v 1.47 2017/05/29 23:13:03 jmcneill Exp $");
 
 #include "opt_tegra.h"
 #include "opt_machdep.h"
@@ -294,10 +294,20 @@ initarm(void *arg)
 void
 consinit(void)
 {
+	static bool initialized = false;
 	const struct armv7_platform *plat = armv7_fdt_platform();
+	const struct fdt_console *cons = fdtbus_get_console();
+	struct fdt_attach_args faa;
 
-	if (plat && plat->consinit)
-		plat->consinit();
+	if (initialized || cons == NULL)
+		return;
+
+	plat->init_attach_args(&faa);
+	faa.faa_phandle = fdtbus_get_stdout_phandle();
+
+	cons->consinit(&faa);
+
+	initialized = true;
 }
 
 void

Index: src/sys/dev/fdt/fdt_subr.c
diff -u src/sys/dev/fdt/fdt_subr.c:1.11 src/sys/dev/fdt/fdt_subr.c:1.12
--- src/sys/dev/fdt/fdt_subr.c:1.11	Fri May 26 18:56:27 2017
+++ src/sys/dev/fdt/fdt_subr.c	Mon May 29 23:13:03 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: fdt_subr.c,v 1.11 2017/05/26 18:56:27 jmcneill Exp $ */
+/* $NetBSD: fdt_subr.c,v 1.12 2017/05/29 23:13:03 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdt_subr.c,v 1.11 2017/05/26 18:56:27 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdt_subr.c,v 1.12 2017/05/29 23:13:03 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -38,6 +38,9 @@ __KERNEL_RCSID(0, "$NetBSD: fdt_subr.c,v
 
 static const void *fdt_data;
 
+static struct fdt_conslist fdt_console_list =
+    TAILQ_HEAD_INITIALIZER(fdt_console_list);
+
 bool
 fdtbus_set_data(const void *data)
 {
@@ -237,6 +240,32 @@ fdtbus_get_reg64(int phandle, u_int inde
 	return 0;
 }
 
+const struct fdt_console *
+fdtbus_get_console(void)
+{
+	static const struct fdt_console_info *booted_console = NULL;
+
+	if (booted_console == NULL) {
+		__link_set_decl(fdt_consoles, struct fdt_console_info);
+		struct fdt_console_info * const *info;
+		const struct fdt_console_info *best_info = NULL;
+		const int phandle = fdtbus_get_stdout_phandle();
+		int best_match = 0;
+
+		__link_set_foreach(info, fdt_consoles) {
+			const int match = (*info)->ops->match(phandle);
+			if (match > best_match) {
+				best_match = match;
+				best_info = *info;
+			}
+		}
+
+		booted_console = best_info;
+	}
+
+	return booted_console == NULL ? NULL : booted_console->ops;
+}
+
 const char *
 fdtbus_get_stdout_path(void)
 {
@@ -296,6 +325,47 @@ fdtbus_get_stdout_speed(void)
 	return (int)strtoul(p + 1, NULL, 10);
 }
 
+tcflag_t
+fdtbus_get_stdout_flags(void)
+{
+	const char *prop, *p;
+	tcflag_t flags = TTYDEF_CFLAG;
+	char *ep;
+
+	prop = fdtbus_get_stdout_path();
+	if (prop == NULL)
+		return flags;
+
+	p = strchr(prop, ':');
+	if (p == NULL)
+		return flags;
+
+	ep = NULL;
+	(void)strtoul(p + 1, &ep, 10);
+	if (ep == NULL)
+		return flags;
+
+	/* <baud>{<parity>{<bits>{<flow>}}} */
+	while (*ep) {
+		switch (*ep) {
+		/* parity */
+		case 'n':	flags &= ~(PARENB|PARODD); break;
+		case 'e':	flags &= ~PARODD; flags |= PARENB; break;
+		case 'o':	flags |= (PARENB|PARODD); break;
+		/* bits */
+		case '5':	flags &= ~CSIZE; flags |= CS5; break;
+		case '6':	flags &= ~CSIZE; flags |= CS6; break;
+		case '7':	flags &= ~CSIZE; flags |= CS7; break;
+		case '8':	flags &= ~CSIZE; flags |= CS8; break;
+		/* flow */
+		case 'r':	flags |= CRTSCTS; break;
+		}
+		ep++;
+	}
+
+	return flags;
+}
+
 bool
 fdtbus_status_okay(int phandle)
 {

Index: src/sys/dev/fdt/fdtvar.h
diff -u src/sys/dev/fdt/fdtvar.h:1.18 src/sys/dev/fdt/fdtvar.h:1.19
--- src/sys/dev/fdt/fdtvar.h:1.18	Sun May 28 15:55:11 2017
+++ src/sys/dev/fdt/fdtvar.h	Mon May 29 23:13:03 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: fdtvar.h,v 1.18 2017/05/28 15:55:11 jmcneill Exp $ */
+/* $NetBSD: fdtvar.h,v 1.19 2017/05/29 23:13:03 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -31,6 +31,7 @@
 
 #include <sys/types.h>
 #include <sys/bus.h>
+#include <sys/termios.h>
 
 #include <dev/i2c/i2cvar.h>
 #include <dev/clk/clk.h>
@@ -171,6 +172,26 @@ struct fdtbus_power_controller_func {
 	void	(*poweroff)(device_t);
 };
 
+struct fdt_console {
+	int	(*match)(int);
+	void	(*consinit)(struct fdt_attach_args *);
+};
+
+struct fdt_console_info {
+	const struct fdt_console *ops;
+};
+
+#define	_FDT_CONSOLE_REGISTER(name)	\
+	__link_set_add_rodata(fdt_consoles, __CONCAT(name,_consinfo));
+
+#define	FDT_CONSOLE(_name, _ops)					\
+static const struct fdt_console_info __CONCAT(_name,_consinfo) = {	\
+	.ops = (_ops)							\
+};									\
+_FDT_CONSOLE_REGISTER(_name)
+
+TAILQ_HEAD(fdt_conslist, fdt_console_info);
+
 int		fdtbus_register_interrupt_controller(device_t, int,
 		    const struct fdtbus_interrupt_controller_func *);
 int		fdtbus_register_i2c_controller(device_t, int,
@@ -244,9 +265,12 @@ int		fdtbus_phandle2offset(int);
 int		fdtbus_offset2phandle(int);
 bool		fdtbus_get_path(int, char *, size_t);
 
+const struct fdt_console *fdtbus_get_console(void);
+
 const char *	fdtbus_get_stdout_path(void);
 int		fdtbus_get_stdout_phandle(void);
 int		fdtbus_get_stdout_speed(void);
+tcflag_t	fdtbus_get_stdout_flags(void);
 
 bool		fdtbus_status_okay(int);
 

Reply via email to