drm/msm: change gem->vmap() to get/put
authorRob Clark <robdclark@gmail.com>
Thu, 26 May 2016 20:24:35 +0000 (16:24 -0400)
committerRob Clark <robdclark@gmail.com>
Sat, 16 Jul 2016 14:09:07 +0000 (10:09 -0400)
Before we can add vmap shrinking, we really need to know which vmap'ings
are currently being used.  So switch to get/put interface.  Stubbed put
fxns for now.

Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/adreno/adreno_gpu.c
drivers/gpu/drm/msm/dsi/dsi_host.c
drivers/gpu/drm/msm/msm_drv.h
drivers/gpu/drm/msm/msm_fbdev.c
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem_prime.c
drivers/gpu/drm/msm/msm_gem_submit.c
drivers/gpu/drm/msm/msm_rd.c
drivers/gpu/drm/msm/msm_ringbuffer.c

index 2aec27dbb5bbbb36f5236e7488ed1677ae67de10..7dfe22ea2920927c62852193190782e8860aa4f9 100644 (file)
@@ -407,7 +407,7 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
                return ret;
        }
 
-       adreno_gpu->memptrs = msm_gem_vaddr(adreno_gpu->memptrs_bo);
+       adreno_gpu->memptrs = msm_gem_get_vaddr(adreno_gpu->memptrs_bo);
        if (IS_ERR(adreno_gpu->memptrs)) {
                dev_err(drm->dev, "could not vmap memptrs\n");
                return -ENOMEM;
@@ -426,8 +426,12 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
 void adreno_gpu_cleanup(struct adreno_gpu *gpu)
 {
        if (gpu->memptrs_bo) {
+               if (gpu->memptrs)
+                       msm_gem_put_vaddr(gpu->memptrs_bo);
+
                if (gpu->memptrs_iova)
                        msm_gem_put_iova(gpu->memptrs_bo, gpu->base.id);
+
                drm_gem_object_unreference_unlocked(gpu->memptrs_bo);
        }
        release_firmware(gpu->pm4);
index 80d8594c68ba6ecd54c1db96ca622a341cfee735..ddc4c7d678edb26394e80cb5d99dc7286cda2788 100644 (file)
@@ -1066,7 +1066,7 @@ static int dsi_cmd_dma_add(struct msm_dsi_host *msm_host,
        }
 
        if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) {
-               data = msm_gem_vaddr(msm_host->tx_gem_obj);
+               data = msm_gem_get_vaddr(msm_host->tx_gem_obj);
                if (IS_ERR(data)) {
                        ret = PTR_ERR(data);
                        pr_err("%s: get vaddr failed, %d\n", __func__, ret);
@@ -1094,6 +1094,9 @@ static int dsi_cmd_dma_add(struct msm_dsi_host *msm_host,
        if (packet.size < len)
                memset(data + packet.size, 0xff, len - packet.size);
 
+       if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G)
+               msm_gem_put_vaddr(msm_host->tx_gem_obj);
+
        return len;
 }
 
index 4755894d9229a947cd0b89a50048a8550c2c27b0..ecf0b3b03e0e96aea733cc5b70b6b05fb13a9b4f 100644 (file)
@@ -200,8 +200,10 @@ struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
                struct dma_buf_attachment *attach, struct sg_table *sg);
 int msm_gem_prime_pin(struct drm_gem_object *obj);
 void msm_gem_prime_unpin(struct drm_gem_object *obj);
-void *msm_gem_vaddr_locked(struct drm_gem_object *obj);
-void *msm_gem_vaddr(struct drm_gem_object *obj);
+void *msm_gem_get_vaddr_locked(struct drm_gem_object *obj);
+void *msm_gem_get_vaddr(struct drm_gem_object *obj);
+void msm_gem_put_vaddr_locked(struct drm_gem_object *obj);
+void msm_gem_put_vaddr(struct drm_gem_object *obj);
 int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv);
 void msm_gem_purge(struct drm_gem_object *obj);
 int msm_gem_sync_object(struct drm_gem_object *obj,
index a9223bea871b7c647351c6bb527b49843b012fef..ffd4a338ca12e27aab8cc4a8437f84817e1b7e23 100644 (file)
@@ -158,7 +158,7 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,
 
        dev->mode_config.fb_base = paddr;
 
-       fbi->screen_base = msm_gem_vaddr_locked(fbdev->bo);
+       fbi->screen_base = msm_gem_get_vaddr_locked(fbdev->bo);
        if (IS_ERR(fbi->screen_base)) {
                ret = PTR_ERR(fbi->screen_base);
                goto fail_unlock;
@@ -251,6 +251,7 @@ void msm_fbdev_free(struct drm_device *dev)
 
        /* this will free the backing object */
        if (fbdev->fb) {
+               msm_gem_put_vaddr(fbdev->bo);
                drm_framebuffer_unregister_private(fbdev->fb);
                drm_framebuffer_remove(fbdev->fb);
        }
index 444d0b5680f583a7535c27352c14a8598cdf2074..c05fc1d0dce7516bac950b457c88cfc964de8bec 100644 (file)
@@ -408,7 +408,7 @@ fail:
        return ret;
 }
 
-void *msm_gem_vaddr_locked(struct drm_gem_object *obj)
+void *msm_gem_get_vaddr_locked(struct drm_gem_object *obj)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        WARN_ON(!mutex_is_locked(&obj->dev->struct_mutex));
@@ -424,15 +424,26 @@ void *msm_gem_vaddr_locked(struct drm_gem_object *obj)
        return msm_obj->vaddr;
 }
 
