2013-03-01 04:42:57 +04:00
/*
2016-08-11 18:26:42 +03:00
* Sync File validation framework and debug infomation
2013-03-01 04:42:57 +04:00
*
* Copyright ( C ) 2012 Google , Inc .
*
* This program is distributed in the hope that 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 _LINUX_SYNC_H
# define _LINUX_SYNC_H
# include <linux/list.h>
2017-06-30 00:12:53 +03:00
# include <linux/rbtree.h>
2013-03-01 04:42:57 +04:00
# include <linux/spinlock.h>
2016-10-25 15:00:45 +03:00
# include <linux/dma-fence.h>
2013-03-01 04:42:57 +04:00
2016-04-28 16:46:57 +03:00
# include <linux/sync_file.h>
# include <uapi/linux/sync_file.h>
2014-02-18 01:58:32 +04:00
2013-03-01 04:42:57 +04:00
/**
* struct sync_timeline - sync object
2013-03-01 04:43:11 +04:00
* @ kref : reference count on fence .
2013-03-01 04:42:57 +04:00
* @ name : name of the sync_timeline . Useful for debugging
2017-06-30 00:05:32 +03:00
* @ lock : lock protecting @ pt_list and @ value
2017-06-30 00:12:53 +03:00
* @ pt_tree : rbtree of active ( unsignaled / errored ) sync_pts
2017-06-30 00:05:32 +03:00
* @ pt_list : list of active ( unsignaled / errored ) sync_pts
2013-03-01 04:43:00 +04:00
* @ sync_timeline_list : membership in global sync_timeline_list
2013-03-01 04:42:57 +04:00
*/
struct sync_timeline {
2013-03-01 04:43:11 +04:00
struct kref kref ;
2013-03-01 04:42:57 +04:00
char name [ 32 ] ;
2017-06-30 00:05:32 +03:00
/* protected by lock */
2016-08-02 04:44:08 +03:00
u64 context ;
int value ;
2013-03-01 04:42:57 +04:00
2017-06-30 00:12:53 +03:00
struct rb_root pt_tree ;
2017-06-30 00:05:32 +03:00
struct list_head pt_list ;
spinlock_t lock ;
2013-03-01 04:43:00 +04:00
struct list_head sync_timeline_list ;
2013-03-01 04:42:57 +04:00
} ;
2016-10-25 15:00:45 +03:00
static inline struct sync_timeline * dma_fence_parent ( struct dma_fence * fence )
2014-07-01 14:57:31 +04:00
{
2017-06-30 00:05:32 +03:00
return container_of ( fence - > lock , struct sync_timeline , lock ) ;
2014-07-01 14:57:31 +04:00
}
2013-03-01 04:42:59 +04:00
2016-05-31 22:59:04 +03:00
/**
* struct sync_pt - sync_pt object
* @ base : base fence object
2017-06-30 00:05:32 +03:00
* @ link : link on the sync timeline ' s list
2017-06-30 00:12:53 +03:00
* @ node : node in the sync timeline ' s tree
2016-05-31 22:59:04 +03:00
*/
struct sync_pt {
2016-10-25 15:00:45 +03:00
struct dma_fence base ;
2017-06-30 00:05:32 +03:00
struct list_head link ;
2017-06-30 00:12:53 +03:00
struct rb_node node ;
2016-05-31 22:59:04 +03:00
} ;
2016-05-31 22:59:05 +03:00
extern const struct file_operations sw_sync_debugfs_fops ;
2015-08-11 00:51:16 +03:00
void sync_timeline_debug_add ( struct sync_timeline * obj ) ;
void sync_timeline_debug_remove ( struct sync_timeline * obj ) ;
2016-01-21 15:49:19 +03:00
void sync_file_debug_add ( struct sync_file * fence ) ;
void sync_file_debug_remove ( struct sync_file * fence ) ;
2015-08-11 00:51:16 +03:00
void sync_dump ( void ) ;
2014-07-01 14:57:31 +04:00
2013-03-01 04:42:57 +04:00
# endif /* _LINUX_SYNC_H */