diff options
author | Rob Clark <robdclark@gmail.com> | 2016-06-16 16:43:49 -0400 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2016-09-15 17:47:40 -0400 |
commit | 4cd0945901a6dd0190824a98471449df9129d21c (patch) | |
tree | e9f7d9bd9199188c46504f3f00d3ccdb0650b057 /drivers/gpu/drm/msm | |
parent | f44d32c79fd591179820d6ce4645c4c2799e6d40 (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.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 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 | |||
502 | out: | 525 | out: |
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); |
508 | out_unlock: | 531 | out_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 | } |