All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6]  Add RISC-V KVM AIA Support
@ 2023-04-24  9:07 Yong-Xuan Wang
  2023-04-24  9:07 ` [PATCH 1/6] update-linux-headers: sync-up header with Linux for KVM AIA support Yong-Xuan Wang
                   ` (6 more replies)
  0 siblings, 7 replies; 10+ messages in thread
From: Yong-Xuan Wang @ 2023-04-24  9:07 UTC (permalink / raw)
  To: qemu-devel, qemu-riscv
  Cc: rkanwal, anup, dbarboza, atishp, vincent.chen, greentime.hu,
	frank.chang, Yong-Xuan Wang

This series introduces support for KVM AIA in the RISC-V architecture. The
implementation is refered to Anup's KVM AIA implementation in kvmtool
(https://github.com/avpatel/kvmtool.git). To test these patches, a Linux kernel
with KVM AIA support is required, which can be found in the qemu_kvm_aia branch
at https://github.com/yong-xuan/linux.git. This kernel branch is based on the
riscv_aia_v1 branch from https://github.com/avpatel/linux.git and includes two
additional patches.


Yong-Xuan Wang (6):
  update-linux-headers: sync-up header with Linux for KVM AIA support
  target/riscv: support the AIA device emulateion with KVM enabled
  target/riscv: check the in-kernel irqchip support
  target/riscv: Create an KVM AIA irqchip
  target/riscv: update APLIC and IMSIC to support KVM AIA
  target/riscv: select KVM AIA in riscv virt machine

 hw/intc/riscv_aplic.c     |  19 +++-
 hw/intc/riscv_imsic.c     |  16 ++-
 hw/riscv/virt.c           | 214 +++++++++++++++++++++-----------------
 linux-headers/linux/kvm.h |   2 +
 target/riscv/kvm.c        |  96 ++++++++++++++++-
 target/riscv/kvm_riscv.h  |  36 +++++++
 6 files changed, 277 insertions(+), 106 deletions(-)

-- 
2.17.1



^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/6] update-linux-headers: sync-up header with Linux for KVM AIA support
  2023-04-24  9:07 [PATCH 0/6] Add RISC-V KVM AIA Support Yong-Xuan Wang
@ 2023-04-24  9:07 ` Yong-Xuan Wang
  2023-04-24 15:55   ` Thomas Huth
  2023-04-24  9:07 ` [PATCH 2/6] target/riscv: support the AIA device emulateion with KVM enabled Yong-Xuan Wang
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 10+ messages in thread
From: Yong-Xuan Wang @ 2023-04-24  9:07 UTC (permalink / raw)
  To: qemu-devel, qemu-riscv
  Cc: rkanwal, anup, dbarboza, atishp, vincent.chen, greentime.hu,
	frank.chang, Yong-Xuan Wang, Michael S. Tsirkin, Cornelia Huck,
	Paolo Bonzini, Palmer Dabbelt, Alistair Francis, Bin Meng,
	Thomas Huth, Chenyi Qiang, Alex Williamson, kvm

Sync-up Linux header to get latest KVM RISC-V headers having AIA support.

Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
Reviewed-by: Jim Shu <jim.shu@sifive.com>
---
 linux-headers/linux/kvm.h |  2 ++
 target/riscv/kvm_riscv.h  | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
index ebdafa576d..316732a617 100644
--- a/linux-headers/linux/kvm.h
+++ b/linux-headers/linux/kvm.h
@@ -1426,6 +1426,8 @@ enum kvm_device_type {
 #define KVM_DEV_TYPE_XIVE		KVM_DEV_TYPE_XIVE
 	KVM_DEV_TYPE_ARM_PV_TIME,
 #define KVM_DEV_TYPE_ARM_PV_TIME	KVM_DEV_TYPE_ARM_PV_TIME
+	KVM_DEV_TYPE_RISCV_AIA,
+#define KVM_DEV_TYPE_RISCV_AIA		KVM_DEV_TYPE_RISCV_AIA
 	KVM_DEV_TYPE_MAX,
 };
 
diff --git a/target/riscv/kvm_riscv.h b/target/riscv/kvm_riscv.h
index ed281bdce0..606968a4b7 100644
--- a/target/riscv/kvm_riscv.h
+++ b/target/riscv/kvm_riscv.h
@@ -22,4 +22,37 @@
 void kvm_riscv_reset_vcpu(RISCVCPU *cpu);
 void kvm_riscv_set_irq(RISCVCPU *cpu, int irq, int level);
 
+#define KVM_DEV_RISCV_AIA_GRP_CONFIG            0
+#define KVM_DEV_RISCV_AIA_CONFIG_MODE           0
+#define KVM_DEV_RISCV_AIA_CONFIG_IDS            1
+#define KVM_DEV_RISCV_AIA_CONFIG_SRCS           2
+#define KVM_DEV_RISCV_AIA_CONFIG_GROUP_BITS     3
+#define KVM_DEV_RISCV_AIA_CONFIG_GROUP_SHIFT    4
+#define KVM_DEV_RISCV_AIA_CONFIG_HART_BITS      5
+#define KVM_DEV_RISCV_AIA_CONFIG_GUEST_BITS     6
+#define KVM_DEV_RISCV_AIA_MODE_EMUL             0
+#define KVM_DEV_RISCV_AIA_MODE_HWACCEL          1
+#define KVM_DEV_RISCV_AIA_MODE_AUTO             2
+#define KVM_DEV_RISCV_AIA_IDS_MIN               63
+#define KVM_DEV_RISCV_AIA_IDS_MAX               2048
+#define KVM_DEV_RISCV_AIA_SRCS_MAX              1024
+#define KVM_DEV_RISCV_AIA_GROUP_BITS_MAX        8
+#define KVM_DEV_RISCV_AIA_GROUP_SHIFT_MIN       24
+#define KVM_DEV_RISCV_AIA_GROUP_SHIFT_MAX       56
+#define KVM_DEV_RISCV_AIA_HART_BITS_MAX         16
+#define KVM_DEV_RISCV_AIA_GUEST_BITS_MAX        8
+
+#define KVM_DEV_RISCV_AIA_GRP_ADDR              1
+#define KVM_DEV_RISCV_AIA_ADDR_APLIC            0
+#define KVM_DEV_RISCV_AIA_ADDR_IMSIC(__vcpu)    (1 + (__vcpu))
+#define KVM_DEV_RISCV_AIA_ADDR_MAX              \
+        (1 + KVM_DEV_RISCV_APLIC_MAX_HARTS)
+
+#define KVM_DEV_RISCV_AIA_GRP_CTRL              2
+#define KVM_DEV_RISCV_AIA_CTRL_INIT             0
+
+#define KVM_DEV_RISCV_AIA_GRP_APLIC             3
+
+#define KVM_DEV_RISCV_AIA_GRP_IMSIC             4
+
 #endif
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/6] target/riscv: support the AIA device emulateion with KVM enabled
  2023-04-24  9:07 [PATCH 0/6] Add RISC-V KVM AIA Support Yong-Xuan Wang
  2023-04-24  9:07 ` [PATCH 1/6] update-linux-headers: sync-up header with Linux for KVM AIA support Yong-Xuan Wang
