From: SeokYeon Hwang Date: Sun, 24 Apr 2016 09:14:54 +0000 (+0900) Subject: vigs: convert to dma_fence X-Git-Tag: submit/tizen/20160607.132125~9 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b865efb442716433f63e73d587a11e100829e7a8;p=sdk%2Femulator%2Femulator-kernel.git vigs: convert to dma_fence Change-Id: I5aca420358b0160fb52501bf06d93f3a53694bf9 Signed-off-by: SeokYeon Hwang --- diff --git a/drivers/gpu/drm/vigs/vigs_comm.c b/drivers/gpu/drm/vigs/vigs_comm.c index 1171cfe0b889..17a466a62aaa 100644 --- a/drivers/gpu/drm/vigs/vigs_comm.c +++ b/drivers/gpu/drm/vigs/vigs_comm.c @@ -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); diff --git a/drivers/gpu/drm/vigs/vigs_execbuffer.c b/drivers/gpu/drm/vigs/vigs_execbuffer.c index 6795aa1835da..86a165d47092 100644 --- a/drivers/gpu/drm/vigs/vigs_execbuffer.c +++ b/drivers/gpu/drm/vigs/vigs_execbuffer.c @@ -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); diff --git a/drivers/gpu/drm/vigs/vigs_fence.c b/drivers/gpu/drm/vigs/vigs_fence.c index 8a9b34993919..f9404f6e8dad 100644 --- a/drivers/gpu/drm/vigs/vigs_fence.c +++ b/drivers/gpu/drm/vigs/vigs_fence.c @@ -5,34 +5,32 @@ #include "vigs_comm.h" #include -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); diff --git a/drivers/gpu/drm/vigs/vigs_fence.h b/drivers/gpu/drm/vigs/vigs_fence.h index c0c41be78506..b14fa9d9def1 100644 --- a/drivers/gpu/drm/vigs/vigs_fence.h +++ b/drivers/gpu/drm/vigs/vigs_fence.h @@ -2,6 +2,8 @@ #define _VIGS_FENCE_H_ #include "drmP.h" +#include +#include #include #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. */ diff --git a/drivers/gpu/drm/vigs/vigs_fenceman.c b/drivers/gpu/drm/vigs/vigs_fenceman.c index c551852c42cb..546fe9166727 100644 --- a/drivers/gpu/drm/vigs/vigs_fenceman.c +++ b/drivers/gpu/drm/vigs/vigs_fenceman.c @@ -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); } } diff --git a/drivers/gpu/drm/vigs/vigs_fenceman.h b/drivers/gpu/drm/vigs/vigs_fenceman.h index e6e10284a3c4..2774a535c963 100644 --- a/drivers/gpu/drm/vigs/vigs_fenceman.h +++ b/drivers/gpu/drm/vigs/vigs_fenceman.h @@ -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); diff --git a/drivers/gpu/drm/vigs/vigs_gem.c b/drivers/gpu/drm/vigs/vigs_gem.c index e456f72ad63f..2cf26084e580 100644 --- a/drivers/gpu/drm/vigs/vigs_gem.c +++ b/drivers/gpu/drm/vigs/vigs_gem.c @@ -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; } diff --git a/drivers/gpu/drm/vigs/vigs_mman.c b/drivers/gpu/drm/vigs/vigs_mman.c index 4f69d15604be..fa22fdd18edf 100644 --- a/drivers/gpu/drm/vigs/vigs_mman.c +++ b/drivers/gpu/drm/vigs/vigs_mman.c @@ -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,