With IPI irqchip, property irqchip-in-kernel is added to indicate whether
feature irqchip_in_kernel is supported or not. This property can be
enabled only if it works in KVM mode.

Signed-off-by: Bibo Mao <maob...@loongson.cn>
---
 hw/intc/loongarch_ipi.c         | 13 +++++++++++++
 include/hw/intc/loongarch_ipi.h |  1 +
 2 files changed, 14 insertions(+)

diff --git a/hw/intc/loongarch_ipi.c b/hw/intc/loongarch_ipi.c
index 74372a2039..64e0250958 100644
--- a/hw/intc/loongarch_ipi.c
+++ b/hw/intc/loongarch_ipi.c
@@ -11,6 +11,7 @@
 #include "qapi/error.h"
 #include "hw/intc/loongarch_ipi.h"
 #include "hw/qdev-properties.h"
+#include "system/kvm.h"
 #include "target/loongarch/cpu.h"
 
 static AddressSpace *get_iocsr_as(CPUState *cpu)
@@ -69,6 +70,7 @@ static void loongarch_ipi_realize(DeviceState *dev, Error 
**errp)
 {
     LoongsonIPICommonState *lics = LOONGSON_IPI_COMMON(dev);
     LoongarchIPIClass *lic = LOONGARCH_IPI_GET_CLASS(dev);
+    LoongarchIPIState *lis = LOONGARCH_IPI(dev);
     MachineState *machine = MACHINE(qdev_get_machine());
     MachineClass *mc = MACHINE_GET_CLASS(machine);
     const CPUArchIdList *id_list;
@@ -81,6 +83,11 @@ static void loongarch_ipi_realize(DeviceState *dev, Error 
**errp)
         return;
     }
 
+    if (lis->irqchip_in_kernel && !kvm_enabled()) {
+        error_setg(errp, "IPI irqchip_in_kernel works only in kvm mode");
+        return;
+    }
+
     assert(mc->possible_cpu_arch_ids);
     id_list = mc->possible_cpu_arch_ids(machine);
     lics->num_cpu = id_list->len;
@@ -166,6 +173,11 @@ static void loongarch_ipi_cpu_unplug(HotplugHandler 
*hotplug_dev,
     core->cpu = NULL;
 }
 
+static const Property loongarch_ipi_properties[] = {
+    DEFINE_PROP_BOOL("irqchip-in-kernel", LoongarchIPIState,
+                     irqchip_in_kernel, false),
+};
+
 static void loongarch_ipi_class_init(ObjectClass *klass, const void *data)
 {
     LoongsonIPICommonClass *licc = LOONGSON_IPI_COMMON_CLASS(klass);
@@ -178,6 +190,7 @@ static void loongarch_ipi_class_init(ObjectClass *klass, 
const void *data)
                                     &lic->parent_realize);
     resettable_class_set_parent_phases(rc, NULL, loongarch_ipi_reset_hold,
                                        NULL, &lic->parent_phases);
+    device_class_set_props(dc, loongarch_ipi_properties);
     licc->get_iocsr_as = get_iocsr_as;
     licc->cpu_by_arch_id = loongarch_cpu_by_arch_id;
     hc->plug = loongarch_ipi_cpu_plug;
diff --git a/include/hw/intc/loongarch_ipi.h b/include/hw/intc/loongarch_ipi.h
index a7c6bf85d3..d4eebd9a4d 100644
--- a/include/hw/intc/loongarch_ipi.h
+++ b/include/hw/intc/loongarch_ipi.h
@@ -16,6 +16,7 @@ OBJECT_DECLARE_TYPE(LoongarchIPIState, LoongarchIPIClass, 
LOONGARCH_IPI)
 
 struct LoongarchIPIState {
     LoongsonIPICommonState parent_obj;
+    bool irqchip_in_kernel;
 };
 
 struct LoongarchIPIClass {
-- 
2.39.3


Reply via email to