[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-arm] [RFC v2 7/7] hw/arm/virt: Register two redistributor regi
From: |
Peter Maydell |
Subject: |
Re: [Qemu-arm] [RFC v2 7/7] hw/arm/virt: Register two redistributor regions when necessary |
Date: |
Tue, 22 May 2018 13:43:07 +0100 |
On 13 May 2018 at 15:35, Eric Auger <address@hidden> wrote:
> With a VGICv3 KVM device, if the number of vcpus exceeds the
> capacity of the legacy redistributor region (123 redistributors),
> we now attempt to register the second redistributor region. This
> extends the number of vcpus to 512 assuming the host kernel supports:
> - up to 512 vcpus
> - VGICv3 KVM device group/attribute:
> KVM_DEV_ARM_VGIC_GRP_ADDR/KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION
>
> In case the host kernel does not support the registration of several
> redistributor regions, the GICv3 device initialization fails
> with a proper error message and qemu exits.
>
> Signed-off-by: Eric Auger <address@hidden>
> ---
> hw/arm/virt.c | 15 ++++++++++++++-
> 1 file changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index f35962a..8d43c51 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -531,6 +531,7 @@ static void create_gic(VirtMachineState *vms, qemu_irq
> *pic)
> SysBusDevice *gicbusdev;
> const char *gictype;
> int type = vms->gic_version, i;
> + uint32_t nb_redist_regions = 0;
>
> gictype = (type == 3) ? gicv3_class_name() : gic_class_name();
>
> @@ -546,15 +547,26 @@ static void create_gic(VirtMachineState *vms, qemu_irq
> *pic)
> }
>
> if (type == 3) {
> - qdev_prop_set_uint32(gicdev, "len-redist-region-count", 1);
> + nb_redist_regions = virt_gicv3_redist_region_count(vms);
> +
> + qdev_prop_set_uint32(gicdev, "len-redist-region-count",
> + nb_redist_regions);
> qdev_prop_set_uint32(gicdev , "redist-region-count[0]",
> vms->memmap[VIRT_GIC_REDIST].size / 0x20000);
> +
> + if (nb_redist_regions == 2) {
> + qdev_prop_set_uint32(gicdev , "redist-region-count[1]",
Stray extra space before comma.
> + vms->memmap[VIRT_GIC_REDIST2].size /
> 0x20000);
This is going to ask for more redistributors than we want (cf
earlier review comment).
> + }
> }
> qdev_init_nofail(gicdev);
> gicbusdev = SYS_BUS_DEVICE(gicdev);
> sysbus_mmio_map(gicbusdev, 0, vms->memmap[VIRT_GIC_DIST].base);
> if (type == 3) {
> sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_REDIST].base);
> + if (nb_redist_regions == 2) {
> + sysbus_mmio_map(gicbusdev, 2,
> vms->memmap[VIRT_GIC_REDIST2].base);
> + }
> } else {
> sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_CPU].base);
> }
> @@ -1346,6 +1358,7 @@ static void machvirt_init(MachineState *machine)
> */
> if (vms->gic_version == 3) {
> virt_max_cpus = vms->memmap[VIRT_GIC_REDIST].size / 0x20000;
> + virt_max_cpus += vms->memmap[VIRT_GIC_REDIST2].size / 0x20000;
Slight pity that we can't determine whether we can support multiple
redistributor regions here, but I guess it's not a big deal.
> } else {
> virt_max_cpus = GIC_NCPU;
> }
> --
> 2.5.5
thanks
-- PMM
- Re: [Qemu-arm] [RFC v2 3/7] hw/intc/arm_gicv3: Introduce redist-region-count array property, (continued)
[Qemu-arm] [RFC v2 1/7] linux-headers: Partial update for KVM/ARM multiple redistributor region registration, Eric Auger, 2018/05/13
[Qemu-arm] [RFC v2 4/7] hw/intc/arm_gicv3_kvm: Get prepared to handle multiple redist regions, Eric Auger, 2018/05/13
[Qemu-arm] [RFC v2 5/7] hw/arm/virt: GICv3 DT node with one or two redistributor regions, Eric Auger, 2018/05/13
[Qemu-arm] [RFC v2 6/7] hw/arm/virt-acpi-build: Advertise one or two GICR structures, Eric Auger, 2018/05/13
[Qemu-arm] [RFC v2 7/7] hw/arm/virt: Register two redistributor regions when necessary, Eric Auger, 2018/05/13
- Re: [Qemu-arm] [RFC v2 7/7] hw/arm/virt: Register two redistributor regions when necessary,
Peter Maydell <=