drm_syncobj.h 4.0 KB

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