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.