mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
hw/arm/xlnx-versal-virt: virtio: refactor creation
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.michel@amd.com> Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com> Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com> Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-id: 20250926070806.292065-20-luc.michel@amd.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
committed by
Peter Maydell
parent
aaf889ebdc
commit
e17df66076
+12
-19
@@ -271,37 +271,30 @@ static void create_virtio_regions(VersalVirt *s)
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -154,6 +154,13 @@ typedef struct VersalMap {
|
||||
} 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 = {
|
||||
@@ -220,6 +227,8 @@ static const VersalMap VERSAL_MAP = {
|
||||
},
|
||||
|
||||
.crl = { 0xff5e0000, 10 },
|
||||
|
||||
.reserved = { 0xa0000000, 111, 8 },
|
||||
};
|
||||
|
||||
static const VersalMap *VERSION_TO_MAP[] = {
|
||||
@@ -1422,6 +1431,23 @@ void versal_ospi_create_flash(Versal *s, int flash_idx, const char *flash_mdl,
|
||||
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];
|
||||
|
||||
@@ -102,6 +102,9 @@ 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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user