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