[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC PATCH 04/21] xen/arm: vIOMMU: add generic vIOMMU framework
Hi Julien, > On 3 Dec 2022, at 9:54 pm, Julien Grall <julien@xxxxxxx> wrote: > > Hi Rahul, > > On 01/12/2022 16:02, Rahul Singh wrote: >> This patch adds basic framework for vIOMMU. >> Signed-off-by: Rahul Singh <rahul.singh@xxxxxxx> >> --- >> xen/arch/arm/domain.c | 17 +++++++ >> xen/arch/arm/domain_build.c | 3 ++ >> xen/arch/arm/include/asm/viommu.h | 70 ++++++++++++++++++++++++++++ >> xen/drivers/passthrough/Kconfig | 6 +++ >> xen/drivers/passthrough/arm/Makefile | 1 + >> xen/drivers/passthrough/arm/viommu.c | 48 +++++++++++++++++++ >> xen/include/public/arch-arm.h | 4 ++ >> 7 files changed, 149 insertions(+) >> create mode 100644 xen/arch/arm/include/asm/viommu.h >> create mode 100644 xen/drivers/passthrough/arm/viommu.c >> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c >> index 38e22f12af..2a85209736 100644 >> --- a/xen/arch/arm/domain.c >> +++ b/xen/arch/arm/domain.c >> @@ -37,6 +37,7 @@ >> #include <asm/tee/tee.h> >> #include <asm/vfp.h> >> #include <asm/vgic.h> >> +#include <asm/viommu.h> >> #include <asm/vtimer.h> >> #include "vpci.h" >> @@ -691,6 +692,13 @@ int arch_sanitise_domain_config(struct >> xen_domctl_createdomain *config) >> return -EINVAL; >> } >> + if ( config->arch.viommu_type != XEN_DOMCTL_CONFIG_VIOMMU_NONE ) >> + { >> + dprintk(XENLOG_INFO, >> + "vIOMMU type requested not supported by the platform or >> Xen\n"); >> + return -EINVAL; >> + } >> + >> return 0; >> } >> @@ -783,6 +791,9 @@ int arch_domain_create(struct domain *d, >> if ( (rc = domain_vpci_init(d)) != 0 ) >> goto fail; >> + if ( (rc = domain_viommu_init(d, config->arch.viommu_type)) != 0 ) >> + goto fail; >> + >> return 0; >> fail: >> @@ -998,6 +1009,7 @@ static int relinquish_memory(struct domain *d, struct >> page_list_head *list) >> enum { >> PROG_pci = 1, >> PROG_tee, >> + PROG_viommu, >> PROG_xen, >> PROG_page, >> PROG_mapping, >> @@ -1048,6 +1060,11 @@ int domain_relinquish_resources(struct domain *d) >> if (ret ) >> return ret; >> + PROGRESS(viommu): >> + ret = viommu_relinquish_resources(d); >> + if (ret ) >> + return ret; > > I would have expected us to relinquish the vIOMMU resources *before* we > detach the devices. So can you explain the ordering? I think first we need to detach the device that will set the S1 and S2 stage translation to bypass/abort then we need to remove the vIOMMU. Do you have anything that you feel if we relinquish the vIOMMU after detach is not right. > >> + >> PROGRESS(xen): >> ret = relinquish_memory(d, &d->xenpage_list); >> if ( ret ) >> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c >> index bd30d3798c..abbaf37a2e 100644 >> --- a/xen/arch/arm/domain_build.c >> +++ b/xen/arch/arm/domain_build.c >> @@ -27,6 +27,7 @@ >> #include <asm/setup.h> >> #include <asm/cpufeature.h> >> #include <asm/domain_build.h> >> +#include <asm/viommu.h> >> #include <xen/event.h> >> #include <xen/irq.h> >> @@ -3858,6 +3859,7 @@ void __init create_domUs(void) >> struct domain *d; >> struct xen_domctl_createdomain d_cfg = { >> .arch.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE, >> + .arch.viommu_type = viommu_get_type(), > > I don't think the vIOMMU should be enabled to dom0less domU by default. I am not enabling the vIOMMU by default. If vIOMMU is disabled via the command line or config option then viommu_get_type() will return XEN_DOMCTL_CONFIG_VIOMMU_NONE and in that case domain_viommu_init() will return 0 without doing anything. > >> .flags = XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap, >> /* >> * The default of 1023 should be sufficient for guests because >> @@ -4052,6 +4054,7 @@ void __init create_dom0(void) >> printk(XENLOG_WARNING "Maximum number of vGIC IRQs exceeded.\n"); >> dom0_cfg.arch.tee_type = tee_get_type(); >> dom0_cfg.max_vcpus = dom0_max_vcpus(); >> + dom0_cfg.arch.viommu_type = viommu_get_type(); > > Same here. > >> if ( iommu_enabled ) >> dom0_cfg.flags |= XEN_DOMCTL_CDF_iommu; >> diff --git a/xen/arch/arm/include/asm/viommu.h >> b/xen/arch/arm/include/asm/viommu.h >> new file mode 100644 >> index 0000000000..7cd3818a12 >> --- /dev/null >> +++ b/xen/arch/arm/include/asm/viommu.h >> @@ -0,0 +1,70 @@ >> +/* SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) */ >> +#ifndef __ARCH_ARM_VIOMMU_H__ >> +#define __ARCH_ARM_VIOMMU_H__ >> + >> +#ifdef CONFIG_VIRTUAL_IOMMU >> + >> +#include <xen/lib.h> >> +#include <xen/types.h> >> +#include <public/xen.h> >> + >> +struct viommu_ops { >> + /* >> + * Called during domain construction if toolstack requests to enable >> + * vIOMMU support. >> + */ >> + int (*domain_init)(struct domain *d); >> + >> + /* >> + * Called during domain destruction to free resources used by vIOMMU. >> + */ >> + int (*relinquish_resources)(struct domain *d); >> +}; >> + >> +struct viommu_desc { >> + /* vIOMMU domains init/free operations described above. */ >> + const struct viommu_ops *ops; >> + >> + /* >> + * ID of vIOMMU. Corresponds to xen_arch_domainconfig.viommu_type. > > Did you mean ID rather than type? I mean here type of physical IOMMU on the host available SMMUv3, SMMUv1 or IPMMU. If you think ID is the right name here I will change it. > >> + * Should be one of XEN_DOMCTL_CONFIG_VIOMMU_xxx >> + */ >> + uint16_t viommu_type; > > The domctl is uint8_t. Ack. I will fix that. Regards, Rahul
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |