mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
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>
This commit is contained in:
+22
-4
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user