diff options
author | Rob Clark <robdclark@gmail.com> | 2016-06-16 20:43:49 (GMT) |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2016-09-15 21:47:40 (GMT) |
commit | 4cd0945901a6dd0190824a98471449df9129d21c (patch) | |
tree | e9f7d9bd9199188c46504f3f00d3ccdb0650b057 /drivers/gpu/drm/msm | |
parent | f44d32c79fd591179820d6ce4645c4c2799e6d40 (diff) | |
download | linux-4cd0945901a6dd0190824a98471449df9129d21c.tar.xz |
drm/msm: submit support for out-fences
Signed-off-by: Rob Clark <robdclark@gmail.com>
Diffstat (limited to 'drivers/gpu/drm/msm')
-rw-r--r-- | drivers/gpu/drm/msm/msm_gem_submit.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index 65284fe..3ac14cd 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -364,6 +364,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, struct msm_gem_submit *submit; struct msm_gpu *gpu = priv->gpu; struct fence *in_fence = NULL; + struct sync_file *sync_file = NULL; + int out_fence_fd = -1; unsigned i; int ret; @@ -383,6 +385,14 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, if (ret) return ret; + if (args->flags & MSM_SUBMIT_FENCE_FD_OUT) { + out_fence_fd = get_unused_fd_flags(O_CLOEXEC); + if (out_fence_fd < 0) { + ret = out_fence_fd; + goto out_unlock; + } + } + submit = submit_create(dev, gpu, args->nr_bos, args->nr_cmds); if (!submit) { ret = -ENOMEM; @@ -495,10 +505,23 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, goto out; } + if (args->flags & MSM_SUBMIT_FENCE_FD_OUT) { + sync_file = sync_file_create(submit->fence); + if (!sync_file) { + ret = -ENOMEM; + goto out; + } + } + msm_gpu_submit(gpu, submit, ctx); args->fence = submit->fence->seqno; + if (args->flags & MSM_SUBMIT_FENCE_FD_OUT) { + fd_install(out_fence_fd, sync_file->file); + args->fence_fd = out_fence_fd; + } + out: if (in_fence) fence_put(in_fence); @@ -506,6 +529,8 @@ out: if (ret) msm_gem_submit_free(submit); out_unlock: + if (ret && (out_fence_fd >= 0)) + put_unused_fd(out_fence_fd); mutex_unlock(&dev->struct_mutex); return ret; } |