iommu/fsl_pamu: merge pamu_set_liodn and map_liodn
authorChristoph Hellwig <hch@lst.de>
Thu, 1 Apr 2021 15:52:44 +0000 (17:52 +0200)
committerJoerg Roedel <jroedel@suse.de>
Wed, 7 Apr 2021 08:56:52 +0000 (10:56 +0200)
Merge the two fuctions that configure the ppaace into a single coherent
function.  I somehow doubt we need the two pamu_config_ppaace calls,
but keep the existing behavior just to be on the safe side.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Li Yang <leoyang.li@nxp.com>
Link: https://lore.kernel.org/r/20210401155256.298656-9-hch@lst.de
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/fsl_pamu_domain.c

index 557a152..198725e 100644 (file)
@@ -54,25 +54,6 @@ static int __init iommu_init_mempool(void)
        return 0;
 }
 
-/* Map the DMA window corresponding to the LIODN */
-static int map_liodn(int liodn, struct fsl_dma_domain *dma_domain)
-{
-       int ret;
-       struct iommu_domain_geometry *geom = &dma_domain->iommu_domain.geometry;
-       unsigned long flags;
-
-       spin_lock_irqsave(&iommu_lock, flags);
-       ret = pamu_config_ppaace(liodn, geom->aperture_start,
-                                geom->aperture_end + 1, ~(u32)0,
-                                0, dma_domain->snoop_id, dma_domain->stash_id,
-                                PAACE_AP_PERMS_QUERY | PAACE_AP_PERMS_UPDATE);
-       spin_unlock_irqrestore(&iommu_lock, flags);
-       if (ret)
-               pr_debug("PAACE configuration failed for liodn %d\n", liodn);
-
-       return ret;
-}
-
 static int update_liodn_stash(int liodn, struct fsl_dma_domain *dma_domain,
                              u32 val)
 {
@@ -94,11 +75,11 @@ static int update_liodn_stash(int liodn, struct fsl_dma_domain *dma_domain,
 }
 
 /* Set the geometry parameters for a LIODN */
-static int pamu_set_liodn(int liodn, struct device *dev,
-                         struct fsl_dma_domain *dma_domain,
-                         struct iommu_domain_geometry *geom_attr)
+static int pamu_set_liodn(struct fsl_dma_domain *dma_domain, struct device *dev,
+                         int liodn)
 {
-       phys_addr_t window_addr, window_size;
+       struct iommu_domain *domain = &dma_domain->iommu_domain;
+       struct iommu_domain_geometry *geom = &domain->geometry;
        u32 omi_index = ~(u32)0;
        unsigned long flags;
        int ret;
@@ -110,22 +91,25 @@ static int pamu_set_liodn(int liodn, struct device *dev,
         */
        get_ome_index(&omi_index, dev);
 
-       window_addr = geom_attr->aperture_start;
-       window_size = geom_attr->aperture_end + 1;
-
        spin_lock_irqsave(&iommu_lock, flags);
        ret = pamu_disable_liodn(liodn);
-       if (!ret)
-               ret = pamu_config_ppaace(liodn, window_addr, window_size, omi_index,
-                                        0, dma_domain->snoop_id,
-                                        dma_domain->stash_id, 0);
+       if (ret)
+               goto out_unlock;
+       ret = pamu_config_ppaace(liodn, geom->aperture_start,
+                                geom->aperture_end + 1, omi_index, 0,
+                                dma_domain->snoop_id, dma_domain->stash_id, 0);
+       if (ret)
+               goto out_unlock;
+       ret = pamu_config_ppaace(liodn, geom->aperture_start,
+                                geom->aperture_end + 1, ~(u32)0,
+                                0, dma_domain->snoop_id, dma_domain->stash_id,
+                                PAACE_AP_PERMS_QUERY | PAACE_AP_PERMS_UPDATE);
+out_unlock:
        spin_unlock_irqrestore(&iommu_lock, flags);
        if (ret) {
                pr_debug("PAACE configuration failed for liodn %d\n",
                         liodn);
-               return ret;
        }
-
        return ret;
 }
 
@@ -265,7 +249,6 @@ static int handle_attach_device(struct fsl_dma_domain *dma_domain,
                                int num)
 {
        unsigned long flags;
-       struct iommu_domain *domain = &dma_domain->iommu_domain;
        int ret = 0;
        int i;
 
@@ -280,21 +263,7 @@ static int handle_attach_device(struct fsl_dma_domain *dma_domain,
                }
 
                attach_device(dma_domain, liodn[i], dev);
-               /*
-                * Check if geometry has already been configured
-                * for the domain. If yes, set the geometry for
-                * the LIODN.
-                */
-               ret = pamu_set_liodn(liodn[i], dev, dma_domain,
-                                    &domain->geometry);
-               if (ret)
-                       break;
-
-               /*
-                * Create window/subwindow mapping for
-                * the LIODN.
-                */
-               ret = map_liodn(liodn[i], dma_domain);
+               ret = pamu_set_liodn(dma_domain, dev, liodn[i]);
                if (ret)
                        break;
        }