[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 07/23] xen/arm: vIOMMU: Add cmdline boot option "viommu = <string>"



Hi Milan,

On 31/03/2026 10:52, Milan Djokic wrote:
From: Rahul Singh <rahul.singh@xxxxxxx>

Add cmdline boot option "viommu = <string>" to enable or disable the
virtual iommu support for guests on ARM (only viommu="smmuv3" supported
for now).

In Xen terminology, 'guests' refers to domUs. IOW, this doesn't include dom0. Is this what you meant? If so, how would you enable it for dom0?

That said, is there any particular reason why this can't be automatically enabled based on the SMMUv3 discovered?


Signed-off-by: Rahul Singh <rahul.singh@xxxxxxx>
Signed-off-by: Milan Djokic <milan_djokic@xxxxxxxx>
---
  docs/misc/xen-command-line.pandoc      |  9 +++++++++
  xen/arch/arm/include/asm/viommu.h      | 12 ++++++++++++
  xen/drivers/passthrough/arm/viommu.c   | 11 +++++++++++
  xen/drivers/passthrough/arm/vsmmu-v3.c |  3 +++
  4 files changed, 35 insertions(+)

diff --git a/docs/misc/xen-command-line.pandoc 
b/docs/misc/xen-command-line.pandoc
index 6c77129732..6531c2355c 100644
--- a/docs/misc/xen-command-line.pandoc
+++ b/docs/misc/xen-command-line.pandoc
@@ -2850,6 +2850,15 @@ The optional `keep` parameter causes Xen to continue 
using the vga
  console even after dom0 has been started.  The default behaviour is to
  relinquish control to dom0.
+### viommu (arm)
+> `= <string>`
+
+> Default: ``
+
+Flag to enable or disable support for the virtual IOMMU for guests. Disabled by
+default. Enable by specifying target IOMMU type (if supported). Only "smmuv3"
+IOMMU emulation supported at this point.
+
  ### viridian-spinlock-retry-count (x86)
  > `= <integer>`
diff --git a/xen/arch/arm/include/asm/viommu.h b/xen/arch/arm/include/asm/viommu.h
index 2a6742de73..ed338fe0ec 100644
--- a/xen/arch/arm/include/asm/viommu.h
+++ b/xen/arch/arm/include/asm/viommu.h
@@ -10,6 +10,7 @@
  #include <public/xen.h>
extern struct list_head host_iommu_list;
+extern char viommu[];
/* data structure for each hardware IOMMU */
  struct host_iommu {
@@ -50,6 +51,12 @@ uint16_t viommu_get_type(void);
  void add_to_host_iommu_list(paddr_t addr, paddr_t size,
                              const struct dt_device_node *node);
+static always_inline bool is_viommu_enabled(void)

Regardless what Luca wrote, why do we need to force "always_inline"?

+{
+    /* only smmuv3 emulation supported */
+    return !strcmp(viommu, "smmuv3");
+}
+
  #else
static inline uint8_t viommu_get_type(void)
@@ -76,6 +83,11 @@ static inline void add_to_host_iommu_list(paddr_t addr, 
paddr_t size,
      return;
  }
+static always_inline bool is_viommu_enabled(void)
+{
+    return false;
+}
+
  #endif /* CONFIG_ARM_VIRTUAL_IOMMU */
#endif /* __ARCH_ARM_VIOMMU_H__ */
diff --git a/xen/drivers/passthrough/arm/viommu.c 
b/xen/drivers/passthrough/arm/viommu.c
index 53ae46349a..5f5892fbb2 100644
--- a/xen/drivers/passthrough/arm/viommu.c
+++ b/xen/drivers/passthrough/arm/viommu.c
@@ -3,6 +3,7 @@
  #include <xen/errno.h>
  #include <xen/init.h>
  #include <xen/irq.h>
+#include <xen/param.h>
  #include <xen/types.h>
#include <asm/viommu.h>
@@ -38,8 +39,18 @@ void add_to_host_iommu_list(paddr_t addr, paddr_t size,
      list_add_tail(&iommu_data->entry, &host_iommu_list);
  }
+/* By default viommu is disabled.
+ * If enabled, 'viommu' param indicates type (smmuv3 is only supported type 
atm)
+ */
+char __read_mostly viommu[10] = "";
+string_param("viommu", viommu);
+
  int domain_viommu_init(struct domain *d, uint16_t viommu_type)
  {
+    /* Enable viommu when it has been enabled explicitly (viommu="smmuv3"). */
+    if ( !is_viommu_enabled() )
> +        return 0;> +
      if ( viommu_type == XEN_DOMCTL_CONFIG_VIOMMU_NONE )
          return 0;
diff --git a/xen/drivers/passthrough/arm/vsmmu-v3.c b/xen/drivers/passthrough/arm/vsmmu-v3.c
index 6b4009e5ef..e36f200ba5 100644
--- a/xen/drivers/passthrough/arm/vsmmu-v3.c
+++ b/xen/drivers/passthrough/arm/vsmmu-v3.c
@@ -105,6 +105,9 @@ void __init vsmmuv3_set_type(void)
  {
      const struct viommu_desc *desc = &vsmmuv3_desc;
+ if ( !is_viommu_enabled() )

This is likely going to go wrong in the future if we add support for other vIOMMU in the future. If we decide to continue using the command line option (see above), you would want want an helper to return the selected emulation and check against SMMUv3 here.

Cheers,

--
Julien Grall




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.