From 733fb79b39869665addcd80ccdf1c15f4a5aaa29 Mon Sep 17 00:00:00 2001 From: Sachit Kadle Date: Mon, 15 Aug 2016 14:32:39 -0700 Subject: gpu: nvgpu: add support for pre-allocated resources Add support for pre-allocation of job tracking resources w/ new (extended) ioctl. Goal is to avoid dynamic memory allocation in the submit path. This patch does the following: 1) Intoduces a new ioctl, NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX, which enables pre-allocation of tracking resources per job: a) 2x priv_cmd_entry b) 2x gk20a_fence 2) Implements circular ring buffer for job tracking to avoid lock contention between producer (submitter) and consumer (clean-up) Bug 1795076 Change-Id: I6b52e5c575871107ff380f9a5790f440a6969347 Signed-off-by: Sachit Kadle Reviewed-on: http://git-master/r/1203300 (cherry picked from commit 9fd270c22b860935dffe244753dabd87454bef39) Reviewed-on: http://git-master/r/1223934 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gk20a/fence_gk20a.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 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 3fe2d8b2..97a7d957 100644 --- a/drivers/gpu/nvgpu/gk20a/fence_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/fence_gk20a.h @@ -3,7 +3,7 @@ * * GK20A Fences * - * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2014-2016, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -45,6 +45,9 @@ struct gk20a_fence { struct platform_device *host1x_pdev; u32 syncpt_id; u32 syncpt_value; + + /* Valid for fences part of a pre-allocated fence pool */ + struct gk20a_allocator *allocator; }; /* Fences can be created from semaphores or syncpoint (id, value) pairs */ @@ -62,7 +65,15 @@ int gk20a_fence_from_syncpt( u32 id, u32 value, bool wfi, bool need_sync_fence); -struct gk20a_fence *gk20a_alloc_fence(struct channel_gk20a *c); +int gk20a_alloc_fence_pool( + struct channel_gk20a *c, + int size); + +void gk20a_free_fence_pool( + struct channel_gk20a *c); + +struct gk20a_fence *gk20a_alloc_fence( + struct channel_gk20a *c); void gk20a_init_fence(struct gk20a_fence *f, const struct gk20a_fence_ops *ops, -- cgit v1.2.2