Message ID | 20221028014007.2718352-3-yangxiaojuan@loongson.cn (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Improve FDT and support TPM for LoongArch | expand |
在 2022/10/28 上午9:40, Xiaojuan Yang 写道: > Add new items into LoongArch FDT, including rtc and uart info. > > Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn> > --- > hw/loongarch/virt.c | 31 +++++++++++++++++++++++++++++++ > include/hw/pci-host/ls7a.h | 1 + > 2 files changed, 32 insertions(+) Reviewed-by: Song Gao <gaosong@loongson.cn> Thanks. Song Gao > diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c > index fe33e7e3e4..eed9d591e7 100644 > --- a/hw/loongarch/virt.c > +++ b/hw/loongarch/virt.c > @@ -42,6 +42,35 @@ > #include "hw/display/ramfb.h" > #include "hw/mem/pc-dimm.h" > > +static void fdt_add_rtc_node(LoongArchMachineState *lams) > +{ > + char *nodename; > + hwaddr base = VIRT_RTC_REG_BASE; > + hwaddr size = VIRT_RTC_LEN; > + MachineState *ms = MACHINE(lams); > + > + nodename = g_strdup_printf("/rtc@%" PRIx64, base); > + qemu_fdt_add_subnode(ms->fdt, nodename); > + qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "loongson,ls7a-rtc"); > + qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 0x0, base, size); > + g_free(nodename); > +} > + > +static void fdt_add_uart_node(LoongArchMachineState *lams) > +{ > + char *nodename; > + hwaddr base = VIRT_UART_BASE; > + hwaddr size = VIRT_UART_SIZE; > + MachineState *ms = MACHINE(lams); > + > + nodename = g_strdup_printf("/serial@%" PRIx64, base); > + qemu_fdt_add_subnode(ms->fdt, nodename); > + qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "ns16550a"); > + qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", 0x0, base, 0x0, size); > + qemu_fdt_setprop_cell(ms->fdt, nodename, "clock-frequency", 100000000); > + g_free(nodename); > +} > + > static void create_fdt(LoongArchMachineState *lams) > { > MachineState *ms = MACHINE(lams); > @@ -422,6 +451,7 @@ static void loongarch_devices_init(DeviceState *pch_pic, LoongArchMachineState * > qdev_get_gpio_in(pch_pic, > VIRT_UART_IRQ - PCH_PIC_IRQ_OFFSET), > 115200, serial_hd(0), DEVICE_LITTLE_ENDIAN); > + fdt_add_uart_node(lams); > > /* Network init */ > for (i = 0; i < nb_nics; i++) { > @@ -442,6 +472,7 @@ static void loongarch_devices_init(DeviceState *pch_pic, LoongArchMachineState * > sysbus_create_simple("ls7a_rtc", VIRT_RTC_REG_BASE, > qdev_get_gpio_in(pch_pic, > VIRT_RTC_IRQ - PCH_PIC_IRQ_OFFSET)); > + fdt_add_rtc_node(lams); > > pm_mem = g_new(MemoryRegion, 1); > memory_region_init_io(pm_mem, NULL, &loongarch_virt_pm_ops, > diff --git a/include/hw/pci-host/ls7a.h b/include/hw/pci-host/ls7a.h > index 9bd875ca8b..df7fa55a30 100644 > --- a/include/hw/pci-host/ls7a.h > +++ b/include/hw/pci-host/ls7a.h > @@ -37,6 +37,7 @@ > #define VIRT_PCI_IRQS 48 > #define VIRT_UART_IRQ (PCH_PIC_IRQ_OFFSET + 2) > #define VIRT_UART_BASE 0x1fe001e0 > +#define VIRT_UART_SIZE 0X100 > #define VIRT_RTC_IRQ (PCH_PIC_IRQ_OFFSET + 3) > #define VIRT_MISC_REG_BASE (VIRT_PCH_REG_BASE + 0x00080000) > #define VIRT_RTC_REG_BASE (VIRT_MISC_REG_BASE + 0x00050100)
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c index fe33e7e3e4..eed9d591e7 100644 --- a/hw/loongarch/virt.c +++ b/hw/loongarch/virt.c @@ -42,6 +42,35 @@ #include "hw/display/ramfb.h" #include "hw/mem/pc-dimm.h" +static void fdt_add_rtc_node(LoongArchMachineState *lams) +{ + char *nodename; + hwaddr base = VIRT_RTC_REG_BASE; + hwaddr size = VIRT_RTC_LEN; + MachineState *ms = MACHINE(lams); + + nodename = g_strdup_printf("/rtc@%" PRIx64, base); + qemu_fdt_add_subnode(ms->fdt, nodename); + qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "loongson,ls7a-rtc"); + qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 0x0, base, size); + g_free(nodename); +} + +static void fdt_add_uart_node(LoongArchMachineState *lams) +{ + char *nodename; + hwaddr base = VIRT_UART_BASE; + hwaddr size = VIRT_UART_SIZE; + MachineState *ms = MACHINE(lams); + + nodename = g_strdup_printf("/serial@%" PRIx64, base); + qemu_fdt_add_subnode(ms->fdt, nodename); + qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "ns16550a"); + qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", 0x0, base, 0x0, size); + qemu_fdt_setprop_cell(ms->fdt, nodename, "clock-frequency", 100000000); + g_free(nodename); +} + static void create_fdt(LoongArchMachineState *lams) { MachineState *ms = MACHINE(lams); @@ -422,6 +451,7 @@ static void loongarch_devices_init(DeviceState *pch_pic, LoongArchMachineState * qdev_get_gpio_in(pch_pic, VIRT_UART_IRQ - PCH_PIC_IRQ_OFFSET), 115200, serial_hd(0), DEVICE_LITTLE_ENDIAN); + fdt_add_uart_node(lams); /* Network init */ for (i = 0; i < nb_nics; i++) { @@ -442,6 +472,7 @@ static void loongarch_devices_init(DeviceState *pch_pic, LoongArchMachineState * sysbus_create_simple("ls7a_rtc", VIRT_RTC_REG_BASE, qdev_get_gpio_in(pch_pic, VIRT_RTC_IRQ - PCH_PIC_IRQ_OFFSET)); + fdt_add_rtc_node(lams); pm_mem = g_new(MemoryRegion, 1); memory_region_init_io(pm_mem, NULL, &loongarch_virt_pm_ops, diff --git a/include/hw/pci-host/ls7a.h b/include/hw/pci-host/ls7a.h index 9bd875ca8b..df7fa55a30 100644 --- a/include/hw/pci-host/ls7a.h +++ b/include/hw/pci-host/ls7a.h @@ -37,6 +37,7 @@ #define VIRT_PCI_IRQS 48 #define VIRT_UART_IRQ (PCH_PIC_IRQ_OFFSET + 2) #define VIRT_UART_BASE 0x1fe001e0 +#define VIRT_UART_SIZE 0X100 #define VIRT_RTC_IRQ (PCH_PIC_IRQ_OFFSET + 3) #define VIRT_MISC_REG_BASE (VIRT_PCH_REG_BASE + 0x00080000) #define VIRT_RTC_REG_BASE (VIRT_MISC_REG_BASE + 0x00050100)
Add new items into LoongArch FDT, including rtc and uart info. Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn> --- hw/loongarch/virt.c | 31 +++++++++++++++++++++++++++++++ include/hw/pci-host/ls7a.h | 1 + 2 files changed, 32 insertions(+)