root/include/drm/drm_syncobj.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. drm_syncobj_get
  2. drm_syncobj_put
  3. drm_syncobj_fence_get

   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 #include <linux/dma-fence-chain.h>
  31 
  32 struct drm_file;
  33 
  34 /**
  35  * struct drm_syncobj - sync object.
  36  *
  37  * This structure defines a generic sync object which wraps a &dma_fence.
  38  */
  39 struct drm_syncobj {
  40         /**
  41          * @refcount: Reference count of this object.
  42          */
  43         struct kref refcount;
  44         /**
  45          * @fence:
  46          * NULL or a pointer to the fence bound to this object.
  47          *
  48          * This field should not be used directly. Use drm_syncobj_fence_get()
  49          * and drm_syncobj_replace_fence() instead.
  50          */
  51         struct dma_fence __rcu *fence;
  52         /**
  53          * @cb_list: List of callbacks to call when the &fence gets replaced.
  54          */
  55         struct list_head cb_list;
  56         /**
  57          * @lock: Protects &cb_list and write-locks &fence.
  58          */
  59         spinlock_t lock;
  60         /**
  61          * @file: A file backing for this syncobj.
  62          */
  63         struct file *file;
  64 };
  65 
  66 void drm_syncobj_free(struct kref *kref);
  67 
  68 /**
  69  * drm_syncobj_get - acquire a syncobj reference
  70  * @obj: sync object
  71  *
  72  * This acquires an additional reference to @obj. It is illegal to call this
  73  * without already holding a reference. No locks required.
  74  */
  75 static inline void
  76 drm_syncobj_get(struct drm_syncobj *obj)
  77 {
  78         kref_get(&obj->refcount);
  79 }
  80 
  81 /**
  82  * drm_syncobj_put - release a reference to a sync object.
  83  * @obj: sync object.
  84  */
  85 static inline void
  86 drm_syncobj_put(struct drm_syncobj *obj)
  87 {
  88         kref_put(&obj->refcount, drm_syncobj_free);
  89 }
  90 
  91 /**
  92  * drm_syncobj_fence_get - get a reference to a fence in a sync object
  93  * @syncobj: sync object.
  94  *
  95  * This acquires additional reference to &drm_syncobj.fence contained in @obj,
  96  * if not NULL. It is illegal to call this without already holding a reference.
  97  * No locks required.
  98  *
  99  * Returns:
 100  * Either the fence of @obj or NULL if there's none.
 101  */
 102 static inline struct dma_fence *
 103 drm_syncobj_fence_get(struct drm_syncobj *syncobj)
 104 {
 105         struct dma_fence *fence;
 106 
 107         rcu_read_lock();
 108         fence = dma_fence_get_rcu_safe(&syncobj->fence);
 109         rcu_read_unlock();
 110 
 111         return fence;
 112 }
 113 
 114 struct drm_syncobj *drm_syncobj_find(struct drm_file *file_private,
 115                                      u32 handle);
 116 void drm_syncobj_add_point(struct drm_syncobj *syncobj,
 117                            struct dma_fence_chain *chain,
 118                            struct dma_fence *fence,
 119                            uint64_t point);
 120 void drm_syncobj_replace_fence(struct drm_syncobj *syncobj,
 121                                struct dma_fence *fence);
 122 int drm_syncobj_find_fence(struct drm_file *file_private,
 123                            u32 handle, u64 point, u64 flags,
 124                            struct dma_fence **fence);
 125 void drm_syncobj_free(struct kref *kref);
 126 int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,
 127                        struct dma_fence *fence);
 128 int drm_syncobj_get_handle(struct drm_file *file_private,
 129                            struct drm_syncobj *syncobj, u32 *handle);
 130 int drm_syncobj_get_fd(struct drm_syncobj *syncobj, int *p_fd);
 131 
 132 #endif

/* [<][>][^][v][top][bottom][index][help] */