diff options
Diffstat (limited to 'drivers/gpu/nvgpu/common/linux/channel.c')
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/channel.c | 22 |
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) |