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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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);