Module Name:    src
Committed By:   mrg
Date:           Mon Jun 17 05:27:01 UTC 2019

Modified Files:
        src/sys/arch/arm/sunxi: sunxi_platform.c

Log Message:
avoid allocations in the reboot (maybe crash) path and map the
reset registers in new *platform_bootstrap() functions that
merely move the bus_space_map() here, and then call the
original sunxi_platform_bootstrap().

tested on cubietruck and cubietruck plus.


To generate a diff of this commit:
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/arm/sunxi/sunxi_platform.c

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/sunxi/sunxi_platform.c
diff -u src/sys/arch/arm/sunxi/sunxi_platform.c:1.36 src/sys/arch/arm/sunxi/sunxi_platform.c:1.37
--- src/sys/arch/arm/sunxi/sunxi_platform.c:1.36	Tue Apr 30 10:10:45 2019
+++ src/sys/arch/arm/sunxi/sunxi_platform.c	Mon Jun 17 05:27:01 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_platform.c,v 1.36 2019/04/30 10:10:45 mrg Exp $ */
+/* $NetBSD: sunxi_platform.c,v 1.37 2019/06/17 05:27:01 mrg Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca>
@@ -31,7 +31,7 @@
 #include "opt_console.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_platform.c,v 1.36 2019/04/30 10:10:45 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_platform.c,v 1.37 2019/06/17 05:27:01 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -114,6 +114,8 @@ extern struct bus_space arm_generic_a4x_
 #define	sunxi_bs_tag		arm_generic_bs_tag
 #define	sunxi_a4x_bs_tag	arm_generic_a4x_bs_tag
 
+static bus_space_handle_t reset_bsh;
+
 static const struct pmap_devmap *
 sunxi_platform_devmap(void)
 {
@@ -268,6 +270,42 @@ sunxi_platform_bootstrap(void)
 	}
 }
 
+static void
+sun4i_platform_bootstrap(void)
+{
+	bus_space_tag_t bst = &sunxi_bs_tag;
+
+	sunxi_platform_bootstrap();
+	bus_space_map(bst, SUN4I_WDT_BASE, SUN4I_WDT_SIZE, 0, &reset_bsh);
+}
+
+static void
+sun6i_platform_bootstrap(void)
+{
+	bus_space_tag_t bst = &sunxi_bs_tag;
+
+	sunxi_platform_bootstrap();
+	bus_space_map(bst, SUN6I_WDT_BASE, SUN6I_WDT_SIZE, 0, &reset_bsh);
+}
+
+static void
+sun9i_platform_bootstrap(void)
+{
+	bus_space_tag_t bst = &sunxi_bs_tag;
+
+	sunxi_platform_bootstrap();
+	bus_space_map(bst, SUN9I_WDT_BASE, SUN9I_WDT_SIZE, 0, &reset_bsh);
+}
+
+static void
+sun50i_h6_platform_bootstrap(void)
+{
+	bus_space_tag_t bst = &sunxi_bs_tag;
+
+	sunxi_platform_bootstrap();
+	bus_space_map(bst, SUN50I_H6_WDT_BASE, SUN50I_H6_WDT_SIZE, 0, &reset_bsh);
+}
+
 #if defined(SOC_SUNXI_MC)
 static int
 cpu_enable_sun8i_a83t(int phandle)
@@ -296,14 +334,11 @@ static void
 sun4i_platform_reset(void)
 {
 	bus_space_tag_t bst = &sunxi_bs_tag;
-	bus_space_handle_t bsh;
-
-	bus_space_map(bst, SUN4I_WDT_BASE, SUN4I_WDT_SIZE, 0, &bsh);
 
-	bus_space_write_4(bst, bsh, SUN4I_WDT_CTRL,
+	bus_space_write_4(bst, reset_bsh, SUN4I_WDT_CTRL,
 	    SUN4I_WDT_CTRL_KEY | SUN4I_WDT_CTRL_RESTART);
 	for (;;) {
-		bus_space_write_4(bst, bsh, SUN4I_WDT_MODE,
+		bus_space_write_4(bst, reset_bsh, SUN4I_WDT_MODE,
 		    SUN4I_WDT_MODE_EN | SUN4I_WDT_MODE_RST_EN);
 	}
 }
@@ -344,41 +379,32 @@ static void
 sun6i_platform_reset(void)
 {
 	bus_space_tag_t bst = &sunxi_bs_tag;
-	bus_space_handle_t bsh;
 
-	bus_space_map(bst, SUN6I_WDT_BASE, SUN6I_WDT_SIZE, 0, &bsh);
-
-	bus_space_write_4(bst, bsh, SUN6I_WDT_CFG, SUN6I_WDT_CFG_SYS);
-	bus_space_write_4(bst, bsh, SUN6I_WDT_MODE, SUN6I_WDT_MODE_EN);
+	bus_space_write_4(bst, reset_bsh, SUN6I_WDT_CFG, SUN6I_WDT_CFG_SYS);
+	bus_space_write_4(bst, reset_bsh, SUN6I_WDT_MODE, SUN6I_WDT_MODE_EN);
 }
 
 static void
 sun9i_platform_reset(void)
 {
 	bus_space_tag_t bst = &sunxi_bs_tag;
-	bus_space_handle_t bsh;
-
-	bus_space_map(bst, SUN9I_WDT_BASE, SUN9I_WDT_SIZE, 0, &bsh);
 
-	bus_space_write_4(bst, bsh, SUN9I_WDT_CFG, SUN9I_WDT_CFG_SYS);
-	bus_space_write_4(bst, bsh, SUN9I_WDT_MODE, SUN9I_WDT_MODE_EN);
+	bus_space_write_4(bst, reset_bsh, SUN9I_WDT_CFG, SUN9I_WDT_CFG_SYS);
+	bus_space_write_4(bst, reset_bsh, SUN9I_WDT_MODE, SUN9I_WDT_MODE_EN);
 }
 
 static void
 sun50i_h6_platform_reset(void)
 {
 	bus_space_tag_t bst = &sunxi_bs_tag;
-	bus_space_handle_t bsh;
-
-	bus_space_map(bst, SUN50I_H6_WDT_BASE, SUN50I_H6_WDT_SIZE, 0, &bsh);
 
-	bus_space_write_4(bst, bsh, SUN50I_H6_WDT_CFG, SUN50I_H6_WDT_CFG_SYS);
-	bus_space_write_4(bst, bsh, SUN50I_H6_WDT_MODE, SUN50I_H6_WDT_MODE_EN);
+	bus_space_write_4(bst, reset_bsh, SUN50I_H6_WDT_CFG, SUN50I_H6_WDT_CFG_SYS);
+	bus_space_write_4(bst, reset_bsh, SUN50I_H6_WDT_MODE, SUN50I_H6_WDT_MODE_EN);
 }
 
 static const struct arm_platform sun4i_platform = {
 	.ap_devmap = sunxi_platform_devmap,
-	.ap_bootstrap = sunxi_platform_bootstrap,
+	.ap_bootstrap = sun4i_platform_bootstrap,
 	.ap_init_attach_args = sunxi_platform_init_attach_args,
 	.ap_device_register = sunxi_platform_device_register,
 	.ap_reset = sun4i_platform_reset,
@@ -390,7 +416,7 @@ ARM_PLATFORM(sun4i_a10, "allwinner,sun4i
 
 static const struct arm_platform sun5i_platform = {
 	.ap_devmap = sunxi_platform_devmap,
-	.ap_bootstrap = sunxi_platform_bootstrap,
+	.ap_bootstrap = sun4i_platform_bootstrap,
 	.ap_init_attach_args = sunxi_platform_init_attach_args,
 	.ap_device_register = sunxi_platform_device_register,
 	.ap_reset = sun4i_platform_reset,
@@ -403,7 +429,7 @@ ARM_PLATFORM(sun5i_gr8, "nextthing,gr8",
 
 static const struct arm_platform sun6i_platform = {
 	.ap_devmap = sunxi_platform_devmap,
-	.ap_bootstrap = sunxi_platform_bootstrap,
+	.ap_bootstrap = sun6i_platform_bootstrap,
 	.ap_init_attach_args = sunxi_platform_init_attach_args,
 	.ap_device_register = sunxi_platform_device_register,
 	.ap_reset = sun6i_platform_reset,
@@ -416,7 +442,7 @@ ARM_PLATFORM(sun6i_a31, "allwinner,sun6i
 
 static const struct arm_platform sun7i_platform = {
 	.ap_devmap = sunxi_platform_devmap,
-	.ap_bootstrap = sunxi_platform_bootstrap,
+	.ap_bootstrap = sun4i_platform_bootstrap,
 	.ap_init_attach_args = sunxi_platform_init_attach_args,
 	.ap_device_register = sunxi_platform_device_register,
 	.ap_reset = sun4i_platform_reset,
@@ -429,7 +455,7 @@ ARM_PLATFORM(sun7i_a20, "allwinner,sun7i
 
 static const struct arm_platform sun8i_platform = {
 	.ap_devmap = sunxi_platform_devmap,
-	.ap_bootstrap = sunxi_platform_bootstrap,
+	.ap_bootstrap = sun6i_platform_bootstrap,
 	.ap_init_attach_args = sunxi_platform_init_attach_args,
 	.ap_device_register = sunxi_platform_device_register,
 	.ap_reset = sun6i_platform_reset,
@@ -443,7 +469,7 @@ ARM_PLATFORM(sun8i_h3, "allwinner,sun8i-
 
 static const struct arm_platform sun8i_a83t_platform = {
 	.ap_devmap = sun8i_a83t_platform_devmap,
-	.ap_bootstrap = sunxi_platform_bootstrap,
+	.ap_bootstrap = sun6i_platform_bootstrap,
 	.ap_init_attach_args = sunxi_platform_init_attach_args,
 	.ap_device_register = sunxi_platform_device_register,
 	.ap_reset = sun6i_platform_reset,
@@ -456,7 +482,7 @@ ARM_PLATFORM(sun8i_a83t, "allwinner,sun8
 
 static const struct arm_platform sun9i_platform = {
 	.ap_devmap = sun9i_a80_platform_devmap,
-	.ap_bootstrap = sunxi_platform_bootstrap,
+	.ap_bootstrap = sun9i_platform_bootstrap,
 	.ap_init_attach_args = sunxi_platform_init_attach_args,
 	.ap_device_register = sunxi_platform_device_register,
 	.ap_reset = sun9i_platform_reset,
@@ -469,7 +495,7 @@ ARM_PLATFORM(sun9i_a80, "allwinner,sun9i
 
 static const struct arm_platform sun50i_platform = {
 	.ap_devmap = sunxi_platform_devmap,
-	.ap_bootstrap = sunxi_platform_bootstrap,
+	.ap_bootstrap = sun6i_platform_bootstrap,
 	.ap_init_attach_args = sunxi_platform_init_attach_args,
 	.ap_device_register = sunxi_platform_device_register,
 	.ap_reset = sun6i_platform_reset,
@@ -483,7 +509,7 @@ ARM_PLATFORM(sun50i_h5, "allwinner,sun50
 
 static const struct arm_platform sun50i_h6_platform = {
 	.ap_devmap = sunxi_platform_devmap,
-	.ap_bootstrap = sunxi_platform_bootstrap,
+	.ap_bootstrap = sun50i_h6_platform_bootstrap,
 	.ap_init_attach_args = sunxi_platform_init_attach_args,
 	.ap_device_register = sunxi_platform_device_register,
 	.ap_reset = sun50i_h6_platform_reset,

Reply via email to