drm/msm: Add a common function to free kernel buffer objects
authorJordan Crouse <jcrouse@codeaurora.org>
Wed, 7 Nov 2018 22:35:46 +0000 (15:35 -0700)
committerRob Clark <robdclark@gmail.com>
Tue, 11 Dec 2018 18:05:30 +0000 (13:05 -0500)
Buffer objects allocated with msm_gem_kernel_new() are mostly
freed the same way so we can save a few lines of code with a
common function.

Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/adreno/a5xx_gpu.c
drivers/gpu/drm/msm/adreno/a5xx_power.c
drivers/gpu/drm/msm/adreno/a5xx_preempt.c
drivers/gpu/drm/msm/msm_drv.h
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gpu.c
drivers/gpu/drm/msm/msm_ringbuffer.c

index e64ab72..0d3f61a 100644 (file)
@@ -1220,15 +1220,6 @@ static int a5xx_crashdumper_init(struct msm_gpu *gpu,
        return PTR_ERR_OR_ZERO(dumper->ptr);
 }
 
-static void a5xx_crashdumper_free(struct msm_gpu *gpu,
-               struct a5xx_crashdumper *dumper)
-{
-       msm_gem_put_iova(dumper->bo, gpu->aspace);
-       msm_gem_put_vaddr(dumper->bo);
-
-       drm_gem_object_put(dumper->bo);
-}
-
 static int a5xx_crashdumper_run(struct msm_gpu *gpu,
                struct a5xx_crashdumper *dumper)
 {
@@ -1321,7 +1312,7 @@ static void a5xx_gpu_state_get_hlsq_regs(struct msm_gpu *gpu,
 
        if (a5xx_crashdumper_run(gpu, &dumper)) {
                kfree(a5xx_state->hlsqregs);
-               a5xx_crashdumper_free(gpu, &dumper);
+               msm_gem_kernel_put(dumper.bo, gpu->aspace, true);
                return;
        }
 
@@ -1329,7 +1320,7 @@ static void a5xx_gpu_state_get_hlsq_regs(struct msm_gpu *gpu,
        memcpy(a5xx_state->hlsqregs, dumper.ptr + (256 * SZ_1K),
                count * sizeof(u32));
 
-       a5xx_crashdumper_free(gpu, &dumper);
+       msm_gem_kernel_put(dumper.bo, gpu->aspace, true);
 }
 
 static struct msm_gpu_state *a5xx_gpu_state_get(struct msm_gpu *gpu)
index 7a41e1c..66bcd88 100644 (file)
@@ -298,7 +298,7 @@ void a5xx_gpmu_ucode_init(struct msm_gpu *gpu)
                MSM_BO_UNCACHED | MSM_BO_GPU_READONLY, gpu->aspace,
                &a5xx_gpu->gpmu_bo, &a5xx_gpu->gpmu_iova);
        if (IS_ERR(ptr))
-               goto err;
+               return;
 
        while (cmds_size > 0) {
                int i;
@@ -317,15 +317,4 @@ void a5xx_gpmu_ucode_init(struct msm_gpu *gpu)
 
        msm_gem_put_vaddr(a5xx_gpu->gpmu_bo);
        a5xx_gpu->gpmu_dwords = dwords;
-
-       return;
-err:
-       if (a5xx_gpu->gpmu_iova)
-               msm_gem_put_iova(a5xx_gpu->gpmu_bo, gpu->aspace);
-       if (a5xx_gpu->gpmu_bo)
-               drm_gem_object_put(a5xx_gpu->gpmu_bo);
-
-       a5xx_gpu->gpmu_bo = NULL;
-       a5xx_gpu->gpmu_iova = 0;
-       a5xx_gpu->gpmu_dwords = 0;
 }
index fdb08fc..48481e6 100644 (file)
@@ -267,18 +267,8 @@ void a5xx_preempt_fini(struct msm_gpu *gpu)
        struct a5xx_gpu *a5xx_gpu = to_a5xx_gpu(adreno_gpu);
        int i;
 
-       for (i = 0; i < gpu->nr_rings; i++) {
-               if (!a5xx_gpu->preempt_bo[i])
-                       continue;
-
-               msm_gem_put_vaddr(a5xx_gpu->preempt_bo[i]);
-
-               if (a5xx_gpu->preempt_iova[i])
-                       msm_gem_put_iova(a5xx_gpu->preempt_bo[i], gpu->aspace);
-
-               drm_gem_object_put(a5xx_gpu->preempt_bo[i]);
-               a5xx_gpu->preempt_bo[i] = NULL;
-       }
+       for (i = 0; i < gpu->nr_rings; i++)
+               msm_gem_kernel_put(a5xx_gpu->preempt_bo[i], gpu->aspace, true);
 }
 
 void a5xx_preempt_init(struct msm_gpu *gpu)
