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,