drm/msm/gem: Rename to pin/unpin_pages
[linux-2.6-microblaze.git] / drivers / gpu / drm / msm / msm_gem.c
index 8ddbd2e..3da64c7 100644 (file)
@@ -19,7 +19,7 @@
 #include "msm_gpu.h"
 #include "msm_mmu.h"
 
-static void update_inactive(struct msm_gem_object *msm_obj);
+static void update_lru(struct drm_gem_object *obj);
 
 static dma_addr_t physaddr(struct drm_gem_object *obj)
 {
@@ -132,7 +132,7 @@ static struct page **get_pages(struct drm_gem_object *obj)
                if (msm_obj->flags & MSM_BO_WC)
                        sync_for_device(msm_obj);
 
-               update_inactive(msm_obj);
+               update_lru(obj);
        }
 
        return msm_obj->pages;
@@ -177,37 +177,45 @@ static void put_pages(struct drm_gem_object *obj)
        }
 }
 
-struct page **msm_gem_get_pages(struct drm_gem_object *obj)
+static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        struct page **p;
 
-       msm_gem_lock(obj);
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
 
        if (GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
-               msm_gem_unlock(obj);
                return ERR_PTR(-EBUSY);
        }
 
        p = get_pages(obj);
-
        if (!IS_ERR(p)) {
                msm_obj->pin_count++;
-               update_inactive(msm_obj);
+               update_lru(obj);
        }
 
+       return p;
+}
+
+struct page **msm_gem_pin_pages(struct drm_gem_object *obj)
+{
+       struct page **p;
+
+       msm_gem_lock(obj);
+       p = msm_gem_pin_pages_locked(obj);
        msm_gem_unlock(obj);
+
        return p;
 }
 
-void msm_gem_put_pages(struct drm_gem_object *obj)
+void msm_gem_unpin_pages(struct drm_gem_object *obj)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
 
        msm_gem_lock(obj);
        msm_obj->pin_count--;
        GEM_WARN_ON(msm_obj->pin_count < 0);
-       update_inactive(msm_obj);
+       update_lru(obj);
        msm_gem_unlock(obj);
 }
 
@@ -449,7 +457,7 @@ void msm_gem_unpin_locked(struct drm_gem_object *obj)
        msm_obj->pin_count--;
        GEM_WARN_ON(msm_obj->pin_count < 0);
 
-       update_inactive(msm_obj);
+       update_lru(obj);
 }
 
 struct msm_gem_vma *msm_gem_get_vma_locked(struct drm_gem_object *obj,
@@ -658,7 +666,7 @@ static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
                        goto fail;
                }
 
-               update_inactive(msm_obj);
+               update_lru(obj);
        }
 
        return msm_obj->vaddr;
@@ -730,7 +738,7 @@ int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv)
         * between inactive lists
         */
        if (msm_obj->active_count == 0)
-               update_inactive(msm_obj);
+               update_lru(obj);
 
        msm_gem_unlock(obj);
 
@@ -757,7 +765,7 @@ void msm_gem_purge(struct drm_gem_object *obj)
        put_iova_vmas(obj);
 
        msm_obj->madv = __MSM_MADV_PURGED;
-       update_inactive(msm_obj);
+       update_lru(obj);
 
        drm_gem_free_mmap_offset(obj);
 
@@ -792,7 +800,7 @@ void msm_gem_evict(struct drm_gem_object *obj)
 
        put_pages(obj);
 
-       update_inactive(msm_obj);
+       update_lru(obj);
 }
 
 void msm_gem_vunmap(struct drm_gem_object *obj)
@@ -835,13 +843,14 @@ void msm_gem_active_put(struct drm_gem_object *obj)
        GEM_WARN_ON(!msm_gem_is_locked(obj));
 
        if (--msm_obj->active_count == 0) {
-               update_inactive(msm_obj);
+               update_lru(obj);
        }
 }
 
-static void update_inactive(struct msm_gem_object *msm_obj)
+static void update_lru(struct drm_gem_object *obj)
 {
-       struct msm_drm_private *priv = msm_obj->base.dev->dev_private;
+       struct msm_drm_private *priv = obj->dev->dev_private;
+       struct msm_gem_object *msm_obj = to_msm_bo(obj);
 
        GEM_WARN_ON(!msm_gem_is_locked(&msm_obj->base));
 
@@ -870,6 +879,16 @@ static void update_inactive(struct msm_gem_object *msm_obj)
        mutex_unlock(&priv->mm_lock);
 }
 
+bool msm_gem_active(struct drm_gem_object *obj)
+{
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
+
+       if (to_msm_bo(obj)->pin_count)
+               return true;
+
+       return !dma_resv_test_signaled(obj->resv, dma_resv_usage_rw(true));
+}
+
 int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout)
 {
        bool write = !!(op & MSM_PREP_WRITE);