Source-Changes-HG archive

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

[src/trunk]: src/sys/arch Add a facility for platform-specific callbacks and ...



details:   https://anonhg.NetBSD.org/src/rev/2de53961889e
branches:  trunk
changeset: 824237:2de53961889e
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Sun May 28 23:39:30 2017 +0000

description:
Add a facility for platform-specific callbacks and use it to remove most
of the Tegra-specific code from tegra_machdep.c.

Platform code matches on the compatible property of the root ("/") DT node
and allows for chip-specific implementations of the following:

 - devmap: Return a 0-terminated list of static device map entries.
 - bootstrap: Early initialization of platform-specific facilities.
 - early_putchar: Provides an implementation of putchar for use in early
     debug messages.
 - device_register: Platform-specific device register callback.
 - reset: Platform-specific CPU reset implementation.
 - consinit: Platform-specific console init implementation.

diffstat:

 sys/arch/arm/fdt/armv7_fdt.c          |   36 ++++-
 sys/arch/arm/fdt/armv7_fdtvar.h       |   60 +++++++
 sys/arch/arm/nvidia/files.tegra       |    3 +-
 sys/arch/arm/nvidia/tegra_platform.c  |  223 ++++++++++++++++++++++++++++
 sys/arch/evbarm/tegra/platform.h      |    4 +-
 sys/arch/evbarm/tegra/tegra_machdep.c |  264 +++++----------------------------
 6 files changed, 361 insertions(+), 229 deletions(-)

diffs (truncated from 787 to 300 lines):

diff -r 0abad0825f31 -r 2de53961889e sys/arch/arm/fdt/armv7_fdt.c
--- a/sys/arch/arm/fdt/armv7_fdt.c      Sun May 28 23:32:14 2017 +0000
+++ b/sys/arch/arm/fdt/armv7_fdt.c      Sun May 28 23:39:30 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: armv7_fdt.c,v 1.1 2017/05/28 00:40:20 jmcneill Exp $ */
+/* $NetBSD: armv7_fdt.c,v 1.2 2017/05/28 23:39:30 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: armv7_fdt.c,v 1.1 2017/05/28 00:40:20 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: armv7_fdt.c,v 1.2 2017/05/28 23:39:30 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -39,6 +39,8 @@
 #include <dev/fdt/fdtvar.h>
 #include <dev/ofw/openfirm.h>
 
+#include <arm/fdt/armv7_fdtvar.h>
+
 static int     armv7_fdt_match(device_t, cfdata_t, void *);
 static void    armv7_fdt_attach(device_t, device_t, void *);
 
@@ -51,6 +53,9 @@
 extern struct bus_space armv7_generic_a4x_bs_tag;
 extern struct arm32_bus_dma_tag armv7_generic_dma_tag;
 
+static struct armv7_platlist armv7_platform_list =
+    TAILQ_HEAD_INITIALIZER(armv7_platform_list);
+
 int
 armv7_fdt_match(device_t parent, cfdata_t cf, void *aux)
 {
@@ -76,3 +81,30 @@
        };
        config_found(self, &faa, NULL);
 }
+
+const struct armv7_platform *
+armv7_fdt_platform(void)
+{
+       static const struct armv7_platform_info *booted_platform = NULL;
+
+       if (booted_platform == NULL) {
+               __link_set_decl(armv7_platforms, struct armv7_platform_info);
+               struct armv7_platform_info * const *info;
+               const struct armv7_platform_info *best_info = NULL;
+               const int phandle = OF_peer(0);
+               int match, best_match = 0;
+
+               __link_set_foreach(info, armv7_platforms) {
+                       const char * const compat[] = { (*info)->compat, NULL };
+                       match = of_match_compatible(phandle, compat);
+                       if (match > best_match) {
+                               best_match = match;
+                               best_info = *info;
+                       }
+               }
+
+               booted_platform = best_info;
+       }
+
+       return booted_platform == NULL ? NULL : booted_platform->ops;
+}
diff -r 0abad0825f31 -r 2de53961889e sys/arch/arm/fdt/armv7_fdtvar.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/arm/fdt/armv7_fdtvar.h   Sun May 28 23:39:30 2017 +0000
@@ -0,0 +1,60 @@
+/* $NetBSD: armv7_fdtvar.h,v 1.1 2017/05/28 23:39:30 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2017 Jared D. McNeill <jmcneill%invisible.ca@localhost>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _ARM_ARMV7_FDTVAR_H
+#define _ARM_ARMV7_FDTVAR_H
+
+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);
+};
+
+struct armv7_platform_info {
+       const char *                    compat;
+       const struct armv7_platform *   ops;
+};
+
+#define _ARMV7_PLATFORM_REGISTER(name) \
+       __link_set_add_rodata(armv7_platforms, __CONCAT(name,_platinfo));
+
+#define ARMV7_PLATFORM(_name, _compat, _ops)                           \
+static const struct armv7_platform_info __CONCAT(_name,_platinfo) = {  \
+       .compat = (_compat),                                            \
+       .ops = (_ops)                                                   \
+};                                                                     \
+_ARMV7_PLATFORM_REGISTER(_name)
+
+TAILQ_HEAD(armv7_platlist, armv7_platform_info);
+
+const struct armv7_platform *  armv7_fdt_platform(void);
+
+#endif /* !_ARM_ARMV7_FDTVAR_H */
diff -r 0abad0825f31 -r 2de53961889e sys/arch/arm/nvidia/files.tegra
--- a/sys/arch/arm/nvidia/files.tegra   Sun May 28 23:32:14 2017 +0000
+++ b/sys/arch/arm/nvidia/files.tegra   Sun May 28 23:39:30 2017 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files.tegra,v 1.37 2017/05/28 00:40:20 jmcneill Exp $
+#      $NetBSD: files.tegra,v 1.38 2017/05/28 23:39:30 jmcneill Exp $
 #
 # Configuration info for NVIDIA Tegra ARM Peripherals
 #
