Module Name:    src
Committed By:   jmcneill
Date:           Tue May 30 21:12:41 UTC 2017

Modified Files:
        src/sys/arch/arm/fdt: arm_fdt.c arm_fdtvar.h gtmr_fdt.c
        src/sys/arch/evbarm/tegra: tegra_start.S

Log Message:
Allow ARM FDT drivers to register per-cpu init callbacks. Run through this
callback list when a CPU hatches instead of calling gtmr_init_cpu_clock
directly.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/fdt/arm_fdt.c \
    src/sys/arch/arm/fdt/arm_fdtvar.h src/sys/arch/arm/fdt/gtmr_fdt.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/evbarm/tegra/tegra_start.S

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/arm_fdt.c
diff -u src/sys/arch/arm/fdt/arm_fdt.c:1.1 src/sys/arch/arm/fdt/arm_fdt.c:1.2
--- src/sys/arch/arm/fdt/arm_fdt.c:1.1	Mon May 29 23:21:12 2017
+++ src/sys/arch/arm/fdt/arm_fdt.c	Tue May 30 21:12:41 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: arm_fdt.c,v 1.1 2017/05/29 23:21:12 jmcneill Exp $ */
+/* $NetBSD: arm_fdt.c,v 1.2 2017/05/30 21:12:41 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,14 +27,15 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: arm_fdt.c,v 1.1 2017/05/29 23:21:12 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm_fdt.c,v 1.2 2017/05/30 21:12:41 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
+#include <sys/kmem.h>
+#include <sys/bus.h>
 
 #include <machine/cpu.h>
-#include <sys/bus.h>
 
 #include <dev/fdt/fdtvar.h>
 #include <dev/ofw/openfirm.h>
@@ -50,6 +51,15 @@ CFATTACH_DECL_NEW(arm_fdt, 0,
 static struct arm_platlist arm_platform_list =
     TAILQ_HEAD_INITIALIZER(arm_platform_list);
 
+struct arm_fdt_cpu_hatch_cb {
+	TAILQ_ENTRY(arm_fdt_cpu_hatch_cb) next;
+	void (*cb)(void *, struct cpu_info *);
+	void *priv;
+};
+
+static TAILQ_HEAD(, arm_fdt_cpu_hatch_cb) arm_fdt_cpu_hatch_cbs =
+    TAILQ_HEAD_INITIALIZER(arm_fdt_cpu_hatch_cbs);
+
 int
 arm_fdt_match(device_t parent, cfdata_t cf, void *aux)
 {
@@ -98,3 +108,23 @@ arm_fdt_platform(void)
 
 	return booted_platform == NULL ? NULL : booted_platform->ops;
 }
+
+void
+arm_fdt_cpu_hatch_register(void *priv, void (*cb)(void *, struct cpu_info *))
+{
+	struct arm_fdt_cpu_hatch_cb *c;
+
+	c = kmem_alloc(sizeof(*c), KM_SLEEP);
+	c->priv = priv;
+	c->cb = cb;
+	TAILQ_INSERT_TAIL(&arm_fdt_cpu_hatch_cbs, c, next);
+}
+
+void
+arm_fdt_cpu_hatch(struct cpu_info *ci)
+{
+	struct arm_fdt_cpu_hatch_cb *c;
+
+	TAILQ_FOREACH(c, &arm_fdt_cpu_hatch_cbs, next)
+		c->cb(c->priv, ci);
+}
Index: src/sys/arch/arm/fdt/arm_fdtvar.h
diff -u src/sys/arch/arm/fdt/arm_fdtvar.h:1.1 src/sys/arch/arm/fdt/arm_fdtvar.h:1.2
--- src/sys/arch/arm/fdt/arm_fdtvar.h:1.1	Mon May 29 23:21:12 2017
+++ src/sys/arch/arm/fdt/arm_fdtvar.h	Tue May 30 21:12:41 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: arm_fdtvar.h,v 1.1 2017/05/29 23:21:12 jmcneill Exp $ */
+/* $NetBSD: arm_fdtvar.h,v 1.2 2017/05/30 21:12:41 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared D. McNeill <jmcne...@invisible.ca>
@@ -63,4 +63,7 @@ TAILQ_HEAD(arm_platlist, arm_platform_in
 
 const struct arm_platform *	arm_fdt_platform(void);
 
+void    arm_fdt_cpu_hatch_register(void *, void (*)(void *, struct cpu_info *));
+void    arm_fdt_cpu_hatch(struct cpu_info *);
+
 #endif /* !_ARM_ARM_FDTVAR_H */
