Message ID | 20170308125328.28306-3-p.zabel@pengutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Philipp, 2017-03-08 Philipp Zabel <p.zabel@pengutronix.de>: > 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.zabel@pengutronix.de> > --- > drivers/gpu/drm/etnaviv/etnaviv_drv.c | 2 +- > drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 27 +++++++++++++++++++++++++++ > include/uapi/drm/etnaviv_drm.h | 6 ++++-- > 3 files changed, 32 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnaviv/etnaviv_drv.c > index 587e45043542b..00f7e9acf68ad 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 022fcc7d57f48..7d4dc946104b9 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c > @@ -307,6 +307,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; > > @@ -374,6 +376,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,25 @@ 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); > + } Extra braces here. Otherwise looks good to me. Reviewed-by: Gustavo Padovan <gustavo.padovan@collabora.com> Gustavo
On Wed, 2017-03-08 at 11:48 -0300, Gustavo Padovan wrote: [...] > > @@ -437,10 +447,25 @@ 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); > > + } > > Extra braces here. I'll drop those next time. > Otherwise looks good to me. > > Reviewed-by: Gustavo Padovan <gustavo.padovan@collabora.com> thanks Philipp
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnaviv/etnaviv_drv.c index 587e45043542b..00f7e9acf68ad 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 022fcc7d57f48..7d4dc946104b9 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c @@ -307,6 +307,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; @@ -374,6 +376,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,25 @@ 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 +485,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
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.zabel@pengutronix.de> --- drivers/gpu/drm/etnaviv/etnaviv_drv.c | 2 +- drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 27 +++++++++++++++++++++++++++ include/uapi/drm/etnaviv_drm.h | 6 ++++-- 3 files changed, 32 insertions(+), 3 deletions(-)