13ed4351aSDaniel Vetter /* 23ed4351aSDaniel Vetter * Copyright 2016 Intel Corp. 33ed4351aSDaniel Vetter * 43ed4351aSDaniel Vetter * Permission is hereby granted, free of charge, to any person obtaining a 53ed4351aSDaniel Vetter * copy of this software and associated documentation files (the "Software"), 63ed4351aSDaniel Vetter * to deal in the Software without restriction, including without limitation 73ed4351aSDaniel Vetter * the rights to use, copy, modify, merge, publish, distribute, sublicense, 83ed4351aSDaniel Vetter * and/or sell copies of the Software, and to permit persons to whom the 93ed4351aSDaniel Vetter * Software is furnished to do so, subject to the following conditions: 103ed4351aSDaniel Vetter * 113ed4351aSDaniel Vetter * The above copyright notice and this permission notice (including the next 123ed4351aSDaniel Vetter * paragraph) shall be included in all copies or substantial portions of the 133ed4351aSDaniel Vetter * Software. 143ed4351aSDaniel Vetter * 153ed4351aSDaniel Vetter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 163ed4351aSDaniel Vetter * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 173ed4351aSDaniel Vetter * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 183ed4351aSDaniel Vetter * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 193ed4351aSDaniel Vetter * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 203ed4351aSDaniel Vetter * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 213ed4351aSDaniel Vetter * OTHER DEALINGS IN THE SOFTWARE. 223ed4351aSDaniel Vetter */ 233ed4351aSDaniel Vetter 243ed4351aSDaniel Vetter #ifndef _DRM_VBLANK_H_ 253ed4351aSDaniel Vetter #define _DRM_VBLANK_H_ 263ed4351aSDaniel Vetter 273ed4351aSDaniel Vetter #include <linux/seqlock.h> 283ed4351aSDaniel Vetter #include <linux/idr.h> 293ed4351aSDaniel Vetter #include <linux/poll.h> 303ed4351aSDaniel Vetter 313ed4351aSDaniel Vetter #include <drm/drm_file.h> 323ed4351aSDaniel Vetter #include <drm/drm_modes.h> 333ed4351aSDaniel Vetter #include <uapi/drm/drm.h> 343ed4351aSDaniel Vetter 353ed4351aSDaniel Vetter struct drm_device; 363ed4351aSDaniel Vetter struct drm_crtc; 373ed4351aSDaniel Vetter 383ed4351aSDaniel Vetter /** 393ed4351aSDaniel Vetter * struct drm_pending_vblank_event - pending vblank event tracking 403ed4351aSDaniel Vetter */ 413ed4351aSDaniel Vetter struct drm_pending_vblank_event { 423ed4351aSDaniel Vetter /** 433ed4351aSDaniel Vetter * @base: Base structure for tracking pending DRM events. 443ed4351aSDaniel Vetter */ 453ed4351aSDaniel Vetter struct drm_pending_event base; 463ed4351aSDaniel Vetter /** 473ed4351aSDaniel Vetter * @pipe: drm_crtc_index() of the &drm_crtc this event is for. 483ed4351aSDaniel Vetter */ 493ed4351aSDaniel Vetter unsigned int pipe; 503ed4351aSDaniel Vetter /** 51570e8696SKeith Packard * @sequence: frame event should be triggered at 52570e8696SKeith Packard */ 53570e8696SKeith Packard u64 sequence; 54570e8696SKeith Packard /** 553ed4351aSDaniel Vetter * @event: Actual event which will be sent to userspace. 563ed4351aSDaniel Vetter */ 57bd386e51SKeith Packard union { 58bd386e51SKeith Packard struct drm_event base; 59bd386e51SKeith Packard struct drm_event_vblank vbl; 603064abfaSKeith Packard struct drm_event_crtc_sequence seq; 61bd386e51SKeith Packard } event; 623ed4351aSDaniel Vetter }; 633ed4351aSDaniel Vetter 643ed4351aSDaniel Vetter /** 653ed4351aSDaniel Vetter * struct drm_vblank_crtc - vblank tracking for a CRTC 663ed4351aSDaniel Vetter * 673ed4351aSDaniel Vetter * This structure tracks the vblank state for one CRTC. 683ed4351aSDaniel Vetter * 693ed4351aSDaniel Vetter * Note that for historical reasons - the vblank handling code is still shared 703ed4351aSDaniel Vetter * with legacy/non-kms drivers - this is a free-standing structure not directly 713ed4351aSDaniel Vetter * connected to &struct drm_crtc. But all public interface functions are taking 723ed4351aSDaniel Vetter * a &struct drm_crtc to hide this implementation detail. 733ed4351aSDaniel Vetter */ 743ed4351aSDaniel Vetter struct drm_vblank_crtc { 753ed4351aSDaniel Vetter /** 763ed4351aSDaniel Vetter * @dev: Pointer to the &drm_device. 773ed4351aSDaniel Vetter */ 783ed4351aSDaniel Vetter struct drm_device *dev; 793ed4351aSDaniel Vetter /** 803ed4351aSDaniel Vetter * @queue: Wait queue for vblank waiters. 813ed4351aSDaniel Vetter */ 823ed4351aSDaniel Vetter wait_queue_head_t queue; /**< VBLANK wait queue */ 833ed4351aSDaniel Vetter /** 843ed4351aSDaniel Vetter * @disable_timer: Disable timer for the delayed vblank disabling 853ed4351aSDaniel Vetter * hysteresis logic. Vblank disabling is controlled through the 863ed4351aSDaniel Vetter * drm_vblank_offdelay module option and the setting of the 873ed4351aSDaniel Vetter * &drm_device.max_vblank_count value. 883ed4351aSDaniel Vetter */ 893ed4351aSDaniel Vetter struct timer_list disable_timer; 903ed4351aSDaniel Vetter 913ed4351aSDaniel Vetter /** 923ed4351aSDaniel Vetter * @seqlock: Protect vblank count and time. 933ed4351aSDaniel Vetter */ 943ed4351aSDaniel Vetter seqlock_t seqlock; /* protects vblank count and time */ 953ed4351aSDaniel Vetter 963ed4351aSDaniel Vetter /** 973ed4351aSDaniel Vetter * @count: Current software vblank counter. 983ed4351aSDaniel Vetter */ 99570e8696SKeith Packard u64 count; 1003ed4351aSDaniel Vetter /** 1013ed4351aSDaniel Vetter * @time: Vblank timestamp corresponding to @count. 1023ed4351aSDaniel Vetter */ 10367680d3cSArnd Bergmann ktime_t time; 1043ed4351aSDaniel Vetter 1053ed4351aSDaniel Vetter /** 1063ed4351aSDaniel Vetter * @refcount: Number of users/waiters of the vblank interrupt. Only when 1073ed4351aSDaniel Vetter * this refcount reaches 0 can the hardware interrupt be disabled using 1083ed4351aSDaniel Vetter * @disable_timer. 1093ed4351aSDaniel Vetter */ 1103ed4351aSDaniel Vetter atomic_t refcount; /* number of users of vblank interruptsper crtc */ 1113ed4351aSDaniel Vetter /** 1123ed4351aSDaniel Vetter * @last: Protected by &drm_device.vbl_lock, used for wraparound handling. 1133ed4351aSDaniel Vetter */ 1143ed4351aSDaniel Vetter u32 last; 1153ed4351aSDaniel Vetter /** 1163ed4351aSDaniel Vetter * @inmodeset: Tracks whether the vblank is disabled due to a modeset. 1173ed4351aSDaniel Vetter * For legacy driver bit 2 additionally tracks whether an additional 1183ed4351aSDaniel Vetter * temporary vblank reference has been acquired to paper over the 1193ed4351aSDaniel Vetter * hardware counter resetting/jumping. KMS drivers should instead just 1203ed4351aSDaniel Vetter * call drm_crtc_vblank_off() and drm_crtc_vblank_on(), which explicitly 1213ed4351aSDaniel Vetter * save and restore the vblank count. 1223ed4351aSDaniel Vetter */ 1233ed4351aSDaniel Vetter unsigned int inmodeset; /* Display driver is setting mode */ 1243ed4351aSDaniel Vetter /** 1253ed4351aSDaniel Vetter * @pipe: drm_crtc_index() of the &drm_crtc corresponding to this 1263ed4351aSDaniel Vetter * structure. 1273ed4351aSDaniel Vetter */ 1283ed4351aSDaniel Vetter unsigned int pipe; 1293ed4351aSDaniel Vetter /** 1303ed4351aSDaniel Vetter * @framedur_ns: Frame/Field duration in ns, used by 1313ed4351aSDaniel Vetter * drm_calc_vbltimestamp_from_scanoutpos() and computed by 1323ed4351aSDaniel Vetter * drm_calc_timestamping_constants(). 1333ed4351aSDaniel Vetter */ 1343ed4351aSDaniel Vetter int framedur_ns; 1353ed4351aSDaniel Vetter /** 1363ed4351aSDaniel Vetter * @linedur_ns: Line duration in ns, used by 1373ed4351aSDaniel Vetter * drm_calc_vbltimestamp_from_scanoutpos() and computed by 1383ed4351aSDaniel Vetter * drm_calc_timestamping_constants(). 1393ed4351aSDaniel Vetter */ 1403ed4351aSDaniel Vetter int linedur_ns; 1413ed4351aSDaniel Vetter 1423ed4351aSDaniel Vetter /** 1433ed4351aSDaniel Vetter * @hwmode: 1443ed4351aSDaniel Vetter * 1453ed4351aSDaniel Vetter * Cache of the current hardware display mode. Only valid when @enabled 1463ed4351aSDaniel Vetter * is set. This is used by helpers like 1473ed4351aSDaniel Vetter * drm_calc_vbltimestamp_from_scanoutpos(). We can't just access the 1483ed4351aSDaniel Vetter * hardware mode by e.g. looking at &drm_crtc_state.adjusted_mode, 1493ed4351aSDaniel Vetter * because that one is really hard to get from interrupt context. 1503ed4351aSDaniel Vetter */ 1513ed4351aSDaniel Vetter struct drm_display_mode hwmode; 1523ed4351aSDaniel Vetter 1533ed4351aSDaniel Vetter /** 1543ed4351aSDaniel Vetter * @enabled: Tracks the enabling state of the corresponding &drm_crtc to 1553ed4351aSDaniel Vetter * avoid double-disabling and hence corrupting saved state. Needed by 1563ed4351aSDaniel Vetter * drivers not using atomic KMS, since those might go through their CRTC 1573ed4351aSDaniel Vetter * disabling functions multiple times. 1583ed4351aSDaniel Vetter */ 1593ed4351aSDaniel Vetter bool enabled; 1603ed4351aSDaniel Vetter }; 1613ed4351aSDaniel Vetter 1623ed4351aSDaniel Vetter int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs); 163570e8696SKeith Packard u64 drm_crtc_vblank_count(struct drm_crtc *crtc); 164570e8696SKeith Packard u64 drm_crtc_vblank_count_and_time(struct drm_crtc *crtc, 16567680d3cSArnd Bergmann ktime_t *vblanktime); 1663ed4351aSDaniel Vetter void drm_crtc_send_vblank_event(struct drm_crtc *crtc, 1673ed4351aSDaniel Vetter struct drm_pending_vblank_event *e); 1683ed4351aSDaniel Vetter void drm_crtc_arm_vblank_event(struct drm_crtc *crtc, 1693ed4351aSDaniel Vetter struct drm_pending_vblank_event *e); 170bd386e51SKeith Packard void drm_vblank_set_event(struct drm_pending_vblank_event *e, 171bd386e51SKeith Packard u64 *seq, 172bd386e51SKeith Packard ktime_t *now); 1733ed4351aSDaniel Vetter bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe); 1743ed4351aSDaniel Vetter bool drm_crtc_handle_vblank(struct drm_crtc *crtc); 1753ed4351aSDaniel Vetter int drm_crtc_vblank_get(struct drm_crtc *crtc); 1763ed4351aSDaniel Vetter void drm_crtc_vblank_put(struct drm_crtc *crtc); 1773ed4351aSDaniel Vetter void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe); 1783ed4351aSDaniel Vetter void drm_crtc_wait_one_vblank(struct drm_crtc *crtc); 1793ed4351aSDaniel Vetter void drm_crtc_vblank_off(struct drm_crtc *crtc); 1803ed4351aSDaniel Vetter void drm_crtc_vblank_reset(struct drm_crtc *crtc); 1813ed4351aSDaniel Vetter void drm_crtc_vblank_on(struct drm_crtc *crtc); 182ca814b25SDaniel Vetter u32 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc); 1833ed4351aSDaniel Vetter 1843ed4351aSDaniel Vetter bool drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, 1853ed4351aSDaniel Vetter unsigned int pipe, int *max_error, 18667680d3cSArnd Bergmann ktime_t *vblank_time, 1873ed4351aSDaniel Vetter bool in_vblank_irq); 1883ed4351aSDaniel Vetter void drm_calc_timestamping_constants(struct drm_crtc *crtc, 1893ed4351aSDaniel Vetter const struct drm_display_mode *mode); 1903ed4351aSDaniel Vetter wait_queue_head_t *drm_crtc_vblank_waitqueue(struct drm_crtc *crtc); 1913ed4351aSDaniel Vetter #endif 192