Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/arm/sunxi avoid allocations in the reboot (maybe cr...



details:   https://anonhg.NetBSD.org/src/rev/a9f1ace2e6a4
branches:  trunk
changeset: 452048:a9f1ace2e6a4
user:      mrg <mrg%NetBSD.org@localhost>
date:      Mon Jun 17 05:27:01 2019 +0000

description:
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.

diffstat:

 sys/arch/arm/sunxi/sunxi_platform.c |  88 +++++++++++++++++++++++-------------
 1 files changed, 57 insertions(+), 31 deletions(-)

diffs (208 lines):

diff -r 198af22732a9 -r a9f1ace2e6a4 sys/arch/arm/sunxi/sunxi_platform.c
--- a/sys/arch/arm/sunxi/sunxi_platform.c       Mon Jun 17 03:34:01 2019 +0000
+++ b/sys/arch/arm/sunxi/sunxi_platform.c       Mon Jun 17 05:27:01 2019 +0000
@@ -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 <jmcneill%invisible.ca@localhost>
@@ -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 @@
 #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 @@
        }
 }
 
+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 @@
 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 @@
 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 @@
 
 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 @@
 
 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 @@
 
 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 @@
 
 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 @@
 
 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 @@
 
 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 @@
 
 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 @@
 
 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,



Home | Main Index | Thread Index | Old Index