Skip to content

Commit

Permalink
hw/arm/virt: Introduce VirtGICType enum type
Browse files Browse the repository at this point in the history
We plan to introduce yet another value for the gic version (nosel).
As we already use exotic values such as 0 and -1, let's introduce
a dedicated enum type and let vms->gic_version take this
type.

Signed-off-by: Eric Auger <[email protected]>
Reviewed-by: Richard Henderson <[email protected]>
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Reviewed-by: Andrew Jones <[email protected]>
Message-id: [email protected]
Signed-off-by: Peter Maydell <[email protected]>
  • Loading branch information
eauger authored and pm215 committed Mar 12, 2020
1 parent 71b296d commit d04460e
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 17 deletions.
30 changes: 15 additions & 15 deletions hw/arm/virt.c
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ static void fdt_add_timer_nodes(const VirtMachineState *vms)
irqflags = GIC_FDT_IRQ_FLAGS_EDGE_LO_HI;
}

if (vms->gic_version == 2) {
if (vms->gic_version == VIRT_GIC_VERSION_2) {
irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
GIC_FDT_IRQ_PPI_CPU_WIDTH,
(1 << vms->smp_cpus) - 1);
Expand Down Expand Up @@ -440,7 +440,7 @@ static void fdt_add_gic_node(VirtMachineState *vms)
qemu_fdt_setprop_cell(vms->fdt, nodename, "#address-cells", 0x2);
qemu_fdt_setprop_cell(vms->fdt, nodename, "#size-cells", 0x2);
qemu_fdt_setprop(vms->fdt, nodename, "ranges", NULL, 0);
if (vms->gic_version == 3) {
if (vms->gic_version == VIRT_GIC_VERSION_3) {
int nb_redist_regions = virt_gicv3_redist_region_count(vms);

qemu_fdt_setprop_string(vms->fdt, nodename, "compatible",
Expand Down Expand Up @@ -519,7 +519,7 @@ static void fdt_add_pmu_nodes(const VirtMachineState *vms)
}
}

if (vms->gic_version == 2) {
if (vms->gic_version == VIRT_GIC_VERSION_2) {
irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
GIC_FDT_IRQ_PPI_CPU_WIDTH,
(1 << vms->smp_cpus) - 1);
Expand Down Expand Up @@ -1470,7 +1470,7 @@ static uint64_t virt_cpu_mp_affinity(VirtMachineState *vms, int idx)
* purposes are to make TCG consistent (with 64-bit KVM hosts)
* and to improve SGI efficiency.
*/
if (vms->gic_version == 3) {
if (vms->gic_version == VIRT_GIC_VERSION_3) {
clustersz = GICV3_TARGETLIST_BITS;
} else {
clustersz = GIC_TARGETLIST_BITS;
Expand Down Expand Up @@ -1561,15 +1561,15 @@ static void machvirt_init(MachineState *machine)
/* We can probe only here because during property set
* KVM is not available yet
*/
if (vms->gic_version <= 0) {
/* "host" or "max" */
if (vms->gic_version == VIRT_GIC_VERSION_HOST ||
vms->gic_version == VIRT_GIC_VERSION_MAX) {
if (!kvm_enabled()) {
if (vms->gic_version == 0) {
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 = 3;
vms->gic_version = VIRT_GIC_VERSION_3;
}
} else {
vms->gic_version = kvm_arm_vgic_probe();
Expand Down Expand Up @@ -1628,7 +1628,7 @@ static void machvirt_init(MachineState *machine)
/* The maximum number of CPUs depends on the GIC version, or on how
* many redistributors we can fit into the memory map.
*/
if (vms->gic_version == 3) {
if (vms->gic_version == VIRT_GIC_VERSION_3) {
virt_max_cpus =
vms->memmap[VIRT_GIC_REDIST].size / GICV3_REDIST_SIZE;
virt_max_cpus +=
Expand Down Expand Up @@ -1856,7 +1856,7 @@ static void virt_set_its(Object *obj, bool value, Error **errp)
static char *virt_get_gic_version(Object *obj, Error **errp)
{
VirtMachineState *vms = VIRT_MACHINE(obj);
const char *val = vms->gic_version == 3 ? "3" : "2";
const char *val = vms->gic_version == VIRT_GIC_VERSION_3 ? "3" : "2";

return g_strdup(val);
}
Expand All @@ -1866,13 +1866,13 @@ static void virt_set_gic_version(Object *obj, const char *value, Error **errp)
VirtMachineState *vms = VIRT_MACHINE(obj);

if (!strcmp(value, "3")) {
vms->gic_version = 3;
vms->gic_version = VIRT_GIC_VERSION_3;
} else if (!strcmp(value, "2")) {
vms->gic_version = 2;
vms->gic_version = VIRT_GIC_VERSION_2;
} else if (!strcmp(value, "host")) {
vms->gic_version = 0; /* Will probe later */
vms->gic_version = VIRT_GIC_VERSION_HOST; /* Will probe later */
} else if (!strcmp(value, "max")) {
vms->gic_version = -1; /* Will probe later */
vms->gic_version = VIRT_GIC_VERSION_MAX; /* Will probe later */
} else {
error_setg(errp, "Invalid gic-version value");
error_append_hint(errp, "Valid values are 3, 2, host, max.\n");
Expand Down Expand Up @@ -2141,7 +2141,7 @@ static void virt_instance_init(Object *obj)
"physical address space above 32 bits",
NULL);
/* Default GIC type is v2 */
vms->gic_version = 2;
vms->gic_version = VIRT_GIC_VERSION_2;
object_property_add_str(obj, "gic-version", virt_get_gic_version,
virt_set_gic_version, NULL);
object_property_set_description(obj, "gic-version",
Expand Down
11 changes: 9 additions & 2 deletions include/hw/arm/virt.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,13 @@ typedef enum VirtIOMMUType {
VIRT_IOMMU_VIRTIO,
} VirtIOMMUType;

typedef enum VirtGICType {
VIRT_GIC_VERSION_MAX,
VIRT_GIC_VERSION_HOST,
VIRT_GIC_VERSION_2,
VIRT_GIC_VERSION_3,
} VirtGICType;

typedef struct MemMapEntry {
hwaddr base;
hwaddr size;
Expand Down Expand Up @@ -123,7 +130,7 @@ typedef struct {
bool highmem_ecam;
bool its;
bool virt;
int32_t gic_version;
VirtGICType gic_version;
VirtIOMMUType iommu;
uint16_t virtio_iommu_bdf;
struct arm_boot_info bootinfo;
Expand Down Expand Up @@ -162,7 +169,7 @@ static inline int virt_gicv3_redist_region_count(VirtMachineState *vms)
uint32_t redist0_capacity =
vms->memmap[VIRT_GIC_REDIST].size / GICV3_REDIST_SIZE;

assert(vms->gic_version == 3);
assert(vms->gic_version == VIRT_GIC_VERSION_3);

return vms->smp_cpus > redist0_capacity ? 2 : 1;
}
Expand Down

0 comments on commit d04460e

Please sign in to comment.