drm/msm: add put_iova() helper
authorRob Clark <robdclark@gmail.com>
Wed, 1 Jun 2016 15:38:28 +0000 (11:38 -0400)
committerRob Clark <robdclark@gmail.com>
Sat, 16 Jul 2016 14:09:06 +0000 (10:09 -0400)
We'll need this too for shrinker/purging.

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

index c40db08647d1a7b1d0bd7f01f4ff53f6815174db..2636c279d5049ba089caa9ee05c55327fe4ed25f 100644 (file)
@@ -276,6 +276,26 @@ uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj)
        return offset;
 }
 
+static void
+put_iova(struct drm_gem_object *obj)
+{
+       struct drm_device *dev = obj->dev;
+       struct msm_drm_private *priv = obj->dev->dev_private;
+       struct msm_gem_object *msm_obj = to_msm_bo(obj);
+       int id;
+
+       WARN_ON(!mutex_is_locked(&dev->struct_mutex));
+
+       for (id = 0; id < ARRAY_SIZE(msm_obj->domain); id++) {
+               struct msm_mmu *mmu = priv->mmus[id];
+               if (mmu && msm_obj->domain[id].iova) {
+                       uint32_t offset = msm_obj->domain[id].iova;
+                       mmu->funcs->unmap(mmu, offset, msm_obj->sgt, obj->size);
+                       msm_obj->domain[id].iova = 0;
+               }
+       }
+}
+
 /* should be called under struct_mutex.. although it can be called
  * from atomic context without struct_mutex to acquire an extra
  * iova ref if you know one is already held.
@@ -608,9 +628,7 @@ void msm_gem_describe_objects(struct list_head *list, struct seq_file *m)
 void msm_gem_free_object(struct drm_gem_object *obj)
 {
        struct drm_device *dev = obj->dev;
-       struct msm_drm_private *priv = obj->dev->dev_private;
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
-       int id;
 
        WARN_ON(!mutex_is_locked(&dev->struct_mutex));
 
@@ -619,13 +637,7 @@ void msm_gem_free_object(struct drm_gem_object *obj)
 
        list_del(&msm_obj->mm_list);
 
-       for (id = 0; id < ARRAY_SIZE(msm_obj->domain); id++) {
-               struct msm_mmu *mmu = priv->mmus[id];
-               if (mmu && msm_obj->domain[id].iova) {
-                       uint32_t offset = msm_obj->domain[id].iova;
-                       mmu->funcs->unmap(mmu, offset, msm_obj->sgt, obj->size);
-               }
-       }
+       put_iova(obj);
 
        if (obj->import_attach) {
                if (msm_obj->vaddr)