On 6/10/2024 2:25 PM, Lu Baolu wrote: > Commit <17de3f5fdd35> ("iommu: Retire bus ops") removes iommu ops from > bus. The iommu subsystem no longer relies on bus for operations. So the > bus parameter in iommu_domain_alloc() is no longer relevant. > > Add a new interface named iommu_paging_domain_alloc(), which explicitly > indicates the allocation of a paging domain for DMA managed by a kernel > driver. The new interface takes a device pointer as its parameter, that > better aligns with the current iommu subsystem. > > Signed-off-by: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx> Reviewed-by: Vasant Hegde <vasant.hegde@xxxxxxx> -Vasant > --- > include/linux/iommu.h | 6 ++++++ > drivers/iommu/iommu.c | 20 ++++++++++++++++++++ > 2 files changed, 26 insertions(+) > > diff --git a/include/linux/iommu.h b/include/linux/iommu.h > index 7bc8dff7cf6d..46f1348f1f0a 100644 > --- a/include/linux/iommu.h > +++ b/include/linux/iommu.h > @@ -780,6 +780,7 @@ extern bool iommu_present(const struct bus_type *bus); > extern bool device_iommu_capable(struct device *dev, enum iommu_cap cap); > extern bool iommu_group_has_isolated_msi(struct iommu_group *group); > extern struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus); > +struct iommu_domain *iommu_paging_domain_alloc(struct device *dev); > extern void iommu_domain_free(struct iommu_domain *domain); > extern int iommu_attach_device(struct iommu_domain *domain, > struct device *dev); > @@ -1086,6 +1087,11 @@ static inline struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus > return NULL; > } > > +static inline struct iommu_domain *iommu_paging_domain_alloc(struct device *dev) > +{ > + return ERR_PTR(-ENODEV); > +} > + > static inline void iommu_domain_free(struct iommu_domain *domain) > { > } > diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c > index 9df7cc75c1bc..e03c71a34347 100644 > --- a/drivers/iommu/iommu.c > +++ b/drivers/iommu/iommu.c > @@ -2016,6 +2016,10 @@ static int __iommu_domain_alloc_dev(struct device *dev, void *data) > return 0; > } > > +/* > + * The iommu ops in bus has been retired. Do not use this interface in > + * new drivers. > + */ > struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus) > { > const struct iommu_ops *ops = NULL; > @@ -2032,6 +2036,22 @@ struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus) > } > EXPORT_SYMBOL_GPL(iommu_domain_alloc); > > +/** > + * iommu_paging_domain_alloc() - Allocate a paging domain > + * @dev: device for which the domain is allocated > + * > + * Allocate a paging domain which will be managed by a kernel driver. Return > + * allocated domain if successful, or a ERR pointer for failure. > + */ > +struct iommu_domain *iommu_paging_domain_alloc(struct device *dev) > +{ > + if (!dev_has_iommu(dev)) > + return ERR_PTR(-ENODEV); > + > + return __iommu_domain_alloc(dev_iommu_ops(dev), dev, IOMMU_DOMAIN_UNMANAGED); > +} > +EXPORT_SYMBOL_GPL(iommu_paging_domain_alloc); > + > void iommu_domain_free(struct iommu_domain *domain) > { > if (domain->type == IOMMU_DOMAIN_SVA)