Commit c1fe9119 authored by Lu Baolu's avatar Lu Baolu Committed by Joerg Roedel
Browse files

iommu: Add set_platform_dma_ops callbacks



For those IOMMU drivers that don't provide default domain support, add an
implementation of set_platform_dma_ops callback so that the IOMMU core
could return the DMA control to platform DMA ops. At the same time, with
the set_platform_dma_ops implemented, there is no need for detach_dev.
Remove it to avoid dead code.

Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Signed-off-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
Link: https://lore.kernel.org/r/20230110025408.667767-4-baolu.lu@linux.intel.com


Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 6caeb33f
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -283,9 +283,9 @@ static int fsl_pamu_attach_device(struct iommu_domain *domain,
	return ret;
}

static void fsl_pamu_detach_device(struct iommu_domain *domain,
				   struct device *dev)
static void fsl_pamu_set_platform_dma(struct device *dev)
{
	struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
	struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain);
	const u32 *prop;
	int len;
@@ -452,9 +452,9 @@ static const struct iommu_ops fsl_pamu_ops = {
	.domain_alloc	= fsl_pamu_domain_alloc,
	.probe_device	= fsl_pamu_probe_device,
	.device_group   = fsl_pamu_device_group,
	.set_platform_dma_ops = fsl_pamu_set_platform_dma;
	.default_domain_ops = &(const struct iommu_domain_ops) {
		.attach_dev	= fsl_pamu_attach_device,
		.detach_dev	= fsl_pamu_detach_device,
		.iova_to_phys	= fsl_pamu_iova_to_phys,
		.free		= fsl_pamu_domain_free,
	}
+3 −3
Original line number Diff line number Diff line
@@ -443,9 +443,9 @@ static int msm_iommu_attach_dev(struct iommu_domain *domain, struct device *dev)
	return ret;
}

static void msm_iommu_detach_dev(struct iommu_domain *domain,
				 struct device *dev)
static void msm_iommu_set_platform_dma(struct device *dev)
{
	struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
	struct msm_priv *priv = to_msm_priv(domain);
	unsigned long flags;
	struct msm_iommu_dev *iommu;
@@ -678,11 +678,11 @@ static struct iommu_ops msm_iommu_ops = {
	.domain_alloc = msm_iommu_domain_alloc,
	.probe_device = msm_iommu_probe_device,
	.device_group = generic_device_group,
	.set_platform_dma_ops = msm_iommu_set_platform_dma,
	.pgsize_bitmap = MSM_IOMMU_PGSIZES,
	.of_xlate = qcom_iommu_of_xlate,
	.default_domain_ops = &(const struct iommu_domain_ops) {
		.attach_dev	= msm_iommu_attach_dev,
		.detach_dev	= msm_iommu_detach_dev,
		.map_pages	= msm_iommu_map,
		.unmap_pages	= msm_iommu_unmap,
		/*
+2 −2
Original line number Diff line number Diff line
@@ -319,7 +319,7 @@ static int mtk_iommu_v1_attach_device(struct iommu_domain *domain, struct device
	return 0;
}

static void mtk_iommu_v1_detach_device(struct iommu_domain *domain, struct device *dev)
static void mtk_iommu_v1_set_platform_dma(struct device *dev)
{
	struct mtk_iommu_v1_data *data = dev_iommu_priv_get(dev);

@@ -585,10 +585,10 @@ static const struct iommu_ops mtk_iommu_v1_ops = {
	.def_domain_type = mtk_iommu_v1_def_domain_type,
	.device_group	= generic_device_group,
	.pgsize_bitmap	= MT2701_IOMMU_PAGE_SIZE,
	.set_platform_dma_ops = mtk_iommu_v1_set_platform_dma,
	.owner          = THIS_MODULE,
	.default_domain_ops = &(const struct iommu_domain_ops) {
		.attach_dev	= mtk_iommu_v1_attach_device,
		.detach_dev	= mtk_iommu_v1_detach_device,
		.map_pages	= mtk_iommu_v1_map,
		.unmap_pages	= mtk_iommu_v1_unmap,
		.iova_to_phys	= mtk_iommu_v1_iova_to_phys,
+3 −3
Original line number Diff line number Diff line
@@ -1556,9 +1556,9 @@ static void _omap_iommu_detach_dev(struct omap_iommu_domain *omap_domain,
	omap_domain->dev = NULL;
}

static void omap_iommu_detach_dev(struct iommu_domain *domain,
				  struct device *dev)
static void omap_iommu_set_platform_dma(struct device *dev)
{
	struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
	struct omap_iommu_domain *omap_domain = to_omap_domain(domain);

	spin_lock(&omap_domain->lock);
@@ -1737,10 +1737,10 @@ static const struct iommu_ops omap_iommu_ops = {
	.probe_device	= omap_iommu_probe_device,
	.release_device	= omap_iommu_release_device,
	.device_group	= omap_iommu_device_group,
	.set_platform_dma_ops = omap_iommu_set_platform_dma,
	.pgsize_bitmap	= OMAP_IOMMU_PGSIZES,
	.default_domain_ops = &(const struct iommu_domain_ops) {
		.attach_dev	= omap_iommu_attach_dev,
		.detach_dev	= omap_iommu_detach_dev,
		.map		= omap_iommu_map,
		.unmap		= omap_iommu_unmap,
		.iova_to_phys	= omap_iommu_iova_to_phys,
+2 −5
Original line number Diff line number Diff line
@@ -144,13 +144,10 @@ static int s390_iommu_attach_device(struct iommu_domain *domain,
	return 0;
}

static void s390_iommu_detach_device(struct iommu_domain *domain,
				     struct device *dev)
static void s390_iommu_set_platform_dma(struct device *dev)
{
	struct zpci_dev *zdev = to_zpci_dev(dev);

	WARN_ON(zdev->s390_domain != to_s390_domain(domain));

	__s390_iommu_detach_device(zdev);
	zpci_dma_init_device(zdev);
}
@@ -435,11 +432,11 @@ static const struct iommu_ops s390_iommu_ops = {
	.probe_device = s390_iommu_probe_device,
	.release_device = s390_iommu_release_device,
	.device_group = generic_device_group,
	.set_platform_dma_ops = s390_iommu_set_platform_dma,
	.pgsize_bitmap = SZ_4K,
	.get_resv_regions = s390_iommu_get_resv_regions,
	.default_domain_ops = &(const struct iommu_domain_ops) {
		.attach_dev	= s390_iommu_attach_device,
		.detach_dev	= s390_iommu_detach_device,
		.map_pages	= s390_iommu_map_pages,
		.unmap_pages	= s390_iommu_unmap_pages,
		.flush_iotlb_all = s390_iommu_flush_iotlb_all,
Loading