@@ -14,6 +14,7 @@
 file   arch/arm/arm32/armv7_generic_dma.c
 file   arch/arm/arm/bus_space_a4x.S
 
+file   arch/arm/nvidia/tegra_platform.c
 file   arch/arm/nvidia/tegra_soc.c
 file   arch/arm/nvidia/tegra_cpufreq.c
 
diff -r 0abad0825f31 -r 2de53961889e sys/arch/arm/nvidia/tegra_platform.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/arm/nvidia/tegra_platform.c      Sun May 28 23:39:30 2017 +0000
@@ -0,0 +1,223 @@
+/* $NetBSD: tegra_platform.c,v 1.1 2017/05/28 23:39:30 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2017 Jared D. McNeill <jmcneill%invisible.ca@localhost>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "opt_tegra.h"
+#include "opt_multiprocessor.h"
+
+#include "com.h"
+#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 $");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/cpu.h>
+#include <sys/device.h>
+#include <sys/termios.h>
+
+#include <dev/fdt/fdtvar.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <machine/bootconfig.h>
+#include <arm/cpufunc.h>
+
+#include <arm/nvidia/tegra_reg.h>
+#include <arm/nvidia/tegra_var.h>
+
+#include <arm/fdt/armv7_fdtvar.h>
+
+#if NUKBD > 0
+#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)                        \
+       {                                               \
+               .pd_va = DEVMAP_ALIGN(va),              \
+               .pd_pa = DEVMAP_ALIGN(pa),              \
+               .pd_size = DEVMAP_SIZE(sz),             \
+               .pd_prot = VM_PROT_READ|VM_PROT_WRITE,  \
+               .pd_cache = PTE_NOCACHE                 \
+       }
+#define        DEVMAP_ENTRY_END        { 0 }
+
+static const struct pmap_devmap *
+tegra_platform_devmap(void)
+{
+       static const struct pmap_devmap devmap[] = {
+               DEVMAP_ENTRY(TEGRA_HOST1X_VBASE,
+                            TEGRA_HOST1X_BASE,
+                            TEGRA_HOST1X_SIZE),
+               DEVMAP_ENTRY(TEGRA_PPSB_VBASE,
+                            TEGRA_PPSB_BASE,
+                            TEGRA_PPSB_SIZE),
+               DEVMAP_ENTRY(TEGRA_APB_VBASE,
+                            TEGRA_APB_BASE,
+                            TEGRA_APB_SIZE),
+               DEVMAP_ENTRY(TEGRA_AHB_A2_VBASE,
+                            TEGRA_AHB_A2_BASE,
+                            TEGRA_AHB_A2_SIZE),
+               DEVMAP_ENTRY_END
+       };      
+
+       return devmap;
+}
+
+static void
+tegra_platform_bootstrap(void)
+{
+       tegra_bootstrap();
+}
+
+static void
+tegra_platform_early_putchar(char c)
+{
+#ifdef CONSADDR
+#define CONSADDR_VA    (CONSADDR - TEGRA_APB_BASE + TEGRA_APB_VBASE)
+       volatile uint32_t *uartaddr = (volatile uint32_t *)CONSADDR_VA;
+
+       while ((uartaddr[com_lsr] & LSR_TXRDY) == 0)
+               ;
+
+       uartaddr[com_data] = c;
+#endif
+}
+
+static void
+tegra_platform_device_register(device_t self, void *aux)
+{
+       prop_dictionary_t dict = device_properties(self);
+
+       if (device_is_a(self, "tegrafb") &&
+           match_bootconf_option(boot_args, "console", "fb")) {
+               prop_dictionary_set_bool(dict, "is_console", true);
+#if NUKBD > 0
+               ukbd_cnattach();
+#endif
+       }
+
+       if (device_is_a(self, "tegradrm")) {
+               const char *video = get_bootconf_string(boot_args, "video");
+               if (video)
+                       prop_dictionary_set_cstring(dict, "HDMI-A-1", video);
+               if (match_bootconf_option(boot_args, "hdmi.forcemode", "dvi"))
+                       prop_dictionary_set_bool(dict, "force-dvi", true);
+       }
+
+       if (device_is_a(self, "tegracec"))
+               prop_dictionary_set_cstring(dict, "hdmi-device", "tegradrm0");
+
+       if (device_is_a(self, "nouveau")) {



Home | Main Index | Thread Index | Old Index