drm_vblank_helper.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. // SPDX-License-Identifier: MIT
  2. #include <drm/drm_atomic.h>
  3. #include <drm/drm_crtc.h>
  4. #include <drm/drm_managed.h>
  5. #include <drm/drm_modeset_helper_vtables.h>
  6. #include <drm/drm_print.h>
  7. #include <drm/drm_vblank.h>
  8. #include <drm/drm_vblank_helper.h>
  9. /**
  10. * DOC: overview
  11. *
  12. * The vblank helper library provides functions for supporting vertical
  13. * blanking in DRM drivers.
  14. *
  15. * For vblank timers, several callback implementations are available.
  16. * Drivers enable support for vblank timers by setting the vblank callbacks
  17. * in struct &drm_crtc_funcs to the helpers provided by this library. The
  18. * initializer macro DRM_CRTC_VBLANK_TIMER_FUNCS does this conveniently.
  19. * The driver further has to send the VBLANK event from its atomic_flush
  20. * callback and control vblank from the CRTC's atomic_enable and atomic_disable
  21. * callbacks. The callbacks are located in struct &drm_crtc_helper_funcs.
  22. * The vblank helper library provides implementations of these callbacks
  23. * for drivers without further requirements. The initializer macro
  24. * DRM_CRTC_HELPER_VBLANK_FUNCS sets them coveniently.
  25. *
  26. * Once the driver enables vblank support with drm_vblank_init(), each
  27. * CRTC's vblank timer fires according to the programmed display mode. By
  28. * default, the vblank timer invokes drm_crtc_handle_vblank(). Drivers with
  29. * more specific requirements can set their own handler function in
  30. * struct &drm_crtc_helper_funcs.handle_vblank_timeout.
  31. */
  32. /*
  33. * VBLANK helpers
  34. */
  35. /**
  36. * drm_crtc_vblank_atomic_flush -
  37. * Implements struct &drm_crtc_helper_funcs.atomic_flush
  38. * @crtc: The CRTC
  39. * @state: The atomic state to apply
  40. *
  41. * The helper drm_crtc_vblank_atomic_flush() implements atomic_flush of
  42. * struct drm_crtc_helper_funcs for CRTCs that only need to send out a
  43. * VBLANK event.
  44. *
  45. * See also struct &drm_crtc_helper_funcs.atomic_flush.
  46. */
  47. void drm_crtc_vblank_atomic_flush(struct drm_crtc *crtc,
  48. struct drm_atomic_state *state)
  49. {
  50. struct drm_device *dev = crtc->dev;
  51. struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
  52. struct drm_pending_vblank_event *event;
  53. spin_lock_irq(&dev->event_lock);
  54. event = crtc_state->event;
  55. crtc_state->event = NULL;
  56. if (event) {
  57. if (drm_crtc_vblank_get(crtc) == 0)
  58. drm_crtc_arm_vblank_event(crtc, event);
  59. else
  60. drm_crtc_send_vblank_event(crtc, event);
  61. }
  62. spin_unlock_irq(&dev->event_lock);
  63. }
  64. EXPORT_SYMBOL(drm_crtc_vblank_atomic_flush);
  65. /**
  66. * drm_crtc_vblank_atomic_enable - Implements struct &drm_crtc_helper_funcs.atomic_enable
  67. * @crtc: The CRTC
  68. * @state: The atomic state
  69. *
  70. * The helper drm_crtc_vblank_atomic_enable() implements atomic_enable
  71. * of struct drm_crtc_helper_funcs for CRTCs the only need to enable VBLANKs.
  72. *
  73. * See also struct &drm_crtc_helper_funcs.atomic_enable.
  74. */
  75. void drm_crtc_vblank_atomic_enable(struct drm_crtc *crtc,
  76. struct drm_atomic_state *state)
  77. {
  78. drm_crtc_vblank_on(crtc);
  79. }
  80. EXPORT_SYMBOL(drm_crtc_vblank_atomic_enable);
  81. /**
  82. * drm_crtc_vblank_atomic_disable - Implements struct &drm_crtc_helper_funcs.atomic_disable
  83. * @crtc: The CRTC
  84. * @state: The atomic state
  85. *
  86. * The helper drm_crtc_vblank_atomic_disable() implements atomic_disable
  87. * of struct drm_crtc_helper_funcs for CRTCs the only need to disable VBLANKs.
  88. *
  89. * See also struct &drm_crtc_funcs.atomic_disable.
  90. */
  91. void drm_crtc_vblank_atomic_disable(struct drm_crtc *crtc,
  92. struct drm_atomic_state *state)
  93. {
  94. drm_crtc_vblank_off(crtc);
  95. }
  96. EXPORT_SYMBOL(drm_crtc_vblank_atomic_disable);
  97. /*
  98. * VBLANK timer
  99. */
  100. /**
  101. * drm_crtc_vblank_helper_enable_vblank_timer - Implements struct &drm_crtc_funcs.enable_vblank
  102. * @crtc: The CRTC
  103. *
  104. * The helper drm_crtc_vblank_helper_enable_vblank_timer() implements
  105. * enable_vblank of struct drm_crtc_helper_funcs for CRTCs that require
  106. * a VBLANK timer. It sets up the timer on the first invocation. The
  107. * started timer expires after the current frame duration. See struct
  108. * &drm_vblank_crtc.framedur_ns.
  109. *
  110. * See also struct &drm_crtc_helper_funcs.enable_vblank.
  111. *
  112. * Returns:
  113. * 0 on success, or a negative errno code otherwise.
  114. */
  115. int drm_crtc_vblank_helper_enable_vblank_timer(struct drm_crtc *crtc)
  116. {
  117. return drm_crtc_vblank_start_timer(crtc);
  118. }
  119. EXPORT_SYMBOL(drm_crtc_vblank_helper_enable_vblank_timer);
  120. /**
  121. * drm_crtc_vblank_helper_disable_vblank_timer - Implements struct &drm_crtc_funcs.disable_vblank
  122. * @crtc: The CRTC
  123. *
  124. * The helper drm_crtc_vblank_helper_disable_vblank_timer() implements
  125. * disable_vblank of struct drm_crtc_funcs for CRTCs that require a
  126. * VBLANK timer.
  127. *
  128. * See also struct &drm_crtc_helper_funcs.disable_vblank.
  129. */
  130. void drm_crtc_vblank_helper_disable_vblank_timer(struct drm_crtc *crtc)
  131. {
  132. drm_crtc_vblank_cancel_timer(crtc);
  133. }
  134. EXPORT_SYMBOL(drm_crtc_vblank_helper_disable_vblank_timer);
  135. /**
  136. * drm_crtc_vblank_helper_get_vblank_timestamp_from_timer -
  137. * Implements struct &drm_crtc_funcs.get_vblank_timestamp
  138. * @crtc: The CRTC
  139. * @max_error: Maximum acceptable error
  140. * @vblank_time: Returns the next vblank timestamp
  141. * @in_vblank_irq: True is called from drm_crtc_handle_vblank()
  142. *
  143. * The helper drm_crtc_helper_get_vblank_timestamp_from_timer() implements
  144. * get_vblank_timestamp of struct drm_crtc_funcs for CRTCs that require a
  145. * VBLANK timer. It returns the timestamp according to the timer's expiry
  146. * time.
  147. *
  148. * See also struct &drm_crtc_funcs.get_vblank_timestamp.
  149. *
  150. * Returns:
  151. * True on success, or false otherwise.
  152. */
  153. bool drm_crtc_vblank_helper_get_vblank_timestamp_from_timer(struct drm_crtc *crtc,
  154. int *max_error,
  155. ktime_t *vblank_time,
  156. bool in_vblank_irq)
  157. {
  158. drm_crtc_vblank_get_vblank_timeout(crtc, vblank_time);
  159. return true;
  160. }
  161. EXPORT_SYMBOL(drm_crtc_vblank_helper_get_vblank_timestamp_from_timer);