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: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Message-id: 20200311131618.7187-4-eric.auger@redhat.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Eric Auger 2020-03-11 14:16:15 +01:00 committed by Peter Maydell
parent d04460e587
commit 36bf4ec8c8
2 changed files with 34 additions and 21 deletions

View File

@ -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) static void machvirt_init(MachineState *machine)
{ {
VirtMachineState *vms = VIRT_MACHINE(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 /* We can probe only here because during property set
* KVM is not available yet * KVM is not available yet
*/ */
if (vms->gic_version == VIRT_GIC_VERSION_HOST || finalize_gic_version(vms);
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);
}
}
}
if (!cpu_type_valid(machine->cpu_type)) { if (!cpu_type_valid(machine->cpu_type)) {
error_report("mach-virt: CPU type %s not supported", 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 " "Set on/off to enable/disable using "
"physical address space above 32 bits", "physical address space above 32 bits",
NULL); NULL);
/* Default GIC type is v2 */ vms->gic_version = VIRT_GIC_VERSION_NOSEL;
vms->gic_version = VIRT_GIC_VERSION_2;
object_property_add_str(obj, "gic-version", virt_get_gic_version, object_property_add_str(obj, "gic-version", virt_get_gic_version,
virt_set_gic_version, NULL); virt_set_gic_version, NULL);
object_property_set_description(obj, "gic-version", object_property_set_description(obj, "gic-version",

View File

@ -100,6 +100,7 @@ typedef enum VirtGICType {
VIRT_GIC_VERSION_HOST, VIRT_GIC_VERSION_HOST,
VIRT_GIC_VERSION_2, VIRT_GIC_VERSION_2,
VIRT_GIC_VERSION_3, VIRT_GIC_VERSION_3,
VIRT_GIC_VERSION_NOSEL,
} VirtGICType; } VirtGICType;
typedef struct MemMapEntry { typedef struct MemMapEntry {