Commit d45efe47 authored by Eric Auger's avatar Eric Auger Committed by Peter Maydell
Browse files

target/arm/kvm: Let kvm_arm_vgic_probe() return a bitmap



Convert kvm_arm_vgic_probe() so that it returns a
bitmap of supported in-kernel emulation VGIC versions instead
of the max version: at the moment values can be v2 and v3.
This allows to expose the case where the host GICv3 also
supports GICv2 emulation. This will be useful to choose the
default version in KVM accelerated mode.

Signed-off-by: default avatarEric Auger <eric.auger@redhat.com>
Reviewed-by: default avatarAndrew Jones <drjones@redhat.com>
Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
Message-id: 20200311131618.7187-5-eric.auger@redhat.com
Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parent 36bf4ec8
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -1554,11 +1554,18 @@ static void finalize_gic_version(VirtMachineState *vms)
                vms->gic_version = VIRT_GIC_VERSION_3;
            }
        } else {
            vms->gic_version = kvm_arm_vgic_probe();
            if (!vms->gic_version) {
            int probe_bitmap = kvm_arm_vgic_probe();

            if (!probe_bitmap) {
                error_report(
                    "Unable to determine GIC version supported by host");
                exit(1);
            } else {
                if (probe_bitmap & KVM_ARM_VGIC_V3) {
                    vms->gic_version = VIRT_GIC_VERSION_3;
                } else {
                    vms->gic_version = VIRT_GIC_VERSION_2;
                }
            }
        }
    } else if (vms->gic_version == VIRT_GIC_VERSION_NOSEL) {
+8 −6
Original line number Diff line number Diff line
@@ -874,15 +874,17 @@ int kvm_arch_irqchip_create(KVMState *s)

int kvm_arm_vgic_probe(void)
{
    int val = 0;

    if (kvm_create_device(kvm_state,
                          KVM_DEV_TYPE_ARM_VGIC_V3, true) == 0) {
        return 3;
    } else if (kvm_create_device(kvm_state,
        val |= KVM_ARM_VGIC_V3;
    }
    if (kvm_create_device(kvm_state,
                          KVM_DEV_TYPE_ARM_VGIC_V2, true) == 0) {
        return 2;
    } else {
        return 0;
        val |= KVM_ARM_VGIC_V2;
    }
    return val;
}

int kvm_arm_set_irq(int cpu, int irqtype, int irq, int level)
+3 −0
Original line number Diff line number Diff line
@@ -15,6 +15,9 @@
#include "exec/memory.h"
#include "qemu/error-report.h"

#define KVM_ARM_VGIC_V2   (1 << 0)
#define KVM_ARM_VGIC_V3   (1 << 1)

/**
 * kvm_arm_vcpu_init:
 * @cs: CPUState