vigs: convert to dma_fence 40/67040/11
authorSeokYeon Hwang <syeon.hwang@samsung.com>
Sun, 24 Apr 2016 09:14:54 +0000 (18:14 +0900)
committerSeokYeon Hwang <syeon.hwang@samsung.com>
Tue, 3 May 2016 08:38:55 +0000 (01:38 -0700)
Change-Id: I5aca420358b0160fb52501bf06d93f3a53694bf9
Signed-off-by: SeokYeon Hwang <syeon.hwang@samsung.com>
drivers/gpu/drm/vigs/vigs_comm.c
drivers/gpu/drm/vigs/vigs_execbuffer.c
drivers/gpu/drm/vigs/vigs_fence.c
drivers/gpu/drm/vigs/vigs_fence.h
drivers/gpu/drm/vigs/vigs_fenceman.c
drivers/gpu/drm/vigs/vigs_fenceman.h
drivers/gpu/drm/vigs/vigs_gem.c
drivers/gpu/drm/vigs/vigs_mman.c

index 1171cfe0b8890fc88d6355258efb57cc5b5d5d70..17a466a62aaaa820d7775478a1dc8ebc0e35f8d7 100644 (file)
@@ -318,7 +318,7 @@ int vigs_comm_set_root_surface(struct vigs_comm *comm,
     mutex_unlock(&comm->mutex);
 
     if ((ret == 0) && fence) {
-        vigs_fence_wait(fence, false);
+        fence_wait(&fence->base, false);
     }
 
     vigs_fence_unref(fence);
@@ -361,7 +361,7 @@ int vigs_comm_update_vram(struct vigs_comm *comm,
     mutex_unlock(&comm->mutex);
 
     if (ret == 0) {
-        vigs_fence_wait(fence, false);
+        fence_wait(&fence->base, false);
     }
 
     vigs_fence_unref(fence);
@@ -411,7 +411,7 @@ int vigs_comm_update_gpu(struct vigs_comm *comm,
     mutex_unlock(&comm->mutex);
 
     if (ret == 0) {
-        vigs_fence_wait(fence, false);
+        fence_wait(&fence->base, false);
     }
 
     vigs_fence_unref(fence);
@@ -485,7 +485,7 @@ int vigs_comm_fence(struct vigs_comm *comm, struct vigs_fence *fence)
     struct vigsp_cmd_batch_header *batch_header;
     int ret;
 
-    DRM_DEBUG_DRIVER("seq = %u\n", fence->seq);
+    DRM_DEBUG_DRIVER("seq = %u\n", fence->base.seqno);
 
     mutex_lock(&comm->mutex);
 
index 6795aa1835da4121a2071e4467a0c896f6dee873..86a165d470922eb71fb4b5bf6380099a1617f454 100644 (file)
@@ -394,7 +394,7 @@ void vigs_execbuffer_fence(struct vigs_execbuffer *execbuffer,
 {
     struct vigsp_cmd_batch_header *batch_header = execbuffer->gem.kptr;
 
-    batch_header->fence_seq = fence->seq;
+    batch_header->fence_seq = fence->base.seqno;
 }
 
 void vigs_execbuffer_clear_validations(struct vigs_execbuffer *execbuffer,
@@ -530,10 +530,10 @@ int vigs_execbuffer_exec_ioctl(struct drm_device *drm_dev,
 
         vigs_comm_exec(vigs_dev->comm, execbuffer);
 
-        ttm_eu_fence_buffer_objects(&ticket, &list, (void *)fence);
+        ttm_eu_fence_buffer_objects(&ticket, &list, &fence->base);
 
         if (sync) {
-            vigs_fence_wait(fence, false);
+            fence_wait(&fence->base, false);
         }
 
         vigs_fence_unref(fence);
index 8a9b349939191285dde4de98d0887db6d168c3c3..f9404f6e8dadc5b6da0289010de5ae61a1ec062e 100644 (file)
@@ -5,34 +5,32 @@
 #include "vigs_comm.h"
 #include <drm/vigs_drm.h>
 
-static void vigs_fence_cleanup(struct vigs_fence *fence)
-{
-}
-
 static void vigs_fence_destroy(struct vigs_fence *fence)
 {
-    vigs_fence_cleanup(fence);
-    kfree(fence);
+       fence_free(&fence->base);
 }
 
 static void vigs_user_fence_destroy(struct vigs_fence *fence)
 {
     struct vigs_user_fence *user_fence = vigs_fence_to_vigs_user_fence(fence);
 
-    vigs_fence_cleanup(&user_fence->fence);
     ttm_base_object_kfree(user_fence, base);
 }
 
-static void vigs_fence_release_locked(struct kref *kref)
+static void vigs_fence_release(struct fence *f)
 {
-    struct vigs_fence *fence = kref_to_vigs_fence(kref);
-
-    DRM_DEBUG_DRIVER("Fence destroyed (seq = %u, signaled = %u)\n",
-                     fence->seq,
-                     fence->signaled);
-
-    list_del_init(&fence->list);
-    fence->destroy(fence);
+       struct vigs_fence *fence =
+               container_of(f, struct vigs_fence, base);
+       unsigned long flags;
+
+       DRM_DEBUG_DRIVER("Fence destroyed (seq = %u, signaled = %u)\n",
+                       f->seqno,
+                       fence_is_signaled(f));
+
+       spin_lock_irqsave(f->lock, flags);
+       list_del_init(&fence->list);
+       spin_unlock_irqrestore(f->lock, flags);
+       fence->destroy(fence);
 }
 
 static void vigs_user_fence_refcount_release(struct ttm_base_object **base)
@@ -44,29 +42,58 @@ static void vigs_user_fence_refcount_release(struct ttm_base_object **base)
     *base = NULL;
 }
 
+static const char* vigs_get_driver_name(struct fence *f)
+{
+    return "VIGS";
+}
+
+static const char *vigs_fence_get_timeline_name(struct fence *f)
+{
+    return "svga";
+}
+
+static bool vigs_fence_enable_signaling(struct fence *f)
+{
+    return true;
+}
+
+static signed long
+vigs_fence_wait(struct fence *fence, bool intr, signed long timeout)
+{
+    // use default
+    return fence_default_wait(fence, intr, timeout);
+}
+
+const struct fence_ops vigs_fence_ops = {
+    .release = vigs_fence_release,
+    .get_driver_name = vigs_get_driver_name,
+    .get_timeline_name = vigs_fence_get_timeline_name,
+    .enable_signaling = vigs_fence_enable_signaling,
+    .wait = vigs_fence_wait,
+};
+
 static void vigs_fence_init(struct vigs_fence *fence,
                             struct vigs_fenceman *fenceman,
                             void (*destroy)(struct vigs_fence*))
 {
     unsigned long flags;
+       uint32_t seq;
 
-    kref_init(&fence->kref);
     INIT_LIST_HEAD(&fence->list);
     fence->fenceman = fenceman;
-    fence->signaled = false;
-    init_waitqueue_head(&fence->wait);
     fence->destroy = destroy;
 
     spin_lock_irqsave(&fenceman->lock, flags);
 
-    fence->seq = vigs_fence_seq_next(fenceman->seq);
-    fenceman->seq = fence->seq;
+    seq = vigs_fence_seq_next(&fenceman->seq);
+    fence_init(&fence->base, &vigs_fence_ops, &fenceman->lock,
+         fenceman->ctx, seq);
 
     list_add_tail(&fence->list, &fenceman->fence_list);
 
     spin_unlock_irqrestore(&fenceman->lock, flags);
 
-    DRM_DEBUG_DRIVER("Fence created (seq = %u)\n", fence->seq);
+    DRM_DEBUG_DRIVER("Fence created (seq = %u)\n", fence->base.seqno);
 }
 
 int vigs_fence_create(struct vigs_fenceman *fenceman,
@@ -108,12 +135,12 @@ int vigs_user_fence_create(struct vigs_fenceman *fenceman,
 
     vigs_fence_init(&(*user_fence)->fence, fenceman, &vigs_user_fence_destroy);
 
+    vigs_fence_ref(&(*user_fence)->fence);
     ret = ttm_base_object_init(vigs_file->obj_file,
                                &(*user_fence)->base, false,
                                VIGS_FENCE_TYPE,
                                &vigs_user_fence_refcount_release,
                                NULL);
-
     if (ret != 0) {
         goto fail2;
     }
@@ -121,14 +148,13 @@ int vigs_user_fence_create(struct vigs_fenceman *fenceman,
     /*
      * For ttm_base_object.
      */
-    vigs_fence_ref(&(*user_fence)->fence);
 
     *handle = (*user_fence)->base.hash.key;
 
     return 0;
 
 fail2:
-    vigs_fence_cleanup(&(*user_fence)->fence);
+    vigs_fence_unref(&(*user_fence)->fence);
     kfree(*user_fence);
 fail1:
     *user_fence = NULL;
@@ -136,71 +162,16 @@ fail1:
     return ret;
 }
 
-int vigs_fence_wait(struct vigs_fence *fence, bool interruptible)
-{
-    long ret = 0;
-
-    if (vigs_fence_signaled(fence)) {
-        DRM_DEBUG_DRIVER("Fence wait (seq = %u, signaled = %u)\n",
-                         fence->seq,
-                         fence->signaled);
-        return 0;
-    }
-
-    DRM_DEBUG_DRIVER("Fence wait (seq = %u)\n", fence->seq);
-
-    if (interruptible) {
-        ret = wait_event_interruptible(fence->wait, vigs_fence_signaled(fence));
-    } else {
-        wait_event(fence->wait, vigs_fence_signaled(fence));
-    }
-
-    if (ret != 0) {
-        DRM_INFO("Fence wait interrupted (seq = %u) = %ld\n", fence->seq, ret);
-    } else {
-        DRM_DEBUG_DRIVER("Fence wait done (seq = %u)\n", fence->seq);
-    }
-
-    return ret;
-}
-
-bool vigs_fence_signaled(struct vigs_fence *fence)
-{
-    unsigned long flags;
-    bool signaled;
-
-    spin_lock_irqsave(&fence->fenceman->lock, flags);
-
-    signaled = fence->signaled;
-
-    spin_unlock_irqrestore(&fence->fenceman->lock, flags);
-
-    return signaled;
-}
-
 void vigs_fence_ref(struct vigs_fence *fence)
 {
-    if (unlikely(!fence)) {
-        return;
-    }
-
-    kref_get(&fence->kref);
+    if (fence)
+        fence_get(&fence->base);
 }
 
 void vigs_fence_unref(struct vigs_fence *fence)
 {
-    struct vigs_fenceman *fenceman;
-
-    if (unlikely(!fence)) {
-        return;
-    }
-
-    fenceman = fence->fenceman;
-
-    spin_lock_irq(&fenceman->lock);
-    BUG_ON(atomic_read(&fence->kref.refcount) == 0);
-    kref_put(&fence->kref, vigs_fence_release_locked);
-    spin_unlock_irq(&fenceman->lock);
+    if (fence)
+        fence_put(&fence->base);
 }
 
 int vigs_fence_create_ioctl(struct drm_device *drm_dev,
@@ -235,7 +206,7 @@ int vigs_fence_create_ioctl(struct drm_device *drm_dev,
     }
 
     args->handle = handle;
-    args->seq = user_fence->fence.seq;
+    args->seq = user_fence->fence.base.seqno;
 
 out:
     vigs_fence_unref(&user_fence->fence);
@@ -261,7 +232,7 @@ int vigs_fence_wait_ioctl(struct drm_device *drm_dev,
 
     user_fence = base_to_vigs_user_fence(base);
 
-    ret = vigs_fence_wait(&user_fence->fence, true);
+    ret = fence_wait(&user_fence->fence.base, true);
 
     ttm_base_object_unref(&base);
 
@@ -285,7 +256,7 @@ int vigs_fence_signaled_ioctl(struct drm_device *drm_dev,
 
     user_fence = base_to_vigs_user_fence(base);
 
-    args->signaled = vigs_fence_signaled(&user_fence->fence);
+    args->signaled = fence_is_signaled(&user_fence->fence.base);
 
     ttm_base_object_unref(&base);
 
index c0c41be785064b9c3495989f0d257dbc9d6be1b9..b14fa9d9def1bc45b17c639dce3c705d83dc735b 100644 (file)
@@ -2,6 +2,8 @@
 #define _VIGS_FENCE_H_
 
 #include "drmP.h"
+#include <linux/fence.h>
+#include <ttm/ttm_object.h>
 #include <ttm/ttm_object.h>
 
 #define VIGS_FENCE_TYPE ttm_driver_type2
@@ -10,18 +12,9 @@ struct vigs_fenceman;
 
 struct vigs_fence
 {
-    struct kref kref;
-
+    struct fence base;
     struct list_head list;
-
     struct vigs_fenceman *fenceman;
-
-    uint32_t seq;
-
-    bool signaled;
-
-    wait_queue_head_t wait;
-
     void (*destroy)(struct vigs_fence *fence);
 };
 
@@ -35,15 +28,9 @@ struct vigs_fence
 struct vigs_user_fence
 {
     struct ttm_base_object base;
-
     struct vigs_fence fence;
 };
 
-static inline struct vigs_fence *kref_to_vigs_fence(struct kref *kref)
-{
-    return container_of(kref, struct vigs_fence, kref);
-}
-
 static inline struct vigs_user_fence *vigs_fence_to_vigs_user_fence(struct vigs_fence *fence)
 {
     return container_of(fence, struct vigs_user_fence, fence);
@@ -54,12 +41,12 @@ static inline struct vigs_user_fence *base_to_vigs_user_fence(struct ttm_base_ob
     return container_of(base, struct vigs_user_fence, base);
 }
 
-static inline uint32_t vigs_fence_seq_next(uint32_t seq)
+static inline uint32_t vigs_fence_seq_next(uint32_t *seq)
 {
-    if (++seq == 0) {
-        ++seq;
+    if (++(*seq) == 0) {
+        ++(*seq);
     }
-    return seq;
+    return *seq;
 }
 
 #define vigs_fence_seq_num_after(a, b) \
@@ -81,10 +68,6 @@ int vigs_user_fence_create(struct vigs_fenceman *fenceman,
                            struct vigs_user_fence **user_fence,
                            uint32_t *handle);
 
-int vigs_fence_wait(struct vigs_fence *fence, bool interruptible);
-
-bool vigs_fence_signaled(struct vigs_fence *fence);
-
 /*
  * Passing NULL won't hurt, this is for convenience.
  */
index c551852c42cb86751bb5d7d0e37bc954ab5c7bd5..546fe91667275a85a8708cddad4f3849269a4ab0 100644 (file)
@@ -17,6 +17,7 @@ int vigs_fenceman_create(struct vigs_fenceman **fenceman)
     spin_lock_init(&(*fenceman)->lock);
     INIT_LIST_HEAD(&(*fenceman)->fence_list);
     (*fenceman)->seq = UINT_MAX;
+    (*fenceman)->ctx = fence_context_alloc(1);
 
     return 0;
 
@@ -51,13 +52,12 @@ void vigs_fenceman_ack(struct vigs_fenceman *fenceman,
     spin_lock_irqsave(&fenceman->lock, flags);
 
     list_for_each_entry_safe(fence, tmp, &fenceman->fence_list, list) {
-        if (vigs_fence_seq_num_after_eq(fence->seq, lower) &&
-            vigs_fence_seq_num_before_eq(fence->seq, upper)) {
+        if (vigs_fence_seq_num_after_eq(fence->base.seqno, lower) &&
+            vigs_fence_seq_num_before_eq(fence->base.seqno, upper)) {
             DRM_DEBUG_DRIVER("Fence signaled (seq = %u)\n",
-                             fence->seq);
+                             fence->base.seqno);
             list_del_init(&fence->list);
-            fence->signaled = true;
-            wake_up_all(&fence->wait);
+            fence_signal_locked(&fence->base);
         }
     }
 
index e6e10284a3c4042346fcebe8b297f9157096a2b6..2774a535c963a7096598e8759e8326d18beb8b51 100644 (file)
@@ -32,6 +32,8 @@ struct vigs_fenceman
      * a special value that tells GPU not to fence things.
      */
     uint32_t seq;
+
+    unsigned ctx;
 };
 
 int vigs_fenceman_create(struct vigs_fenceman **fenceman);
index e456f72ad63f0844b035a5f0fbf34331fd551288..2cf26084e580dcd6acbdcae8651f5391379b4d5c 100644 (file)
@@ -249,12 +249,8 @@ int vigs_gem_wait(struct vigs_gem_object *vigs_gem)
 {
     int ret;
 
-    spin_lock(&vigs_gem->bo.bdev->fence_lock);
-
     ret = ttm_bo_wait(&vigs_gem->bo, true, false, false);
 
-    spin_unlock(&vigs_gem->bo.bdev->fence_lock);
-
     return ret;
 }
 
index 4f69d15604bee90e70c68b5a79d51d1ec7aa33a9..fa22fdd18edf1b15c9a041834b50e3d30449acfc 100644 (file)
@@ -270,36 +270,6 @@ static int vigs_ttm_verify_access(struct ttm_buffer_object *bo,
     return 0;
 }
 
-static bool vigs_ttm_sync_obj_signaled(void *sync_obj)
-{
-    return vigs_fence_signaled((struct vigs_fence*)sync_obj);
-}
-
-static int vigs_ttm_sync_obj_wait(void *sync_obj,
-                                  bool lazy,
-                                  bool interruptible)
-{
-    return vigs_fence_wait((struct vigs_fence*)sync_obj, interruptible);
-}
-
-static int vigs_ttm_sync_obj_flush(void *sync_obj)
-{
-    return 0;
-}
-
-static void vigs_ttm_sync_obj_unref(void **sync_obj)
-{
-    struct vigs_fence* fence = *sync_obj;
-    vigs_fence_unref(fence);
-    *sync_obj = NULL;
-}
-
-static void *vigs_ttm_sync_obj_ref(void *sync_obj)
-{
-    vigs_fence_ref((struct vigs_fence*)sync_obj);
-    return sync_obj;
-}
-
 static int vigs_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
 {
     struct ttm_place placements[1];
@@ -391,11 +361,6 @@ static struct ttm_bo_driver vigs_ttm_bo_driver =
     .evict_flags = &vigs_ttm_evict_flags,
     .move = &vigs_ttm_move,
     .verify_access = &vigs_ttm_verify_access,
-    .sync_obj_signaled = vigs_ttm_sync_obj_signaled,
-    .sync_obj_wait = vigs_ttm_sync_obj_wait,
-    .sync_obj_flush = vigs_ttm_sync_obj_flush,
-    .sync_obj_unref = vigs_ttm_sync_obj_unref,
-    .sync_obj_ref = vigs_ttm_sync_obj_ref,
     .fault_reserve_notify = &vigs_ttm_fault_reserve_notify,
     .io_mem_reserve = &vigs_ttm_io_mem_reserve,
     .io_mem_free = &vigs_ttm_io_mem_free,