>-----Original Message-----
>From: Eric Auger <eric.au...@redhat.com>
>Subject: [PATCH v5 2/3] virtio-iommu: Add a granule property
>
>This allows to choose which granule will be used by
>default by the virtio-iommu. Current page size mask
>default is qemu_target_page_mask so this translates
>into a 4K granule.
>
>Signed-off-by: Eric Auger <eric.au...@redhat.com>

Reviewed-by: Zhenzhong Duan <zhenzhong.d...@intel.com>

Thanks
Zhenzhong

>
>---
>v4 -> v5:
>- use -(n * KiB) (Phild)
>
>v3 -> v4:
>- granule_mode introduction moved to that patch
>---
> include/hw/virtio/virtio-iommu.h |  2 ++
> hw/virtio/virtio-iommu.c         | 28 +++++++++++++++++++++++++---
> qemu-options.hx                  |  3 +++
> 3 files changed, 30 insertions(+), 3 deletions(-)
>
>diff --git a/include/hw/virtio/virtio-iommu.h b/include/hw/virtio/virtio-
>iommu.h
>index 5fbe4677c2..f2785f7997 100644
>--- a/include/hw/virtio/virtio-iommu.h
>+++ b/include/hw/virtio/virtio-iommu.h
>@@ -24,6 +24,7 @@
> #include "hw/virtio/virtio.h"
> #include "hw/pci/pci.h"
> #include "qom/object.h"
>+#include "qapi/qapi-types-virtio.h"
>
> #define TYPE_VIRTIO_IOMMU "virtio-iommu-device"
> #define TYPE_VIRTIO_IOMMU_PCI "virtio-iommu-pci"
>@@ -67,6 +68,7 @@ struct VirtIOIOMMU {
>     Notifier machine_done;
>     bool granule_frozen;
>     uint8_t aw_bits;
>+    GranuleMode granule_mode;
> };
>
> #endif
>diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c
>index 2ec5ef3cd1..33e0520bc8 100644
>--- a/hw/virtio/virtio-iommu.c
>+++ b/hw/virtio/virtio-iommu.c
>@@ -29,6 +29,7 @@
> #include "sysemu/reset.h"
> #include "sysemu/sysemu.h"
> #include "qemu/reserved-region.h"
>+#include "qemu/units.h"
> #include "qapi/error.h"
> #include "qemu/error-report.h"
> #include "trace.h"
>@@ -1115,8 +1116,8 @@ static int
>virtio_iommu_notify_flag_changed(IOMMUMemoryRegion *iommu_mr,
> }
>
> /*
>- * The default mask (TARGET_PAGE_MASK) is the smallest supported guest
>granule,
>- * for example 0xfffffffffffff000. When an assigned device has page size
>+ * The default mask depends on the "granule" property. For example, with
>+ * 4K granule, it is -(4 * KiB). When an assigned device has page size
>  * restrictions due to the hardware IOMMU configuration, apply this
>restriction
>  * to the mask.
>  */
>@@ -1313,7 +1314,26 @@ static void
>virtio_iommu_device_realize(DeviceState *dev, Error **errp)
>      * in vfio realize
>      */
>     s->config.bypass = s->boot_bypass;
>-    s->config.page_size_mask = qemu_target_page_mask();
>+
>+    switch (s->granule_mode) {
>+    case GRANULE_MODE_4K:
>+        s->config.page_size_mask = -(4 * KiB);
>+        break;
>+    case GRANULE_MODE_8K:
>+        s->config.page_size_mask = -(8 * KiB);
>+        break;
>+    case GRANULE_MODE_16K:
>+        s->config.page_size_mask = -(16 * KiB);
>+        break;
>+    case GRANULE_MODE_64K:
>+        s->config.page_size_mask = -(64 * KiB);
>+        break;
>+    case GRANULE_MODE_HOST:
>+        s->config.page_size_mask = qemu_real_host_page_mask();
>+        break;
>+    default:
>+        error_setg(errp, "Unsupported granule mode");
>+    }
>     if (s->aw_bits < 32 || s->aw_bits > 64) {
>         error_setg(errp, "aw-bits must be within [32,64]");
>     }
>@@ -1527,6 +1547,8 @@ static Property virtio_iommu_properties[] = {
>                      TYPE_PCI_BUS, PCIBus *),
>     DEFINE_PROP_BOOL("boot-bypass", VirtIOIOMMU, boot_bypass, true),
>     DEFINE_PROP_UINT8("aw-bits", VirtIOIOMMU, aw_bits, 0),
>+    DEFINE_PROP_GRANULE_MODE("granule", VirtIOIOMMU, granule_mode,
>+                             GRANULE_MODE_4K),
>     DEFINE_PROP_END_OF_LIST(),
> };
>
>diff --git a/qemu-options.hx b/qemu-options.hx
>index 3b670758b0..c7b43b67d5 100644
>--- a/qemu-options.hx
>+++ b/qemu-options.hx
>@@ -1179,6 +1179,9 @@ SRST
>     ``aw-bits=val`` (val between 32 and 64, default depends on machine)
>         This decides the address width of IOVA address space. It defaults
>         to 39 bits on q35 machines and 48 bits on ARM virt machines.
>+    ``granule=val`` (possible values are 4K, 8K, 16K, 64K and host)
>+        This decides the default granule to be be exposed by the
>+        virtio-iommu. If host, the granule matches the host page size.
>
> ERST
>
>--
>2.41.0


Reply via email to