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