Index: src/sys/arch/arm/fdt/gtmr_fdt.c
diff -u src/sys/arch/arm/fdt/gtmr_fdt.c:1.1 src/sys/arch/arm/fdt/gtmr_fdt.c:1.2
--- src/sys/arch/arm/fdt/gtmr_fdt.c:1.1	Sun May 28 00:40:20 2017
+++ src/sys/arch/arm/fdt/gtmr_fdt.c	Tue May 30 21:12:41 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: gtmr_fdt.c,v 1.1 2017/05/28 00:40:20 jmcneill Exp $ */
+/* $NetBSD: gtmr_fdt.c,v 1.2 2017/05/30 21:12:41 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gtmr_fdt.c,v 1.1 2017/05/28 00:40:20 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gtmr_fdt.c,v 1.2 2017/05/30 21:12:41 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -39,12 +39,16 @@ __KERNEL_RCSID(0, "$NetBSD: gtmr_fdt.c,v
 
 #include <arm/cortex/gic_intr.h>
 #include <arm/cortex/mpcore_var.h>
+#include <arm/cortex/gtmr_var.h>
 
 #include <dev/fdt/fdtvar.h>
+#include <arm/fdt/arm_fdtvar.h>
 
 static int	gtmr_fdt_match(device_t, cfdata_t, void *);
 static void	gtmr_fdt_attach(device_t, device_t, void *);
 
+static void	gtmr_fdt_cpu_hatch(void *, struct cpu_info *);
+
 CFATTACH_DECL_NEW(gtmr_fdt, 0, gtmr_fdt_match, gtmr_fdt_attach, NULL, NULL);
 
 static int
@@ -71,4 +75,12 @@ gtmr_fdt_attach(device_t parent, device_
 	};
 
 	config_found(self, &mpcaa, NULL);
+
+	arm_fdt_cpu_hatch_register(self, gtmr_fdt_cpu_hatch);
+}
+
+static void
+gtmr_fdt_cpu_hatch(void *priv, struct cpu_info *ci)
+{
+	gtmr_init_cpu_clock(ci);
 }

Index: src/sys/arch/evbarm/tegra/tegra_start.S
diff -u src/sys/arch/evbarm/tegra/tegra_start.S:1.13 src/sys/arch/evbarm/tegra/tegra_start.S:1.14
--- src/sys/arch/evbarm/tegra/tegra_start.S:1.13	Tue May 30 10:27:53 2017
+++ src/sys/arch/evbarm/tegra/tegra_start.S	Tue May 30 21:12:41 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_start.S,v 1.13 2017/05/30 10:27:53 jmcneill Exp $ */
+/* $NetBSD: tegra_start.S,v 1.14 2017/05/30 21:12:41 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014, 2015 The NetBSD Foundation, Inc.
@@ -42,7 +42,7 @@
 
 #include <arm/nvidia/tegra_reg.h>
 
-RCSID("$NetBSD: tegra_start.S,v 1.13 2017/05/30 10:27:53 jmcneill Exp $")
+RCSID("$NetBSD: tegra_start.S,v 1.14 2017/05/30 21:12:41 jmcneill Exp $")
 
 #if defined(VERBOSE_INIT_ARM) && defined(CONSADDR)
 #define	XPUTC(n)	mov r0, n; bl xputc
@@ -64,7 +64,7 @@ RCSID("$NetBSD: tegra_start.S,v 1.13 201
 #define INIT_MEMSIZE	128
 #define	TEMP_L1_TABLE	(KERNEL_BASE - KERNEL_BASE_VOFFSET + INIT_MEMSIZE * L1_S_SIZE - L1_TABLE_SIZE)
 
-#define	MD_CPU_HATCH	_C_LABEL(gtmr_init_cpu_clock)
+#define	MD_CPU_HATCH	_C_LABEL(arm_fdt_cpu_hatch)
 
 /*
  * Kernel start routine for Tegra SoCs.

Reply via email to