dma-buf: Rename struct fence to dma_fence
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 25 Oct 2016 12:00:45 +0000 (13:00 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 25 Oct 2016 12:40:39 +0000 (14:40 +0200)
I plan to usurp the short name of struct fence for a core kernel struct,
and so I need to rename the specialised fence/timeline for DMA
operations to make room.

A consensus was reached in
https://lists.freedesktop.org/archives/dri-devel/2016-July/113083.html
that making clear this fence applies to DMA operations was a good thing.
Since then the patch has grown a bit as usage increases, so hopefully it
remains a good thing!

(v2...: rebase, rerun spatch)
v3: Compile on msm, spotted a manual fixup that I broke.
v4: Try again for msm, sorry Daniel

coccinelle script:
@@

@@
- struct fence
+ struct dma_fence
@@

@@
- struct fence_ops
+ struct dma_fence_ops
@@

@@
- struct fence_cb
+ struct dma_fence_cb
@@

@@
- struct fence_array
+ struct dma_fence_array
@@

@@
- enum fence_flag_bits
+ enum dma_fence_flag_bits
@@

@@
(
- fence_init
+ dma_fence_init
|
- fence_release
+ dma_fence_release
|
- fence_free
+ dma_fence_free
|
- fence_get
+ dma_fence_get
|
- fence_get_rcu
+ dma_fence_get_rcu
|
- fence_put
+ dma_fence_put
|
- fence_signal
+ dma_fence_signal
|
- fence_signal_locked
+ dma_fence_signal_locked
|
- fence_default_wait
+ dma_fence_default_wait
|
- fence_add_callback
+ dma_fence_add_callback
|
- fence_remove_callback
+ dma_fence_remove_callback
|
- fence_enable_sw_signaling
+ dma_fence_enable_sw_signaling
|
- fence_is_signaled_locked
+ dma_fence_is_signaled_locked
|
- fence_is_signaled
+ dma_fence_is_signaled
|
- fence_is_later
+ dma_fence_is_later
|
- fence_later
+ dma_fence_later
|
- fence_wait_timeout
+ dma_fence_wait_timeout
|
- fence_wait_any_timeout
+ dma_fence_wait_any_timeout
|
- fence_wait
+ dma_fence_wait
|
- fence_context_alloc
+ dma_fence_context_alloc
|
- fence_array_create
+ dma_fence_array_create
|
- to_fence_array
+ to_dma_fence_array
|
- fence_is_array
+ dma_fence_is_array
|
- trace_fence_emit
+ trace_dma_fence_emit
|
- FENCE_TRACE
+ DMA_FENCE_TRACE
|
- FENCE_WARN
+ DMA_FENCE_WARN
|
- FENCE_ERR
+ DMA_FENCE_ERR
)
 (
 ...
 )

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Acked-by: Sumit Semwal <sumit.semwal@linaro.org>
Acked-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20161025120045.28839-1-chris@chris-wilson.co.uk
114 files changed:
Documentation/sync_file.txt
drivers/base/Kconfig
drivers/dma-buf/Kconfig
drivers/dma-buf/Makefile
drivers/dma-buf/dma-buf.c
drivers/dma-buf/dma-fence-array.c [new file with mode: 0644]
drivers/dma-buf/dma-fence.c [new file with mode: 0644]
drivers/dma-buf/fence-array.c [deleted file]
drivers/dma-buf/fence.c [deleted file]
drivers/dma-buf/reservation.c
drivers/dma-buf/seqno-fence.c
drivers/dma-buf/sw_sync.c
drivers/dma-buf/sync_debug.c
drivers/dma-buf/sync_debug.h
drivers/dma-buf/sync_file.c
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
drivers/gpu/drm/amd/amdgpu/cik_sdma.c
drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
drivers/gpu/drm/amd/amdgpu/si_dma.c
drivers/gpu/drm/amd/scheduler/gpu_sched_trace.h
drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
drivers/gpu/drm/amd/scheduler/sched_fence.c
drivers/gpu/drm/drm_atomic.c
drivers/gpu/drm/drm_atomic_helper.c
drivers/gpu/drm/drm_fops.c
drivers/gpu/drm/etnaviv/etnaviv_gem.c
drivers/gpu/drm/etnaviv/etnaviv_gpu.c
drivers/gpu/drm/etnaviv/etnaviv_gpu.h
drivers/gpu/drm/i915/i915_gem_request.c
drivers/gpu/drm/i915/i915_gem_request.h
drivers/gpu/drm/i915/i915_sw_fence.c
drivers/gpu/drm/i915/i915_sw_fence.h
drivers/gpu/drm/i915/i915_trace.h
drivers/gpu/drm/i915/intel_breadcrumbs.c
drivers/gpu/drm/i915/intel_engine_cs.c
drivers/gpu/drm/msm/msm_drv.h
drivers/gpu/drm/msm/msm_fence.c
drivers/gpu/drm/msm/msm_fence.h
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem.h
drivers/gpu/drm/msm/msm_gem_submit.c
drivers/gpu/drm/msm/msm_gpu.c
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_fence.c
drivers/gpu/drm/nouveau/nouveau_fence.h
drivers/gpu/drm/nouveau/nouveau_gem.c
drivers/gpu/drm/nouveau/nv04_fence.c
drivers/gpu/drm/nouveau/nv10_fence.c
drivers/gpu/drm/nouveau/nv17_fence.c
drivers/gpu/drm/nouveau/nv50_fence.c
drivers/gpu/drm/nouveau/nv84_fence.c
drivers/gpu/drm/qxl/qxl_drv.h
drivers/gpu/drm/qxl/qxl_release.c
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/radeon_display.c
drivers/gpu/drm/radeon/radeon_fence.c
drivers/gpu/drm/radeon/radeon_sync.c
drivers/gpu/drm/radeon/radeon_uvd.c
drivers/gpu/drm/ttm/ttm_bo.c
drivers/gpu/drm/ttm/ttm_bo_util.c
drivers/gpu/drm/ttm/ttm_bo_vm.c
drivers/gpu/drm/ttm/ttm_execbuf_util.c
drivers/gpu/drm/vgem/vgem_fence.c
drivers/gpu/drm/virtio/virtgpu_drv.h
drivers/gpu/drm/virtio/virtgpu_fence.c
drivers/gpu/drm/virtio/virtgpu_ioctl.c
drivers/gpu/drm/virtio/virtgpu_kms.c
drivers/gpu/drm/virtio/virtgpu_plane.c
drivers/gpu/drm/vmwgfx/vmwgfx_fence.c
drivers/gpu/drm/vmwgfx/vmwgfx_fence.h
drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
include/drm/drmP.h
include/drm/drm_crtc.h
include/drm/drm_plane.h
include/drm/ttm/ttm_bo_api.h
include/drm/ttm/ttm_bo_driver.h
include/drm/ttm/ttm_execbuf_util.h
include/linux/dma-buf.h
include/linux/dma-fence-array.h [new file with mode: 0644]
include/linux/dma-fence.h [new file with mode: 0644]
include/linux/fence-array.h [deleted file]
include/linux/fence.h [deleted file]
include/linux/reservation.h
include/linux/seqno-fence.h
include/linux/sync_file.h
include/trace/events/dma_fence.h [new file with mode: 0644]
include/trace/events/fence.h [deleted file]

index b63a68531afdedcab0944f9cd9b40742c9deac98..269681a6faec818ddf839c4f1c573ef9415478d4 100644 (file)
@@ -6,7 +6,7 @@
 
 This document serves as a guide for device drivers writers on what the
 sync_file API is, and how drivers can support it. Sync file is the carrier of
-the fences(struct fence) that are needed to synchronize between drivers or
+the fences(struct dma_fence) that are needed to synchronize between drivers or
 across process boundaries.
 
 The sync_file API is meant to be used to send and receive fence information
@@ -32,9 +32,9 @@ in-fences and out-fences
 Sync files can go either to or from userspace. When a sync_file is sent from
 the driver to userspace we call the fences it contains 'out-fences'. They are
 related to a buffer that the driver is processing or is going to process, so
-the driver creates an out-fence to be able to notify, through fence_signal(),
-when it has finished using (or processing) that buffer. Out-fences are fences
-that the driver creates.
+the driver creates an out-fence to be able to notify, through
+dma_fence_signal(), when it has finished using (or processing) that buffer.
+Out-fences are fences that the driver creates.
 
 On the other hand if the driver receives fence(s) through a sync_file from
 userspace we call these fence(s) 'in-fences'. Receiveing in-fences means that
@@ -47,7 +47,7 @@ Creating Sync Files
 When a driver needs to send an out-fence userspace it creates a sync_file.
 
 Interface:
-       struct sync_file *sync_file_create(struct fence *fence);
+       struct sync_file *sync_file_create(struct dma_fence *fence);
 
 The caller pass the out-fence and gets back the sync_file. That is just the
 first step, next it needs to install an fd on sync_file->file. So it gets an
@@ -72,11 +72,11 @@ of the Sync File to the kernel. The kernel can then retrieve the fences
 from it.
 
 Interface:
-       struct fence *sync_file_get_fence(int fd);
+       struct dma_fence *sync_file_get_fence(int fd);
 
 
 The returned reference is owned by the caller and must be disposed of
-afterwards using fence_put(). In case of error, a NULL is returned instead.
+afterwards using dma_fence_put(). In case of error, a NULL is returned instead.
 
 References:
 [1] struct sync_file in include/linux/sync_file.h
index fdf44cac08e6d0026dab6095f46b55924cd89b1d..37bf25c6b4a6b04b60a574299e5246c1ab064674 100644 (file)
@@ -248,11 +248,11 @@ config DMA_SHARED_BUFFER
          APIs extension; the file's descriptor can then be passed on to other
          driver.
 
-config FENCE_TRACE
-       bool "Enable verbose FENCE_TRACE messages"
+config DMA_FENCE_TRACE
+       bool "Enable verbose DMA_FENCE_TRACE messages"
        depends on DMA_SHARED_BUFFER
        help
-         Enable the FENCE_TRACE printks. This will add extra
+         Enable the DMA_FENCE_TRACE printks. This will add extra
          spam to the console log, but will make it easier to diagnose
          lockup related problems for dma-buffers shared across multiple
          devices.
index 2585821b24ab49622618ef99ed520830fe437b39..ed3b785bae37e1cd589697f04d1b868dc2fccd9b 100644 (file)
@@ -7,7 +7,7 @@ config SYNC_FILE
        select DMA_SHARED_BUFFER
        ---help---
          The Sync File Framework adds explicit syncronization via
-         userspace. It enables send/receive 'struct fence' objects to/from
+         userspace. It enables send/receive 'struct dma_fence' objects to/from
          userspace via Sync File fds for synchronization between drivers via
          userspace components. It has been ported from Android.
 
index 210a10bfad2b8173ec419b302da770a52133677f..c33bf88631479411549ab38cb96d748784e3f74c 100644 (file)
@@ -1,3 +1,3 @@
-obj-y := dma-buf.o fence.o reservation.o seqno-fence.o fence-array.o
+obj-y := dma-buf.o dma-fence.o dma-fence-array.o reservation.o seqno-fence.o
 obj-$(CONFIG_SYNC_FILE)                += sync_file.o
 obj-$(CONFIG_SW_SYNC)          += sw_sync.o sync_debug.o
index cf04d249a6a43b26b5168c3a7a55d54eff4ffcde..e72e64484131aee88fbf4586237a6e776ed2c5ff 100644 (file)
@@ -25,7 +25,7 @@
 #include <linux/fs.h>
 #include <linux/slab.h>
 #include <linux/dma-buf.h>
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 #include <linux/anon_inodes.h>
 #include <linux/export.h>
 #include <linux/debugfs.h>
@@ -124,7 +124,7 @@ static loff_t dma_buf_llseek(struct file *file, loff_t offset, int whence)
        return base + offset;
 }
 
-static void dma_buf_poll_cb(struct fence *fence, struct fence_cb *cb)
+static void dma_buf_poll_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
 {
        struct dma_buf_poll_cb_t *dcb = (struct dma_buf_poll_cb_t *)cb;
        unsigned long flags;
@@ -140,7 +140,7 @@ static unsigned int dma_buf_poll(struct file *file, poll_table *poll)
        struct dma_buf *dmabuf;
        struct reservation_object *resv;
        struct reservation_object_list *fobj;
-       struct fence *fence_excl;
+       struct dma_fence *fence_excl;
        unsigned long events;
        unsigned shared_count, seq;
 
@@ -187,20 +187,20 @@ retry:
                spin_unlock_irq(&dmabuf->poll.lock);
 
                if (events & pevents) {
-                       if (!fence_get_rcu(fence_excl)) {
+                       if (!dma_fence_get_rcu(fence_excl)) {
                                /* force a recheck */
                                events &= ~pevents;
                                dma_buf_poll_cb(NULL, &dcb->cb);
-                       } else if (!fence_add_callback(fence_excl, &dcb->cb,
-                                                      dma_buf_poll_cb)) {
+                       } else if (!dma_fence_add_callback(fence_excl, &dcb->cb,
+                                                          dma_buf_poll_cb)) {
                                events &= ~pevents;
-                               fence_put(fence_excl);
+                               dma_fence_put(fence_excl);
                        } else {
                                /*
                                 * No callback queued, wake up any additional
                                 * waiters.
                                 */
-                               fence_put(fence_excl);
+                               dma_fence_put(fence_excl);
                                dma_buf_poll_cb(NULL, &dcb->cb);
                        }
                }
@@ -222,9 +222,9 @@ retry:
                        goto out;
 
                for (i = 0; i < shared_count; ++i) {
-                       struct fence *fence = rcu_dereference(fobj->shared[i]);
+                       struct dma_fence *fence = rcu_dereference(fobj->shared[i]);
 
-                       if (!fence_get_rcu(fence)) {
+                       if (!dma_fence_get_rcu(fence)) {
                                /*
                                 * fence refcount dropped to zero, this means
                                 * that fobj has been freed
@@ -235,13 +235,13 @@ retry:
                                dma_buf_poll_cb(NULL, &dcb->cb);
                                break;
                        }
-                       if (!fence_add_callback(fence, &dcb->cb,
-                                               dma_buf_poll_cb)) {
-                               fence_put(fence);
+                       if (!dma_fence_add_callback(fence, &dcb->cb,
+                                                   dma_buf_poll_cb)) {
+                               dma_fence_put(fence);
                                events &= ~POLLOUT;
                                break;
                        }
-                       fence_put(fence);
+                       dma_fence_put(fence);
                }
 
                /* No callback queued, wake up any additional waiters. */
diff --git a/drivers/dma-buf/dma-fence-array.c b/drivers/dma-buf/dma-fence-array.c
new file mode 100644 (file)
index 0000000..67eb7c8
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * dma-fence-array: aggregate fences to be waited together
+ *
+ * Copyright (C) 2016 Collabora Ltd
+ * Copyright (C) 2016 Advanced Micro Devices, Inc.
+ * Authors:
+ *     Gustavo Padovan <gustavo@padovan.org>
+ *     Christian König <christian.koenig@amd.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ */
+
+#include <linux/export.h>
+#include <linux/slab.h>
+#include <linux/dma-fence-array.h>
+
+static const char *dma_fence_array_get_driver_name(struct dma_fence *fence)
+{
+       return "dma_fence_array";
+}
+
+static const char *dma_fence_array_get_timeline_name(struct dma_fence *fence)
+{
+       return "unbound";
+}
+
+static void dma_fence_array_cb_func(struct dma_fence *f,
+                                   struct dma_fence_cb *cb)
+{
+       struct dma_fence_array_cb *array_cb =
+               container_of(cb, struct dma_fence_array_cb, cb);
+       struct dma_fence_array *array = array_cb->array;
+
+       if (atomic_dec_and_test(&array->num_pending))
+               dma_fence_signal(&array->base);
+       dma_fence_put(&array->base);
+}
+
+static bool dma_fence_array_enable_signaling(struct dma_fence *fence)
+{
+       struct dma_fence_array *array = to_dma_fence_array(fence);
+       struct dma_fence_array_cb *cb = (void *)(&array[1]);
+       unsigned i;
+
+       for (i = 0; i < array->num_fences; ++i) {
+               cb[i].array = array;
+               /*
+                * As we may report that the fence is signaled before all
+                * callbacks are complete, we need to take an additional
+                * reference count on the array so that we do not free it too
+                * early. The core fence handling will only hold the reference
+                * until we signal the array as complete (but that is now
+                * insufficient).
+                */
+               dma_fence_get(&array->base);
+               if (dma_fence_add_callback(array->fences[i], &cb[i].cb,
+                                          dma_fence_array_cb_func)) {
+                       dma_fence_put(&array->base);
+                       if (atomic_dec_and_test(&array->num_pending))
+                               return false;
+               }
+       }
+
+       return true;
+}
+
+static bool dma_fence_array_signaled(struct dma_fence *fence)
+{
+       struct dma_fence_array *array = to_dma_fence_array(fence);
+
+       return atomic_read(&array->num_pending) <= 0;
+}
+
+static void dma_fence_array_release(struct dma_fence *fence)
+{
+       struct dma_fence_array *array = to_dma_fence_array(fence);
+       unsigned i;
+
+       for (i = 0; i < array->num_fences; ++i)
+               dma_fence_put(array->fences[i]);
+
+       kfree(array->fences);
+       dma_fence_free(fence);
+}
+
+const struct dma_fence_ops dma_fence_array_ops = {
+       .get_driver_name = dma_fence_array_get_driver_name,
+       .get_timeline_name = dma_fence_array_get_timeline_name,
+       .enable_signaling = dma_fence_array_enable_signaling,
+       .signaled = dma_fence_array_signaled,
+       .wait = dma_fence_default_wait,
+       .release = dma_fence_array_release,
+};
+EXPORT_SYMBOL(dma_fence_array_ops);
+
+/**
+ * dma_fence_array_create - Create a custom fence array
+ * @num_fences:                [in]    number of fences to add in the array
+ * @fences:            [in]    array containing the fences
+ * @context:           [in]    fence context to use
+ * @seqno:             [in]    sequence number to use
+ * @signal_on_any:     [in]    signal on any fence in the array
+ *
+ * Allocate a dma_fence_array object and initialize the base fence with
+ * dma_fence_init().
+ * In case of error it returns NULL.
+ *
+ * The caller should allocate the fences array with num_fences size
+ * and fill it with the fences it wants to add to the object. Ownership of this
+ * array is taken and dma_fence_put() is used on each fence on release.
+ *
+ * If @signal_on_any is true the fence array signals if any fence in the array
+ * signals, otherwise it signals when all fences in the array signal.
+ */
+struct dma_fence_array *dma_fence_array_create(int num_fences,
+                                              struct dma_fence **fences,
+                                              u64 context, unsigned seqno,
+                                              bool signal_on_any)
+{
+       struct dma_fence_array *array;
+       size_t size = sizeof(*array);
+
+       /* Allocate the callback structures behind the array. */
+       size += num_fences * sizeof(struct dma_fence_array_cb);
+       array = kzalloc(size, GFP_KERNEL);
+       if (!array)
+               return NULL;
+
+       spin_lock_init(&array->lock);
+       dma_fence_init(&array->base, &dma_fence_array_ops, &array->lock,
+                      context, seqno);
+
+       array->num_fences = num_fences;
+       atomic_set(&array->num_pending, signal_on_any ? 1 : num_fences);
+       array->fences = fences;
+
+       return array;
+}
+EXPORT_SYMBOL(dma_fence_array_create);
diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c
new file mode 100644 (file)
index 0000000..3a7bf00
--- /dev/null
@@ -0,0 +1,537 @@
+/*
+ * Fence mechanism for dma-buf and to allow for asynchronous dma access
+ *
+ * Copyright (C) 2012 Canonical Ltd
+ * Copyright (C) 2012 Texas Instruments
+ *
+ * Authors:
+ * Rob Clark <robdclark@gmail.com>
+ * Maarten Lankhorst <maarten.lankhorst@canonical.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ */
+
+#include <linux/slab.h>
+#include <linux/export.h>
+#include <linux/atomic.h>
+#include <linux/dma-fence.h>
+
+#define CREATE_TRACE_POINTS
+#include <trace/events/dma_fence.h>
+
+EXPORT_TRACEPOINT_SYMBOL(dma_fence_annotate_wait_on);
+EXPORT_TRACEPOINT_SYMBOL(dma_fence_emit);
+
+/*
+ * fence context counter: each execution context should have its own
+ * fence context, this allows checking if fences belong to the same
+ * context or not. One device can have multiple separate contexts,
+ * and they're used if some engine can run independently of another.
+ */
+static atomic64_t dma_fence_context_counter = ATOMIC64_INIT(0);
+
+/**
+ * dma_fence_context_alloc - allocate an array of fence contexts
+ * @num:       [in]    amount of contexts to allocate
+ *
+ * This function will return the first index of the number of fences allocated.
+ * The fence context is used for setting fence->context to a unique number.
+ */
+u64 dma_fence_context_alloc(unsigned num)
+{
+       BUG_ON(!num);
+       return atomic64_add_return(num, &dma_fence_context_counter) - num;
+}
+EXPORT_SYMBOL(dma_fence_context_alloc);
+
+/**
+ * dma_fence_signal_locked - signal completion of a fence
+ * @fence: the fence to signal
+ *
+ * Signal completion for software callbacks on a fence, this will unblock
+ * dma_fence_wait() calls and run all the callbacks added with
+ * dma_fence_add_callback(). Can be called multiple times, but since a fence
+ * can only go from unsignaled to signaled state, it will only be effective
+ * the first time.
+ *
+ * Unlike dma_fence_signal, this function must be called with fence->lock held.
+ */
+int dma_fence_signal_locked(struct dma_fence *fence)
+{
+       struct dma_fence_cb *cur, *tmp;
+       int ret = 0;
+
+       lockdep_assert_held(fence->lock);
+
+       if (WARN_ON(!fence))
+               return -EINVAL;
+
+       if (!ktime_to_ns(fence->timestamp)) {
+               fence->timestamp = ktime_get();
+               smp_mb__before_atomic();
+       }
+
+       if (test_and_set_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
+               ret = -EINVAL;
+
+               /*
+                * we might have raced with the unlocked dma_fence_signal,
+                * still run through all callbacks
+                */
+       } else
+               trace_dma_fence_signaled(fence);
+
+       list_for_each_entry_safe(cur, tmp, &fence->cb_list, node) {
+               list_del_init(&cur->node);
+               cur->func(fence, cur);
+       }
+       return ret;
+}
+EXPORT_SYMBOL(dma_fence_signal_locked);
+
+/**
+ * dma_fence_signal - signal completion of a fence
+ * @fence: the fence to signal
+ *
+ * Signal completion for software callbacks on a fence, this will unblock
+ * dma_fence_wait() calls and run all the callbacks added with
+ * dma_fence_add_callback(). Can be called multiple times, but since a fence
+ * can only go from unsignaled to signaled state, it will only be effective
+ * the first time.
+ */
+int dma_fence_signal(struct dma_fence *fence)
+{
+       unsigned long flags;
+
+       if (!fence)
+               return -EINVAL;
+
+       if (!ktime_to_ns(fence->timestamp)) {
+               fence->timestamp = ktime_get();
+               smp_mb__before_atomic();
+       }
+
+       if (test_and_set_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
+               return -EINVAL;
+
+       trace_dma_fence_signaled(fence);
+
+       if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &fence->flags)) {
+               struct dma_fence_cb *cur, *tmp;
+
+               spin_lock_irqsave(fence->lock, flags);
+               list_for_each_entry_safe(cur, tmp, &fence->cb_list, node) {
+                       list_del_init(&cur->node);
+                       cur->func(fence, cur);
+               }
+               spin_unlock_irqrestore(fence->lock, flags);
+       }
+       return 0;
+}
+EXPORT_SYMBOL(dma_fence_signal);
+
+/**
+ * dma_fence_wait_timeout - sleep until the fence gets signaled
+ * or until timeout elapses
+ * @fence:     [in]    the fence to wait on
+ * @intr:      [in]    if true, do an interruptible wait
+ * @timeout:   [in]    timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
+ *
+ * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or the
+ * remaining timeout in jiffies on success. Other error values may be
+ * returned on custom implementations.
+ *
+ * Performs a synchronous wait on this fence. It is assumed the caller
+ * directly or indirectly (buf-mgr between reservation and committing)
+ * holds a reference to the fence, otherwise the fence might be
+ * freed before return, resulting in undefined behavior.
+ */
+signed long
+dma_fence_wait_timeout(struct dma_fence *fence, bool intr, signed long timeout)
+{
+       signed long ret;
+
+       if (WARN_ON(timeout < 0))
+               return -EINVAL;
+
+       if (timeout == 0)
+               return dma_fence_is_signaled(fence);
+
+       trace_dma_fence_wait_start(fence);
+       ret = fence->ops->wait(fence, intr, timeout);
+       trace_dma_fence_wait_end(fence);
+       return ret;
+}
+EXPORT_SYMBOL(dma_fence_wait_timeout);
+
+void dma_fence_release(struct kref *kref)
+{
+       struct dma_fence *fence =
+               container_of(kref, struct dma_fence, refcount);
+
+       trace_dma_fence_destroy(fence);
+
+       BUG_ON(!list_empty(&fence->cb_list));
+
+       if (fence->ops->release)
+               fence->ops->release(fence);
+       else
+               dma_fence_free(fence);
+}
+EXPORT_SYMBOL(dma_fence_release);
+
+void dma_fence_free(struct dma_fence *fence)
+{
+       kfree_rcu(fence, rcu);
+}
+EXPORT_SYMBOL(dma_fence_free);
+
+/**
+ * dma_fence_enable_sw_signaling - enable signaling on fence
+ * @fence:     [in]    the fence to enable
+ *
+ * this will request for sw signaling to be enabled, to make the fence
+ * complete as soon as possible
+ */
+void dma_fence_enable_sw_signaling(struct dma_fence *fence)
+{
+       unsigned long flags;
+
+       if (!test_and_set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
+                             &fence->flags) &&
+           !test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
+               trace_dma_fence_enable_signal(fence);
+
+               spin_lock_irqsave(fence->lock, flags);
+
+               if (!fence->ops->enable_signaling(fence))
+                       dma_fence_signal_locked(fence);
+
+               spin_unlock_irqrestore(fence->lock, flags);
+       }
+}
+EXPORT_SYMBOL(dma_fence_enable_sw_signaling);
+
+/**
+ * dma_fence_add_callback - add a callback to be called when the fence
+ * is signaled
+ * @fence:     [in]    the fence to wait on
+ * @cb:                [in]    the callback to register
+ * @func:      [in]    the function to call
+ *
+ * cb will be initialized by dma_fence_add_callback, no initialization
+ * by the caller is required. Any number of callbacks can be registered
+ * to a fence, but a callback can only be registered to one fence at a time.
+ *
+ * Note that the callback can be called from an atomic context.  If
+ * fence is already signaled, this function will return -ENOENT (and
+ * *not* call the callback)
+ *
+ * Add a software callback to the fence. Same restrictions apply to
+ * refcount as it does to dma_fence_wait, however the caller doesn't need to
+ * keep a refcount to fence afterwards: when software access is enabled,
+ * the creator of the fence is required to keep the fence alive until
+ * after it signals with dma_fence_signal. The callback itself can be called
+ * from irq context.
+ *
+ */
+int dma_fence_add_callback(struct dma_fence *fence, struct dma_fence_cb *cb,
+                          dma_fence_func_t func)
+{
+       unsigned long flags;
+       int ret = 0;
+       bool was_set;
+
+       if (WARN_ON(!fence || !func))
+               return -EINVAL;
+
+       if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
+               INIT_LIST_HEAD(&cb->node);
+               return -ENOENT;
+       }
+
+       spin_lock_irqsave(fence->lock, flags);
+
+       was_set = test_and_set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
+                                  &fence->flags);
+
+       if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
+               ret = -ENOENT;
+       else if (!was_set) {
+               trace_dma_fence_enable_signal(fence);
+
+               if (!fence->ops->enable_signaling(fence)) {
+                       dma_fence_signal_locked(fence);
+                       ret = -ENOENT;
+               }
+       }
+
+       if (!ret) {
+               cb->func = func;
+               list_add_tail(&cb->node, &fence->cb_list);
+       } else
+               INIT_LIST_HEAD(&cb->node);
+       spin_unlock_irqrestore(fence->lock, flags);
+
+       return ret;
+}
+EXPORT_SYMBOL(dma_fence_add_callback);
+
+/**
+ * dma_fence_remove_callback - remove a callback from the signaling list
+ * @fence:     [in]    the fence to wait on
+ * @cb:                [in]    the callback to remove
+ *
+ * Remove a previously queued callback from the fence. This function returns
+ * true if the callback is successfully removed, or false if the fence has
+ * already been signaled.
+ *
+ * *WARNING*:
+ * Cancelling a callback should only be done if you really know what you're
+ * doing, since deadlocks and race conditions could occur all too easily. For
+ * this reason, it should only ever be done on hardware lockup recovery,
+ * with a reference held to the fence.
+ */
+bool
+dma_fence_remove_callback(struct dma_fence *fence, struct dma_fence_cb *cb)
+{
+       unsigned long flags;
+       bool ret;
+
+       spin_lock_irqsave(fence->lock, flags);
+
+       ret = !list_empty(&cb->node);
+       if (ret)
+               list_del_init(&cb->node);
+
+       spin_unlock_irqrestore(fence->lock, flags);
+
+       return ret;
+}
+EXPORT_SYMBOL(dma_fence_remove_callback);
+
+struct default_wait_cb {
+       struct dma_fence_cb base;
+       struct task_struct *task;
+};
+
+static void
+dma_fence_default_wait_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
+{
+       struct default_wait_cb *wait =
+               container_of(cb, struct default_wait_cb, base);
+
+       wake_up_state(wait->task, TASK_NORMAL);
+}
+
+/**
+ * dma_fence_default_wait - default sleep until the fence gets signaled
+ * or until timeout elapses
+ * @fence:     [in]    the fence to wait on
+ * @intr:      [in]    if true, do an interruptible wait
+ * @timeout:   [in]    timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
+ *
+ * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or the
+ * remaining timeout in jiffies on success.
+ */
+signed long
+dma_fence_default_wait(struct dma_fence *fence, bool intr, signed long timeout)
+{
+       struct default_wait_cb cb;
+       unsigned long flags;
+       signed long ret = timeout;
+       bool was_set;
+
+       if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
+               return timeout;
+
+       spin_lock_irqsave(fence->lock, flags);
+
+       if (intr && signal_pending(current)) {
+               ret = -ERESTARTSYS;
+               goto out;
+       }
+
+       was_set = test_and_set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
+                                  &fence->flags);
+
+       if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
+               goto out;
+
+       if (!was_set) {
+               trace_dma_fence_enable_signal(fence);
+
+               if (!fence->ops->enable_signaling(fence)) {
+                       dma_fence_signal_locked(fence);
+                       goto out;
+               }
+       }
+
+       cb.base.func = dma_fence_default_wait_cb;
+       cb.task = current;
+       list_add(&cb.base.node, &fence->cb_list);
+
+       while (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags) && ret > 0) {
+               if (intr)
+                       __set_current_state(TASK_INTERRUPTIBLE);
+               else
+                       __set_current_state(TASK_UNINTERRUPTIBLE);
+               spin_unlock_irqrestore(fence->lock, flags);
+
+               ret = schedule_timeout(ret);
+
+               spin_lock_irqsave(fence->lock, flags);
+               if (ret > 0 && intr && signal_pending(current))
+                       ret = -ERESTARTSYS;
+       }
+
+       if (!list_empty(&cb.base.node))
+               list_del(&cb.base.node);
+       __set_current_state(TASK_RUNNING);
+
+out:
+       spin_unlock_irqrestore(fence->lock, flags);
+       return ret;
+}
+EXPORT_SYMBOL(dma_fence_default_wait);
+
+static bool
+dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count)
+{
+       int i;
+
+       for (i = 0; i < count; ++i) {
+               struct dma_fence *fence = fences[i];
+               if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
+                       return true;
+       }
+       return false;
+}
+
+/**
+ * dma_fence_wait_any_timeout - sleep until any fence gets signaled
+ * or until timeout elapses
+ * @fences:    [in]    array of fences to wait on
+ * @count:     [in]    number of fences to wait on
+ * @intr:      [in]    if true, do an interruptible wait
+ * @timeout:   [in]    timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
+ *
+ * Returns -EINVAL on custom fence wait implementation, -ERESTARTSYS if
+ * interrupted, 0 if the wait timed out, or the remaining timeout in jiffies
+ * on success.
+ *
+ * Synchronous waits for the first fence in the array to be signaled. The
+ * caller needs to hold a reference to all fences in the array, otherwise a
+ * fence might be freed before return, resulting in undefined behavior.
+ */
+signed long
+dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count,
+                          bool intr, signed long timeout)
+{
+       struct default_wait_cb *cb;
+       signed long ret = timeout;
+       unsigned i;
+
+       if (WARN_ON(!fences || !count || timeout < 0))
+               return -EINVAL;
+
+       if (timeout == 0) {
+               for (i = 0; i < count; ++i)
+                       if (dma_fence_is_signaled(fences[i]))
+                               return 1;
+
+               return 0;
+       }
+
+       cb = kcalloc(count, sizeof(struct default_wait_cb), GFP_KERNEL);
+       if (cb == NULL) {
+               ret = -ENOMEM;
+               goto err_free_cb;
+       }
+
+       for (i = 0; i < count; ++i) {
+               struct dma_fence *fence = fences[i];
+
+               if (fence->ops->wait != dma_fence_default_wait) {
+                       ret = -EINVAL;
+                       goto fence_rm_cb;
+               }
+
+               cb[i].task = current;
+               if (dma_fence_add_callback(fence, &cb[i].base,
+                                          dma_fence_default_wait_cb)) {
+                       /* This fence is already signaled */
+                       goto fence_rm_cb;
+               }
+       }
+
+       while (ret > 0) {
+               if (intr)
+                       set_current_state(TASK_INTERRUPTIBLE);
+               else
+                       set_current_state(TASK_UNINTERRUPTIBLE);
+
+               if (dma_fence_test_signaled_any(fences, count))
+                       break;
+
+               ret = schedule_timeout(ret);
+
+               if (ret > 0 && intr && signal_pending(current))
+                       ret = -ERESTARTSYS;
+       }
+
+       __set_current_state(TASK_RUNNING);
+
+fence_rm_cb:
+       while (i-- > 0)
+               dma_fence_remove_callback(fences[i], &cb[i].base);
+
+err_free_cb:
+       kfree(cb);
+
+       return ret;
+}
+EXPORT_SYMBOL(dma_fence_wait_any_timeout);
+
+/**
+ * dma_fence_init - Initialize a custom fence.
+ * @fence:     [in]    the fence to initialize
+ * @ops:       [in]    the dma_fence_ops for operations on this fence
+ * @lock:      [in]    the irqsafe spinlock to use for locking this fence
+ * @context:   [in]    the execution context this fence is run on
+ * @seqno:     [in]    a linear increasing sequence number for this context
+ *
+ * Initializes an allocated fence, the caller doesn't have to keep its
+ * refcount after committing with this fence, but it will need to hold a
+ * refcount again if dma_fence_ops.enable_signaling gets called. This can
+ * be used for other implementing other types of fence.
+ *
+ * context and seqno are used for easy comparison between fences, allowing
+ * to check which fence is later by simply using dma_fence_later.
+ */
+void
+dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops,
+              spinlock_t *lock, u64 context, unsigned seqno)
+{
+       BUG_ON(!lock);
+       BUG_ON(!ops || !ops->wait || !ops->enable_signaling ||
+              !ops->get_driver_name || !ops->get_timeline_name);
+
+       kref_init(&fence->refcount);
+       fence->ops = ops;
+       INIT_LIST_HEAD(&fence->cb_list);
+       fence->lock = lock;
+       fence->context = context;
+       fence->seqno = seqno;
+       fence->flags = 0UL;
+
+       trace_dma_fence_init(fence);
+}
+EXPORT_SYMBOL(dma_fence_init);
diff --git a/drivers/dma-buf/fence-array.c b/drivers/dma-buf/fence-array.c
deleted file mode 100644 (file)
index f1989fc..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * fence-array: aggregate fences to be waited together
- *
- * Copyright (C) 2016 Collabora Ltd
- * Copyright (C) 2016 Advanced Micro Devices, Inc.
- * Authors:
- *     Gustavo Padovan <gustavo@padovan.org>
- *     Christian König <christian.koenig@amd.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- */
-
-#include <linux/export.h>
-#include <linux/slab.h>
-#include <linux/fence-array.h>
-
-static void fence_array_cb_func(struct fence *f, struct fence_cb *cb);
-
-static const char *fence_array_get_driver_name(struct fence *fence)
-{
-       return "fence_array";
-}
-
-static const char *fence_array_get_timeline_name(struct fence *fence)
-{
-       return "unbound";
-}
-
-static void fence_array_cb_func(struct fence *f, struct fence_cb *cb)
-{
-       struct fence_array_cb *array_cb =
-               container_of(cb, struct fence_array_cb, cb);
-       struct fence_array *array = array_cb->array;
-
-       if (atomic_dec_and_test(&array->num_pending))
-               fence_signal(&array->base);
-       fence_put(&array->base);
-}
-
-static bool fence_array_enable_signaling(struct fence *fence)
-{
-       struct fence_array *array = to_fence_array(fence);
-       struct fence_array_cb *cb = (void *)(&array[1]);
-       unsigned i;
-
-       for (i = 0; i < array->num_fences; ++i) {
-               cb[i].array = array;
-               /*
-                * As we may report that the fence is signaled before all
-                * callbacks are complete, we need to take an additional
-                * reference count on the array so that we do not free it too
-                * early. The core fence handling will only hold the reference
-                * until we signal the array as complete (but that is now
-                * insufficient).
-                */
-               fence_get(&array->base);
-               if (fence_add_callback(array->fences[i], &cb[i].cb,
-                                      fence_array_cb_func)) {
-                       fence_put(&array->base);
-                       if (atomic_dec_and_test(&array->num_pending))
-                               return false;
-               }
-       }
-
-       return true;
-}
-
-static bool fence_array_signaled(struct fence *fence)
-{
-       struct fence_array *array = to_fence_array(fence);
-
-       return atomic_read(&array->num_pending) <= 0;
-}
-
-static void fence_array_release(struct fence *fence)
-{
-       struct fence_array *array = to_fence_array(fence);
-       unsigned i;
-
-       for (i = 0; i < array->num_fences; ++i)
-               fence_put(array->fences[i]);
-
-       kfree(array->fences);
-       fence_free(fence);
-}
-
-const struct fence_ops fence_array_ops = {
-       .get_driver_name = fence_array_get_driver_name,
-       .get_timeline_name = fence_array_get_timeline_name,
-       .enable_signaling = fence_array_enable_signaling,
-       .signaled = fence_array_signaled,
-       .wait = fence_default_wait,
-       .release = fence_array_release,
-};
-EXPORT_SYMBOL(fence_array_ops);
-
-/**
- * fence_array_create - Create a custom fence array
- * @num_fences:                [in]    number of fences to add in the array
- * @fences:            [in]    array containing the fences
- * @context:           [in]    fence context to use
- * @seqno:             [in]    sequence number to use
- * @signal_on_any:     [in]    signal on any fence in the array
- *
- * Allocate a fence_array object and initialize the base fence with fence_init().
- * In case of error it returns NULL.
- *
- * The caller should allocate the fences array with num_fences size
- * and fill it with the fences it wants to add to the object. Ownership of this
- * array is taken and fence_put() is used on each fence on release.
- *
- * If @signal_on_any is true the fence array signals if any fence in the array
- * signals, otherwise it signals when all fences in the array signal.
- */
-struct fence_array *fence_array_create(int num_fences, struct fence **fences,
-                                      u64 context, unsigned seqno,
-                                      bool signal_on_any)
-{
-       struct fence_array *array;
-       size_t size = sizeof(*array);
-
-       /* Allocate the callback structures behind the array. */
-       size += num_fences * sizeof(struct fence_array_cb);
-       array = kzalloc(size, GFP_KERNEL);
-       if (!array)
-               return NULL;
-
-       spin_lock_init(&array->lock);
-       fence_init(&array->base, &fence_array_ops, &array->lock,
-                  context, seqno);
-
-       array->num_fences = num_fences;
-       atomic_set(&array->num_pending, signal_on_any ? 1 : num_fences);
-       array->fences = fences;
-
-       return array;
-}
-EXPORT_SYMBOL(fence_array_create);
diff --git a/drivers/dma-buf/fence.c b/drivers/dma-buf/fence.c
deleted file mode 100644 (file)
index cc05ddd..0000000
+++ /dev/null
@@ -1,534 +0,0 @@
-/*
- * Fence mechanism for dma-buf and to allow for asynchronous dma access
- *
- * Copyright (C) 2012 Canonical Ltd
- * Copyright (C) 2012 Texas Instruments
- *
- * Authors:
- * Rob Clark <robdclark@gmail.com>
- * Maarten Lankhorst <maarten.lankhorst@canonical.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- */
-
-#include <linux/slab.h>
-#include <linux/export.h>
-#include <linux/atomic.h>
-#include <linux/fence.h>
-
-#define CREATE_TRACE_POINTS
-#include <trace/events/fence.h>
-
-EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on);
-EXPORT_TRACEPOINT_SYMBOL(fence_emit);
-
-/*
- * fence context counter: each execution context should have its own
- * fence context, this allows checking if fences belong to the same
- * context or not. One device can have multiple separate contexts,
- * and they're used if some engine can run independently of another.
- */
-static atomic64_t fence_context_counter = ATOMIC64_INIT(0);
-
-/**
- * fence_context_alloc - allocate an array of fence contexts
- * @num:       [in]    amount of contexts to allocate
- *
- * This function will return the first index of the number of fences allocated.
- * The fence context is used for setting fence->context to a unique number.
- */
-u64 fence_context_alloc(unsigned num)
-{
-       BUG_ON(!num);
-       return atomic64_add_return(num, &fence_context_counter) - num;
-}
-EXPORT_SYMBOL(fence_context_alloc);
-
-/**
- * fence_signal_locked - signal completion of a fence
- * @fence: the fence to signal
- *
- * Signal completion for software callbacks on a fence, this will unblock
- * fence_wait() calls and run all the callbacks added with
- * fence_add_callback(). Can be called multiple times, but since a fence
- * can only go from unsignaled to signaled state, it will only be effective
- * the first time.
- *
- * Unlike fence_signal, this function must be called with fence->lock held.
- */
-int fence_signal_locked(struct fence *fence)
-{
-       struct fence_cb *cur, *tmp;
-       int ret = 0;
-
-       lockdep_assert_held(fence->lock);
-
-       if (WARN_ON(!fence))
-               return -EINVAL;
-
-       if (!ktime_to_ns(fence->timestamp)) {
-               fence->timestamp = ktime_get();
-               smp_mb__before_atomic();
-       }
-
-       if (test_and_set_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
-               ret = -EINVAL;
-
-               /*
-                * we might have raced with the unlocked fence_signal,
-                * still run through all callbacks
-                */
-       } else
-               trace_fence_signaled(fence);
-
-       list_for_each_entry_safe(cur, tmp, &fence->cb_list, node) {
-               list_del_init(&cur->node);
-               cur->func(fence, cur);
-       }
-       return ret;
-}
-EXPORT_SYMBOL(fence_signal_locked);
-
-/**
- * fence_signal - signal completion of a fence
- * @fence: the fence to signal
- *
- * Signal completion for software callbacks on a fence, this will unblock
- * fence_wait() calls and run all the callbacks added with
- * fence_add_callback(). Can be called multiple times, but since a fence
- * can only go from unsignaled to signaled state, it will only be effective
- * the first time.
- */
-int fence_signal(struct fence *fence)
-{
-       unsigned long flags;
-
-       if (!fence)
-               return -EINVAL;
-
-       if (!ktime_to_ns(fence->timestamp)) {
-               fence->timestamp = ktime_get();
-               smp_mb__before_atomic();
-       }
-
-       if (test_and_set_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags))
-               return -EINVAL;
-
-       trace_fence_signaled(fence);
-
-       if (test_bit(FENCE_FLAG_ENABLE_SIGNAL_BIT, &fence->flags)) {
-               struct fence_cb *cur, *tmp;
-
-               spin_lock_irqsave(fence->lock, flags);
-               list_for_each_entry_safe(cur, tmp, &fence->cb_list, node) {
-                       list_del_init(&cur->node);
-                       cur->func(fence, cur);
-               }
-               spin_unlock_irqrestore(fence->lock, flags);
-       }
-       return 0;
-}
-EXPORT_SYMBOL(fence_signal);
-
-/**
- * fence_wait_timeout - sleep until the fence gets signaled
- * or until timeout elapses
- * @fence:     [in]    the fence to wait on
- * @intr:      [in]    if true, do an interruptible wait
- * @timeout:   [in]    timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
- *
- * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or the
- * remaining timeout in jiffies on success. Other error values may be
- * returned on custom implementations.
- *
- * Performs a synchronous wait on this fence. It is assumed the caller
- * directly or indirectly (buf-mgr between reservation and committing)
- * holds a reference to the fence, otherwise the fence might be
- * freed before return, resulting in undefined behavior.
- */
-signed long
-fence_wait_timeout(struct fence *fence, bool intr, signed long timeout)
-{
-       signed long ret;
-
-       if (WARN_ON(timeout < 0))
-               return -EINVAL;
-
-       if (timeout == 0)
-               return fence_is_signaled(fence);
-
-       trace_fence_wait_start(fence);
-       ret = fence->ops->wait(fence, intr, timeout);
-       trace_fence_wait_end(fence);
-       return ret;
-}
-EXPORT_SYMBOL(fence_wait_timeout);
-
-void fence_release(struct kref *kref)
-{
-       struct fence *fence =
-                       container_of(kref, struct fence, refcount);
-
-       trace_fence_destroy(fence);
-
-       BUG_ON(!list_empty(&fence->cb_list));
-
-       if (fence->ops->release)
-               fence->ops->release(fence);
-       else
-               fence_free(fence);
-}
-EXPORT_SYMBOL(fence_release);
-
-void fence_free(struct fence *fence)
-{
-       kfree_rcu(fence, rcu);
-}
-EXPORT_SYMBOL(fence_free);
-
-/**
- * fence_enable_sw_signaling - enable signaling on fence
- * @fence:     [in]    the fence to enable
- *
- * this will request for sw signaling to be enabled, to make the fence
- * complete as soon as possible
- */
-void fence_enable_sw_signaling(struct fence *fence)
-{
-       unsigned long flags;
-
-       if (!test_and_set_bit(FENCE_FLAG_ENABLE_SIGNAL_BIT, &fence->flags) &&
-           !test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
-               trace_fence_enable_signal(fence);
-
-               spin_lock_irqsave(fence->lock, flags);
-
-               if (!fence->ops->enable_signaling(fence))
-                       fence_signal_locked(fence);
-
-               spin_unlock_irqrestore(fence->lock, flags);
-       }
-}
-EXPORT_SYMBOL(fence_enable_sw_signaling);
-
-/**
- * fence_add_callback - add a callback to be called when the fence
- * is signaled
- * @fence:     [in]    the fence to wait on
- * @cb:                [in]    the callback to register
- * @func:      [in]    the function to call
- *
- * cb will be initialized by fence_add_callback, no initialization
- * by the caller is required. Any number of callbacks can be registered
- * to a fence, but a callback can only be registered to one fence at a time.
- *
- * Note that the callback can be called from an atomic context.  If
- * fence is already signaled, this function will return -ENOENT (and
- * *not* call the callback)
- *
- * Add a software callback to the fence. Same restrictions apply to
- * refcount as it does to fence_wait, however the caller doesn't need to
- * keep a refcount to fence afterwards: when software access is enabled,
- * the creator of the fence is required to keep the fence alive until
- * after it signals with fence_signal. The callback itself can be called
- * from irq context.
- *
- */
-int fence_add_callback(struct fence *fence, struct fence_cb *cb,
-                      fence_func_t func)
-{
-       unsigned long flags;
-       int ret = 0;
-       bool was_set;
-
-       if (WARN_ON(!fence || !func))
-               return -EINVAL;
-
-       if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
-               INIT_LIST_HEAD(&cb->node);
-               return -ENOENT;
-       }
-
-       spin_lock_irqsave(fence->lock, flags);
-
-       was_set = test_and_set_bit(FENCE_FLAG_ENABLE_SIGNAL_BIT, &fence->flags);
-
-       if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags))
-               ret = -ENOENT;
-       else if (!was_set) {
-               trace_fence_enable_signal(fence);
-
-               if (!fence->ops->enable_signaling(fence)) {
-                       fence_signal_locked(fence);
-                       ret = -ENOENT;
-               }
-       }
-
-       if (!ret) {
-               cb->func = func;
-               list_add_tail(&cb->node, &fence->cb_list);
-       } else
-               INIT_LIST_HEAD(&cb->node);
-       spin_unlock_irqrestore(fence->lock, flags);
-
-       return ret;
-}
-EXPORT_SYMBOL(fence_add_callback);
-
-/**
- * fence_remove_callback - remove a callback from the signaling list
- * @fence:     [in]    the fence to wait on
- * @cb:                [in]    the callback to remove
- *
- * Remove a previously queued callback from the fence. This function returns
- * true if the callback is successfully removed, or false if the fence has
- * already been signaled.
- *
- * *WARNING*:
- * Cancelling a callback should only be done if you really know what you're
- * doing, since deadlocks and race conditions could occur all too easily. For
- * this reason, it should only ever be done on hardware lockup recovery,
- * with a reference held to the fence.
- */
-bool
-fence_remove_callback(struct fence *fence, struct fence_cb *cb)
-{
-       unsigned long flags;
-       bool ret;
-
-       spin_lock_irqsave(fence->lock, flags);
-
-       ret = !list_empty(&cb->node);
-       if (ret)
-               list_del_init(&cb->node);
-
-       spin_unlock_irqrestore(fence->lock, flags);
-
-       return ret;
-}
-EXPORT_SYMBOL(fence_remove_callback);
-
-struct default_wait_cb {
-       struct fence_cb base;
-       struct task_struct *task;
-};
-
-static void
-fence_default_wait_cb(struct fence *fence, struct fence_cb *cb)
-{
-       struct default_wait_cb *wait =
-               container_of(cb, struct default_wait_cb, base);
-
-       wake_up_state(wait->task, TASK_NORMAL);
-}
-
-/**
- * fence_default_wait - default sleep until the fence gets signaled
- * or until timeout elapses
- * @fence:     [in]    the fence to wait on
- * @intr:      [in]    if true, do an interruptible wait
- * @timeout:   [in]    timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
- *
- * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or the
- * remaining timeout in jiffies on success.
- */
-signed long
-fence_default_wait(struct fence *fence, bool intr, signed long timeout)
-{
-       struct default_wait_cb cb;
-       unsigned long flags;
-       signed long ret = timeout;
-       bool was_set;
-
-       if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags))
-               return timeout;
-
-       spin_lock_irqsave(fence->lock, flags);
-
-       if (intr && signal_pending(current)) {
-               ret = -ERESTARTSYS;
-               goto out;
-       }
-
-       was_set = test_and_set_bit(FENCE_FLAG_ENABLE_SIGNAL_BIT, &fence->flags);
-
-       if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags))
-               goto out;
-
-       if (!was_set) {
-               trace_fence_enable_signal(fence);
-
-               if (!fence->ops->enable_signaling(fence)) {
-                       fence_signal_locked(fence);
-                       goto out;
-               }
-       }
-
-       cb.base.func = fence_default_wait_cb;
-       cb.task = current;
-       list_add(&cb.base.node, &fence->cb_list);
-
-       while (!test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags) && ret > 0) {
-               if (intr)
-                       __set_current_state(TASK_INTERRUPTIBLE);
-               else
-                       __set_current_state(TASK_UNINTERRUPTIBLE);
-               spin_unlock_irqrestore(fence->lock, flags);
-
-               ret = schedule_timeout(ret);
-
-               spin_lock_irqsave(fence->lock, flags);
-               if (ret > 0 && intr && signal_pending(current))
-                       ret = -ERESTARTSYS;
-       }
-
-       if (!list_empty(&cb.base.node))
-               list_del(&cb.base.node);
-       __set_current_state(TASK_RUNNING);
-
-out:
-       spin_unlock_irqrestore(fence->lock, flags);
-       return ret;
-}
-EXPORT_SYMBOL(fence_default_wait);
-
-static bool
-fence_test_signaled_any(struct fence **fences, uint32_t count)
-{
-       int i;
-
-       for (i = 0; i < count; ++i) {
-               struct fence *fence = fences[i];
-               if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags))
-                       return true;
-       }
-       return false;
-}
-
-/**
- * fence_wait_any_timeout - sleep until any fence gets signaled
- * or until timeout elapses
- * @fences:    [in]    array of fences to wait on
- * @count:     [in]    number of fences to wait on
- * @intr:      [in]    if true, do an interruptible wait
- * @timeout:   [in]    timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
- *
- * Returns -EINVAL on custom fence wait implementation, -ERESTARTSYS if
- * interrupted, 0 if the wait timed out, or the remaining timeout in jiffies
- * on success.
- *
- * Synchronous waits for the first fence in the array to be signaled. The
- * caller needs to hold a reference to all fences in the array, otherwise a
- * fence might be freed before return, resulting in undefined behavior.
- */
-signed long
-fence_wait_any_timeout(struct fence **fences, uint32_t count,
-                      bool intr, signed long timeout)
-{
-       struct default_wait_cb *cb;
-       signed long ret = timeout;
-       unsigned i;
-
-       if (WARN_ON(!fences || !count || timeout < 0))
-               return -EINVAL;
-
-       if (timeout == 0) {
-               for (i = 0; i < count; ++i)
-                       if (fence_is_signaled(fences[i]))
-                               return 1;
-
-               return 0;
-       }
-
-       cb = kcalloc(count, sizeof(struct default_wait_cb), GFP_KERNEL);
-       if (cb == NULL) {
-               ret = -ENOMEM;
-               goto err_free_cb;
-       }
-
-       for (i = 0; i < count; ++i) {
-               struct fence *fence = fences[i];
-
-               if (fence->ops->wait != fence_default_wait) {
-                       ret = -EINVAL;
-                       goto fence_rm_cb;
-               }
-
-               cb[i].task = current;
-               if (fence_add_callback(fence, &cb[i].base,
-                                      fence_default_wait_cb)) {
-                       /* This fence is already signaled */
-                       goto fence_rm_cb;
-               }
-       }
-
-       while (ret > 0) {
-               if (intr)
-                       set_current_state(TASK_INTERRUPTIBLE);
-               else
-                       set_current_state(TASK_UNINTERRUPTIBLE);
-
-               if (fence_test_signaled_any(fences, count))
-                       break;
-
-               ret = schedule_timeout(ret);
-
-               if (ret > 0 && intr && signal_pending(current))
-                       ret = -ERESTARTSYS;
-       }
-
-       __set_current_state(TASK_RUNNING);
-
-fence_rm_cb:
-       while (i-- > 0)
-               fence_remove_callback(fences[i], &cb[i].base);
-
-err_free_cb:
-       kfree(cb);
-
-       return ret;
-}
-EXPORT_SYMBOL(fence_wait_any_timeout);
-
-/**
- * fence_init - Initialize a custom fence.
- * @fence:     [in]    the fence to initialize
- * @ops:       [in]    the fence_ops for operations on this fence
- * @lock:      [in]    the irqsafe spinlock to use for locking this fence
- * @context:   [in]    the execution context this fence is run on
- * @seqno:     [in]    a linear increasing sequence number for this context
- *
- * Initializes an allocated fence, the caller doesn't have to keep its
- * refcount after committing with this fence, but it will need to hold a
- * refcount again if fence_ops.enable_signaling gets called. This can
- * be used for other implementing other types of fence.
- *
- * context and seqno are used for easy comparison between fences, allowing
- * to check which fence is later by simply using fence_later.
- */
-void
-fence_init(struct fence *fence, const struct fence_ops *ops,
-            spinlock_t *lock, u64 context, unsigned seqno)
-{
-       BUG_ON(!lock);
-       BUG_ON(!ops || !ops->wait || !ops->enable_signaling ||
-              !ops->get_driver_name || !ops->get_timeline_name);
-
-       kref_init(&fence->refcount);
-       fence->ops = ops;
-       INIT_LIST_HEAD(&fence->cb_list);
-       fence->lock = lock;
-       fence->context = context;
-       fence->seqno = seqno;
-       fence->flags = 0UL;
-
-       trace_fence_init(fence);
-}
-EXPORT_SYMBOL(fence_init);
index 82de59f7cbbd49e293929b4c08292c4715ab8d89..7ed56f3edfb70bbb15e6c39954c465398974eb81 100644 (file)
@@ -102,17 +102,17 @@ EXPORT_SYMBOL(reservation_object_reserve_shared);
 static void
 reservation_object_add_shared_inplace(struct reservation_object *obj,
                                      struct reservation_object_list *fobj,
-                                     struct fence *fence)
+                                     struct dma_fence *fence)
 {
        u32 i;
 
-       fence_get(fence);
+       dma_fence_get(fence);
 
        preempt_disable();
        write_seqcount_begin(&obj->seq);
 
        for (i = 0; i < fobj->shared_count; ++i) {
-               struct fence *old_fence;
+               struct dma_fence *old_fence;
 
                old_fence = rcu_dereference_protected(fobj->shared[i],
                                                reservation_object_held(obj));
@@ -123,7 +123,7 @@ reservation_object_add_shared_inplace(struct reservation_object *obj,
                        write_seqcount_end(&obj->seq);
                        preempt_enable();
 
-                       fence_put(old_fence);
+                       dma_fence_put(old_fence);
                        return;
                }
        }
@@ -143,12 +143,12 @@ static void
 reservation_object_add_shared_replace(struct reservation_object *obj,
                                      struct reservation_object_list *old,
                                      struct reservation_object_list *fobj,
-                                     struct fence *fence)
+                                     struct dma_fence *fence)
 {
        unsigned i;
-       struct fence *old_fence = NULL;
+       struct dma_fence *old_fence = NULL;
 
-       fence_get(fence);
+       dma_fence_get(fence);
 
        if (!old) {
                RCU_INIT_POINTER(fobj->shared[0], fence);
@@ -165,7 +165,7 @@ reservation_object_add_shared_replace(struct reservation_object *obj,
        fobj->shared_count = old->shared_count;
 
        for (i = 0; i < old->shared_count; ++i) {
-               struct fence *check;
+               struct dma_fence *check;
 
                check = rcu_dereference_protected(old->shared[i],
                                                reservation_object_held(obj));
@@ -196,7 +196,7 @@ done:
                kfree_rcu(old, rcu);
 
        if (old_fence)
-               fence_put(old_fence);
+               dma_fence_put(old_fence);
 }
 
 /**
@@ -208,7 +208,7 @@ done:
  * reservation_object_reserve_shared() has been called.
  */
 void reservation_object_add_shared_fence(struct reservation_object *obj,
-                                        struct fence *fence)
+                                        struct dma_fence *fence)
 {
        struct reservation_object_list *old, *fobj = obj->staged;
 
@@ -231,9 +231,9 @@ EXPORT_SYMBOL(reservation_object_add_shared_fence);
  * Add a fence to the exclusive slot.  The obj->lock must be held.
  */
 void reservation_object_add_excl_fence(struct reservation_object *obj,
-                                      struct fence *fence)
+                                      struct dma_fence *fence)
 {
-       struct fence *old_fence = reservation_object_get_excl(obj);
+       struct dma_fence *old_fence = reservation_object_get_excl(obj);
        struct reservation_object_list *old;
        u32 i = 0;
 
@@ -242,7 +242,7 @@ void reservation_object_add_excl_fence(struct reservation_object *obj,
                i = old->shared_count;
 
        if (fence)
-               fence_get(fence);
+               dma_fence_get(fence);
 
        preempt_disable();
        write_seqcount_begin(&obj->seq);
@@ -255,11 +255,11 @@ void reservation_object_add_excl_fence(struct reservation_object *obj,
 
        /* inplace update, no shared fences */
        while (i--)
-               fence_put(rcu_dereference_protected(old->shared[i],
+               dma_fence_put(rcu_dereference_protected(old->shared[i],
                                                reservation_object_held(obj)));
 
        if (old_fence)
-               fence_put(old_fence);
+               dma_fence_put(old_fence);
 }
 EXPORT_SYMBOL(reservation_object_add_excl_fence);
 
@@ -276,12 +276,12 @@ EXPORT_SYMBOL(reservation_object_add_excl_fence);
  * Zero or -errno
  */
 int reservation_object_get_fences_rcu(struct reservation_object *obj,
-                                     struct fence **pfence_excl,
+                                     struct dma_fence **pfence_excl,
                                      unsigned *pshared_count,
-                                     struct fence ***pshared)
+                                     struct dma_fence ***pshared)
 {
-       struct fence **shared = NULL;
-       struct fence *fence_excl;
+       struct dma_fence **shared = NULL;
+       struct dma_fence *fence_excl;
        unsigned int shared_count;
        int ret = 1;
 
@@ -296,12 +296,12 @@ int reservation_object_get_fences_rcu(struct reservation_object *obj,
                seq = read_seqcount_begin(&obj->seq);
 
                fence_excl = rcu_dereference(obj->fence_excl);
-               if (fence_excl && !fence_get_rcu(fence_excl))
+               if (fence_excl && !dma_fence_get_rcu(fence_excl))
                        goto unlock;
 
                fobj = rcu_dereference(obj->fence);
                if (fobj) {
-                       struct fence **nshared;
+                       struct dma_fence **nshared;
                        size_t sz = sizeof(*shared) * fobj->shared_max;
 
                        nshared = krealloc(shared, sz,
@@ -322,15 +322,15 @@ int reservation_object_get_fences_rcu(struct reservation_object *obj,
 
                        for (i = 0; i < shared_count; ++i) {
                                shared[i] = rcu_dereference(fobj->shared[i]);
-                               if (!fence_get_rcu(shared[i]))
+                               if (!dma_fence_get_rcu(shared[i]))
                                        break;
                        }
                }
 
                if (i != shared_count || read_seqcount_retry(&obj->seq, seq)) {
                        while (i--)
-                               fence_put(shared[i]);
-                       fence_put(fence_excl);
+                               dma_fence_put(shared[i]);
+                       dma_fence_put(fence_excl);
                        goto unlock;
                }
 
@@ -368,7 +368,7 @@ long reservation_object_wait_timeout_rcu(struct reservation_object *obj,
                                         bool wait_all, bool intr,
                                         unsigned long timeout)
 {
-       struct fence *fence;
+       struct dma_fence *fence;
        unsigned seq, shared_count, i = 0;
        long ret = timeout;
 
@@ -389,16 +389,17 @@ retry:
                        shared_count = fobj->shared_count;
 
                for (i = 0; i < shared_count; ++i) {
-                       struct fence *lfence = rcu_dereference(fobj->shared[i]);
+                       struct dma_fence *lfence = rcu_dereference(fobj->shared[i]);
 
-                       if (test_bit(FENCE_FLAG_SIGNALED_BIT, &lfence->flags))
+                       if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
+                                    &lfence->flags))
                                continue;
 
-                       if (!fence_get_rcu(lfence))
+                       if (!dma_fence_get_rcu(lfence))
                                goto unlock_retry;
 
-                       if (fence_is_signaled(lfence)) {
-                               fence_put(lfence);
+                       if (dma_fence_is_signaled(lfence)) {
+                               dma_fence_put(lfence);
                                continue;
                        }
 
@@ -408,15 +409,16 @@ retry:
        }
 
        if (!shared_count) {
-               struct fence *fence_excl = rcu_dereference(obj->fence_excl);
+               struct dma_fence *fence_excl = rcu_dereference(obj->fence_excl);
 
                if (fence_excl &&
-                   !test_bit(FENCE_FLAG_SIGNALED_BIT, &fence_excl->flags)) {
-                       if (!fence_get_rcu(fence_excl))
+                   !test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
+                             &fence_excl->flags)) {
+                       if (!dma_fence_get_rcu(fence_excl))
                                goto unlock_retry;
 
-                       if (fence_is_signaled(fence_excl))
-                               fence_put(fence_excl);
+                       if (dma_fence_is_signaled(fence_excl))
+                               dma_fence_put(fence_excl);
                        else
                                fence = fence_excl;
                }
@@ -425,12 +427,12 @@ retry:
        rcu_read_unlock();
        if (fence) {
                if (read_seqcount_retry(&obj->seq, seq)) {
-                       fence_put(fence);
+                       dma_fence_put(fence);
                        goto retry;
                }
 
-               ret = fence_wait_timeout(fence, intr, ret);
-               fence_put(fence);
+               ret = dma_fence_wait_timeout(fence, intr, ret);
+               dma_fence_put(fence);
                if (ret > 0 && wait_all && (i + 1 < shared_count))
                        goto retry;
        }
@@ -444,18 +446,18 @@ EXPORT_SYMBOL_GPL(reservation_object_wait_timeout_rcu);
 
 
 static inline int
-reservation_object_test_signaled_single(struct fence *passed_fence)
+reservation_object_test_signaled_single(struct dma_fence *passed_fence)
 {
-       struct fence *fence, *lfence = passed_fence;
+       struct dma_fence *fence, *lfence = passed_fence;
        int ret = 1;
 
-       if (!test_bit(FENCE_FLAG_SIGNALED_BIT, &lfence->flags)) {
-               fence = fence_get_rcu(lfence);
+       if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &lfence->flags)) {
+               fence = dma_fence_get_rcu(lfence);
                if (!fence)
                        return -1;
 
-               ret = !!fence_is_signaled(fence);
-               fence_put(fence);
+               ret = !!dma_fence_is_signaled(fence);
+               dma_fence_put(fence);
        }
        return ret;
 }
@@ -492,7 +494,7 @@ retry:
                        shared_count = fobj->shared_count;
 
                for (i = 0; i < shared_count; ++i) {
-                       struct fence *fence = rcu_dereference(fobj->shared[i]);
+                       struct dma_fence *fence = rcu_dereference(fobj->shared[i]);
 
                        ret = reservation_object_test_signaled_single(fence);
                        if (ret < 0)
@@ -506,7 +508,7 @@ retry:
        }
 
        if (!shared_count) {
-               struct fence *fence_excl = rcu_dereference(obj->fence_excl);
+               struct dma_fence *fence_excl = rcu_dereference(obj->fence_excl);
 
                if (fence_excl) {
                        ret = reservation_object_test_signaled_single(
index 71127f8f1626452b6779ae8b2bc0db14188b45cb..f47112a647634c5c16b64add1b8e9a68b5d99c85 100644 (file)
 #include <linux/export.h>
 #include <linux/seqno-fence.h>
 
-static const char *seqno_fence_get_driver_name(struct fence *fence)
+static const char *seqno_fence_get_driver_name(struct dma_fence *fence)
 {
        struct seqno_fence *seqno_fence = to_seqno_fence(fence);
 
        return seqno_fence->ops->get_driver_name(fence);
 }
 
-static const char *seqno_fence_get_timeline_name(struct fence *fence)
+static const char *seqno_fence_get_timeline_name(struct dma_fence *fence)
 {
        struct seqno_fence *seqno_fence = to_seqno_fence(fence);
 
        return seqno_fence->ops->get_timeline_name(fence);
 }
 
-static bool seqno_enable_signaling(struct fence *fence)
+static bool seqno_enable_signaling(struct dma_fence *fence)
 {
        struct seqno_fence *seqno_fence = to_seqno_fence(fence);
 
        return seqno_fence->ops->enable_signaling(fence);
 }
 
-static bool seqno_signaled(struct fence *fence)
+static bool seqno_signaled(struct dma_fence *fence)
 {
        struct seqno_fence *seqno_fence = to_seqno_fence(fence);
 
        return seqno_fence->ops->signaled && seqno_fence->ops->signaled(fence);
 }
 
-static void seqno_release(struct fence *fence)
+static void seqno_release(struct dma_fence *fence)
 {
        struct seqno_fence *f = to_seqno_fence(fence);
 
@@ -57,18 +57,18 @@ static void seqno_release(struct fence *fence)
        if (f->ops->release)
                f->ops->release(fence);
        else
-               fence_free(&f->base);
+               dma_fence_free(&f->base);
 }
 
-static signed long seqno_wait(struct fence *fence, bool intr,
-                               signed long timeout)
+static signed long seqno_wait(struct dma_fence *fence, bool intr,
+                             signed long timeout)
 {
        struct seqno_fence *f = to_seqno_fence(fence);
 
        return f->ops->wait(fence, intr, timeout);
 }
 
-const struct fence_ops seqno_fence_ops = {
+const struct dma_fence_ops seqno_fence_ops = {
        .get_driver_name = seqno_fence_get_driver_name,
        .get_timeline_name = seqno_fence_get_timeline_name,
        .enable_signaling = seqno_enable_signaling,
index 62e8e6dc7953bba8148c32787c17f1bbd1388ee7..82e0ca4dd0c1e48db74da7bc503bec2d083d13ef 100644 (file)
@@ -68,9 +68,9 @@ struct sw_sync_create_fence_data {
 
 #define SW_SYNC_IOC_INC                        _IOW(SW_SYNC_IOC_MAGIC, 1, __u32)
 
-static const struct fence_ops timeline_fence_ops;
+static const struct dma_fence_ops timeline_fence_ops;
 
-static inline struct sync_pt *fence_to_sync_pt(struct fence *fence)
+static inline struct sync_pt *dma_fence_to_sync_pt(struct dma_fence *fence)
 {
        if (fence->ops != &timeline_fence_ops)
                return NULL;
@@ -93,7 +93,7 @@ struct sync_timeline *sync_timeline_create(const char *name)
                return NULL;
 
        kref_init(&obj->kref);
-       obj->context = fence_context_alloc(1);
+       obj->context = dma_fence_context_alloc(1);
        strlcpy(obj->name, name, sizeof(obj->name));
 
        INIT_LIST_HEAD(&obj->child_list_head);
@@ -146,7 +146,7 @@ static void sync_timeline_signal(struct sync_timeline *obj, unsigned int inc)
 
        list_for_each_entry_safe(pt, next, &obj->active_list_head,
                                 active_list) {
-               if (fence_is_signaled_locked(&pt->base))
+               if (dma_fence_is_signaled_locked(&pt->base))
                        list_del_init(&pt->active_list);
        }
 
@@ -179,30 +179,30 @@ static struct sync_pt *sync_pt_create(struct sync_timeline *obj, int size,
 
        spin_lock_irqsave(&obj->child_list_lock, flags);
        sync_timeline_get(obj);
-       fence_init(&pt->base, &timeline_fence_ops, &obj->child_list_lock,
-                  obj->context, value);
+       dma_fence_init(&pt->base, &timeline_fence_ops, &obj->child_list_lock,
+                      obj->context, value);
        list_add_tail(&pt->child_list, &obj->child_list_head);
        INIT_LIST_HEAD(&pt->active_list);
        spin_unlock_irqrestore(&obj->child_list_lock, flags);
        return pt;
 }
 
-static const char *timeline_fence_get_driver_name(struct fence *fence)
+static const char *timeline_fence_get_driver_name(struct dma_fence *fence)
 {
        return "sw_sync";
 }
 
-static const char *timeline_fence_get_timeline_name(struct fence *fence)
+static const char *timeline_fence_get_timeline_name(struct dma_fence *fence)
 {
-       struct sync_timeline *parent = fence_parent(fence);
+       struct sync_timeline *parent = dma_fence_parent(fence);
 
        return parent->name;
 }
 
-static void timeline_fence_release(struct fence *fence)
+static void timeline_fence_release(struct dma_fence *fence)
 {
-       struct sync_pt *pt = fence_to_sync_pt(fence);
-       struct sync_timeline *parent = fence_parent(fence);
+       struct sync_pt *pt = dma_fence_to_sync_pt(fence);
+       struct sync_timeline *parent = dma_fence_parent(fence);
        unsigned long flags;
 
        spin_lock_irqsave(fence->lock, flags);
@@ -212,20 +212,20 @@ static void timeline_fence_release(struct fence *fence)
        spin_unlock_irqrestore(fence->lock, flags);
 
        sync_timeline_put(parent);
-       fence_free(fence);
+       dma_fence_free(fence);
 }
 
-static bool timeline_fence_signaled(struct fence *fence)
+static bool timeline_fence_signaled(struct dma_fence *fence)
 {
-       struct sync_timeline *parent = fence_parent(fence);
+       struct sync_timeline *parent = dma_fence_parent(fence);
 
        return (fence->seqno > parent->value) ? false : true;
 }
 
-static bool timeline_fence_enable_signaling(struct fence *fence)
+static bool timeline_fence_enable_signaling(struct dma_fence *fence)
 {
-       struct sync_pt *pt = fence_to_sync_pt(fence);
-       struct sync_timeline *parent = fence_parent(fence);
+       struct sync_pt *pt = dma_fence_to_sync_pt(fence);
+       struct sync_timeline *parent = dma_fence_parent(fence);
 
        if (timeline_fence_signaled(fence))
                return false;
@@ -234,26 +234,26 @@ static bool timeline_fence_enable_signaling(struct fence *fence)
        return true;
 }
 
-static void timeline_fence_value_str(struct fence *fence,
+static void timeline_fence_value_str(struct dma_fence *fence,
                                    char *str, int size)
 {
        snprintf(str, size, "%d", fence->seqno);
 }
 
-static void timeline_fence_timeline_value_str(struct fence *fence,
+static void timeline_fence_timeline_value_str(struct dma_fence *fence,
                                             char *str, int size)
 {
-       struct sync_timeline *parent = fence_parent(fence);
+       struct sync_timeline *parent = dma_fence_parent(fence);
 
        snprintf(str, size, "%d", parent->value);
 }
 
-static const struct fence_ops timeline_fence_ops = {
+static const struct dma_fence_ops timeline_fence_ops = {
        .get_driver_name = timeline_fence_get_driver_name,
        .get_timeline_name = timeline_fence_get_timeline_name,
        .enable_signaling = timeline_fence_enable_signaling,
        .signaled = timeline_fence_signaled,
-       .wait = fence_default_wait,
+       .wait = dma_fence_default_wait,
        .release = timeline_fence_release,
        .fence_value_str = timeline_fence_value_str,
        .timeline_value_str = timeline_fence_timeline_value_str,
@@ -317,7 +317,7 @@ static long sw_sync_ioctl_create_fence(struct sync_timeline *obj,
 
        sync_file = sync_file_create(&pt->base);
        if (!sync_file) {
-               fence_put(&pt->base);
+               dma_fence_put(&pt->base);
                err = -ENOMEM;
                goto err;
        }
index 2dd4c3db6caa83ceff101bb5405baea8c2ef4874..48b20e34fb6d059f79616f9da66beac3a2582462 100644 (file)
@@ -71,12 +71,13 @@ static const char *sync_status_str(int status)
        return "error";
 }
 
-static void sync_print_fence(struct seq_file *s, struct fence *fence, bool show)
+static void sync_print_fence(struct seq_file *s,
+                            struct dma_fence *fence, bool show)
 {
        int status = 1;
-       struct sync_timeline *parent = fence_parent(fence);
+       struct sync_timeline *parent = dma_fence_parent(fence);
 
-       if (fence_is_signaled_locked(fence))
+       if (dma_fence_is_signaled_locked(fence))
                status = fence->status;
 
        seq_printf(s, "  %s%sfence %s",
@@ -135,10 +136,10 @@ static void sync_print_sync_file(struct seq_file *s,
        int i;
 
        seq_printf(s, "[%p] %s: %s\n", sync_file, sync_file->name,
-                  sync_status_str(!fence_is_signaled(sync_file->fence)));
+                  sync_status_str(!dma_fence_is_signaled(sync_file->fence)));
 
-       if (fence_is_array(sync_file->fence)) {
-               struct fence_array *array = to_fence_array(sync_file->fence);
+       if (dma_fence_is_array(sync_file->fence)) {
+               struct dma_fence_array *array = to_dma_fence_array(sync_file->fence);
 
                for (i = 0; i < array->num_fences; ++i)
                        sync_print_fence(s, array->fences[i], true);
index d269aa6783aaa57c3137ee93b02c72c620a6fd0f..26fe8b9907b38aac09d786997bd02a4e8be1706a 100644 (file)
@@ -15,7 +15,7 @@
 
 #include <linux/list.h>
 #include <linux/spinlock.h>
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 
 #include <linux/sync_file.h>
 #include <uapi/linux/sync_file.h>
@@ -45,10 +45,9 @@ struct sync_timeline {
        struct list_head        sync_timeline_list;
 };
 
-static inline struct sync_timeline *fence_parent(struct fence *fence)
+static inline struct sync_timeline *dma_fence_parent(struct dma_fence *fence)
 {
-       return container_of(fence->lock, struct sync_timeline,
-                           child_list_lock);
+       return container_of(fence->lock, struct sync_timeline, child_list_lock);
 }
 
 /**
@@ -58,7 +57,7 @@ static inline struct sync_timeline *fence_parent(struct fence *fence)
  * @active_list: sync timeline active child's list
  */
 struct sync_pt {
-       struct fence base;
+       struct dma_fence base;
        struct list_head child_list;
        struct list_head active_list;
 };
index 235f8ac113cce7617f6e78d2c9a2c8de75637665..69d8ef98d34c0dd446a2fe20bfa75a6384f5a4ff 100644 (file)
@@ -54,7 +54,7 @@ err:
        return NULL;
 }
 
-static void fence_check_cb_func(struct fence *f, struct fence_cb *cb)
+static void fence_check_cb_func(struct dma_fence *f, struct dma_fence_cb *cb)
 {
        struct sync_file *sync_file;
 
@@ -71,7 +71,7 @@ static void fence_check_cb_func(struct fence *f, struct fence_cb *cb)
  * takes ownership of @fence. The sync_file can be released with
  * fput(sync_file->file). Returns the sync_file or NULL in case of error.
  */
-struct sync_file *sync_file_create(struct fence *fence)
+struct sync_file *sync_file_create(struct dma_fence *fence)
 {
        struct sync_file *sync_file;
 
@@ -79,7 +79,7 @@ struct sync_file *sync_file_create(struct fence *fence)
        if (!sync_file)
                return NULL;
 
-       sync_file->fence = fence_get(fence);
+       sync_file->fence = dma_fence_get(fence);
 
        snprintf(sync_file->name, sizeof(sync_file->name), "%s-%s%llu-%d",
                 fence->ops->get_driver_name(fence),
@@ -121,16 +121,16 @@ err:
  * Ensures @fd references a valid sync_file and returns a fence that
  * represents all fence in the sync_file. On error NULL is returned.
  */
-struct fence *sync_file_get_fence(int fd)
+struct dma_fence *sync_file_get_fence(int fd)
 {
        struct sync_file *sync_file;
-       struct fence *fence;
+       struct dma_fence *fence;
 
        sync_file = sync_file_fdget(fd);
        if (!sync_file)
                return NULL;
 
-       fence = fence_get(sync_file->fence);
+       fence = dma_fence_get(sync_file->fence);
        fput(sync_file->file);
 
        return fence;
@@ -138,22 +138,23 @@ struct fence *sync_file_get_fence(int fd)
 EXPORT_SYMBOL(sync_file_get_fence);
 
 static int sync_file_set_fence(struct sync_file *sync_file,
-                              struct fence **fences, int num_fences)
+                              struct dma_fence **fences, int num_fences)
 {
-       struct fence_array *array;
+       struct dma_fence_array *array;
 
        /*
         * The reference for the fences in the new sync_file and held
         * in add_fence() during the merge procedure, so for num_fences == 1
         * we already own a new reference to the fence. For num_fence > 1
-        * we own the reference of the fence_array creation.
+        * we own the reference of the dma_fence_array creation.
         */
        if (num_fences == 1) {
                sync_file->fence = fences[0];
                kfree(fences);
        } else {
-               array = fence_array_create(num_fences, fences,
-                                          fence_context_alloc(1), 1, false);
+               array = dma_fence_array_create(num_fences, fences,
+                                              dma_fence_context_alloc(1),
+                                              1, false);
                if (!array)
                        return -ENOMEM;
 
@@ -163,10 +164,11 @@ static int sync_file_set_fence(struct sync_file *sync_file,
        return 0;
 }
 
-static struct fence **get_fences(struct sync_file *sync_file, int *num_fences)
+static struct dma_fence **get_fences(struct sync_file *sync_file,
+                                    int *num_fences)
 {
-       if (fence_is_array(sync_file->fence)) {
-               struct fence_array *array = to_fence_array(sync_file->fence);
+       if (dma_fence_is_array(sync_file->fence)) {
+               struct dma_fence_array *array = to_dma_fence_array(sync_file->fence);
 
                *num_fences = array->num_fences;
                return array->fences;
@@ -176,12 +178,13 @@ static struct fence **get_fences(struct sync_file *sync_file, int *num_fences)
        return &sync_file->fence;
 }
 
-static void add_fence(struct fence **fences, int *i, struct fence *fence)
+static void add_fence(struct dma_fence **fences,
+                     int *i, struct dma_fence *fence)
 {
        fences[*i] = fence;
 
-       if (!fence_is_signaled(fence)) {
-               fence_get(fence);
+       if (!dma_fence_is_signaled(fence)) {
+               dma_fence_get(fence);
                (*i)++;
        }
 }
@@ -200,7 +203,7 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,
                                         struct sync_file *b)
 {
        struct sync_file *sync_file;
-       struct fence **fences, **nfences, **a_fences, **b_fences;
+       struct dma_fence **fences, **nfences, **a_fences, **b_fences;
        int i, i_a, i_b, num_fences, a_num_fences, b_num_fences;
 
        sync_file = sync_file_alloc();
@@ -226,8 +229,8 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,
         * and sync_file_create, this is a reasonable assumption.
         */
        for (i = i_a = i_b = 0; i_a < a_num_fences && i_b < b_num_fences; ) {
-               struct fence *pt_a = a_fences[i_a];
-               struct fence *pt_b = b_fences[i_b];
+               struct dma_fence *pt_a = a_fences[i_a];
+               struct dma_fence *pt_b = b_fences[i_b];
 
                if (pt_a->context < pt_b->context) {
                        add_fence(fences, &i, pt_a);
@@ -255,7 +258,7 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,
                add_fence(fences, &i, b_fences[i_b]);
 
        if (i == 0)
-               fences[i++] = fence_get(a_fences[0]);
+               fences[i++] = dma_fence_get(a_fences[0]);
 
        if (num_fences > i) {
                nfences = krealloc(fences, i * sizeof(*fences),
@@ -286,8 +289,8 @@ static void sync_file_free(struct kref *kref)
                                                     kref);
 
        if (test_bit(POLL_ENABLED, &sync_file->fence->flags))
-               fence_remove_callback(sync_file->fence, &sync_file->cb);
-       fence_put(sync_file->fence);
+               dma_fence_remove_callback(sync_file->fence, &sync_file->cb);
+       dma_fence_put(sync_file->fence);
        kfree(sync_file);
 }
 
@@ -307,12 +310,12 @@ static unsigned int sync_file_poll(struct file *file, poll_table *wait)
 
        if (!poll_does_not_wait(wait) &&
            !test_and_set_bit(POLL_ENABLED, &sync_file->fence->flags)) {
-               if (fence_add_callback(sync_file->fence, &sync_file->cb,
-                                      fence_check_cb_func) < 0)
+               if (dma_fence_add_callback(sync_file->fence, &sync_file->cb,
+                                          fence_check_cb_func) < 0)
                        wake_up_all(&sync_file->wq);
        }
 
-       return fence_is_signaled(sync_file->fence) ? POLLIN : 0;
+       return dma_fence_is_signaled(sync_file->fence) ? POLLIN : 0;
 }
 
 static long sync_file_ioctl_merge(struct sync_file *sync_file,
@@ -370,14 +373,14 @@ err_put_fd:
        return err;
 }
 
-static void sync_fill_fence_info(struct fence *fence,
+static void sync_fill_fence_info(struct dma_fence *fence,
                                 struct sync_fence_info *info)
 {
        strlcpy(info->obj_name, fence->ops->get_timeline_name(fence),
                sizeof(info->obj_name));
        strlcpy(info->driver_name, fence->ops->get_driver_name(fence),
                sizeof(info->driver_name));
-       if (fence_is_signaled(fence))
+       if (dma_fence_is_signaled(fence))
                info->status = fence->status >= 0 ? 1 : fence->status;
        else
                info->status = 0;
@@ -389,7 +392,7 @@ static long sync_file_ioctl_fence_info(struct sync_file *sync_file,
 {
        struct sync_file_info info;
        struct sync_fence_info *fence_info = NULL;
-       struct fence **fences;
+       struct dma_fence **fences;
        __u32 size;
        int num_fences, ret, i;
 
@@ -429,7 +432,7 @@ static long sync_file_ioctl_fence_info(struct sync_file *sync_file,
 
 no_fences:
        strlcpy(info.name, sync_file->name, sizeof(info.name));
-       info.status = fence_is_signaled(sync_file->fence);
+       info.status = dma_fence_is_signaled(sync_file->fence);
        info.num_fences = num_fences;
 
        if (copy_to_user((void __user *)arg, &info, sizeof(info)))
index 039b57e4644c3936bfe345426ff17754847b199b..283d05927d1596752e294d1f5cc5b8e6cc2bfb21 100644 (file)
@@ -34,7 +34,7 @@
 #include <linux/kref.h>
 #include <linux/interval_tree.h>
 #include <linux/hashtable.h>
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 
 #include <ttm/ttm_bo_api.h>
 #include <ttm/ttm_bo_driver.h>
@@ -378,7 +378,7 @@ struct amdgpu_fence_driver {
        struct timer_list               fallback_timer;
        unsigned                        num_fences_mask;
        spinlock_t                      lock;
-       struct fence                    **fences;
+       struct dma_fence                **fences;
 };
 
 /* some special values for the owner field */
@@ -399,7 +399,7 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,
                                   unsigned irq_type);
 void amdgpu_fence_driver_suspend(struct amdgpu_device *adev);
 void amdgpu_fence_driver_resume(struct amdgpu_device *adev);
-int amdgpu_fence_emit(struct amdgpu_ring *ring, struct fence **fence);
+int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **fence);
 void amdgpu_fence_process(struct amdgpu_ring *ring);
 int amdgpu_fence_wait_empty(struct amdgpu_ring *ring);
 unsigned amdgpu_fence_count_emitted(struct amdgpu_ring *ring);
@@ -427,7 +427,7 @@ struct amdgpu_bo_va_mapping {
 struct amdgpu_bo_va {
        /* protected by bo being reserved */
        struct list_head                bo_list;
-       struct fence                    *last_pt_update;
+       struct dma_fence                *last_pt_update;
        unsigned                        ref_count;
 
        /* protected by vm mutex and spinlock */
@@ -543,7 +543,7 @@ struct amdgpu_sa_bo {
        struct amdgpu_sa_manager        *manager;
        unsigned                        soffset;
        unsigned                        eoffset;
-       struct fence                    *fence;
+       struct dma_fence                *fence;
 };
 
 /*
@@ -566,19 +566,19 @@ int amdgpu_mode_dumb_mmap(struct drm_file *filp,
  */
 struct amdgpu_sync {
        DECLARE_HASHTABLE(fences, 4);
-       struct fence            *last_vm_update;
+       struct dma_fence        *last_vm_update;
 };
 
 void amdgpu_sync_create(struct amdgpu_sync *sync);
 int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync,
-                     struct fence *f);
+                     struct dma_fence *f);
 int amdgpu_sync_resv(struct amdgpu_device *adev,
                     struct amdgpu_sync *sync,
                     struct reservation_object *resv,
                     void *owner);
-struct fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,
+struct dma_fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,
                                     struct amdgpu_ring *ring);
-struct fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync);
+struct dma_fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync);
 void amdgpu_sync_free(struct amdgpu_sync *sync);
 int amdgpu_sync_init(void);
 void amdgpu_sync_fini(void);
@@ -703,10 +703,10 @@ struct amdgpu_flip_work {
        uint64_t                        base;
        struct drm_pending_vblank_event *event;
        struct amdgpu_bo                *old_abo;
-       struct fence                    *excl;
+       struct dma_fence                *excl;
        unsigned                        shared_count;
-       struct fence                    **shared;
-       struct fence_cb                 cb;
+       struct dma_fence                **shared;
+       struct dma_fence_cb             cb;
        bool                            async;
 };
 
@@ -742,7 +742,7 @@ void amdgpu_job_free_resources(struct amdgpu_job *job);
 void amdgpu_job_free(struct amdgpu_job *job);
 int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
                      struct amd_sched_entity *entity, void *owner,
-                     struct fence **f);
+                     struct dma_fence **f);
 
 struct amdgpu_ring {
        struct amdgpu_device            *adev;
@@ -844,7 +844,7 @@ struct amdgpu_vm {
        /* contains the page directory */
        struct amdgpu_bo        *page_directory;
        unsigned                max_pde_used;
-       struct fence            *page_directory_fence;
+       struct dma_fence        *page_directory_fence;
        uint64_t                last_eviction_counter;
 
        /* array of page tables, one for each page directory entry */
@@ -865,14 +865,14 @@ struct amdgpu_vm {
 
 struct amdgpu_vm_id {
        struct list_head        list;
-       struct fence            *first;
+       struct dma_fence        *first;
        struct amdgpu_sync      active;
-       struct fence            *last_flush;
+       struct dma_fence        *last_flush;
        atomic64_t              owner;
 
        uint64_t                pd_gpu_addr;
        /* last flushed PD/PT update */
-       struct fence            *flushed_updates;
+       struct dma_fence        *flushed_updates;
 
        uint32_t                current_gpu_reset_count;
 
@@ -921,7 +921,7 @@ void amdgpu_vm_get_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm,
 void amdgpu_vm_move_pt_bos_in_lru(struct amdgpu_device *adev,
                                  struct amdgpu_vm *vm);
 int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
-                     struct amdgpu_sync *sync, struct fence *fence,
+                     struct amdgpu_sync *sync, struct dma_fence *fence,
                      struct amdgpu_job *job);
 int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job);
 void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vm_id);
@@ -957,7 +957,7 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
 
 struct amdgpu_ctx_ring {
        uint64_t                sequence;
-       struct fence            **fences;
+       struct dma_fence        **fences;
        struct amd_sched_entity entity;
 };
 
@@ -966,7 +966,7 @@ struct amdgpu_ctx {
        struct amdgpu_device    *adev;
        unsigned                reset_counter;
        spinlock_t              ring_lock;
-       struct fence            **fences;
+       struct dma_fence        **fences;
        struct amdgpu_ctx_ring  rings[AMDGPU_MAX_RINGS];
        bool preamble_presented;
 };
@@ -982,8 +982,8 @@ struct amdgpu_ctx *amdgpu_ctx_get(struct amdgpu_fpriv *fpriv, uint32_t id);
 int amdgpu_ctx_put(struct amdgpu_ctx *ctx);
 
 uint64_t amdgpu_ctx_add_fence(struct amdgpu_ctx *ctx, struct amdgpu_ring *ring,
-                             struct fence *fence);
-struct fence *amdgpu_ctx_get_fence(struct amdgpu_ctx *ctx,
+                             struct dma_fence *fence);
+struct dma_fence *amdgpu_ctx_get_fence(struct amdgpu_ctx *ctx,
                                   struct amdgpu_ring *ring, uint64_t seq);
 
 int amdgpu_ctx_ioctl(struct drm_device *dev, void *data,
@@ -1181,10 +1181,10 @@ struct amdgpu_gfx {
 int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm,
                  unsigned size, struct amdgpu_ib *ib);
 void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib,
-                   struct fence *f);
+                   struct dma_fence *f);
 int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
-                      struct amdgpu_ib *ib, struct fence *last_vm_update,
-                      struct amdgpu_job *job, struct fence **f);
+                      struct amdgpu_ib *ib, struct dma_fence *last_vm_update,
+                      struct amdgpu_job *job, struct dma_fence **f);
 int amdgpu_ib_pool_init(struct amdgpu_device *adev);
 void amdgpu_ib_pool_fini(struct amdgpu_device *adev);
 int amdgpu_ib_ring_tests(struct amdgpu_device *adev);
@@ -1225,7 +1225,7 @@ struct amdgpu_cs_parser {
        struct amdgpu_bo_list           *bo_list;
        struct amdgpu_bo_list_entry     vm_pd;
        struct list_head                validated;
-       struct fence                    *fence;
+       struct dma_fence                *fence;
        uint64_t                        bytes_moved_threshold;
        uint64_t                        bytes_moved;
        struct amdgpu_bo_list_entry     *evictable;
@@ -1245,7 +1245,7 @@ struct amdgpu_job {
        struct amdgpu_ring      *ring;
        struct amdgpu_sync      sync;
        struct amdgpu_ib        *ibs;
-       struct fence            *fence; /* the hw fence */
+       struct dma_fence        *fence; /* the hw fence */
        uint32_t                preamble_status;
        uint32_t                num_ibs;
        void                    *owner;
index 345305235349c0c40a1812e6555900cfbea6b187..cc97eee9322640bf5c881aef67d0e8cbb0efc2d5 100644 (file)
@@ -33,7 +33,7 @@ static int amdgpu_benchmark_do_move(struct amdgpu_device *adev, unsigned size,
 {
        unsigned long start_jiffies;
        unsigned long end_jiffies;
-       struct fence *fence = NULL;
+       struct dma_fence *fence = NULL;
        int i, r;
 
        start_jiffies = jiffies;
@@ -43,17 +43,17 @@ static int amdgpu_benchmark_do_move(struct amdgpu_device *adev, unsigned size,
                                       false);
                if (r)
                        goto exit_do_move;
-               r = fence_wait(fence, false);
+               r = dma_fence_wait(fence, false);
                if (r)
                        goto exit_do_move;
-               fence_put(fence);
+               dma_fence_put(fence);
        }
        end_jiffies = jiffies;
        r = jiffies_to_msecs(end_jiffies - start_jiffies);
 
 exit_do_move:
        if (fence)
-               fence_put(fence);
+               dma_fence_put(fence);
        return r;
 }
 
index b0f6e6957536a7827acc979856f3ef5280b3ce79..5d582265e9294650fe263649e11a6c274857945c 100644 (file)
@@ -719,7 +719,7 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error, bo
                ttm_eu_backoff_reservation(&parser->ticket,
                                           &parser->validated);
        }
-       fence_put(parser->fence);
+       dma_fence_put(parser->fence);
 
        if (parser->ctx)
                amdgpu_ctx_put(parser->ctx);
@@ -756,7 +756,7 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p,
 
        if (p->bo_list) {
                for (i = 0; i < p->bo_list->num_entries; i++) {
-                       struct fence *f;
+                       struct dma_fence *f;
 
                        /* ignore duplicates */
                        bo = p->bo_list->array[i].robj;
@@ -956,7 +956,7 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev,
                for (j = 0; j < num_deps; ++j) {
                        struct amdgpu_ring *ring;
                        struct amdgpu_ctx *ctx;
-                       struct fence *fence;
+                       struct dma_fence *fence;
 
                        r = amdgpu_cs_get_ring(adev, deps[j].ip_type,
                                               deps[j].ip_instance,
@@ -978,7 +978,7 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev,
                        } else if (fence) {
                                r = amdgpu_sync_fence(adev, &p->job->sync,
                                                      fence);
-                               fence_put(fence);
+                               dma_fence_put(fence);
                                amdgpu_ctx_put(ctx);
                                if (r)
                                        return r;
@@ -1008,7 +1008,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
 
        job->owner = p->filp;
        job->fence_ctx = entity->fence_context;
-       p->fence = fence_get(&job->base.s_fence->finished);
+       p->fence = dma_fence_get(&job->base.s_fence->finished);
        cs->out.handle = amdgpu_ctx_add_fence(p->ctx, ring, p->fence);
        job->uf_sequence = cs->out.handle;
        amdgpu_job_free_resources(job);
@@ -1091,7 +1091,7 @@ int amdgpu_cs_wait_ioctl(struct drm_device *dev, void *data,
        unsigned long timeout = amdgpu_gem_timeout(wait->in.timeout);
        struct amdgpu_ring *ring = NULL;
        struct amdgpu_ctx *ctx;
-       struct fence *fence;
+       struct dma_fence *fence;
        long r;
 
        r = amdgpu_cs_get_ring(adev, wait->in.ip_type, wait->in.ip_instance,
@@ -1107,8 +1107,8 @@ int amdgpu_cs_wait_ioctl(struct drm_device *dev, void *data,
        if (IS_ERR(fence))
                r = PTR_ERR(fence);
        else if (fence) {
-               r = fence_wait_timeout(fence, true, timeout);
-               fence_put(fence);
+               r = dma_fence_wait_timeout(fence, true, timeout);
+               dma_fence_put(fence);
        } else
                r = 1;
 
index a5e2fcbef0f0f24f54bcf54164eb610c463edd49..99bbc860322f8bcd0a1c72a6f947b49c1fafc654 100644 (file)
@@ -35,7 +35,7 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev, struct amdgpu_ctx *ctx)
        kref_init(&ctx->refcount);
        spin_lock_init(&ctx->ring_lock);
        ctx->fences = kcalloc(amdgpu_sched_jobs * AMDGPU_MAX_RINGS,
-                             sizeof(struct fence*), GFP_KERNEL);
+                             sizeof(struct dma_fence*), GFP_KERNEL);
        if (!ctx->fences)
                return -ENOMEM;
 
@@ -79,7 +79,7 @@ static void amdgpu_ctx_fini(struct amdgpu_ctx *ctx)
 
        for (i = 0; i < AMDGPU_MAX_RINGS; ++i)
                for (j = 0; j < amdgpu_sched_jobs; ++j)
-                       fence_put(ctx->rings[i].fences[j]);
+                       dma_fence_put(ctx->rings[i].fences[j]);
        kfree(ctx->fences);
        ctx->fences = NULL;
 
@@ -241,39 +241,39 @@ int amdgpu_ctx_put(struct amdgpu_ctx *ctx)
 }
 
 uint64_t amdgpu_ctx_add_fence(struct amdgpu_ctx *ctx, struct amdgpu_ring *ring,
-                             struct fence *fence)
+                             struct dma_fence *fence)
 {
        struct amdgpu_ctx_ring *cring = & ctx->rings[ring->idx];
        uint64_t seq = cring->sequence;
        unsigned idx = 0;
-       struct fence *other = NULL;
+       struct dma_fence *other = NULL;
 
        idx = seq & (amdgpu_sched_jobs - 1);
        other = cring->fences[idx];
        if (other) {
                signed long r;
-               r = fence_wait_timeout(other, false, MAX_SCHEDULE_TIMEOUT);
+               r = dma_fence_wait_timeout(other, false, MAX_SCHEDULE_TIMEOUT);
                if (r < 0)
                        DRM_ERROR("Error (%ld) waiting for fence!\n", r);
        }
 
-       fence_get(fence);
+       dma_fence_get(fence);
 
        spin_lock(&ctx->ring_lock);
        cring->fences[idx] = fence;
        cring->sequence++;
        spin_unlock(&ctx->ring_lock);
 
-       fence_put(other);
+       dma_fence_put(other);
 
        return seq;
 }
 
-struct fence *amdgpu_ctx_get_fence(struct amdgpu_ctx *ctx,
-                                  struct amdgpu_ring *ring, uint64_t seq)
+struct dma_fence *amdgpu_ctx_get_fence(struct amdgpu_ctx *ctx,
+                                      struct amdgpu_ring *ring, uint64_t seq)
 {
        struct amdgpu_ctx_ring *cring = & ctx->rings[ring->idx];
-       struct fence *fence;
+       struct dma_fence *fence;
 
        spin_lock(&ctx->ring_lock);
 
@@ -288,7 +288,7 @@ struct fence *amdgpu_ctx_get_fence(struct amdgpu_ctx *ctx,
                return NULL;
        }
 
-       fence = fence_get(cring->fences[seq & (amdgpu_sched_jobs - 1)]);
+       fence = dma_fence_get(cring->fences[seq & (amdgpu_sched_jobs - 1)]);
        spin_unlock(&ctx->ring_lock);
 
        return fence;
index b4f4a9239069d1a3f073cd89f1355b2e0dd7e985..0262b43c8f0e4104d5d659422034ebd6d506ee2b 100644 (file)
@@ -1599,7 +1599,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
        adev->vm_manager.vm_pte_funcs = NULL;
        adev->vm_manager.vm_pte_num_rings = 0;
        adev->gart.gart_funcs = NULL;
-       adev->fence_context = fence_context_alloc(AMDGPU_MAX_RINGS);
+       adev->fence_context = dma_fence_context_alloc(AMDGPU_MAX_RINGS);
 
        adev->smc_rreg = &amdgpu_invalid_rreg;
        adev->smc_wreg = &amdgpu_invalid_wreg;
@@ -2193,7 +2193,7 @@ bool amdgpu_need_backup(struct amdgpu_device *adev)
 static int amdgpu_recover_vram_from_shadow(struct amdgpu_device *adev,
                                           struct amdgpu_ring *ring,
                                           struct amdgpu_bo *bo,
-                                          struct fence **fence)
+                                          struct dma_fence **fence)
 {
        uint32_t domain;
        int r;
@@ -2312,30 +2312,30 @@ retry:
                if (need_full_reset && amdgpu_need_backup(adev)) {
                        struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
                        struct amdgpu_bo *bo, *tmp;
-                       struct fence *fence = NULL, *next = NULL;
+                       struct dma_fence *fence = NULL, *next = NULL;
 
                        DRM_INFO("recover vram bo from shadow\n");
                        mutex_lock(&adev->shadow_list_lock);
                        list_for_each_entry_safe(bo, tmp, &adev->shadow_list, shadow_list) {
                                amdgpu_recover_vram_from_shadow(adev, ring, bo, &next);
                                if (fence) {
-                                       r = fence_wait(fence, false);
+                                       r = dma_fence_wait(fence, false);
                                        if (r) {
                                                WARN(r, "recovery from shadow isn't comleted\n");
                                                break;
                                        }
                                }
 
-                               fence_put(fence);
+                               dma_fence_put(fence);
                                fence = next;
                        }
                        mutex_unlock(&adev->shadow_list_lock);
                        if (fence) {
-                               r = fence_wait(fence, false);
+                               r = dma_fence_wait(fence, false);
                                if (r)
                                        WARN(r, "recovery from shadow isn't comleted\n");
                        }
-                       fence_put(fence);
+                       dma_fence_put(fence);
                }
                for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
                        struct amdgpu_ring *ring = adev->rings[i];
index 083e2b42987272d96f57fa091f92426651751a61..075c0d7db2051aeb3c67cfc963603956bfbbcf7d 100644 (file)
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
 
-static void amdgpu_flip_callback(struct fence *f, struct fence_cb *cb)
+static void amdgpu_flip_callback(struct dma_fence *f, struct dma_fence_cb *cb)
 {
        struct amdgpu_flip_work *work =
                container_of(cb, struct amdgpu_flip_work, cb);
 
-       fence_put(f);
+       dma_fence_put(f);
        schedule_work(&work->flip_work.work);
 }
 
 static bool amdgpu_flip_handle_fence(struct amdgpu_flip_work *work,
-                                    struct fence **f)
+                                    struct dma_fence **f)
 {
-       struct fence *fence= *f;
+       struct dma_fence *fence= *f;
 
        if (fence == NULL)
                return false;
 
        *f = NULL;
 
-       if (!fence_add_callback(fence, &work->cb, amdgpu_flip_callback))
+       if (!dma_fence_add_callback(fence, &work->cb, amdgpu_flip_callback))
                return true;
 
-       fence_put(fence);
+       dma_fence_put(fence);
        return false;
 }
 
@@ -244,9 +244,9 @@ unreserve:
 
 cleanup:
        amdgpu_bo_unref(&work->old_abo);
-       fence_put(work->excl);
+       dma_fence_put(work->excl);
        for (i = 0; i < work->shared_count; ++i)
-               fence_put(work->shared[i]);
+               dma_fence_put(work->shared[i]);
        kfree(work->shared);
        kfree(work);
 
index 3a2e42f4b897647520f49db963412789672d0229..57552c79ec58b512fcbceff21538d76e1f601b88 100644 (file)
@@ -48,7 +48,7 @@
  */
 
 struct amdgpu_fence {
-       struct fence base;
+       struct dma_fence base;
 
        /* RB, DMA, etc. */
        struct amdgpu_ring              *ring;
@@ -73,8 +73,8 @@ void amdgpu_fence_slab_fini(void)
 /*
  * Cast helper
  */
-static const struct fence_ops amdgpu_fence_ops;
-static inline struct amdgpu_fence *to_amdgpu_fence(struct fence *f)
+static const struct dma_fence_ops amdgpu_fence_ops;
+static inline struct amdgpu_fence *to_amdgpu_fence(struct dma_fence *f)
 {
        struct amdgpu_fence *__f = container_of(f, struct amdgpu_fence, base);
 
@@ -130,11 +130,11 @@ static u32 amdgpu_fence_read(struct amdgpu_ring *ring)
  * Emits a fence command on the requested ring (all asics).
  * Returns 0 on success, -ENOMEM on failure.
  */
-int amdgpu_fence_emit(struct amdgpu_ring *ring, struct fence **f)
+int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_fence *fence;
-       struct fence *old, **ptr;
+       struct dma_fence *old, **ptr;
        uint32_t seq;
 
        fence = kmem_cache_alloc(amdgpu_fence_slab, GFP_KERNEL);
@@ -143,10 +143,10 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct fence **f)
 
        seq = ++ring->fence_drv.sync_seq;
        fence->ring = ring;
-       fence_init(&fence->base, &amdgpu_fence_ops,
-                  &ring->fence_drv.lock,
-                  adev->fence_context + ring->idx,
-                  seq);
+       dma_fence_init(&fence->base, &amdgpu_fence_ops,
+                      &ring->fence_drv.lock,
+                      adev->fence_context + ring->idx,
+                      seq);
        amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr,
                               seq, AMDGPU_FENCE_FLAG_INT);
 
@@ -155,12 +155,12 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct fence **f)
         * emitting the fence would mess up the hardware ring buffer.
         */
        old = rcu_dereference_protected(*ptr, 1);
-       if (old && !fence_is_signaled(old)) {
+       if (old && !dma_fence_is_signaled(old)) {
                DRM_INFO("rcu slot is busy\n");
-               fence_wait(old, false);
+               dma_fence_wait(old, false);
        }
 
-       rcu_assign_pointer(*ptr, fence_get(&fence->base));
+       rcu_assign_pointer(*ptr, dma_fence_get(&fence->base));
 
        *f = &fence->base;
 
@@ -211,7 +211,7 @@ void amdgpu_fence_process(struct amdgpu_ring *ring)
        seq &= drv->num_fences_mask;
 
        do {
-               struct fence *fence, **ptr;
+               struct dma_fence *fence, **ptr;
 
                ++last_seq;
                last_seq &= drv->num_fences_mask;
@@ -224,13 +224,13 @@ void amdgpu_fence_process(struct amdgpu_ring *ring)
                if (!fence)
                        continue;
 
-               r = fence_signal(fence);
+               r = dma_fence_signal(fence);
                if (!r)
-                       FENCE_TRACE(fence, "signaled from irq context\n");
+                       DMA_FENCE_TRACE(fence, "signaled from irq context\n");
                else
                        BUG();
 
-               fence_put(fence);
+               dma_fence_put(fence);
        } while (last_seq != seq);
 }
 
@@ -260,7 +260,7 @@ static void amdgpu_fence_fallback(unsigned long arg)
 int amdgpu_fence_wait_empty(struct amdgpu_ring *ring)
 {
        uint64_t seq = ACCESS_ONCE(ring->fence_drv.sync_seq);
-       struct fence *fence, **ptr;
+       struct dma_fence *fence, **ptr;
        int r;
 
        if (!seq)
@@ -269,14 +269,14 @@ int amdgpu_fence_wait_empty(struct amdgpu_ring *ring)
        ptr = &ring->fence_drv.fences[seq & ring->fence_drv.num_fences_mask];
        rcu_read_lock();
        fence = rcu_dereference(*ptr);
-       if (!fence || !fence_get_rcu(fence)) {
+       if (!fence || !dma_fence_get_rcu(fence)) {
                rcu_read_unlock();
                return 0;
        }
        rcu_read_unlock();
 
-       r = fence_wait(fence, false);
-       fence_put(fence);
+       r = dma_fence_wait(fence, false);
+       dma_fence_put(fence);
        return r;
 }
 
@@ -452,7 +452,7 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
                amd_sched_fini(&ring->sched);
                del_timer_sync(&ring->fence_drv.fallback_timer);
                for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j)
-                       fence_put(ring->fence_drv.fences[j]);
+                       dma_fence_put(ring->fence_drv.fences[j]);
                kfree(ring->fence_drv.fences);
                ring->fence_drv.fences = NULL;
                ring->fence_drv.initialized = false;
@@ -541,12 +541,12 @@ void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev)
  * Common fence implementation
  */
 
-static const char *amdgpu_fence_get_driver_name(struct fence *fence)
+static const char *amdgpu_fence_get_driver_name(struct dma_fence *fence)
 {
        return "amdgpu";
 }
 
-static const char *amdgpu_fence_get_timeline_name(struct fence *f)
+static const char *amdgpu_fence_get_timeline_name(struct dma_fence *f)
 {
        struct amdgpu_fence *fence = to_amdgpu_fence(f);
        return (const char *)fence->ring->name;
@@ -560,7 +560,7 @@ static const char *amdgpu_fence_get_timeline_name(struct fence *f)
  * to fence_queue that checks if this fence is signaled, and if so it
  * signals the fence and removes itself.
  */
-static bool amdgpu_fence_enable_signaling(struct fence *f)
+static bool amdgpu_fence_enable_signaling(struct dma_fence *f)
 {
        struct amdgpu_fence *fence = to_amdgpu_fence(f);
        struct amdgpu_ring *ring = fence->ring;
@@ -568,7 +568,7 @@ static bool amdgpu_fence_enable_signaling(struct fence *f)
        if (!timer_pending(&ring->fence_drv.fallback_timer))
                amdgpu_fence_schedule_fallback(ring);
 
-       FENCE_TRACE(&fence->base, "armed on ring %i!\n", ring->idx);
+       DMA_FENCE_TRACE(&fence->base, "armed on ring %i!\n", ring->idx);
 
        return true;
 }
@@ -582,7 +582,7 @@ static bool amdgpu_fence_enable_signaling(struct fence *f)
  */
 static void amdgpu_fence_free(struct rcu_head *rcu)
 {
-       struct fence *f = container_of(rcu, struct fence, rcu);
+       struct dma_fence *f = container_of(rcu, struct dma_fence, rcu);
        struct amdgpu_fence *fence = to_amdgpu_fence(f);
        kmem_cache_free(amdgpu_fence_slab, fence);
 }
@@ -595,16 +595,16 @@ static void amdgpu_fence_free(struct rcu_head *rcu)
  * This function is called when the reference count becomes zero.
  * It just RCU schedules freeing up the fence.
  */
-static void amdgpu_fence_release(struct fence *f)
+static void amdgpu_fence_release(struct dma_fence *f)
 {
        call_rcu(&f->rcu, amdgpu_fence_free);
 }
 
-static const struct fence_ops amdgpu_fence_ops = {
+static const struct dma_fence_ops amdgpu_fence_ops = {
        .get_driver_name = amdgpu_fence_get_driver_name,
        .get_timeline_name = amdgpu_fence_get_timeline_name,
        .enable_signaling = amdgpu_fence_enable_signaling,
-       .wait = fence_default_wait,
+       .wait = dma_fence_default_wait,
        .release = amdgpu_fence_release,
 };
 
index 6a6c86c9c1694eb475b9671c47cfaa4738473ed8..c3672dfcfd6a585a2d334e4672bc28f644bcce1c 100644 (file)
@@ -89,7 +89,7 @@ int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm,
  * Free an IB (all asics).
  */
 void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib,
-                   struct fence *f)
+                   struct dma_fence *f)
 {
        amdgpu_sa_bo_free(adev, &ib->sa_bo, f);
 }
@@ -116,8 +116,8 @@ void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib,
  * to SI there was just a DE IB.
  */
 int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
-                      struct amdgpu_ib *ibs, struct fence *last_vm_update,
-                      struct amdgpu_job *job, struct fence **f)
+                      struct amdgpu_ib *ibs, struct dma_fence *last_vm_update,
+                      struct amdgpu_job *job, struct dma_fence **f)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_ib *ib = &ibs[0];
index 8c5807994073cedf8c2128a6ded356938596786c..a0de6286c453c545a2d88912bbed2d397fb4d258 100644 (file)
@@ -81,7 +81,7 @@ int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size,
 
 void amdgpu_job_free_resources(struct amdgpu_job *job)
 {
-       struct fence *f;
+       struct dma_fence *f;
        unsigned i;
 
        /* use sched fence if available */
@@ -95,7 +95,7 @@ static void amdgpu_job_free_cb(struct amd_sched_job *s_job)
 {
        struct amdgpu_job *job = container_of(s_job, struct amdgpu_job, base);
 
-       fence_put(job->fence);
+       dma_fence_put(job->fence);
        amdgpu_sync_free(&job->sync);
        kfree(job);
 }
@@ -104,14 +104,14 @@ void amdgpu_job_free(struct amdgpu_job *job)
 {
        amdgpu_job_free_resources(job);
 
-       fence_put(job->fence);
+       dma_fence_put(job->fence);
        amdgpu_sync_free(&job->sync);
        kfree(job);
 }
 
 int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
                      struct amd_sched_entity *entity, void *owner,
-                     struct fence **f)
+                     struct dma_fence **f)
 {
        int r;
        job->ring = ring;
@@ -125,19 +125,19 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
 
        job->owner = owner;
        job->fence_ctx = entity->fence_context;
-       *f = fence_get(&job->base.s_fence->finished);
+       *f = dma_fence_get(&job->base.s_fence->finished);
        amdgpu_job_free_resources(job);
        amd_sched_entity_push_job(&job->base);
 
        return 0;
 }
 
-static struct fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
+static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
 {
        struct amdgpu_job *job = to_amdgpu_job(sched_job);
        struct amdgpu_vm *vm = job->vm;
 
-       struct fence *fence = amdgpu_sync_get_fence(&job->sync);
+       struct dma_fence *fence = amdgpu_sync_get_fence(&job->sync);
 
        if (fence == NULL && vm && !job->vm_id) {
                struct amdgpu_ring *ring = job->ring;
@@ -155,9 +155,9 @@ static struct fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
        return fence;
 }
 
-static struct fence *amdgpu_job_run(struct amd_sched_job *sched_job)
+static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job)
 {
-       struct fence *fence = NULL;
+       struct dma_fence *fence = NULL;
        struct amdgpu_job *job;
        int r;
 
@@ -176,8 +176,8 @@ static struct fence *amdgpu_job_run(struct amd_sched_job *sched_job)
                DRM_ERROR("Error scheduling IBs (%d)\n", r);
 
        /* if gpu reset, hw fence will be replaced here */
-       fence_put(job->fence);
-       job->fence = fence_get(fence);
+       dma_fence_put(job->fence);
+       job->fence = dma_fence_get(fence);
        amdgpu_job_free_resources(job);
        return fence;
 }
index aa074fac0c7f66ef796b2da0704c314c96f2b5d5..55e142a5ff5f4662b8f8f7bd331dec9ca8cdb3c5 100644 (file)
@@ -383,7 +383,7 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev,
 
        if (flags & AMDGPU_GEM_CREATE_VRAM_CLEARED &&
            bo->tbo.mem.placement & TTM_PL_FLAG_VRAM) {
-               struct fence *fence;
+               struct dma_fence *fence;
 
                if (adev->mman.buffer_funcs_ring == NULL ||
                   !adev->mman.buffer_funcs_ring->ready) {
@@ -403,9 +403,9 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev,
                amdgpu_fill_buffer(bo, 0, bo->tbo.resv, &fence);
                amdgpu_bo_fence(bo, fence, false);
                amdgpu_bo_unreserve(bo);
-               fence_put(bo->tbo.moving);
-               bo->tbo.moving = fence_get(fence);
-               fence_put(fence);
+               dma_fence_put(bo->tbo.moving);
+               bo->tbo.moving = dma_fence_get(fence);
+               dma_fence_put(fence);
        }
        *bo_ptr = bo;
 
@@ -491,7 +491,7 @@ int amdgpu_bo_backup_to_shadow(struct amdgpu_device *adev,
                               struct amdgpu_ring *ring,
                               struct amdgpu_bo *bo,
                               struct reservation_object *resv,
-                              struct fence **fence,
+                              struct dma_fence **fence,
                               bool direct)
 
 {
@@ -523,7 +523,7 @@ int amdgpu_bo_restore_from_shadow(struct amdgpu_device *adev,
                                  struct amdgpu_ring *ring,
                                  struct amdgpu_bo *bo,
                                  struct reservation_object *resv,
-                                 struct fence **fence,
+                                 struct dma_fence **fence,
                                  bool direct)
 
 {
@@ -926,7 +926,7 @@ int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
  * @shared: true if fence should be added shared
  *
  */
-void amdgpu_bo_fence(struct amdgpu_bo *bo, struct fence *fence,
+void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence,
                     bool shared)
 {
        struct reservation_object *resv = bo->tbo.resv;
index 8255034d73eb10061c32a175b02b03f131587280..3e785ed3cb4b108474f73e35c6010c1f97256297 100644 (file)
@@ -156,19 +156,19 @@ int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer,
 void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,
                                  struct ttm_mem_reg *new_mem);
 int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo);
-void amdgpu_bo_fence(struct amdgpu_bo *bo, struct fence *fence,
+void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence,
                     bool shared);
 u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo);
 int amdgpu_bo_backup_to_shadow(struct amdgpu_device *adev,
                               struct amdgpu_ring *ring,
                               struct amdgpu_bo *bo,
                               struct reservation_object *resv,
-                              struct fence **fence, bool direct);
+                              struct dma_fence **fence, bool direct);
 int amdgpu_bo_restore_from_shadow(struct amdgpu_device *adev,
                                  struct amdgpu_ring *ring,
                                  struct amdgpu_bo *bo,
                                  struct reservation_object *resv,
-                                 struct fence **fence,
+                                 struct dma_fence **fence,
                                  bool direct);
 
 
@@ -200,7 +200,7 @@ int amdgpu_sa_bo_new(struct amdgpu_sa_manager *sa_manager,
                     unsigned size, unsigned align);
 void amdgpu_sa_bo_free(struct amdgpu_device *adev,
                              struct amdgpu_sa_bo **sa_bo,
-                             struct fence *fence);
+                             struct dma_fence *fence);
 #if defined(CONFIG_DEBUG_FS)
 void amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager,
                                         struct seq_file *m);
index d8af37a845f4ee3d80ffdf2b27f00565150817f3..fd26c4b8d793efdb0b030f6df5248556804b7cf4 100644 (file)
@@ -147,7 +147,7 @@ static void amdgpu_sa_bo_remove_locked(struct amdgpu_sa_bo *sa_bo)
        }
        list_del_init(&sa_bo->olist);
        list_del_init(&sa_bo->flist);
-       fence_put(sa_bo->fence);
+       dma_fence_put(sa_bo->fence);
        kfree(sa_bo);
 }
 
@@ -161,7 +161,7 @@ static void amdgpu_sa_bo_try_free(struct amdgpu_sa_manager *sa_manager)
        sa_bo = list_entry(sa_manager->hole->next, struct amdgpu_sa_bo, olist);
        list_for_each_entry_safe_from(sa_bo, tmp, &sa_manager->olist, olist) {
                if (sa_bo->fence == NULL ||
-                   !fence_is_signaled(sa_bo->fence)) {
+                   !dma_fence_is_signaled(sa_bo->fence)) {
                        return;
                }
                amdgpu_sa_bo_remove_locked(sa_bo);
@@ -244,7 +244,7 @@ static bool amdgpu_sa_event(struct amdgpu_sa_manager *sa_manager,
 }
 
 static bool amdgpu_sa_bo_next_hole(struct amdgpu_sa_manager *sa_manager,
-                                  struct fence **fences,
+                                  struct dma_fence **fences,
                                   unsigned *tries)
 {
        struct amdgpu_sa_bo *best_bo = NULL;
@@ -272,7 +272,7 @@ static bool amdgpu_sa_bo_next_hole(struct amdgpu_sa_manager *sa_manager,
                sa_bo = list_first_entry(&sa_manager->flist[i],
                                         struct amdgpu_sa_bo, flist);
 
-               if (!fence_is_signaled(sa_bo->fence)) {
+               if (!dma_fence_is_signaled(sa_bo->fence)) {
                        fences[i] = sa_bo->fence;
                        continue;
                }
@@ -314,7 +314,7 @@ int amdgpu_sa_bo_new(struct amdgpu_sa_manager *sa_manager,
                     struct amdgpu_sa_bo **sa_bo,
                     unsigned size, unsigned align)
 {
-       struct fence *fences[AMDGPU_SA_NUM_FENCE_LISTS];
+       struct dma_fence *fences[AMDGPU_SA_NUM_FENCE_LISTS];
        unsigned tries[AMDGPU_SA_NUM_FENCE_LISTS];
        unsigned count;
        int i, r;
@@ -356,14 +356,14 @@ int amdgpu_sa_bo_new(struct amdgpu_sa_manager *sa_manager,
 
                for (i = 0, count = 0; i < AMDGPU_SA_NUM_FENCE_LISTS; ++i)
                        if (fences[i])
-                               fences[count++] = fence_get(fences[i]);
+                               fences[count++] = dma_fence_get(fences[i]);
 
                if (count) {
                        spin_unlock(&sa_manager->wq.lock);
-                       t = fence_wait_any_timeout(fences, count, false,
-                                                  MAX_SCHEDULE_TIMEOUT);
+                       t = dma_fence_wait_any_timeout(fences, count, false,
+                                                      MAX_SCHEDULE_TIMEOUT);
                        for (i = 0; i < count; ++i)
-                               fence_put(fences[i]);
+                               dma_fence_put(fences[i]);
 
                        r = (t > 0) ? 0 : t;
                        spin_lock(&sa_manager->wq.lock);
@@ -384,7 +384,7 @@ int amdgpu_sa_bo_new(struct amdgpu_sa_manager *sa_manager,
 }
 
 void amdgpu_sa_bo_free(struct amdgpu_device *adev, struct amdgpu_sa_bo **sa_bo,
-                      struct fence *fence)
+                      struct dma_fence *fence)
 {
        struct amdgpu_sa_manager *sa_manager;
 
@@ -394,10 +394,10 @@ void amdgpu_sa_bo_free(struct amdgpu_device *adev, struct amdgpu_sa_bo **sa_bo,
 
        sa_manager = (*sa_bo)->manager;
        spin_lock(&sa_manager->wq.lock);
-       if (fence && !fence_is_signaled(fence)) {
+       if (fence && !dma_fence_is_signaled(fence)) {
                uint32_t idx;
 
-               (*sa_bo)->fence = fence_get(fence);
+               (*sa_bo)->fence = dma_fence_get(fence);
                idx = fence->context % AMDGPU_SA_NUM_FENCE_LISTS;
                list_add_tail(&(*sa_bo)->flist, &sa_manager->flist[idx]);
        } else {
index 5c8d3022fb8705acaf643519e27b2e80a187f0eb..ed814e6d0207be9429d20f0289acab0c0c59e1d3 100644 (file)
@@ -34,7 +34,7 @@
 
 struct amdgpu_sync_entry {
        struct hlist_node       node;
-       struct fence            *fence;
+       struct dma_fence        *fence;
 };
 
 static struct kmem_cache *amdgpu_sync_slab;
@@ -60,7 +60,8 @@ void amdgpu_sync_create(struct amdgpu_sync *sync)
  *
  * Test if the fence was issued by us.
  */
-static bool amdgpu_sync_same_dev(struct amdgpu_device *adev, struct fence *f)
+static bool amdgpu_sync_same_dev(struct amdgpu_device *adev,
+                                struct dma_fence *f)
 {
        struct amd_sched_fence *s_fence = to_amd_sched_fence(f);
 
@@ -81,7 +82,7 @@ static bool amdgpu_sync_same_dev(struct amdgpu_device *adev, struct fence *f)
  *
  * Extract who originally created the fence.
  */
-static void *amdgpu_sync_get_owner(struct fence *f)
+static void *amdgpu_sync_get_owner(struct dma_fence *f)
 {
        struct amd_sched_fence *s_fence = to_amd_sched_fence(f);
 
@@ -99,13 +100,14 @@ static void *amdgpu_sync_get_owner(struct fence *f)
  *
  * Either keep the existing fence or the new one, depending which one is later.
  */
-static void amdgpu_sync_keep_later(struct fence **keep, struct fence *fence)
+static void amdgpu_sync_keep_later(struct dma_fence **keep,
+                                  struct dma_fence *fence)
 {
-       if (*keep && fence_is_later(*keep, fence))
+       if (*keep && dma_fence_is_later(*keep, fence))
                return;
 
-       fence_put(*keep);
-       *keep = fence_get(fence);
+       dma_fence_put(*keep);
+       *keep = dma_fence_get(fence);
 }
 
 /**
@@ -117,7 +119,7 @@ static void amdgpu_sync_keep_later(struct fence **keep, struct fence *fence)
  * Tries to add the fence to an existing hash entry. Returns true when an entry
  * was found, false otherwise.
  */
-static bool amdgpu_sync_add_later(struct amdgpu_sync *sync, struct fence *f)
+static bool amdgpu_sync_add_later(struct amdgpu_sync *sync, struct dma_fence *f)
 {
        struct amdgpu_sync_entry *e;
 
@@ -139,7 +141,7 @@ static bool amdgpu_sync_add_later(struct amdgpu_sync *sync, struct fence *f)
  *
  */
 int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync,
-                     struct fence *f)
+                     struct dma_fence *f)
 {
        struct amdgpu_sync_entry *e;
 
@@ -158,7 +160,7 @@ int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync,
                return -ENOMEM;
 
        hash_add(sync->fences, &e->node, f->context);
-       e->fence = fence_get(f);
+       e->fence = dma_fence_get(f);
        return 0;
 }
 
@@ -177,7 +179,7 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,
                     void *owner)
 {
        struct reservation_object_list *flist;
-       struct fence *f;
+       struct dma_fence *f;
        void *fence_owner;
        unsigned i;
        int r = 0;
@@ -231,15 +233,15 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,
  * Returns the next fence not signaled yet without removing it from the sync
  * object.
  */
-struct fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,
-                                    struct amdgpu_ring *ring)
+struct dma_fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,
+                                        struct amdgpu_ring *ring)
 {
        struct amdgpu_sync_entry *e;
        struct hlist_node *tmp;
        int i;
 
        hash_for_each_safe(sync->fences, i, tmp, e, node) {
-               struct fence *f = e->fence;
+               struct dma_fence *f = e->fence;
                struct amd_sched_fence *s_fence = to_amd_sched_fence(f);
 
                if (ring && s_fence) {
@@ -247,16 +249,16 @@ struct fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,
                         * when they are scheduled.
                         */
                        if (s_fence->sched == &ring->sched) {
-                               if (fence_is_signaled(&s_fence->scheduled))
+                               if (dma_fence_is_signaled(&s_fence->scheduled))
                                        continue;
 
                                return &s_fence->scheduled;
                        }
                }
 
-               if (fence_is_signaled(f)) {
+               if (dma_fence_is_signaled(f)) {
                        hash_del(&e->node);
-                       fence_put(f);
+                       dma_fence_put(f);
                        kmem_cache_free(amdgpu_sync_slab, e);
                        continue;
                }
@@ -274,11 +276,11 @@ struct fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,
  *
  * Get and removes the next fence from the sync object not signaled yet.
  */
-struct fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync)
+struct dma_fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync)
 {
        struct amdgpu_sync_entry *e;
        struct hlist_node *tmp;
-       struct fence *f;
+       struct dma_fence *f;
        int i;
 
        hash_for_each_safe(sync->fences, i, tmp, e, node) {
@@ -288,10 +290,10 @@ struct fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync)
                hash_del(&e->node);
                kmem_cache_free(amdgpu_sync_slab, e);
 
-               if (!fence_is_signaled(f))
+               if (!dma_fence_is_signaled(f))
                        return f;
 
-               fence_put(f);
+               dma_fence_put(f);
        }
        return NULL;
 }
@@ -311,11 +313,11 @@ void amdgpu_sync_free(struct amdgpu_sync *sync)
 
        hash_for_each_safe(sync->fences, i, tmp, e, node) {
                hash_del(&e->node);
-               fence_put(e->fence);
+               dma_fence_put(e->fence);
                kmem_cache_free(amdgpu_sync_slab, e);
        }
 
-       fence_put(sync->last_vm_update);
+       dma_fence_put(sync->last_vm_update);
 }
 
 /**
index b827c75e95deb1295f6ec14a5a781fc6b922939c..e05a24325eebf74d912979f1f770d475f4969029 100644 (file)
@@ -78,7 +78,7 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev)
                void *gtt_map, *vram_map;
                void **gtt_start, **gtt_end;
                void **vram_start, **vram_end;
-               struct fence *fence = NULL;
+               struct dma_fence *fence = NULL;
 
                r = amdgpu_bo_create(adev, size, PAGE_SIZE, true,
                                     AMDGPU_GEM_DOMAIN_GTT, 0, NULL,
@@ -118,13 +118,13 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev)
                        goto out_lclean_unpin;
                }
 
-               r = fence_wait(fence, false);
+               r = dma_fence_wait(fence, false);
                if (r) {
                        DRM_ERROR("Failed to wait for GTT->VRAM fence %d\n", i);
                        goto out_lclean_unpin;
                }
 
-               fence_put(fence);
+               dma_fence_put(fence);
 
                r = amdgpu_bo_kmap(vram_obj, &vram_map);
                if (r) {
@@ -163,13 +163,13 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev)
                        goto out_lclean_unpin;
                }
 
-               r = fence_wait(fence, false);
+               r = dma_fence_wait(fence, false);
                if (r) {
                        DRM_ERROR("Failed to wait for VRAM->GTT fence %d\n", i);
                        goto out_lclean_unpin;
                }
 
-               fence_put(fence);
+               dma_fence_put(fence);
 
                r = amdgpu_bo_kmap(gtt_obj[i], &gtt_map);
                if (r) {
@@ -216,7 +216,7 @@ out_lclean:
                        amdgpu_bo_unref(&gtt_obj[i]);
                }
                if (fence)
-                       fence_put(fence);
+                       dma_fence_put(fence);
                break;
        }
 
index 067e5e683bb3507a75cfa56d05d7b2572c13f1d9..bb964a8ff93872e8654fa97aa5a6e2f013fb1c56 100644 (file)
@@ -104,7 +104,7 @@ TRACE_EVENT(amdgpu_cs_ioctl,
                             __field(struct amdgpu_device *, adev)
                             __field(struct amd_sched_job *, sched_job)
                             __field(struct amdgpu_ib *, ib)
-                            __field(struct fence *, fence)
+                            __field(struct dma_fence *, fence)
                             __field(char *, ring_name)
                             __field(u32, num_ibs)
                             ),
@@ -129,7 +129,7 @@ TRACE_EVENT(amdgpu_sched_run_job,
                             __field(struct amdgpu_device *, adev)
                             __field(struct amd_sched_job *, sched_job)
                             __field(struct amdgpu_ib *, ib)
-                            __field(struct fence *, fence)
+                            __field(struct dma_fence *, fence)
                             __field(char *, ring_name)
                             __field(u32, num_ibs)
                             ),
index dcaf691f56b5577352d2238bdfd27e2f1aca2386..a743aeabc767ff69ecdb4df8d386440662a8c6ef 100644 (file)
@@ -268,7 +268,7 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo,
        struct amdgpu_device *adev;
        struct amdgpu_ring *ring;
        uint64_t old_start, new_start;
-       struct fence *fence;
+       struct dma_fence *fence;
        int r;
 
        adev = amdgpu_get_adev(bo->bdev);
@@ -316,7 +316,7 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo,
                return r;
 
        r = ttm_bo_pipeline_move(bo, fence, evict, new_mem);
-       fence_put(fence);
+       dma_fence_put(fence);
        return r;
 }
 
@@ -1247,7 +1247,7 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring,
                       uint64_t dst_offset,
                       uint32_t byte_count,
                       struct reservation_object *resv,
-                      struct fence **fence, bool direct_submit)
+                      struct dma_fence **fence, bool direct_submit)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_job *job;
@@ -1294,7 +1294,7 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring,
        if (direct_submit) {
                r = amdgpu_ib_schedule(ring, job->num_ibs, job->ibs,
                                       NULL, NULL, fence);
-               job->fence = fence_get(*fence);
+               job->fence = dma_fence_get(*fence);
                if (r)
                        DRM_ERROR("Error scheduling IBs (%d)\n", r);
                amdgpu_job_free(job);
@@ -1315,7 +1315,7 @@ error_free:
 int amdgpu_fill_buffer(struct amdgpu_bo *bo,
                uint32_t src_data,
                struct reservation_object *resv,
-               struct fence **fence)
+               struct dma_fence **fence)
 {
        struct amdgpu_device *adev = bo->adev;
        struct amdgpu_job *job;
index 9812c805326c383cc02bdbc537f056e2d98bd40c..3f293e189378a22e551eb223a416165284fd7d7b 100644 (file)
@@ -77,11 +77,11 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring,
                       uint64_t dst_offset,
                       uint32_t byte_count,
                       struct reservation_object *resv,
-                      struct fence **fence, bool direct_submit);
+                      struct dma_fence **fence, bool direct_submit);
 int amdgpu_fill_buffer(struct amdgpu_bo *bo,
                        uint32_t src_data,
                        struct reservation_object *resv,
-                       struct fence **fence);
+                       struct dma_fence **fence);
 
 int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma);
 bool amdgpu_ttm_is_bound(struct ttm_tt *ttm);
index e3281cacc586020843886593531e5f160b7952fc..0f6575e7ef8c6e3d7dc213503a431e01720bd79c 100644 (file)
@@ -333,7 +333,7 @@ void amdgpu_uvd_free_handles(struct amdgpu_device *adev, struct drm_file *filp)
        for (i = 0; i < adev->uvd.max_handles; ++i) {
                uint32_t handle = atomic_read(&adev->uvd.handles[i]);
                if (handle != 0 && adev->uvd.filp[i] == filp) {
-                       struct fence *fence;
+                       struct dma_fence *fence;
 
                        r = amdgpu_uvd_get_destroy_msg(ring, handle,
                                                       false, &fence);
@@ -342,8 +342,8 @@ void amdgpu_uvd_free_handles(struct amdgpu_device *adev, struct drm_file *filp)
                                continue;
                        }
 
-                       fence_wait(fence, false);
-                       fence_put(fence);
+                       dma_fence_wait(fence, false);
+                       dma_fence_put(fence);
 
                        adev->uvd.filp[i] = NULL;
                        atomic_set(&adev->uvd.handles[i], 0);
@@ -909,14 +909,14 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx)
 }
 
 static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo,
-                              bool direct, struct fence **fence)
+                              bool direct, struct dma_fence **fence)
 {
        struct ttm_validate_buffer tv;
        struct ww_acquire_ctx ticket;
        struct list_head head;
        struct amdgpu_job *job;
        struct amdgpu_ib *ib;
-       struct fence *f = NULL;
+       struct dma_fence *f = NULL;
        struct amdgpu_device *adev = ring->adev;
        uint64_t addr;
        int i, r;
@@ -960,7 +960,7 @@ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo,
 
        if (direct) {
                r = amdgpu_ib_schedule(ring, 1, ib, NULL, NULL, &f);
-               job->fence = fence_get(f);
+               job->fence = dma_fence_get(f);
                if (r)
                        goto err_free;
 
@@ -975,9 +975,9 @@ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo,
        ttm_eu_fence_buffer_objects(&ticket, &head, f);
 
        if (fence)
-               *fence = fence_get(f);
+               *fence = dma_fence_get(f);
        amdgpu_bo_unref(&bo);
-       fence_put(f);
+       dma_fence_put(f);
 
        return 0;
 
@@ -993,7 +993,7 @@ err:
    crash the vcpu so just try to emmit a dummy create/destroy msg to
    avoid this */
 int amdgpu_uvd_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,
-                             struct fence **fence)
+                             struct dma_fence **fence)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_bo *bo;
@@ -1042,7 +1042,7 @@ int amdgpu_uvd_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,
 }
 
 int amdgpu_uvd_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
-                              bool direct, struct fence **fence)
+                              bool direct, struct dma_fence **fence)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_bo *bo;
@@ -1128,7 +1128,7 @@ void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring)
  */
 int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
-       struct fence *fence;
+       struct dma_fence *fence;
        long r;
 
        r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
@@ -1143,7 +1143,7 @@ int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout)
                goto error;
        }
 
-       r = fence_wait_timeout(fence, false, timeout);
+       r = dma_fence_wait_timeout(fence, false, timeout);
        if (r == 0) {
                DRM_ERROR("amdgpu: IB test timed out.\n");
                r = -ETIMEDOUT;
@@ -1154,7 +1154,7 @@ int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout)
                r = 0;
        }
 
-       fence_put(fence);
+       dma_fence_put(fence);
 
 error:
        return r;
index c850009602d176215b14dc2b173a0f6536a2860c..6249ba1bde2a86550003909c632c1144ab06aa37 100644 (file)
@@ -29,9 +29,9 @@ int amdgpu_uvd_sw_fini(struct amdgpu_device *adev);
 int amdgpu_uvd_suspend(struct amdgpu_device *adev);
 int amdgpu_uvd_resume(struct amdgpu_device *adev);
 int amdgpu_uvd_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,
-                             struct fence **fence);
+                             struct dma_fence **fence);
 int amdgpu_uvd_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
-                              bool direct, struct fence **fence);
+                              bool direct, struct dma_fence **fence);
 void amdgpu_uvd_free_handles(struct amdgpu_device *adev,
                             struct drm_file *filp);
 int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx);
index 7fe8fd884f0600a83d98c6230f8a7292395b1f1e..f0f8afb855857d59c1a0323647c1d5f30b0640dc 100644 (file)
@@ -395,12 +395,12 @@ void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp)
  * Open up a stream for HW test
  */
 int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,
-                             struct fence **fence)
+                             struct dma_fence **fence)
 {
        const unsigned ib_size_dw = 1024;
        struct amdgpu_job *job;
        struct amdgpu_ib *ib;
-       struct fence *f = NULL;
+       struct dma_fence *f = NULL;
        uint64_t dummy;
        int i, r;
 
@@ -450,14 +450,14 @@ int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,
                ib->ptr[i] = 0x0;
 
        r = amdgpu_ib_schedule(ring, 1, ib, NULL, NULL, &f);
-       job->fence = fence_get(f);
+       job->fence = dma_fence_get(f);
        if (r)
                goto err;
 
        amdgpu_job_free(job);
        if (fence)
-               *fence = fence_get(f);
-       fence_put(f);
+               *fence = dma_fence_get(f);
+       dma_fence_put(f);
        return 0;
 
 err:
@@ -476,12 +476,12 @@ err:
  * Close up a stream for HW test or if userspace failed to do so
  */
 int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
-                              bool direct, struct fence **fence)
+                              bool direct, struct dma_fence **fence)
 {
        const unsigned ib_size_dw = 1024;
        struct amdgpu_job *job;
        struct amdgpu_ib *ib;
-       struct fence *f = NULL;
+       struct dma_fence *f = NULL;
        int i, r;
 
        r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job);
@@ -513,7 +513,7 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
 
        if (direct) {
                r = amdgpu_ib_schedule(ring, 1, ib, NULL, NULL, &f);
-               job->fence = fence_get(f);
+               job->fence = dma_fence_get(f);
                if (r)
                        goto err;
 
@@ -526,8 +526,8 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
        }
 
        if (fence)
-               *fence = fence_get(f);
-       fence_put(f);
+               *fence = dma_fence_get(f);
+       dma_fence_put(f);
        return 0;
 
 err:
@@ -883,7 +883,7 @@ int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring)
  */
 int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
-       struct fence *fence = NULL;
+       struct dma_fence *fence = NULL;
        long r;
 
        /* skip vce ring1/2 ib test for now, since it's not reliable */
@@ -902,7 +902,7 @@ int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout)
                goto error;
        }
 
-       r = fence_wait_timeout(fence, false, timeout);
+       r = dma_fence_wait_timeout(fence, false, timeout);
        if (r == 0) {
                DRM_ERROR("amdgpu: IB test timed out.\n");
                r = -ETIMEDOUT;
@@ -913,6 +913,6 @@ int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout)
                r = 0;
        }
 error:
-       fence_put(fence);
+       dma_fence_put(fence);
        return r;
 }
index 12729d2852df42e3c4706bb9b5246085b13549c8..566c29ddeeb65a337706d8ddcd64575c505903df 100644 (file)
@@ -29,9 +29,9 @@ int amdgpu_vce_sw_fini(struct amdgpu_device *adev);
 int amdgpu_vce_suspend(struct amdgpu_device *adev);
 int amdgpu_vce_resume(struct amdgpu_device *adev);
 int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,
-                             struct fence **fence);
+                             struct dma_fence **fence);
 int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
-                              bool direct, struct fence **fence);
+                              bool direct, struct dma_fence **fence);
 void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp);
 int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx);
 void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib,
index 06f24322e7c31bcfbb9dc867909ebe234968accb..22cabb5456e047bf2277f0204cb41d9b7962377a 100644 (file)
@@ -25,7 +25,7 @@
  *          Alex Deucher
  *          Jerome Glisse
  */
-#include <linux/fence-array.h>
+#include <linux/dma-fence-array.h>
 #include <drm/drmP.h>
 #include <drm/amdgpu_drm.h>
 #include "amdgpu.h"
@@ -194,14 +194,14 @@ static bool amdgpu_vm_is_gpu_reset(struct amdgpu_device *adev,
  * Allocate an id for the vm, adding fences to the sync obj as necessary.
  */
 int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
-                     struct amdgpu_sync *sync, struct fence *fence,
+                     struct amdgpu_sync *sync, struct dma_fence *fence,
                      struct amdgpu_job *job)
 {
        struct amdgpu_device *adev = ring->adev;
        uint64_t fence_context = adev->fence_context + ring->idx;
-       struct fence *updates = sync->last_vm_update;
+       struct dma_fence *updates = sync->last_vm_update;
        struct amdgpu_vm_id *id, *idle;
-       struct fence **fences;
+       struct dma_fence **fences;
        unsigned i;
        int r = 0;
 
@@ -225,17 +225,17 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
        if (&idle->list == &adev->vm_manager.ids_lru) {
                u64 fence_context = adev->vm_manager.fence_context + ring->idx;
                unsigned seqno = ++adev->vm_manager.seqno[ring->idx];
-               struct fence_array *array;
+               struct dma_fence_array *array;
                unsigned j;
 
                for (j = 0; j < i; ++j)
-                       fence_get(fences[j]);
+                       dma_fence_get(fences[j]);
 
-               array = fence_array_create(i, fences, fence_context,
+               array = dma_fence_array_create(i, fences, fence_context,
                                           seqno, true);
                if (!array) {
                        for (j = 0; j < i; ++j)
-                               fence_put(fences[j]);
+                               dma_fence_put(fences[j]);
                        kfree(fences);
                        r = -ENOMEM;
                        goto error;
@@ -243,7 +243,7 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
 
 
                r = amdgpu_sync_fence(ring->adev, sync, &array->base);
-               fence_put(&array->base);
+               dma_fence_put(&array->base);
                if (r)
                        goto error;
 
@@ -257,7 +257,7 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
        /* Check if we can use a VMID already assigned to this VM */
        i = ring->idx;
        do {
-               struct fence *flushed;
+               struct dma_fence *flushed;
 
                id = vm->ids[i++];
                if (i == AMDGPU_MAX_RINGS)
@@ -279,12 +279,12 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
                        continue;
 
                if (id->last_flush->context != fence_context &&
-                   !fence_is_signaled(id->last_flush))
+                   !dma_fence_is_signaled(id->last_flush))
                        continue;
 
                flushed  = id->flushed_updates;
                if (updates &&
-                   (!flushed || fence_is_later(updates, flushed)))
+                   (!flushed || dma_fence_is_later(updates, flushed)))
                        continue;
 
                /* Good we can use this VMID. Remember this submission as
@@ -315,14 +315,14 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
        if (r)
                goto error;
 
-       fence_put(id->first);
-       id->first = fence_get(fence);
+       dma_fence_put(id->first);
+       id->first = dma_fence_get(fence);
 
-       fence_put(id->last_flush);
+       dma_fence_put(id->last_flush);
        id->last_flush = NULL;
 
-       fence_put(id->flushed_updates);
-       id->flushed_updates = fence_get(updates);
+       dma_fence_put(id->flushed_updates);
+       id->flushed_updates = dma_fence_get(updates);
 
        id->pd_gpu_addr = job->vm_pd_addr;
        id->current_gpu_reset_count = atomic_read(&adev->gpu_reset_counter);
@@ -393,7 +393,7 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job)
 
        if (ring->funcs->emit_vm_flush && (job->vm_needs_flush ||
            amdgpu_vm_is_gpu_reset(adev, id))) {
-               struct fence *fence;
+               struct dma_fence *fence;
 
                trace_amdgpu_vm_flush(job->vm_pd_addr, ring->idx, job->vm_id);
                amdgpu_ring_emit_vm_flush(ring, job->vm_id, job->vm_pd_addr);
@@ -403,7 +403,7 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job)
                        return r;
 
                mutex_lock(&adev->vm_manager.lock);
-               fence_put(id->last_flush);
+               dma_fence_put(id->last_flush);
                id->last_flush = fence;
                mutex_unlock(&adev->vm_manager.lock);
        }
@@ -537,7 +537,7 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,
                              struct amdgpu_bo *bo)
 {
        struct amdgpu_ring *ring;
-       struct fence *fence = NULL;
+       struct dma_fence *fence = NULL;
        struct amdgpu_job *job;
        struct amdgpu_pte_update_params params;
        unsigned entries;
@@ -578,7 +578,7 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,
                goto error_free;
 
        amdgpu_bo_fence(bo, fence, true);
-       fence_put(fence);
+       dma_fence_put(fence);
        return 0;
 
 error_free:
@@ -625,7 +625,7 @@ static int amdgpu_vm_update_pd_or_shadow(struct amdgpu_device *adev,
        unsigned count = 0, pt_idx, ndw;
        struct amdgpu_job *job;
        struct amdgpu_pte_update_params params;
-       struct fence *fence = NULL;
+       struct dma_fence *fence = NULL;
 
        int r;
 
@@ -714,9 +714,9 @@ static int amdgpu_vm_update_pd_or_shadow(struct amdgpu_device *adev,
                        goto error_free;
 
                amdgpu_bo_fence(pd, fence, true);
-               fence_put(vm->page_directory_fence);
-               vm->page_directory_fence = fence_get(fence);
-               fence_put(fence);
+               dma_fence_put(vm->page_directory_fence);
+               vm->page_directory_fence = dma_fence_get(fence);
+               dma_fence_put(fence);
 
        } else {
                amdgpu_job_free(job);
@@ -929,20 +929,20 @@ static void amdgpu_vm_frag_ptes(struct amdgpu_pte_update_params   *params,
  * Returns 0 for success, -EINVAL for failure.
  */
 static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
-                                      struct fence *exclusive,
+                                      struct dma_fence *exclusive,
                                       uint64_t src,
                                       dma_addr_t *pages_addr,
                                       struct amdgpu_vm *vm,
                                       uint64_t start, uint64_t last,
                                       uint32_t flags, uint64_t addr,
-                                      struct fence **fence)
+                                      struct dma_fence **fence)
 {
        struct amdgpu_ring *ring;
        void *owner = AMDGPU_FENCE_OWNER_VM;
        unsigned nptes, ncmds, ndw;
        struct amdgpu_job *job;
        struct amdgpu_pte_update_params params;
-       struct fence *f = NULL;
+       struct dma_fence *f = NULL;
        int r;
 
        memset(&params, 0, sizeof(params));
@@ -1045,10 +1045,10 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
 
        amdgpu_bo_fence(vm->page_directory, f, true);
        if (fence) {
-               fence_put(*fence);
-               *fence = fence_get(f);
+               dma_fence_put(*fence);
+               *fence = dma_fence_get(f);
        }
-       fence_put(f);
+       dma_fence_put(f);
        return 0;
 
 error_free:
@@ -1074,13 +1074,13 @@ error_free:
  * Returns 0 for success, -EINVAL for failure.
  */
 static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
-                                     struct fence *exclusive,
+                                     struct dma_fence *exclusive,
                                      uint32_t gtt_flags,
                                      dma_addr_t *pages_addr,
                                      struct amdgpu_vm *vm,
                                      struct amdgpu_bo_va_mapping *mapping,
                                      uint32_t flags, uint64_t addr,
-                                     struct fence **fence)
+                                     struct dma_fence **fence)
 {
        const uint64_t max_size = 64ULL * 1024ULL * 1024ULL / AMDGPU_GPU_PAGE_SIZE;
 
@@ -1147,7 +1147,7 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
        dma_addr_t *pages_addr = NULL;
        uint32_t gtt_flags, flags;
        struct ttm_mem_reg *mem;
-       struct fence *exclusive;
+       struct dma_fence *exclusive;
        uint64_t addr;
        int r;
 
@@ -1547,7 +1547,7 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
                kfree(mapping);
        }
 
-       fence_put(bo_va->last_pt_update);
+       dma_fence_put(bo_va->last_pt_update);
        kfree(bo_va);
 }
 
@@ -1709,7 +1709,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
 
        amdgpu_bo_unref(&vm->page_directory->shadow);
        amdgpu_bo_unref(&vm->page_directory);
-       fence_put(vm->page_directory_fence);
+       dma_fence_put(vm->page_directory_fence);
 }
 
 /**
@@ -1733,7 +1733,8 @@ void amdgpu_vm_manager_init(struct amdgpu_device *adev)
                              &adev->vm_manager.ids_lru);
        }
 
-       adev->vm_manager.fence_context = fence_context_alloc(AMDGPU_MAX_RINGS);
+       adev->vm_manager.fence_context =
+               dma_fence_context_alloc(AMDGPU_MAX_RINGS);
        for (i = 0; i < AMDGPU_MAX_RINGS; ++i)
                adev->vm_manager.seqno[i] = 0;
 
@@ -1755,8 +1756,8 @@ void amdgpu_vm_manager_fini(struct amdgpu_device *adev)
        for (i = 0; i < AMDGPU_NUM_VM; ++i) {
                struct amdgpu_vm_id *id = &adev->vm_manager.ids[i];
 
-               fence_put(adev->vm_manager.ids[i].first);
+               dma_fence_put(adev->vm_manager.ids[i].first);
                amdgpu_sync_free(&adev->vm_manager.ids[i].active);
-               fence_put(id->flushed_updates);
+               dma_fence_put(id->flushed_updates);
        }
 }
index cb952acc71339e31ac613a896fd1c268b0f327dc..321b9d5a4e6e46751b62afdb8fea3ccd6452f86b 100644 (file)
@@ -622,7 +622,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_ib ib;
-       struct fence *f = NULL;
+       struct dma_fence *f = NULL;
        unsigned index;
        u32 tmp = 0;
        u64 gpu_addr;
@@ -655,7 +655,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
        if (r)
                goto err1;
 
-       r = fence_wait_timeout(f, false, timeout);
+       r = dma_fence_wait_timeout(f, false, timeout);
        if (r == 0) {
                DRM_ERROR("amdgpu: IB test timed out\n");
                r = -ETIMEDOUT;
@@ -675,7 +675,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 
 err1:
        amdgpu_ib_free(adev, &ib, NULL);
-       fence_put(f);
+       dma_fence_put(f);
 err0:
        amdgpu_wb_free(adev, index);
        return r;
index 40abb6b81c095a677dd6f6992369d5db8f2ec4aa..7dc11a19e49d32a9bfa5868167709ac02e352464 100644 (file)
@@ -1522,7 +1522,7 @@ static int gfx_v6_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_ib ib;
-       struct fence *f = NULL;
+       struct dma_fence *f = NULL;
        uint32_t scratch;
        uint32_t tmp = 0;
        long r;
@@ -1548,7 +1548,7 @@ static int gfx_v6_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
        if (r)
                goto err2;
 
-       r = fence_wait_timeout(f, false, timeout);
+       r = dma_fence_wait_timeout(f, false, timeout);
        if (r == 0) {
                DRM_ERROR("amdgpu: IB test timed out\n");
                r = -ETIMEDOUT;
@@ -1569,7 +1569,7 @@ static int gfx_v6_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 
 err2:
        amdgpu_ib_free(adev, &ib, NULL);
-       fence_put(f);
+       dma_fence_put(f);
 err1:
        amdgpu_gfx_scratch_free(adev, scratch);
        return r;
index 71116da9e782d52597837b2dfa95a17b2007998d..3865ffe7de55c645df8d41c0fa76b11e894d1ecb 100644 (file)
@@ -2286,7 +2286,7 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_ib ib;
-       struct fence *f = NULL;
+       struct dma_fence *f = NULL;
        uint32_t scratch;
        uint32_t tmp = 0;
        long r;
@@ -2312,7 +2312,7 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
        if (r)
                goto err2;
 
-       r = fence_wait_timeout(f, false, timeout);
+       r = dma_fence_wait_timeout(f, false, timeout);
        if (r == 0) {
                DRM_ERROR("amdgpu: IB test timed out\n");
                r = -ETIMEDOUT;
@@ -2333,7 +2333,7 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 
 err2:
        amdgpu_ib_free(adev, &ib, NULL);
-       fence_put(f);
+       dma_fence_put(f);
 err1:
        amdgpu_gfx_scratch_free(adev, scratch);
        return r;
index ee6a48a092143ae6952bbcce9af1f04dc5712614..a9dd18847c408a6a699fba8b1c392abff384b590 100644 (file)
@@ -798,7 +798,7 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_ib ib;
-       struct fence *f = NULL;
+       struct dma_fence *f = NULL;
        uint32_t scratch;
        uint32_t tmp = 0;
        long r;
@@ -824,7 +824,7 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
        if (r)
                goto err2;
 
-       r = fence_wait_timeout(f, false, timeout);
+       r = dma_fence_wait_timeout(f, false, timeout);
        if (r == 0) {
                DRM_ERROR("amdgpu: IB test timed out.\n");
                r = -ETIMEDOUT;
@@ -844,7 +844,7 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
        }
 err2:
        amdgpu_ib_free(adev, &ib, NULL);
-       fence_put(f);
+       dma_fence_put(f);
 err1:
        amdgpu_gfx_scratch_free(adev, scratch);
        return r;
@@ -1575,7 +1575,7 @@ static int gfx_v8_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)
 {
        struct amdgpu_ring *ring = &adev->gfx.compute_ring[0];
        struct amdgpu_ib ib;
-       struct fence *f = NULL;
+       struct dma_fence *f = NULL;
        int r, i;
        u32 tmp;
        unsigned total_size, vgpr_offset, sgpr_offset;
@@ -1708,7 +1708,7 @@ static int gfx_v8_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)
        }
 
        /* wait for the GPU to finish processing the IB */
-       r = fence_wait(f, false);
+       r = dma_fence_wait(f, false);
        if (r) {
                DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
                goto fail;
@@ -1729,7 +1729,7 @@ static int gfx_v8_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)
 
 fail:
        amdgpu_ib_free(adev, &ib, NULL);
-       fence_put(f);
+       dma_fence_put(f);
 
        return r;
 }
index 565dab3c72186704542b3763fbcdcecb9a6e9cf9..7edf6e8c63dc504d603c0aeef010a27444a02851 100644 (file)
@@ -668,7 +668,7 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_ib ib;
-       struct fence *f = NULL;
+       struct dma_fence *f = NULL;
        unsigned index;
        u32 tmp = 0;
        u64 gpu_addr;
@@ -705,7 +705,7 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring, long timeout)
        if (r)
                goto err1;
 
-       r = fence_wait_timeout(f, false, timeout);
+       r = dma_fence_wait_timeout(f, false, timeout);
        if (r == 0) {
                DRM_ERROR("amdgpu: IB test timed out\n");
                r = -ETIMEDOUT;
@@ -725,7 +725,7 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 
 err1:
        amdgpu_ib_free(adev, &ib, NULL);
-       fence_put(f);
+       dma_fence_put(f);
 err0:
        amdgpu_wb_free(adev, index);
        return r;
index a9d10941fb53d9ab2290fd6bdbe3351d91b0acaa..1932a67c62ef136c04a223979b123beac6c99eee 100644 (file)
@@ -871,7 +871,7 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_ib ib;
-       struct fence *f = NULL;
+       struct dma_fence *f = NULL;
        unsigned index;
        u32 tmp = 0;
        u64 gpu_addr;
@@ -908,7 +908,7 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
        if (r)
                goto err1;
 
-       r = fence_wait_timeout(f, false, timeout);
+       r = dma_fence_wait_timeout(f, false, timeout);
        if (r == 0) {
                DRM_ERROR("amdgpu: IB test timed out\n");
                r = -ETIMEDOUT;
@@ -927,7 +927,7 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
        }
 err1:
        amdgpu_ib_free(adev, &ib, NULL);
-       fence_put(f);
+       dma_fence_put(f);
 err0:
        amdgpu_wb_free(adev, index);
        return r;
index de358193a8f9d07927cb70f45901fd182f0f94e3..b4cf4e25bf9158d1df4d7daa842c6c4bd12a6343 100644 (file)
@@ -274,7 +274,7 @@ static int si_dma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_ib ib;
-       struct fence *f = NULL;
+       struct dma_fence *f = NULL;
        unsigned index;
        u32 tmp = 0;
        u64 gpu_addr;
@@ -305,7 +305,7 @@ static int si_dma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
        if (r)
                goto err1;
 
-       r = fence_wait_timeout(f, false, timeout);
+       r = dma_fence_wait_timeout(f, false, timeout);
        if (r == 0) {
                DRM_ERROR("amdgpu: IB test timed out\n");
                r = -ETIMEDOUT;
@@ -325,7 +325,7 @@ static int si_dma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 
 err1:
        amdgpu_ib_free(adev, &ib, NULL);
-       fence_put(f);
+       dma_fence_put(f);
 err0:
        amdgpu_wb_free(adev, index);
        return r;
index b961a1c6caf30ea09e8eea2dae6f320cafb81d09..dbd4fd3a810b71223f1c485dc051515d5da59654 100644 (file)
@@ -17,7 +17,7 @@ TRACE_EVENT(amd_sched_job,
            TP_STRUCT__entry(
                             __field(struct amd_sched_entity *, entity)
                             __field(struct amd_sched_job *, sched_job)
-                            __field(struct fence *, fence)
+                            __field(struct dma_fence *, fence)
                             __field(const char *, name)
                             __field(u32, job_count)
                             __field(int, hw_job_count)
@@ -42,7 +42,7 @@ TRACE_EVENT(amd_sched_process_job,
            TP_PROTO(struct amd_sched_fence *fence),
            TP_ARGS(fence),
            TP_STRUCT__entry(
-                   __field(struct fence *, fence)
+                   __field(struct dma_fence *, fence)
                    ),
 
            TP_fast_assign(
index 963a24d46a93d336e2d52bf1f4c7d045c6c2f57e..5364e6a7ec8fc8c40dcf593d4d6fe7d2583a2085 100644 (file)
@@ -32,7 +32,7 @@
 
 static bool amd_sched_entity_is_ready(struct amd_sched_entity *entity);
 static void amd_sched_wakeup(struct amd_gpu_scheduler *sched);
-static void amd_sched_process_job(struct fence *f, struct fence_cb *cb);
+static void amd_sched_process_job(struct dma_fence *f, struct dma_fence_cb *cb);
 
 struct kmem_cache *sched_fence_slab;
 atomic_t sched_fence_slab_ref = ATOMIC_INIT(0);
@@ -141,7 +141,7 @@ int amd_sched_entity_init(struct amd_gpu_scheduler *sched,
                return r;
 
        atomic_set(&entity->fence_seq, 0);
-       entity->fence_context = fence_context_alloc(2);
+       entity->fence_context = dma_fence_context_alloc(2);
 
        return 0;
 }
@@ -221,32 +221,32 @@ void amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
        kfifo_free(&entity->job_queue);
 }
 
-static void amd_sched_entity_wakeup(struct fence *f, struct fence_cb *cb)
+static void amd_sched_entity_wakeup(struct dma_fence *f, struct dma_fence_cb *cb)
 {
        struct amd_sched_entity *entity =
                container_of(cb, struct amd_sched_entity, cb);
        entity->dependency = NULL;
-       fence_put(f);
+       dma_fence_put(f);
        amd_sched_wakeup(entity->sched);
 }
 
-static void amd_sched_entity_clear_dep(struct fence *f, struct fence_cb *cb)
+static void amd_sched_entity_clear_dep(struct dma_fence *f, struct dma_fence_cb *cb)
 {
        struct amd_sched_entity *entity =
                container_of(cb, struct amd_sched_entity, cb);
        entity->dependency = NULL;
-       fence_put(f);
+       dma_fence_put(f);
 }
 
 static bool amd_sched_entity_add_dependency_cb(struct amd_sched_entity *entity)
 {
        struct amd_gpu_scheduler *sched = entity->sched;
-       struct fence * fence = entity->dependency;
+       struct dma_fence * fence = entity->dependency;
        struct amd_sched_fence *s_fence;
 
        if (fence->context == entity->fence_context) {
                /* We can ignore fences from ourself */
-               fence_put(entity->dependency);
+               dma_fence_put(entity->dependency);
                return false;
        }
 
@@ -257,23 +257,23 @@ static bool amd_sched_entity_add_dependency_cb(struct amd_sched_entity *entity)
                 * Fence is from the same scheduler, only need to wait for
                 * it to be scheduled
                 */
-               fence = fence_get(&s_fence->scheduled);
-               fence_put(entity->dependency);
+               fence = dma_fence_get(&s_fence->scheduled);
+               dma_fence_put(entity->dependency);
                entity->dependency = fence;
-               if (!fence_add_callback(fence, &entity->cb,
-                                       amd_sched_entity_clear_dep))
+               if (!dma_fence_add_callback(fence, &entity->cb,
+                                           amd_sched_entity_clear_dep))
                        return true;
 
                /* Ignore it when it is already scheduled */
-               fence_put(fence);
+               dma_fence_put(fence);
                return false;
        }
 
-       if (!fence_add_callback(entity->dependency, &entity->cb,
-                               amd_sched_entity_wakeup))
+       if (!dma_fence_add_callback(entity->dependency, &entity->cb,
+                                   amd_sched_entity_wakeup))
                return true;
 
-       fence_put(entity->dependency);
+       dma_fence_put(entity->dependency);
        return false;
 }
 
@@ -354,7 +354,8 @@ static void amd_sched_job_finish(struct work_struct *work)
        sched->ops->free_job(s_job);
 }
 
-static void amd_sched_job_finish_cb(struct fence *f, struct fence_cb *cb)
+static void amd_sched_job_finish_cb(struct dma_fence *f,
+                                   struct dma_fence_cb *cb)
 {
        struct amd_sched_job *job = container_of(cb, struct amd_sched_job,
                                                 finish_cb);
@@ -388,8 +389,8 @@ void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched)
 
        spin_lock(&sched->job_list_lock);
        list_for_each_entry_reverse(s_job, &sched->ring_mirror_list, node) {
-               if (fence_remove_callback(s_job->s_fence->parent, &s_job->s_fence->cb)) {
-                       fence_put(s_job->s_fence->parent);
+               if (dma_fence_remove_callback(s_job->s_fence->parent, &s_job->s_fence->cb)) {
+                       dma_fence_put(s_job->s_fence->parent);
                        s_job->s_fence->parent = NULL;
                }
        }
@@ -410,21 +411,21 @@ void amd_sched_job_recovery(struct amd_gpu_scheduler *sched)
 
        list_for_each_entry_safe(s_job, tmp, &sched->ring_mirror_list, node) {
                struct amd_sched_fence *s_fence = s_job->s_fence;
-               struct fence *fence;
+               struct dma_fence *fence;
 
                spin_unlock(&sched->job_list_lock);
                fence = sched->ops->run_job(s_job);
                atomic_inc(&sched->hw_rq_count);
                if (fence) {
-                       s_fence->parent = fence_get(fence);
-                       r = fence_add_callback(fence, &s_fence->cb,
-                                              amd_sched_process_job);
+                       s_fence->parent = dma_fence_get(fence);
+                       r = dma_fence_add_callback(fence, &s_fence->cb,
+                                                  amd_sched_process_job);
                        if (r == -ENOENT)
                                amd_sched_process_job(fence, &s_fence->cb);
                        else if (r)
                                DRM_ERROR("fence add callback failed (%d)\n",
                                          r);
-                       fence_put(fence);
+                       dma_fence_put(fence);
                } else {
                        DRM_ERROR("Failed to run job!\n");
                        amd_sched_process_job(NULL, &s_fence->cb);
@@ -446,8 +447,8 @@ void amd_sched_entity_push_job(struct amd_sched_job *sched_job)
        struct amd_sched_entity *entity = sched_job->s_entity;
 
        trace_amd_sched_job(sched_job);
-       fence_add_callback(&sched_job->s_fence->finished, &sched_job->finish_cb,
-                          amd_sched_job_finish_cb);
+       dma_fence_add_callback(&sched_job->s_fence->finished, &sched_job->finish_cb,
+                              amd_sched_job_finish_cb);
        wait_event(entity->sched->job_scheduled,
                   amd_sched_entity_in(sched_job));
 }
@@ -511,7 +512,7 @@ amd_sched_select_entity(struct amd_gpu_scheduler *sched)
        return entity;
 }
 
-static void amd_sched_process_job(struct fence *f, struct fence_cb *cb)
+static void amd_sched_process_job(struct dma_fence *f, struct dma_fence_cb *cb)
 {
        struct amd_sched_fence *s_fence =
                container_of(cb, struct amd_sched_fence, cb);
@@ -521,7 +522,7 @@ static void amd_sched_process_job(struct fence *f, struct fence_cb *cb)
        amd_sched_fence_finished(s_fence);
 
        trace_amd_sched_process_job(s_fence);
-       fence_put(&s_fence->finished);
+       dma_fence_put(&s_fence->finished);
        wake_up_interruptible(&sched->wake_up_worker);
 }
 
@@ -547,7 +548,7 @@ static int amd_sched_main(void *param)
                struct amd_sched_entity *entity = NULL;
                struct amd_sched_fence *s_fence;
                struct amd_sched_job *sched_job;
-               struct fence *fence;
+               struct dma_fence *fence;
 
                wait_event_interruptible(sched->wake_up_worker,
                                         (!amd_sched_blocked(sched) &&
@@ -569,15 +570,15 @@ static int amd_sched_main(void *param)
                fence = sched->ops->run_job(sched_job);
                amd_sched_fence_scheduled(s_fence);
                if (fence) {
-                       s_fence->parent = fence_get(fence);
-                       r = fence_add_callback(fence, &s_fence->cb,
-                                              amd_sched_process_job);
+                       s_fence->parent = dma_fence_get(fence);
+                       r = dma_fence_add_callback(fence, &s_fence->cb,
+                                                  amd_sched_process_job);
                        if (r == -ENOENT)
                                amd_sched_process_job(fence, &s_fence->cb);
                        else if (r)
                                DRM_ERROR("fence add callback failed (%d)\n",
                                          r);
-                       fence_put(fence);
+                       dma_fence_put(fence);
                } else {
                        DRM_ERROR("Failed to run job!\n");
                        amd_sched_process_job(NULL, &s_fence->cb);
index 7cbbbfb502ef1342caa2a5b36aa970368fed5055..876aa43b57df3b8d4cf2f48c3115cee8d2fb138b 100644 (file)
@@ -25,7 +25,7 @@
 #define _GPU_SCHEDULER_H_
 
 #include <linux/kfifo.h>
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 
 struct amd_gpu_scheduler;
 struct amd_sched_rq;
@@ -50,8 +50,8 @@ struct amd_sched_entity {
        atomic_t                        fence_seq;
        uint64_t                        fence_context;
 
-       struct fence                    *dependency;
-       struct fence_cb                 cb;
+       struct dma_fence                *dependency;
+       struct dma_fence_cb             cb;
 };
 
 /**
@@ -66,10 +66,10 @@ struct amd_sched_rq {
 };
 
 struct amd_sched_fence {
-       struct fence                    scheduled;
-       struct fence                    finished;
-       struct fence_cb                 cb;
-       struct fence                    *parent;
+       struct dma_fence                scheduled;
+       struct dma_fence                finished;
+       struct dma_fence_cb             cb;
+       struct dma_fence                *parent;
        struct amd_gpu_scheduler        *sched;
        spinlock_t                      lock;
        void                            *owner;
@@ -79,15 +79,15 @@ struct amd_sched_job {
        struct amd_gpu_scheduler        *sched;
        struct amd_sched_entity         *s_entity;
        struct amd_sched_fence          *s_fence;
-       struct fence_cb                 finish_cb;
+       struct dma_fence_cb             finish_cb;
        struct work_struct              finish_work;
        struct list_head                node;
        struct delayed_work             work_tdr;
 };
 
-extern const struct fence_ops amd_sched_fence_ops_scheduled;
-extern const struct fence_ops amd_sched_fence_ops_finished;
-static inline struct amd_sched_fence *to_amd_sched_fence(struct fence *f)
+extern const struct dma_fence_ops amd_sched_fence_ops_scheduled;
+extern const struct dma_fence_ops amd_sched_fence_ops_finished;
+static inline struct amd_sched_fence *to_amd_sched_fence(struct dma_fence *f)
 {
        if (f->ops == &amd_sched_fence_ops_scheduled)
                return container_of(f, struct amd_sched_fence, scheduled);
@@ -103,8 +103,8 @@ static inline struct amd_sched_fence *to_amd_sched_fence(struct fence *f)
  * these functions should be implemented in driver side
 */
 struct amd_sched_backend_ops {
-       struct fence *(*dependency)(struct amd_sched_job *sched_job);
-       struct fence *(*run_job)(struct amd_sched_job *sched_job);
+       struct dma_fence *(*dependency)(struct amd_sched_job *sched_job);
+       struct dma_fence *(*run_job)(struct amd_sched_job *sched_job);
        void (*timedout_job)(struct amd_sched_job *sched_job);
        void (*free_job)(struct amd_sched_job *sched_job);
 };
index 6b63beaf75746848720f98d4eb2b5329c299267b..c26fa298fe9ed87f8b368801b9a24851300725c3 100644 (file)
@@ -42,46 +42,50 @@ struct amd_sched_fence *amd_sched_fence_create(struct amd_sched_entity *entity,
        spin_lock_init(&fence->lock);
 
        seq = atomic_inc_return(&entity->fence_seq);
-       fence_init(&fence->scheduled, &amd_sched_fence_ops_scheduled,
-                  &fence->lock, entity->fence_context, seq);
-       fence_init(&fence->finished, &amd_sched_fence_ops_finished,
-                  &fence->lock, entity->fence_context + 1, seq);
+       dma_fence_init(&fence->scheduled, &amd_sched_fence_ops_scheduled,
+                      &fence->lock, entity->fence_context, seq);
+       dma_fence_init(&fence->finished, &amd_sched_fence_ops_finished,
+                      &fence->lock, entity->fence_context + 1, seq);
 
        return fence;
 }
 
 void amd_sched_fence_scheduled(struct amd_sched_fence *fence)
 {
-       int ret = fence_signal(&fence->scheduled);
+       int ret = dma_fence_signal(&fence->scheduled);
 
        if (!ret)
-               FENCE_TRACE(&fence->scheduled, "signaled from irq context\n");
+               DMA_FENCE_TRACE(&fence->scheduled,
+                               "signaled from irq context\n");
        else
-               FENCE_TRACE(&fence->scheduled, "was already signaled\n");
+               DMA_FENCE_TRACE(&fence->scheduled,
+                               "was already signaled\n");
 }
 
 void amd_sched_fence_finished(struct amd_sched_fence *fence)
 {
-       int ret = fence_signal(&fence->finished);
+       int ret = dma_fence_signal(&fence->finished);
 
        if (!ret)
-               FENCE_TRACE(&fence->finished, "signaled from irq context\n");
+               DMA_FENCE_TRACE(&fence->finished,
+                               "signaled from irq context\n");
        else
-               FENCE_TRACE(&fence->finished, "was already signaled\n");
+               DMA_FENCE_TRACE(&fence->finished,
+                               "was already signaled\n");
 }
 
-static const char *amd_sched_fence_get_driver_name(struct fence *fence)
+static const char *amd_sched_fence_get_driver_name(struct dma_fence *fence)
 {
        return "amd_sched";
 }
 
-static const char *amd_sched_fence_get_timeline_name(struct fence *f)
+static const char *amd_sched_fence_get_timeline_name(struct dma_fence *f)
 {
        struct amd_sched_fence *fence = to_amd_sched_fence(f);
        return (const char *)fence->sched->name;
 }
 
-static bool amd_sched_fence_enable_signaling(struct fence *f)
+static bool amd_sched_fence_enable_signaling(struct dma_fence *f)
 {
        return true;
 }
@@ -95,10 +99,10 @@ static bool amd_sched_fence_enable_signaling(struct fence *f)
  */
 static void amd_sched_fence_free(struct rcu_head *rcu)
 {
-       struct fence *f = container_of(rcu, struct fence, rcu);
+       struct dma_fence *f = container_of(rcu, struct dma_fence, rcu);
        struct amd_sched_fence *fence = to_amd_sched_fence(f);
 
-       fence_put(fence->parent);
+       dma_fence_put(fence->parent);
        kmem_cache_free(sched_fence_slab, fence);
 }
 
@@ -110,7 +114,7 @@ static void amd_sched_fence_free(struct rcu_head *rcu)
  * This function is called when the reference count becomes zero.
  * It just RCU schedules freeing up the fence.
  */
-static void amd_sched_fence_release_scheduled(struct fence *f)
+static void amd_sched_fence_release_scheduled(struct dma_fence *f)
 {
        struct amd_sched_fence *fence = to_amd_sched_fence(f);
 
@@ -124,27 +128,27 @@ static void amd_sched_fence_release_scheduled(struct fence *f)
  *
  * Drop the extra reference from the scheduled fence to the base fence.
  */
-static void amd_sched_fence_release_finished(struct fence *f)
+static void amd_sched_fence_release_finished(struct dma_fence *f)
 {
        struct amd_sched_fence *fence = to_amd_sched_fence(f);
 
-       fence_put(&fence->scheduled);
+       dma_fence_put(&fence->scheduled);
 }
 
-const struct fence_ops amd_sched_fence_ops_scheduled = {
+const struct dma_fence_ops amd_sched_fence_ops_scheduled = {
        .get_driver_name = amd_sched_fence_get_driver_name,
        .get_timeline_name = amd_sched_fence_get_timeline_name,
        .enable_signaling = amd_sched_fence_enable_signaling,
        .signaled = NULL,
-       .wait = fence_default_wait,
+       .wait = dma_fence_default_wait,
        .release = amd_sched_fence_release_scheduled,
 };
 
-const struct fence_ops amd_sched_fence_ops_finished = {
+const struct dma_fence_ops amd_sched_fence_ops_finished = {
        .get_driver_name = amd_sched_fence_get_driver_name,
        .get_timeline_name = amd_sched_fence_get_timeline_name,
        .enable_signaling = amd_sched_fence_enable_signaling,
        .signaled = NULL,
-       .wait = fence_default_wait,
+       .wait = dma_fence_default_wait,
        .release = amd_sched_fence_release_finished,
 };
index 1b5a32df9a9a793f3dfbf527f5980a9eb1ccd0d4..c32fb3c1d6f048e5f39876e7875336ea221dcbc3 100644 (file)
@@ -1463,7 +1463,7 @@ EXPORT_SYMBOL(drm_atomic_nonblocking_commit);
 
 static struct drm_pending_vblank_event *create_vblank_event(
                struct drm_device *dev, struct drm_file *file_priv,
-               struct fence *fence, uint64_t user_data)
+               struct dma_fence *fence, uint64_t user_data)
 {
        struct drm_pending_vblank_event *e = NULL;
        int ret;
index f9362760bfb2df74a42f46fe2e538f0841513404..75ad01d595fd3d883cb955cdabf1de1627c32ced 100644 (file)
@@ -30,7 +30,7 @@
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_atomic_helper.h>
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 
 #include "drm_crtc_internal.h"
 
@@ -1017,7 +1017,7 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
  * drm_atomic_helper_swap_state() so it uses the current plane state (and
  * just uses the atomic state to find the changed planes)
  *
- * Returns zero if success or < 0 if fence_wait() fails.
+ * Returns zero if success or < 0 if dma_fence_wait() fails.
  */
 int drm_atomic_helper_wait_for_fences(struct drm_device *dev,
                                      struct drm_atomic_state *state,
@@ -1041,11 +1041,11 @@ int drm_atomic_helper_wait_for_fences(struct drm_device *dev,
                 * still interrupt the operation. Instead of blocking until the
                 * timer expires, make the wait interruptible.
                 */
-               ret = fence_wait(plane_state->fence, pre_swap);
+               ret = dma_fence_wait(plane_state->fence, pre_swap);
                if (ret)
                        return ret;
 
-               fence_put(plane_state->fence);
+               dma_fence_put(plane_state->fence);
                plane_state->fence = NULL;
        }
 
index 8bed5f45918221962f4283922a25fe3778324a52..cf993dbf602ec22c0aefe8b36dc091837a07416c 100644 (file)
@@ -665,7 +665,7 @@ void drm_event_cancel_free(struct drm_device *dev,
        spin_unlock_irqrestore(&dev->event_lock, flags);
 
        if (p->fence)
-               fence_put(p->fence);
+               dma_fence_put(p->fence);
 
        kfree(p);
 }
@@ -696,8 +696,8 @@ void drm_send_event_locked(struct drm_device *dev, struct drm_pending_event *e)
        }
 
        if (e->fence) {
-               fence_signal(e->fence);
-               fence_put(e->fence);
+               dma_fence_signal(e->fence);
+               dma_fence_put(e->fence);
        }
 
        if (!e->file_priv) {
index 3755ef935af49df30cc573cee27868340cb8f312..7d066a91d7784f628590e829f306ea8dfe0699c8 100644 (file)
@@ -466,10 +466,10 @@ int etnaviv_gem_wait_bo(struct etnaviv_gpu *gpu, struct drm_gem_object *obj,
 }
 
 #ifdef CONFIG_DEBUG_FS
-static void etnaviv_gem_describe_fence(struct fence *fence,
+static void etnaviv_gem_describe_fence(struct dma_fence *fence,
        const char *type, struct seq_file *m)
 {
-       if (!test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags))
+       if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
                seq_printf(m, "\t%9s: %s %s seq %u\n",
                           type,
                           fence->ops->get_driver_name(fence),
@@ -482,7 +482,7 @@ static void etnaviv_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
        struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
        struct reservation_object *robj = etnaviv_obj->resv;
        struct reservation_object_list *fobj;
-       struct fence *fence;
+       struct dma_fence *fence;
        unsigned long off = drm_vma_node_start(&obj->vma_node);
 
        seq_printf(m, "%08x: %c %2d (%2d) %08lx %p %zd\n",
index b1254f885fed4b6a40c5b08f9352621259b05f4c..d2211825e5c8189b1282c6d0f98ea4c493325129 100644 (file)
@@ -15,7 +15,7 @@
  */
 
 #include <linux/component.h>
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 #include <linux/moduleparam.h>
 #include <linux/of_device.h>
 #include "etnaviv_dump.h"
@@ -882,7 +882,7 @@ static void recover_worker(struct work_struct *work)
        for (i = 0; i < ARRAY_SIZE(gpu->event); i++) {
                if (!gpu->event[i].used)
                        continue;
-               fence_signal(gpu->event[i].fence);
+               dma_fence_signal(gpu->event[i].fence);
                gpu->event[i].fence = NULL;
                gpu->event[i].used = false;
                complete(&gpu->event_free);
@@ -952,55 +952,55 @@ static void hangcheck_disable(struct etnaviv_gpu *gpu)
 /* fence object management */
 struct etnaviv_fence {
        struct etnaviv_gpu *gpu;
-       struct fence base;
+       struct dma_fence base;
 };
 
-static inline struct etnaviv_fence *to_etnaviv_fence(struct fence *fence)
+static inline struct etnaviv_fence *to_etnaviv_fence(struct dma_fence *fence)
 {
        return container_of(fence, struct etnaviv_fence, base);
 }
 
-static const char *etnaviv_fence_get_driver_name(struct fence *fence)
+static const char *etnaviv_fence_get_driver_name(struct dma_fence *fence)
 {
        return "etnaviv";
 }
 
-static const char *etnaviv_fence_get_timeline_name(struct fence *fence)
+static const char *etnaviv_fence_get_timeline_name(struct dma_fence *fence)
 {
        struct etnaviv_fence *f = to_etnaviv_fence(fence);
 
        return dev_name(f->gpu->dev);
 }
 
-static bool etnaviv_fence_enable_signaling(struct fence *fence)
+static bool etnaviv_fence_enable_signaling(struct dma_fence *fence)
 {
        return true;
 }
 
-static bool etnaviv_fence_signaled(struct fence *fence)
+static bool etnaviv_fence_signaled(struct dma_fence *fence)
 {
        struct etnaviv_fence *f = to_etnaviv_fence(fence);
 
        return fence_completed(f->gpu, f->base.seqno);
 }
 
-static void etnaviv_fence_release(struct fence *fence)
+static void etnaviv_fence_release(struct dma_fence *fence)
 {
        struct etnaviv_fence *f = to_etnaviv_fence(fence);
 
        kfree_rcu(f, base.rcu);
 }
 
-static const struct fence_ops etnaviv_fence_ops = {
+static const struct dma_fence_ops etnaviv_fence_ops = {
        .get_driver_name = etnaviv_fence_get_driver_name,
        .get_timeline_name = etnaviv_fence_get_timeline_name,
        .enable_signaling = etnaviv_fence_enable_signaling,
        .signaled = etnaviv_fence_signaled,
-       .wait = fence_default_wait,
+       .wait = dma_fence_default_wait,
        .release = etnaviv_fence_release,
 };
 
-static struct fence *etnaviv_gpu_fence_alloc(struct etnaviv_gpu *gpu)
+static struct dma_fence *etnaviv_gpu_fence_alloc(struct etnaviv_gpu *gpu)
 {
        struct etnaviv_fence *f;
 
@@ -1010,8 +1010,8 @@ static struct fence *etnaviv_gpu_fence_alloc(struct etnaviv_gpu *gpu)
 
        f->gpu = gpu;
 
-       fence_init(&f->base, &etnaviv_fence_ops, &gpu->fence_spinlock,
-                  gpu->fence_context, ++gpu->next_fence);
+       dma_fence_init(&f->base, &etnaviv_fence_ops, &gpu->fence_spinlock,
+                      gpu->fence_context, ++gpu->next_fence);
 
        return &f->base;
 }
@@ -1021,7 +1021,7 @@ int etnaviv_gpu_fence_sync_obj(struct etnaviv_gem_object *etnaviv_obj,
 {
        struct reservation_object *robj = etnaviv_obj->resv;
        struct reservation_object_list *fobj;
-       struct fence *fence;
+       struct dma_fence *fence;
        int i, ret;
 
        if (!exclusive) {
@@ -1039,7 +1039,7 @@ int etnaviv_gpu_fence_sync_obj(struct etnaviv_gem_object *etnaviv_obj,
                /* Wait on any existing exclusive fence which isn't our own */
                fence = reservation_object_get_excl(robj);
                if (fence && fence->context != context) {
-                       ret = fence_wait(fence, true);
+                       ret = dma_fence_wait(fence, true);
                        if (ret)
                                return ret;
                }
@@ -1052,7 +1052,7 @@ int etnaviv_gpu_fence_sync_obj(struct etnaviv_gem_object *etnaviv_obj,
                fence = rcu_dereference_protected(fobj->shared[i],
                                                reservation_object_held(robj));
                if (fence->context != context) {
-                       ret = fence_wait(fence, true);
+                       ret = dma_fence_wait(fence, true);
                        if (ret)
                                return ret;
                }
@@ -1158,11 +1158,11 @@ static void retire_worker(struct work_struct *work)
 
        mutex_lock(&gpu->lock);
        list_for_each_entry_safe(cmdbuf, tmp, &gpu->active_cmd_list, node) {
-               if (!fence_is_signaled(cmdbuf->fence))
+               if (!dma_fence_is_signaled(cmdbuf->fence))
                        break;
 
                list_del(&cmdbuf->node);
-               fence_put(cmdbuf->fence);
+               dma_fence_put(cmdbuf->fence);
 
                for (i = 0; i < cmdbuf->nr_bos; i++) {
                        struct etnaviv_vram_mapping *mapping = cmdbuf->bo_map[i];
@@ -1275,7 +1275,7 @@ void etnaviv_gpu_pm_put(struct etnaviv_gpu *gpu)
 int etnaviv_gpu_submit(struct etnaviv_gpu *gpu,
        struct etnaviv_gem_submit *submit, struct etnaviv_cmdbuf *cmdbuf)
 {
-       struct fence *fence;
+       struct dma_fence *fence;
        unsigned int event, i;
        int ret;
 
@@ -1391,7 +1391,7 @@ static irqreturn_t irq_handler(int irq, void *data)
                }
 
                while ((event = ffs(intr)) != 0) {
-                       struct fence *fence;
+                       struct dma_fence *fence;
 
                        event -= 1;
 
@@ -1401,7 +1401,7 @@ static irqreturn_t irq_handler(int irq, void *data)
 
                        fence = gpu->event[event].fence;
                        gpu->event[event].fence = NULL;
-                       fence_signal(fence);
+                       dma_fence_signal(fence);
 
                        /*
                         * Events can be processed out of order.  Eg,
@@ -1553,7 +1553,7 @@ static int etnaviv_gpu_bind(struct device *dev, struct device *master,
                return ret;
 
        gpu->drm = drm;
-       gpu->fence_context = fence_context_alloc(1);
+       gpu->fence_context = dma_fence_context_alloc(1);
        spin_lock_init(&gpu->fence_spinlock);
 
        INIT_LIST_HEAD(&gpu->active_cmd_list);
index 73c278dc37061a54a5c23dc24559c85d5b1d8525..8c6b824e9d0a5c36633ca9ee5e0742d1dcf855e5 100644 (file)
@@ -89,7 +89,7 @@ struct etnaviv_chip_identity {
 
 struct etnaviv_event {
        bool used;
-       struct fence *fence;
+       struct dma_fence *fence;
 };
 
 struct etnaviv_cmdbuf;
@@ -163,7 +163,7 @@ struct etnaviv_cmdbuf {
        /* vram node used if the cmdbuf is mapped through the MMUv2 */
        struct drm_mm_node vram_node;
        /* fence after which this buffer is to be disposed */
-       struct fence *fence;
+       struct dma_fence *fence;
        /* target exec state */
        u32 exec_state;
        /* per GPU in-flight list */
index 74ede1f53372fe6b1ff165429878060925b76736..f9af2a00625e2979cbfc731e4cbb98ccf2d642ef 100644 (file)
 
 #include "i915_drv.h"
 
-static const char *i915_fence_get_driver_name(struct fence *fence)
+static const char *i915_fence_get_driver_name(struct dma_fence *fence)
 {
        return "i915";
 }
 
-static const char *i915_fence_get_timeline_name(struct fence *fence)
+static const char *i915_fence_get_timeline_name(struct dma_fence *fence)
 {
        /* Timelines are bound by eviction to a VM. However, since
         * we only have a global seqno at the moment, we only have
@@ -42,12 +42,12 @@ static const char *i915_fence_get_timeline_name(struct fence *fence)
        return "global";
 }
 
-static bool i915_fence_signaled(struct fence *fence)
+static bool i915_fence_signaled(struct dma_fence *fence)
 {
        return i915_gem_request_completed(to_request(fence));
 }
 
-static bool i915_fence_enable_signaling(struct fence *fence)
+static bool i915_fence_enable_signaling(struct dma_fence *fence)
 {
        if (i915_fence_signaled(fence))
                return false;
@@ -56,7 +56,7 @@ static bool i915_fence_enable_signaling(struct fence *fence)
        return true;
 }
 
-static signed long i915_fence_wait(struct fence *fence,
+static signed long i915_fence_wait(struct dma_fence *fence,
                                   bool interruptible,
                                   signed long timeout_jiffies)
 {
@@ -85,26 +85,26 @@ static signed long i915_fence_wait(struct fence *fence,
        return timeout_jiffies;
 }
 
-static void i915_fence_value_str(struct fence *fence, char *str, int size)
+static void i915_fence_value_str(struct dma_fence *fence, char *str, int size)
 {
        snprintf(str, size, "%u", fence->seqno);
 }
 
-static void i915_fence_timeline_value_str(struct fence *fence, char *str,
+static void i915_fence_timeline_value_str(struct dma_fence *fence, char *str,
                                          int size)
 {
        snprintf(str, size, "%u",
                 intel_engine_get_seqno(to_request(fence)->engine));
 }
 
-static void i915_fence_release(struct fence *fence)
+static void i915_fence_release(struct dma_fence *fence)
 {
        struct drm_i915_gem_request *req = to_request(fence);
 
        kmem_cache_free(req->i915->requests, req);
 }
 
-const struct fence_ops i915_fence_ops = {
+const struct dma_fence_ops i915_fence_ops = {
        .get_driver_name = i915_fence_get_driver_name,
        .get_timeline_name = i915_fence_get_timeline_name,
        .enable_signaling = i915_fence_enable_signaling,
@@ -388,8 +388,8 @@ i915_gem_request_alloc(struct intel_engine_cs *engine,
         * The reference count is incremented atomically. If it is zero,
         * the lookup knows the request is unallocated and complete. Otherwise,
         * it is either still in use, or has been reallocated and reset
-        * with fence_init(). This increment is safe for release as we check
-        * that the request we have a reference to and matches the active
+        * with dma_fence_init(). This increment is safe for release as we
+        * check that the request we have a reference to and matches the active
         * request.
         *
         * Before we increment the refcount, we chase the request->engine
@@ -412,11 +412,11 @@ i915_gem_request_alloc(struct intel_engine_cs *engine,
                goto err;
 
        spin_lock_init(&req->lock);
-       fence_init(&req->fence,
-                  &i915_fence_ops,
-                  &req->lock,
-                  engine->fence_context,
-                  seqno);
+       dma_fence_init(&req->fence,
+                      &i915_fence_ops,
+                      &req->lock,
+                      engine->fence_context,
+                      seqno);
 
        i915_sw_fence_init(&req->submit, submit_notify);
 
index 974bd7bcc801f9bc7a6eb32003886b2c9b4c39be..bceeaa3a5193dace9075f9e2d55a7d4fe16d35fd 100644 (file)
@@ -25,7 +25,7 @@
 #ifndef I915_GEM_REQUEST_H
 #define I915_GEM_REQUEST_H
 
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 
 #include "i915_gem.h"
 #include "i915_sw_fence.h"
@@ -62,7 +62,7 @@ struct intel_signal_node {
  * The requests are reference counted.
  */
 struct drm_i915_gem_request {
-       struct fence fence;
+       struct dma_fence fence;
        spinlock_t lock;
 
        /** On Which ring this request was generated */
@@ -145,9 +145,9 @@ struct drm_i915_gem_request {
        struct list_head execlist_link;
 };
 
-extern const struct fence_ops i915_fence_ops;
+extern const struct dma_fence_ops i915_fence_ops;
 
-static inline bool fence_is_i915(struct fence *fence)
+static inline bool fence_is_i915(struct dma_fence *fence)
 {
        return fence->ops == &i915_fence_ops;
 }
@@ -172,7 +172,7 @@ i915_gem_request_get_engine(struct drm_i915_gem_request *req)
 }
 
 static inline struct drm_i915_gem_request *
-to_request(struct fence *fence)
+to_request(struct dma_fence *fence)
 {
        /* We assume that NULL fence/request are interoperable */
        BUILD_BUG_ON(offsetof(struct drm_i915_gem_request, fence) != 0);
@@ -183,19 +183,19 @@ to_request(struct fence *fence)
 static inline struct drm_i915_gem_request *
 i915_gem_request_get(struct drm_i915_gem_request *req)
 {
-       return to_request(fence_get(&req->fence));
+       return to_request(dma_fence_get(&req->fence));
 }
 
 static inline struct drm_i915_gem_request *
 i915_gem_request_get_rcu(struct drm_i915_gem_request *req)
 {
-       return to_request(fence_get_rcu(&req->fence));
+       return to_request(dma_fence_get_rcu(&req->fence));
 }
 
 static inline void
 i915_gem_request_put(struct drm_i915_gem_request *req)
 {
-       fence_put(&req->fence);
+       dma_fence_put(&req->fence);
 }
 
 static inline void i915_gem_request_assign(struct drm_i915_gem_request **pdst,
@@ -497,7 +497,7 @@ __i915_gem_active_get_rcu(const struct i915_gem_active *active)
                 * compiler.
                 *
                 * The atomic operation at the heart of
-                * i915_gem_request_get_rcu(), see fence_get_rcu(), is
+                * i915_gem_request_get_rcu(), see dma_fence_get_rcu(), is
                 * atomic_inc_not_zero() which is only a full memory barrier
                 * when successful. That is, if i915_gem_request_get_rcu()
                 * returns the request (and so with the reference counted
index 1e5cbc585ca2ccbc6110551bfa140a94ba0ad2f1..8185002d7ec8142c14a946e1b3dea02ab8ed4403 100644 (file)
@@ -8,7 +8,7 @@
  */
 
 #include <linux/slab.h>
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 #include <linux/reservation.h>
 
 #include "i915_sw_fence.h"
@@ -226,49 +226,50 @@ int i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence,
        return pending;
 }
 
-struct dma_fence_cb {
-       struct fence_cb base;
+struct i915_sw_dma_fence_cb {
+       struct dma_fence_cb base;
        struct i915_sw_fence *fence;
-       struct fence *dma;
+       struct dma_fence *dma;
        struct timer_list timer;
 };
 
 static void timer_i915_sw_fence_wake(unsigned long data)
 {
-       struct dma_fence_cb *cb = (struct dma_fence_cb *)data;
+       struct i915_sw_dma_fence_cb *cb = (struct i915_sw_dma_fence_cb *)data;
 
        printk(KERN_WARNING "asynchronous wait on fence %s:%s:%x timed out\n",
               cb->dma->ops->get_driver_name(cb->dma),
               cb->dma->ops->get_timeline_name(cb->dma),
               cb->dma->seqno);
-       fence_put(cb->dma);
+       dma_fence_put(cb->dma);
        cb->dma = NULL;
 
        i915_sw_fence_commit(cb->fence);
        cb->timer.function = NULL;
 }
 
-static void dma_i915_sw_fence_wake(struct fence *dma, struct fence_cb *data)
+static void dma_i915_sw_fence_wake(struct dma_fence *dma,
+                                  struct dma_fence_cb *data)
 {
-       struct dma_fence_cb *cb = container_of(data, typeof(*cb), base);
+       struct i915_sw_dma_fence_cb *cb = container_of(data, typeof(*cb), base);
 
        del_timer_sync(&cb->timer);
        if (cb->timer.function)
                i915_sw_fence_commit(cb->fence);
-       fence_put(cb->dma);
+       dma_fence_put(cb->dma);
 
        kfree(cb);
 }
 
 int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence,
-                                 struct fence *dma,
+                                 struct dma_fence *dma,
                                  unsigned long timeout,
                                  gfp_t gfp)
 {
-       struct dma_fence_cb *cb;
+       struct i915_sw_dma_fence_cb *cb;
        int ret;
 
-       if (fence_is_signaled(dma))
+       if (dma_fence_is_signaled(dma))
                return 0;
 
        cb = kmalloc(sizeof(*cb), gfp);
@@ -276,7 +277,7 @@ int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence,
                if (!gfpflags_allow_blocking(gfp))
                        return -ENOMEM;
 
-               return fence_wait(dma, false);
+               return dma_fence_wait(dma, false);
        }
 
        cb->fence = i915_sw_fence_get(fence);
@@ -287,11 +288,11 @@ int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence,
                      timer_i915_sw_fence_wake, (unsigned long)cb,
                      TIMER_IRQSAFE);
        if (timeout) {
-               cb->dma = fence_get(dma);
+               cb->dma = dma_fence_get(dma);
                mod_timer(&cb->timer, round_jiffies_up(jiffies + timeout));
        }
 
-       ret = fence_add_callback(dma, &cb->base, dma_i915_sw_fence_wake);
+       ret = dma_fence_add_callback(dma, &cb->base, dma_i915_sw_fence_wake);
        if (ret == 0) {
                ret = 1;
        } else {
@@ -305,16 +306,16 @@ int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence,
 
 int i915_sw_fence_await_reservation(struct i915_sw_fence *fence,
                                    struct reservation_object *resv,
-                                   const struct fence_ops *exclude,
+                                   const struct dma_fence_ops *exclude,
                                    bool write,
                                    unsigned long timeout,
                                    gfp_t gfp)
 {
-       struct fence *excl;
+       struct dma_fence *excl;
        int ret = 0, pending;
 
        if (write) {
-               struct fence **shared;
+               struct dma_fence **shared;
                unsigned int count, i;
 
                ret = reservation_object_get_fences_rcu(resv,
@@ -339,7 +340,7 @@ int i915_sw_fence_await_reservation(struct i915_sw_fence *fence,
                }
 
                for (i = 0; i < count; i++)
-                       fence_put(shared[i]);
+                       dma_fence_put(shared[i]);
                kfree(shared);
        } else {
                excl = reservation_object_get_excl_rcu(resv);
@@ -356,7 +357,7 @@ int i915_sw_fence_await_reservation(struct i915_sw_fence *fence,
                        ret |= pending;
        }
 
-       fence_put(excl);
+       dma_fence_put(excl);
 
        return ret;
 }
index 373141602ca4d713f347f11d4e6a83a190a6fac0..cd239e92f67f9ade2ea8711acd0907877363939d 100644 (file)
@@ -16,8 +16,8 @@
 #include <linux/wait.h>
 
 struct completion;
-struct fence;
-struct fence_ops;
+struct dma_fence;
+struct dma_fence_ops;
 struct reservation_object;
 
 struct i915_sw_fence {
@@ -47,12 +47,12 @@ int i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence,
                                 struct i915_sw_fence *after,
                                 wait_queue_t *wq);
 int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence,
-                                 struct fence *dma,
+                                 struct dma_fence *dma,
                                  unsigned long timeout,
                                  gfp_t gfp);
 int i915_sw_fence_await_reservation(struct i915_sw_fence *fence,
                                    struct reservation_object *resv,
-                                   const struct fence_ops *exclude,
+                                   const struct dma_fence_ops *exclude,
                                    bool write,
                                    unsigned long timeout,
                                    gfp_t gfp);
index 178798002a7335694ddc391f8f4fe20260aebc4b..5c912c25f7d301ccb0bead7b4867bbfb2627127c 100644 (file)
@@ -491,7 +491,7 @@ TRACE_EVENT(i915_gem_ring_dispatch,
                           __entry->ring = req->engine->id;
                           __entry->seqno = req->fence.seqno;
                           __entry->flags = flags;
-                          fence_enable_sw_signaling(&req->fence);
+                          dma_fence_enable_sw_signaling(&req->fence);
                           ),
 
            TP_printk("dev=%u, ring=%u, seqno=%u, flags=%x",
index 23fc1042fed477655df84ae0c5f34d87208e84e5..56efcc507ea2c181d53beea696025fa59d052f44 100644 (file)
@@ -464,7 +464,7 @@ static int intel_breadcrumbs_signaler(void *arg)
                                                 &request->signaling.wait);
 
                        local_bh_disable();
-                       fence_signal(&request->fence);
+                       dma_fence_signal(&request->fence);
                        local_bh_enable(); /* kick start the tasklets */
 
                        /* Find the next oldest signal. Note that as we have
@@ -502,7 +502,7 @@ void intel_engine_enable_signaling(struct drm_i915_gem_request *request)
        struct rb_node *parent, **p;
        bool first, wakeup;
 
-       /* locked by fence_enable_sw_signaling() */
+       /* locked by dma_fence_enable_sw_signaling() */
        assert_spin_locked(&request->lock);
 
        request->signaling.wait.tsk = b->signaler;
index 2dc94812bea5840c8ddffa1ce639ee944966b670..8cceb345aa0f22ad71e3e1b93f6a232422a60d84 100644 (file)
@@ -245,7 +245,7 @@ void intel_engine_setup_common(struct intel_engine_cs *engine)
        INIT_LIST_HEAD(&engine->execlist_queue);
        spin_lock_init(&engine->execlist_lock);
 
-       engine->fence_context = fence_context_alloc(1);
+       engine->fence_context = dma_fence_context_alloc(1);
 
        intel_engine_init_requests(engine);
        intel_engine_init_hangcheck(engine);
index d0da52f2a806a2d3b9b46f957a996fa2da0e2133..940bf4992fe2cabd5ec2460d04b2d22e0efba312 100644 (file)
@@ -217,7 +217,7 @@ void msm_gem_vunmap(struct drm_gem_object *obj);
 int msm_gem_sync_object(struct drm_gem_object *obj,
                struct msm_fence_context *fctx, bool exclusive);
 void msm_gem_move_to_active(struct drm_gem_object *obj,
-               struct msm_gpu *gpu, bool exclusive, struct fence *fence);
+               struct msm_gpu *gpu, bool exclusive, struct dma_fence *fence);
 void msm_gem_move_to_inactive(struct drm_gem_object *obj);
 int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout);
 int msm_gem_cpu_fini(struct drm_gem_object *obj);
index a9b9b1c95a2eb9384a087174403c3bb9fcc6a294..3f299c537b77ae347bce4c92368ed774c7695459 100644 (file)
@@ -15,7 +15,7 @@
  * this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 
 #include "msm_drv.h"
 #include "msm_fence.h"
@@ -32,7 +32,7 @@ msm_fence_context_alloc(struct drm_device *dev, const char *name)
 
        fctx->dev = dev;
        fctx->name = name;
-       fctx->context = fence_context_alloc(1);
+       fctx->context = dma_fence_context_alloc(1);
        init_waitqueue_head(&fctx->event);
        spin_lock_init(&fctx->spinlock);
 
@@ -100,52 +100,52 @@ void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence)
 
 struct msm_fence {
        struct msm_fence_context *fctx;
-       struct fence base;
+       struct dma_fence base;
 };
 
-static inline struct msm_fence *to_msm_fence(struct fence *fence)
+static inline struct msm_fence *to_msm_fence(struct dma_fence *fence)
 {
        return container_of(fence, struct msm_fence, base);
 }
 
-static const char *msm_fence_get_driver_name(struct fence *fence)
+static const char *msm_fence_get_driver_name(struct dma_fence *fence)
 {
        return "msm";
 }
 
-static const char *msm_fence_get_timeline_name(struct fence *fence)
+static const char *msm_fence_get_timeline_name(struct dma_fence *fence)
 {
        struct msm_fence *f = to_msm_fence(fence);
        return f->fctx->name;
 }
 
-static bool msm_fence_enable_signaling(struct fence *fence)
+static bool msm_fence_enable_signaling(struct dma_fence *fence)
 {
        return true;
 }
 
-static bool msm_fence_signaled(struct fence *fence)
+static bool msm_fence_signaled(struct dma_fence *fence)
 {
        struct msm_fence *f = to_msm_fence(fence);
        return fence_completed(f->fctx, f->base.seqno);
 }
 
-static void msm_fence_release(struct fence *fence)
+static void msm_fence_release(struct dma_fence *fence)
 {
        struct msm_fence *f = to_msm_fence(fence);
        kfree_rcu(f, base.rcu);
 }
 
-static const struct fence_ops msm_fence_ops = {
+static const struct dma_fence_ops msm_fence_ops = {
        .get_driver_name = msm_fence_get_driver_name,
        .get_timeline_name = msm_fence_get_timeline_name,
        .enable_signaling = msm_fence_enable_signaling,
        .signaled = msm_fence_signaled,
-       .wait = fence_default_wait,
+       .wait = dma_fence_default_wait,
        .release = msm_fence_release,
 };
 
-struct fence *
+struct dma_fence *
 msm_fence_alloc(struct msm_fence_context *fctx)
 {
        struct msm_fence *f;
@@ -156,8 +156,8 @@ msm_fence_alloc(struct msm_fence_context *fctx)
 
        f->fctx = fctx;
 
-       fence_init(&f->base, &msm_fence_ops, &fctx->spinlock,
-                       fctx->context, ++fctx->last_fence);
+       dma_fence_init(&f->base, &msm_fence_ops, &fctx->spinlock,
+                      fctx->context, ++fctx->last_fence);
 
        return &f->base;
 }
index ceb5b3d314b40fb1fd127cbb54063a5c8726d9b8..56061aa1959d1fb623b16e8bdd3ac801cdea2fae 100644 (file)
@@ -41,6 +41,6 @@ int msm_queue_fence_cb(struct msm_fence_context *fctx,
                struct msm_fence_cb *cb, uint32_t fence);
 void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence);
 
-struct fence * msm_fence_alloc(struct msm_fence_context *fctx);
+struct dma_fence * msm_fence_alloc(struct msm_fence_context *fctx);
 
 #endif
index b6ac27e3192964cbf2fa1f5a4c139ab282deaa71..57db7dbbb618d85de686df53340aa39a5def9b0b 100644 (file)
@@ -521,7 +521,7 @@ int msm_gem_sync_object(struct drm_gem_object *obj,
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        struct reservation_object_list *fobj;
-       struct fence *fence;
+       struct dma_fence *fence;
        int i, ret;
 
        if (!exclusive) {
@@ -540,7 +540,7 @@ int msm_gem_sync_object(struct drm_gem_object *obj,
                fence = reservation_object_get_excl(msm_obj->resv);
                /* don't need to wait on our own fences, since ring is fifo */
                if (fence && (fence->context != fctx->context)) {
-                       ret = fence_wait(fence, true);
+                       ret = dma_fence_wait(fence, true);
                        if (ret)
                                return ret;
                }
@@ -553,7 +553,7 @@ int msm_gem_sync_object(struct drm_gem_object *obj,
                fence = rcu_dereference_protected(fobj->shared[i],
                                                reservation_object_held(msm_obj->resv));
                if (fence->context != fctx->context) {
-                       ret = fence_wait(fence, true);
+                       ret = dma_fence_wait(fence, true);
                        if (ret)
                                return ret;
                }
@@ -563,7 +563,7 @@ int msm_gem_sync_object(struct drm_gem_object *obj,
 }
 
 void msm_gem_move_to_active(struct drm_gem_object *obj,
-               struct msm_gpu *gpu, bool exclusive, struct fence *fence)
+               struct msm_gpu *gpu, bool exclusive, struct dma_fence *fence)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED);
@@ -616,10 +616,10 @@ int msm_gem_cpu_fini(struct drm_gem_object *obj)
 }
 
 #ifdef CONFIG_DEBUG_FS
-static void describe_fence(struct fence *fence, const char *type,
+static void describe_fence(struct dma_fence *fence, const char *type,
                struct seq_file *m)
 {
-       if (!fence_is_signaled(fence))
+       if (!dma_fence_is_signaled(fence))
                seq_printf(m, "\t%9s: %s %s seq %u\n", type,
                                fence->ops->get_driver_name(fence),
                                fence->ops->get_timeline_name(fence),
@@ -631,7 +631,7 @@ void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        struct reservation_object *robj = msm_obj->resv;
        struct reservation_object_list *fobj;
-       struct fence *fence;
+       struct dma_fence *fence;
        uint64_t off = drm_vma_node_start(&obj->vma_node);
        const char *madv;
 
index b2f13cfe945edd359a151083c1ee5d15f4a16a65..2cb8551fda70bbf9a5de8afc55572a459d0ebf11 100644 (file)
@@ -104,7 +104,7 @@ struct msm_gem_submit {
        struct list_head node;   /* node in gpu submit_list */
        struct list_head bo_list;
        struct ww_acquire_ctx ticket;
-       struct fence *fence;
+       struct dma_fence *fence;
        struct pid *pid;    /* submitting process */
        bool valid;         /* true if no cmdstream patching needed */
        unsigned int nr_cmds;
index b6a0f37a65f30cad9f85d5773fca802e9ea3bb6b..25e8786fa4ca5acbc49a5ee3eb551f8a1a28d280 100644 (file)
@@ -60,7 +60,7 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev,
 
 void msm_gem_submit_free(struct msm_gem_submit *submit)
 {
-       fence_put(submit->fence);
+       dma_fence_put(submit->fence);
        list_del(&submit->node);
        put_pid(submit->pid);
        kfree(submit);
@@ -380,7 +380,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
        struct msm_file_private *ctx = file->driver_priv;
        struct msm_gem_submit *submit;
        struct msm_gpu *gpu = priv->gpu;
-       struct fence *in_fence = NULL;
+       struct dma_fence *in_fence = NULL;
        struct sync_file *sync_file = NULL;
        int out_fence_fd = -1;
        unsigned i;
@@ -439,7 +439,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
                 */
 
                if (in_fence->context != gpu->fctx->context) {
-                       ret = fence_wait(in_fence, true);
+                       ret = dma_fence_wait(in_fence, true);
                        if (ret)
                                goto out;
                }
@@ -542,7 +542,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
 
 out:
        if (in_fence)
-               fence_put(in_fence);
+               dma_fence_put(in_fence);
        submit_cleanup(submit);
        if (ret)
                msm_gem_submit_free(submit);
index 5bb09838b5ae2c2f421ca605a350e4c992751d8b..3249707e6834cfb732fe448ffcd96c2f8d713a63 100644 (file)
@@ -476,7 +476,7 @@ static void retire_submits(struct msm_gpu *gpu)
                submit = list_first_entry(&gpu->submit_list,
                                struct msm_gem_submit, node);
 
-               if (fence_is_signaled(submit->fence)) {
+               if (dma_fence_is_signaled(submit->fence)) {
                        retire_submit(gpu, submit);
                } else {
                        break;
index 343b8659472cfb4b6b5e2a45c447346e381d41f2..ec8ac756aab445cd6a04f328cbf34893c2fa2734 100644 (file)
@@ -83,13 +83,13 @@ nv10_bo_get_tile_region(struct drm_device *dev, int i)
 
 static void
 nv10_bo_put_tile_region(struct drm_device *dev, struct nouveau_drm_tile *tile,
-                       struct fence *fence)
+                       struct dma_fence *fence)
 {
        struct nouveau_drm *drm = nouveau_drm(dev);
 
        if (tile) {
                spin_lock(&drm->tile.lock);
-               tile->fence = (struct nouveau_fence *)fence_get(fence);
+               tile->fence = (struct nouveau_fence *)dma_fence_get(fence);
                tile->used = false;
                spin_unlock(&drm->tile.lock);
        }
@@ -1243,7 +1243,7 @@ nouveau_bo_vm_cleanup(struct ttm_buffer_object *bo,
 {
        struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
        struct drm_device *dev = drm->dev;
-       struct fence *fence = reservation_object_get_excl(bo->resv);
+       struct dma_fence *fence = reservation_object_get_excl(bo->resv);
 
        nv10_bo_put_tile_region(dev, *old_tile, fence);
        *old_tile = new_tile;
index 4bb9ab892ae19c3afe6f7e1bf235f8e7869bd28b..e9529ee6bc2373841496aef53c07947354f2c1b6 100644 (file)
@@ -28,7 +28,7 @@
 
 #include <linux/ktime.h>
 #include <linux/hrtimer.h>
-#include <trace/events/fence.h>
+#include <trace/events/dma_fence.h>
 
 #include <nvif/cl826e.h>
 #include <nvif/notify.h>
 #include "nouveau_dma.h"
 #include "nouveau_fence.h"
 
-static const struct fence_ops nouveau_fence_ops_uevent;
-static const struct fence_ops nouveau_fence_ops_legacy;
+static const struct dma_fence_ops nouveau_fence_ops_uevent;
+static const struct dma_fence_ops nouveau_fence_ops_legacy;
 
 static inline struct nouveau_fence *
-from_fence(struct fence *fence)
+from_fence(struct dma_fence *fence)
 {
        return container_of(fence, struct nouveau_fence, base);
 }
@@ -58,23 +58,23 @@ nouveau_fence_signal(struct nouveau_fence *fence)
 {
        int drop = 0;
 
-       fence_signal_locked(&fence->base);
+       dma_fence_signal_locked(&fence->base);
        list_del(&fence->head);
        rcu_assign_pointer(fence->channel, NULL);
 
-       if (test_bit(FENCE_FLAG_USER_BITS, &fence->base.flags)) {
+       if (test_bit(DMA_FENCE_FLAG_USER_BITS, &fence->base.flags)) {
                struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
 
                if (!--fctx->notify_ref)
                        drop = 1;
        }
 
-       fence_put(&fence->base);
+       dma_fence_put(&fence->base);
        return drop;
 }
 
 static struct nouveau_fence *
-nouveau_local_fence(struct fence *fence, struct nouveau_drm *drm) {
+nouveau_local_fence(struct dma_fence *fence, struct nouveau_drm *drm) {
        struct nouveau_fence_priv *priv = (void*)drm->fence;
 
        if (fence->ops != &nouveau_fence_ops_legacy &&
@@ -201,7 +201,7 @@ nouveau_fence_context_new(struct nouveau_channel *chan, struct nouveau_fence_cha
 
 struct nouveau_fence_work {
        struct work_struct work;
-       struct fence_cb cb;
+       struct dma_fence_cb cb;
        void (*func)(void *);
        void *data;
 };
@@ -214,7 +214,7 @@ nouveau_fence_work_handler(struct work_struct *kwork)
        kfree(work);
 }
 
-static void nouveau_fence_work_cb(struct fence *fence, struct fence_cb *cb)
+static void nouveau_fence_work_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
 {
        struct nouveau_fence_work *work = container_of(cb, typeof(*work), cb);
 
@@ -222,12 +222,12 @@ static void nouveau_fence_work_cb(struct fence *fence, struct fence_cb *cb)
 }
 
 void
-nouveau_fence_work(struct fence *fence,
+nouveau_fence_work(struct dma_fence *fence,
                   void (*func)(void *), void *data)
 {
        struct nouveau_fence_work *work;
 
-       if (fence_is_signaled(fence))
+       if (dma_fence_is_signaled(fence))
                goto err;
 
        work = kmalloc(sizeof(*work), GFP_KERNEL);
@@ -245,7 +245,7 @@ nouveau_fence_work(struct fence *fence,
        work->func = func;
        work->data = data;
 
-       if (fence_add_callback(fence, &work->cb, nouveau_fence_work_cb) < 0)
+       if (dma_fence_add_callback(fence, &work->cb, nouveau_fence_work_cb) < 0)
                goto err_free;
        return;
 
@@ -266,17 +266,17 @@ nouveau_fence_emit(struct nouveau_fence *fence, struct nouveau_channel *chan)
        fence->timeout  = jiffies + (15 * HZ);
 
        if (priv->uevent)
-               fence_init(&fence->base, &nouveau_fence_ops_uevent,
-                          &fctx->lock, fctx->context, ++fctx->sequence);
+               dma_fence_init(&fence->base, &nouveau_fence_ops_uevent,
+                              &fctx->lock, fctx->context, ++fctx->sequence);
        else
-               fence_init(&fence->base, &nouveau_fence_ops_legacy,
-                          &fctx->lock, fctx->context, ++fctx->sequence);
+               dma_fence_init(&fence->base, &nouveau_fence_ops_legacy,
+                              &fctx->lock, fctx->context, ++fctx->sequence);
        kref_get(&fctx->fence_ref);
 
-       trace_fence_emit(&fence->base);
+       trace_dma_fence_emit(&fence->base);
        ret = fctx->emit(fence);
        if (!ret) {
-               fence_get(&fence->base);
+               dma_fence_get(&fence->base);
                spin_lock_irq(&fctx->lock);
 
                if (nouveau_fence_update(chan, fctx))
@@ -298,7 +298,7 @@ nouveau_fence_done(struct nouveau_fence *fence)
                struct nouveau_channel *chan;
                unsigned long flags;
 
-               if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags))
+               if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->base.flags))
                        return true;
 
                spin_lock_irqsave(&fctx->lock, flags);
@@ -307,11 +307,11 @@ nouveau_fence_done(struct nouveau_fence *fence)
                        nvif_notify_put(&fctx->notify);
                spin_unlock_irqrestore(&fctx->lock, flags);
        }
-       return fence_is_signaled(&fence->base);
+       return dma_fence_is_signaled(&fence->base);
 }
 
 static long
-nouveau_fence_wait_legacy(struct fence *f, bool intr, long wait)
+nouveau_fence_wait_legacy(struct dma_fence *f, bool intr, long wait)
 {
        struct nouveau_fence *fence = from_fence(f);
        unsigned long sleep_time = NSEC_PER_MSEC / 1000;
@@ -378,7 +378,7 @@ nouveau_fence_wait(struct nouveau_fence *fence, bool lazy, bool intr)
        if (!lazy)
                return nouveau_fence_wait_busy(fence, intr);
 
-       ret = fence_wait_timeout(&fence->base, intr, 15 * HZ);
+       ret = dma_fence_wait_timeout(&fence->base, intr, 15 * HZ);
        if (ret < 0)
                return ret;
        else if (!ret)
@@ -391,7 +391,7 @@ int
 nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool exclusive, bool intr)
 {
        struct nouveau_fence_chan *fctx = chan->fence;
-       struct fence *fence;
+       struct dma_fence *fence;
        struct reservation_object *resv = nvbo->bo.resv;
        struct reservation_object_list *fobj;
        struct nouveau_fence *f;
@@ -421,7 +421,7 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool e
                }
 
                if (must_wait)
-                       ret = fence_wait(fence, intr);
+                       ret = dma_fence_wait(fence, intr);
 
                return ret;
        }
@@ -446,7 +446,7 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool e
                }
 
                if (must_wait)
-                       ret = fence_wait(fence, intr);
+                       ret = dma_fence_wait(fence, intr);
        }
 
        return ret;
@@ -456,7 +456,7 @@ void
 nouveau_fence_unref(struct nouveau_fence **pfence)
 {
        if (*pfence)
-               fence_put(&(*pfence)->base);
+               dma_fence_put(&(*pfence)->base);
        *pfence = NULL;
 }
 
@@ -484,12 +484,12 @@ nouveau_fence_new(struct nouveau_channel *chan, bool sysmem,
        return ret;
 }
 
-static const char *nouveau_fence_get_get_driver_name(struct fence *fence)
+static const char *nouveau_fence_get_get_driver_name(struct dma_fence *fence)
 {
        return "nouveau";
 }
 
-static const char *nouveau_fence_get_timeline_name(struct fence *f)
+static const char *nouveau_fence_get_timeline_name(struct dma_fence *f)
 {
        struct nouveau_fence *fence = from_fence(f);
        struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
@@ -503,7 +503,7 @@ static const char *nouveau_fence_get_timeline_name(struct fence *f)
  * result. The drm node should still be there, so we can derive the index from
  * the fence context.
  */
-static bool nouveau_fence_is_signaled(struct fence *f)
+static bool nouveau_fence_is_signaled(struct dma_fence *f)
 {
        struct nouveau_fence *fence = from_fence(f);
        struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
@@ -519,7 +519,7 @@ static bool nouveau_fence_is_signaled(struct fence *f)
        return ret;
 }
 
-static bool nouveau_fence_no_signaling(struct fence *f)
+static bool nouveau_fence_no_signaling(struct dma_fence *f)
 {
        struct nouveau_fence *fence = from_fence(f);
 
@@ -530,30 +530,30 @@ static bool nouveau_fence_no_signaling(struct fence *f)
        WARN_ON(atomic_read(&fence->base.refcount.refcount) <= 1);
 
        /*
-        * This needs uevents to work correctly, but fence_add_callback relies on
+        * This needs uevents to work correctly, but dma_fence_add_callback relies on
         * being able to enable signaling. It will still get signaled eventually,
         * just not right away.
         */
        if (nouveau_fence_is_signaled(f)) {
                list_del(&fence->head);
 
-               fence_put(&fence->base);
+               dma_fence_put(&fence->base);
                return false;
        }
 
        return true;
 }
 
-static void nouveau_fence_release(struct fence *f)
+static void nouveau_fence_release(struct dma_fence *f)
 {
        struct nouveau_fence *fence = from_fence(f);
        struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
 
        kref_put(&fctx->fence_ref, nouveau_fence_context_put);
-       fence_free(&fence->base);
+       dma_fence_free(&fence->base);
 }
 
-static const struct fence_ops nouveau_fence_ops_legacy = {
+static const struct dma_fence_ops nouveau_fence_ops_legacy = {
        .get_driver_name = nouveau_fence_get_get_driver_name,
        .get_timeline_name = nouveau_fence_get_timeline_name,
        .enable_signaling = nouveau_fence_no_signaling,
@@ -562,7 +562,7 @@ static const struct fence_ops nouveau_fence_ops_legacy = {
        .release = nouveau_fence_release
 };
 
-static bool nouveau_fence_enable_signaling(struct fence *f)
+static bool nouveau_fence_enable_signaling(struct dma_fence *f)
 {
        struct nouveau_fence *fence = from_fence(f);
        struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
@@ -573,18 +573,18 @@ static bool nouveau_fence_enable_signaling(struct fence *f)
 
        ret = nouveau_fence_no_signaling(f);
        if (ret)
-               set_bit(FENCE_FLAG_USER_BITS, &fence->base.flags);
+               set_bit(DMA_FENCE_FLAG_USER_BITS, &fence->base.flags);
        else if (!--fctx->notify_ref)
                nvif_notify_put(&fctx->notify);
 
        return ret;
 }
 
-static const struct fence_ops nouveau_fence_ops_uevent = {
+static const struct dma_fence_ops nouveau_fence_ops_uevent = {
        .get_driver_name = nouveau_fence_get_get_driver_name,
        .get_timeline_name = nouveau_fence_get_timeline_name,
        .enable_signaling = nouveau_fence_enable_signaling,
        .signaled = nouveau_fence_is_signaled,
-       .wait = fence_default_wait,
+       .wait = dma_fence_default_wait,
        .release = NULL
 };
index 64c4ce7115ad8902d9b79714d8a476d12d1e71c3..41f3c019e534ca59127d10b329af07d2651282d3 100644 (file)
@@ -1,14 +1,14 @@
 #ifndef __NOUVEAU_FENCE_H__
 #define __NOUVEAU_FENCE_H__
 
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 #include <nvif/notify.h>
 
 struct nouveau_drm;
 struct nouveau_bo;
 
 struct nouveau_fence {
-       struct fence base;
+       struct dma_fence base;
 
        struct list_head head;
 
@@ -24,7 +24,7 @@ void nouveau_fence_unref(struct nouveau_fence **);
 
 int  nouveau_fence_emit(struct nouveau_fence *, struct nouveau_channel *);
 bool nouveau_fence_done(struct nouveau_fence *);
-void nouveau_fence_work(struct fence *, void (*)(void *), void *);
+void nouveau_fence_work(struct dma_fence *, void (*)(void *), void *);
 int  nouveau_fence_wait(struct nouveau_fence *, bool lazy, bool intr);
 int  nouveau_fence_sync(struct nouveau_bo *, struct nouveau_channel *, bool exclusive, bool intr);
 
index 0bd7164bc8172d9ca81be4537aeceecfb9c263f7..7f083c95f42232622eec8d77b230b8911a5fd612 100644 (file)
@@ -119,7 +119,7 @@ nouveau_gem_object_unmap(struct nouveau_bo *nvbo, struct nvkm_vma *vma)
        const bool mapped = nvbo->bo.mem.mem_type != TTM_PL_SYSTEM;
        struct reservation_object *resv = nvbo->bo.resv;
        struct reservation_object_list *fobj;
-       struct fence *fence = NULL;
+       struct dma_fence *fence = NULL;
 
        fobj = reservation_object_get_list(resv);
 
index 1915b7b82a59e6213cf9c0c06f566b82d939e9bd..fa8f2375c398e77c1164a560061101c4c7aab4dd 100644 (file)
@@ -110,6 +110,6 @@ nv04_fence_create(struct nouveau_drm *drm)
        priv->base.context_new = nv04_fence_context_new;
        priv->base.context_del = nv04_fence_context_del;
        priv->base.contexts = 15;
-       priv->base.context_base = fence_context_alloc(priv->base.contexts);
+       priv->base.context_base = dma_fence_context_alloc(priv->base.contexts);
        return 0;
 }
index 4e3de34ff6f4b9dc92bcb71c3e4746e868aabd0d..f99fcf56928a8daf123ff56e61afe0d2ed367eb5 100644 (file)
@@ -107,7 +107,7 @@ nv10_fence_create(struct nouveau_drm *drm)
        priv->base.context_new = nv10_fence_context_new;
        priv->base.context_del = nv10_fence_context_del;
        priv->base.contexts = 31;
-       priv->base.context_base = fence_context_alloc(priv->base.contexts);
+       priv->base.context_base = dma_fence_context_alloc(priv->base.contexts);
        spin_lock_init(&priv->lock);
        return 0;
 }
index 7d5e562a55c5abf738b8eae21c110aa75af34938..79bc011113511841146ef6fde14292750de8fd9b 100644 (file)
@@ -126,7 +126,7 @@ nv17_fence_create(struct nouveau_drm *drm)
        priv->base.context_new = nv17_fence_context_new;
        priv->base.context_del = nv10_fence_context_del;
        priv->base.contexts = 31;
-       priv->base.context_base = fence_context_alloc(priv->base.contexts);
+       priv->base.context_base = dma_fence_context_alloc(priv->base.contexts);
        spin_lock_init(&priv->lock);
 
        ret = nouveau_bo_new(drm->dev, 4096, 0x1000, TTM_PL_FLAG_VRAM,
index 4d6f202b77707c8cf01db5a6362772720fe1bbc9..8c5295414578e03730b15ed7de3d25ac2d4b01d2 100644 (file)
@@ -97,7 +97,7 @@ nv50_fence_create(struct nouveau_drm *drm)
        priv->base.context_new = nv50_fence_context_new;
        priv->base.context_del = nv10_fence_context_del;
        priv->base.contexts = 127;
-       priv->base.context_base = fence_context_alloc(priv->base.contexts);
+       priv->base.context_base = dma_fence_context_alloc(priv->base.contexts);
        spin_lock_init(&priv->lock);
 
        ret = nouveau_bo_new(drm->dev, 4096, 0x1000, TTM_PL_FLAG_VRAM,
index 18bde9d8e6d6c2534accb6f39b790bdf5612a8f2..23ef04b4e0b2dec3ef372d30a8087ee3c38ba4f8 100644 (file)
@@ -229,7 +229,7 @@ nv84_fence_create(struct nouveau_drm *drm)
        priv->base.context_del = nv84_fence_context_del;
 
        priv->base.contexts = fifo->nr;
-       priv->base.context_base = fence_context_alloc(priv->base.contexts);
+       priv->base.context_base = dma_fence_context_alloc(priv->base.contexts);
        priv->base.uevent = true;
 
        /* Use VRAM if there is any ; otherwise fallback to system memory */
index 5f3e5ad99de7912843026abdafa9b93fa0c1e20a..84995ebc6ffcbac36abafb762d561fe64acf5c72 100644 (file)
@@ -31,7 +31,7 @@
  * Definitions taken from spice-protocol, plus kernel driver specific bits.
  */
 
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 #include <linux/workqueue.h>
 #include <linux/firmware.h>
 #include <linux/platform_device.h>
@@ -190,7 +190,7 @@ enum {
  * spice-protocol/qxl_dev.h */
 #define QXL_MAX_RES 96
 struct qxl_release {
-       struct fence base;
+       struct dma_fence base;
 
        int id;
        int type;
index cd83f050cf3e7fc0a0ee2c8cdf88fed97580eb2f..50b4e522f05fe71827b2bbdc49f34f5c1407648b 100644 (file)
@@ -21,7 +21,7 @@
  */
 #include "qxl_drv.h"
 #include "qxl_object.h"
-#include <trace/events/fence.h>
+#include <trace/events/dma_fence.h>
 
 /*
  * drawable cmd cache - allocate a bunch of VRAM pages, suballocate
 static const int release_size_per_bo[] = { RELEASE_SIZE, SURFACE_RELEASE_SIZE, RELEASE_SIZE };
 static const int releases_per_bo[] = { RELEASES_PER_BO, SURFACE_RELEASES_PER_BO, RELEASES_PER_BO };
 
-static const char *qxl_get_driver_name(struct fence *fence)
+static const char *qxl_get_driver_name(struct dma_fence *fence)
 {
        return "qxl";
 }
 
-static const char *qxl_get_timeline_name(struct fence *fence)
+static const char *qxl_get_timeline_name(struct dma_fence *fence)
 {
        return "release";
 }
 
-static bool qxl_nop_signaling(struct fence *fence)
+static bool qxl_nop_signaling(struct dma_fence *fence)
 {
        /* fences are always automatically signaled, so just pretend we did this.. */
        return true;
 }
 
-static long qxl_fence_wait(struct fence *fence, bool intr, signed long timeout)
+static long qxl_fence_wait(struct dma_fence *fence, bool intr,
+                          signed long timeout)
 {
        struct qxl_device *qdev;
        struct qxl_release *release;
@@ -71,7 +72,7 @@ static long qxl_fence_wait(struct fence *fence, bool intr, signed long timeout)
 retry:
        sc++;
 
-       if (fence_is_signaled(fence))
+       if (dma_fence_is_signaled(fence))
                goto signaled;
 
        qxl_io_notify_oom(qdev);
@@ -80,11 +81,11 @@ retry:
                if (!qxl_queue_garbage_collect(qdev, true))
                        break;
 
-               if (fence_is_signaled(fence))
+               if (dma_fence_is_signaled(fence))
                        goto signaled;
        }
 
-       if (fence_is_signaled(fence))
+       if (dma_fence_is_signaled(fence))
                goto signaled;
 
        if (have_drawable_releases || sc < 4) {
@@ -96,9 +97,9 @@ retry:
                        return 0;
 
                if (have_drawable_releases && sc > 300) {
-                       FENCE_WARN(fence, "failed to wait on release %llu "
-                                         "after spincount %d\n",
-                                         fence->context & ~0xf0000000, sc);
+                       DMA_FENCE_WARN(fence, "failed to wait on release %llu "
+                                      "after spincount %d\n",
+                                      fence->context & ~0xf0000000, sc);
                        goto signaled;
                }
                goto retry;
@@ -115,7 +116,7 @@ signaled:
        return end - cur;
 }
 
-static const struct fence_ops qxl_fence_ops = {
+static const struct dma_fence_ops qxl_fence_ops = {
        .get_driver_name = qxl_get_driver_name,
        .get_timeline_name = qxl_get_timeline_name,
        .enable_signaling = qxl_nop_signaling,
@@ -192,8 +193,8 @@ qxl_release_free(struct qxl_device *qdev,
                WARN_ON(list_empty(&release->bos));
                qxl_release_free_list(release);
 
-               fence_signal(&release->base);
-               fence_put(&release->base);
+               dma_fence_signal(&release->base);
+               dma_fence_put(&release->base);
        } else {
                qxl_release_free_list(release);
                kfree(release);
@@ -453,9 +454,9 @@ void qxl_release_fence_buffer_objects(struct qxl_release *release)
         * Since we never really allocated a context and we don't want to conflict,
         * set the highest bits. This will break if we really allow exporting of dma-bufs.
         */
-       fence_init(&release->base, &qxl_fence_ops, &qdev->release_lock,
-                  release->id | 0xf0000000, release->base.seqno);
-       trace_fence_emit(&release->base);
+       dma_fence_init(&release->base, &qxl_fence_ops, &qdev->release_lock,
+                      release->id | 0xf0000000, release->base.seqno);
+       trace_dma_fence_emit(&release->base);
 
        driver = bdev->driver;
        glob = bo->glob;
index 1b0dcad916b0a3559909bca4c77592c1e37d12cd..44e0c5ed6418bfd286849071453a3049f157503a 100644 (file)
@@ -66,7 +66,7 @@
 #include <linux/kref.h>
 #include <linux/interval_tree.h>
 #include <linux/hashtable.h>
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 
 #include <ttm/ttm_bo_api.h>
 #include <ttm/ttm_bo_driver.h>
@@ -367,7 +367,7 @@ struct radeon_fence_driver {
 };
 
 struct radeon_fence {
-       struct fence            base;
+       struct dma_fence                base;
 
        struct radeon_device    *rdev;
        uint64_t                seq;
@@ -746,7 +746,7 @@ struct radeon_flip_work {
        uint64_t                        base;
        struct drm_pending_vblank_event *event;
        struct radeon_bo                *old_rbo;
-       struct fence                    *fence;
+       struct dma_fence                *fence;
        bool                            async;
 };
 
@@ -2514,9 +2514,9 @@ void cik_mm_wdoorbell(struct radeon_device *rdev, u32 index, u32 v);
 /*
  * Cast helper
  */
-extern const struct fence_ops radeon_fence_ops;
+extern const struct dma_fence_ops radeon_fence_ops;
 
-static inline struct radeon_fence *to_radeon_fence(struct fence *f)
+static inline struct radeon_fence *to_radeon_fence(struct dma_fence *f)
 {
        struct radeon_fence *__f = container_of(f, struct radeon_fence, base);
 
index eb92aef46e3cfcf99a07d26272fac7725d0cfaa8..36b7ac7e57e5dab360ea9e48a56160e4108061b4 100644 (file)
@@ -1320,7 +1320,7 @@ int radeon_device_init(struct radeon_device *rdev,
        for (i = 0; i < RADEON_NUM_RINGS; i++) {
                rdev->ring[i].idx = i;
        }
-       rdev->fence_context = fence_context_alloc(RADEON_NUM_RINGS);
+       rdev->fence_context = dma_fence_context_alloc(RADEON_NUM_RINGS);
 
        DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X 0x%02X).\n",
                 radeon_family_name[rdev->family], pdev->vendor, pdev->device,
index cdb8cb568c15310589039b2f0c56faf5cbf11b9c..e7409e8a9f877fd29baee683893a28cc2ae09a35 100644 (file)
@@ -437,7 +437,7 @@ static void radeon_flip_work_func(struct work_struct *__work)
                                down_read(&rdev->exclusive_lock);
                        }
                } else
-                       r = fence_wait(work->fence, false);
+                       r = dma_fence_wait(work->fence, false);
 
                if (r)
                        DRM_ERROR("failed to wait on page flip fence (%d)!\n", r);
@@ -447,7 +447,7 @@ static void radeon_flip_work_func(struct work_struct *__work)
                 * confused about which BO the CRTC is scanning out
                 */
 
-               fence_put(work->fence);
+               dma_fence_put(work->fence);
                work->fence = NULL;
        }
 
@@ -542,7 +542,7 @@ static int radeon_crtc_page_flip_target(struct drm_crtc *crtc,
                DRM_ERROR("failed to pin new rbo buffer before flip\n");
                goto cleanup;
        }
-       work->fence = fence_get(reservation_object_get_excl(new_rbo->tbo.resv));
+       work->fence = dma_fence_get(reservation_object_get_excl(new_rbo->tbo.resv));
        radeon_bo_get_tiling_flags(new_rbo, &tiling_flags, NULL);
        radeon_bo_unreserve(new_rbo);
 
@@ -617,7 +617,7 @@ pflip_cleanup:
 
 cleanup:
        drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
-       fence_put(work->fence);
+       dma_fence_put(work->fence);
        kfree(work);
        return r;
 }
index 7ef075acde9c736a565239c727fb511265b46242..ef09f0a637545370bf245d0b1d0ba8fff2090dc2 100644 (file)
@@ -141,8 +141,10 @@ int radeon_fence_emit(struct radeon_device *rdev,
        (*fence)->seq = seq = ++rdev->fence_drv[ring].sync_seq[ring];
        (*fence)->ring = ring;
        (*fence)->is_vm_update = false;
-       fence_init(&(*fence)->base, &radeon_fence_ops,
-                  &rdev->fence_queue.lock, rdev->fence_context + ring, seq);
+       dma_fence_init(&(*fence)->base, &radeon_fence_ops,
+                      &rdev->fence_queue.lock,
+                      rdev->fence_context + ring,
+                      seq);
        radeon_fence_ring_emit(rdev, ring, *fence);
        trace_radeon_fence_emit(rdev->ddev, ring, (*fence)->seq);
        radeon_fence_schedule_check(rdev, ring);
@@ -169,18 +171,18 @@ static int radeon_fence_check_signaled(wait_queue_t *wait, unsigned mode, int fl
         */
        seq = atomic64_read(&fence->rdev->fence_drv[fence->ring].last_seq);
        if (seq >= fence->seq) {
-               int ret = fence_signal_locked(&fence->base);
+               int ret = dma_fence_signal_locked(&fence->base);
 
                if (!ret)
-                       FENCE_TRACE(&fence->base, "signaled from irq context\n");
+                       DMA_FENCE_TRACE(&fence->base, "signaled from irq context\n");
                else
-                       FENCE_TRACE(&fence->base, "was already signaled\n");
+                       DMA_FENCE_TRACE(&fence->base, "was already signaled\n");
 
                radeon_irq_kms_sw_irq_put(fence->rdev, fence->ring);
                __remove_wait_queue(&fence->rdev->fence_queue, &fence->fence_wake);
-               fence_put(&fence->base);
+               dma_fence_put(&fence->base);
        } else
-               FENCE_TRACE(&fence->base, "pending\n");
+               DMA_FENCE_TRACE(&fence->base, "pending\n");
        return 0;
 }
 
@@ -351,7 +353,7 @@ static bool radeon_fence_seq_signaled(struct radeon_device *rdev,
        return false;
 }
 
-static bool radeon_fence_is_signaled(struct fence *f)
+static bool radeon_fence_is_signaled(struct dma_fence *f)
 {
        struct radeon_fence *fence = to_radeon_fence(f);
        struct radeon_device *rdev = fence->rdev;
@@ -381,7 +383,7 @@ static bool radeon_fence_is_signaled(struct fence *f)
  * to fence_queue that checks if this fence is signaled, and if so it
  * signals the fence and removes itself.
  */
-static bool radeon_fence_enable_signaling(struct fence *f)
+static bool radeon_fence_enable_signaling(struct dma_fence *f)
 {
        struct radeon_fence *fence = to_radeon_fence(f);
        struct radeon_device *rdev = fence->rdev;
@@ -414,9 +416,9 @@ static bool radeon_fence_enable_signaling(struct fence *f)
        fence->fence_wake.private = NULL;
        fence->fence_wake.func = radeon_fence_check_signaled;
        __add_wait_queue(&rdev->fence_queue, &fence->fence_wake);
-       fence_get(f);
+       dma_fence_get(f);
 
-       FENCE_TRACE(&fence->base, "armed on ring %i!\n", fence->ring);
+       DMA_FENCE_TRACE(&fence->base, "armed on ring %i!\n", fence->ring);
        return true;
 }
 
@@ -436,9 +438,9 @@ bool radeon_fence_signaled(struct radeon_fence *fence)
        if (radeon_fence_seq_signaled(fence->rdev, fence->seq, fence->ring)) {
                int ret;
 
-               ret = fence_signal(&fence->base);
+               ret = dma_fence_signal(&fence->base);
                if (!ret)
-                       FENCE_TRACE(&fence->base, "signaled from radeon_fence_signaled\n");
+                       DMA_FENCE_TRACE(&fence->base, "signaled from radeon_fence_signaled\n");
                return true;
        }
        return false;
@@ -552,7 +554,7 @@ long radeon_fence_wait_timeout(struct radeon_fence *fence, bool intr, long timeo
         * exclusive_lock is not held in that case.
         */
        if (WARN_ON_ONCE(!to_radeon_fence(&fence->base)))
-               return fence_wait(&fence->base, intr);
+               return dma_fence_wait(&fence->base, intr);
 
        seq[fence->ring] = fence->seq;
        r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, timeout);
@@ -560,9 +562,9 @@ long radeon_fence_wait_timeout(struct radeon_fence *fence, bool intr, long timeo
                return r;
        }
 
-       r_sig = fence_signal(&fence->base);
+       r_sig = dma_fence_signal(&fence->base);
        if (!r_sig)
-               FENCE_TRACE(&fence->base, "signaled from fence_wait\n");
+               DMA_FENCE_TRACE(&fence->base, "signaled from fence_wait\n");
        return r;
 }
 
@@ -697,7 +699,7 @@ int radeon_fence_wait_empty(struct radeon_device *rdev, int ring)
  */
 struct radeon_fence *radeon_fence_ref(struct radeon_fence *fence)
 {
-       fence_get(&fence->base);
+       dma_fence_get(&fence->base);
        return fence;
 }
 
@@ -714,7 +716,7 @@ void radeon_fence_unref(struct radeon_fence **fence)
 
        *fence = NULL;
        if (tmp) {
-               fence_put(&tmp->base);
+               dma_fence_put(&tmp->base);
        }
 }
 
@@ -1028,12 +1030,12 @@ int radeon_debugfs_fence_init(struct radeon_device *rdev)
 #endif
 }
 
-static const char *radeon_fence_get_driver_name(struct fence *fence)
+static const char *radeon_fence_get_driver_name(struct dma_fence *fence)
 {
        return "radeon";
 }
 
-static const char *radeon_fence_get_timeline_name(struct fence *f)
+static const char *radeon_fence_get_timeline_name(struct dma_fence *f)
 {
        struct radeon_fence *fence = to_radeon_fence(f);
        switch (fence->ring) {
@@ -1051,16 +1053,16 @@ static const char *radeon_fence_get_timeline_name(struct fence *f)
 
 static inline bool radeon_test_signaled(struct radeon_fence *fence)
 {
-       return test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags);
+       return test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->base.flags);
 }
 
 struct radeon_wait_cb {
-       struct fence_cb base;
+       struct dma_fence_cb base;
        struct task_struct *task;
 };
 
 static void
-radeon_fence_wait_cb(struct fence *fence, struct fence_cb *cb)
+radeon_fence_wait_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
 {
        struct radeon_wait_cb *wait =
                container_of(cb, struct radeon_wait_cb, base);
@@ -1068,7 +1070,7 @@ radeon_fence_wait_cb(struct fence *fence, struct fence_cb *cb)
        wake_up_process(wait->task);
 }
 
-static signed long radeon_fence_default_wait(struct fence *f, bool intr,
+static signed long radeon_fence_default_wait(struct dma_fence *f, bool intr,
                                             signed long t)
 {
        struct radeon_fence *fence = to_radeon_fence(f);
@@ -1077,7 +1079,7 @@ static signed long radeon_fence_default_wait(struct fence *f, bool intr,
 
        cb.task = current;
 
-       if (fence_add_callback(f, &cb.base, radeon_fence_wait_cb))
+       if (dma_fence_add_callback(f, &cb.base, radeon_fence_wait_cb))
                return t;
 
        while (t > 0) {
@@ -1105,12 +1107,12 @@ static signed long radeon_fence_default_wait(struct fence *f, bool intr,
        }
 
        __set_current_state(TASK_RUNNING);
-       fence_remove_callback(f, &cb.base);
+       dma_fence_remove_callback(f, &cb.base);
 
        return t;
 }
 
-const struct fence_ops radeon_fence_ops = {
+const struct dma_fence_ops radeon_fence_ops = {
        .get_driver_name = radeon_fence_get_driver_name,
        .get_timeline_name = radeon_fence_get_timeline_name,
        .enable_signaling = radeon_fence_enable_signaling,
index 02ac8a1de4fffc55c272e13f7ef449f644748abe..be5d7a38d3aae7078697bf362f554e53674581b8 100644 (file)
@@ -92,7 +92,7 @@ int radeon_sync_resv(struct radeon_device *rdev,
                     bool shared)
 {
        struct reservation_object_list *flist;
-       struct fence *f;
+       struct dma_fence *f;
        struct radeon_fence *fence;
        unsigned i;
        int r = 0;
@@ -103,7 +103,7 @@ int radeon_sync_resv(struct radeon_device *rdev,
        if (fence && fence->rdev == rdev)
                radeon_sync_fence(sync, fence);
        else if (f)
-               r = fence_wait(f, true);
+               r = dma_fence_wait(f, true);
 
        flist = reservation_object_get_list(resv);
        if (shared || !flist || r)
@@ -116,7 +116,7 @@ int radeon_sync_resv(struct radeon_device *rdev,
                if (fence && fence->rdev == rdev)
                        radeon_sync_fence(sync, fence);
                else
-                       r = fence_wait(f, true);
+                       r = dma_fence_wait(f, true);
 
                if (r)
                        break;
index 0cd0e7bdee5594dbc30f375dacc773d84acfeb29..d34d1cf33895766c55a122adad041be62e42c70c 100644 (file)
@@ -467,7 +467,7 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
 {
        int32_t *msg, msg_type, handle;
        unsigned img_size = 0;
-       struct fence *f;
+       struct dma_fence *f;
        void *ptr;
 
        int i, r;
index fc6217dfe4016ebe7ea270189b486cba4b7db76c..915e0d1c316acc75a66adb1d8f7b6bbe86ba71f0 100644 (file)
@@ -148,7 +148,7 @@ static void ttm_bo_release_list(struct kref *list_kref)
        BUG_ON(!list_empty(&bo->ddestroy));
        ttm_tt_destroy(bo->ttm);
        atomic_dec(&bo->glob->bo_count);
-       fence_put(bo->moving);
+       dma_fence_put(bo->moving);
        if (bo->resv == &bo->ttm_resv)
                reservation_object_fini(&bo->ttm_resv);
        mutex_destroy(&bo->wu_mutex);
@@ -426,20 +426,20 @@ static void ttm_bo_cleanup_memtype_use(struct ttm_buffer_object *bo)
 static void ttm_bo_flush_all_fences(struct ttm_buffer_object *bo)
 {
        struct reservation_object_list *fobj;
-       struct fence *fence;
+       struct dma_fence *fence;
        int i;
 
        fobj = reservation_object_get_list(bo->resv);
        fence = reservation_object_get_excl(bo->resv);
        if (fence && !fence->ops->signaled)
-               fence_enable_sw_signaling(fence);
+               dma_fence_enable_sw_signaling(fence);
 
        for (i = 0; fobj && i < fobj->shared_count; ++i) {
                fence = rcu_dereference_protected(fobj->shared[i],
                                        reservation_object_held(bo->resv));
 
                if (!fence->ops->signaled)
-                       fence_enable_sw_signaling(fence);
+                       dma_fence_enable_sw_signaling(fence);
        }
 }
 
@@ -792,11 +792,11 @@ static int ttm_bo_add_move_fence(struct ttm_buffer_object *bo,
                                 struct ttm_mem_type_manager *man,
                                 struct ttm_mem_reg *mem)
 {
-       struct fence *fence;
+       struct dma_fence *fence;
        int ret;
 
        spin_lock(&man->move_lock);
-       fence = fence_get(man->move);
+       fence = dma_fence_get(man->move);
        spin_unlock(&man->move_lock);
 
        if (fence) {
@@ -806,7 +806,7 @@ static int ttm_bo_add_move_fence(struct ttm_buffer_object *bo,
                if (unlikely(ret))
                        return ret;
 
-               fence_put(bo->moving);
+               dma_fence_put(bo->moving);
                bo->moving = fence;
        }
 
@@ -1286,7 +1286,7 @@ static int ttm_bo_force_list_clean(struct ttm_bo_device *bdev,
 {
        struct ttm_mem_type_manager *man = &bdev->man[mem_type];
        struct ttm_bo_global *glob = bdev->glob;
-       struct fence *fence;
+       struct dma_fence *fence;
        int ret;
 
        /*
@@ -1309,12 +1309,12 @@ static int ttm_bo_force_list_clean(struct ttm_bo_device *bdev,
        spin_unlock(&glob->lru_lock);
 
        spin_lock(&man->move_lock);
-       fence = fence_get(man->move);
+       fence = dma_fence_get(man->move);
        spin_unlock(&man->move_lock);
 
        if (fence) {
-               ret = fence_wait(fence, false);
-               fence_put(fence);
+               ret = dma_fence_wait(fence, false);
+               dma_fence_put(fence);
                if (ret) {
                        if (allow_errors) {
                                return ret;
@@ -1343,7 +1343,7 @@ int ttm_bo_clean_mm(struct ttm_bo_device *bdev, unsigned mem_type)
                       mem_type);
                return ret;
        }
-       fence_put(man->move);
+       dma_fence_put(man->move);
 
        man->use_type = false;
        man->has_type = false;
index bf6e21655c576aed2810193e576441e69af406b9..d0459b392e5eb07324b2ad9e9f77f4a7a6f278cb 100644 (file)
@@ -644,7 +644,7 @@ void ttm_bo_kunmap(struct ttm_bo_kmap_obj *map)
 EXPORT_SYMBOL(ttm_bo_kunmap);
 
 int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
-                             struct fence *fence,
+                             struct dma_fence *fence,
                              bool evict,
                              struct ttm_mem_reg *new_mem)
 {
@@ -674,8 +674,8 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
                 * operation has completed.
                 */
 
-               fence_put(bo->moving);
-               bo->moving = fence_get(fence);
+               dma_fence_put(bo->moving);
+               bo->moving = dma_fence_get(fence);
 
                ret = ttm_buffer_object_transfer(bo, &ghost_obj);
                if (ret)
@@ -706,7 +706,7 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
 EXPORT_SYMBOL(ttm_bo_move_accel_cleanup);
 
 int ttm_bo_pipeline_move(struct ttm_buffer_object *bo,
-                        struct fence *fence, bool evict,
+                        struct dma_fence *fence, bool evict,
                         struct ttm_mem_reg *new_mem)
 {
        struct ttm_bo_device *bdev = bo->bdev;
@@ -730,8 +730,8 @@ int ttm_bo_pipeline_move(struct ttm_buffer_object *bo,
                 * operation has completed.
                 */
 
-               fence_put(bo->moving);
-               bo->moving = fence_get(fence);
+               dma_fence_put(bo->moving);
+               bo->moving = dma_fence_get(fence);
 
                ret = ttm_buffer_object_transfer(bo, &ghost_obj);
                if (ret)
@@ -761,16 +761,16 @@ int ttm_bo_pipeline_move(struct ttm_buffer_object *bo,
                 */
 
                spin_lock(&from->move_lock);
-               if (!from->move || fence_is_later(fence, from->move)) {
-                       fence_put(from->move);
-                       from->move = fence_get(fence);
+               if (!from->move || dma_fence_is_later(fence, from->move)) {
+                       dma_fence_put(from->move);
+                       from->move = dma_fence_get(fence);
                }
                spin_unlock(&from->move_lock);
 
                ttm_bo_free_old_node(bo);
 
-               fence_put(bo->moving);
-               bo->moving = fence_get(fence);
+               dma_fence_put(bo->moving);
+               bo->moving = dma_fence_get(fence);
 
        } else {
                /**
index a6ed9d5e5167fc935f0fceb8bc314db843959c19..4748aedc933abdcb752f7bd01f92310de5459850 100644 (file)
@@ -54,7 +54,7 @@ static int ttm_bo_vm_fault_idle(struct ttm_buffer_object *bo,
        /*
         * Quick non-stalling check for idle.
         */
-       if (fence_is_signaled(bo->moving))
+       if (dma_fence_is_signaled(bo->moving))
                goto out_clear;
 
        /*
@@ -67,14 +67,14 @@ static int ttm_bo_vm_fault_idle(struct ttm_buffer_object *bo,
                        goto out_unlock;
 
                up_read(&vma->vm_mm->mmap_sem);
-               (void) fence_wait(bo->moving, true);
+               (void) dma_fence_wait(bo->moving, true);
                goto out_unlock;
        }
 
        /*
         * Ordinary wait.
         */
-       ret = fence_wait(bo->moving, true);
+       ret = dma_fence_wait(bo->moving, true);
        if (unlikely(ret != 0)) {
                ret = (ret != -ERESTARTSYS) ? VM_FAULT_SIGBUS :
                        VM_FAULT_NOPAGE;
@@ -82,7 +82,7 @@ static int ttm_bo_vm_fault_idle(struct ttm_buffer_object *bo,
        }
 
 out_clear:
-       fence_put(bo->moving);
+       dma_fence_put(bo->moving);
        bo->moving = NULL;
 
 out_unlock:
index a80717b35dc675cfd1e5c0d6da323073f471983d..d35bc491e8debe3c5f90f6c9af3e1588c6bfab70 100644 (file)
@@ -179,7 +179,8 @@ int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
 EXPORT_SYMBOL(ttm_eu_reserve_buffers);
 
 void ttm_eu_fence_buffer_objects(struct ww_acquire_ctx *ticket,
-                                struct list_head *list, struct fence *fence)
+                                struct list_head *list,
+                                struct dma_fence *fence)
 {
        struct ttm_validate_buffer *entry;
        struct ttm_buffer_object *bo;
index 5c57c1ffa1f976300cfe4666b7f739177dc3586d..488909a21ed89d49c9ee1dade3cdffd6ac60f53b 100644 (file)
 #define VGEM_FENCE_TIMEOUT (10*HZ)
 
 struct vgem_fence {
-       struct fence base;
+       struct dma_fence base;
        struct spinlock lock;
        struct timer_list timer;
 };
 
-static const char *vgem_fence_get_driver_name(struct fence *fence)
+static const char *vgem_fence_get_driver_name(struct dma_fence *fence)
 {
        return "vgem";
 }
 
-static const char *vgem_fence_get_timeline_name(struct fence *fence)
+static const char *vgem_fence_get_timeline_name(struct dma_fence *fence)
 {
        return "unbound";
 }
 
-static bool vgem_fence_signaled(struct fence *fence)
+static bool vgem_fence_signaled(struct dma_fence *fence)
 {
        return false;
 }
 
-static bool vgem_fence_enable_signaling(struct fence *fence)
+static bool vgem_fence_enable_signaling(struct dma_fence *fence)
 {
        return true;
 }
 
-static void vgem_fence_release(struct fence *base)
+static void vgem_fence_release(struct dma_fence *base)
 {
        struct vgem_fence *fence = container_of(base, typeof(*fence), base);
 
        del_timer_sync(&fence->timer);
-       fence_free(&fence->base);
+       dma_fence_free(&fence->base);
 }
 
-static void vgem_fence_value_str(struct fence *fence, char *str, int size)
+static void vgem_fence_value_str(struct dma_fence *fence, char *str, int size)
 {
        snprintf(str, size, "%u", fence->seqno);
 }
 
-static void vgem_fence_timeline_value_str(struct fence *fence, char *str,
+static void vgem_fence_timeline_value_str(struct dma_fence *fence, char *str,
                                          int size)
 {
-       snprintf(str, size, "%u", fence_is_signaled(fence) ? fence->seqno : 0);
+       snprintf(str, size, "%u",
+                dma_fence_is_signaled(fence) ? fence->seqno : 0);
 }
 
-static const struct fence_ops vgem_fence_ops = {
+static const struct dma_fence_ops vgem_fence_ops = {
        .get_driver_name = vgem_fence_get_driver_name,
        .get_timeline_name = vgem_fence_get_timeline_name,
        .enable_signaling = vgem_fence_enable_signaling,
        .signaled = vgem_fence_signaled,
-       .wait = fence_default_wait,
+       .wait = dma_fence_default_wait,
        .release = vgem_fence_release,
 
        .fence_value_str = vgem_fence_value_str,
@@ -88,11 +89,11 @@ static void vgem_fence_timeout(unsigned long data)
 {
        struct vgem_fence *fence = (struct vgem_fence *)data;
 
-       fence_signal(&fence->base);
+       dma_fence_signal(&fence->base);
 }
 
-static struct fence *vgem_fence_create(struct vgem_file *vfile,
-                                      unsigned int flags)
+static struct dma_fence *vgem_fence_create(struct vgem_file *vfile,
+                                          unsigned int flags)
 {
        struct vgem_fence *fence;
 
@@ -101,8 +102,8 @@ static struct fence *vgem_fence_create(struct vgem_file *vfile,
                return NULL;
 
        spin_lock_init(&fence->lock);
-       fence_init(&fence->base, &vgem_fence_ops, &fence->lock,
-                  fence_context_alloc(1), 1);
+       dma_fence_init(&fence->base, &vgem_fence_ops, &fence->lock,
+                      dma_fence_context_alloc(1), 1);
 
        setup_timer(&fence->timer, vgem_fence_timeout, (unsigned long)fence);
 
@@ -157,7 +158,7 @@ int vgem_fence_attach_ioctl(struct drm_device *dev,
        struct vgem_file *vfile = file->driver_priv;
        struct reservation_object *resv;
        struct drm_gem_object *obj;
-       struct fence *fence;
+       struct dma_fence *fence;
        int ret;
 
        if (arg->flags & ~VGEM_FENCE_WRITE)
@@ -209,8 +210,8 @@ int vgem_fence_attach_ioctl(struct drm_device *dev,
        }
 err_fence:
        if (ret) {
-               fence_signal(fence);
-               fence_put(fence);
+               dma_fence_signal(fence);
+               dma_fence_put(fence);
        }
 err:
        drm_gem_object_unreference_unlocked(obj);
@@ -239,7 +240,7 @@ int vgem_fence_signal_ioctl(struct drm_device *dev,
 {
        struct vgem_file *vfile = file->driver_priv;
        struct drm_vgem_fence_signal *arg = data;
-       struct fence *fence;
+       struct dma_fence *fence;
        int ret = 0;
 
        if (arg->flags)
@@ -253,11 +254,11 @@ int vgem_fence_signal_ioctl(struct drm_device *dev,
        if (IS_ERR(fence))
                return PTR_ERR(fence);
 
-       if (fence_is_signaled(fence))
+       if (dma_fence_is_signaled(fence))
                ret = -ETIMEDOUT;
 
-       fence_signal(fence);
-       fence_put(fence);
+       dma_fence_signal(fence);
+       dma_fence_put(fence);
        return ret;
 }
 
@@ -271,8 +272,8 @@ int vgem_fence_open(struct vgem_file *vfile)
 
 static int __vgem_fence_idr_fini(int id, void *p, void *data)
 {
-       fence_signal(p);
-       fence_put(p);
+       dma_fence_signal(p);
+       dma_fence_put(p);
        return 0;
 }
 
index ae59080d63d1f22f8835445019a30b619945f1dc..ec1ebdcfe80baaaf8ab5e02e345291f97108bd8f 100644 (file)
@@ -82,7 +82,7 @@ struct virtio_gpu_fence_driver {
 };
 
 struct virtio_gpu_fence {
-       struct fence f;
+       struct dma_fence f;
        struct virtio_gpu_fence_driver *drv;
        struct list_head node;
        uint64_t seq;
index f3f70fa8a4c7f5eefb6fba0a8798d282c860c60e..23353521f903adb15a8587f53ff3af889962704f 100644 (file)
 #include <drm/drmP.h>
 #include "virtgpu_drv.h"
 
-static const char *virtio_get_driver_name(struct fence *f)
+static const char *virtio_get_driver_name(struct dma_fence *f)
 {
        return "virtio_gpu";
 }
 
-static const char *virtio_get_timeline_name(struct fence *f)
+static const char *virtio_get_timeline_name(struct dma_fence *f)
 {
        return "controlq";
 }
 
-static bool virtio_enable_signaling(struct fence *f)
+static bool virtio_enable_signaling(struct dma_fence *f)
 {
        return true;
 }
 
-static bool virtio_signaled(struct fence *f)
+static bool virtio_signaled(struct dma_fence *f)
 {
        struct virtio_gpu_fence *fence = to_virtio_fence(f);
 
@@ -50,26 +50,26 @@ static bool virtio_signaled(struct fence *f)
        return false;
 }
 
-static void virtio_fence_value_str(struct fence *f, char *str, int size)
+static void virtio_fence_value_str(struct dma_fence *f, char *str, int size)
 {
        struct virtio_gpu_fence *fence = to_virtio_fence(f);
 
        snprintf(str, size, "%llu", fence->seq);
 }
 
-static void virtio_timeline_value_str(struct fence *f, char *str, int size)
+static void virtio_timeline_value_str(struct dma_fence *f, char *str, int size)
 {
        struct virtio_gpu_fence *fence = to_virtio_fence(f);
 
        snprintf(str, size, "%llu", (u64)atomic64_read(&fence->drv->last_seq));
 }
 
-static const struct fence_ops virtio_fence_ops = {
+static const struct dma_fence_ops virtio_fence_ops = {
        .get_driver_name     = virtio_get_driver_name,
        .get_timeline_name   = virtio_get_timeline_name,
        .enable_signaling    = virtio_enable_signaling,
        .signaled            = virtio_signaled,
-       .wait                = fence_default_wait,
+       .wait                = dma_fence_default_wait,
        .fence_value_str     = virtio_fence_value_str,
        .timeline_value_str  = virtio_timeline_value_str,
 };
@@ -88,9 +88,9 @@ int virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev,
        spin_lock_irqsave(&drv->lock, irq_flags);
        (*fence)->drv = drv;
        (*fence)->seq = ++drv->sync_seq;
-       fence_init(&(*fence)->f, &virtio_fence_ops, &drv->lock,
-                  drv->context, (*fence)->seq);
-       fence_get(&(*fence)->f);
+       dma_fence_init(&(*fence)->f, &virtio_fence_ops, &drv->lock,
+                      drv->context, (*fence)->seq);
+       dma_fence_get(&(*fence)->f);
        list_add_tail(&(*fence)->node, &drv->fences);
        spin_unlock_irqrestore(&drv->lock, irq_flags);
 
@@ -111,9 +111,9 @@ void virtio_gpu_fence_event_process(struct virtio_gpu_device *vgdev,
        list_for_each_entry_safe(fence, tmp, &drv->fences, node) {
                if (last_seq < fence->seq)
                        continue;
-               fence_signal_locked(&fence->f);
+               dma_fence_signal_locked(&fence->f);
                list_del(&fence->node);
-               fence_put(&fence->f);
+               dma_fence_put(&fence->f);
        }
        spin_unlock_irqrestore(&drv->lock, irq_flags);
 }
index 818478b4c4f0aec5baf5fe737e9dfd9a954afeff..61f3a963af9568bc919ade1987e64f07e6576553 100644 (file)
@@ -172,7 +172,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,
        /* fence the command bo */
        virtio_gpu_unref_list(&validate_list);
        drm_free_large(buflist);
-       fence_put(&fence->f);
+       dma_fence_put(&fence->f);
        return 0;
 
 out_unresv:
@@ -298,7 +298,7 @@ static int virtio_gpu_resource_create_ioctl(struct drm_device *dev, void *data,
                drm_gem_object_release(obj);
                if (vgdev->has_virgl_3d) {
                        virtio_gpu_unref_list(&validate_list);
-                       fence_put(&fence->f);
+                       dma_fence_put(&fence->f);
                }
                return ret;
        }
@@ -309,13 +309,13 @@ static int virtio_gpu_resource_create_ioctl(struct drm_device *dev, void *data,
 
        if (vgdev->has_virgl_3d) {
                virtio_gpu_unref_list(&validate_list);
-               fence_put(&fence->f);
+               dma_fence_put(&fence->f);
        }
        return 0;
 fail_unref:
        if (vgdev->has_virgl_3d) {
                virtio_gpu_unref_list(&validate_list);
-               fence_put(&fence->f);
+               dma_fence_put(&fence->f);
        }
 //fail_obj:
 //     drm_gem_object_handle_unreference_unlocked(obj);
@@ -383,7 +383,7 @@ static int virtio_gpu_transfer_from_host_ioctl(struct drm_device *dev,
        reservation_object_add_excl_fence(qobj->tbo.resv,
                                          &fence->f);
 
-       fence_put(&fence->f);
+       dma_fence_put(&fence->f);
 out_unres:
        virtio_gpu_object_unreserve(qobj);
 out:
@@ -431,7 +431,7 @@ static int virtio_gpu_transfer_to_host_ioctl(struct drm_device *dev, void *data,
                         args->level, &box, &fence);
                reservation_object_add_excl_fence(qobj->tbo.resv,
                                                  &fence->f);
-               fence_put(&fence->f);
+               dma_fence_put(&fence->f);
        }
 
 out_unres:
index 036b0fbae0fb7d2ce57245eb870390df81aa13e5..1235519853f4df79481a0b9c0050c7e15ab1f4e0 100644 (file)
@@ -159,7 +159,7 @@ int virtio_gpu_driver_load(struct drm_device *dev, unsigned long flags)
        virtio_gpu_init_vq(&vgdev->ctrlq, virtio_gpu_dequeue_ctrl_func);
        virtio_gpu_init_vq(&vgdev->cursorq, virtio_gpu_dequeue_cursor_func);
 
-       vgdev->fence_drv.context = fence_context_alloc(1);
+       vgdev->fence_drv.context = dma_fence_context_alloc(1);
        spin_lock_init(&vgdev->fence_drv.lock);
        INIT_LIST_HEAD(&vgdev->fence_drv.fences);
        INIT_LIST_HEAD(&vgdev->cap_cache);
index ba28c0f6f28a352b3f6f030b09be90d76eca6cec..cb75f0663ba0173314e82857cb235b0d646ef97e 100644 (file)
@@ -152,7 +152,7 @@ static void virtio_gpu_cursor_plane_update(struct drm_plane *plane,
                if (!ret) {
                        reservation_object_add_excl_fence(bo->tbo.resv,
                                                          &fence->f);
-                       fence_put(&fence->f);
+                       dma_fence_put(&fence->f);
                        fence = NULL;
                        virtio_gpu_object_unreserve(bo);
                        virtio_gpu_object_wait(bo, false);
index 26ac8e80a4786a674f52fb72792b4d6160416b27..6541dd8b82dc0747433403b64795843a29e0544c 100644 (file)
@@ -108,7 +108,7 @@ fman_from_fence(struct vmw_fence_obj *fence)
  * objects with actions attached to them.
  */
 
-static void vmw_fence_obj_destroy(struct fence *f)
+static void vmw_fence_obj_destroy(struct dma_fence *f)
 {
        struct vmw_fence_obj *fence =
                container_of(f, struct vmw_fence_obj, base);
@@ -123,17 +123,17 @@ static void vmw_fence_obj_destroy(struct fence *f)
        fence->destroy(fence);
 }
 
-static const char *vmw_fence_get_driver_name(struct fence *f)
+static const char *vmw_fence_get_driver_name(struct dma_fence *f)
 {
        return "vmwgfx";
 }
 
-static const char *vmw_fence_get_timeline_name(struct fence *f)
+static const char *vmw_fence_get_timeline_name(struct dma_fence *f)
 {
        return "svga";
 }
 
-static bool vmw_fence_enable_signaling(struct fence *f)
+static bool vmw_fence_enable_signaling(struct dma_fence *f)
 {
        struct vmw_fence_obj *fence =
                container_of(f, struct vmw_fence_obj, base);
@@ -152,12 +152,12 @@ static bool vmw_fence_enable_signaling(struct fence *f)
 }
 
 struct vmwgfx_wait_cb {
-       struct fence_cb base;
+       struct dma_fence_cb base;
        struct task_struct *task;
 };
 
 static void
-vmwgfx_wait_cb(struct fence *fence, struct fence_cb *cb)
+vmwgfx_wait_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
 {
        struct vmwgfx_wait_cb *wait =
                container_of(cb, struct vmwgfx_wait_cb, base);
@@ -167,7 +167,7 @@ vmwgfx_wait_cb(struct fence *fence, struct fence_cb *cb)
 
 static void __vmw_fences_update(struct vmw_fence_manager *fman);
 
-static long vmw_fence_wait(struct fence *f, bool intr, signed long timeout)
+static long vmw_fence_wait(struct dma_fence *f, bool intr, signed long timeout)
 {
        struct vmw_fence_obj *fence =
                container_of(f, struct vmw_fence_obj, base);
@@ -197,7 +197,7 @@ static long vmw_fence_wait(struct fence *f, bool intr, signed long timeout)
 
        while (ret > 0) {
                __vmw_fences_update(fman);
-               if (test_bit(FENCE_FLAG_SIGNALED_BIT, &f->flags))
+               if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &f->flags))
                        break;
 
                if (intr)
@@ -225,7 +225,7 @@ out:
        return ret;
 }
 
-static struct fence_ops vmw_fence_ops = {
+static struct dma_fence_ops vmw_fence_ops = {
        .get_driver_name = vmw_fence_get_driver_name,
        .get_timeline_name = vmw_fence_get_timeline_name,
        .enable_signaling = vmw_fence_enable_signaling,
@@ -298,7 +298,7 @@ struct vmw_fence_manager *vmw_fence_manager_init(struct vmw_private *dev_priv)
        fman->event_fence_action_size =
                ttm_round_pot(sizeof(struct vmw_event_fence_action));
        mutex_init(&fman->goal_irq_mutex);
-       fman->ctx = fence_context_alloc(1);
+       fman->ctx = dma_fence_context_alloc(1);
 
        return fman;
 }
@@ -326,8 +326,8 @@ static int vmw_fence_obj_init(struct vmw_fence_manager *fman,
        unsigned long irq_flags;
        int ret = 0;
 
-       fence_init(&fence->base, &vmw_fence_ops, &fman->lock,
-                  fman->ctx, seqno);
+       dma_fence_init(&fence->base, &vmw_fence_ops, &fman->lock,
+                      fman->ctx, seqno);
        INIT_LIST_HEAD(&fence->seq_passed_actions);
        fence->destroy = destroy;
 
@@ -431,7 +431,7 @@ static bool vmw_fence_goal_check_locked(struct vmw_fence_obj *fence)
        u32 goal_seqno;
        u32 *fifo_mem;
 
-       if (fence_is_signaled_locked(&fence->base))
+       if (dma_fence_is_signaled_locked(&fence->base))
                return false;
 
        fifo_mem = fman->dev_priv->mmio_virt;
@@ -459,7 +459,7 @@ rerun:
        list_for_each_entry_safe(fence, next_fence, &fman->fence_list, head) {
                if (seqno - fence->base.seqno < VMW_FENCE_WRAP) {
                        list_del_init(&fence->head);
-                       fence_signal_locked(&fence->base);
+                       dma_fence_signal_locked(&fence->base);
                        INIT_LIST_HEAD(&action_list);
                        list_splice_init(&fence->seq_passed_actions,
                                         &action_list);
@@ -500,18 +500,18 @@ bool vmw_fence_obj_signaled(struct vmw_fence_obj *fence)
 {
        struct vmw_fence_manager *fman = fman_from_fence(fence);
 
-       if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags))
+       if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->base.flags))
                return 1;
 
        vmw_fences_update(fman);
 
-       return fence_is_signaled(&fence->base);
+       return dma_fence_is_signaled(&fence->base);
 }
 
 int vmw_fence_obj_wait(struct vmw_fence_obj *fence, bool lazy,
                       bool interruptible, unsigned long timeout)
 {
-       long ret = fence_wait_timeout(&fence->base, interruptible, timeout);
+       long ret = dma_fence_wait_timeout(&fence->base, interruptible, timeout);
 
        if (likely(ret > 0))
                return 0;
@@ -530,7 +530,7 @@ void vmw_fence_obj_flush(struct vmw_fence_obj *fence)
 
 static void vmw_fence_destroy(struct vmw_fence_obj *fence)
 {
-       fence_free(&fence->base);
+       dma_fence_free(&fence->base);
 }
 
 int vmw_fence_create(struct vmw_fence_manager *fman,
@@ -669,7 +669,7 @@ void vmw_fence_fifo_down(struct vmw_fence_manager *fman)
                struct vmw_fence_obj *fence =
                        list_entry(fman->fence_list.prev, struct vmw_fence_obj,
                                   head);
-               fence_get(&fence->base);
+               dma_fence_get(&fence->base);
                spin_unlock_irq(&fman->lock);
 
                ret = vmw_fence_obj_wait(fence, false, false,
@@ -677,7 +677,7 @@ void vmw_fence_fifo_down(struct vmw_fence_manager *fman)
 
                if (unlikely(ret != 0)) {
                        list_del_init(&fence->head);
-                       fence_signal(&fence->base);
+                       dma_fence_signal(&fence->base);
                        INIT_LIST_HEAD(&action_list);
                        list_splice_init(&fence->seq_passed_actions,
                                         &action_list);
@@ -685,7 +685,7 @@ void vmw_fence_fifo_down(struct vmw_fence_manager *fman)
                }
 
                BUG_ON(!list_empty(&fence->head));
-               fence_put(&fence->base);
+               dma_fence_put(&fence->base);
                spin_lock_irq(&fman->lock);
        }
        spin_unlock_irq(&fman->lock);
@@ -884,7 +884,7 @@ static void vmw_fence_obj_add_action(struct vmw_fence_obj *fence,
        spin_lock_irqsave(&fman->lock, irq_flags);
 
        fman->pending_actions[action->type]++;
-       if (fence_is_signaled_locked(&fence->base)) {
+       if (dma_fence_is_signaled_locked(&fence->base)) {
                struct list_head action_list;
 
                INIT_LIST_HEAD(&action_list);
index 83ae301ee14181630f36faf6e711d1dffac240c0..d9d85aa6ed2048a96e1ae0df0637b25161b74132 100644 (file)
@@ -27,7 +27,7 @@
 
 #ifndef _VMWGFX_FENCE_H_
 
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 
 #define VMW_FENCE_WAIT_TIMEOUT (5*HZ)
 
@@ -52,7 +52,7 @@ struct vmw_fence_action {
 };
 
 struct vmw_fence_obj {
-       struct fence base;
+       struct dma_fence base;
 
        struct list_head head;
        struct list_head seq_passed_actions;
@@ -71,14 +71,14 @@ vmw_fence_obj_unreference(struct vmw_fence_obj **fence_p)
 
        *fence_p = NULL;
        if (fence)
-               fence_put(&fence->base);
+               dma_fence_put(&fence->base);
 }
 
 static inline struct vmw_fence_obj *
 vmw_fence_obj_reference(struct vmw_fence_obj *fence)
 {
        if (fence)
-               fence_get(&fence->base);
+               dma_fence_get(&fence->base);
        return fence;
 }
 
index 1a85fb2d4dc68495a7492461adf109279e52759f..8e86d6d4141b2931361e7b15891d57d92a4dcea5 100644 (file)
@@ -1454,7 +1454,7 @@ void vmw_fence_single_bo(struct ttm_buffer_object *bo,
        if (fence == NULL) {
                vmw_execbuf_fence_commands(NULL, dev_priv, &fence, NULL);
                reservation_object_add_excl_fence(bo->resv, &fence->base);
-               fence_put(&fence->base);
+               dma_fence_put(&fence->base);
        } else
                reservation_object_add_excl_fence(bo->resv, &fence->base);
 }
index 672644031bd5145bd6335f76246adfa9678a7371..e336e3901876deefc983bd5b2db731f71bdd6847 100644 (file)
@@ -57,7 +57,7 @@
 #include <linux/types.h>
 #include <linux/vmalloc.h>
 #include <linux/workqueue.h>
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 
 #include <asm/mman.h>
 #include <asm/pgalloc.h>
@@ -362,7 +362,7 @@ struct drm_ioctl_desc {
 struct drm_pending_event {
        struct completion *completion;
        struct drm_event *event;
-       struct fence *fence;
+       struct dma_fence *fence;
        struct list_head link;
        struct list_head pending_link;
        struct drm_file *file_priv;
index bc860cfc67ca8d0bbb948d02fad02b14983abbed..fa1aa214c8ead600fcffa6f8a384da71e5bee5a8 100644 (file)
@@ -54,7 +54,7 @@ struct drm_mode_set;
 struct drm_file;
 struct drm_clip_rect;
 struct device_node;
-struct fence;
+struct dma_fence;
 struct edid;
 
 static inline int64_t U642I64(uint64_t val)
index 98b39d66eb32b1610ac38e0a447d2320f4c0e711..c5e8a0df1623379b1bdb9818fee2afd29af0d93e 100644 (file)
@@ -59,7 +59,7 @@ struct drm_plane_state {
 
        struct drm_crtc *crtc;   /* do not write directly, use drm_atomic_set_crtc_for_plane() */
        struct drm_framebuffer *fb;  /* do not write directly, use drm_atomic_set_fb_for_plane() */
-       struct fence *fence;
+       struct dma_fence *fence;
 
        /* Signed dest location allows it to be partially off screen */
        int32_t crtc_x, crtc_y;
index 9eb940d6755feba2163526cefc2ef230a6d4ea69..5beae7969bf73a5a05e8f9a2f4d63239230a5944 100644 (file)
@@ -209,7 +209,7 @@ struct ttm_buffer_object {
         * Members protected by a bo reservation.
         */
 
-       struct fence *moving;
+       struct dma_fence *moving;
 
        struct drm_vma_offset_node vma_node;
 
index 4f0a92185995db9b52d2062d2eecf1d1b80c3abb..27e9c26c91504c03e21bc0613775aaef9d4f7d8f 100644 (file)
@@ -303,7 +303,7 @@ struct ttm_mem_type_manager {
        /*
         * Protected by @move_lock.
         */
-       struct fence *move;
+       struct dma_fence *move;
 };
 
 /**
@@ -1025,7 +1025,7 @@ extern void ttm_bo_free_old_node(struct ttm_buffer_object *bo);
  */
 
 extern int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
-                                    struct fence *fence, bool evict,
+                                    struct dma_fence *fence, bool evict,
                                     struct ttm_mem_reg *new_mem);
 
 /**
@@ -1040,7 +1040,7 @@ extern int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
  * immediately or hang it on a temporary buffer object.
  */
 int ttm_bo_pipeline_move(struct ttm_buffer_object *bo,
-                        struct fence *fence, bool evict,
+                        struct dma_fence *fence, bool evict,
                         struct ttm_mem_reg *new_mem);
 
 /**
index b620c317c7720a27127ca3fd3c54e67e374652ce..47f35b8e6d09249732bd0037b374d58a56b49c75 100644 (file)
@@ -114,6 +114,6 @@ extern int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
 
 extern void ttm_eu_fence_buffer_objects(struct ww_acquire_ctx *ticket,
                                        struct list_head *list,
-                                       struct fence *fence);
+                                       struct dma_fence *fence);
 
 #endif
index e0b0741ae67199d48045d97a0adbffdab1c894ca..8daeb3ce00163c1487def6fc39a78b1fcd2e1b40 100644 (file)
@@ -30,7 +30,7 @@
 #include <linux/list.h>
 #include <linux/dma-mapping.h>
 #include <linux/fs.h>
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 #include <linux/wait.h>
 
 struct device;
@@ -143,7 +143,7 @@ struct dma_buf {
        wait_queue_head_t poll;
 
        struct dma_buf_poll_cb_t {
-               struct fence_cb cb;
+               struct dma_fence_cb cb;
                wait_queue_head_t *poll;
 
                unsigned long active;
diff --git a/include/linux/dma-fence-array.h b/include/linux/dma-fence-array.h
new file mode 100644 (file)
index 0000000..5900945
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * fence-array: aggregates fence to be waited together
+ *
+ * Copyright (C) 2016 Collabora Ltd
+ * Copyright (C) 2016 Advanced Micro Devices, Inc.
+ * Authors:
+ *     Gustavo Padovan <gustavo@padovan.org>
+ *     Christian König <christian.koenig@amd.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ */
+
+#ifndef __LINUX_DMA_FENCE_ARRAY_H
+#define __LINUX_DMA_FENCE_ARRAY_H
+
+#include <linux/dma-fence.h>
+
+/**
+ * struct dma_fence_array_cb - callback helper for fence array
+ * @cb: fence callback structure for signaling
+ * @array: reference to the parent fence array object
+ */
+struct dma_fence_array_cb {
+       struct dma_fence_cb cb;
+       struct dma_fence_array *array;
+};
+
+/**
+ * struct dma_fence_array - fence to represent an array of fences
+ * @base: fence base class
+ * @lock: spinlock for fence handling
+ * @num_fences: number of fences in the array
+ * @num_pending: fences in the array still pending
+ * @fences: array of the fences
+ */
+struct dma_fence_array {
+       struct dma_fence base;
+
+       spinlock_t lock;
+       unsigned num_fences;
+       atomic_t num_pending;
+       struct dma_fence **fences;
+};
+
+extern const struct dma_fence_ops dma_fence_array_ops;
+
+/**
+ * dma_fence_is_array - check if a fence is from the array subsclass
+ * @fence: fence to test
+ *
+ * Return true if it is a dma_fence_array and false otherwise.
+ */
+static inline bool dma_fence_is_array(struct dma_fence *fence)
+{
+       return fence->ops == &dma_fence_array_ops;
+}
+
+/**
+ * to_dma_fence_array - cast a fence to a dma_fence_array
+ * @fence: fence to cast to a dma_fence_array
+ *
+ * Returns NULL if the fence is not a dma_fence_array,
+ * or the dma_fence_array otherwise.
+ */
+static inline struct dma_fence_array *
+to_dma_fence_array(struct dma_fence *fence)
+{
+       if (fence->ops != &dma_fence_array_ops)
+               return NULL;
+
+       return container_of(fence, struct dma_fence_array, base);
+}
+
+struct dma_fence_array *dma_fence_array_create(int num_fences,
+                                              struct dma_fence **fences,
+                                              u64 context, unsigned seqno,
+                                              bool signal_on_any);
+
+#endif /* __LINUX_DMA_FENCE_ARRAY_H */
diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
new file mode 100644 (file)
index 0000000..ba60c04
--- /dev/null
@@ -0,0 +1,437 @@
+/*
+ * Fence mechanism for dma-buf to allow for asynchronous dma access
+ *
+ * Copyright (C) 2012 Canonical Ltd
+ * Copyright (C) 2012 Texas Instruments
+ *
+ * Authors:
+ * Rob Clark <robdclark@gmail.com>
+ * Maarten Lankhorst <maarten.lankhorst@canonical.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ */
+
+#ifndef __LINUX_DMA_FENCE_H
+#define __LINUX_DMA_FENCE_H
+
+#include <linux/err.h>
+#include <linux/wait.h>
+#include <linux/list.h>
+#include <linux/bitops.h>
+#include <linux/kref.h>
+#include <linux/sched.h>
+#include <linux/printk.h>
+#include <linux/rcupdate.h>
+
+struct dma_fence;
+struct dma_fence_ops;
+struct dma_fence_cb;
+
+/**
+ * struct dma_fence - software synchronization primitive
+ * @refcount: refcount for this fence
+ * @ops: dma_fence_ops associated with this fence
+ * @rcu: used for releasing fence with kfree_rcu
+ * @cb_list: list of all callbacks to call
+ * @lock: spin_lock_irqsave used for locking
+ * @context: execution context this fence belongs to, returned by
+ *           dma_fence_context_alloc()
+ * @seqno: the sequence number of this fence inside the execution context,
+ * can be compared to decide which fence would be signaled later.
+ * @flags: A mask of DMA_FENCE_FLAG_* defined below
+ * @timestamp: Timestamp when the fence was signaled.
+ * @status: Optional, only valid if < 0, must be set before calling
+ * dma_fence_signal, indicates that the fence has completed with an error.
+ *
+ * the flags member must be manipulated and read using the appropriate
+ * atomic ops (bit_*), so taking the spinlock will not be needed most
+ * of the time.
+ *
+ * DMA_FENCE_FLAG_SIGNALED_BIT - fence is already signaled
+ * DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT - enable_signaling might have been called
+ * DMA_FENCE_FLAG_USER_BITS - start of the unused bits, can be used by the
+ * implementer of the fence for its own purposes. Can be used in different
+ * ways by different fence implementers, so do not rely on this.
+ *
+ * Since atomic bitops are used, this is not guaranteed to be the case.
+ * Particularly, if the bit was set, but dma_fence_signal was called right
+ * before this bit was set, it would have been able to set the
+ * DMA_FENCE_FLAG_SIGNALED_BIT, before enable_signaling was called.
+ * Adding a check for DMA_FENCE_FLAG_SIGNALED_BIT after setting
+ * DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT closes this race, and makes sure that
+ * after dma_fence_signal was called, any enable_signaling call will have either
+ * been completed, or never called at all.
+ */
+struct dma_fence {
+       struct kref refcount;
+       const struct dma_fence_ops *ops;
+       struct rcu_head rcu;
+       struct list_head cb_list;
+       spinlock_t *lock;
+       u64 context;
+       unsigned seqno;
+       unsigned long flags;
+       ktime_t timestamp;
+       int status;
+};
+
+enum dma_fence_flag_bits {
+       DMA_FENCE_FLAG_SIGNALED_BIT,
+       DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
+       DMA_FENCE_FLAG_USER_BITS, /* must always be last member */
+};
+
+typedef void (*dma_fence_func_t)(struct dma_fence *fence,
+                                struct dma_fence_cb *cb);
+
+/**
+ * struct dma_fence_cb - callback for dma_fence_add_callback
+ * @node: used by dma_fence_add_callback to append this struct to fence::cb_list
+ * @func: dma_fence_func_t to call
+ *
+ * This struct will be initialized by dma_fence_add_callback, additional
+ * data can be passed along by embedding dma_fence_cb in another struct.
+ */
+struct dma_fence_cb {
+       struct list_head node;
+       dma_fence_func_t func;
+};
+
+/**
+ * struct dma_fence_ops - operations implemented for fence
+ * @get_driver_name: returns the driver name.
+ * @get_timeline_name: return the name of the context this fence belongs to.
+ * @enable_signaling: enable software signaling of fence.
+ * @signaled: [optional] peek whether the fence is signaled, can be null.
+ * @wait: custom wait implementation, or dma_fence_default_wait.
+ * @release: [optional] called on destruction of fence, can be null
+ * @fill_driver_data: [optional] callback to fill in free-form debug info
+ * Returns amount of bytes filled, or -errno.
+ * @fence_value_str: [optional] fills in the value of the fence as a string
+ * @timeline_value_str: [optional] fills in the current value of the timeline
+ * as a string
+ *
+ * Notes on enable_signaling:
+ * For fence implementations that have the capability for hw->hw
+ * signaling, they can implement this op to enable the necessary
+ * irqs, or insert commands into cmdstream, etc.  This is called
+ * in the first wait() or add_callback() path to let the fence
+ * implementation know that there is another driver waiting on
+ * the signal (ie. hw->sw case).
+ *
+ * This function can be called called from atomic context, but not
+ * from irq context, so normal spinlocks can be used.
+ *
+ * A return value of false indicates the fence already passed,
+ * or some failure occurred that made it impossible to enable
+ * signaling. True indicates successful enabling.
+ *
+ * fence->status may be set in enable_signaling, but only when false is
+ * returned.
+ *
+ * Calling dma_fence_signal before enable_signaling is called allows
+ * for a tiny race window in which enable_signaling is called during,
+ * before, or after dma_fence_signal. To fight this, it is recommended
+ * that before enable_signaling returns true an extra reference is
+ * taken on the fence, to be released when the fence is signaled.
+ * This will mean dma_fence_signal will still be called twice, but
+ * the second time will be a noop since it was already signaled.
+ *
+ * Notes on signaled:
+ * May set fence->status if returning true.
+ *
+ * Notes on wait:
+ * Must not be NULL, set to dma_fence_default_wait for default implementation.
+ * the dma_fence_default_wait implementation should work for any fence, as long
+ * as enable_signaling works correctly.
+ *
+ * Must return -ERESTARTSYS if the wait is intr = true and the wait was
+ * interrupted, and remaining jiffies if fence has signaled, or 0 if wait
+ * timed out. Can also return other error values on custom implementations,
+ * which should be treated as if the fence is signaled. For example a hardware
+ * lockup could be reported like that.
+ *
+ * Notes on release:
+ * Can be NULL, this function allows additional commands to run on
+ * destruction of the fence. Can be called from irq context.
+ * If pointer is set to NULL, kfree will get called instead.
+ */
+
+struct dma_fence_ops {
+       const char * (*get_driver_name)(struct dma_fence *fence);
+       const char * (*get_timeline_name)(struct dma_fence *fence);
+       bool (*enable_signaling)(struct dma_fence *fence);
+       bool (*signaled)(struct dma_fence *fence);
+       signed long (*wait)(struct dma_fence *fence,
+                           bool intr, signed long timeout);
+       void (*release)(struct dma_fence *fence);
+
+       int (*fill_driver_data)(struct dma_fence *fence, void *data, int size);
+       void (*fence_value_str)(struct dma_fence *fence, char *str, int size);
+       void (*timeline_value_str)(struct dma_fence *fence,
+                                  char *str, int size);
+};
+
+void dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops,
+                   spinlock_t *lock, u64 context, unsigned seqno);
+
+void dma_fence_release(struct kref *kref);
+void dma_fence_free(struct dma_fence *fence);
+
+/**
+ * dma_fence_put - decreases refcount of the fence
+ * @fence:     [in]    fence to reduce refcount of
+ */
+static inline void dma_fence_put(struct dma_fence *fence)
+{
+       if (fence)
+               kref_put(&fence->refcount, dma_fence_release);
+}
+
+/**
+ * dma_fence_get - increases refcount of the fence
+ * @fence:     [in]    fence to increase refcount of
+ *
+ * Returns the same fence, with refcount increased by 1.
+ */
+static inline struct dma_fence *dma_fence_get(struct dma_fence *fence)
+{
+       if (fence)
+               kref_get(&fence->refcount);
+       return fence;
+}
+
+/**
+ * dma_fence_get_rcu - get a fence from a reservation_object_list with
+ *                     rcu read lock
+ * @fence:     [in]    fence to increase refcount of
+ *
+ * Function returns NULL if no refcount could be obtained, or the fence.
+ */
+static inline struct dma_fence *dma_fence_get_rcu(struct dma_fence *fence)
+{
+       if (kref_get_unless_zero(&fence->refcount))
+               return fence;
+       else
+               return NULL;
+}
+
+/**
+ * dma_fence_get_rcu_safe  - acquire a reference to an RCU tracked fence
+ * @fence:     [in]    pointer to fence to increase refcount of
+ *
+ * Function returns NULL if no refcount could be obtained, or the fence.
+ * This function handles acquiring a reference to a fence that may be
+ * reallocated within the RCU grace period (such as with SLAB_DESTROY_BY_RCU),
+ * so long as the caller is using RCU on the pointer to the fence.
+ *
+ * An alternative mechanism is to employ a seqlock to protect a bunch of
+ * fences, such as used by struct reservation_object. When using a seqlock,
+ * the seqlock must be taken before and checked after a reference to the
+ * fence is acquired (as shown here).
+ *
+ * The caller is required to hold the RCU read lock.
+ */
+static inline struct dma_fence *
+dma_fence_get_rcu_safe(struct dma_fence * __rcu *fencep)
+{
+       do {
+               struct dma_fence *fence;
+
+               fence = rcu_dereference(*fencep);
+               if (!fence || !dma_fence_get_rcu(fence))
+                       return NULL;
+
+               /* The atomic_inc_not_zero() inside dma_fence_get_rcu()
+                * provides a full memory barrier upon success (such as now).
+                * This is paired with the write barrier from assigning
+                * to the __rcu protected fence pointer so that if that
+                * pointer still matches the current fence, we know we
+                * have successfully acquire a reference to it. If it no
+                * longer matches, we are holding a reference to some other
+                * reallocated pointer. This is possible if the allocator
+                * is using a freelist like SLAB_DESTROY_BY_RCU where the
+                * fence remains valid for the RCU grace period, but it
+                * may be reallocated. When using such allocators, we are
+                * responsible for ensuring the reference we get is to
+                * the right fence, as below.
+                */
+               if (fence == rcu_access_pointer(*fencep))
+                       return rcu_pointer_handoff(fence);
+
+               dma_fence_put(fence);
+       } while (1);
+}
+
+int dma_fence_signal(struct dma_fence *fence);
+int dma_fence_signal_locked(struct dma_fence *fence);
+signed long dma_fence_default_wait(struct dma_fence *fence,
+                                  bool intr, signed long timeout);
+int dma_fence_add_callback(struct dma_fence *fence,
+                          struct dma_fence_cb *cb,
+                          dma_fence_func_t func);
+bool dma_fence_remove_callback(struct dma_fence *fence,
+                              struct dma_fence_cb *cb);
+void dma_fence_enable_sw_signaling(struct dma_fence *fence);
+
+/**
+ * dma_fence_is_signaled_locked - Return an indication if the fence
+ *                                is signaled yet.
+ * @fence:     [in]    the fence to check
+ *
+ * Returns true if the fence was already signaled, false if not. Since this
+ * function doesn't enable signaling, it is not guaranteed to ever return
+ * true if dma_fence_add_callback, dma_fence_wait or
+ * dma_fence_enable_sw_signaling haven't been called before.
+ *
+ * This function requires fence->lock to be held.
+ */
+static inline bool
+dma_fence_is_signaled_locked(struct dma_fence *fence)
+{
+       if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
+               return true;
+
+       if (fence->ops->signaled && fence->ops->signaled(fence)) {
+               dma_fence_signal_locked(fence);
+               return true;
+       }
+
+       return false;
+}
+
+/**
+ * dma_fence_is_signaled - Return an indication if the fence is signaled yet.
+ * @fence:     [in]    the fence to check
+ *
+ * Returns true if the fence was already signaled, false if not. Since this
+ * function doesn't enable signaling, it is not guaranteed to ever return
+ * true if dma_fence_add_callback, dma_fence_wait or
+ * dma_fence_enable_sw_signaling haven't been called before.
+ *
+ * It's recommended for seqno fences to call dma_fence_signal when the
+ * operation is complete, it makes it possible to prevent issues from
+ * wraparound between time of issue and time of use by checking the return
+ * value of this function before calling hardware-specific wait instructions.
+ */
+static inline bool
+dma_fence_is_signaled(struct dma_fence *fence)
+{
+       if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
+               return true;
+
+       if (fence->ops->signaled && fence->ops->signaled(fence)) {
+               dma_fence_signal(fence);
+               return true;
+       }
+
+       return false;
+}
+
+/**
+ * dma_fence_is_later - return if f1 is chronologically later than f2
+ * @f1:        [in]    the first fence from the same context
+ * @f2:        [in]    the second fence from the same context
+ *
+ * Returns true if f1 is chronologically later than f2. Both fences must be
+ * from the same context, since a seqno is not re-used across contexts.
+ */
+static inline bool dma_fence_is_later(struct dma_fence *f1,
+                                     struct dma_fence *f2)
+{
+       if (WARN_ON(f1->context != f2->context))
+               return false;
+
+       return (int)(f1->seqno - f2->seqno) > 0;
+}
+
+/**
+ * dma_fence_later - return the chronologically later fence
+ * @f1:        [in]    the first fence from the same context
+ * @f2:        [in]    the second fence from the same context
+ *
+ * Returns NULL if both fences are signaled, otherwise the fence that would be
+ * signaled last. Both fences must be from the same context, since a seqno is
+ * not re-used across contexts.
+ */
+static inline struct dma_fence *dma_fence_later(struct dma_fence *f1,
+                                               struct dma_fence *f2)
+{
+       if (WARN_ON(f1->context != f2->context))
+               return NULL;
+
+       /*
+        * Can't check just DMA_FENCE_FLAG_SIGNALED_BIT here, it may never
+        * have been set if enable_signaling wasn't called, and enabling that
+        * here is overkill.
+        */
+       if (dma_fence_is_later(f1, f2))
+               return dma_fence_is_signaled(f1) ? NULL : f1;
+       else
+               return dma_fence_is_signaled(f2) ? NULL : f2;
+}
+
+signed long dma_fence_wait_timeout(struct dma_fence *,
+                                  bool intr, signed long timeout);
+signed long dma_fence_wait_any_timeout(struct dma_fence **fences,
+                                      uint32_t count,
+                                      bool intr, signed long timeout);
+
+/**
+ * dma_fence_wait - sleep until the fence gets signaled
+ * @fence:     [in]    the fence to wait on
+ * @intr:      [in]    if true, do an interruptible wait
+ *
+ * This function will return -ERESTARTSYS if interrupted by a signal,
+ * or 0 if the fence was signaled. Other error values may be
+ * returned on custom implementations.
+ *
+ * Performs a synchronous wait on this fence. It is assumed the caller
+ * directly or indirectly holds a reference to the fence, otherwise the
+ * fence might be freed before return, resulting in undefined behavior.
+ */
+static inline signed long dma_fence_wait(struct dma_fence *fence, bool intr)
+{
+       signed long ret;
+
+       /* Since dma_fence_wait_timeout cannot timeout with
+        * MAX_SCHEDULE_TIMEOUT, only valid return values are
+        * -ERESTARTSYS and MAX_SCHEDULE_TIMEOUT.
+        */
+       ret = dma_fence_wait_timeout(fence, intr, MAX_SCHEDULE_TIMEOUT);
+
+       return ret < 0 ? ret : 0;
+}
+
+u64 dma_fence_context_alloc(unsigned num);
+
+#define DMA_FENCE_TRACE(f, fmt, args...) \
+       do {                                                            \
+               struct dma_fence *__ff = (f);                           \
+               if (IS_ENABLED(CONFIG_DMA_FENCE_TRACE))                 \
+                       pr_info("f %llu#%u: " fmt,                      \
+                               __ff->context, __ff->seqno, ##args);    \
+       } while (0)
+
+#define DMA_FENCE_WARN(f, fmt, args...) \
+       do {                                                            \
+               struct dma_fence *__ff = (f);                           \
+               pr_warn("f %llu#%u: " fmt, __ff->context, __ff->seqno,  \
+                        ##args);                                       \
+       } while (0)
+
+#define DMA_FENCE_ERR(f, fmt, args...) \
+       do {                                                            \
+               struct dma_fence *__ff = (f);                           \
+               pr_err("f %llu#%u: " fmt, __ff->context, __ff->seqno,   \
+                       ##args);                                        \
+       } while (0)
+
+#endif /* __LINUX_DMA_FENCE_H */
diff --git a/include/linux/fence-array.h b/include/linux/fence-array.h
deleted file mode 100644 (file)
index 9ea2bde..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * fence-array: aggregates fence to be waited together
- *
- * Copyright (C) 2016 Collabora Ltd
- * Copyright (C) 2016 Advanced Micro Devices, Inc.
- * Authors:
- *     Gustavo Padovan <gustavo@padovan.org>
- *     Christian König <christian.koenig@amd.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- */
-
-#ifndef __LINUX_FENCE_ARRAY_H
-#define __LINUX_FENCE_ARRAY_H
-
-#include <linux/fence.h>
-
-/**
- * struct fence_array_cb - callback helper for fence array
- * @cb: fence callback structure for signaling
- * @array: reference to the parent fence array object
- */
-struct fence_array_cb {
-       struct fence_cb cb;
-       struct fence_array *array;
-};
-
-/**
- * struct fence_array - fence to represent an array of fences
- * @base: fence base class
- * @lock: spinlock for fence handling
- * @num_fences: number of fences in the array
- * @num_pending: fences in the array still pending
- * @fences: array of the fences
- */
-struct fence_array {
-       struct fence base;
-
-       spinlock_t lock;
-       unsigned num_fences;
-       atomic_t num_pending;
-       struct fence **fences;
-};
-
-extern const struct fence_ops fence_array_ops;
-
-/**
- * fence_is_array - check if a fence is from the array subsclass
- * @fence: fence to test
- *
- * Return true if it is a fence_array and false otherwise.
- */
-static inline bool fence_is_array(struct fence *fence)
-{
-       return fence->ops == &fence_array_ops;
-}
-
-/**
- * to_fence_array - cast a fence to a fence_array
- * @fence: fence to cast to a fence_array
- *
- * Returns NULL if the fence is not a fence_array,
- * or the fence_array otherwise.
- */
-static inline struct fence_array *to_fence_array(struct fence *fence)
-{
-       if (fence->ops != &fence_array_ops)
-               return NULL;
-
-       return container_of(fence, struct fence_array, base);
-}
-
-struct fence_array *fence_array_create(int num_fences, struct fence **fences,
-                                      u64 context, unsigned seqno,
-                                      bool signal_on_any);
-
-#endif /* __LINUX_FENCE_ARRAY_H */
diff --git a/include/linux/fence.h b/include/linux/fence.h
deleted file mode 100644 (file)
index c9c5ba9..0000000
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * Fence mechanism for dma-buf to allow for asynchronous dma access
- *
- * Copyright (C) 2012 Canonical Ltd
- * Copyright (C) 2012 Texas Instruments
- *
- * Authors:
- * Rob Clark <robdclark@gmail.com>
- * Maarten Lankhorst <maarten.lankhorst@canonical.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- */
-
-#ifndef __LINUX_FENCE_H
-#define __LINUX_FENCE_H
-
-#include <linux/err.h>
-#include <linux/wait.h>
-#include <linux/list.h>
-#include <linux/bitops.h>
-#include <linux/kref.h>
-#include <linux/sched.h>
-#include <linux/printk.h>
-#include <linux/rcupdate.h>
-
-struct fence;
-struct fence_ops;
-struct fence_cb;
-
-/**
- * struct fence - software synchronization primitive
- * @refcount: refcount for this fence
- * @ops: fence_ops associated with this fence
- * @rcu: used for releasing fence with kfree_rcu
- * @cb_list: list of all callbacks to call
- * @lock: spin_lock_irqsave used for locking
- * @context: execution context this fence belongs to, returned by
- *           fence_context_alloc()
- * @seqno: the sequence number of this fence inside the execution context,
- * can be compared to decide which fence would be signaled later.
- * @flags: A mask of FENCE_FLAG_* defined below
- * @timestamp: Timestamp when the fence was signaled.
- * @status: Optional, only valid if < 0, must be set before calling
- * fence_signal, indicates that the fence has completed with an error.
- *
- * the flags member must be manipulated and read using the appropriate
- * atomic ops (bit_*), so taking the spinlock will not be needed most
- * of the time.
- *
- * FENCE_FLAG_SIGNALED_BIT - fence is already signaled
- * FENCE_FLAG_ENABLE_SIGNAL_BIT - enable_signaling might have been called*
- * FENCE_FLAG_USER_BITS - start of the unused bits, can be used by the
- * implementer of the fence for its own purposes. Can be used in different
- * ways by different fence implementers, so do not rely on this.
- *
- * Since atomic bitops are used, this is not guaranteed to be the case.
- * Particularly, if the bit was set, but fence_signal was called right
- * before this bit was set, it would have been able to set the
- * FENCE_FLAG_SIGNALED_BIT, before enable_signaling was called.
- * Adding a check for FENCE_FLAG_SIGNALED_BIT after setting
- * FENCE_FLAG_ENABLE_SIGNAL_BIT closes this race, and makes sure that
- * after fence_signal was called, any enable_signaling call will have either
- * been completed, or never called at all.
- */
-struct fence {
-       struct kref refcount;
-       const struct fence_ops *ops;
-       struct rcu_head rcu;
-       struct list_head cb_list;
-       spinlock_t *lock;
-       u64 context;
-       unsigned seqno;
-       unsigned long flags;
-       ktime_t timestamp;
-       int status;
-};
-
-enum fence_flag_bits {
-       FENCE_FLAG_SIGNALED_BIT,
-       FENCE_FLAG_ENABLE_SIGNAL_BIT,
-       FENCE_FLAG_USER_BITS, /* must always be last member */
-};
-
-typedef void (*fence_func_t)(struct fence *fence, struct fence_cb *cb);
-
-/**
- * struct fence_cb - callback for fence_add_callback
- * @node: used by fence_add_callback to append this struct to fence::cb_list
- * @func: fence_func_t to call
- *
- * This struct will be initialized by fence_add_callback, additional
- * data can be passed along by embedding fence_cb in another struct.
- */
-struct fence_cb {
-       struct list_head node;
-       fence_func_t func;
-};
-
-/**
- * struct fence_ops - operations implemented for fence
- * @get_driver_name: returns the driver name.
- * @get_timeline_name: return the name of the context this fence belongs to.
- * @enable_signaling: enable software signaling of fence.
- * @signaled: [optional] peek whether the fence is signaled, can be null.
- * @wait: custom wait implementation, or fence_default_wait.
- * @release: [optional] called on destruction of fence, can be null
- * @fill_driver_data: [optional] callback to fill in free-form debug info
- * Returns amount of bytes filled, or -errno.
- * @fence_value_str: [optional] fills in the value of the fence as a string
- * @timeline_value_str: [optional] fills in the current value of the timeline
- * as a string
- *
- * Notes on enable_signaling:
- * For fence implementations that have the capability for hw->hw
- * signaling, they can implement this op to enable the necessary
- * irqs, or insert commands into cmdstream, etc.  This is called
- * in the first wait() or add_callback() path to let the fence
- * implementation know that there is another driver waiting on
- * the signal (ie. hw->sw case).
- *
- * This function can be called called from atomic context, but not
- * from irq context, so normal spinlocks can be used.
- *
- * A return value of false indicates the fence already passed,
- * or some failure occurred that made it impossible to enable
- * signaling. True indicates successful enabling.
- *
- * fence->status may be set in enable_signaling, but only when false is
- * returned.
- *
- * Calling fence_signal before enable_signaling is called allows
- * for a tiny race window in which enable_signaling is called during,
- * before, or after fence_signal. To fight this, it is recommended
- * that before enable_signaling returns true an extra reference is
- * taken on the fence, to be released when the fence is signaled.
- * This will mean fence_signal will still be called twice, but
- * the second time will be a noop since it was already signaled.
- *
- * Notes on signaled:
- * May set fence->status if returning true.
- *
- * Notes on wait:
- * Must not be NULL, set to fence_default_wait for default implementation.
- * the fence_default_wait implementation should work for any fence, as long
- * as enable_signaling works correctly.
- *
- * Must return -ERESTARTSYS if the wait is intr = true and the wait was
- * interrupted, and remaining jiffies if fence has signaled, or 0 if wait
- * timed out. Can also return other error values on custom implementations,
- * which should be treated as if the fence is signaled. For example a hardware
- * lockup could be reported like that.
- *
- * Notes on release:
- * Can be NULL, this function allows additional commands to run on
- * destruction of the fence. Can be called from irq context.
- * If pointer is set to NULL, kfree will get called instead.
- */
-
-struct fence_ops {
-       const char * (*get_driver_name)(struct fence *fence);
-       const char * (*get_timeline_name)(struct fence *fence);
-       bool (*enable_signaling)(struct fence *fence);
-       bool (*signaled)(struct fence *fence);
-       signed long (*wait)(struct fence *fence, bool intr, signed long timeout);
-       void (*release)(struct fence *fence);
-
-       int (*fill_driver_data)(struct fence *fence, void *data, int size);
-       void (*fence_value_str)(struct fence *fence, char *str, int size);
-       void (*timeline_value_str)(struct fence *fence, char *str, int size);
-};
-
-void fence_init(struct fence *fence, const struct fence_ops *ops,
-               spinlock_t *lock, u64 context, unsigned seqno);
-
-void fence_release(struct kref *kref);
-void fence_free(struct fence *fence);
-
-/**
- * fence_put - decreases refcount of the fence
- * @fence:     [in]    fence to reduce refcount of
- */
-static inline void fence_put(struct fence *fence)
-{
-       if (fence)
-               kref_put(&fence->refcount, fence_release);
-}
-
-/**
- * fence_get - increases refcount of the fence
- * @fence:     [in]    fence to increase refcount of
- *
- * Returns the same fence, with refcount increased by 1.
- */
-static inline struct fence *fence_get(struct fence *fence)
-{
-       if (fence)
-               kref_get(&fence->refcount);
-       return fence;
-}
-
-/**
- * fence_get_rcu - get a fence from a reservation_object_list with rcu read lock
- * @fence:     [in]    fence to increase refcount of
- *
- * Function returns NULL if no refcount could be obtained, or the fence.
- */
-static inline struct fence *fence_get_rcu(struct fence *fence)
-{
-       if (kref_get_unless_zero(&fence->refcount))
-               return fence;
-       else
-               return NULL;
-}
-
-/**
- * fence_get_rcu_safe  - acquire a reference to an RCU tracked fence
- * @fence:     [in]    pointer to fence to increase refcount of
- *
- * Function returns NULL if no refcount could be obtained, or the fence.
- * This function handles acquiring a reference to a fence that may be
- * reallocated within the RCU grace period (such as with SLAB_DESTROY_BY_RCU),
- * so long as the caller is using RCU on the pointer to the fence.
- *
- * An alternative mechanism is to employ a seqlock to protect a bunch of
- * fences, such as used by struct reservation_object. When using a seqlock,
- * the seqlock must be taken before and checked after a reference to the
- * fence is acquired (as shown here).
- *
- * The caller is required to hold the RCU read lock.
- */
-static inline struct fence *fence_get_rcu_safe(struct fence * __rcu *fencep)
-{
-       do {
-               struct fence *fence;
-
-               fence = rcu_dereference(*fencep);
-               if (!fence || !fence_get_rcu(fence))
-                       return NULL;
-
-               /* The atomic_inc_not_zero() inside fence_get_rcu()
-                * provides a full memory barrier upon success (such as now).
-                * This is paired with the write barrier from assigning
-                * to the __rcu protected fence pointer so that if that
-                * pointer still matches the current fence, we know we
-                * have successfully acquire a reference to it. If it no
-                * longer matches, we are holding a reference to some other
-                * reallocated pointer. This is possible if the allocator
-                * is using a freelist like SLAB_DESTROY_BY_RCU where the
-                * fence remains valid for the RCU grace period, but it
-                * may be reallocated. When using such allocators, we are
-                * responsible for ensuring the reference we get is to
-                * the right fence, as below.
-                */
-               if (fence == rcu_access_pointer(*fencep))
-                       return rcu_pointer_handoff(fence);
-
-               fence_put(fence);
-       } while (1);
-}
-
-int fence_signal(struct fence *fence);
-int fence_signal_locked(struct fence *fence);
-signed long fence_default_wait(struct fence *fence, bool intr, signed long timeout);
-int fence_add_callback(struct fence *fence, struct fence_cb *cb,
-                      fence_func_t func);
-bool fence_remove_callback(struct fence *fence, struct fence_cb *cb);
-void fence_enable_sw_signaling(struct fence *fence);
-
-/**
- * fence_is_signaled_locked - Return an indication if the fence is signaled yet.
- * @fence:     [in]    the fence to check
- *
- * Returns true if the fence was already signaled, false if not. Since this
- * function doesn't enable signaling, it is not guaranteed to ever return
- * true if fence_add_callback, fence_wait or fence_enable_sw_signaling
- * haven't been called before.
- *
- * This function requires fence->lock to be held.
- */
-static inline bool
-fence_is_signaled_locked(struct fence *fence)
-{
-       if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags))
-               return true;
-
-       if (fence->ops->signaled && fence->ops->signaled(fence)) {
-               fence_signal_locked(fence);
-               return true;
-       }
-
-       return false;
-}
-
-/**
- * fence_is_signaled - Return an indication if the fence is signaled yet.
- * @fence:     [in]    the fence to check
- *
- * Returns true if the fence was already signaled, false if not. Since this
- * function doesn't enable signaling, it is not guaranteed to ever return
- * true if fence_add_callback, fence_wait or fence_enable_sw_signaling
- * haven't been called before.
- *
- * It's recommended for seqno fences to call fence_signal when the
- * operation is complete, it makes it possible to prevent issues from
- * wraparound between time of issue and time of use by checking the return
- * value of this function before calling hardware-specific wait instructions.
- */
-static inline bool
-fence_is_signaled(struct fence *fence)
-{
-       if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags))
-               return true;
-
-       if (fence->ops->signaled && fence->ops->signaled(fence)) {
-               fence_signal(fence);
-               return true;
-       }
-
-       return false;
-}
-
-/**
- * fence_is_later - return if f1 is chronologically later than f2
- * @f1:        [in]    the first fence from the same context
- * @f2:        [in]    the second fence from the same context
- *
- * Returns true if f1 is chronologically later than f2. Both fences must be
- * from the same context, since a seqno is not re-used across contexts.
- */
-static inline bool fence_is_later(struct fence *f1, struct fence *f2)
-{
-       if (WARN_ON(f1->context != f2->context))
-               return false;
-
-       return (int)(f1->seqno - f2->seqno) > 0;
-}
-
-/**
- * fence_later - return the chronologically later fence
- * @f1:        [in]    the first fence from the same context
- * @f2:        [in]    the second fence from the same context
- *
- * Returns NULL if both fences are signaled, otherwise the fence that would be
- * signaled last. Both fences must be from the same context, since a seqno is
- * not re-used across contexts.
- */
-static inline struct fence *fence_later(struct fence *f1, struct fence *f2)
-{
-       if (WARN_ON(f1->context != f2->context))
-               return NULL;
-
-       /*
-        * can't check just FENCE_FLAG_SIGNALED_BIT here, it may never have been
-        * set if enable_signaling wasn't called, and enabling that here is
-        * overkill.
-        */
-       if (fence_is_later(f1, f2))
-               return fence_is_signaled(f1) ? NULL : f1;
-       else
-               return fence_is_signaled(f2) ? NULL : f2;
-}
-
-signed long fence_wait_timeout(struct fence *, bool intr, signed long timeout);
-signed long fence_wait_any_timeout(struct fence **fences, uint32_t count,
-                                  bool intr, signed long timeout);
-
-/**
- * fence_wait - sleep until the fence gets signaled
- * @fence:     [in]    the fence to wait on
- * @intr:      [in]    if true, do an interruptible wait
- *
- * This function will return -ERESTARTSYS if interrupted by a signal,
- * or 0 if the fence was signaled. Other error values may be
- * returned on custom implementations.
- *
- * Performs a synchronous wait on this fence. It is assumed the caller
- * directly or indirectly holds a reference to the fence, otherwise the
- * fence might be freed before return, resulting in undefined behavior.
- */
-static inline signed long fence_wait(struct fence *fence, bool intr)
-{
-       signed long ret;
-
-       /* Since fence_wait_timeout cannot timeout with
-        * MAX_SCHEDULE_TIMEOUT, only valid return values are
-        * -ERESTARTSYS and MAX_SCHEDULE_TIMEOUT.
-        */
-       ret = fence_wait_timeout(fence, intr, MAX_SCHEDULE_TIMEOUT);
-
-       return ret < 0 ? ret : 0;
-}
-
-u64 fence_context_alloc(unsigned num);
-
-#define FENCE_TRACE(f, fmt, args...) \
-       do {                                                            \
-               struct fence *__ff = (f);                               \
-               if (IS_ENABLED(CONFIG_FENCE_TRACE))                     \
-                       pr_info("f %llu#%u: " fmt,                      \
-                               __ff->context, __ff->seqno, ##args);    \
-       } while (0)
-
-#define FENCE_WARN(f, fmt, args...) \
-       do {                                                            \
-               struct fence *__ff = (f);                               \
-               pr_warn("f %llu#%u: " fmt, __ff->context, __ff->seqno,  \
-                        ##args);                                       \
-       } while (0)
-
-#define FENCE_ERR(f, fmt, args...) \
-       do {                                                            \
-               struct fence *__ff = (f);                               \
-               pr_err("f %llu#%u: " fmt, __ff->context, __ff->seqno,   \
-                       ##args);                                        \
-       } while (0)
-
-#endif /* __LINUX_FENCE_H */
index b0f305e77b7f05e30bcd6ce4e7e566f640cccb80..2e313cca08f03868b622628b2c83a7eba44f8058 100644 (file)
@@ -40,7 +40,7 @@
 #define _LINUX_RESERVATION_H
 
 #include <linux/ww_mutex.h>
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 #include <linux/slab.h>
 #include <linux/seqlock.h>
 #include <linux/rcupdate.h>
@@ -59,7 +59,7 @@ extern const char reservation_seqcount_string[];
 struct reservation_object_list {
        struct rcu_head rcu;
        u32 shared_count, shared_max;
-       struct fence __rcu *shared[];
+       struct dma_fence __rcu *shared[];
 };
 
 /**
@@ -74,7 +74,7 @@ struct reservation_object {
        struct ww_mutex lock;
        seqcount_t seq;
 
-       struct fence __rcu *fence_excl;
+       struct dma_fence __rcu *fence_excl;
        struct reservation_object_list __rcu *fence;
        struct reservation_object_list *staged;
 };
@@ -107,7 +107,7 @@ reservation_object_fini(struct reservation_object *obj)
 {
        int i;
        struct reservation_object_list *fobj;
-       struct fence *excl;
+       struct dma_fence *excl;
 
        /*
         * This object should be dead and all references must have
@@ -115,12 +115,12 @@ reservation_object_fini(struct reservation_object *obj)
         */
        excl = rcu_dereference_protected(obj->fence_excl, 1);
        if (excl)
-               fence_put(excl);
+               dma_fence_put(excl);
 
        fobj = rcu_dereference_protected(obj->fence, 1);
        if (fobj) {
                for (i = 0; i < fobj->shared_count; ++i)
-                       fence_put(rcu_dereference_protected(fobj->shared[i], 1));
+                       dma_fence_put(rcu_dereference_protected(fobj->shared[i], 1));
 
                kfree(fobj);
        }
@@ -155,7 +155,7 @@ reservation_object_get_list(struct reservation_object *obj)
  * RETURNS
  * The exclusive fence or NULL
  */
-static inline struct fence *
+static inline struct dma_fence *
 reservation_object_get_excl(struct reservation_object *obj)
 {
        return rcu_dereference_protected(obj->fence_excl,
@@ -173,10 +173,10 @@ reservation_object_get_excl(struct reservation_object *obj)
  * RETURNS
  * The exclusive fence or NULL if none
  */
-static inline struct fence *
+static inline struct dma_fence *
 reservation_object_get_excl_rcu(struct reservation_object *obj)
 {
-       struct fence *fence;
+       struct dma_fence *fence;
        unsigned seq;
 retry:
        seq = read_seqcount_begin(&obj->seq);
@@ -186,22 +186,22 @@ retry:
                rcu_read_unlock();
                goto retry;
        }
-       fence = fence_get(fence);
+       fence = dma_fence_get(fence);
        rcu_read_unlock();
        return fence;
 }
 
 int reservation_object_reserve_shared(struct reservation_object *obj);
 void reservation_object_add_shared_fence(struct reservation_object *obj,
-                                        struct fence *fence);
+                                        struct dma_fence *fence);
 
 void reservation_object_add_excl_fence(struct reservation_object *obj,
-                                      struct fence *fence);
+                                      struct dma_fence *fence);
 
 int reservation_object_get_fences_rcu(struct reservation_object *obj,
-                                     struct fence **pfence_excl,
+                                     struct dma_fence **pfence_excl,
                                      unsigned *pshared_count,
-                                     struct fence ***pshared);
+                                     struct dma_fence ***pshared);
 
 long reservation_object_wait_timeout_rcu(struct reservation_object *obj,
                                         bool wait_all, bool intr,
index a1ba6a5ccdd62c2275eb63106d2fc9d78e4cee3c..c58c535d12a8a46f0d63c77eadfb854c4249d19f 100644 (file)
@@ -20,7 +20,7 @@
 #ifndef __LINUX_SEQNO_FENCE_H
 #define __LINUX_SEQNO_FENCE_H
 
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 #include <linux/dma-buf.h>
 
 enum seqno_fence_condition {
@@ -29,15 +29,15 @@ enum seqno_fence_condition {
 };
 
 struct seqno_fence {
-       struct fence base;
+       struct dma_fence base;
 
-       const struct fence_ops *ops;
+       const struct dma_fence_ops *ops;
        struct dma_buf *sync_buf;
        uint32_t seqno_ofs;
        enum seqno_fence_condition condition;
 };
 
-extern const struct fence_ops seqno_fence_ops;
+extern const struct dma_fence_ops seqno_fence_ops;
 
 /**
  * to_seqno_fence - cast a fence to a seqno_fence
@@ -47,7 +47,7 @@ extern const struct fence_ops seqno_fence_ops;
  * or the seqno_fence otherwise.
  */
 static inline struct seqno_fence *
-to_seqno_fence(struct fence *fence)
+to_seqno_fence(struct dma_fence *fence)
 {
        if (fence->ops != &seqno_fence_ops)
                return NULL;
@@ -83,9 +83,9 @@ to_seqno_fence(struct fence *fence)
  * dma-buf for sync_buf, since mapping or unmapping the sync_buf to the
  * device's vm can be expensive.
  *
- * It is recommended for creators of seqno_fence to call fence_signal
+ * It is recommended for creators of seqno_fence to call dma_fence_signal()
  * before destruction. This will prevent possible issues from wraparound at
- * time of issue vs time of check, since users can check fence_is_signaled
+ * time of issue vs time of check, since users can check dma_fence_is_signaled()
  * before submitting instructions for the hardware to wait on the fence.
  * However, when ops.enable_signaling is not called, it doesn't have to be
  * done as soon as possible, just before there's any real danger of seqno
@@ -96,18 +96,18 @@ seqno_fence_init(struct seqno_fence *fence, spinlock_t *lock,
                 struct dma_buf *sync_buf,  uint32_t context,
                 uint32_t seqno_ofs, uint32_t seqno,
                 enum seqno_fence_condition cond,
-                const struct fence_ops *ops)
+                const struct dma_fence_ops *ops)
 {
        BUG_ON(!fence || !sync_buf || !ops);
        BUG_ON(!ops->wait || !ops->enable_signaling ||
               !ops->get_driver_name || !ops->get_timeline_name);
 
        /*
-        * ops is used in fence_init for get_driver_name, so needs to be
+        * ops is used in dma_fence_init for get_driver_name, so needs to be
         * initialized first
         */
        fence->ops = ops;
-       fence_init(&fence->base, &seqno_fence_ops, lock, context, seqno);
+       dma_fence_init(&fence->base, &seqno_fence_ops, lock, context, seqno);
        get_dma_buf(sync_buf);
        fence->sync_buf = sync_buf;
        fence->seqno_ofs = seqno_ofs;
index aa17ccfc2f573c01f2f0505fc92d7c207f655a8d..3e3ab84fc4cd23c76b2e158dc82029e6f2a6f611 100644 (file)
@@ -18,8 +18,8 @@
 #include <linux/ktime.h>
 #include <linux/list.h>
 #include <linux/spinlock.h>
-#include <linux/fence.h>
-#include <linux/fence-array.h>
+#include <linux/dma-fence.h>
+#include <linux/dma-fence-array.h>
 
 /**
  * struct sync_file - sync file to export to the userspace
@@ -41,13 +41,13 @@ struct sync_file {
 
        wait_queue_head_t       wq;
 
-       struct fence            *fence;
-       struct fence_cb cb;
+       struct dma_fence        *fence;
+       struct dma_fence_cb cb;
 };
 
-#define POLL_ENABLED FENCE_FLAG_USER_BITS
+#define POLL_ENABLED DMA_FENCE_FLAG_USER_BITS
 
-struct sync_file *sync_file_create(struct fence *fence);
-struct fence *sync_file_get_fence(int fd);
+struct sync_file *sync_file_create(struct dma_fence *fence);
+struct dma_fence *sync_file_get_fence(int fd);
 
 #endif /* _LINUX_SYNC_H */
diff --git a/include/trace/events/dma_fence.h b/include/trace/events/dma_fence.h
new file mode 100644 (file)
index 0000000..1157cb4
--- /dev/null
@@ -0,0 +1,128 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM dma_fence
+
+#if !defined(_TRACE_FENCE_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_DMA_FENCE_H
+
+#include <linux/tracepoint.h>
+
+struct dma_fence;
+
+TRACE_EVENT(dma_fence_annotate_wait_on,
+
+       /* fence: the fence waiting on f1, f1: the fence to be waited on. */
+       TP_PROTO(struct dma_fence *fence, struct dma_fence *f1),
+
+       TP_ARGS(fence, f1),
+
+       TP_STRUCT__entry(
+               __string(driver, fence->ops->get_driver_name(fence))
+               __string(timeline, fence->ops->get_timeline_name(fence))
+               __field(unsigned int, context)
+               __field(unsigned int, seqno)
+
+               __string(waiting_driver, f1->ops->get_driver_name(f1))
+               __string(waiting_timeline, f1->ops->get_timeline_name(f1))
+               __field(unsigned int, waiting_context)
+               __field(unsigned int, waiting_seqno)
+       ),
+
+       TP_fast_assign(
+               __assign_str(driver, fence->ops->get_driver_name(fence))
+               __assign_str(timeline, fence->ops->get_timeline_name(fence))
+               __entry->context = fence->context;
+               __entry->seqno = fence->seqno;
+
+               __assign_str(waiting_driver, f1->ops->get_driver_name(f1))
+               __assign_str(waiting_timeline, f1->ops->get_timeline_name(f1))
+               __entry->waiting_context = f1->context;
+               __entry->waiting_seqno = f1->seqno;
+
+       ),
+
+       TP_printk("driver=%s timeline=%s context=%u seqno=%u "  \
+                 "waits on driver=%s timeline=%s context=%u seqno=%u",
+                 __get_str(driver), __get_str(timeline), __entry->context,
+                 __entry->seqno,
+                 __get_str(waiting_driver), __get_str(waiting_timeline),
+                 __entry->waiting_context, __entry->waiting_seqno)
+);
+
+DECLARE_EVENT_CLASS(dma_fence,
+
+       TP_PROTO(struct dma_fence *fence),
+
+       TP_ARGS(fence),
+
+       TP_STRUCT__entry(
+               __string(driver, fence->ops->get_driver_name(fence))
+               __string(timeline, fence->ops->get_timeline_name(fence))
+               __field(unsigned int, context)
+               __field(unsigned int, seqno)
+       ),
+
+       TP_fast_assign(
+               __assign_str(driver, fence->ops->get_driver_name(fence))
+               __assign_str(timeline, fence->ops->get_timeline_name(fence))
+               __entry->context = fence->context;
+               __entry->seqno = fence->seqno;
+       ),
+
+       TP_printk("driver=%s timeline=%s context=%u seqno=%u",
+                 __get_str(driver), __get_str(timeline), __entry->context,
+                 __entry->seqno)
+);
+
+DEFINE_EVENT(dma_fence, dma_fence_emit,
+
+       TP_PROTO(struct dma_fence *fence),
+
+       TP_ARGS(fence)
+);
+
+DEFINE_EVENT(dma_fence, dma_fence_init,
+
+       TP_PROTO(struct dma_fence *fence),
+
+       TP_ARGS(fence)
+);
+
+DEFINE_EVENT(dma_fence, dma_fence_destroy,
+
+       TP_PROTO(struct dma_fence *fence),
+
+       TP_ARGS(fence)
+);
+
+DEFINE_EVENT(dma_fence, dma_fence_enable_signal,
+
+       TP_PROTO(struct dma_fence *fence),
+
+       TP_ARGS(fence)
+);
+
+DEFINE_EVENT(dma_fence, dma_fence_signaled,
+
+       TP_PROTO(struct dma_fence *fence),
+
+       TP_ARGS(fence)
+);
+
+DEFINE_EVENT(dma_fence, dma_fence_wait_start,
+
+       TP_PROTO(struct dma_fence *fence),
+
+       TP_ARGS(fence)
+);
+
+DEFINE_EVENT(dma_fence, dma_fence_wait_end,
+
+       TP_PROTO(struct dma_fence *fence),
+
+       TP_ARGS(fence)
+);
+
+#endif /*  _TRACE_DMA_FENCE_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
diff --git a/include/trace/events/fence.h b/include/trace/events/fence.h
deleted file mode 100644 (file)
index d6dfa05..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-#undef TRACE_SYSTEM
-#define TRACE_SYSTEM fence
-
-#if !defined(_TRACE_FENCE_H) || defined(TRACE_HEADER_MULTI_READ)
-#define _TRACE_FENCE_H
-
-#include <linux/tracepoint.h>
-
-struct fence;
-
-TRACE_EVENT(fence_annotate_wait_on,
-
-       /* fence: the fence waiting on f1, f1: the fence to be waited on. */
-       TP_PROTO(struct fence *fence, struct fence *f1),
-
-       TP_ARGS(fence, f1),
-
-       TP_STRUCT__entry(
-               __string(driver, fence->ops->get_driver_name(fence))
-               __string(timeline, fence->ops->get_timeline_name(fence))
-               __field(unsigned int, context)
-               __field(unsigned int, seqno)
-
-               __string(waiting_driver, f1->ops->get_driver_name(f1))
-               __string(waiting_timeline, f1->ops->get_timeline_name(f1))
-               __field(unsigned int, waiting_context)
-               __field(unsigned int, waiting_seqno)
-       ),
-
-       TP_fast_assign(
-               __assign_str(driver, fence->ops->get_driver_name(fence))
-               __assign_str(timeline, fence->ops->get_timeline_name(fence))
-               __entry->context = fence->context;
-               __entry->seqno = fence->seqno;
-
-               __assign_str(waiting_driver, f1->ops->get_driver_name(f1))
-               __assign_str(waiting_timeline, f1->ops->get_timeline_name(f1))
-               __entry->waiting_context = f1->context;
-               __entry->waiting_seqno = f1->seqno;
-
-       ),
-
-       TP_printk("driver=%s timeline=%s context=%u seqno=%u "  \
-                 "waits on driver=%s timeline=%s context=%u seqno=%u",
-                 __get_str(driver), __get_str(timeline), __entry->context,
-                 __entry->seqno,
-                 __get_str(waiting_driver), __get_str(waiting_timeline),
-                 __entry->waiting_context, __entry->waiting_seqno)
-);
-
-DECLARE_EVENT_CLASS(fence,
-
-       TP_PROTO(struct fence *fence),
-
-       TP_ARGS(fence),
-
-       TP_STRUCT__entry(
-               __string(driver, fence->ops->get_driver_name(fence))
-               __string(timeline, fence->ops->get_timeline_name(fence))
-               __field(unsigned int, context)
-               __field(unsigned int, seqno)
-       ),
-
-       TP_fast_assign(
-               __assign_str(driver, fence->ops->get_driver_name(fence))
-               __assign_str(timeline, fence->ops->get_timeline_name(fence))
-               __entry->context = fence->context;
-               __entry->seqno = fence->seqno;
-       ),
-
-       TP_printk("driver=%s timeline=%s context=%u seqno=%u",
-                 __get_str(driver), __get_str(timeline), __entry->context,
-                 __entry->seqno)
-);
-
-DEFINE_EVENT(fence, fence_emit,
-
-       TP_PROTO(struct fence *fence),
-
-       TP_ARGS(fence)
-);
-
-DEFINE_EVENT(fence, fence_init,
-
-       TP_PROTO(struct fence *fence),
-
-       TP_ARGS(fence)
-);
-
-DEFINE_EVENT(fence, fence_destroy,
-
-       TP_PROTO(struct fence *fence),
-
-       TP_ARGS(fence)
-);
-
-DEFINE_EVENT(fence, fence_enable_signal,
-
-       TP_PROTO(struct fence *fence),
-
-       TP_ARGS(fence)
-);
-
-DEFINE_EVENT(fence, fence_signaled,
-
-       TP_PROTO(struct fence *fence),
-
-       TP_ARGS(fence)
-);
-
-DEFINE_EVENT(fence, fence_wait_start,
-
-       TP_PROTO(struct fence *fence),
-
-       TP_ARGS(fence)
-);
-
-DEFINE_EVENT(fence, fence_wait_end,
-
-       TP_PROTO(struct fence *fence),
-
-       TP_ARGS(fence)
-);
-
-#endif /*  _TRACE_FENCE_H */
-
-/* This part must be outside protection */
-#include <trace/define_trace.h>