index 9d11f32..3225f8f 100644 (file)
@@ -312,6 +312,8 @@ void *msm_gem_kernel_new(struct drm_device *dev, uint32_t size,
 void *msm_gem_kernel_new_locked(struct drm_device *dev, uint32_t size,
                uint32_t flags, struct msm_gem_address_space *aspace,
                struct drm_gem_object **bo, uint64_t *iova);
+void msm_gem_kernel_put(struct drm_gem_object *bo,
+               struct msm_gem_address_space *aspace, bool locked);
 struct drm_gem_object *msm_gem_import(struct drm_device *dev,
                struct dma_buf *dmabuf, struct sg_table *sgt);
 
index 4646e9e..f32cf75 100644 (file)
@@ -1079,3 +1079,18 @@ void *msm_gem_kernel_new_locked(struct drm_device *dev, uint32_t size,
 {
        return _msm_gem_kernel_new(dev, size, flags, aspace, bo, iova, true);
 }
+
+void msm_gem_kernel_put(struct drm_gem_object *bo,
+               struct msm_gem_address_space *aspace, bool locked)
+{
+       if (IS_ERR_OR_NULL(bo))
+               return;
+
+       msm_gem_put_vaddr(bo);
+       msm_gem_put_iova(bo, aspace);
+
+       if (locked)
+               drm_gem_object_put(bo);
+       else
+               drm_gem_object_put_unlocked(bo);
+}
index f43e329..3e2b356 100644 (file)
@@ -981,11 +981,7 @@ fail:
                gpu->rb[i] = NULL;
        }
 
-       if (gpu->memptrs_bo) {
-               msm_gem_put_vaddr(gpu->memptrs_bo);
-               msm_gem_put_iova(gpu->memptrs_bo, gpu->aspace);
-               drm_gem_object_put_unlocked(gpu->memptrs_bo);
-       }
+       msm_gem_kernel_put(gpu->memptrs_bo, gpu->aspace, false);
 
        platform_set_drvdata(pdev, NULL);
        return ret;
@@ -1004,11 +1000,7 @@ void msm_gpu_cleanup(struct msm_gpu *gpu)
                gpu->rb[i] = NULL;
        }
 
-       if (gpu->memptrs_bo) {
-               msm_gem_put_vaddr(gpu->memptrs_bo);
-               msm_gem_put_iova(gpu->memptrs_bo, gpu->aspace);
-               drm_gem_object_put_unlocked(gpu->memptrs_bo);
-       }
+       msm_gem_kernel_put(gpu->memptrs_bo, gpu->aspace, false);
 
        if (!IS_ERR_OR_NULL(gpu->aspace)) {
                gpu->aspace->mmu->funcs->detach(gpu->aspace->mmu,
index 6f5295b..9fa9525 100644 (file)
@@ -73,10 +73,7 @@ void msm_ringbuffer_destroy(struct msm_ringbuffer *ring)
 
        msm_fence_context_free(ring->fctx);
 
-       if (ring->bo) {
-               msm_gem_put_iova(ring->bo, ring->gpu->aspace);
-               msm_gem_put_vaddr(ring->bo);
-               drm_gem_object_put_unlocked(ring->bo);
-       }
+       msm_gem_kernel_put(ring->bo, ring->gpu->aspace, false);
+
        kfree(ring);
 }