On Wed, Oct 18, 2023 at 09:27:07PM +0100, Joao Martins wrote: > -static struct iommu_domain *amd_iommu_domain_alloc(unsigned type) > +static struct iommu_domain *do_iommu_domain_alloc(unsigned int type, > + struct device *dev, > + u32 flags) > { > struct protection_domain *domain; > + struct amd_iommu *iommu = NULL; > + > + if (dev) { > + iommu = rlookup_amd_iommu(dev); > + if (!iommu) > + return ERR_PTR(-ENODEV); > + } > > /* > * Since DTE[Mode]=0 is prohibited on SNP-enabled system, > * default to use IOMMU_DOMAIN_DMA[_FQ]. > */ > if (amd_iommu_snp_en && (type == IOMMU_DOMAIN_IDENTITY)) > - return NULL; > + return ERR_PTR(-EINVAL); > > domain = protection_domain_alloc(type); > if (!domain) > - return NULL; > + return ERR_PTR(-ENOMEM); > > domain->domain.geometry.aperture_start = 0; > domain->domain.geometry.aperture_end = dma_max_address(); > domain->domain.geometry.force_aperture = true; > > + if (iommu) { > + domain->domain.type = type; > + domain->domain.pgsize_bitmap = > + iommu->iommu.ops->pgsize_bitmap; > + domain->domain.ops = > + iommu->iommu.ops->default_domain_ops; > + } > + > return &domain->domain; > } In the end this is probably not enough refactoring, but this driver needs so much work we should just wait till the already written series get merged. eg domain_alloc_paging should just invoke domain_alloc_user with some null arguments if the driver is constructed this way > +static struct iommu_domain *amd_iommu_domain_alloc_user(struct device *dev, > + u32 flags) > +{ > + unsigned int type = IOMMU_DOMAIN_UNMANAGED; > + > + if (flags & IOMMU_HWPT_ALLOC_NEST_PARENT) > + return ERR_PTR(-EOPNOTSUPP); This should be written as a list of flags the driver *supports* not that it rejects if (flags) return ERR_PTR(-EOPNOTSUPP); Jason