Function kvm_loongarch_ipi_realize() is added if irqchip-in-kernel property is enabled. It is to notify KVM kernel to create IPI device in kernel mode.
Signed-off-by: Bibo Mao <maob...@loongson.cn> --- hw/intc/loongarch_ipi.c | 4 ++++ hw/intc/loongarch_ipi_kvm.c | 27 +++++++++++++++++++++++++++ hw/intc/meson.build | 2 ++ include/hw/intc/loongarch_ipi.h | 3 +++ 4 files changed, 36 insertions(+) create mode 100644 hw/intc/loongarch_ipi_kvm.c diff --git a/hw/intc/loongarch_ipi.c b/hw/intc/loongarch_ipi.c index 64e0250958..5e240382ad 100644 --- a/hw/intc/loongarch_ipi.c +++ b/hw/intc/loongarch_ipi.c @@ -98,6 +98,10 @@ static void loongarch_ipi_realize(DeviceState *dev, Error **errp) lics->cpu[i].ipi = lics; qdev_init_gpio_out(dev, &lics->cpu[i].irq, 1); } + + if (kvm_enabled() && lis->irqchip_in_kernel) { + kvm_loongarch_ipi_realize(dev, errp); + } } static void loongarch_ipi_reset_hold(Object *obj, ResetType type) diff --git a/hw/intc/loongarch_ipi_kvm.c b/hw/intc/loongarch_ipi_kvm.c new file mode 100644 index 0000000000..e8fcd3bd2f --- /dev/null +++ b/hw/intc/loongarch_ipi_kvm.c @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * LoongArch IPI interrupt KVM support + * + * Copyright (C) 2025 Loongson Technology Corporation Limited + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "hw/intc/loongarch_ipi.h" +#include "system/kvm.h" +#include "target/loongarch/cpu.h" + +void kvm_loongarch_ipi_realize(DeviceState *dev, Error **errp) +{ + LoongarchIPIState *lis = LOONGARCH_IPI(dev); + int ret; + + ret = kvm_create_device(kvm_state, KVM_DEV_TYPE_LOONGARCH_IPI, false); + if (ret < 0) { + fprintf(stderr, "IPI KVM_CREATE_DEVICE failed: %s\n", + strerror(-ret)); + abort(); + } + + lis->dev_fd = ret; +} diff --git a/hw/intc/meson.build b/hw/intc/meson.build index 70e7548c52..1cc999771d 100644 --- a/hw/intc/meson.build +++ b/hw/intc/meson.build @@ -71,6 +71,8 @@ specific_ss.add(when: 'CONFIG_M68K_IRQC', if_true: files('m68k_irqc.c')) specific_ss.add(when: 'CONFIG_LOONGSON_IPI_COMMON', if_true: files('loongson_ipi_common.c')) specific_ss.add(when: 'CONFIG_LOONGSON_IPI', if_true: files('loongson_ipi.c')) specific_ss.add(when: 'CONFIG_LOONGARCH_IPI', if_true: files('loongarch_ipi.c')) +specific_ss.add(when: ['CONFIG_KVM', 'CONFIG_LOONGARCH_IPI'], + if_true: files('loongarch_ipi_kvm.c')) specific_ss.add(when: 'CONFIG_LOONGARCH_PCH_PIC', if_true: files('loongarch_pch_pic.c', 'loongarch_pic_common.c')) specific_ss.add(when: 'CONFIG_LOONGARCH_PCH_MSI', if_true: files('loongarch_pch_msi.c')) specific_ss.add(when: 'CONFIG_LOONGARCH_EXTIOI', if_true: files('loongarch_extioi.c', 'loongarch_extioi_common.c')) diff --git a/include/hw/intc/loongarch_ipi.h b/include/hw/intc/loongarch_ipi.h index d4eebd9a4d..26076d8062 100644 --- a/include/hw/intc/loongarch_ipi.h +++ b/include/hw/intc/loongarch_ipi.h @@ -17,6 +17,7 @@ OBJECT_DECLARE_TYPE(LoongarchIPIState, LoongarchIPIClass, LOONGARCH_IPI) struct LoongarchIPIState { LoongsonIPICommonState parent_obj; bool irqchip_in_kernel; + int dev_fd; }; struct LoongarchIPIClass { @@ -25,4 +26,6 @@ struct LoongarchIPIClass { ResettablePhases parent_phases; }; +void kvm_loongarch_ipi_realize(DeviceState *dev, Error **errp); + #endif -- 2.39.3