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);