With ExtIOI 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_extioi.c         | 14 ++++++++++++++
 include/hw/intc/loongarch_extioi.h |  1 +
 2 files changed, 15 insertions(+)

diff --git a/hw/intc/loongarch_extioi.c b/hw/intc/loongarch_extioi.c
index 7c38c4c9b7..a737d49b12 100644
--- a/hw/intc/loongarch_extioi.c
+++ b/hw/intc/loongarch_extioi.c
@@ -11,7 +11,9 @@
 #include "qapi/error.h"
 #include "hw/irq.h"
 #include "hw/loongarch/virt.h"
+#include "hw/qdev-properties.h"
 #include "system/address-spaces.h"
+#include "system/kvm.h"
 #include "hw/intc/loongarch_extioi.h"
 #include "trace.h"
 
@@ -341,6 +343,7 @@ static void loongarch_extioi_realize(DeviceState *dev, 
Error **errp)
 {
     LoongArchExtIOICommonState *s = LOONGARCH_EXTIOI_COMMON(dev);
     LoongArchExtIOIClass *lec = LOONGARCH_EXTIOI_GET_CLASS(dev);
+    LoongArchExtIOIState *les = LOONGARCH_EXTIOI(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     Error *local_err = NULL;
     int i;
@@ -351,6 +354,11 @@ static void loongarch_extioi_realize(DeviceState *dev, 
Error **errp)
         return;
     }
 
+    if (les->irqchip_in_kernel && !kvm_enabled()) {
+        error_setg(errp, "ExtIOI irqchip_in_kernel works only in kvm mode");
+        return;
+    }
+
     for (i = 0; i < EXTIOI_IRQS; i++) {
         sysbus_init_irq(sbd, &s->irq[i]);
     }
@@ -403,6 +411,11 @@ static int vmstate_extioi_post_load(void *opaque, int 
version_id)
     return 0;
 }
 
+static const Property loongarch_extioi_properties[] = {
+    DEFINE_PROP_BOOL("irqchip-in-kernel", LoongArchExtIOIState,
+                     irqchip_in_kernel, false),
+};
+
 static void loongarch_extioi_class_init(ObjectClass *klass, const void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -416,6 +429,7 @@ static void loongarch_extioi_class_init(ObjectClass *klass, 
const void *data)
                                       &lec->parent_unrealize);
     resettable_class_set_parent_phases(rc, NULL, loongarch_extioi_reset_hold,
                                        NULL, &lec->parent_phases);
+    device_class_set_props(dc, loongarch_extioi_properties);
     lecc->post_load = vmstate_extioi_post_load;
 }
 
diff --git a/include/hw/intc/loongarch_extioi.h 
b/include/hw/intc/loongarch_extioi.h
index 4a6ae903e9..c1d79d0a40 100644
--- a/include/hw/intc/loongarch_extioi.h
+++ b/include/hw/intc/loongarch_extioi.h
@@ -15,6 +15,7 @@ OBJECT_DECLARE_TYPE(LoongArchExtIOIState, 
LoongArchExtIOIClass, LOONGARCH_EXTIOI
 
 struct LoongArchExtIOIState {
     LoongArchExtIOICommonState parent_obj;
+    bool irqchip_in_kernel;
 };
 
 struct LoongArchExtIOIClass {
-- 
2.39.3


Reply via email to