[PATCH v6 4/8] sysreset: Add QEMU virtual system controller driver

Kuan-Wei Chiu visitorckw at gmail.com
Wed Jan 7 21:18:33 CET 2026


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
+	  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