On Wed, Jul 16, 2025 at 11:54:02AM +0200, Luc Michel wrote:
> Refactor the creation of virtio devices. Use the accessors provided by
> the Versal SoC to retrieve the reserved MMIO and IRQ space. Those are
> defined in the VersalMap structure.
> 
> Signed-off-by: Luc Michel <luc.mic...@amd.com>

Reviewed-by: Francisco Iglesias <francisco.igles...@amd.com>

> ---
>  include/hw/arm/xlnx-versal.h |  3 +++
>  hw/arm/xlnx-versal-virt.c    | 31 ++++++++++++-------------------
>  hw/arm/xlnx-versal.c         | 26 ++++++++++++++++++++++++++
>  3 files changed, 41 insertions(+), 19 deletions(-)
> 
> diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
> index d3ce13e69de..af47acb288f 100644
> --- a/include/hw/arm/xlnx-versal.h
> +++ b/include/hw/arm/xlnx-versal.h
> @@ -100,10 +100,13 @@ void versal_sdhci_plug_card(Versal *s, int sd_idx, 
> BlockBackend *blk);
>  void versal_efuse_attach_drive(Versal *s, BlockBackend *blk);
>  void versal_bbram_attach_drive(Versal *s, BlockBackend *blk);
>  void versal_ospi_create_flash(Versal *s, int flash_idx, const char 
> *flash_mdl,
>                                BlockBackend *blk);
>  
> +qemu_irq versal_get_reserved_irq(Versal *s, int idx, int *dtb_idx);
> +hwaddr versal_get_reserved_mmio_addr(Versal *s);
> +
>  int versal_get_num_can(VersalVersion version);
>  int versal_get_num_sdhci(VersalVersion version);
>  
>  /* Memory-map and IRQ definitions. Copied a subset from
>   * auto-generated files.  */
> diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
> index 01c230491df..a776ee87088 100644
> --- a/hw/arm/xlnx-versal-virt.c
> +++ b/hw/arm/xlnx-versal-virt.c
> @@ -269,41 +269,34 @@ static void create_virtio_regions(VersalVirt *s)
>  {
>      int virtio_mmio_size = 0x200;
>      int i;
>  
>      for (i = 0; i < NUM_VIRTIO_TRANSPORT; i++) {
> -        char *name = g_strdup_printf("virtio%d", i);
> -        hwaddr base = MM_TOP_RSVD + i * virtio_mmio_size;
> -        int irq = VERSAL_RSVD_IRQ_FIRST + i;
> +        hwaddr base = versal_get_reserved_mmio_addr(&s->soc)
> +            + i * virtio_mmio_size;
> +        g_autofree char *node = g_strdup_printf("/virtio_mmio@%" PRIx64, 
> base);
> +        int dtb_irq;
>          MemoryRegion *mr;
>          DeviceState *dev;
>          qemu_irq pic_irq;
>  
> -        pic_irq = qdev_get_gpio_in(DEVICE(&s->soc.fpd.apu.gic), irq);
> +        pic_irq = versal_get_reserved_irq(&s->soc, i, &dtb_irq);
>          dev = qdev_new("virtio-mmio");
> -        object_property_add_child(OBJECT(&s->soc), name, OBJECT(dev));
> +        object_property_add_child(OBJECT(s), "virtio-mmio[*]", OBJECT(dev));
>          sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
>          sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic_irq);
>          mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
>          memory_region_add_subregion(&s->soc.mr_ps, base, mr);
> -        g_free(name);
> -    }
>  
> -    for (i = 0; i < NUM_VIRTIO_TRANSPORT; i++) {
> -        hwaddr base = MM_TOP_RSVD + i * virtio_mmio_size;
> -        int irq = VERSAL_RSVD_IRQ_FIRST + i;
> -        char *name = g_strdup_printf("/virtio_mmio@%" PRIx64, base);
> -
> -        qemu_fdt_add_subnode(s->fdt, name);
> -        qemu_fdt_setprop(s->fdt, name, "dma-coherent", NULL, 0);
> -        qemu_fdt_setprop_cells(s->fdt, name, "interrupts",
> -                               GIC_FDT_IRQ_TYPE_SPI, irq,
> +        qemu_fdt_add_subnode(s->fdt, node);
> +        qemu_fdt_setprop(s->fdt, node, "dma-coherent", NULL, 0);
> +        qemu_fdt_setprop_cells(s->fdt, node, "interrupts",
> +                               GIC_FDT_IRQ_TYPE_SPI, dtb_irq,
>                                 GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);
> -        qemu_fdt_setprop_sized_cells(s->fdt, name, "reg",
> +        qemu_fdt_setprop_sized_cells(s->fdt, node, "reg",
>                                       2, base, 2, virtio_mmio_size);
> -        qemu_fdt_setprop_string(s->fdt, name, "compatible", "virtio,mmio");
> -        g_free(name);
> +        qemu_fdt_setprop_string(s->fdt, node, "compatible", "virtio,mmio");
>      }
>  }
>  
>  static void bbram_attach_drive(VersalVirt *s)
>  {
> diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
> index ff55ec62301..fe2c789a557 100644
> --- a/hw/arm/xlnx-versal.c
> +++ b/hw/arm/xlnx-versal.c
> @@ -152,10 +152,17 @@ typedef struct VersalMap {
>              uint32_t blktype_frames[7];
>          } cframe_cfg[15];
>      } cfu;
>  
>      VersalSimplePeriphMap crl;
> +
> +    /* reserved MMIO/IRQ space that can safely be used for virtio devices */
> +    struct VersalReserved {
> +        uint64_t mmio_start;
> +        int irq_start;
> +        int irq_num;
> +    } reserved;
>  } VersalMap;
>  
>  static const VersalMap VERSAL_MAP = {
>      .uart[0] = { 0xff000000, 18 },
>      .uart[1] = { 0xff010000, 19 },
> @@ -218,10 +225,12 @@ static const VersalMap VERSAL_MAP = {
>              { { 38498, 3841, 15361, 13, 7, 3, 1 } },
>          },
>      },
>  
>      .crl = { 0xff5e0000, 10 },
> +
> +    .reserved = { 0xa0000000, 111, 8 },
>  };
>  
>  static const VersalMap *VERSION_TO_MAP[] = {
>      [VERSAL_VER_VERSAL] = &VERSAL_MAP,
>  };
> @@ -1411,10 +1420,27 @@ void versal_ospi_create_flash(Versal *s, int 
> flash_idx, const char *flash_mdl,
>  
>      sysbus_connect_irq(SYS_BUS_DEVICE(ospi),
>                         flash_idx + 1, cs_line);
>  }
>  
> +qemu_irq versal_get_reserved_irq(Versal *s, int idx, int *dtb_idx)
> +{
> +    const VersalMap *map = versal_get_map(s);
> +
> +    g_assert(idx < map->reserved.irq_num);
> +
> +    *dtb_idx = map->reserved.irq_start + idx;
> +    return versal_get_irq(s, *dtb_idx);
> +}
> +
> +hwaddr versal_get_reserved_mmio_addr(Versal *s)
> +{
> +    const VersalMap *map = versal_get_map(s);
> +
> +    return map->reserved.mmio_start;
> +}
> +
>  int versal_get_num_can(VersalVersion version)
>  {
>      const VersalMap *map = VERSION_TO_MAP[version];
>  
>      return map->num_canfd;
> -- 
> 2.50.0
> 

Reply via email to