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