Files
linux-nvgpu/drivers/gpu/nvgpu/gk20a/fence_gk20a.h
Deepak Nibade 52753b51f1 gpu: nvgpu: create sync_fence only if needed
Currently, we create sync_fence (from nvhost_sync_create_fence())
for every submit
But not all submits request for a sync_fence.

Also, nvhost_sync_create_fence() API takes about 1/3rd of the total
submit path.

Hence to optimize, we can allocate sync_fence
only when user explicitly asks for it using
(NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET &&
NVGPU_SUBMIT_GPFIFO_FLAGS_SYNC_FENCE)

Also, in CDE path from gk20a_prepare_compressible_read(),
we reuse existing fence stored in "state" and that can
result into not returning sync_fence_fd when user asked
for it
Hence, force allocation of sync_fence when job submission
comes from CDE path

Bug 200141116

Change-Id: Ia921701bf0e2432d6b8a5e8b7d91160e7f52db1e
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/812845
(cherry picked from commit 5fd47015eeed00352cc8473eff969a66c94fee98)
Reviewed-on: http://git-master/r/837662
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
2015-12-08 01:18:04 -08:00

70 lines
1.9 KiB
C

/*
* drivers/video/tegra/host/gk20a/fence_gk20a.h
*
* GK20A Fences
*
* Copyright (c) 2014-2015, 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,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*/
#ifndef _GK20A_FENCE_H_
#define _GK20A_FENCE_H_
#include <linux/types.h>
#include <linux/kref.h>
#include <linux/wait.h>
struct platform_device;
struct sync_timeline;
struct sync_fence;
struct gk20a_semaphore;
struct channel_gk20a;
struct gk20a_fence_ops;
struct gk20a_fence {
/* Valid for all fence types: */
struct kref ref;
bool wfi;
struct sync_fence *sync_fence;
const struct gk20a_fence_ops *ops;
/* Valid for fences created from semaphores: */
struct gk20a_semaphore *semaphore;
wait_queue_head_t *semaphore_wq;
/* Valid for fences created from syncpoints: */
struct platform_device *host1x_pdev;
u32 syncpt_id;
u32 syncpt_value;
};
/* Fences can be created from semaphores or syncpoint (id, value) pairs */
struct gk20a_fence *gk20a_fence_from_semaphore(
struct sync_timeline *timeline,
struct gk20a_semaphore *semaphore,
wait_queue_head_t *semaphore_wq,
struct sync_fence *dependency,
bool wfi);
struct gk20a_fence *gk20a_fence_from_syncpt(
struct platform_device *host1x_pdev,
u32 id, u32 value, bool wfi,
bool need_sync_fence);
/* Fence operations */
void gk20a_fence_put(struct gk20a_fence *f);
struct gk20a_fence *gk20a_fence_get(struct gk20a_fence *f);
int gk20a_fence_wait(struct gk20a_fence *f, int timeout);
bool gk20a_fence_is_expired(struct gk20a_fence *f);
int gk20a_fence_install_fd(struct gk20a_fence *f);
#endif