summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/sync_gk20a.c
diff options
context:
space:
mode:
authorDebarshi Dutta <ddutta@nvidia.com>2018-03-23 06:02:27 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-04-23 00:04:48 -0400
commitd0e4dfd6efd651abc431aba9cfae5907638f8172 (patch)
tree1a412eaa4636ff2e2862c1623bad3a5ea6883d4e /drivers/gpu/nvgpu/gk20a/sync_gk20a.c
parentc918c42a4a3651f757c6966aead4b07eb4b56697 (diff)
gpu: nvgpu: sync_framework cleanups
This patch deals with cleanups meant to make things simpler for the upcoming os abstraction patches for the sync framework. This patch causes some substantial changes which are listed out as follows. 1) sync_timeline is moved out of gk20a_fence into struct nvgpu_channel_linux. New function pointers are created to facilitate os independent methods for enabling/disabling timeline and are now named as os_fence_framework. These function pointers are located in the struct os_channel under struct gk20a. 2) construction of the channel_sync require nvgpu_finalize_poweron_linux() to be invoked before invocations to nvgpu_init_mm_ce_context(). Hence, these methods are now moved away from gk20a_finalize_poweron() and invoked after nvgpu_finalize_poweron_linux(). 3) sync_fence creation is now delinked from fence construction and move to the channel_sync_gk20a's channel_incr methods. These sync_fences are mainly associated with post_fences. 4) In case userspace requires the sync_fences to be constructed, we try to obtain an fd before the gk20a_channel_submit_gpfifo() instead of trying to do that later. This is used to avoid potential after effects of duplicate work submission due to failure to obtain an unused fd. JIRA NVGPU-66 Change-Id: I42a3e4e2e692a113b1b36d2b48ab107ae4444dfa Signed-off-by: Debarshi Dutta <ddutta@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1678400 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/sync_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/sync_gk20a.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/sync_gk20a.c b/drivers/gpu/nvgpu/gk20a/sync_gk20a.c
index a8600bce..56c90da7 100644
--- a/drivers/gpu/nvgpu/gk20a/sync_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/sync_gk20a.c
@@ -32,6 +32,7 @@
32#include <nvgpu/semaphore.h> 32#include <nvgpu/semaphore.h>
33#include <nvgpu/bug.h> 33#include <nvgpu/bug.h>
34#include <nvgpu/kref.h> 34#include <nvgpu/kref.h>
35#include "../common/linux/channel.h"
35 36
36#include "../drivers/staging/android/sync.h" 37#include "../drivers/staging/android/sync.h"
37 38
@@ -373,15 +374,9 @@ void gk20a_sync_timeline_destroy(struct sync_timeline *timeline)
373} 374}
374 375
375struct sync_timeline *gk20a_sync_timeline_create( 376struct sync_timeline *gk20a_sync_timeline_create(
376 const char *fmt, ...) 377 const char *name)
377{ 378{
378 struct gk20a_sync_timeline *obj; 379 struct gk20a_sync_timeline *obj;
379 char name[30];
380 va_list args;
381
382 va_start(args, fmt);
383 vsnprintf(name, sizeof(name), fmt, args);
384 va_end(args);
385 380
386 obj = (struct gk20a_sync_timeline *) 381 obj = (struct gk20a_sync_timeline *)
387 sync_timeline_create(&gk20a_sync_timeline_ops, 382 sync_timeline_create(&gk20a_sync_timeline_ops,
@@ -395,8 +390,7 @@ struct sync_timeline *gk20a_sync_timeline_create(
395} 390}
396 391
397struct sync_fence *gk20a_sync_fence_create( 392struct sync_fence *gk20a_sync_fence_create(
398 struct gk20a *g, 393 struct channel_gk20a *c,
399 struct sync_timeline *obj,
400 struct nvgpu_semaphore *sema, 394 struct nvgpu_semaphore *sema,
401 const char *fmt, ...) 395 const char *fmt, ...)
402{ 396{
@@ -404,7 +398,15 @@ struct sync_fence *gk20a_sync_fence_create(
404 va_list args; 398 va_list args;
405 struct sync_pt *pt; 399 struct sync_pt *pt;
406 struct sync_fence *fence; 400 struct sync_fence *fence;
407 struct gk20a_sync_timeline *timeline = to_gk20a_timeline(obj); 401 struct gk20a *g = c->g;
402
403 struct nvgpu_channel_linux *os_channel_priv = c->os_priv;
404 struct nvgpu_os_fence_framework *fence_framework = NULL;
405 struct gk20a_sync_timeline *timeline = NULL;
406
407 fence_framework = &os_channel_priv->fence_framework;
408
409 timeline = to_gk20a_timeline(fence_framework->timeline);
408 410
409 pt = gk20a_sync_pt_create_inst(g, timeline, sema); 411 pt = gk20a_sync_pt_create_inst(g, timeline, sema);
410 if (pt == NULL) 412 if (pt == NULL)