drm_syncobj.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. * @lock: Protects &cb_list and write-locks &fence.
  55. */
  56. spinlock_t lock;
  57. /**
  58. * @file: A file backing for this syncobj.
  59. */
  60. struct file *file;
  61. };
  62. void drm_syncobj_free(struct kref *kref);
  63. /**
  64. * drm_syncobj_get - acquire a syncobj reference
  65. * @obj: sync object
  66. *
  67. * This acquires an additional reference to @obj. It is illegal to call this
  68. * without already holding a reference. No locks required.
  69. */
  70. static inline void
  71. drm_syncobj_get(struct drm_syncobj *obj)
  72. {
  73. kref_get(&obj->refcount);
  74. }
  75. /**
  76. * drm_syncobj_put - release a reference to a sync object.
  77. * @obj: sync object.
  78. */
  79. static inline void
  80. drm_syncobj_put(struct drm_syncobj *obj)
  81. {
  82. kref_put(&obj->refcount, drm_syncobj_free);
  83. }
  84. /**
  85. * drm_syncobj_fence_get - get a reference to a fence in a sync object
  86. * @syncobj: sync object.
  87. *
  88. * This acquires additional reference to &drm_syncobj.fence contained in @obj,
  89. * if not NULL. It is illegal to call this without already holding a reference.
  90. * No locks required.
  91. *
  92. * Returns:
  93. * Either the fence of @obj or NULL if there's none.
  94. */
  95. static inline struct dma_fence *
  96. drm_syncobj_fence_get(struct drm_syncobj *syncobj)
  97. {
  98. struct dma_fence *fence;
  99. rcu_read_lock();
  100. fence = dma_fence_get_rcu_safe(&syncobj->fence);
  101. rcu_read_unlock();
  102. return fence;
  103. }
  104. struct drm_syncobj *drm_syncobj_find(struct drm_file *file_private,
  105. u32 handle);
  106. void drm_syncobj_add_point(struct drm_syncobj *syncobj,
  107. struct dma_fence_chain *chain,
  108. struct dma_fence *fence,
  109. uint64_t point);
  110. void drm_syncobj_replace_fence(struct drm_syncobj *syncobj,
  111. struct dma_fence *fence);
  112. int drm_syncobj_find_fence(struct drm_file *file_private,
  113. u32 handle, u64 point, u64 flags,
  114. struct dma_fence **fence);
  115. void drm_syncobj_free(struct kref *kref);
  116. int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,
  117. struct dma_fence *fence);
  118. int drm_syncobj_get_handle(struct drm_file *file_private,
  119. struct drm_syncobj *syncobj, u32 *handle);
  120. int drm_syncobj_get_fd(struct drm_syncobj *syncobj, int *p_fd);
  121. #endif