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/channel_sync_gk20a.h | 74 +++++++++++----------------- 1 file changed, 28 insertions(+), 46 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h') diff --git a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h index baa4a151..a3cd8208 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h @@ -24,34 +24,28 @@ struct gk20a_channel_sync; struct priv_cmd_entry; struct channel_gk20a; struct gk20a_semaphore; - -struct gk20a_channel_fence { - bool valid; - bool wfi; /* was issued with preceding wfi */ - u32 thresh; /* syncpoint fences only */ - struct gk20a_semaphore *semaphore; /* semaphore fences only */ -}; +struct gk20a_fence; struct gk20a_channel_sync { - /* CPU wait for a fence returned by incr_syncpt() or incr_fd(). */ - int (*wait_cpu)(struct gk20a_channel_sync *s, - struct gk20a_channel_fence *fence, - int timeout); - - /* Test whether a fence returned by incr_syncpt() or incr_fd() is - * expired. */ - bool (*is_expired)(struct gk20a_channel_sync *s, - struct gk20a_channel_fence *fence); - - /* Generate a gpu wait cmdbuf from syncpoint. */ + /* Generate a gpu wait cmdbuf from syncpoint. + * Returns + * - a gpu cmdbuf that performs the wait when executed, + * - possibly a helper fence that the caller must hold until the + * cmdbuf is executed. + */ int (*wait_syncpt)(struct gk20a_channel_sync *s, u32 id, u32 thresh, struct priv_cmd_entry **entry, - struct gk20a_channel_fence *fence); + struct gk20a_fence **fence); - /* Generate a gpu wait cmdbuf from sync fd. */ + /* Generate a gpu wait cmdbuf from sync fd. + * Returns + * - a gpu cmdbuf that performs the wait when executed, + * - possibly a helper fence that the caller must hold until the + * cmdbuf is executed. + */ int (*wait_fd)(struct gk20a_channel_sync *s, int fd, struct priv_cmd_entry **entry, - struct gk20a_channel_fence *fence); + struct gk20a_fence **fence); /* Increment syncpoint/semaphore. * Returns @@ -60,7 +54,7 @@ struct gk20a_channel_sync { */ int (*incr)(struct gk20a_channel_sync *s, struct priv_cmd_entry **entry, - struct gk20a_channel_fence *fence); + struct gk20a_fence **fence); /* Increment syncpoint/semaphore, preceded by a wfi. * Returns @@ -69,38 +63,29 @@ struct gk20a_channel_sync { */ int (*incr_wfi)(struct gk20a_channel_sync *s, struct priv_cmd_entry **entry, - struct gk20a_channel_fence *fence); - - /* Increment syncpoint, so that the returned fence represents - * work completion (may need wfi) and can be returned to user space. - * Returns - * - a gpu cmdbuf that performs the increment when executed, - * - a fence that can be passed to wait_cpu() and is_expired(), - * - a syncpoint id/value pair that can be returned to user space. - */ - int (*incr_user_syncpt)(struct gk20a_channel_sync *s, - struct priv_cmd_entry **entry, - struct gk20a_channel_fence *fence, - bool wfi, - u32 *id, u32 *thresh); + struct gk20a_fence **fence); /* Increment syncpoint/semaphore, so that the returned fence represents * work completion (may need wfi) and can be returned to user space. * Returns * - a gpu cmdbuf that performs the increment when executed, * - a fence that can be passed to wait_cpu() and is_expired(), - * - a sync fd that can be returned to user space. + * - a gk20a_fence that signals when the incr has happened. */ - int (*incr_user_fd)(struct gk20a_channel_sync *s, - int wait_fence_fd, - struct priv_cmd_entry **entry, - struct gk20a_channel_fence *fence, - bool wfi, - int *fd); + int (*incr_user)(struct gk20a_channel_sync *s, + int wait_fence_fd, + struct priv_cmd_entry **entry, + struct gk20a_fence **fence, + bool wfi); /* Reset the channel syncpoint/semaphore. */ void (*set_min_eq_max)(struct gk20a_channel_sync *s); + /* Signals the sync timeline (if owned by the gk20a_channel_sync layer). + * This should be called when we notice that a gk20a_fence is + * expired. */ + void (*signal_timeline)(struct gk20a_channel_sync *s); + /* flag to set sync destroy aggressiveness */ bool aggressive_destroy; @@ -110,7 +95,4 @@ struct gk20a_channel_sync { struct gk20a_channel_sync *gk20a_channel_sync_create(struct channel_gk20a *c); -void gk20a_channel_fence_close(struct gk20a_channel_fence *f); -void gk20a_channel_fence_dup(struct gk20a_channel_fence *from, - struct gk20a_channel_fence *to); #endif -- cgit v1.2.2