[PATCH v6 4/8] sysreset: Add QEMU virtual system controller driver
Kuan-Wei Chiu
visitorckw at gmail.com
Mon Feb 2 09:11:39 CET 2026
Hi Heinrich,
On Fri, Jan 30, 2026 at 12:23:31PM +0100, Heinrich Schuchardt wrote:
> Kuan-Wei Chiu <visitorckw at gmail.com> schrieb am Mi., 7. Jan. 2026, 21:19:
>
> > Introduce a new sysreset driver for the QEMU Virtual System Controller.
> > This device is found on QEMU "virt" machines (such as the m68k virt
> > target) and provides a mechanism to trigger system reset and power-off
> > events.
> >
> > The driver maps U-Boot sysreset types to the corresponding controller
> > commands:
> > - SYSRESET_WARM / SYSRESET_COLD -> VIRT_CTRL_CMD_RESET
> > - SYSRESET_POWER_OFF -> VIRT_CTRL_CMD_HALT
> >
> > Signed-off-by: Kuan-Wei Chiu <visitorckw at gmail.com>
> > ---
> > Changes in v6:
> > - Introduce new driver to replace board-file reset implementation.
> >
> > MAINTAINERS | 6 +++
> > drivers/sysreset/Kconfig | 8 ++++
> > drivers/sysreset/Makefile | 1 +
> > drivers/sysreset/sysreset_qemu_virt_ctrl.c | 55 ++++++++++++++++++++++
> > include/qemu_virt_ctrl.h | 13 +++++
> > 5 files changed, 83 insertions(+)
> > create mode 100644 drivers/sysreset/sysreset_qemu_virt_ctrl.c
> > create mode 100644 include/qemu_virt_ctrl.h
> >
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index efecb213be7..34081769ecd 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -1598,6 +1598,12 @@ S: Maintained
> > T: git https://source.denx.de/u-boot/custodians/u-boot-mpc85xx.git
> > F: arch/powerpc/cpu/mpc85xx/
> >
> > +QEMU VIRTUAL SYSTEM CONTROLLER
> > +M: Kuan-Wei Chiu <visitorckw at gmail.com>
> > +S: Maintained
> > +F: drivers/sysreset/sysreset_qemu_virt_ctrl.c
> > +F: include/qemu_virt_ctrl.h
> > +
> > RAW NAND
> > M: Dario Binacchi <dario.binacchi at amarulasolutions.com>
> > M: Michael Trimarchi <michael at amarulasolutions.com>
> > diff --git a/drivers/sysreset/Kconfig b/drivers/sysreset/Kconfig
> > index 0181f6cd581..120e7510f15 100644
> > --- a/drivers/sysreset/Kconfig
> > +++ b/drivers/sysreset/Kconfig
> > @@ -298,6 +298,14 @@ config SYSRESET_QCOM_PSHOLD
> > help
> > Add support for the system reboot on Qualcomm SoCs via PSHOLD.
> >
> > +config SYSRESET_QEMU_VIRT_CTRL
> > + bool "QEMU Virtual System Controller support"
> > + depends on SYSRESET
> > + help
> > + Enable support for the QEMU Virtual System Controller.
> > + This device is used in QEMU machines (e.g. m68k virt) to trigger
> >
>
> Is this specific to m68k or does it work on all QEMU architectures? If it
> works everywhere, I would not mention m68k here.
The virt-ctrl device was originally introduced in qemu for the m68k
virt machine, which remains its sole user to date. However, as the
implementation resides in hw/misc/virt_ctrl.c, I believe it was
designed to be generic and architecture-agnostic from the start.
Regards,
Kuan-Wei
>
> On x86 QEMU we currently lack poweroff support. So this would come in handy.
>
> Best regards
>
> Heinrich
>
> + system reset and poweroff events.
> > +
> > endif
> >
> > endmenu
> > diff --git a/drivers/sysreset/Makefile b/drivers/sysreset/Makefile
> > index f5c78b25896..d18a5d52360 100644
> > --- a/drivers/sysreset/Makefile
> > +++ b/drivers/sysreset/Makefile
> > @@ -32,3 +32,4 @@ obj-$(CONFIG_$(PHASE_)SYSRESET_X86) += sysreset_x86.o
> > obj-$(CONFIG_SYSRESET_RAA215300) += sysreset_raa215300.o
> > obj-$(CONFIG_SYSRESET_QCOM_PSHOLD) += sysreset_qcom-pshold.o
> > obj-$(CONFIG_TARGET_XTFPGA) += sysreset_xtfpga.o
> > +obj-$(CONFIG_SYSRESET_QEMU_VIRT_CTRL) += sysreset_qemu_virt_ctrl.o
> > diff --git a/drivers/sysreset/sysreset_qemu_virt_ctrl.c
> > b/drivers/sysreset/sysreset_qemu_virt_ctrl.c
> > new file mode 100644
> > index 00000000000..e7cacc9b6e9
> > --- /dev/null
> > +++ b/drivers/sysreset/sysreset_qemu_virt_ctrl.c
> > @@ -0,0 +1,55 @@
> > +// SPDX-License-Identifier: GPL-2.0-or-later
> > +/*
> > + * Copyright (C) 2025, Kuan-Wei Chiu <visitorckw at gmail.com>
> > + *
> > + * QEMU Virtual System Controller Driver
> > + */
> > +
> > +#include <dm.h>
> > +#include <qemu_virt_ctrl.h>
> > +#include <sysreset.h>
> > +#include <asm/io.h>
> > +#include <linux/err.h>
> > +
> > +/* Register offsets */
> > +#define VIRT_CTRL_REG_FEATURES 0x00
> > +#define VIRT_CTRL_REG_CMD 0x04
> > +
> > +/* Commands */
> > +#define VIRT_CTRL_CMD_NOOP 0x00
> > +#define VIRT_CTRL_CMD_RESET 0x01
> > +#define VIRT_CTRL_CMD_HALT 0x02
> > +#define VIRT_CTRL_CMD_PANIC 0x03
> > +
> > +static int qemu_virt_ctrl_request(struct udevice *dev, enum sysreset_t
> > type)
> > +{
> > + struct qemu_virt_ctrl_plat *plat = dev_get_plat(dev);
> > + u32 val;
> > +
> > + switch (type) {
> > + case SYSRESET_WARM:
> > + case SYSRESET_COLD:
> > + val = VIRT_CTRL_CMD_RESET;
> > + break;
> > + case SYSRESET_POWER_OFF:
> > + val = VIRT_CTRL_CMD_HALT;
> > + break;
> > + default:
> > + return -EPROTONOSUPPORT;
> > + }
> > +
> > + writel(val, plat->reg + VIRT_CTRL_REG_CMD);
> > +
> > + return -EINPROGRESS;
> > +}
> > +
> > +static struct sysreset_ops qemu_virt_ctrl_ops = {
> > + .request = qemu_virt_ctrl_request,
> > +};
> > +
> > +U_BOOT_DRIVER(sysreset_qemu_virt_ctrl) = {
> > + .name = "sysreset_qemu_virt_ctrl",
> > + .id = UCLASS_SYSRESET,
> > + .ops = &qemu_virt_ctrl_ops,
> > + .plat_auto = sizeof(struct qemu_virt_ctrl_plat),
> > +};
> > diff --git a/include/qemu_virt_ctrl.h b/include/qemu_virt_ctrl.h
> > new file mode 100644
> > index 00000000000..05aad82b767
> > --- /dev/null
> > +++ b/include/qemu_virt_ctrl.h
> > @@ -0,0 +1,13 @@
> > +/* SPDX-License-Identifier: GPL-2.0-or-later */
> > +/*
> > + * Copyright (C) 2025, Kuan-Wei Chiu <visitorckw at gmail.com>
> > + */
> > +
> > +#ifndef _QEMU_VIRT_CTRL_H_
> > +#define _QEMU_VIRT_CTRL_H_
> > +
> > +struct qemu_virt_ctrl_plat {
> > + phys_addr_t reg;
> > +};
> > +
> > +#endif /* _QEMU_VIRT_CTRL_H_ */
> > --
> > 2.52.0.457.g6b5491de43-goog
> >
> >
More information about the U-Boot
mailing list