From 0c46f8a5e112c08c172ee2c692832e1753ffbcce Mon Sep 17 00:00:00 2001 From: Deepak Nibade Date: Tue, 20 Feb 2018 23:49:37 -0800 Subject: gpu: nvgpu: support user fence updates Add support for user fence updates i.e. increments added by user space in pushbuffer directly Add a submit IOCTL flag NVGPU_SUBMIT_GPFIFO_FLAGS_USER_FENCE_UPDATE to indicate if User has added increments in pushbuffer If yes, number_of_increment value is received in fence.value from User If User is adding increments in the pushbuffer then we don't need to do any job tracking in the kernel So fail the submit if we evaluate need_job_tracking to true and FLAGS_USER_FENCE_UPDATE is set User is responsible for ensuring all pre-requisites for a fast submit and to prevent kernel job tracking Since user space adds increments in the pushbuffer, just handle the threshold book keeping in kernel. Bug 200326065 Jira NVGPU-179 Change-Id: Ic0f0b1aa69e3389a4c3305fb6a559c5113719e0f Signed-off-by: Deepak Nibade Reviewed-on: https://git-master.nvidia.com/r/1661854 Reviewed-by: svc-mobile-coverity GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu Reviewed-by: Konsta Holtta Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/linux/channel.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'drivers/gpu/nvgpu/common/linux/channel.c') 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, return -EINVAL; if ((flags & (NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_WAIT | - NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET)) && + NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET | + NVGPU_SUBMIT_GPFIFO_FLAGS_USER_FENCE_UPDATE)) && !fence) return -EINVAL; @@ -757,6 +758,16 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c, (g->can_railgate && !c->deterministic) || !skip_buffer_refcounting; + /* + * If User is adding increments to the pushbuffer and doing all job + * tracking, then no need for kernel tracking here + * User should ensure that all pre-requisites for fast submit are met + * Fail the submit if that's not the case + */ + if (need_job_tracking && + (flags & NVGPU_SUBMIT_GPFIFO_FLAGS_USER_FENCE_UPDATE)) + return -EINVAL; + if (need_job_tracking) { bool need_sync_framework = false; @@ -868,6 +879,15 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c, goto clean_up; } + if (flags & NVGPU_SUBMIT_GPFIFO_FLAGS_USER_FENCE_UPDATE) { + /* + * User space adds increments in the pushbuffer, so just + * handle the threshold book keeping in kernel by adding + * number of syncpoint increments to threshold + */ + c->sync->add_user_incrs(c->sync, fence->value); + } + if (need_job_tracking) { err = channel_gk20a_alloc_job(c, &job); if (err) -- cgit v1.2.2