blob: 7acb7ab2e1a196b9eeb194defe59a940bf9a8cdd [file] [log] [blame]
Erik Gilling7ad530b2013-02-28 16:42:57 -08001/*
Gustavo Padovane912c882016-08-11 12:26:42 -03002 * Sync File validation framework and debug infomation
Erik Gilling7ad530b2013-02-28 16:42:57 -08003 *
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
Chris Wilsone82ecb22017-06-29 22:05:32 +010027 * @lock: lock protecting @pt_list and @value
28 * @pt_list: list of active (unsignaled/errored) sync_pts
Erik Gillingaf7582f2013-02-28 16:43:00 -080029 * @sync_timeline_list: membership in global sync_timeline_list
Erik Gilling7ad530b2013-02-28 16:42:57 -080030 */
31struct sync_timeline {
Erik Gillingc5b86b72013-02-28 16:43:11 -080032 struct kref kref;
Erik Gilling7ad530b2013-02-28 16:42:57 -080033 char name[32];
34
Chris Wilsone82ecb22017-06-29 22:05:32 +010035 /* protected by lock */
Linus Torvalds731c7d32016-08-01 21:44:08 -040036 u64 context;
37 int value;
Erik Gilling7ad530b2013-02-28 16:42:57 -080038
Chris Wilsone82ecb22017-06-29 22:05:32 +010039 struct list_head pt_list;
40 spinlock_t lock;
Erik Gillingaf7582f2013-02-28 16:43:00 -080041
42 struct list_head sync_timeline_list;
Erik Gilling7ad530b2013-02-28 16:42:57 -080043};
44
Gustavo Padovanb55b54b2016-01-21 10:49:21 -020045static inline struct sync_timeline *fence_parent(struct fence *fence)
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020046{
Chris Wilsone82ecb22017-06-29 22:05:32 +010047 return container_of(fence->lock, struct sync_timeline, lock);
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020048}
Erik Gilling7ad530b2013-02-28 16:42:57 -080049
Gustavo Padovan0431b902016-05-31 16:59:04 -030050/**
51 * struct sync_pt - sync_pt object
52 * @base: base fence object
Chris Wilsone82ecb22017-06-29 22:05:32 +010053 * @link: link on the sync timeline's list
Gustavo Padovan0431b902016-05-31 16:59:04 -030054 */
55struct sync_pt {
56 struct fence base;
Chris Wilsone82ecb22017-06-29 22:05:32 +010057 struct list_head link;
Gustavo Padovan0431b902016-05-31 16:59:04 -030058};
59
Gustavo Padovanb1f65602016-05-31 16:59:13 -030060#ifdef CONFIG_SW_SYNC
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020061
Gustavo Padovan1867a232016-05-31 16:59:05 -030062extern const struct file_operations sw_sync_debugfs_fops;
63
Joe Perchesd30649a2015-08-10 14:51:16 -070064void sync_timeline_debug_add(struct sync_timeline *obj);
65void sync_timeline_debug_remove(struct sync_timeline *obj);
Gustavo Padovand7fdb0a2016-01-21 10:49:19 -020066void sync_file_debug_add(struct sync_file *fence);
67void sync_file_debug_remove(struct sync_file *fence);
Joe Perchesd30649a2015-08-10 14:51:16 -070068void sync_dump(void);
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020069
70#else
71# define sync_timeline_debug_add(obj)
72# define sync_timeline_debug_remove(obj)
Gustavo Padovand7fdb0a2016-01-21 10:49:19 -020073# define sync_file_debug_add(fence)
74# define sync_file_debug_remove(fence)
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020075# define sync_dump()
76#endif
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020077
Erik Gilling7ad530b2013-02-28 16:42:57 -080078#endif /* _LINUX_SYNC_H */