@ 2023-04-24  9:07 ` Yong-Xuan Wang
  2023-04-24  9:07 ` [PATCH 3/6] target/riscv: check the in-kernel irqchip support Yong-Xuan Wang
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Yong-Xuan Wang @ 2023-04-24  9:07 UTC (permalink / raw)
  To: qemu-devel, qemu-riscv
  Cc: rkanwal, anup, dbarboza, atishp, vincent.chen, greentime.hu,
	frank.chang, Yong-Xuan Wang, Palmer Dabbelt, Alistair Francis,
	Bin Meng

Remove M mode AIA devices when using KVM acceleration

Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
Reviewed-by: Jim Shu <jim.shu@sifive.com>
---
 hw/riscv/virt.c | 204 +++++++++++++++++++++++++-----------------------
 1 file changed, 108 insertions(+), 96 deletions(-)

diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index a5bc7353b4..18aede7b23 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -511,54 +511,56 @@ static void create_fdt_imsic(RISCVVirtState *s, const MemMapEntry *memmap,
     imsic_cells = g_new0(uint32_t, mc->smp.cpus * 2);
     imsic_regs = g_new0(uint32_t, riscv_socket_count(mc) * 4);
 
-    /* M-level IMSIC node */
-    for (cpu = 0; cpu < mc->smp.cpus; cpu++) {
-        imsic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
-        imsic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_M_EXT);
-    }
-    imsic_max_hart_per_socket = 0;
-    for (socket = 0; socket < riscv_socket_count(mc); socket++) {
-        imsic_addr = memmap[VIRT_IMSIC_M].base +
-                     socket * VIRT_IMSIC_GROUP_MAX_SIZE;
-        imsic_size = IMSIC_HART_SIZE(0) * s->soc[socket].num_harts;
-        imsic_regs[socket * 4 + 0] = 0;
-        imsic_regs[socket * 4 + 1] = cpu_to_be32(imsic_addr);
-        imsic_regs[socket * 4 + 2] = 0;
-        imsic_regs[socket * 4 + 3] = cpu_to_be32(imsic_size);
-        if (imsic_max_hart_per_socket < s->soc[socket].num_harts) {
-            imsic_max_hart_per_socket = s->soc[socket].num_harts;
+    if (!kvm_enabled()) {
+        /* M-level IMSIC node */
+        for (cpu = 0; cpu < mc->smp.cpus; cpu++) {
+            imsic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
+            imsic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_M_EXT);
         }
-    }
-    imsic_name = g_strdup_printf("/soc/imsics@%lx",
-        (unsigned long)memmap[VIRT_IMSIC_M].base);
-    qemu_fdt_add_subnode(mc->fdt, imsic_name);
-    qemu_fdt_setprop_string(mc->fdt, imsic_name, "compatible",
-        "riscv,imsics");
-    qemu_fdt_setprop_cell(mc->fdt, imsic_name, "#interrupt-cells",
-        FDT_IMSIC_INT_CELLS);
-    qemu_fdt_setprop(mc->fdt, imsic_name, "interrupt-controller",
-        NULL, 0);
-    qemu_fdt_setprop(mc->fdt, imsic_name, "msi-controller",
-        NULL, 0);
-    qemu_fdt_setprop(mc->fdt, imsic_name, "interrupts-extended",
-        imsic_cells, mc->smp.cpus * sizeof(uint32_t) * 2);
-    qemu_fdt_setprop(mc->fdt, imsic_name, "reg", imsic_regs,
-        riscv_socket_count(mc) * sizeof(uint32_t) * 4);
-    qemu_fdt_setprop_cell(mc->fdt, imsic_name, "riscv,num-ids",
-        VIRT_IRQCHIP_NUM_MSIS);
-    qemu_fdt_setprop_cells(mc->fdt, imsic_name, "riscv,ipi-id",
-        VIRT_IRQCHIP_IPI_MSI);
-    if (riscv_socket_count(mc) > 1) {
-        qemu_fdt_setprop_cell(mc->fdt, imsic_name, "riscv,hart-index-bits",
-            imsic_num_bits(imsic_max_hart_per_socket));
-        qemu_fdt_setprop_cell(mc->fdt, imsic_name, "riscv,group-index-bits",
-            imsic_num_bits(riscv_socket_count(mc)));
-        qemu_fdt_setprop_cell(mc->fdt, imsic_name, "riscv,group-index-shift",
-            IMSIC_MMIO_GROUP_MIN_SHIFT);
-    }
-    qemu_fdt_setprop_cell(mc->fdt, imsic_name, "phandle", *msi_m_phandle);
+        imsic_max_hart_per_socket = 0;
+        for (socket = 0; socket < riscv_socket_count(mc); socket++) {
+            imsic_addr = memmap[VIRT_IMSIC_M].base +
+                socket * VIRT_IMSIC_GROUP_MAX_SIZE;
+            imsic_size = IMSIC_HART_SIZE(0) * s->soc[socket].num_harts;
+            imsic_regs[socket * 4 + 0] = 0;
+            imsic_regs[socket * 4 + 1] = cpu_to_be32(imsic_addr);
+            imsic_regs[socket * 4 + 2] = 0;
+            imsic_regs[socket * 4 + 3] = cpu_to_be32(imsic_size);
+            if (imsic_max_hart_per_socket < s->soc[socket].num_harts) {
+                imsic_max_hart_per_socket = s->soc[socket].num_harts;
+            }
+        }
+        imsic_name = g_strdup_printf("/soc/imsics@%lx",
+                (unsigned long)memmap[VIRT_IMSIC_M].base);
+        qemu_fdt_add_subnode(mc->fdt, imsic_name);
+        qemu_fdt_setprop_string(mc->fdt, imsic_name, "compatible",
+                "riscv,imsics");
+        qemu_fdt_setprop_cell(mc->fdt, imsic_name, "#interrupt-cells",
+                FDT_IMSIC_INT_CELLS);
+        qemu_fdt_setprop(mc->fdt, imsic_name, "interrupt-controller",
+                NULL, 0);
+        qemu_fdt_setprop(mc->fdt, imsic_name, "msi-controller",
+                NULL, 0);
+        qemu_fdt_setprop(mc->fdt, imsic_name, "interrupts-extended",
+                imsic_cells, mc->smp.cpus * sizeof(uint32_t) * 2);
+        qemu_fdt_setprop(mc->fdt, imsic_name, "reg", imsic_regs,
+                riscv_socket_count(mc) * sizeof(uint32_t) * 4);
+        qemu_fdt_setprop_cell(mc->fdt, imsic_name, "riscv,num-ids",
+                VIRT_IRQCHIP_NUM_MSIS);
+        qemu_fdt_setprop_cells(mc->fdt, imsic_name, "riscv,ipi-id",
+                VIRT_IRQCHIP_IPI_MSI);
+        if (riscv_socket_count(mc) > 1) {
+            qemu_fdt_setprop_cell(mc->fdt, imsic_name, "riscv,hart-index-bits",
+                    imsic_num_bits(imsic_max_hart_per_socket));
+            qemu_fdt_setprop_cell(mc->fdt, imsic_name, "riscv,group-index-bits",
+                    imsic_num_bits(riscv_socket_count(mc)));
+            qemu_fdt_setprop_cell(mc->fdt, imsic_name,
+                    "riscv,group-index-shift", IMSIC_MMIO_GROUP_MIN_SHIFT);
+        }
+        qemu_fdt_setprop_cell(mc->fdt, imsic_name, "phandle", *msi_m_phandle);
 
-    g_free(imsic_name);
+        g_free(imsic_name);
+    }
 
     /* S-level IMSIC node */
     for (cpu = 0; cpu < mc->smp.cpus; cpu++) {
@@ -637,37 +639,41 @@ static void create_fdt_socket_aplic(RISCVVirtState *s,
     aplic_s_phandle = (*phandle)++;
     aplic_cells = g_new0(uint32_t, s->soc[socket].num_harts * 2);
 
-    /* M-level APLIC node */
-    for (cpu = 0; cpu < s->soc[socket].num_harts; cpu++) {
-        aplic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
-        aplic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_M_EXT);
-    }
-    aplic_addr = memmap[VIRT_APLIC_M].base +
-                 (memmap[VIRT_APLIC_M].size * socket);
-    aplic_name = g_strdup_printf("/soc/aplic@%lx", aplic_addr);
-    qemu_fdt_add_subnode(mc->fdt, aplic_name);
-    qemu_fdt_setprop_string(mc->fdt, aplic_name, "compatible", "riscv,aplic");
-    qemu_fdt_setprop_cell(mc->fdt, aplic_name,
-        "#interrupt-cells", FDT_APLIC_INT_CELLS);
-    qemu_fdt_setprop(mc->fdt, aplic_name, "interrupt-controller", NULL, 0);
-    if (s->aia_type == VIRT_AIA_TYPE_APLIC) {
-        qemu_fdt_setprop(mc->fdt, aplic_name, "interrupts-extended",
-            aplic_cells, s->soc[socket].num_harts * sizeof(uint32_t) * 2);
-    } else {
-        qemu_fdt_setprop_cell(mc->fdt, aplic_name, "msi-parent",
-            msi_m_phandle);
+    if (!kvm_enabled()) {
+        /* M-level APLIC node */
+        for (cpu = 0; cpu < s->soc[socket].num_harts; cpu++) {
+            aplic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
+            aplic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_M_EXT);
+        }
+        aplic_addr = memmap[VIRT_APLIC_M].base +
+            (memmap[VIRT_APLIC_M].size * socket);
+        aplic_name = g_strdup_printf("/soc/aplic@%lx", aplic_addr);
+        qemu_fdt_add_subnode(mc->fdt, aplic_name);
+        qemu_fdt_setprop_string(mc->fdt, aplic_name,
+                    "compatible", "riscv,aplic");
+        qemu_fdt_setprop_cell(mc->fdt, aplic_name,
+                "#interrupt-cells", FDT_APLIC_INT_CELLS);
+        qemu_fdt_setprop(mc->fdt, aplic_name, "interrupt-controller", NULL, 0);
+        if (s->aia_type == VIRT_AIA_TYPE_APLIC) {
+            qemu_fdt_setprop(mc->fdt, aplic_name, "interrupts-extended",
+                    aplic_cells,
+                    s->soc[socket].num_harts * sizeof(uint32_t) * 2);
+        } else {
+            qemu_fdt_setprop_cell(mc->fdt, aplic_name, "msi-parent",
+                    msi_m_phandle);
+        }
+        qemu_fdt_setprop_cells(mc->fdt, aplic_name, "reg",
+                0x0, aplic_addr, 0x0, memmap[VIRT_APLIC_M].size);
+        qemu_fdt_setprop_cell(mc->fdt, aplic_name, "riscv,num-sources",
+                VIRT_IRQCHIP_NUM_SOURCES);
+        qemu_fdt_setprop_cell(mc->fdt, aplic_name, "riscv,children",
+                aplic_s_phandle);
+        qemu_fdt_setprop_cells(mc->fdt, aplic_name, "riscv,delegate",
+                aplic_s_phandle, 0x1, VIRT_IRQCHIP_NUM_SOURCES);
+        riscv_socket_fdt_write_id(mc, mc->fdt, aplic_name, socket);
+        qemu_fdt_setprop_cell(mc->fdt, aplic_name, "phandle", aplic_m_phandle);
+        g_free(aplic_name);
     }
-    qemu_fdt_setprop_cells(mc->fdt, aplic_name, "reg",
-        0x0, aplic_addr, 0x0, memmap[VIRT_APLIC_M].size);
-    qemu_fdt_setprop_cell(mc->fdt, aplic_name, "riscv,num-sources",
-        VIRT_IRQCHIP_NUM_SOURCES);
-    qemu_fdt_setprop_cell(mc->fdt, aplic_name, "riscv,children",
-        aplic_s_phandle);
-    qemu_fdt_setprop_cells(mc->fdt, aplic_name, "riscv,delegate",
-        aplic_s_phandle, 0x1, VIRT_IRQCHIP_NUM_SOURCES);
-    riscv_socket_fdt_write_id(mc, mc->fdt, aplic_name, socket);
-    qemu_fdt_setprop_cell(mc->fdt, aplic_name, "phandle", aplic_m_phandle);
-    g_free(aplic_name);
 
     /* S-level APLIC node */
     for (cpu = 0; cpu < s->soc[socket].num_harts; cpu++) {
@@ -1159,16 +1165,20 @@ static DeviceState *virt_create_aia(RISCVVirtAIAType aia_type, int aia_guests,
     int i;
     hwaddr addr;
     uint32_t guest_bits;
-    DeviceState *aplic_m;
+    DeviceState *aplic_s = NULL;
+    DeviceState *aplic_m = NULL;
     bool msimode = (aia_type == VIRT_AIA_TYPE_APLIC_IMSIC) ? true : false;
 
     if (msimode) {
-        /* Per-socket M-level IMSICs */
-        addr = memmap[VIRT_IMSIC_M].base + socket * VIRT_IMSIC_GROUP_MAX_SIZE;
-        for (i = 0; i < hart_count; i++) {
-            riscv_imsic_create(addr + i * IMSIC_HART_SIZE(0),
-                               base_hartid + i, true, 1,
-                               VIRT_IRQCHIP_NUM_MSIS);
+        if (!kvm_enabled()) {
+            /* Per-socket M-level IMSICs */
+            addr = memmap[VIRT_IMSIC_M].base +
+                   socket * VIRT_IMSIC_GROUP_MAX_SIZE;
+            for (i = 0; i < hart_count; i++) {
+                riscv_imsic_create(addr + i * IMSIC_HART_SIZE(0),
+                        base_hartid + i, true, 1,
+                        VIRT_IRQCHIP_NUM_MSIS);
+            }
         }
 
         /* Per-socket S-level IMSICs */
@@ -1181,19 +1191,21 @@ static DeviceState *virt_create_aia(RISCVVirtAIAType aia_type, int aia_guests,
         }
     }
 
-    /* Per-socket M-level APLIC */
-    aplic_m = riscv_aplic_create(
-        memmap[VIRT_APLIC_M].base + socket * memmap[VIRT_APLIC_M].size,
-        memmap[VIRT_APLIC_M].size,
-        (msimode) ? 0 : base_hartid,
-        (msimode) ? 0 : hart_count,
-        VIRT_IRQCHIP_NUM_SOURCES,
-        VIRT_IRQCHIP_NUM_PRIO_BITS,
-        msimode, true, NULL);
-
-    if (aplic_m) {
+    if (!kvm_enabled()) {
+        /* Per-socket M-level APLIC */
+        aplic_m = riscv_aplic_create(
+                memmap[VIRT_APLIC_M].base + socket * memmap[VIRT_APLIC_M].size,
+                memmap[VIRT_APLIC_M].size,
+                (msimode) ? 0 : base_hartid,
+                (msimode) ? 0 : hart_count,
+                VIRT_IRQCHIP_NUM_SOURCES,
+                VIRT_IRQCHIP_NUM_PRIO_BITS,
+                msimode, true, NULL);
+    }
+
+    if (aplic_m || kvm_enabled()) {
         /* Per-socket S-level APLIC */
-        riscv_aplic_create(
+        aplic_s = riscv_aplic_create(
             memmap[VIRT_APLIC_S].base + socket * memmap[VIRT_APLIC_S].size,
             memmap[VIRT_APLIC_S].size,
             (msimode) ? 0 : base_hartid,
@@ -1203,7 +1215,7 @@ static DeviceState *virt_create_aia(RISCVVirtAIAType aia_type, int aia_guests,
             msimode, false, aplic_m);
     }
 
-    return aplic_m;
+    return kvm_enabled() ? aplic_s : aplic_m;
 }
 
 static void create_platform_bus(RISCVVirtState *s, DeviceState *irqchip)
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/6] target/riscv: check the in-kernel irqchip support
  2023-04-24  9:07 [PATCH 0/6] Add RISC-V KVM AIA Support Yong-Xuan Wang
  2023-04-24  9:07 ` [PATCH 1/6] update-linux-headers: sync-up header with Linux for KVM AIA support Yong-Xuan Wang
  2023-04-24  9:07 ` [PATCH 2/6] target/riscv: support the AIA device emulateion with KVM enabled Yong-Xuan Wang
@ 2023-04-24  9:07 ` Yong-Xuan Wang
  2023-04-24  9:07 ` [PATCH 4/6] target/riscv: Create an KVM AIA irqchip Yong-Xuan Wang
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Yong-Xuan Wang @ 2023-04-24  9:07 UTC (permalink / raw)
  To: qemu-devel, qemu-riscv
  Cc: rkanwal, anup, dbarboza, atishp, vincent.chen, greentime.hu,
	frank.chang, Yong-Xuan Wang, Palmer Dabbelt, Alistair Francis,
	Bin Meng, Paolo Bonzini, kvm

We check the in-kernel irqchip support when using KVM acceleration.

Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
Reviewed-by: Jim Shu <jim.shu@sifive.com>
---
 target/riscv/kvm.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/target/riscv/kvm.c b/target/riscv/kvm.c
index 30f21453d6..6aad25bbc3 100644
--- a/target/riscv/kvm.c
+++ b/target/riscv/kvm.c
@@ -433,7 +433,18 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
 
 int kvm_arch_irqchip_create(KVMState *s)
 {
-    return 0;
+    if (kvm_kernel_irqchip_split()) {
+        error_report("-machine kernel_irqchip=split is not supported "
+                     "on RISC-V.");
+        exit(1);
+    }
+
+    /*
+     * If we can create the VAIA using the newer device control API, we
+     * let the device do this when it initializes itself, otherwise we
+     * fall back to the old API
+     */
+    return kvm_check_extension(s, KVM_CAP_DEVICE_CTRL);
 }
 
 int kvm_arch_process_async_events(CPUState *cs)
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/6] target/riscv: Create an KVM AIA irqchip
  2023-04-24  9:07 [PATCH 0/6] Add RISC-V KVM AIA Support Yong-Xuan Wang
                   ` (2 preceding siblings ...)
  2023-04-24  9:07 ` [PATCH 3/6] target/riscv: check the in-kernel irqchip support Yong-Xuan Wang
@ 2023-04-24  9:07 ` Yong-Xuan Wang
  2023-04-24  9:07 ` [PATCH 5/6] target/riscv: update APLIC and IMSIC to support KVM AIA Yong-Xuan Wang
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Yong-Xuan Wang @ 2023-04-24  9:07 UTC (permalink / raw)
  To: qemu-devel, qemu-riscv
  Cc: rkanwal, anup, dbarboza, atishp, vincent.chen, greentime.hu,
	frank.chang, Yong-Xuan Wang, Palmer Dabbelt, Alistair Francis,
	Bin Meng, Paolo Bonzini, kvm

implement a function to create an KVM AIA chip

Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
Reviewed-by: Jim Shu <jim.shu@sifive.com>
---
 target/riscv/kvm.c       | 83 ++++++++++++++++++++++++++++++++++++++++
 target/riscv/kvm_riscv.h |  3 ++
 2 files changed, 86 insertions(+)

diff --git a/target/riscv/kvm.c b/target/riscv/kvm.c
index 6aad25bbc3..1c21f5a180 100644
--- a/target/riscv/kvm.c
+++ b/target/riscv/kvm.c
@@ -34,6 +34,7 @@
 #include "exec/address-spaces.h"
 #include "hw/boards.h"
 #include "hw/irq.h"
+#include "hw/intc/riscv_imsic.h"
 #include "qemu/log.h"
 #include "hw/loader.h"
 #include "kvm_riscv.h"
@@ -547,3 +548,85 @@ bool kvm_arch_cpu_check_are_resettable(void)
 void kvm_arch_accel_class_init(ObjectClass *oc)
 {
 }
+
+void kvm_riscv_aia_create(DeviceState *aplic_s, bool msimode, int socket,
+                          uint64_t aia_irq_num, uint64_t hart_count,
+                          uint64_t aplic_base, uint64_t imsic_base)
+{
+    int ret;
+    int aia_fd = -1;
+    uint64_t aia_mode;
+    uint64_t aia_nr_ids;
+    uint64_t aia_hart_bits = find_last_bit(&hart_count, BITS_PER_LONG) + 1;
+
+    if (!msimode) {
+        error_report("Currently KVM AIA only supports aplic_imsic mode");
+        exit(1);
+    }
+
+    aia_fd = kvm_create_device(kvm_state, KVM_DEV_TYPE_RISCV_AIA, false);
+
+    if (aia_fd < 0) {
+        error_report("Unable to create in-kernel irqchip");
+        exit(1);
+    }
+
+    ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CONFIG,
+                            KVM_DEV_RISCV_AIA_CONFIG_MODE,
+                            &aia_mode, false, NULL);
+
+    ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CONFIG,
+                            KVM_DEV_RISCV_AIA_CONFIG_IDS,
+                            &aia_nr_ids, false, NULL);
+
+    ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CONFIG,
+                            KVM_DEV_RISCV_AIA_CONFIG_SRCS,
+                            &aia_irq_num, true, NULL);
+    if (ret < 0) {
+        error_report("KVM AIA: fail to set number input irq lines");
+        exit(1);
+    }
+
+    ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CONFIG,
+                            KVM_DEV_RISCV_AIA_CONFIG_HART_BITS,
+                            &aia_hart_bits, true, NULL);
+    if (ret < 0) {
+        error_report("KVM AIA: fail to set number of harts");
+        exit(1);
+    }
+
+    ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_ADDR,
+                            KVM_DEV_RISCV_AIA_ADDR_APLIC,
+                            &aplic_base, true, NULL);
+    if (ret < 0) {
+        error_report("KVM AIA: fail to set the base address of APLIC");
+        exit(1);
+    }
+
+    for (int i = 0; i < hart_count; i++) {
+        uint64_t imsic_addr = imsic_base + i * IMSIC_HART_SIZE(0);
+        ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_ADDR,
+                                KVM_DEV_RISCV_AIA_ADDR_IMSIC(i),
+                                &imsic_addr, true, NULL);
+        if (ret < 0) {
+            error_report("KVM AIA: fail to set the base address of IMSICs");
+            exit(1);
+        }
+    }
+
+    if (kvm_has_gsi_routing()) {
+        for (uint64_t idx = 0; idx < aia_irq_num + 1; ++idx) {
+            kvm_irqchip_add_irq_route(kvm_state, idx, socket, idx);
+        }
+        kvm_gsi_routing_allowed = true;
+        kvm_irqchip_commit_routes(kvm_state);
+    }
+
+    ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CTRL,
+                            KVM_DEV_RISCV_AIA_CTRL_INIT,
+                            NULL, true, NULL);
+    if (ret < 0) {
+        error_report("KVM AIA: initialized fail");
+        exit(1);
+    }
+}
diff --git a/target/riscv/kvm_riscv.h b/target/riscv/kvm_riscv.h
index 606968a4b7..6067adff51 100644
--- a/target/riscv/kvm_riscv.h
+++ b/target/riscv/kvm_riscv.h
@@ -21,6 +21,9 @@
 
 void kvm_riscv_reset_vcpu(RISCVCPU *cpu);
 void kvm_riscv_set_irq(RISCVCPU *cpu, int irq, int level);
