[PATCH 1/2] hw/intc/loongson_ipi: Gate MMIO regions creation with property

Jiaxun Yang posted 2 patches 5 months ago
Maintainers: Song Gao <gaosong@loongson.cn>, Jiaxun Yang <jiaxun.yang@flygoat.com>, Huacai Chen <chenhuacai@kernel.org>, "Philippe Mathieu-Daudé" <philmd@linaro.org>
There is a newer version of this series
[PATCH 1/2] hw/intc/loongson_ipi: Gate MMIO regions creation with property
Posted by Jiaxun Yang 5 months ago
Commit 49eba52a52fe ("hw/intc/loongson_ipi: Provide per core MMIO address
spaces") implemented per core MMIO spaces for IPI registers.

However on LoongArch system emulation with high core count it may exhaust
QDEV_MAX_MMIO and trigger assertion.

Given that MMIO region is unused for LoongArch system emulation (we do have
it on hardware but kernel is in favor of IOCSR), gate MMIO regions creation
with "has-mmio" property and only set if for loongson3-virt machine to avoid
such limitation on LoongArch.

Reported-by: maobibo <maobibo@loongson.cn>
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
---
 hw/intc/loongson_ipi.c         | 23 ++++++++++++++---------
 hw/mips/loongson3_virt.c       |  1 +
 include/hw/intc/loongson_ipi.h |  1 +
 3 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/hw/intc/loongson_ipi.c b/hw/intc/loongson_ipi.c
index e6a7142480c6..6e92a503499a 100644
--- a/hw/intc/loongson_ipi.c
+++ b/hw/intc/loongson_ipi.c
@@ -305,15 +305,19 @@ static void loongson_ipi_realize(DeviceState *dev, Error **errp)
         return;
     }
 
-    for (i = 0; i < s->num_cpu; i++) {
-        s->cpu[i].ipi = s;
-        s->cpu[i].ipi_mmio_mem = g_new0(MemoryRegion, 1);
-        g_autofree char *name = g_strdup_printf("loongson_ipi_cpu%d_mmio", i);
-        memory_region_init_io(s->cpu[i].ipi_mmio_mem, OBJECT(dev),
-                              &loongson_ipi_core_ops, &s->cpu[i], name, 0x48);
-        sysbus_init_mmio(sbd, s->cpu[i].ipi_mmio_mem);
-
-        qdev_init_gpio_out(dev, &s->cpu[i].irq, 1);
+    if (s->has_mmio) {
+        for (i = 0; i < s->num_cpu; i++) {
+            s->cpu[i].ipi = s;
+            s->cpu[i].ipi_mmio_mem = g_new0(MemoryRegion, 1);
+            g_autofree char *name =
+                        g_strdup_printf("loongson_ipi_cpu%d_mmio", i);
+            memory_region_init_io(s->cpu[i].ipi_mmio_mem, OBJECT(dev),
+                                  &loongson_ipi_core_ops, &s->cpu[i],
+                                  name, 0x48);
+            sysbus_init_mmio(sbd, s->cpu[i].ipi_mmio_mem);
+
+            qdev_init_gpio_out(dev, &s->cpu[i].irq, 1);
+        }
     }
 }
 
@@ -344,6 +348,7 @@ static const VMStateDescription vmstate_loongson_ipi = {
 
 static Property ipi_properties[] = {
     DEFINE_PROP_UINT32("num-cpu", LoongsonIPI, num_cpu, 1),
+    DEFINE_PROP_BOOL("has-mmio", LoongsonIPI, has_mmio, false),
     DEFINE_PROP_END_OF_LIST(),
 };
 
diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
index 4ad36f0c5b64..a27b30ab318c 100644
--- a/hw/mips/loongson3_virt.c
+++ b/hw/mips/loongson3_virt.c
@@ -537,6 +537,7 @@ static void mips_loongson3_virt_init(MachineState *machine)
     if (!kvm_enabled()) {
         ipi = qdev_new(TYPE_LOONGSON_IPI);
         qdev_prop_set_uint32(ipi, "num-cpu", machine->smp.cpus);
+        qdev_prop_set_bit(ipi, "has-mmio", true);
         sysbus_realize_and_unref(SYS_BUS_DEVICE(ipi), &error_fatal);
         memory_region_add_subregion(iocsr, SMP_IPI_MAILBOX,
                                 sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi), 0));
diff --git a/include/hw/intc/loongson_ipi.h b/include/hw/intc/loongson_ipi.h
index 3f795edbf3cd..0e35674e7aaf 100644
--- a/include/hw/intc/loongson_ipi.h
+++ b/include/hw/intc/loongson_ipi.h
@@ -50,6 +50,7 @@ struct LoongsonIPI {
     MemoryRegion ipi_iocsr_mem;
     MemoryRegion ipi64_iocsr_mem;
     uint32_t num_cpu;
+    bool has_mmio;
     IPICore *cpu;
 };
 

-- 
2.43.0