iommu/fsl_pamu: enable the liodn when attaching a device
authorChristoph Hellwig <hch@lst.de>
Thu, 1 Apr 2021 15:52:46 +0000 (17:52 +0200)
committerJoerg Roedel <jroedel@suse.de>
Wed, 7 Apr 2021 08:56:52 +0000 (10:56 +0200)
Instead of a separate call to enable all devices from the list, just
enable the liodn once the device is attached to the iommu domain.

This also remove the DOMAIN_ATTR_FSL_PAMU_ENABLE iommu_attr.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Will Deacon <will@kernel.org>
Acked-by: Li Yang <leoyang.li@nxp.com>
Link: https://lore.kernel.org/r/20210401155256.298656-11-hch@lst.de
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/fsl_pamu_domain.c
drivers/iommu/fsl_pamu_domain.h
drivers/soc/fsl/qbman/qman_portal.c
include/linux/iommu.h

index 41927c3c417751d168e1df5d8ec5f8a1a249a5a6..c2e7e17570e76d93a9d07063ea5d669bce5b7196 100644 (file)
@@ -195,9 +195,6 @@ static void fsl_pamu_domain_free(struct iommu_domain *domain)
 
        /* remove all the devices from the device list */
        detach_device(NULL, dma_domain);
-
-       dma_domain->enabled = 0;
-
        kmem_cache_free(fsl_pamu_domain_cache, dma_domain);
 }
 
@@ -285,6 +282,9 @@ static int fsl_pamu_attach_device(struct iommu_domain *domain,
                ret = pamu_set_liodn(dma_domain, dev, liodn[i]);
                if (ret)
                        break;
+               ret = pamu_enable_liodn(liodn[i]);
+               if (ret)
+                       break;
        }
        spin_unlock_irqrestore(&dma_domain->domain_lock, flags);
        return ret;
@@ -341,46 +341,6 @@ int fsl_pamu_configure_l1_stash(struct iommu_domain *domain, u32 cpu)
        return ret;
 }
 
-/* Configure domain dma state i.e. enable/disable DMA */
-static int configure_domain_dma_state(struct fsl_dma_domain *dma_domain, bool enable)
-{
-       struct device_domain_info *info;
-       unsigned long flags;
-       int ret;
-
-       spin_lock_irqsave(&dma_domain->domain_lock, flags);
-       dma_domain->enabled = enable;
-       list_for_each_entry(info, &dma_domain->devices, link) {
-               ret = (enable) ? pamu_enable_liodn(info->liodn) :
-                       pamu_disable_liodn(info->liodn);
-               if (ret)
-                       pr_debug("Unable to set dma state for liodn %d",
-                                info->liodn);
-       }
-       spin_unlock_irqrestore(&dma_domain->domain_lock, flags);
-
-       return 0;
-}
-
-static int fsl_pamu_set_domain_attr(struct iommu_domain *domain,
-                                   enum iommu_attr attr_type, void *data)
-{
-       struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain);
-       int ret = 0;
-
-       switch (attr_type) {
-       case DOMAIN_ATTR_FSL_PAMU_ENABLE:
-               ret = configure_domain_dma_state(dma_domain, *(int *)data);
-               break;
-       default:
-               pr_debug("Unsupported attribute type\n");
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
-}
-
 static struct iommu_group *get_device_iommu_group(struct device *dev)
 {
        struct iommu_group *group;
@@ -505,7 +465,6 @@ static const struct iommu_ops fsl_pamu_ops = {
        .attach_dev     = fsl_pamu_attach_device,
        .detach_dev     = fsl_pamu_detach_device,
        .iova_to_phys   = fsl_pamu_iova_to_phys,
-       .domain_set_attr = fsl_pamu_set_domain_attr,
        .probe_device   = fsl_pamu_probe_device,
        .release_device = fsl_pamu_release_device,
        .device_group   = fsl_pamu_device_group,
index cd488004acd1b34dda635b3b66ccea4df1e34d4a..5f4ed253f61b316bf9160e2f29be38eeb37d2baf 100644 (file)
 struct fsl_dma_domain {
        /* list of devices associated with the domain */
        struct list_head                devices;
-       /* dma_domain states:
-        * enabled - DMA has been enabled for the given
-        * domain. This translates to setting of the
-        * valid bit for the primary PAACE in the PAMU
-        * PAACT table. Domain geometry should be set and
-        * it must have a valid mapping before DMA can be
-        * enabled for it.
-        *
-        */
-       int                             enabled;
        u32                             stash_id;
        u32                             snoop_id;
        struct iommu_domain             iommu_domain;
index 798b3a1ffd0b9cc1d95b69c00236c54602497f6d..bf38eb0042ed52258c036173cffff0bb01d95fa0 100644 (file)
@@ -46,7 +46,6 @@ static void portal_set_cpu(struct qm_portal_config *pcfg, int cpu)
 {
 #ifdef CONFIG_FSL_PAMU
        struct device *dev = pcfg->dev;
-       int window_count = 1;
        int ret;
 
        pcfg->iommu_domain = iommu_domain_alloc(&platform_bus_type);
@@ -66,14 +65,6 @@ static void portal_set_cpu(struct qm_portal_config *pcfg, int cpu)
                        ret);
                goto out_domain_free;
        }
-       ret = iommu_domain_set_attr(pcfg->iommu_domain,
-                                   DOMAIN_ATTR_FSL_PAMU_ENABLE,
-                                   &window_count);
-       if (ret < 0) {
-               dev_err(dev, "%s(): iommu_domain_set_attr() = %d", __func__,
-                       ret);
-               goto out_detach_device;
-       }
 
 no_iommu:
 #endif
@@ -82,8 +73,6 @@ no_iommu:
        return;
 
 #ifdef CONFIG_FSL_PAMU
-out_detach_device:
-       iommu_detach_device(pcfg->iommu_domain, NULL);
 out_domain_free:
        iommu_domain_free(pcfg->iommu_domain);
        pcfg->iommu_domain = NULL;
index a3968122aa694386894b05715d8a8e86bd449bee..f5caaa8d39befddffa5e9edff4584dc9b34d4ce9 100644 (file)
@@ -109,7 +109,6 @@ enum iommu_cap {
 enum iommu_attr {
        DOMAIN_ATTR_GEOMETRY,
        DOMAIN_ATTR_PAGING,
-       DOMAIN_ATTR_FSL_PAMU_ENABLE,
        DOMAIN_ATTR_NESTING,    /* two stages of translation */
        DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE,
        DOMAIN_ATTR_IO_PGTABLE_CFG,