+void kvm_riscv_aia_create(DeviceState *aplic_s, bool msimode, int socket,
+                          uint64_t aia_irq_num, uint64_t hart_count,
+                          uint64_t aplic_base, uint64_t imsic_base);
 
 #define KVM_DEV_RISCV_AIA_GRP_CONFIG            0
 #define KVM_DEV_RISCV_AIA_CONFIG_MODE           0
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 5/6] target/riscv: update APLIC and IMSIC to support KVM AIA
  2023-04-24  9:07 [PATCH 0/6] Add RISC-V KVM AIA Support Yong-Xuan Wang
                   ` (3 preceding siblings ...)
  2023-04-24  9:07 ` [PATCH 4/6] target/riscv: Create an KVM AIA irqchip Yong-Xuan Wang
@ 2023-04-24  9:07 ` Yong-Xuan Wang
  2023-04-24  9:07 ` [PATCH 6/6] target/riscv: select KVM AIA in riscv virt machine Yong-Xuan Wang
  2023-04-27 20:23 ` [PATCH 0/6] Add RISC-V KVM AIA Support Daniel Henrique Barboza
  6 siblings, 0 replies; 10+ messages in thread
From: Yong-Xuan Wang @ 2023-04-24  9:07 UTC (permalink / raw)
  To: qemu-devel, qemu-riscv
  Cc: rkanwal, anup, dbarboza, atishp, vincent.chen, greentime.hu,
	frank.chang, Yong-Xuan Wang, Stefan Weil, Jim Shu, Peter Maydell,
	Philippe Mathieu-Daudé, Alistair Francis, Anup Patel,
	Andrew Jones

- Do not set the mmio operations of APLIC and IMSIC when using KVM AIA
- Send interrupt signal to KVM AIA via KVM_IRQ_LINE API

Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
Reviewed-by: Jim Shu <jim.shu@sifive.com>
---
 hw/intc/riscv_aplic.c | 19 +++++++++++++++----
 hw/intc/riscv_imsic.c | 16 +++++++++++-----
 2 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/hw/intc/riscv_aplic.c b/hw/intc/riscv_aplic.c
index cfd007e629..5f68900e9a 100644
--- a/hw/intc/riscv_aplic.c
+++ b/hw/intc/riscv_aplic.c
@@ -31,6 +31,7 @@
 #include "hw/irq.h"
 #include "target/riscv/cpu.h"
 #include "sysemu/sysemu.h"
+#include "sysemu/kvm.h"
 #include "migration/vmstate.h"
 
 #define APLIC_MAX_IDC                  (1UL << 14)
@@ -479,6 +480,11 @@ static void riscv_aplic_request(void *opaque, int irq, int level)
 
     assert((0 < irq) && (irq < aplic->num_irqs));
 
+    if (kvm_irqchip_in_kernel()) {
+        kvm_set_irq(kvm_state, irq, !!level);
+        return;
+    }
+
     sourcecfg = aplic->sourcecfg[irq];
     if (sourcecfg & APLIC_SOURCECFG_D) {
         childidx = sourcecfg & APLIC_SOURCECFG_CHILDIDX_MASK;
@@ -814,9 +820,11 @@ static void riscv_aplic_realize(DeviceState *dev, Error **errp)
     aplic->iforce = g_new0(uint32_t, aplic->num_harts);
     aplic->ithreshold = g_new0(uint32_t, aplic->num_harts);
 
-    memory_region_init_io(&aplic->mmio, OBJECT(dev), &riscv_aplic_ops, aplic,
-                          TYPE_RISCV_APLIC, aplic->aperture_size);
-    sysbus_init_mmio(SYS_BUS_DEVICE(dev), &aplic->mmio);
+    if (!kvm_irqchip_in_kernel()) {
+        memory_region_init_io(&aplic->mmio, OBJECT(dev), &riscv_aplic_ops,
+                             aplic, TYPE_RISCV_APLIC, aplic->aperture_size);
+        sysbus_init_mmio(SYS_BUS_DEVICE(dev), &aplic->mmio);
+    }
 
     /*
      * Only root APLICs have hardware IRQ lines. All non-root APLICs
@@ -958,7 +966,10 @@ DeviceState *riscv_aplic_create(hwaddr addr, hwaddr size,
     qdev_prop_set_bit(dev, "mmode", mmode);
 
     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
-    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
+
+    if (!kvm_irqchip_in_kernel()) {
+        sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
+    }
 
     if (parent) {
         riscv_aplic_add_child(parent, dev);
diff --git a/hw/intc/riscv_imsic.c b/hw/intc/riscv_imsic.c
index 4d4d5b50ca..9b2a442b40 100644
--- a/hw/intc/riscv_imsic.c
+++ b/hw/intc/riscv_imsic.c
@@ -32,6 +32,7 @@
 #include "target/riscv/cpu.h"
 #include "target/riscv/cpu_bits.h"
 #include "sysemu/sysemu.h"
+#include "sysemu/kvm.h"
 #include "migration/vmstate.h"
 
 #define IMSIC_MMIO_PAGE_LE             0x00
@@ -325,10 +326,12 @@ static void riscv_imsic_realize(DeviceState *dev, Error **errp)
     imsic->eithreshold = g_new0(uint32_t, imsic->num_pages);
     imsic->eistate = g_new0(uint32_t, imsic->num_eistate);
 
-    memory_region_init_io(&imsic->mmio, OBJECT(dev), &riscv_imsic_ops,
-                          imsic, TYPE_RISCV_IMSIC,
-                          IMSIC_MMIO_SIZE(imsic->num_pages));
-    sysbus_init_mmio(SYS_BUS_DEVICE(dev), &imsic->mmio);
+    if (!kvm_irqchip_in_kernel()) {
+        memory_region_init_io(&imsic->mmio, OBJECT(dev), &riscv_imsic_ops,
+                              imsic, TYPE_RISCV_IMSIC,
+                              IMSIC_MMIO_SIZE(imsic->num_pages));
+        sysbus_init_mmio(SYS_BUS_DEVICE(dev), &imsic->mmio);
+    }
 
     /* Claim the CPU interrupt to be triggered by this IMSIC */
     if (riscv_cpu_claim_interrupts(rcpu,
@@ -432,7 +435,10 @@ DeviceState *riscv_imsic_create(hwaddr addr, uint32_t hartid, bool mmode,
     qdev_prop_set_uint32(dev, "num-irqs", num_ids + 1);
 
     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
-    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
+
+    if (!kvm_irqchip_in_kernel()) {
+        sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
+    }
 
     for (i = 0; i < num_pages; i++) {
         if (!i) {
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 6/6] target/riscv: select KVM AIA in riscv virt machine
  2023-04-24  9:07 [PATCH 0/6] Add RISC-V KVM AIA Support Yong-Xuan Wang
                   ` (4 preceding siblings ...)
  2023-04-24  9:07 ` [PATCH 5/6] target/riscv: update APLIC and IMSIC to support KVM AIA Yong-Xuan Wang
@ 2023-04-24  9:07 ` Yong-Xuan Wang
  2023-04-27 20:23 ` [PATCH 0/6] Add RISC-V KVM AIA Support Daniel Henrique Barboza
  6 siblings, 0 replies; 10+ messages in thread
From: Yong-Xuan Wang @ 2023-04-24  9:07 UTC (permalink / raw)
  To: qemu-devel, qemu-riscv
  Cc: rkanwal, anup, dbarboza, atishp, vincent.chen, greentime.hu,
	frank.chang, Yong-Xuan Wang, Palmer Dabbelt, Alistair Francis,
	Bin Meng

Select KVM AIA when the host kernel has in-kernel AIA chip support.

Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
Reviewed-by: Jim Shu <jim.shu@sifive.com>
---
 hw/riscv/virt.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index 18aede7b23..908b304991 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -35,6 +35,7 @@
 #include "hw/riscv/virt.h"
 #include "hw/riscv/boot.h"
 #include "hw/riscv/numa.h"
+#include "kvm_riscv.h"
 #include "hw/intc/riscv_aclint.h"
 #include "hw/intc/riscv_aplic.h"
 #include "hw/intc/riscv_imsic.h"
@@ -1215,6 +1216,15 @@ static DeviceState *virt_create_aia(RISCVVirtAIAType aia_type, int aia_guests,
             msimode, false, aplic_m);
     }
 
+    if (kvm_irqchip_in_kernel()) {
+        kvm_riscv_aia_create(
+            aplic_s, msimode, socket,
+            VIRT_IRQCHIP_NUM_SOURCES,
+            hart_count,
+            memmap[VIRT_APLIC_S].base + socket * memmap[VIRT_APLIC_S].size,
+            memmap[VIRT_IMSIC_S].base + socket * VIRT_IMSIC_GROUP_MAX_SIZE);
+    }
+
     return kvm_enabled() ? aplic_s : aplic_m;
 }
 
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/6] update-linux-headers: sync-up header with Linux for KVM AIA support
  2023-04-24  9:07 ` [PATCH 1/6] update-linux-headers: sync-up header with Linux for KVM AIA support Yong-Xuan Wang
