From: Dmytro Terletskyi <[email protected]>

Added support for the "iommus" property for virtio_mmio
in device tree nodes.
The property specifies the SMMU phandle and stream ID.

Signed-off-by: Dmytro Terletskyi <[email protected]>
Signed-off-by: Ruslan Ruslichenko <[email protected]>
---
 hw/arm/virt.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index ad609bc651..ff3eb95036 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -89,6 +89,7 @@
 #include "hw/uefi/var-service-api.h"
 #include "hw/virtio/virtio-md-pci.h"
 #include "hw/virtio/virtio-iommu.h"
+#include "hw/virtio/virtio-mmio.h"
 #include "hw/char/pl011.h"
 #include "hw/cxl/cxl.h"
 #include "hw/cxl/cxl_host.h"
@@ -1178,9 +1179,11 @@ static void create_gpio_devices(const VirtMachineState 
*vms, int gpio,
 static void create_virtio_devices(const VirtMachineState *vms)
 {
     int i;
+    uint32_t stream_ids[NUM_VIRTIO_TRANSPORTS];
     hwaddr size = vms->memmap[VIRT_MMIO].size;
     MachineState *ms = MACHINE(vms);
 
+
     /* We create the transports in forwards order. Since qbus_realize()
      * prepends (not appends) new child buses, the incrementing loop below will
      * create a list of virtio-mmio buses with decreasing base addresses.
@@ -1212,8 +1215,11 @@ static void create_virtio_devices(const VirtMachineState 
*vms)
         int irq = vms->irqmap[VIRT_MMIO] + i;
         hwaddr base = vms->memmap[VIRT_MMIO].base + i * size;
 
-        sysbus_create_simple("virtio-mmio", base,
+        DeviceState* dev = sysbus_create_simple("virtio-mmio", base,
                              qdev_get_gpio_in(vms->gic, irq));
+        
+        VirtIOMMIOProxy *proxy = VIRTIO_MMIO(dev);
+        stream_ids[i] = proxy->stream_id;
     }
 
     /* We add dtb nodes in reverse order so that they appear in the finished
@@ -1238,6 +1244,9 @@ static void create_virtio_devices(const VirtMachineState 
*vms)
                                GIC_FDT_IRQ_TYPE_SPI, irq,
                                GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);
         qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0);
+        qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "iommus",
+                                    1, vms->sysbus_iommu_phandle,
+                                    1, stream_ids[i]);
         g_free(nodename);
     }
 }
-- 
2.43.0


Reply via email to