summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common/linux/channel.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/common/linux/channel.c')
-rw-r--r--drivers/gpu/nvgpu/common/linux/channel.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/channel.c b/drivers/gpu/nvgpu/common/linux/channel.c
index a725cd6b..35fb3023 100644
--- a/drivers/gpu/nvgpu/common/linux/channel.c
+++ b/drivers/gpu/nvgpu/common/linux/channel.c
@@ -720,7 +720,8 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
720 return -EINVAL; 720 return -EINVAL;
721 721
722 if ((flags & (NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_WAIT | 722 if ((flags & (NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_WAIT |
723 NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET)) && 723 NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET |
724 NVGPU_SUBMIT_GPFIFO_FLAGS_USER_FENCE_UPDATE)) &&
724 !fence) 725 !fence)
725 return -EINVAL; 726 return -EINVAL;
726 727
@@ -757,6 +758,16 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
757 (g->can_railgate && !c->deterministic) || 758 (g->can_railgate && !c->deterministic) ||
758 !skip_buffer_refcounting; 759 !skip_buffer_refcounting;
759 760
761 /*
762 * If User is adding increments to the pushbuffer and doing all job
763 * tracking, then no need for kernel tracking here
764 * User should ensure that all pre-requisites for fast submit are met
765 * Fail the submit if that's not the case
766 */
767 if (need_job_tracking &&
768 (flags & NVGPU_SUBMIT_GPFIFO_FLAGS_USER_FENCE_UPDATE))
769 return -EINVAL;
770
760 if (need_job_tracking) { 771 if (need_job_tracking) {
761 bool need_sync_framework = false; 772 bool need_sync_framework = false;
762 773
@@ -868,6 +879,15 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
868 goto clean_up; 879 goto clean_up;
869 } 880 }
870 881
882 if (flags & NVGPU_SUBMIT_GPFIFO_FLAGS_USER_FENCE_UPDATE) {
883 /*
884 * User space adds increments in the pushbuffer, so just
885 * handle the threshold book keeping in kernel by adding
886 * number of syncpoint increments to threshold
887 */
888 c->sync->add_user_incrs(c->sync, fence->value);
889 }
890
871 if (need_job_tracking) { 891 if (need_job_tracking) {
872 err = channel_gk20a_alloc_job(c, &job); 892 err = channel_gk20a_alloc_job(c, &job);
873 if (err) 893 if (err)