@ 2023-04-24 15:55   ` Thomas Huth
  2023-04-24 16:07     ` Cornelia Huck
  0 siblings, 1 reply; 10+ messages in thread
From: Thomas Huth @ 2023-04-24 15:55 UTC (permalink / raw)
  To: Yong-Xuan Wang, qemu-devel, qemu-riscv
  Cc: rkanwal, anup, dbarboza, atishp, vincent.chen, greentime.hu,
	frank.chang, Michael S. Tsirkin, Cornelia Huck, Paolo Bonzini,
	Palmer Dabbelt, Alistair Francis, Bin Meng, Chenyi Qiang,
	Alex Williamson, kvm

On 24/04/2023 11.07, Yong-Xuan Wang wrote:
> Sync-up Linux header to get latest KVM RISC-V headers having AIA support.
> 
> Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
> Reviewed-by: Jim Shu <jim.shu@sifive.com>
> ---
>   linux-headers/linux/kvm.h |  2 ++
>   target/riscv/kvm_riscv.h  | 33 +++++++++++++++++++++++++++++++++

  Hi!

Please don't mix updates to linux-headers/ with updates to other files. 
linux-headers/ should only by updated via the 
scripts/update-linux-headers.sh script, and then the whole update should be 
included in the patch, not only selected files.

