From bcf60a22c3e8671468517d34aa37548272455c1f Mon Sep 17 00:00:00 2001 From: Lauri Peltonen Date: Fri, 18 Jul 2014 02:21:34 +0300 Subject: gpu: nvgpu: Add gk20a_fence type When moving compression state tracking and compbit management ops to kernel, we need to attach a fence to dma-buf metadata, along with the compbit state. To make in-kernel fence management easier, introduce a new gk20a_fence abstraction. A gk20a_fence may be backed by a semaphore or a syncpoint (id, value) pair. If the kernel is configured with CONFIG_SYNC, it will also contain a sync_fence. The gk20a_fence can easily be converted back to a syncpoint (id, value) parir or sync FD when we need to return it to user space. Change gk20a_submit_channel_gpfifo to return a gk20a_fence instead of nvhost_fence. This is to facilitate work submission initiated from kernel. Bug 1509620 Change-Id: I6154764a279dba83f5e91ba9e0cb5e227ca08e1b Signed-off-by: Lauri Peltonen Reviewed-on: http://git-master/r/439846 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Terje Bergstrom Tested-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/fence_gk20a.h | 68 +++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 drivers/gpu/nvgpu/gk20a/fence_gk20a.h (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 new file mode 100644 index 00000000..629dc694 --- /dev/null +++ b/drivers/gpu/nvgpu/gk20a/fence_gk20a.h @@ -0,0 +1,68 @@ +/* + * drivers/video/tegra/host/gk20a/fence_gk20a.h + * + * GK20A Fences + * + * Copyright (c) 2014, 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 +#include +#include + +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); + +/* 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 -- cgit v1.2.2