]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/msm: Remove pm_runtime calls from msm_iommu.c
authorJordan Crouse <jcrouse@codeaurora.org>
Tue, 19 Feb 2019 18:48:20 +0000 (11:48 -0700)
committerRob Clark <robdclark@chromium.org>
Thu, 18 Apr 2019 17:04:09 +0000 (10:04 -0700)
Currently the IOMMU code calls pm_runtime_get/put on the GPU or display
device before doing a IOMMU operation. This was because usually the
IOMMU driver didn't do power control of its own and since the hardware
used the same clocks and power as the respective multimedia device it
was a easy way to make sure that the power was available.

Now two things have changed. First, the SMMU devices can do their own power
control and more important bringing up the a6xx GPU isn't as easy as
turning on some clocks. To bring the GPU up we need the GMU which itself
needs the IOMMU so we have a chicken and egg problem.

Luckily this is easily fixed by removing the pm_runtime calls from the
functions and letting the device link to the IOMMU device handle the magic.

Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
Tested-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
Signed-off-by: Rob Clark <robdclark@chromium.org>
drivers/gpu/drm/msm/msm_iommu.c

index 4d62790cd4257545dce8bf8c57d596eb9aa80947..12bb54cefd460068cbfb36175fbf99901b8ab9f4 100644 (file)
@@ -38,13 +38,8 @@ static int msm_iommu_attach(struct msm_mmu *mmu, const char * const *names,
                            int cnt)
 {
        struct msm_iommu *iommu = to_msm_iommu(mmu);
-       int ret;
 
-       pm_runtime_get_sync(mmu->dev);
-       ret = iommu_attach_device(iommu->domain, mmu->dev);
-       pm_runtime_put_sync(mmu->dev);
-
-       return ret;
+       return iommu_attach_device(iommu->domain, mmu->dev);
 }
 
 static void msm_iommu_detach(struct msm_mmu *mmu, const char * const *names,
@@ -52,9 +47,7 @@ static void msm_iommu_detach(struct msm_mmu *mmu, const char * const *names,
 {
        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,
@@ -63,9 +56,7 @@ 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);
 
        return (ret == len) ? 0 : -EINVAL;
@@ -75,9 +66,7 @@ static int msm_iommu_unmap(struct msm_mmu *mmu, uint64_t iova, unsigned len)
 {
        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;
 }