[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC PATCH 07/21] xen/arm: vIOMMU: Add cmdline boot option "viommu = <boolean>"
Add cmdline boot option "viommu = <boolean>" to enable or disable the virtual iommu support for guests on ARM. Signed-off-by: Rahul Singh <rahul.singh@xxxxxxx> --- docs/misc/xen-command-line.pandoc | 7 +++++++ xen/arch/arm/include/asm/viommu.h | 11 +++++++++++ xen/drivers/passthrough/arm/viommu.c | 9 +++++++++ xen/drivers/passthrough/arm/vsmmu-v3.c | 3 +++ 4 files changed, 30 insertions(+) diff --git a/docs/misc/xen-command-line.pandoc b/docs/misc/xen-command-line.pandoc index 424b12cfb2..14a104f2b9 100644 --- a/docs/misc/xen-command-line.pandoc +++ b/docs/misc/xen-command-line.pandoc @@ -1896,6 +1896,13 @@ This option can be specified more than once (up to 8 times at present). Flag to enable or disable support for PCI passthrough +### viommu (arm) +> `= <boolean>` + +> Default: `false` + +Flag to enable or disable support for Virtual IOMMU for guests. + ### pcid (x86) > `= <boolean> | xpti=<bool>` diff --git a/xen/arch/arm/include/asm/viommu.h b/xen/arch/arm/include/asm/viommu.h index 4785877e2a..4de4cceeda 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 bool viommu_enabled; /* data structure for each hardware IOMMU */ struct host_iommu { @@ -50,6 +51,11 @@ 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) +{ + return viommu_enabled; +} + #else static inline uint8_t viommu_get_type(void) @@ -76,6 +82,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_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..a1d6a04ba9 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,16 @@ 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. */ +bool __read_mostly viommu_enabled; +boolean_param("viommu", viommu_enabled); + int domain_viommu_init(struct domain *d, uint16_t viommu_type) { + /* Enable viommu when it has been enabled explicitly (viommu=on). */ + if ( !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() ) + return; + if ( cur_viommu && (cur_viommu != desc) ) { printk("WARNING: Cannot set vIOMMU, already set to a different value\n"); -- 2.25.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |