On Fri, Nov 8, 2019 at 2:54 AM Christoph Hellwig <hch@xxxxxx> wrote: > > Hi all, > > this patch add a driver for the test device in the Qemu RISC-V > virt machine which allows properly shutting down the VM. > It also is added to the riscv defconfig given that qemu-virt > is the most popular riscv platform. We really don't need this driver. Instead, we can simply re-use following drivers: mfd/syscon power/reset/syscon-reboot power/reset/syscon-poweroff Just enable following to your defconfig: CONFIG_POWER_RESET=y CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON_POWEROFF=y CONFIG_SYSCON_REBOOT_MODE=y Once above drivers are enabled in your defconfig, make sure test device DT nodes are described in the following way for virt machine: testdev: test@100000 { compatible = "syscon"; reg = <0x100000 0x1000>; }; reboot { compatible = "syscon-reboot"; regmap = <&testdev>; offset = <0x0>; value = <0x7777>; }; poweroff { compatible = "syscon-poweroff"; regmap = <&testdev>; offset = <0x0>; value = <0x5555>; }; Here's the QEMU changes I used for above DT nodes: diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index d7c5d630eb..7f8206c726 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -186,7 +186,7 @@ static void create_fdt(RISCVVirtState *s, const struct MemmapEntry *memmap, int cpu; uint32_t *cells; char *nodename; - uint32_t plic_phandle, phandle = 1; + uint32_t plic_phandle, test_phandle, phandle = 1; int i; hwaddr flashsize = virt_memmap[VIRT_FLASH].size / 2; hwaddr flashbase = virt_memmap[VIRT_FLASH].base; @@ -357,13 +357,32 @@ static void create_fdt(RISCVVirtState *s, const struct MemmapEntry *memmap, create_pcie_irq_map(fdt, nodename, plic_phandle); g_free(nodename); + test_phandle = phandle++; nodename = g_strdup_printf("/test@%lx", (long)memmap[VIRT_TEST].base); qemu_fdt_add_subnode(fdt, nodename); - qemu_fdt_setprop_string(fdt, nodename, "compatible", "sifive,test0"); + qemu_fdt_setprop_string(fdt, nodename, "compatible", "syscon"); qemu_fdt_setprop_cells(fdt, nodename, "reg", 0x0, memmap[VIRT_TEST].base, 0x0, memmap[VIRT_TEST].size); + qemu_fdt_setprop_cell(fdt, nodename, "phandle", test_phandle); + test_phandle = qemu_fdt_get_phandle(fdt, nodename); + g_free(nodename); + + nodename = g_strdup_printf("/reboot"); + qemu_fdt_add_subnode(fdt, nodename); + qemu_fdt_setprop_string(fdt, nodename, "compatible", "syscon-reboot"); + qemu_fdt_setprop_cell(fdt, nodename, "regmap", test_phandle); + qemu_fdt_setprop_cell(fdt, nodename, "offset", 0x0); + qemu_fdt_setprop_cell(fdt, nodename, "value", FINISHER_RESET); + g_free(nodename); + + nodename = g_strdup_printf("/poweroff"); + qemu_fdt_add_subnode(fdt, nodename); + qemu_fdt_setprop_string(fdt, nodename, "compatible", "syscon-poweroff"); + qemu_fdt_setprop_cell(fdt, nodename, "regmap", test_phandle); + qemu_fdt_setprop_cell(fdt, nodename, "offset", 0x0); + qemu_fdt_setprop_cell(fdt, nodename, "value", FINISHER_PASS); g_free(nodename); nodename = g_strdup_printf("/uart@%lx", Regards, Anup > > _______________________________________________ > linux-riscv mailing list > linux-riscv@xxxxxxxxxxxxxxxxxxx > http://lists.infradead.org/mailman/listinfo/linux-riscv