i915_sw_fence.h 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. * i915_sw_fence.h - library routines for N:M synchronisation points
  3. *
  4. * Copyright (C) 2016 Intel Corporation
  5. *
  6. * This file is released under the GPLv2.
  7. *
  8. */
  9. #ifndef _I915_SW_FENCE_H_
  10. #define _I915_SW_FENCE_H_
  11. #include <linux/gfp.h>
  12. #include <linux/kref.h>
  13. #include <linux/notifier.h> /* for NOTIFY_DONE */
  14. #include <linux/wait.h>
  15. struct completion;
  16. struct dma_fence;
  17. struct dma_fence_ops;
  18. struct reservation_object;
  19. struct i915_sw_fence {
  20. wait_queue_head_t wait;
  21. unsigned long flags;
  22. atomic_t pending;
  23. };
  24. #define I915_SW_FENCE_CHECKED_BIT 0 /* used internally for DAG checking */
  25. #define I915_SW_FENCE_PRIVATE_BIT 1 /* available for use by owner */
  26. #define I915_SW_FENCE_MASK (~3)
  27. enum i915_sw_fence_notify {
  28. FENCE_COMPLETE,
  29. FENCE_FREE
  30. };
  31. typedef int (*i915_sw_fence_notify_t)(struct i915_sw_fence *,
  32. enum i915_sw_fence_notify state);
  33. #define __i915_sw_fence_call __aligned(4)
  34. void __i915_sw_fence_init(struct i915_sw_fence *fence,
  35. i915_sw_fence_notify_t fn,
  36. const char *name,
  37. struct lock_class_key *key);
  38. #ifdef CONFIG_LOCKDEP
  39. #define i915_sw_fence_init(fence, fn) \
  40. do { \
  41. static struct lock_class_key __key; \
  42. \
  43. __i915_sw_fence_init((fence), (fn), #fence, &__key); \
  44. } while (0)
  45. #else
  46. #define i915_sw_fence_init(fence, fn) \
  47. __i915_sw_fence_init((fence), (fn), NULL, NULL)
  48. #endif
  49. #ifdef CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS
  50. void i915_sw_fence_fini(struct i915_sw_fence *fence);
  51. #else
  52. static inline void i915_sw_fence_fini(struct i915_sw_fence *fence) {}
  53. #endif
  54. void i915_sw_fence_commit(struct i915_sw_fence *fence);
  55. int i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence,
  56. struct i915_sw_fence *after,
  57. wait_queue_entry_t *wq);
  58. int i915_sw_fence_await_sw_fence_gfp(struct i915_sw_fence *fence,
  59. struct i915_sw_fence *after,
  60. gfp_t gfp);
  61. int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence,
  62. struct dma_fence *dma,
  63. unsigned long timeout,
  64. gfp_t gfp);
  65. int i915_sw_fence_await_reservation(struct i915_sw_fence *fence,
  66. struct reservation_object *resv,
  67. const struct dma_fence_ops *exclude,
  68. bool write,
  69. unsigned long timeout,
  70. gfp_t gfp);
  71. static inline bool i915_sw_fence_signaled(const struct i915_sw_fence *fence)
  72. {
  73. return atomic_read(&fence->pending) <= 0;
  74. }
  75. static inline bool i915_sw_fence_done(const struct i915_sw_fence *fence)
  76. {
  77. return atomic_read(&fence->pending) < 0;
  78. }
  79. static inline void i915_sw_fence_wait(struct i915_sw_fence *fence)
  80. {
  81. wait_event(fence->wait, i915_sw_fence_done(fence));
  82. }
  83. #endif /* _I915_SW_FENCE_H_ */