Thanks,
   Thomas



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/6] update-linux-headers: sync-up header with Linux for KVM AIA support
  2023-04-24 15:55   ` Thomas Huth
@ 2023-04-24 16:07     ` Cornelia Huck
  0 siblings, 0 replies; 10+ messages in thread
From: Cornelia Huck @ 2023-04-24 16:07 UTC (permalink / raw)
  To: Thomas Huth, Yong-Xuan Wang, qemu-devel, qemu-riscv
  Cc: rkanwal, anup, dbarboza, atishp, vincent.chen, greentime.hu,
	frank.chang, Michael S. Tsirkin, Paolo Bonzini, Palmer Dabbelt,
	Alistair Francis, Bin Meng, Chenyi Qiang, Alex Williamson, kvm

On Mon, Apr 24 2023, Thomas Huth <thuth@redhat.com> wrote:

> On 24/04/2023 11.07, Yong-Xuan Wang wrote:
>> Sync-up Linux header to get latest KVM RISC-V headers having AIA support.
>> 
>> Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
>> Reviewed-by: Jim Shu <jim.shu@sifive.com>
>> ---
>>   linux-headers/linux/kvm.h |  2 ++
>>   target/riscv/kvm_riscv.h  | 33 +++++++++++++++++++++++++++++++++
>
>   Hi!
>
> Please don't mix updates to linux-headers/ with updates to other files. 
> linux-headers/ should only by updated via the 
> scripts/update-linux-headers.sh script, and then the whole update should be 
> included in the patch, not only selected files.

