1 /* 2 * Copyright 2016 Intel Corp. 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 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 * OTHER DEALINGS IN THE SOFTWARE. 22 */ 23 24 #ifndef _DRM_VBLANK_H_ 25 #define _DRM_VBLANK_H_ 26 27 #include <linux/seqlock.h> 28 #include <linux/idr.h> 29 #include <linux/poll.h> 30 #include <linux/kthread.h> 31 32 #include <drm/drm_file.h> 33 #include <drm/drm_modes.h> 34 35 struct drm_device; 36 struct drm_crtc; 37 struct drm_vblank_work; 38 39 /** 40 * struct drm_pending_vblank_event - pending vblank event tracking 41 */ 42 struct drm_pending_vblank_event { 43 /** 44 * @base: Base structure for tracking pending DRM events. 45 */ 46 struct drm_pending_event base; 47 /** 48 * @pipe: drm_crtc_index() of the &drm_crtc this event is for. 49 */ 50 unsigned int pipe; 51 /** 52 * @sequence: frame event should be triggered at 53 */ 54 u64 sequence; 55 /** 56 * @event: Actual event which will be sent to userspace. 57 */ 58 union { 59 /** 60 * @event.base: DRM event base class. 61 */ 62 struct drm_event base; 63 64 /** 65 * @event.vbl: 66 * 67 * Event payload for vblank events, requested through 68 * either the MODE_PAGE_FLIP or MODE_ATOMIC IOCTL. Also 69 * generated by the legacy WAIT_VBLANK IOCTL, but new userspace 70 * should use MODE_QUEUE_SEQUENCE and &event.seq instead. 71 */ 72 struct drm_event_vblank vbl; 73 74 /** 75 * @event.seq: Event payload for the MODE_QUEUEU_SEQUENCE IOCTL. 76 */ 77 struct drm_event_crtc_sequence seq; 78 } event; 79 }; 80 81 /** 82 * struct drm_vblank_crtc - vblank tracking for a CRTC 83 * 84 * This structure tracks the vblank state for one CRTC. 85 * 86 * Note that for historical reasons - the vblank handling code is still shared 87 * with legacy/non-kms drivers - this is a free-standing structure not directly 88 * connected to &struct drm_crtc. But all public interface functions are taking 89 * a &struct drm_crtc to hide this implementation detail. 90 */ 91 struct drm_vblank_crtc { 92 /** 93 * @dev: Pointer to the &drm_device. 94 */ 95 struct drm_device *dev; 96 /** 97 * @queue: Wait queue for vblank waiters. 98 */ 99 wait_queue_head_t queue; 100 /** 101 * @disable_timer: Disable timer for the delayed vblank disabling 102 * hysteresis logic. Vblank disabling is controlled through the 103 * drm_vblank_offdelay module option and the setting of the 104 * &drm_device.max_vblank_count value. 105 */ 106 struct timer_list disable_timer; 107 108 /** 109 * @seqlock: Protect vblank count and time. 110 */ 111 seqlock_t seqlock; 112 113 /** 114 * @count: 115 * 116 * Current software vblank counter. 117 * 118 * Note that for a given vblank counter value drm_crtc_handle_vblank() 119 * and drm_crtc_vblank_count() or drm_crtc_vblank_count_and_time() 120 * provide a barrier: Any writes done before calling 121 * drm_crtc_handle_vblank() will be visible to callers of the later 122 * functions, iff the vblank count is the same or a later one. 123 * 124 * IMPORTANT: This guarantee requires barriers, therefor never access 125 * this field directly. Use drm_crtc_vblank_count() instead. 126 */ 127 atomic64_t count; 128 /** 129 * @time: Vblank timestamp corresponding to @count. 130 */ 131 ktime_t time; 132 133 /** 134 * @refcount: Number of users/waiters of the vblank interrupt. Only when 135 * this refcount reaches 0 can the hardware interrupt be disabled using 136 * @disable_timer. 137 */ 138 atomic_t refcount; 139 /** 140 * @last: Protected by &drm_device.vbl_lock, used for wraparound handling. 141 */ 142 u32 last; 143 /** 144 * @max_vblank_count: 145 * 146 * Maximum value of the vblank registers for this crtc. This value +1 147 * will result in a wrap-around of the vblank register. It is used 148 * by the vblank core to handle wrap-arounds. 149 * 150 * If set to zero the vblank core will try to guess the elapsed vblanks 151 * between times when the vblank interrupt is disabled through 152 * high-precision timestamps. That approach is suffering from small 153 * races and imprecision over longer time periods, hence exposing a 154 * hardware vblank counter is always recommended. 155 * 156 * This is the runtime configurable per-crtc maximum set through 157 * drm_crtc_set_max_vblank_count(). If this is used the driver 158 * must leave the device wide &drm_device.max_vblank_count at zero. 159 * 160 * If non-zero, &drm_crtc_funcs.get_vblank_counter must be set. 161 */ 162 u32 max_vblank_count; 163 /** 164 * @inmodeset: Tracks whether the vblank is disabled due to a modeset. 165 * For legacy driver bit 2 additionally tracks whether an additional 166 * temporary vblank reference has been acquired to paper over the 167 * hardware counter resetting/jumping. KMS drivers should instead just 168 * call drm_crtc_vblank_off() and drm_crtc_vblank_on(), which explicitly 169 * save and restore the vblank count. 170 */ 171 unsigned int inmodeset; 172 /** 173 * @pipe: drm_crtc_index() of the &drm_crtc corresponding to this 174 * structure. 175 */ 176 unsigned int pipe; 177 /** 178 * @framedur_ns: Frame/Field duration in ns, used by 179 * drm_crtc_vblank_helper_get_vblank_timestamp() and computed by 180 * drm_calc_timestamping_constants(). 181 */ 182 int framedur_ns; 183 /** 184 * @linedur_ns: Line duration in ns, used by 185 * drm_crtc_vblank_helper_get_vblank_timestamp() and computed by 186 * drm_calc_timestamping_constants(). 187 */ 188 int linedur_ns; 189 190 /** 191 * @hwmode: 192 * 193 * Cache of the current hardware display mode. Only valid when @enabled 194 * is set. This is used by helpers like 195 * drm_crtc_vblank_helper_get_vblank_timestamp(). We can't just access 196 * the hardware mode by e.g. looking at &drm_crtc_state.adjusted_mode, 197 * because that one is really hard to get from interrupt context. 198 */ 199 struct drm_display_mode hwmode; 200 201 /** 202 * @enabled: Tracks the enabling state of the corresponding &drm_crtc to 203 * avoid double-disabling and hence corrupting saved state. Needed by 204 * drivers not using atomic KMS, since those might go through their CRTC 205 * disabling functions multiple times. 206 */ 207 bool enabled; 208 209 /** 210 * @worker: The &kthread_worker used for executing vblank works. 211 */ 212 struct kthread_worker *worker; 213 214 /** 215 * @pending_work: A list of scheduled &drm_vblank_work items that are 216 * waiting for a future vblank. 217 */ 218 struct list_head pending_work; 219 220 /** 221 * @work_wait_queue: The wait queue used for signaling that a 222 * &drm_vblank_work item has either finished executing, or was 223 * cancelled. 224 */ 225 wait_queue_head_t work_wait_queue; 226 }; 227 228 struct drm_vblank_crtc *drm_crtc_vblank_crtc(struct drm_crtc *crtc); 229 int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs); 230 bool drm_dev_has_vblank(const struct drm_device *dev); 231 u64 drm_crtc_vblank_count(struct drm_crtc *crtc); 232 u64 drm_crtc_vblank_count_and_time(struct drm_crtc *crtc, 233 ktime_t *vblanktime); 234 int drm_crtc_next_vblank_start(struct drm_crtc *crtc, ktime_t *vblanktime); 235 void drm_crtc_send_vblank_event(struct drm_crtc *crtc, 236 struct drm_pending_vblank_event *e); 237 void drm_crtc_arm_vblank_event(struct drm_crtc *crtc, 238 struct drm_pending_vblank_event *e); 239 void drm_vblank_set_event(struct drm_pending_vblank_event *e, 240 u64 *seq, 241 ktime_t *now); 242 bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe); 243 bool drm_crtc_handle_vblank(struct drm_crtc *crtc); 244 int drm_crtc_vblank_get(struct drm_crtc *crtc); 245 void drm_crtc_vblank_put(struct drm_crtc *crtc); 246 void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe); 247 void drm_crtc_wait_one_vblank(struct drm_crtc *crtc); 248 void drm_crtc_vblank_off(struct drm_crtc *crtc); 249 void drm_crtc_vblank_reset(struct drm_crtc *crtc); 250 void drm_crtc_vblank_on(struct drm_crtc *crtc); 251 u64 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc); 252 void drm_crtc_vblank_restore(struct drm_crtc *crtc); 253 254 void drm_calc_timestamping_constants(struct drm_crtc *crtc, 255 const struct drm_display_mode *mode); 256 wait_queue_head_t *drm_crtc_vblank_waitqueue(struct drm_crtc *crtc); 257 void drm_crtc_set_max_vblank_count(struct drm_crtc *crtc, 258 u32 max_vblank_count); 259 260 /* 261 * Helpers for struct drm_crtc_funcs 262 */ 263 264 typedef bool (*drm_vblank_get_scanout_position_func)(struct drm_crtc *crtc, 265 bool in_vblank_irq, 266 int *vpos, int *hpos, 267 ktime_t *stime, 268 ktime_t *etime, 269 const struct drm_display_mode *mode); 270 271 bool 272 drm_crtc_vblank_helper_get_vblank_timestamp_internal(struct drm_crtc *crtc, 273 int *max_error, 274 ktime_t *vblank_time, 275 bool in_vblank_irq, 276 drm_vblank_get_scanout_position_func get_scanout_position); 277 bool drm_crtc_vblank_helper_get_vblank_timestamp(struct drm_crtc *crtc, 278 int *max_error, 279 ktime_t *vblank_time, 280 bool in_vblank_irq); 281 282 #endif 283
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.