blob: 425ebc5c32aa2afcc4965afb4efdbf2248463c52 [file] [log] [blame]
Erik Gilling7ad530b2013-02-28 16:42:57 -08001/*
2 * include/linux/sync.h
3 *
4 * Copyright (C) 2012 Google, Inc.
5 *
6 * This program is distributed in the hope that it will be useful,
7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 * GNU General Public License for more details.
10 *
11 */
12
13#ifndef _LINUX_SYNC_H
14#define _LINUX_SYNC_H
15
Erik Gilling7ad530b2013-02-28 16:42:57 -080016#include <linux/list.h>
17#include <linux/spinlock.h>
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020018#include <linux/fence.h>
Erik Gilling7ad530b2013-02-28 16:42:57 -080019
Gustavo Padovan460bfc42016-04-28 10:46:57 -030020#include <linux/sync_file.h>
21#include <uapi/linux/sync_file.h>
Colin Cross64907b92014-02-17 13:58:32 -080022
Erik Gilling7ad530b2013-02-28 16:42:57 -080023/**
24 * struct sync_timeline - sync object
Erik Gillingc5b86b72013-02-28 16:43:11 -080025 * @kref: reference count on fence.
Erik Gilling7ad530b2013-02-28 16:42:57 -080026 * @name: name of the sync_timeline. Useful for debugging
Erik Gilling7ad530b2013-02-28 16:42:57 -080027 * @child_list_head: list of children sync_pts for this sync_timeline
Gustavo Padovan342952d2016-05-31 16:59:09 -030028 * @child_list_lock: lock protecting @child_list_head and fence.status
Erik Gilling7ad530b2013-02-28 16:42:57 -080029 * @active_list_head: list of active (unsignaled/errored) sync_pts
Erik Gillingaf7582f2013-02-28 16:43:00 -080030 * @sync_timeline_list: membership in global sync_timeline_list
Erik Gilling7ad530b2013-02-28 16:42:57 -080031 */
32struct sync_timeline {
Erik Gillingc5b86b72013-02-28 16:43:11 -080033 struct kref kref;
Erik Gilling7ad530b2013-02-28 16:42:57 -080034 char name[32];
35
36 /* protected by child_list_lock */
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020037 int context, value;
Erik Gilling7ad530b2013-02-28 16:42:57 -080038
39 struct list_head child_list_head;
40 spinlock_t child_list_lock;
41
42 struct list_head active_list_head;
Erik Gillingaf7582f2013-02-28 16:43:00 -080043
44 struct list_head sync_timeline_list;
Erik Gilling7ad530b2013-02-28 16:42:57 -080045};
46
Gustavo Padovanb55b54b2016-01-21 10:49:21 -020047static inline struct sync_timeline *fence_parent(struct fence *fence)
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020048{
Gustavo Padovanb55b54b2016-01-21 10:49:21 -020049 return container_of(fence->lock, struct sync_timeline,
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020050 child_list_lock);
51}
Erik Gilling7ad530b2013-02-28 16:42:57 -080052
Gustavo Padovan0431b902016-05-31 16:59:04 -030053/**
54 * struct sync_pt - sync_pt object
55 * @base: base fence object
56 * @child_list: sync timeline child's list
57 * @active_list: sync timeline active child's list
58 */
59struct sync_pt {
60 struct fence base;
61 struct list_head child_list;
62 struct list_head active_list;
63};
64
Gustavo Padovanb1f65602016-05-31 16:59:13 -030065#ifdef CONFIG_SW_SYNC
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020066
Gustavo Padovan1867a232016-05-31 16:59:05 -030067extern const struct file_operations sw_sync_debugfs_fops;
68
Joe Perchesd30649a2015-08-10 14:51:16 -070069void sync_timeline_debug_add(struct sync_timeline *obj);
70void sync_timeline_debug_remove(struct sync_timeline *obj);
Gustavo Padovand7fdb0a2016-01-21 10:49:19 -020071void sync_file_debug_add(struct sync_file *fence);
72void sync_file_debug_remove(struct sync_file *fence);
Joe Perchesd30649a2015-08-10 14:51:16 -070073void sync_dump(void);
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020074
75#else
76# define sync_timeline_debug_add(obj)
77# define sync_timeline_debug_remove(obj)
Gustavo Padovand7fdb0a2016-01-21 10:49:19 -020078# define sync_file_debug_add(fence)
79# define sync_file_debug_remove(fence)
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020080# define sync_dump()
81#endif
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020082
Erik Gilling7ad530b2013-02-28 16:42:57 -080083#endif /* _LINUX_SYNC_H */