...and in the cases where you cannot run a normal headers update because
the code has not been accepted into Linux yet, just create a placeholder
patch containing only the linux-headers changes, which can be replaced
with a proper update later.

[I didn't check whether the code is already included in Linux.]



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 0/6] Add RISC-V KVM AIA Support
  2023-04-24  9:07 [PATCH 0/6] Add RISC-V KVM AIA Support Yong-Xuan Wang
                   ` (5 preceding siblings ...)
  2023-04-24  9:07 ` [PATCH 6/6] target/riscv: select KVM AIA in riscv virt machine Yong-Xuan Wang
@ 2023-04-27 20:23 ` Daniel Henrique Barboza
  6 siblings, 0 replies; 10+ messages in thread
From: Daniel Henrique Barboza @ 2023-04-27 20:23 UTC (permalink / raw)
  To: Yong-Xuan Wang, qemu-devel, qemu-riscv
  Cc: rkanwal, anup, atishp, vincent.chen, greentime.hu, frank.chang

Hi,

The patches seems to be based on an old QEMU code base. E.g. patch 2 does not
have the changes made by 568e0614d097 that was merged in January this year.

Can you please re-send the series based on top of Alistair's riscv-to-apply.next
(https://github.com/alistair23/qemu/tree/riscv-to-apply.next)?


Thanks,


Daniel




On 4/24/23 06:07, Yong-Xuan Wang wrote:
> This series introduces support for KVM AIA in the RISC-V architecture. The
> implementation is refered to Anup's KVM AIA implementation in kvmtool
> (https://github.com/avpatel/kvmtool.git). To test these patches, a Linux kernel
> with KVM AIA support is required, which can be found in the qemu_kvm_aia branch
> at https://github.com/yong-xuan/linux.git. This kernel branch is based on the
> riscv_aia_v1 branch from https://github.com/avpatel/linux.git and includes two
> additional patches.
> 
> 
> Yong-Xuan Wang (6):
>    update-linux-headers: sync-up header with Linux for KVM AIA support
>    target/riscv: support the AIA device emulateion with KVM enabled
>    target/riscv: check the in-kernel irqchip support
>    target/riscv: Create an KVM AIA irqchip
>    target/riscv: update APLIC and IMSIC to support KVM AIA
>    target/riscv: select KVM AIA in riscv virt machine
> 
>   hw/intc/riscv_aplic.c     |  19 +++-
>   hw/intc/riscv_imsic.c     |  16 ++-
>   hw/riscv/virt.c           | 214 +++++++++++++++++++++-----------------
>   linux-headers/linux/kvm.h |   2 +
>   target/riscv/kvm.c        |  96 ++++++++++++++++-
>   target/riscv/kvm_riscv.h  |  36 +++++++
>   6 files changed, 277 insertions(+), 106 deletions(-)
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2023-04-27 20:23 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-24  9:07 [PATCH 0/6] Add RISC-V KVM AIA Support Yong-Xuan Wang
2023-04-24  9:07 ` [PATCH 1/6] update-linux-headers: sync-up header with Linux for KVM AIA support Yong-Xuan Wang
2023-04-24 15:55   ` Thomas Huth
2023-04-24 16:07     ` Cornelia Huck
2023-04-24  9:07 ` [PATCH 2/6] target/riscv: support the AIA device emulateion with KVM enabled Yong-Xuan Wang
2023-04-24  9:07 ` [PATCH 3/6] target/riscv: check the in-kernel irqchip support Yong-Xuan Wang
2023-04-24  9:07 ` [PATCH 4/6] target/riscv: Create an KVM AIA irqchip Yong-Xuan Wang
2023-04-24  9:07 ` [PATCH 5/6] target/riscv: update APLIC and IMSIC to support KVM AIA Yong-Xuan Wang
2023-04-24  9:07 ` [PATCH 6/6] target/riscv: select KVM AIA in riscv virt machine Yong-Xuan Wang
2023-04-27 20:23 ` [PATCH 0/6] Add RISC-V KVM AIA Support Daniel Henrique Barboza

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.