On Wed, Jan 22, 2020 at 11:18 PM Anup Patel <anup.pa...@wdc.com> wrote: > > 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>
Reviewed-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > Changes since v1: > - Rebased on latest QEMU master commit > 3e08b2b9cb64bff2b73fa9128c0e49bfcde0dd40 > --- > hw/riscv/virt.c | 26 ++++++++++++++++++++++---- > 1 file changed, 22 insertions(+), 4 deletions(-) > > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c > index c44b865959..6d682f8a78 100644 > --- a/hw/riscv/virt.c > +++ b/hw/riscv/virt.c > @@ -182,11 +182,10 @@ 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; > + uint32_t plic_phandle, test_phandle, phandle = 1; > hwaddr flashsize = virt_memmap[VIRT_FLASH].size / 2; > hwaddr flashbase = virt_memmap[VIRT_FLASH].base; > > @@ -356,16 +355,35 @@ 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); > { > - const char compat[] = "sifive,test1\0sifive,test0"; > + const char compat[] = "sifive,test1\0sifive,test0\0syscon"; > qemu_fdt_setprop(fdt, nodename, "compatible", compat, > sizeof(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); > + 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", > -- > 2.17.1 > >