drm/msm: pm runtime support for iommu
authorRob Clark <robdclark@gmail.com>
Wed, 15 Feb 2017 21:00:25 +0000 (16:00 -0500)
committerRob Clark <robdclark@gmail.com>
Sat, 8 Apr 2017 10:59:31 +0000 (06:59 -0400)
In particular, attach() and unmap() need pm-runtime get/put to ensure
iommu clks are enabled.

Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/msm_iommu.c

index 6583fadc6e5b51fe1759927e77e3dd0fc5534f66..b23d33622f374b0ce88791914b53cb126899676b 100644 (file)
@@ -38,14 +38,23 @@ static int msm_iommu_attach(struct msm_mmu *mmu, const char * const *names,
                            int cnt)
 {
        struct msm_iommu *iommu = to_msm_iommu(mmu);
-       return iommu_attach_device(iommu->domain, mmu->dev);
+       int ret;
+
+       pm_runtime_get_sync(mmu->dev);
+       ret = iommu_attach_device(iommu->domain, mmu->dev);
+       pm_runtime_put_sync(mmu->dev);
+
+       return ret;
 }
 
 static void msm_iommu_detach(struct msm_mmu *mmu, const char * const *names,
                             int cnt)
 {
        struct msm_iommu *iommu = to_msm_iommu(mmu);
+
+       pm_runtime_get_sync(mmu->dev);
        iommu_detach_device(iommu->domain, mmu->dev);
+       pm_runtime_put_sync(mmu->dev);
 }
 
 static int msm_iommu_map(struct msm_mmu *mmu, uint64_t iova,
@@ -54,7 +63,9 @@ static int msm_iommu_map(struct msm_mmu *mmu, uint64_t iova,
        struct msm_iommu *iommu = to_msm_iommu(mmu);
        size_t ret;
 
+//     pm_runtime_get_sync(mmu->dev);
        ret = iommu_map_sg(iommu->domain, iova, sgt->sgl, sgt->nents, prot);
+//     pm_runtime_put_sync(mmu->dev);
        WARN_ON(ret < 0);
 
        return (ret == len) ? 0 : -EINVAL;
@@ -65,7 +76,9 @@ static int msm_iommu_unmap(struct msm_mmu *mmu, uint64_t iova,
 {
        struct msm_iommu *iommu = to_msm_iommu(mmu);
 
+       pm_runtime_get_sync(mmu->dev);
        iommu_unmap(iommu->domain, iova, len);
+       pm_runtime_put_sync(mmu->dev);
 
        return 0;
 }