* [PATCH v3] hw/loongarch: Add virtio-mmio bus support
@ 2023-09-11 8:59 Tianrui Zhao
2023-09-14 8:23 ` gaosong
2023-09-14 8:49 ` gaosong
0 siblings, 2 replies; 3+ messages in thread
From: Tianrui Zhao @ 2023-09-11 8:59 UTC (permalink / raw)
To: qemu-devel; +Cc: richard.henderson, maobibo, yangxiaojuan, zhaotianrui, gaosong
Add virtio-mmio bus support for LoongArch, so that devices
could be added in the virtio-mmio bus.
Signed-off-by: Tianrui Zhao <zhaotianrui@loongson.cn>
Change-Id: Ib882005106562e0dfe74122a7fa2430fa081bfb2
---
hw/loongarch/Kconfig | 1 +
hw/loongarch/acpi-build.c | 25 +++++++++++++++++++++++++
hw/loongarch/virt.c | 28 ++++++++++++++++++++++++++++
include/hw/pci-host/ls7a.h | 4 ++++
4 files changed, 58 insertions(+)
diff --git a/hw/loongarch/Kconfig b/hw/loongarch/Kconfig
index 1e7c5b43c5..01ab8ce8e7 100644
--- a/hw/loongarch/Kconfig
+++ b/hw/loongarch/Kconfig
@@ -22,3 +22,4 @@ config LOONGARCH_VIRT
select DIMM
select PFLASH_CFI01
select ACPI_HMAT
+ select VIRTIO_MMIO
diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c
index ae292fc543..d033fc2271 100644
--- a/hw/loongarch/acpi-build.c
+++ b/hw/loongarch/acpi-build.c
@@ -363,6 +363,30 @@ static void acpi_dsdt_add_tpm(Aml *scope, LoongArchMachineState *vms)
}
#endif
+static void acpi_dsdt_add_virtio(Aml *scope)
+{
+ int i;
+ hwaddr base = VIRT_VIRTIO_MMIO_BASE;
+ hwaddr size = VIRT_VIRTIO_MMIO_SIZE;
+
+ for (i = 0; i < VIRT_VIRTIO_MMIO_NUM; i++) {
+ uint32_t irq = VIRT_VIRTIO_MMIO_IRQ + i;
+ Aml *dev = aml_device("VR%02u", i);
+
+ aml_append(dev, aml_name_decl("_HID", aml_string("LNRO0005")));
+ aml_append(dev, aml_name_decl("_UID", aml_int(i)));
+ aml_append(dev, aml_name_decl("_CCA", aml_int(1)));
+
+ Aml *crs = aml_resource_template();
+ aml_append(crs, aml_memory32_fixed(base, size, AML_READ_WRITE));
+ aml_append(crs, aml_interrupt(AML_CONSUMER, AML_LEVEL, AML_ACTIVE_HIGH,
+ AML_EXCLUSIVE, &irq, 1));
+ aml_append(dev, aml_name_decl("_CRS", crs));
+ aml_append(scope, dev);
+ base += size;
+ }
+}
+
/* build DSDT */
static void
build_dsdt(GArray *table_data, BIOSLinker *linker, MachineState *machine)
@@ -381,6 +405,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, MachineState *machine)
#ifdef CONFIG_TPM
acpi_dsdt_add_tpm(dsdt, lams);
#endif
+ acpi_dsdt_add_virtio(dsdt);
/* System State Package */
scope = aml_scope("\\");
pkg = aml_package(4);
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 2629128aed..ffef3222da 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -116,6 +116,25 @@ static void fdt_add_rtc_node(LoongArchMachineState *lams)
g_free(nodename);
}
+static void fdt_add_virtio_mmio_node(LoongArchMachineState *lams)
+{
+ int i;
+ MachineState *ms = MACHINE(lams);
+
+ for (i = VIRT_VIRTIO_MMIO_NUM - 1; i >= 0; i--) {
+ char *nodename;
+ hwaddr base = VIRT_VIRTIO_MMIO_BASE + i * VIRT_VIRTIO_MMIO_SIZE;
+
+ nodename = g_strdup_printf("/virtio_mmio@%" PRIx64, base);
+ qemu_fdt_add_subnode(ms->fdt, nodename);
+ qemu_fdt_setprop_string(ms->fdt, nodename,
+ "compatible", "virtio,mmio");
+ qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
+ 2, base, 2, VIRT_VIRTIO_MMIO_SIZE);
+ g_free(nodename);
+ }
+}
+
static void fdt_add_uart_node(LoongArchMachineState *lams)
{
char *nodename;
@@ -560,6 +579,15 @@ static void loongarch_devices_init(DeviceState *pch_pic, LoongArchMachineState *
VIRT_RTC_IRQ - VIRT_GSI_BASE));
fdt_add_rtc_node(lams);
+ /* virtio-mmio device */
+ for (i = 0; i < VIRT_VIRTIO_MMIO_NUM; i++) {
+ hwaddr virtio_base = VIRT_VIRTIO_MMIO_BASE + i * VIRT_VIRTIO_MMIO_SIZE;
+ int virtio_irq = VIRT_VIRTIO_MMIO_IRQ - VIRT_GSI_BASE + i;
+ sysbus_create_simple("virtio-mmio", virtio_base,
+ qdev_get_gpio_in(pch_pic, virtio_irq));
+ }
+ fdt_add_virtio_mmio_node(lams);
+
pm_mem = g_new(MemoryRegion, 1);
memory_region_init_io(pm_mem, NULL, &loongarch_virt_pm_ops,
NULL, "loongarch_virt_pm", PM_SIZE);
diff --git a/include/hw/pci-host/ls7a.h b/include/hw/pci-host/ls7a.h
index e753449593..96506b9a4c 100644
--- a/include/hw/pci-host/ls7a.h
+++ b/include/hw/pci-host/ls7a.h
@@ -42,6 +42,10 @@
#define VIRT_RTC_REG_BASE (VIRT_MISC_REG_BASE + 0x00050100)
#define VIRT_RTC_LEN 0x100
#define VIRT_SCI_IRQ (VIRT_GSI_BASE + 4)
+#define VIRT_VIRTIO_MMIO_IRQ (VIRT_GSI_BASE + 7)
+#define VIRT_VIRTIO_MMIO_BASE 0x1e200000
+#define VIRT_VIRTIO_MMIO_SIZE 0x200
+#define VIRT_VIRTIO_MMIO_NUM 4
#define VIRT_PLATFORM_BUS_BASEADDRESS 0x16000000
#define VIRT_PLATFORM_BUS_SIZE 0x2000000
--
2.39.1
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH v3] hw/loongarch: Add virtio-mmio bus support
2023-09-11 8:59 [PATCH v3] hw/loongarch: Add virtio-mmio bus support Tianrui Zhao
@ 2023-09-14 8:23 ` gaosong
2023-09-14 8:49 ` gaosong
1 sibling, 0 replies; 3+ messages in thread
From: gaosong @ 2023-09-14 8:23 UTC (permalink / raw)
To: Tianrui Zhao, qemu-devel; +Cc: richard.henderson, maobibo, yangxiaojuan
在 2023/9/11 下午4:59, Tianrui Zhao 写道:
> Add virtio-mmio bus support for LoongArch, so that devices
> could be added in the virtio-mmio bus.
>
> Signed-off-by: Tianrui Zhao <zhaotianrui@loongson.cn>
> Change-Id: Ib882005106562e0dfe74122a7fa2430fa081bfb2
> ---
> hw/loongarch/Kconfig | 1 +
> hw/loongarch/acpi-build.c | 25 +++++++++++++++++++++++++
> hw/loongarch/virt.c | 28 ++++++++++++++++++++++++++++
> include/hw/pci-host/ls7a.h | 4 ++++
> 4 files changed, 58 insertions(+)
>
Drop Change-Id, and update virt.rst ('- 4 virtio-mmio transport devices')
Reviewed-by: Song Gao <gaosong@loongson.cn>
> diff --git a/hw/loongarch/Kconfig b/hw/loongarch/Kconfig
> index 1e7c5b43c5..01ab8ce8e7 100644
> --- a/hw/loongarch/Kconfig
> +++ b/hw/loongarch/Kconfig
> @@ -22,3 +22,4 @@ config LOONGARCH_VIRT
> select DIMM
> select PFLASH_CFI01
> select ACPI_HMAT
> + select VIRTIO_MMIO
> diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c
> index ae292fc543..d033fc2271 100644
> --- a/hw/loongarch/acpi-build.c
> +++ b/hw/loongarch/acpi-build.c
> @@ -363,6 +363,30 @@ static void acpi_dsdt_add_tpm(Aml *scope, LoongArchMachineState *vms)
> }
> #endif
>
> +static void acpi_dsdt_add_virtio(Aml *scope)
> +{
> + int i;
> + hwaddr base = VIRT_VIRTIO_MMIO_BASE;
> + hwaddr size = VIRT_VIRTIO_MMIO_SIZE;
> +
> + for (i = 0; i < VIRT_VIRTIO_MMIO_NUM; i++) {
> + uint32_t irq = VIRT_VIRTIO_MMIO_IRQ + i;
> + Aml *dev = aml_device("VR%02u", i);
> +
> + aml_append(dev, aml_name_decl("_HID", aml_string("LNRO0005")));
> + aml_append(dev, aml_name_decl("_UID", aml_int(i)));
> + aml_append(dev, aml_name_decl("_CCA", aml_int(1)));
> +
> + Aml *crs = aml_resource_template();
> + aml_append(crs, aml_memory32_fixed(base, size, AML_READ_WRITE));
> + aml_append(crs, aml_interrupt(AML_CONSUMER, AML_LEVEL, AML_ACTIVE_HIGH,
> + AML_EXCLUSIVE, &irq, 1));
> + aml_append(dev, aml_name_decl("_CRS", crs));
> + aml_append(scope, dev);
> + base += size;
> + }
> +}
> +
> /* build DSDT */
> static void
> build_dsdt(GArray *table_data, BIOSLinker *linker, MachineState *machine)
> @@ -381,6 +405,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, MachineState *machine)
> #ifdef CONFIG_TPM
> acpi_dsdt_add_tpm(dsdt, lams);
> #endif
> + acpi_dsdt_add_virtio(dsdt);
> /* System State Package */
> scope = aml_scope("\\");
> pkg = aml_package(4);
> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
> index 2629128aed..ffef3222da 100644
> --- a/hw/loongarch/virt.c
> +++ b/hw/loongarch/virt.c
> @@ -116,6 +116,25 @@ static void fdt_add_rtc_node(LoongArchMachineState *lams)
> g_free(nodename);
> }
>
> +static void fdt_add_virtio_mmio_node(LoongArchMachineState *lams)
> +{
> + int i;
> + MachineState *ms = MACHINE(lams);
> +
> + for (i = VIRT_VIRTIO_MMIO_NUM - 1; i >= 0; i--) {
> + char *nodename;
> + hwaddr base = VIRT_VIRTIO_MMIO_BASE + i * VIRT_VIRTIO_MMIO_SIZE;
> +
> + nodename = g_strdup_printf("/virtio_mmio@%" PRIx64, base);
> + qemu_fdt_add_subnode(ms->fdt, nodename);
> + qemu_fdt_setprop_string(ms->fdt, nodename,
> + "compatible", "virtio,mmio");
> + qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
> + 2, base, 2, VIRT_VIRTIO_MMIO_SIZE);
> + g_free(nodename);
> + }
> +}
> +
> static void fdt_add_uart_node(LoongArchMachineState *lams)
> {
> char *nodename;
> @@ -560,6 +579,15 @@ static void loongarch_devices_init(DeviceState *pch_pic, LoongArchMachineState *
> VIRT_RTC_IRQ - VIRT_GSI_BASE));
> fdt_add_rtc_node(lams);
>
> + /* virtio-mmio device */
> + for (i = 0; i < VIRT_VIRTIO_MMIO_NUM; i++) {
> + hwaddr virtio_base = VIRT_VIRTIO_MMIO_BASE + i * VIRT_VIRTIO_MMIO_SIZE;
> + int virtio_irq = VIRT_VIRTIO_MMIO_IRQ - VIRT_GSI_BASE + i;
> + sysbus_create_simple("virtio-mmio", virtio_base,
> + qdev_get_gpio_in(pch_pic, virtio_irq));
> + }
> + fdt_add_virtio_mmio_node(lams);
> +
> pm_mem = g_new(MemoryRegion, 1);
> memory_region_init_io(pm_mem, NULL, &loongarch_virt_pm_ops,
> NULL, "loongarch_virt_pm", PM_SIZE);
> diff --git a/include/hw/pci-host/ls7a.h b/include/hw/pci-host/ls7a.h
> index e753449593..96506b9a4c 100644
> --- a/include/hw/pci-host/ls7a.h
> +++ b/include/hw/pci-host/ls7a.h
> @@ -42,6 +42,10 @@
> #define VIRT_RTC_REG_BASE (VIRT_MISC_REG_BASE + 0x00050100)
> #define VIRT_RTC_LEN 0x100
> #define VIRT_SCI_IRQ (VIRT_GSI_BASE + 4)
> +#define VIRT_VIRTIO_MMIO_IRQ (VIRT_GSI_BASE + 7)
> +#define VIRT_VIRTIO_MMIO_BASE 0x1e200000
> +#define VIRT_VIRTIO_MMIO_SIZE 0x200
> +#define VIRT_VIRTIO_MMIO_NUM 4
>
how about set num is 8 or larger?
virt machine
arm : 32
openrisc : 8
riscv: 8
> #define VIRT_PLATFORM_BUS_BASEADDRESS 0x16000000
> #define VIRT_PLATFORM_BUS_SIZE 0x2000000
>
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH v3] hw/loongarch: Add virtio-mmio bus support
2023-09-11 8:59 [PATCH v3] hw/loongarch: Add virtio-mmio bus support Tianrui Zhao
2023-09-14 8:23 ` gaosong
@ 2023-09-14 8:49 ` gaosong
1 sibling, 0 replies; 3+ messages in thread
From: gaosong @ 2023-09-14 8:49 UTC (permalink / raw)
To: Tianrui Zhao, qemu-devel; +Cc: richard.henderson, maobibo, yangxiaojuan
在 2023/9/11 下午4:59, Tianrui Zhao 写道:
> +static void fdt_add_virtio_mmio_node(LoongArchMachineState *lams)
> +{
> + int i;
> + MachineState *ms = MACHINE(lams);
> +
> + for (i = VIRT_VIRTIO_MMIO_NUM - 1; i >= 0; i--) {
> + char *nodename;
> + hwaddr base = VIRT_VIRTIO_MMIO_BASE + i * VIRT_VIRTIO_MMIO_SIZE;
> +
> + nodename = g_strdup_printf("/virtio_mmio@%" PRIx64, base);
> + qemu_fdt_add_subnode(ms->fdt, nodename);
> + qemu_fdt_setprop_string(ms->fdt, nodename,
> + "compatible", "virtio,mmio");
> + qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
> + 2, base, 2, VIRT_VIRTIO_MMIO_SIZE);
Missing node interrupts.
Thanks.
Song Gao
> + g_free(nodename);
> + }
> +}
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2023-09-14 8:50 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-11 8:59 [PATCH v3] hw/loongarch: Add virtio-mmio bus support Tianrui Zhao
2023-09-14 8:23 ` gaosong
2023-09-14 8:49 ` gaosong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).