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

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.comSigned-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 6caeb33f
...@@ -283,9 +283,9 @@ static int fsl_pamu_attach_device(struct iommu_domain *domain, ...@@ -283,9 +283,9 @@ static int fsl_pamu_attach_device(struct iommu_domain *domain,
return ret; return ret;
} }
static void fsl_pamu_detach_device(struct iommu_domain *domain, static void fsl_pamu_set_platform_dma(struct device *dev)
struct device *dev)
{ {
struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain);
const u32 *prop; const u32 *prop;
int len; int len;
...@@ -452,9 +452,9 @@ static const struct iommu_ops fsl_pamu_ops = { ...@@ -452,9 +452,9 @@ static const struct iommu_ops fsl_pamu_ops = {
.domain_alloc = fsl_pamu_domain_alloc, .domain_alloc = fsl_pamu_domain_alloc,
.probe_device = fsl_pamu_probe_device, .probe_device = fsl_pamu_probe_device,
.device_group = fsl_pamu_device_group, .device_group = fsl_pamu_device_group,
.set_platform_dma_ops = fsl_pamu_set_platform_dma;
.default_domain_ops = &(const struct iommu_domain_ops) { .default_domain_ops = &(const struct iommu_domain_ops) {
.attach_dev = fsl_pamu_attach_device, .attach_dev = fsl_pamu_attach_device,
.detach_dev = fsl_pamu_detach_device,
.iova_to_phys = fsl_pamu_iova_to_phys, .iova_to_phys = fsl_pamu_iova_to_phys,
.free = fsl_pamu_domain_free, .free = fsl_pamu_domain_free,
} }
......
...@@ -443,9 +443,9 @@ static int msm_iommu_attach_dev(struct iommu_domain *domain, struct device *dev) ...@@ -443,9 +443,9 @@ static int msm_iommu_attach_dev(struct iommu_domain *domain, struct device *dev)
return ret; return ret;
} }
static void msm_iommu_detach_dev(struct iommu_domain *domain, static void msm_iommu_set_platform_dma(struct device *dev)
struct device *dev)
{ {
struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
struct msm_priv *priv = to_msm_priv(domain); struct msm_priv *priv = to_msm_priv(domain);
unsigned long flags; unsigned long flags;
struct msm_iommu_dev *iommu; struct msm_iommu_dev *iommu;
...@@ -678,11 +678,11 @@ static struct iommu_ops msm_iommu_ops = { ...@@ -678,11 +678,11 @@ static struct iommu_ops msm_iommu_ops = {
.domain_alloc = msm_iommu_domain_alloc, .domain_alloc = msm_iommu_domain_alloc,
.probe_device = msm_iommu_probe_device, .probe_device = msm_iommu_probe_device,
.device_group = generic_device_group, .device_group = generic_device_group,
.set_platform_dma_ops = msm_iommu_set_platform_dma,
.pgsize_bitmap = MSM_IOMMU_PGSIZES, .pgsize_bitmap = MSM_IOMMU_PGSIZES,
.of_xlate = qcom_iommu_of_xlate, .of_xlate = qcom_iommu_of_xlate,
.default_domain_ops = &(const struct iommu_domain_ops) { .default_domain_ops = &(const struct iommu_domain_ops) {
.attach_dev = msm_iommu_attach_dev, .attach_dev = msm_iommu_attach_dev,
.detach_dev = msm_iommu_detach_dev,
.map_pages = msm_iommu_map, .map_pages = msm_iommu_map,
.unmap_pages = msm_iommu_unmap, .unmap_pages = msm_iommu_unmap,
/* /*
......
...@@ -319,7 +319,7 @@ static int mtk_iommu_v1_attach_device(struct iommu_domain *domain, struct device ...@@ -319,7 +319,7 @@ static int mtk_iommu_v1_attach_device(struct iommu_domain *domain, struct device
return 0; 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); struct mtk_iommu_v1_data *data = dev_iommu_priv_get(dev);
...@@ -585,10 +585,10 @@ static const struct iommu_ops mtk_iommu_v1_ops = { ...@@ -585,10 +585,10 @@ static const struct iommu_ops mtk_iommu_v1_ops = {
.def_domain_type = mtk_iommu_v1_def_domain_type, .def_domain_type = mtk_iommu_v1_def_domain_type,
.device_group = generic_device_group, .device_group = generic_device_group,
.pgsize_bitmap = MT2701_IOMMU_PAGE_SIZE, .pgsize_bitmap = MT2701_IOMMU_PAGE_SIZE,
.set_platform_dma_ops = mtk_iommu_v1_set_platform_dma,
.owner = THIS_MODULE, .owner = THIS_MODULE,
.default_domain_ops = &(const struct iommu_domain_ops) { .default_domain_ops = &(const struct iommu_domain_ops) {
.attach_dev = mtk_iommu_v1_attach_device, .attach_dev = mtk_iommu_v1_attach_device,
.detach_dev = mtk_iommu_v1_detach_device,
.map_pages = mtk_iommu_v1_map, .map_pages = mtk_iommu_v1_map,
.unmap_pages = mtk_iommu_v1_unmap, .unmap_pages = mtk_iommu_v1_unmap,
.iova_to_phys = mtk_iommu_v1_iova_to_phys, .iova_to_phys = mtk_iommu_v1_iova_to_phys,
......
...@@ -1556,9 +1556,9 @@ static void _omap_iommu_detach_dev(struct omap_iommu_domain *omap_domain, ...@@ -1556,9 +1556,9 @@ static void _omap_iommu_detach_dev(struct omap_iommu_domain *omap_domain,
omap_domain->dev = NULL; omap_domain->dev = NULL;
} }
static void omap_iommu_detach_dev(struct iommu_domain *domain, static void omap_iommu_set_platform_dma(struct device *dev)
struct device *dev)
{ {
struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
struct omap_iommu_domain *omap_domain = to_omap_domain(domain); struct omap_iommu_domain *omap_domain = to_omap_domain(domain);
spin_lock(&omap_domain->lock); spin_lock(&omap_domain->lock);
...@@ -1737,10 +1737,10 @@ static const struct iommu_ops omap_iommu_ops = { ...@@ -1737,10 +1737,10 @@ static const struct iommu_ops omap_iommu_ops = {
.probe_device = omap_iommu_probe_device, .probe_device = omap_iommu_probe_device,
.release_device = omap_iommu_release_device, .release_device = omap_iommu_release_device,
.device_group = omap_iommu_device_group, .device_group = omap_iommu_device_group,
.set_platform_dma_ops = omap_iommu_set_platform_dma,
.pgsize_bitmap = OMAP_IOMMU_PGSIZES, .pgsize_bitmap = OMAP_IOMMU_PGSIZES,
.default_domain_ops = &(const struct iommu_domain_ops) { .default_domain_ops = &(const struct iommu_domain_ops) {
.attach_dev = omap_iommu_attach_dev, .attach_dev = omap_iommu_attach_dev,
.detach_dev = omap_iommu_detach_dev,
.map = omap_iommu_map, .map = omap_iommu_map,
.unmap = omap_iommu_unmap, .unmap = omap_iommu_unmap,
.iova_to_phys = omap_iommu_iova_to_phys, .iova_to_phys = omap_iommu_iova_to_phys,
......
...@@ -144,13 +144,10 @@ static int s390_iommu_attach_device(struct iommu_domain *domain, ...@@ -144,13 +144,10 @@ static int s390_iommu_attach_device(struct iommu_domain *domain,
return 0; return 0;
} }
static void s390_iommu_detach_device(struct iommu_domain *domain, static void s390_iommu_set_platform_dma(struct device *dev)
struct device *dev)
{ {
struct zpci_dev *zdev = to_zpci_dev(dev); struct zpci_dev *zdev = to_zpci_dev(dev);
WARN_ON(zdev->s390_domain != to_s390_domain(domain));
__s390_iommu_detach_device(zdev); __s390_iommu_detach_device(zdev);
zpci_dma_init_device(zdev); zpci_dma_init_device(zdev);
} }
...@@ -435,11 +432,11 @@ static const struct iommu_ops s390_iommu_ops = { ...@@ -435,11 +432,11 @@ static const struct iommu_ops s390_iommu_ops = {
.probe_device = s390_iommu_probe_device, .probe_device = s390_iommu_probe_device,
.release_device = s390_iommu_release_device, .release_device = s390_iommu_release_device,
.device_group = generic_device_group, .device_group = generic_device_group,
.set_platform_dma_ops = s390_iommu_set_platform_dma,
.pgsize_bitmap = SZ_4K, .pgsize_bitmap = SZ_4K,
.get_resv_regions = s390_iommu_get_resv_regions, .get_resv_regions = s390_iommu_get_resv_regions,
.default_domain_ops = &(const struct iommu_domain_ops) { .default_domain_ops = &(const struct iommu_domain_ops) {
.attach_dev = s390_iommu_attach_device, .attach_dev = s390_iommu_attach_device,
.detach_dev = s390_iommu_detach_device,
.map_pages = s390_iommu_map_pages, .map_pages = s390_iommu_map_pages,
.unmap_pages = s390_iommu_unmap_pages, .unmap_pages = s390_iommu_unmap_pages,
.flush_iotlb_all = s390_iommu_flush_iotlb_all, .flush_iotlb_all = s390_iommu_flush_iotlb_all,
......
...@@ -124,9 +124,9 @@ static int gart_iommu_attach_dev(struct iommu_domain *domain, ...@@ -124,9 +124,9 @@ static int gart_iommu_attach_dev(struct iommu_domain *domain,
return ret; return ret;
} }
static void gart_iommu_detach_dev(struct iommu_domain *domain, static void gart_iommu_set_platform_dma(struct device *dev)
struct device *dev)
{ {
struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
struct gart_device *gart = gart_handle; struct gart_device *gart = gart_handle;
spin_lock(&gart->dom_lock); spin_lock(&gart->dom_lock);
...@@ -270,11 +270,11 @@ static const struct iommu_ops gart_iommu_ops = { ...@@ -270,11 +270,11 @@ static const struct iommu_ops gart_iommu_ops = {
.domain_alloc = gart_iommu_domain_alloc, .domain_alloc = gart_iommu_domain_alloc,
.probe_device = gart_iommu_probe_device, .probe_device = gart_iommu_probe_device,
.device_group = generic_device_group, .device_group = generic_device_group,
.set_platform_dma_ops = gart_iommu_set_platform_dma,
.pgsize_bitmap = GART_IOMMU_PGSIZES, .pgsize_bitmap = GART_IOMMU_PGSIZES,
.of_xlate = gart_iommu_of_xlate, .of_xlate = gart_iommu_of_xlate,
.default_domain_ops = &(const struct iommu_domain_ops) { .default_domain_ops = &(const struct iommu_domain_ops) {
.attach_dev = gart_iommu_attach_dev, .attach_dev = gart_iommu_attach_dev,
.detach_dev = gart_iommu_detach_dev,
.map = gart_iommu_map, .map = gart_iommu_map,
.unmap = gart_iommu_unmap, .unmap = gart_iommu_unmap,
.iova_to_phys = gart_iommu_iova_to_phys, .iova_to_phys = gart_iommu_iova_to_phys,
......
...@@ -511,8 +511,9 @@ static int tegra_smmu_attach_dev(struct iommu_domain *domain, ...@@ -511,8 +511,9 @@ static int tegra_smmu_attach_dev(struct iommu_domain *domain,
return err; return err;
} }
static void tegra_smmu_detach_dev(struct iommu_domain *domain, struct device *dev) static void tegra_smmu_set_platform_dma(struct device *dev)
{ {
struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
struct tegra_smmu_as *as = to_smmu_as(domain); struct tegra_smmu_as *as = to_smmu_as(domain);
struct tegra_smmu *smmu = as->smmu; struct tegra_smmu *smmu = as->smmu;
...@@ -965,11 +966,11 @@ static const struct iommu_ops tegra_smmu_ops = { ...@@ -965,11 +966,11 @@ static const struct iommu_ops tegra_smmu_ops = {
.domain_alloc = tegra_smmu_domain_alloc, .domain_alloc = tegra_smmu_domain_alloc,
.probe_device = tegra_smmu_probe_device, .probe_device = tegra_smmu_probe_device,
.device_group = tegra_smmu_device_group, .device_group = tegra_smmu_device_group,
.set_platform_dma_ops = tegra_smmu_set_platform_dma,
.of_xlate = tegra_smmu_of_xlate, .of_xlate = tegra_smmu_of_xlate,
.pgsize_bitmap = SZ_4K, .pgsize_bitmap = SZ_4K,
.default_domain_ops = &(const struct iommu_domain_ops) { .default_domain_ops = &(const struct iommu_domain_ops) {
.attach_dev = tegra_smmu_attach_dev, .attach_dev = tegra_smmu_attach_dev,
.detach_dev = tegra_smmu_detach_dev,
.map = tegra_smmu_map, .map = tegra_smmu_map,
.unmap = tegra_smmu_unmap, .unmap = tegra_smmu_unmap,
.iova_to_phys = tegra_smmu_iova_to_phys, .iova_to_phys = tegra_smmu_iova_to_phys,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment