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