aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/msm
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2016-06-16 16:43:49 -0400
committerRob Clark <robdclark@gmail.com>2016-09-15 17:47:40 -0400
commit4cd0945901a6dd0190824a98471449df9129d21c (patch)
treee9f7d9bd9199188c46504f3f00d3ccdb0650b057 /drivers/gpu/drm/msm
parentf44d32c79fd591179820d6ce4645c4c2799e6d40 (diff)
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.c25
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 65284febb2f9..3ac14cd1e5b9 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,
364 struct msm_gem_submit *submit; 364 struct msm_gem_submit *submit;
365 struct msm_gpu *gpu = priv->gpu; 365 struct msm_gpu *gpu = priv->gpu;
366 struct fence *in_fence = NULL; 366 struct fence *in_fence = NULL;
367 struct sync_file *sync_file = NULL;
368 int out_fence_fd = -1;
367 unsigned i; 369 unsigned i;
368 int ret; 370 int ret;
369 371
@@ -383,6 +385,14 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
383 if (ret) 385 if (ret)
384 return ret; 386 return ret;
385 387
388 if (args->flags & MSM_SUBMIT_FENCE_FD_OUT) {
389 out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
390 if (out_fence_fd < 0) {
391 ret = out_fence_fd;
392 goto out_unlock;
393 }
394 }
395
386 submit = submit_create(dev, gpu, args->nr_bos, args->nr_cmds); 396 submit = submit_create(dev, gpu, args->nr_bos, args->nr_cmds);
387 if (!submit) { 397 if (!submit) {
388 ret = -ENOMEM; 398 ret = -ENOMEM;
@@ -495,10 +505,23 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
495 goto out; 505 goto out;
496 } 506 }
497 507
508 if (args->flags & MSM_SUBMIT_FENCE_FD_OUT) {
509 sync_file = sync_file_create(submit->fence);
510 if (!sync_file) {
511 ret = -ENOMEM;
512 goto out;
513 }
514 }
515
498 msm_gpu_submit(gpu, submit, ctx); 516 msm_gpu_submit(gpu, submit, ctx);
499 517
500 args->fence = submit->fence->seqno; 518 args->fence = submit->fence->seqno;
501 519
520 if (args->flags & MSM_SUBMIT_FENCE_FD_OUT) {
521 fd_install(out_fence_fd, sync_file->file);
522 args->fence_fd = out_fence_fd;
523 }
524
502out: 525out:
503 if (in_fence) 526 if (in_fence)
504 fence_put(in_fence); 527 fence_put(in_fence);
@@ -506,6 +529,8 @@ out:
506 if (ret) 529 if (ret)
507 msm_gem_submit_free(submit); 530 msm_gem_submit_free(submit);
508out_unlock: 531out_unlock:
532 if (ret && (out_fence_fd >= 0))
533 put_unused_fd(out_fence_fd);
509 mutex_unlock(&dev->struct_mutex); 534 mutex_unlock(&dev->struct_mutex);
510 return ret; 535 return ret;
511} 536}