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

hw/arm/virt: Introduce finalize_gic_version()



Let's move the code which freezes which gic-version to
be applied in a dedicated function. We also now set by
default the VIRT_GIC_VERSION_NO_SET. This eventually
turns into the legacy v2 choice in the finalize() function.

Signed-off-by: default avatarEric Auger <eric.auger@redhat.com>
Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
Reviewed-by: default avatarAndrew Jones <drjones@redhat.com>
Message-id: 20200311131618.7187-4-eric.auger@redhat.com
Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parent d04460e5
Loading
Loading
Loading
Loading
+33 −21
Original line number Diff line number Diff line
@@ -1535,6 +1535,37 @@ static void virt_set_memmap(VirtMachineState *vms)
    }
}

/*
 * finalize_gic_version - Determines the final gic_version
 * according to the gic-version property
 *
 * Default GIC type is v2
 */
static void finalize_gic_version(VirtMachineState *vms)
{
    if (vms->gic_version == VIRT_GIC_VERSION_HOST ||
        vms->gic_version == VIRT_GIC_VERSION_MAX) {
        if (!kvm_enabled()) {
            if (vms->gic_version == VIRT_GIC_VERSION_HOST) {
                error_report("gic-version=host requires KVM");
                exit(1);
            } else {
                /* "max": currently means 3 for TCG */
                vms->gic_version = VIRT_GIC_VERSION_3;
            }
        } else {
            vms->gic_version = kvm_arm_vgic_probe();
            if (!vms->gic_version) {
                error_report(
                    "Unable to determine GIC version supported by host");
                exit(1);
            }
        }
    } else if (vms->gic_version == VIRT_GIC_VERSION_NOSEL) {
        vms->gic_version = VIRT_GIC_VERSION_2;
    }
}

static void machvirt_init(MachineState *machine)
{
    VirtMachineState *vms = VIRT_MACHINE(machine);
@@ -1561,25 +1592,7 @@ static void machvirt_init(MachineState *machine)
    /* We can probe only here because during property set
     * KVM is not available yet
     */
    if (vms->gic_version == VIRT_GIC_VERSION_HOST ||
        vms->gic_version == VIRT_GIC_VERSION_MAX) {
        if (!kvm_enabled()) {
            if (vms->gic_version == VIRT_GIC_VERSION_HOST) {
                error_report("gic-version=host requires KVM");
                exit(1);
            } else {
                /* "max": currently means 3 for TCG */
                vms->gic_version = VIRT_GIC_VERSION_3;
            }
        } else {
            vms->gic_version = kvm_arm_vgic_probe();
            if (!vms->gic_version) {
                error_report(
                    "Unable to determine GIC version supported by host");
                exit(1);
            }
        }
    }
    finalize_gic_version(vms);

    if (!cpu_type_valid(machine->cpu_type)) {
        error_report("mach-virt: CPU type %s not supported", machine->cpu_type);
@@ -2140,8 +2153,7 @@ static void virt_instance_init(Object *obj)
                                    "Set on/off to enable/disable using "
                                    "physical address space above 32 bits",
                                    NULL);
    /* Default GIC type is v2 */
    vms->gic_version = VIRT_GIC_VERSION_2;
    vms->gic_version = VIRT_GIC_VERSION_NOSEL;
    object_property_add_str(obj, "gic-version", virt_get_gic_version,
                        virt_set_gic_version, NULL);
    object_property_set_description(obj, "gic-version",
+1 −0
Original line number Diff line number Diff line
@@ -100,6 +100,7 @@ typedef enum VirtGICType {
    VIRT_GIC_VERSION_HOST,
    VIRT_GIC_VERSION_2,
    VIRT_GIC_VERSION_3,
    VIRT_GIC_VERSION_NOSEL,
} VirtGICType;

typedef struct MemMapEntry {