On Mon, Nov 11, 2019 at 9:42 PM Anup Patel <anup.pa...@wdc.com> wrote: > > Correct Palmer's email address. > > > -----Original Message----- > > From: Anup Patel > > Sent: Monday, November 11, 2019 7:08 PM > > To: Peter Maydell <peter.mayd...@linaro.org>; Palmer Dabbelt > > <pal...@sifive.com>; Alistair Francis <alistair.fran...@wdc.com>; Sagar > > Karandikar <sag...@eecs.berkeley.edu> > > Cc: Atish Patra <atish.pa...@wdc.com>; Christoph Hellwig <h...@lst.de>; > > Anup Patel <a...@brainfault.org>; qemu-ri...@nongnu.org; qemu- > > de...@nongnu.org; Anup Patel <anup.pa...@wdc.com> > > Subject: [PATCH] riscv/virt: Add syscon reboot and poweroff DT nodes > > > > The SiFive test device found on virt machine can be used by generic syscon > > reboot and poweroff drivers available in Linux kernel. > > > > This patch updates FDT generation in virt machine so that Linux kernel can > > probe and use generic syscon drivers. > > > > Signed-off-by: Anup Patel <anup.pa...@wdc.com> > > --- > > hw/riscv/virt.c | 28 ++++++++++++++++++++++++---- > > 1 file changed, 24 insertions(+), 4 deletions(-) > > > > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index cc8f311e6b..fdfa359713 > > 100644 > > --- a/hw/riscv/virt.c > > +++ b/hw/riscv/virt.c > > @@ -182,11 +182,11 @@ static void create_fdt(RISCVVirtState *s, const > > struct MemmapEntry *memmap, > > uint64_t mem_size, const char *cmdline) { > > void *fdt; > > - int cpu; > > + int cpu, i; > > uint32_t *cells; > > char *nodename; > > - uint32_t plic_phandle, phandle = 1; > > - int i; > > + const char test_compat[] = "sifive,test0\0syscon"; > > + uint32_t plic_phandle, test_phandle, phandle = 1; > > hwaddr flashsize = virt_memmap[VIRT_FLASH].size / 2; > > hwaddr flashbase = virt_memmap[VIRT_FLASH].base; > > > > @@ -356,13 +356,33 @@ 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(fdt, nodename, "compatible", > > + test_compat, sizeof(test_compat)); > > 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);
Is this necessary? > > + 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, Bin