Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1/*
  2 * Copyright © 2017 Red Hat
  3 *
  4 * Permission is hereby granted, free of charge, to any person obtaining a
  5 * copy of this software and associated documentation files (the "Software"),
  6 * to deal in the Software without restriction, including without limitation
  7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8 * and/or sell copies of the Software, and to permit persons to whom the
  9 * Software is furnished to do so, subject to the following conditions:
 10 *
 11 * The above copyright notice and this permission notice (including the next
 12 * paragraph) shall be included in all copies or substantial portions of the
 13 * Software.
 14 *
 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 21 * IN THE SOFTWARE.
 22 *
 23 * Authors:
 24 *
 25 */
 26#ifndef __DRM_SYNCOBJ_H__
 27#define __DRM_SYNCOBJ_H__
 28
 29#include "linux/dma-fence.h"
 30
 31struct drm_syncobj_cb;
 32
 33/**
 34 * struct drm_syncobj - sync object.
 35 *
 36 * This structure defines a generic sync object which wraps a &dma_fence.
 37 */
 38struct drm_syncobj {
 39	/**
 40	 * @refcount: Reference count of this object.
 41	 */
 42	struct kref refcount;
 43	/**
 44	 * @fence:
 45	 * NULL or a pointer to the fence bound to this object.
 46	 *
 47	 * This field should not be used directly. Use drm_syncobj_fence_get()
 48	 * and drm_syncobj_replace_fence() instead.
 49	 */
 50	struct dma_fence __rcu *fence;
 51	/**
 52	 * @cb_list: List of callbacks to call when the &fence gets replaced.
 53	 */
 54	struct list_head cb_list;
 55	/**
 56	 * @lock: Protects &cb_list and write-locks &fence.
 57	 */
 58	spinlock_t lock;
 59	/**
 60	 * @file: A file backing for this syncobj.
 61	 */
 62	struct file *file;
 63};
 64
 65typedef void (*drm_syncobj_func_t)(struct drm_syncobj *syncobj,
 66				   struct drm_syncobj_cb *cb);
 67
 68/**
 69 * struct drm_syncobj_cb - callback for drm_syncobj_add_callback
 70 * @node: used by drm_syncob_add_callback to append this struct to
 71 *	  &drm_syncobj.cb_list
 72 * @func: drm_syncobj_func_t to call
 73 *
 74 * This struct will be initialized by drm_syncobj_add_callback, additional
 75 * data can be passed along by embedding drm_syncobj_cb in another struct.
 76 * The callback will get called the next time drm_syncobj_replace_fence is
 77 * called.
 78 */
 79struct drm_syncobj_cb {
 80	struct list_head node;
 81	drm_syncobj_func_t func;
 82};
 83
 84void drm_syncobj_free(struct kref *kref);
 85
 86/**
 87 * drm_syncobj_get - acquire a syncobj reference
 88 * @obj: sync object
 89 *
 90 * This acquires an additional reference to @obj. It is illegal to call this
 91 * without already holding a reference. No locks required.
 92 */
 93static inline void
 94drm_syncobj_get(struct drm_syncobj *obj)
 95{
 96	kref_get(&obj->refcount);
 97}
 98
 99/**
100 * drm_syncobj_put - release a reference to a sync object.
101 * @obj: sync object.
102 */
103static inline void
104drm_syncobj_put(struct drm_syncobj *obj)
105{
106	kref_put(&obj->refcount, drm_syncobj_free);
107}
108
109/**
110 * drm_syncobj_fence_get - get a reference to a fence in a sync object
111 * @syncobj: sync object.
112 *
113 * This acquires additional reference to &drm_syncobj.fence contained in @obj,
114 * if not NULL. It is illegal to call this without already holding a reference.
115 * No locks required.
116 *
117 * Returns:
118 * Either the fence of @obj or NULL if there's none.
119 */
120static inline struct dma_fence *
121drm_syncobj_fence_get(struct drm_syncobj *syncobj)
122{
123	struct dma_fence *fence;
124
125	rcu_read_lock();
126	fence = dma_fence_get_rcu_safe(&syncobj->fence);
127	rcu_read_unlock();
128
129	return fence;
130}
131
132struct drm_syncobj *drm_syncobj_find(struct drm_file *file_private,
133				     u32 handle);
134void drm_syncobj_add_callback(struct drm_syncobj *syncobj,
135			      struct drm_syncobj_cb *cb,
136			      drm_syncobj_func_t func);
137void drm_syncobj_remove_callback(struct drm_syncobj *syncobj,
138				 struct drm_syncobj_cb *cb);
139void drm_syncobj_replace_fence(struct drm_syncobj *syncobj,
140			       struct dma_fence *fence);
141int drm_syncobj_find_fence(struct drm_file *file_private,
142			   u32 handle,
143			   struct dma_fence **fence);
144void drm_syncobj_free(struct kref *kref);
145int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,
146		       struct dma_fence *fence);
147int drm_syncobj_get_handle(struct drm_file *file_private,
148			   struct drm_syncobj *syncobj, u32 *handle);
149int drm_syncobj_get_fd(struct drm_syncobj *syncobj, int *p_fd);
150
151#endif