With PCH MSI 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_pch_msi.c         | 8 ++++++++
 include/hw/intc/loongarch_pch_msi.h | 1 +
 2 files changed, 9 insertions(+)

diff --git a/hw/intc/loongarch_pch_msi.c b/hw/intc/loongarch_pch_msi.c
index 06eb944da0..e2dacc39bf 100644
--- a/hw/intc/loongarch_pch_msi.c
+++ b/hw/intc/loongarch_pch_msi.c
@@ -13,6 +13,7 @@
 #include "hw/pci/msi.h"
 #include "hw/misc/unimp.h"
 #include "migration/vmstate.h"
+#include "system/kvm.h"
 #include "trace.h"
 
 static uint64_t loongarch_msi_mem_read(void *opaque, hwaddr addr, unsigned 
size)
@@ -51,6 +52,11 @@ static void loongarch_pch_msi_realize(DeviceState *dev, 
Error **errp)
         return;
     }
 
+    if (s->irqchip_in_kernel && !kvm_enabled()) {
+        error_setg(errp, "irqchip_in_kernel works only in kvm mode");
+        return;
+    }
+
     s->pch_msi_irq = g_new(qemu_irq, s->irq_num);
     qdev_init_gpio_out(dev, s->pch_msi_irq, s->irq_num);
 }
@@ -77,6 +83,8 @@ static void loongarch_pch_msi_init(Object *obj)
 static const Property loongarch_msi_properties[] = {
     DEFINE_PROP_UINT32("msi_irq_base", LoongArchPCHMSI, irq_base, 0),
     DEFINE_PROP_UINT32("msi_irq_num",  LoongArchPCHMSI, irq_num, 0),
+    DEFINE_PROP_BOOL("irqchip-in-kernel", LoongArchPCHMSI,
+                     irqchip_in_kernel, false),
 };
 
 static void loongarch_pch_msi_class_init(ObjectClass *klass, const void *data)
diff --git a/include/hw/intc/loongarch_pch_msi.h 
b/include/hw/intc/loongarch_pch_msi.h
index b8586fb3b6..25f290d81a 100644
--- a/include/hw/intc/loongarch_pch_msi.h
+++ b/include/hw/intc/loongarch_pch_msi.h
@@ -22,4 +22,5 @@ struct LoongArchPCHMSI {
     /* irq base passed to upper extioi intc */
     unsigned int irq_base;
     unsigned int irq_num;
+    bool irqchip_in_kernel;
 };
-- 
2.39.3


Reply via email to