The next patch will need the dma_fence to create the sync_file in
etnaviv_ioctl_gem_submit, in case an out_fence_fd is requested.

Signed-off-by: Philipp Zabel <p.za...@pengutronix.de>
Reviewed-by: Gustavo Padovan <gustavo.pado...@collabora.com>
---
 drivers/gpu/drm/etnaviv/etnaviv_gem.h        |  3 ++-
 drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c |  8 +++++++-
 drivers/gpu/drm/etnaviv/etnaviv_gpu.c        | 21 ++++++---------------
 drivers/gpu/drm/etnaviv/etnaviv_gpu.h        |  1 +
 4 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.h 
b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
index 120410d67eb5b..c4a091e874269 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
@@ -20,6 +20,7 @@
 #include <linux/reservation.h>
 #include "etnaviv_drv.h"
 
+struct dma_fence;
 struct etnaviv_gem_ops;
 struct etnaviv_gem_object;
 
@@ -104,7 +105,7 @@ struct etnaviv_gem_submit {
        struct drm_device *dev;
        struct etnaviv_gpu *gpu;
        struct ww_acquire_ctx ticket;
-       u32 fence;
+       struct dma_fence *fence;
        unsigned int nr_bos;
        struct etnaviv_gem_submit_bo bos[0];
        u32 flags;
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c 
b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index fb8d5befbf4f1..be88411de35a4 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -431,11 +431,17 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void 
*data,
        memcpy(cmdbuf->vaddr, stream, args->stream_size);
        cmdbuf->user_size = ALIGN(args->stream_size, 8);
 
+       submit->fence = etnaviv_gpu_fence_alloc(gpu);
+       if (!submit->fence) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
        ret = etnaviv_gpu_submit(gpu, submit, cmdbuf);
        if (ret == 0)
                cmdbuf = NULL;
 
-       args->fence = submit->fence;
+       args->fence = submit->fence->seqno;
 
 out:
        submit_unpin_objects(submit);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c 
b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
index 51d52c72aef17..a439700cc577f 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
@@ -1047,7 +1047,7 @@ static const struct dma_fence_ops etnaviv_fence_ops = {
        .release = etnaviv_fence_release,
 };
 
-static struct dma_fence *etnaviv_gpu_fence_alloc(struct etnaviv_gpu *gpu)
+struct dma_fence *etnaviv_gpu_fence_alloc(struct etnaviv_gpu *gpu)
 {
        struct etnaviv_fence *f;
 
@@ -1290,7 +1290,6 @@ 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 dma_fence *fence;
        unsigned int event, i;
        int ret;
 
@@ -1314,18 +1313,10 @@ int etnaviv_gpu_submit(struct etnaviv_gpu *gpu,
                goto out_pm_put;
        }
 
-       fence = etnaviv_gpu_fence_alloc(gpu);
-       if (!fence) {
-               event_free(gpu, event);
-               ret = -ENOMEM;
-               goto out_pm_put;
-       }
-
        mutex_lock(&gpu->lock);
 
-       gpu->event[event].fence = fence;
-       submit->fence = fence->seqno;
-       gpu->active_fence = submit->fence;
+       gpu->event[event].fence = submit->fence;
+       gpu->active_fence = submit->fence->seqno;
 
        if (gpu->lastctx != cmdbuf->ctx) {
                gpu->mmu->need_flush = true;
@@ -1335,7 +1326,7 @@ int etnaviv_gpu_submit(struct etnaviv_gpu *gpu,
 
        etnaviv_buffer_queue(gpu, event, cmdbuf);
 
-       cmdbuf->fence = fence;
+       cmdbuf->fence = submit->fence;
        list_add_tail(&cmdbuf->node, &gpu->active_cmd_list);
 
        /* We're committed to adding this command buffer, hold a PM reference */
@@ -1351,10 +1342,10 @@ int etnaviv_gpu_submit(struct etnaviv_gpu *gpu,
 
                if (submit->bos[i].flags & ETNA_SUBMIT_BO_WRITE)
                        reservation_object_add_excl_fence(etnaviv_obj->resv,
-                                                         fence);
+                                                         submit->fence);
                else
                        reservation_object_add_shared_fence(etnaviv_obj->resv,
-                                                           fence);
+                                                           submit->fence);
        }
        cmdbuf->nr_bos = submit->nr_bos;
        hangcheck_timer_reset(gpu);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h 
b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h
index dc27c7a039060..20f7191018daf 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h
@@ -180,6 +180,7 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu);
 int etnaviv_gpu_debugfs(struct etnaviv_gpu *gpu, struct seq_file *m);
 #endif
 
+struct dma_fence *etnaviv_gpu_fence_alloc(struct etnaviv_gpu *gpu);
 int etnaviv_gpu_fence_sync_obj(struct etnaviv_gem_object *etnaviv_obj,
        unsigned int context, bool exclusive, bool implicit);
 
-- 
2.11.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to