From: Ahmad Fatoum <a.fatoum@pengutronix.de> To: barebox@lists.infradead.org Cc: Ahmad Fatoum <a.fatoum@pengutronix.de> Subject: [PATCH] RISC-V: virt: support poweroff/restart on tinyemu Date: Thu, 16 Sep 2021 11:35:32 +0200 [thread overview] Message-ID: <20210916093532.21699-1-a.fatoum@pengutronix.de> (raw) QEMU Virt on RISC-V has syscon-reboot and syscon-poweroff compatible devices and describes them in the device tree. TinyEMU's Virt machine is different and has a HTIF based poweroff and no dedicated reset mechanism. Add board support for the HTIF poweroff and use a poor man's reset that jumps back to the reset vector. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- arch/riscv/Kconfig.socs | 8 +++ arch/riscv/boards/Makefile | 1 + arch/riscv/boards/riscvemu/Makefile | 1 + arch/riscv/boards/riscvemu/board.c | 76 +++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+) create mode 100644 arch/riscv/boards/riscvemu/Makefile create mode 100644 arch/riscv/boards/riscvemu/board.c diff --git a/arch/riscv/Kconfig.socs b/arch/riscv/Kconfig.socs index 221ea133d4d0..1bd9b4d579d9 100644 --- a/arch/riscv/Kconfig.socs +++ b/arch/riscv/Kconfig.socs @@ -22,6 +22,14 @@ config SOC_VIRT Generates an image tht can be be booted by QEMU. The image is called barebox-dt-2nd.img +config BOARD_RISCVEMU + depends on SOC_VIRT + bool "TinyEMU Virt Machine (riscvemu)" + default y + help + TinyEMU's Virt machine differs from QEMU in poweroff and restart + mechanisms. This adds the necessary support. + config CPU_SIFIVE bool select HAS_CACHE diff --git a/arch/riscv/boards/Makefile b/arch/riscv/boards/Makefile index cb28a25d8bc8..99630266d126 100644 --- a/arch/riscv/boards/Makefile +++ b/arch/riscv/boards/Makefile @@ -2,3 +2,4 @@ obj-$(CONFIG_BOARD_ERIZO_GENERIC) += erizo/ obj-$(CONFIG_BOARD_HIFIVE) += hifive/ obj-$(CONFIG_BOARD_BEAGLEV) += beaglev/ +obj-$(CONFIG_BOARD_RISCVEMU) += riscvemu/ diff --git a/arch/riscv/boards/riscvemu/Makefile b/arch/riscv/boards/riscvemu/Makefile new file mode 100644 index 000000000000..dcfc2937d325 --- /dev/null +++ b/arch/riscv/boards/riscvemu/Makefile @@ -0,0 +1 @@ +obj-y += board.o diff --git a/arch/riscv/boards/riscvemu/board.c b/arch/riscv/boards/riscvemu/board.c new file mode 100644 index 000000000000..7dbf9afe4c2d --- /dev/null +++ b/arch/riscv/boards/riscvemu/board.c @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2021 Ahmad Fatoum, Pengutronix + */ + +#include <common.h> +#include <driver.h> +#include <poweroff.h> +#include <restart.h> +#include <asm/system.h> +#include <asm/barebox-riscv.h> + +struct riscvemu_priv { + struct restart_handler rst; + void __noreturn (*restart)(unsigned long, void *); + +}; + +#define HTIF_BASE_ADDR IOMEM(0x40008000) +#define HTIF_TOHOST_LOW (HTIF_BASE_ADDR + 0) +#define HTIF_TOHOST_HIGH (HTIF_BASE_ADDR + 4) + +static void __noreturn riscvemu_poweroff(struct poweroff_handler *pwr) +{ + writel(1, HTIF_TOHOST_LOW); + writel(0, HTIF_TOHOST_HIGH); + + __builtin_unreachable(); +} + +static void __noreturn riscvemu_restart(struct restart_handler *rst) +{ + struct riscvemu_priv *priv = container_of(rst, struct riscvemu_priv, rst); + + /* + * barebox PBL relocates itself to end of RAM early on, so unless + * something explicitly scrubbed the initial PBL, we can jump back to + * the reset vector to "reset". + */ + priv->restart(riscv_hartid(), barebox_riscv_boot_dtb()); +} + +static int riscvemu_probe(struct device_d *dev) +{ + struct device_node *of_chosen; + struct riscvemu_priv *priv; + u64 start; + + if (of_find_compatible_node(NULL, NULL, "ucb,htif0")) + poweroff_handler_register_fn(riscvemu_poweroff); + + of_chosen = of_find_node_by_path("/chosen"); + + if (of_property_read_u64(of_chosen, "riscv,kernel-start", &start)) + return 0; + + priv = xzalloc(sizeof(*priv)); + + priv->restart = (void *)(uintptr_t)start; + priv->rst.restart = riscvemu_restart; + priv->rst.name = "vector"; + + return restart_handler_register(&priv->rst); +} + +static const struct of_device_id riscvemu_of_match[] = { + { .compatible = "ucbbar,riscvemu-bar_dev" }, + { /* sentinel */ }, +}; + +static struct driver_d riscvemu_board_driver = { + .name = "board-riscvemu", + .probe = riscvemu_probe, + .of_compatible = riscvemu_of_match, +}; +device_platform_driver(riscvemu_board_driver); -- 2.30.2 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
next reply other threads:[~2021-09-16 9:37 UTC|newest] Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-09-16 9:35 Ahmad Fatoum [this message] 2021-10-04 13:09 ` Sascha Hauer
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210916093532.21699-1-a.fatoum@pengutronix.de \ --to=a.fatoum@pengutronix.de \ --cc=barebox@lists.infradead.org \ --subject='Re: [PATCH] RISC-V: virt: support poweroff/restart on tinyemu' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox