mirror of https://github.com/xemu-project/xemu.git
hw/intc/arm_gicv3: Move checking of redist-region-count to arm_gicv3_common_realize
The GICv3 devices have an array property redist-region-count. Currently we check this for errors (bad values) in gicv3_init_irqs_and_mmio(), just before we use it. Move this error checking to the arm_gicv3_common_realize() function, where we sanity-check all of the other base-class properties. (This will always be before gicv3_init_irqs_and_mmio() is called, because that function is called in the subclass realize methods, after they have called the parent-class realize.) The motivation for this refactor is: * we would like to use the redist_region_count[] values in arm_gicv3_common_realize() in a subsequent patch, so we need to have already done the sanity-checking first * this removes the only use of the Error** argument to gicv3_init_irqs_and_mmio(), so we can remove some error-handling boilerplate Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
42f6c9179b
commit
01b5ab8cc0
|
@ -393,11 +393,7 @@ static void arm_gic_realize(DeviceState *dev, Error **errp)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
gicv3_init_irqs_and_mmio(s, gicv3_set_irq, gic_ops, &local_err);
|
gicv3_init_irqs_and_mmio(s, gicv3_set_irq, gic_ops);
|
||||||
if (local_err) {
|
|
||||||
error_propagate(errp, local_err);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gicv3_init_cpuif(s);
|
gicv3_init_cpuif(s);
|
||||||
}
|
}
|
||||||
|
|
|
@ -250,22 +250,11 @@ static const VMStateDescription vmstate_gicv3 = {
|
||||||
};
|
};
|
||||||
|
|
||||||
void gicv3_init_irqs_and_mmio(GICv3State *s, qemu_irq_handler handler,
|
void gicv3_init_irqs_and_mmio(GICv3State *s, qemu_irq_handler handler,
|
||||||
const MemoryRegionOps *ops, Error **errp)
|
const MemoryRegionOps *ops)
|
||||||
{
|
{
|
||||||
SysBusDevice *sbd = SYS_BUS_DEVICE(s);
|
SysBusDevice *sbd = SYS_BUS_DEVICE(s);
|
||||||
int rdist_capacity = 0;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < s->nb_redist_regions; i++) {
|
|
||||||
rdist_capacity += s->redist_region_count[i];
|
|
||||||
}
|
|
||||||
if (rdist_capacity < s->num_cpu) {
|
|
||||||
error_setg(errp, "Capacity of the redist regions(%d) "
|
|
||||||
"is less than number of vcpus(%d)",
|
|
||||||
rdist_capacity, s->num_cpu);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* For the GIC, also expose incoming GPIO lines for PPIs for each CPU.
|
/* For the GIC, also expose incoming GPIO lines for PPIs for each CPU.
|
||||||
* GPIO array layout is thus:
|
* GPIO array layout is thus:
|
||||||
* [0..N-1] spi
|
* [0..N-1] spi
|
||||||
|
@ -308,7 +297,7 @@ void gicv3_init_irqs_and_mmio(GICv3State *s, qemu_irq_handler handler,
|
||||||
static void arm_gicv3_common_realize(DeviceState *dev, Error **errp)
|
static void arm_gicv3_common_realize(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
GICv3State *s = ARM_GICV3_COMMON(dev);
|
GICv3State *s = ARM_GICV3_COMMON(dev);
|
||||||
int i;
|
int i, rdist_capacity;
|
||||||
|
|
||||||
/* revision property is actually reserved and currently used only in order
|
/* revision property is actually reserved and currently used only in order
|
||||||
* to keep the interface compatible with GICv2 code, avoiding extra
|
* to keep the interface compatible with GICv2 code, avoiding extra
|
||||||
|
@ -350,6 +339,17 @@ static void arm_gicv3_common_realize(DeviceState *dev, Error **errp)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rdist_capacity = 0;
|
||||||
|
for (i = 0; i < s->nb_redist_regions; i++) {
|
||||||
|
rdist_capacity += s->redist_region_count[i];
|
||||||
|
}
|
||||||
|
if (rdist_capacity < s->num_cpu) {
|
||||||
|
error_setg(errp, "Capacity of the redist regions(%d) "
|
||||||
|
"is less than number of vcpus(%d)",
|
||||||
|
rdist_capacity, s->num_cpu);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
s->cpu = g_new0(GICv3CPUState, s->num_cpu);
|
s->cpu = g_new0(GICv3CPUState, s->num_cpu);
|
||||||
|
|
||||||
for (i = 0; i < s->num_cpu; i++) {
|
for (i = 0; i < s->num_cpu; i++) {
|
||||||
|
|
|
@ -787,11 +787,7 @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
gicv3_init_irqs_and_mmio(s, kvm_arm_gicv3_set_irq, NULL, &local_err);
|
gicv3_init_irqs_and_mmio(s, kvm_arm_gicv3_set_irq, NULL);
|
||||||
if (local_err) {
|
|
||||||
error_propagate(errp, local_err);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < s->num_cpu; i++) {
|
for (i = 0; i < s->num_cpu; i++) {
|
||||||
ARMCPU *cpu = ARM_CPU(qemu_get_cpu(i));
|
ARMCPU *cpu = ARM_CPU(qemu_get_cpu(i));
|
||||||
|
|
|
@ -306,6 +306,6 @@ struct ARMGICv3CommonClass {
|
||||||
};
|
};
|
||||||
|
|
||||||
void gicv3_init_irqs_and_mmio(GICv3State *s, qemu_irq_handler handler,
|
void gicv3_init_irqs_and_mmio(GICv3State *s, qemu_irq_handler handler,
|
||||||
const MemoryRegionOps *ops, Error **errp);
|
const MemoryRegionOps *ops);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue