aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnup Patel <Anup.Patel@wdc.com>2020-01-22 13:17:23 +0000
committerPalmer Dabbelt <palmerdabbelt@google.com>2020-02-10 12:01:35 -0800
commit0e404da00737eaa69204e7f3446b85b57d397e4a (patch)
treeb7c6bda9d80ad39090de42a8196fa8dbbe5ad752
parent81a23caf47956778c5a5056ad656d1ef92bf9659 (diff)
downloadqemu-0e404da00737eaa69204e7f3446b85b57d397e4a.zip
qemu-0e404da00737eaa69204e7f3446b85b57d397e4a.tar.gz
qemu-0e404da00737eaa69204e7f3446b85b57d397e4a.tar.bz2
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.patel@wdc.com> Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com> Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
-rw-r--r--hw/riscv/virt.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index c44b865..6d682f8 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",