Message ID | 20191015083459.76959-3-anup.patel@wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | RTC support for QEMU RISC-V virt machine | expand |
On Tue, 15 Oct 2019 01:35:42 PDT (-0700), Anup Patel wrote: > We extend QEMU RISC-V virt machine by adding Goldfish RTC device > to it. This will allow Guest Linux to sync it's local date/time > with Host date/time via RTC device. > > Signed-off-by: Anup Patel <anup.patel@wdc.com> > --- > hw/riscv/Kconfig | 1 + > hw/riscv/virt.c | 15 +++++++++++++++ > include/hw/riscv/virt.h | 2 ++ > 3 files changed, 18 insertions(+) > > diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig > index fb19b2df3a..b33753c780 100644 > --- a/hw/riscv/Kconfig > +++ b/hw/riscv/Kconfig > @@ -34,6 +34,7 @@ config RISCV_VIRT > select PCI > select HART > select SERIAL > + select GOLDFISH_RTC > select VIRTIO_MMIO > select PCI_EXPRESS_GENERIC_BRIDGE > select SIFIVE > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c > index d36f5625ec..95c42ab993 100644 > --- a/hw/riscv/virt.c > +++ b/hw/riscv/virt.c > @@ -57,6 +57,7 @@ static const struct MemmapEntry { > [VIRT_DEBUG] = { 0x0, 0x100 }, > [VIRT_MROM] = { 0x1000, 0x11000 }, > [VIRT_TEST] = { 0x100000, 0x1000 }, > + [VIRT_RTC] = { 0x101000, 0x1000 }, > [VIRT_CLINT] = { 0x2000000, 0x10000 }, > [VIRT_PLIC] = { 0xc000000, 0x4000000 }, > [VIRT_UART0] = { 0x10000000, 0x100 }, > @@ -310,6 +311,17 @@ static void create_fdt(RISCVVirtState *s, const struct MemmapEntry *memmap, > qemu_fdt_setprop_cell(fdt, nodename, "interrupt-parent", plic_phandle); > qemu_fdt_setprop_cell(fdt, nodename, "interrupts", UART0_IRQ); > > + nodename = g_strdup_printf("/rtc@%lx", > + (long)memmap[VIRT_RTC].base); > + qemu_fdt_add_subnode(fdt, nodename); > + qemu_fdt_setprop_string(fdt, nodename, "compatible", > + "google,goldfish-rtc"); > + qemu_fdt_setprop_cells(fdt, nodename, "reg", > + 0x0, memmap[VIRT_RTC].base, > + 0x0, memmap[VIRT_RTC].size); > + qemu_fdt_setprop_cell(fdt, nodename, "interrupt-parent", plic_phandle); > + qemu_fdt_setprop_cell(fdt, nodename, "interrupts", RTC_IRQ); > + > qemu_fdt_add_subnode(fdt, "/chosen"); > qemu_fdt_setprop_string(fdt, "/chosen", "stdout-path", nodename); > if (cmdline) { > @@ -496,6 +508,9 @@ static void riscv_virt_board_init(MachineState *machine) > 0, qdev_get_gpio_in(DEVICE(s->plic), UART0_IRQ), 399193, > serial_hd(0), DEVICE_LITTLE_ENDIAN); > > + sysbus_create_simple("goldfish_rtc", memmap[VIRT_RTC].base, > + qdev_get_gpio_in(DEVICE(s->plic), RTC_IRQ)); > + > g_free(plic_hart_config); > } > > diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h > index 6e5fbe5d3b..e6423258d3 100644 > --- a/include/hw/riscv/virt.h > +++ b/include/hw/riscv/virt.h > @@ -37,6 +37,7 @@ enum { > VIRT_DEBUG, > VIRT_MROM, > VIRT_TEST, > + VIRT_RTC, > VIRT_CLINT, > VIRT_PLIC, > VIRT_UART0, > @@ -49,6 +50,7 @@ enum { > > enum { > UART0_IRQ = 10, > + RTC_IRQ = 11, > VIRTIO_IRQ = 1, /* 1 to 8 */ > VIRTIO_COUNT = 8, > PCIE_IRQ = 0x20, /* 32 to 35 */ This is a wacky enum, but it's already there. I'm going to assume this patch will get merged and then fix it later. > -- > 2.17.1 Reviewed-by: Palmer Dabbelt <palmer@sifive.com> Acked-by: Palmer Dabbelt <palmer@sifive.com> I think it's easier to just keep this with the goldfish implementation. I'm assuming that will go in through a different tree, as per my comments on that patch.
On Tue, Oct 15, 2019 at 1:37 AM Anup Patel <Anup.Patel@wdc.com> wrote: > > We extend QEMU RISC-V virt machine by adding Goldfish RTC device > to it. This will allow Guest Linux to sync it's local date/time > with Host date/time via RTC device. > > Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Alistair > --- > hw/riscv/Kconfig | 1 + > hw/riscv/virt.c | 15 +++++++++++++++ > include/hw/riscv/virt.h | 2 ++ > 3 files changed, 18 insertions(+) > > diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig > index fb19b2df3a..b33753c780 100644 > --- a/hw/riscv/Kconfig > +++ b/hw/riscv/Kconfig > @@ -34,6 +34,7 @@ config RISCV_VIRT > select PCI > select HART > select SERIAL > + select GOLDFISH_RTC > select VIRTIO_MMIO > select PCI_EXPRESS_GENERIC_BRIDGE > select SIFIVE > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c > index d36f5625ec..95c42ab993 100644 > --- a/hw/riscv/virt.c > +++ b/hw/riscv/virt.c > @@ -57,6 +57,7 @@ static const struct MemmapEntry { > [VIRT_DEBUG] = { 0x0, 0x100 }, > [VIRT_MROM] = { 0x1000, 0x11000 }, > [VIRT_TEST] = { 0x100000, 0x1000 }, > + [VIRT_RTC] = { 0x101000, 0x1000 }, > [VIRT_CLINT] = { 0x2000000, 0x10000 }, > [VIRT_PLIC] = { 0xc000000, 0x4000000 }, > [VIRT_UART0] = { 0x10000000, 0x100 }, > @@ -310,6 +311,17 @@ static void create_fdt(RISCVVirtState *s, const struct MemmapEntry *memmap, > qemu_fdt_setprop_cell(fdt, nodename, "interrupt-parent", plic_phandle); > qemu_fdt_setprop_cell(fdt, nodename, "interrupts", UART0_IRQ); > > + nodename = g_strdup_printf("/rtc@%lx", > + (long)memmap[VIRT_RTC].base); > + qemu_fdt_add_subnode(fdt, nodename); > + qemu_fdt_setprop_string(fdt, nodename, "compatible", > + "google,goldfish-rtc"); > + qemu_fdt_setprop_cells(fdt, nodename, "reg", > + 0x0, memmap[VIRT_RTC].base, > + 0x0, memmap[VIRT_RTC].size); > + qemu_fdt_setprop_cell(fdt, nodename, "interrupt-parent", plic_phandle); > + qemu_fdt_setprop_cell(fdt, nodename, "interrupts", RTC_IRQ); > + > qemu_fdt_add_subnode(fdt, "/chosen"); > qemu_fdt_setprop_string(fdt, "/chosen", "stdout-path", nodename); > if (cmdline) { > @@ -496,6 +508,9 @@ static void riscv_virt_board_init(MachineState *machine) > 0, qdev_get_gpio_in(DEVICE(s->plic), UART0_IRQ), 399193, > serial_hd(0), DEVICE_LITTLE_ENDIAN); > > + sysbus_create_simple("goldfish_rtc", memmap[VIRT_RTC].base, > + qdev_get_gpio_in(DEVICE(s->plic), RTC_IRQ)); > + > g_free(plic_hart_config); > } > > diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h > index 6e5fbe5d3b..e6423258d3 100644 > --- a/include/hw/riscv/virt.h > +++ b/include/hw/riscv/virt.h > @@ -37,6 +37,7 @@ enum { > VIRT_DEBUG, > VIRT_MROM, > VIRT_TEST, > + VIRT_RTC, > VIRT_CLINT, > VIRT_PLIC, > VIRT_UART0, > @@ -49,6 +50,7 @@ enum { > > enum { > UART0_IRQ = 10, > + RTC_IRQ = 11, > VIRTIO_IRQ = 1, /* 1 to 8 */ > VIRTIO_COUNT = 8, > PCIE_IRQ = 0x20, /* 32 to 35 */ > -- > 2.17.1 > >
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index fb19b2df3a..b33753c780 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -34,6 +34,7 @@ config RISCV_VIRT select PCI select HART select SERIAL + select GOLDFISH_RTC select VIRTIO_MMIO select PCI_EXPRESS_GENERIC_BRIDGE select SIFIVE diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index d36f5625ec..95c42ab993 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -57,6 +57,7 @@ static const struct MemmapEntry { [VIRT_DEBUG] = { 0x0, 0x100 }, [VIRT_MROM] = { 0x1000, 0x11000 }, [VIRT_TEST] = { 0x100000, 0x1000 }, + [VIRT_RTC] = { 0x101000, 0x1000 }, [VIRT_CLINT] = { 0x2000000, 0x10000 }, [VIRT_PLIC] = { 0xc000000, 0x4000000 }, [VIRT_UART0] = { 0x10000000, 0x100 }, @@ -310,6 +311,17 @@ static void create_fdt(RISCVVirtState *s, const struct MemmapEntry *memmap, qemu_fdt_setprop_cell(fdt, nodename, "interrupt-parent", plic_phandle); qemu_fdt_setprop_cell(fdt, nodename, "interrupts", UART0_IRQ); + nodename = g_strdup_printf("/rtc@%lx", + (long)memmap[VIRT_RTC].base); + qemu_fdt_add_subnode(fdt, nodename); + qemu_fdt_setprop_string(fdt, nodename, "compatible", + "google,goldfish-rtc"); + qemu_fdt_setprop_cells(fdt, nodename, "reg", + 0x0, memmap[VIRT_RTC].base, + 0x0, memmap[VIRT_RTC].size); + qemu_fdt_setprop_cell(fdt, nodename, "interrupt-parent", plic_phandle); + qemu_fdt_setprop_cell(fdt, nodename, "interrupts", RTC_IRQ); + qemu_fdt_add_subnode(fdt, "/chosen"); qemu_fdt_setprop_string(fdt, "/chosen", "stdout-path", nodename); if (cmdline) { @@ -496,6 +508,9 @@ static void riscv_virt_board_init(MachineState *machine) 0, qdev_get_gpio_in(DEVICE(s->plic), UART0_IRQ), 399193, serial_hd(0), DEVICE_LITTLE_ENDIAN); + sysbus_create_simple("goldfish_rtc", memmap[VIRT_RTC].base, + qdev_get_gpio_in(DEVICE(s->plic), RTC_IRQ)); + g_free(plic_hart_config); } diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index 6e5fbe5d3b..e6423258d3 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -37,6 +37,7 @@ enum { VIRT_DEBUG, VIRT_MROM, VIRT_TEST, + VIRT_RTC, VIRT_CLINT, VIRT_PLIC, VIRT_UART0, @@ -49,6 +50,7 @@ enum { enum { UART0_IRQ = 10, + RTC_IRQ = 11, VIRTIO_IRQ = 1, /* 1 to 8 */ VIRTIO_COUNT = 8, PCIE_IRQ = 0x20, /* 32 to 35 */
We extend QEMU RISC-V virt machine by adding Goldfish RTC device to it. This will allow Guest Linux to sync it's local date/time with Host date/time via RTC device. Signed-off-by: Anup Patel <anup.patel@wdc.com> --- hw/riscv/Kconfig | 1 + hw/riscv/virt.c | 15 +++++++++++++++ include/hw/riscv/virt.h | 2 ++ 3 files changed, 18 insertions(+)