diff options
author | Bibo Mao <maobibo@loongson.cn> | 2025-02-17 09:56:13 +0800 |
---|---|---|
committer | Bibo Mao <maobibo@loongson.cn> | 2025-02-25 16:05:31 +0800 |
commit | db369c11c90b35f3a6ab59ad78564aea5b30c3da (patch) | |
tree | 6e420a1c1acd5edafa3f89b4b945ece9cd933715 | |
parent | 954cc5c311cd4459ce16a3302ff8611d98473d7d (diff) | |
download | qemu-db369c11c90b35f3a6ab59ad78564aea5b30c3da.zip qemu-db369c11c90b35f3a6ab59ad78564aea5b30c3da.tar.gz qemu-db369c11c90b35f3a6ab59ad78564aea5b30c3da.tar.bz2 |
target/loongarch: Enable virtual extioi feature
Feature virtual extioi is loongArch virt machine property rather than
vCPU property in qemu side. However it is vCPU property in KVM kernel
side, here add loongArch virt machine property checking and enable virt
extioi feature when vCPU is created.
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
-rw-r--r-- | hw/loongarch/virt.c | 8 | ||||
-rw-r--r-- | include/hw/loongarch/virt.h | 9 | ||||
-rw-r--r-- | target/loongarch/kvm/kvm.c | 10 |
3 files changed, 19 insertions, 8 deletions
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c index f2aa0a9..59533b0 100644 --- a/hw/loongarch/virt.c +++ b/hw/loongarch/virt.c @@ -45,14 +45,6 @@ #include "hw/virtio/virtio-iommu.h" #include "qemu/error-report.h" -static bool virt_is_veiointc_enabled(LoongArchVirtMachineState *lvms) -{ - if (lvms->veiointc == ON_OFF_AUTO_OFF) { - return false; - } - return true; -} - static void virt_get_veiointc(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h index 661efae..2e7cdfa 100644 --- a/include/hw/loongarch/virt.h +++ b/include/hw/loongarch/virt.h @@ -68,4 +68,13 @@ struct LoongArchVirtMachineState { OBJECT_DECLARE_SIMPLE_TYPE(LoongArchVirtMachineState, LOONGARCH_VIRT_MACHINE) void virt_acpi_setup(LoongArchVirtMachineState *lvms); void virt_fdt_setup(LoongArchVirtMachineState *lvms); + +static inline bool virt_is_veiointc_enabled(LoongArchVirtMachineState *lvms) +{ + if (lvms->veiointc == ON_OFF_AUTO_OFF) { + return false; + } + return true; +} + #endif diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c index 59a5f84..28735c8 100644 --- a/target/loongarch/kvm/kvm.c +++ b/target/loongarch/kvm/kvm.c @@ -21,6 +21,7 @@ #include "exec/address-spaces.h" #include "hw/boards.h" #include "hw/irq.h" +#include "hw/loongarch/virt.h" #include "qemu/log.h" #include "hw/loader.h" #include "system/runstate.h" @@ -1030,6 +1031,7 @@ static int kvm_cpu_check_pmu(CPUState *cs, Error **errp) static int kvm_cpu_check_pv_features(CPUState *cs, Error **errp) { + MachineState *ms = MACHINE(qdev_get_machine()); LoongArchCPU *cpu = LOONGARCH_CPU(cs); CPULoongArchState *env = cpu_env(cs); bool kvm_supported; @@ -1062,6 +1064,14 @@ static int kvm_cpu_check_pv_features(CPUState *cs, Error **errp) env->pv_features |= BIT(KVM_FEATURE_STEAL_TIME); } + if (object_dynamic_cast(OBJECT(ms), TYPE_LOONGARCH_VIRT_MACHINE)) { + LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms); + + if (virt_is_veiointc_enabled(lvms)) { + env->pv_features |= BIT(KVM_FEATURE_VIRT_EXTIOI); + } + } + return 0; } |