On Wed, Jun 16, 2021 at 06:02:39PM +0100, Robin Murphy wrote: > > diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c > > index c62e19bed302..175f8eaeb5b3 100644 > > --- a/drivers/iommu/dma-iommu.c > > +++ b/drivers/iommu/dma-iommu.c > > @@ -1322,7 +1322,9 @@ void iommu_setup_dma_ops(struct device *dev, u64 dma_base, u64 dma_limit) > > if (domain->type == IOMMU_DOMAIN_DMA) { > > if (iommu_dma_init_domain(domain, dma_base, dma_limit, dev)) > > goto out_err; > > - dev->dma_ops = &iommu_dma_ops; > > + set_dma_ops(dev, &iommu_dma_ops); > > + } else { > > + set_dma_ops(dev, NULL); > > I'm not keen on moving this here, since iommu-dma only knows that its own > ops are right for devices it *is* managing; it can't assume any particular > ops are appropriate for devices it isn't. The idea here is that > arch_setup_dma_ops() may have already set the appropriate ops for the > non-IOMMU case, so if the default domain type is passthrough then we leave > those in place. > > For example, I do still plan to revisit my conversion of arch/arm someday, > at which point I'd have to undo this for that reason. Makes sense, I'll remove this bit. > Simplifying the base and size arguments is of course fine, but TBH I'd say > rip the whole bloody lot out of the arch_setup_dma_ops() flow now. It's a > considerable faff passing them around for nothing but a tenuous sanity check > in iommu_dma_init_domain(), and now that dev->dma_range_map is a common > thing we should expect that to give us any relevant limitations if we even > still care. So I started working on this but it gets too bulky for a preparatory patch. Dropping the parameters from arch_setup_dma_ops() seems especially complicated because arm32 does need the size parameter for IOMMU mappings and that value falls back to the bus DMA mask or U32_MAX in the absence of dma-ranges. I could try to dig into this for a separate series. Even only dropping the parameters from iommu_setup_dma_ops() isn't completely trivial (8 files changed, 55 insertions(+), 36 deletions(-) because we still need the lower IOVA limit from dma_range_map), so I'd rather send it separately and have it sit in -next for a while. Thanks, Jean > > That said, those are all things which can be fixed up later if the series is > otherwise ready to go and there's still a chance of landing it for 5.14. If > you do have any other reason to respin, then I think the x86 probe_finalize > functions simply want an unconditional set_dma_ops(dev, NULL) before the > iommu_setup_dma_ops() call. > > Cheers, > Robin. > > > } > > return; > > diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c > > index 85f18342603c..8d866940692a 100644 > > --- a/drivers/iommu/intel/iommu.c > > +++ b/drivers/iommu/intel/iommu.c > > @@ -5165,15 +5165,7 @@ static void intel_iommu_release_device(struct device *dev) > > static void intel_iommu_probe_finalize(struct device *dev) > > { > > - dma_addr_t base = IOVA_START_PFN << VTD_PAGE_SHIFT; > > - struct iommu_domain *domain = iommu_get_domain_for_dev(dev); > > - struct dmar_domain *dmar_domain = to_dmar_domain(domain); > > - > > - if (domain && domain->type == IOMMU_DOMAIN_DMA) > > - iommu_setup_dma_ops(dev, base, > > - __DOMAIN_MAX_ADDR(dmar_domain->gaw)); > > - else > > - set_dma_ops(dev, NULL); > > + iommu_setup_dma_ops(dev, 0, U64_MAX); > > } > > static void intel_iommu_get_resv_regions(struct device *device, > >