-void *msm_gem_vaddr(struct drm_gem_object *obj)
+void *msm_gem_get_vaddr(struct drm_gem_object *obj)
 {
        void *ret;
        mutex_lock(&obj->dev->struct_mutex);
-       ret = msm_gem_vaddr_locked(obj);
+       ret = msm_gem_get_vaddr_locked(obj);
        mutex_unlock(&obj->dev->struct_mutex);
        return ret;
 }
 
+void msm_gem_put_vaddr_locked(struct drm_gem_object *obj)
+{
+       WARN_ON(!mutex_is_locked(&obj->dev->struct_mutex));
+       /* no-op for now */
+}
+
+void msm_gem_put_vaddr(struct drm_gem_object *obj)
+{
+       /* no-op for now */
+}
+
 /* Update madvise status, returns true if not purged, else
  * false or -errno.
  */
index 6b90890faffec93f8586b5f2a1e251338d2a3102..60bb290700cef9c32fc2ca0dd2db229a6a7ffedf 100644 (file)
@@ -33,12 +33,12 @@ struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj)
 
 void *msm_gem_prime_vmap(struct drm_gem_object *obj)
 {
-       return msm_gem_vaddr(obj);
+       return msm_gem_get_vaddr(obj);
 }
 
 void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
 {
-       /* TODO msm_gem_vunmap() */
+       msm_gem_put_vaddr(obj);
 }
 
 int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
index ea5f709e2e2780e41356c5233e5e2288e1706755..736f15881b6a964042856fee1eeb50b6aa5ccbd1 100644 (file)
@@ -279,7 +279,7 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
        /* For now, just map the entire thing.  Eventually we probably
         * to do it page-by-page, w/ kmap() if not vmap()d..
         */
-       ptr = msm_gem_vaddr_locked(&obj->base);
+       ptr = msm_gem_get_vaddr_locked(&obj->base);
 
        if (IS_ERR(ptr)) {
                ret = PTR_ERR(ptr);
@@ -332,6 +332,8 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
                last_offset = off;
        }
 
+       msm_gem_put_vaddr_locked(&obj->base);
+
        return 0;
 }
 
index 0857710c2ff2f809751bbab313045dfa8acd77cd..3eeb8af0c855c2bda76bd3333b90a2a7b6b122ef 100644 (file)
@@ -310,7 +310,7 @@ void msm_rd_dump_submit(struct msm_gem_submit *submit)
                uint32_t iova = submit->cmd[i].iova;
                uint32_t szd  = submit->cmd[i].size; /* in dwords */
                struct msm_gem_object *obj = submit->bos[idx].obj;
-               const char *buf = msm_gem_vaddr_locked(&obj->base);
+               const char *buf = msm_gem_get_vaddr_locked(&obj->base);
 
                if (IS_ERR(buf))
                        continue;
@@ -335,6 +335,8 @@ void msm_rd_dump_submit(struct msm_gem_submit *submit)
                                        (uint32_t[2]){ iova, szd }, 8);
                        break;
                }
+
+               msm_gem_put_vaddr_locked(&obj->base);
        }
 }
 #endif
index 42f5359cf98889cfa837f9ec60eb6d55f1b6e09d..f326cf6a32e64473461e0b7859101f1a404c0318 100644 (file)
@@ -39,7 +39,7 @@ struct msm_ringbuffer *msm_ringbuffer_new(struct msm_gpu *gpu, int size)
                goto fail;
        }
 
-       ring->start = msm_gem_vaddr_locked(ring->bo);
+       ring->start = msm_gem_get_vaddr_locked(ring->bo);
        if (IS_ERR(ring->start)) {
                ret = PTR_ERR(ring->start);
                goto fail;
@@ -59,7 +59,9 @@ fail:
 
 void msm_ringbuffer_destroy(struct msm_ringbuffer *ring)
 {
-       if (ring->bo)
+       if (ring->bo) {
+               msm_gem_put_vaddr(ring->bo);
                drm_gem_object_unreference_unlocked(ring->bo);
+       }
        kfree(ring);
 }