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