Based on commit 4cd0945901a6 ("drm/msm: submit support for out-fences").
We increment the minor driver version so userspace can detect explicit
fence support.

Signed-off-by: Philipp Zabel <p.za...@pengutronix.de>
Reviewed-by: Gustavo Padovan <gustavo.pado...@collabora.com>
---
v2: Dropped unnecessary braces
---
 drivers/gpu/drm/etnaviv/etnaviv_drv.c        |  2 +-
 drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 26 ++++++++++++++++++++++++++
 include/uapi/drm/etnaviv_drm.h               |  6 ++++--
 3 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c 
b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
index 289a9f8c66710..5255278dde560 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
@@ -512,7 +512,7 @@ static struct drm_driver etnaviv_drm_driver = {
        .desc               = "etnaviv DRM",
        .date               = "20151214",
        .major              = 1,
-       .minor              = 0,
+       .minor              = 1,
 };
 
 /*
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c 
b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index be88411de35a4..8a1381ca0354b 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -308,6 +308,8 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void 
*data,
        struct etnaviv_cmdbuf *cmdbuf;
        struct etnaviv_gpu *gpu;
        struct dma_fence *in_fence = NULL;
+       struct sync_file *sync_file = NULL;
+       int out_fence_fd = -1;
        void *stream;
        int ret;
 
@@ -375,6 +377,14 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void 
*data,
                goto err_submit_cmds;
        }
 
+       if (args->flags & ETNA_SUBMIT_FENCE_FD_OUT) {
+               out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
+               if (out_fence_fd < 0) {
+                       ret = out_fence_fd;
+                       goto err_submit_cmds;
+               }
+       }
+
        submit = submit_create(dev, gpu, args->nr_bos);
        if (!submit) {
                ret = -ENOMEM;
@@ -437,10 +447,24 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void 
*data,
                goto out;
        }
 
+       if (args->flags & ETNA_SUBMIT_FENCE_FD_OUT) {
+               sync_file = sync_file_create(submit->fence);
+               if (!sync_file) {
+                       dma_fence_put(submit->fence);
+                       submit->fence = NULL;
+                       ret = -ENOMEM;
+                       goto out;
+               }
+       }
+
        ret = etnaviv_gpu_submit(gpu, submit, cmdbuf);
        if (ret == 0)
                cmdbuf = NULL;
 
+       if (args->flags & ETNA_SUBMIT_FENCE_FD_OUT)
+               fd_install(out_fence_fd, sync_file->file);
+
+       args->fence_fd = out_fence_fd;
        args->fence = submit->fence->seqno;
 
 out:
@@ -460,6 +484,8 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void 
*data,
        submit_cleanup(submit);
 
 err_submit_cmds:
+       if (ret && (out_fence_fd >= 0))
+               put_unused_fd(out_fence_fd);
        /* if we still own the cmdbuf */
        if (cmdbuf)
                etnaviv_cmdbuf_free(cmdbuf);
diff --git a/include/uapi/drm/etnaviv_drm.h b/include/uapi/drm/etnaviv_drm.h
index e9c388a1d8ebe..76f6f78a352ba 100644
--- a/include/uapi/drm/etnaviv_drm.h
+++ b/include/uapi/drm/etnaviv_drm.h
@@ -156,8 +156,10 @@ struct drm_etnaviv_gem_submit_bo {
  */
 #define ETNA_SUBMIT_NO_IMPLICIT         0x0001
 #define ETNA_SUBMIT_FENCE_FD_IN         0x0002
+#define ETNA_SUBMIT_FENCE_FD_OUT        0x0004
 #define ETNA_SUBMIT_FLAGS              (ETNA_SUBMIT_NO_IMPLICIT | \
-                                        ETNA_SUBMIT_FENCE_FD_IN)
+                                        ETNA_SUBMIT_FENCE_FD_IN | \
+                                        ETNA_SUBMIT_FENCE_FD_OUT)
 #define ETNA_PIPE_3D      0x00
 #define ETNA_PIPE_2D      0x01
 #define ETNA_PIPE_VG      0x02
@@ -172,7 +174,7 @@ struct drm_etnaviv_gem_submit {
        __u64 relocs;         /* in, ptr to array of submit_reloc's */
        __u64 stream;         /* in, ptr to cmdstream */
        __u32 flags;          /* in, mask of ETNA_SUBMIT_x */
-       __s32 fence_fd;       /* in, fence fd (see ETNA_SUBMIT_FENCE_FD_IN) */
+       __s32 fence_fd;       /* in/out, fence fd (see ETNA_SUBMIT_FENCE_FD_x) 
*/
 };
 
 /* The normal way to synchronize with the GPU is just to CPU_PREP on
-- 
2.11.0

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

Reply via email to