summaryrefslogtreecommitdiff
path: root/drivers/staging/android/sync.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/android/sync.h')
-rw-r--r--drivers/staging/android/sync.h79
1 files changed, 34 insertions, 45 deletions
diff --git a/drivers/staging/android/sync.h b/drivers/staging/android/sync.h
index a21b79fb4c8e..9babc0add723 100644
--- a/drivers/staging/android/sync.h
+++ b/drivers/staging/android/sync.h
@@ -19,7 +19,6 @@
#include <linux/list.h>
#include <linux/spinlock.h>
#include <linux/wait.h>
-#include <linux/fence.h>
#include "uapi/sync.h"
@@ -41,6 +40,8 @@ struct sync_fence;
* -1 if a will signal before b
* @free_pt: called before sync_pt is freed
* @release_obj: called before sync_timeline is freed
+ * @print_obj: deprecated
+ * @print_pt: deprecated
* @fill_driver_data: write implementation specific driver data to data.
* should return an error if there is not enough room
* as specified by size. This information is returned
@@ -66,6 +67,13 @@ struct sync_timeline_ops {
/* optional */
void (*release_obj)(struct sync_timeline *sync_timeline);
+ /* deprecated */
+ void (*print_obj)(struct seq_file *s,
+ struct sync_timeline *sync_timeline);
+
+ /* deprecated */
+ void (*print_pt)(struct seq_file *s, struct sync_pt *sync_pt);
+
/* optional */
int (*fill_driver_data)(struct sync_pt *syncpt, void *data, int size);
@@ -96,21 +104,19 @@ struct sync_timeline {
/* protected by child_list_lock */
bool destroyed;
- int context, value;
struct list_head child_list_head;
spinlock_t child_list_lock;
struct list_head active_list_head;
+ spinlock_t active_list_lock;
-#ifdef CONFIG_DEBUG_FS
struct list_head sync_timeline_list;
-#endif
};
/**
* struct sync_pt - sync point
- * @fence: base fence class
+ * @parent: sync_timeline to which this sync_pt belongs
* @child_list: membership in sync_timeline.child_list_head
* @active_list: membership in sync_timeline.active_list_head
* @signaled_list: membership in temporary signaled_list on stack
@@ -121,22 +127,19 @@ struct sync_timeline {
* signaled or error.
*/
struct sync_pt {
- struct fence base;
-
+ struct sync_timeline *parent;
struct list_head child_list;
+
struct list_head active_list;
-};
+ struct list_head signaled_list;
-static inline struct sync_timeline *sync_pt_parent(struct sync_pt *pt)
-{
- return container_of(pt->base.lock, struct sync_timeline,
- child_list_lock);
-}
+ struct sync_fence *fence;
+ struct list_head pt_list;
+
+ /* protected by parent->active_list_lock */
+ int status;
-struct sync_fence_cb {
- struct fence_cb cb;
- struct fence *sync_pt;
- struct sync_fence *fence;
+ ktime_t timestamp;
};
/**
@@ -146,7 +149,9 @@ struct sync_fence_cb {
* @name: name of sync_fence. Useful for debugging
* @pt_list_head: list of sync_pts in the fence. immutable once fence
* is created
- * @status: 0: signaled, >0:active, <0: error
+ * @waiter_list_head: list of asynchronous waiters on this fence
+ * @waiter_list_lock: lock protecting @waiter_list_head and @status
+ * @status: 1: signaled, 0:active, <0: error
*
* @wq: wait queue for fence signaling
* @sync_fence_list: membership in global fence list
@@ -155,15 +160,17 @@ struct sync_fence {
struct file *file;
struct kref kref;
char name[32];
-#ifdef CONFIG_DEBUG_FS
- struct list_head sync_fence_list;
-#endif
- int num_fences;
+
+ /* this list is immutable once the fence is created */
+ struct list_head pt_list_head;
+
+ struct list_head waiter_list_head;
+ spinlock_t waiter_list_lock; /* also protects status */
+ int status;
wait_queue_head_t wq;
- atomic_t status;
- struct sync_fence_cb cbs[];
+ struct list_head sync_fence_list;
};
struct sync_fence_waiter;
@@ -177,14 +184,14 @@ typedef void (*sync_callback_t)(struct sync_fence *fence,
* @callback_data: pointer to pass to @callback
*/
struct sync_fence_waiter {
- wait_queue_t work;
- sync_callback_t callback;
+ struct list_head waiter_list;
+
+ sync_callback_t callback;
};
static inline void sync_fence_waiter_init(struct sync_fence_waiter *waiter,
sync_callback_t callback)
{
- INIT_LIST_HEAD(&waiter->work.task_list);
waiter->callback = callback;
}
@@ -335,22 +342,4 @@ int sync_fence_cancel_async(struct sync_fence *fence,
*/
int sync_fence_wait(struct sync_fence *fence, long timeout);
-#ifdef CONFIG_DEBUG_FS
-
-extern void sync_timeline_debug_add(struct sync_timeline *obj);
-extern void sync_timeline_debug_remove(struct sync_timeline *obj);
-extern void sync_fence_debug_add(struct sync_fence *fence);
-extern void sync_fence_debug_remove(struct sync_fence *fence);
-extern void sync_dump(void);
-
-#else
-# define sync_timeline_debug_add(obj)
-# define sync_timeline_debug_remove(obj)
-# define sync_fence_debug_add(fence)
-# define sync_fence_debug_remove(fence)
-# define sync_dump()
-#endif
-int sync_fence_wake_up_wq(wait_queue_t *curr, unsigned mode,
- int wake_flags, void *key);
-
#endif /* _LINUX_SYNC_H */