From 63e8592e06939e20c7b9e56b430353ebbee31ad6 Mon Sep 17 00:00:00 2001 From: Sachit Kadle Date: Mon, 22 Aug 2016 18:06:30 -0700 Subject: gpu: nvgpu: use inplace allocation in sync framework This change is the first of a series of changes to support the usage of pre-allocated job tracking resources in the submit path. With this change, we still maintain a dynamically-allocated joblist, but make the necessary changes in the channel_sync & fence framework to use in-place allocations. Specifically, we: 1) Update channel sync framework routines to take in pre-allocated priv_cmd_entry(s) & gk20a_fence(s) rather than dynamically allocating themselves 2) Move allocation of priv_cmd_entry(s) & gk20a_fence(s) to gk20a_submit_prepare_syncs 3) Modify fence framework to have seperate allocation and init APIs. We expose allocation as a seperate API, so the client can allocate the object before passing it into the channel sync framework. 4) Fix clean_up logic in channel sync framework Bug 1795076 Change-Id: I96db457683cd207fd029c31c45f548f98055e844 Signed-off-by: Sachit Kadle Reviewed-on: http://git-master/r/1206725 (cherry picked from commit 9d196fd10db6c2f934c2a53b1fc0500eb4626624) Reviewed-on: http://git-master/r/1223933 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gk20a/fence_gk20a.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/fence_gk20a.h') diff --git a/drivers/gpu/nvgpu/gk20a/fence_gk20a.h b/drivers/gpu/nvgpu/gk20a/fence_gk20a.h index 35488ea3..3fe2d8b2 100644 --- a/drivers/gpu/nvgpu/gk20a/fence_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/fence_gk20a.h @@ -31,6 +31,7 @@ struct gk20a_fence_ops; struct gk20a_fence { /* Valid for all fence types: */ + bool valid; struct kref ref; bool wfi; struct sync_fence *sync_fence; @@ -47,21 +48,25 @@ struct gk20a_fence { }; /* Fences can be created from semaphores or syncpoint (id, value) pairs */ -struct gk20a_fence *gk20a_fence_from_semaphore( +int gk20a_fence_from_semaphore( + struct gk20a_fence *fence_out, struct sync_timeline *timeline, struct gk20a_semaphore *semaphore, wait_queue_head_t *semaphore_wq, struct sync_fence *dependency, bool wfi, bool need_sync_fence); -struct gk20a_fence *gk20a_fence_from_syncpt( +int gk20a_fence_from_syncpt( + struct gk20a_fence *fence_out, struct platform_device *host1x_pdev, u32 id, u32 value, bool wfi, bool need_sync_fence); -struct gk20a_fence *gk20a_alloc_fence(const struct gk20a_fence_ops *ops, - struct sync_fence *sync_fence, - bool wfi); +struct gk20a_fence *gk20a_alloc_fence(struct channel_gk20a *c); + +void gk20a_init_fence(struct gk20a_fence *f, + const struct gk20a_fence_ops *ops, + struct sync_fence *sync_fence, bool wfi); /* Fence operations */ void gk20a_fence_put(struct gk20a_fence *f); -- cgit v1.2.2