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 */ 573ed4351aSDaniel Vetter struct drm_event_vblank event; 583ed4351aSDaniel Vetter }; 593ed4351aSDaniel Vetter 603ed4351aSDaniel Vetter /** 613ed4351aSDaniel Vetter * struct drm_vblank_crtc - vblank tracking for a CRTC 623ed4351aSDaniel Vetter * 633ed4351aSDaniel Vetter * This structure tracks the vblank state for one CRTC. 643ed4351aSDaniel Vetter * 653ed4351aSDaniel Vetter * Note that for historical reasons - the vblank handling code is still shared 663ed4351aSDaniel Vetter * with legacy/non-kms drivers - this is a free-standing structure not directly 673ed4351aSDaniel Vetter * connected to &struct drm_crtc. But all public interface functions are taking 683ed4351aSDaniel Vetter * a &struct drm_crtc to hide this implementation detail. 693ed4351aSDaniel Vetter */ 703ed4351aSDaniel Vetter struct drm_vblank_crtc { 713ed4351aSDaniel Vetter /** 723ed4351aSDaniel Vetter * @dev: Pointer to the &drm_device. 733ed4351aSDaniel Vetter */ 743ed4351aSDaniel Vetter struct drm_device *dev; 753ed4351aSDaniel Vetter /** 763ed4351aSDaniel Vetter * @queue: Wait queue for vblank waiters. 773ed4351aSDaniel Vetter */ 783ed4351aSDaniel Vetter wait_queue_head_t queue; /**< VBLANK wait queue */ 793ed4351aSDaniel Vetter /** 803ed4351aSDaniel Vetter * @disable_timer: Disable timer for the delayed vblank disabling 813ed4351aSDaniel Vetter * hysteresis logic. Vblank disabling is controlled through the 823ed4351aSDaniel Vetter * drm_vblank_offdelay module option and the setting of the 833ed4351aSDaniel Vetter * &drm_device.max_vblank_count value. 843ed4351aSDaniel Vetter */ 853ed4351aSDaniel Vetter struct timer_list disable_timer; 863ed4351aSDaniel Vetter 873ed4351aSDaniel Vetter /** 883ed4351aSDaniel Vetter * @seqlock: Protect vblank count and time. 893ed4351aSDaniel Vetter */ 903ed4351aSDaniel Vetter seqlock_t seqlock; /* protects vblank count and time */ 913ed4351aSDaniel Vetter 923ed4351aSDaniel Vetter /** 933ed4351aSDaniel Vetter * @count: Current software vblank counter. 943ed4351aSDaniel Vetter */ 95570e8696SKeith Packard u64 count; 963ed4351aSDaniel Vetter /** 973ed4351aSDaniel Vetter * @time: Vblank timestamp corresponding to @count. 983ed4351aSDaniel Vetter */ 9967680d3cSArnd Bergmann ktime_t time; 1003ed4351aSDaniel Vetter 1013ed4351aSDaniel Vetter /** 1023ed4351aSDaniel Vetter * @refcount: Number of users/waiters of the vblank interrupt. Only when 1033ed4351aSDaniel Vetter * this refcount reaches 0 can the hardware interrupt be disabled using 1043ed4351aSDaniel Vetter * @disable_timer. 1053ed4351aSDaniel Vetter */ 1063ed4351aSDaniel Vetter atomic_t refcount; /* number of users of vblank interruptsper crtc */ 1073ed4351aSDaniel Vetter /** 1083ed4351aSDaniel Vetter * @last: Protected by &drm_device.vbl_lock, used for wraparound handling. 1093ed4351aSDaniel Vetter */ 1103ed4351aSDaniel Vetter u32 last; 1113ed4351aSDaniel Vetter /** 1123ed4351aSDaniel Vetter * @inmodeset: Tracks whether the vblank is disabled due to a modeset. 1133ed4351aSDaniel Vetter * For legacy driver bit 2 additionally tracks whether an additional 1143ed4351aSDaniel Vetter * temporary vblank reference has been acquired to paper over the 1153ed4351aSDaniel Vetter * hardware counter resetting/jumping. KMS drivers should instead just 1163ed4351aSDaniel Vetter * call drm_crtc_vblank_off() and drm_crtc_vblank_on(), which explicitly 1173ed4351aSDaniel Vetter * save and restore the vblank count. 1183ed4351aSDaniel Vetter */ 1193ed4351aSDaniel Vetter unsigned int inmodeset; /* Display driver is setting mode */ 1203ed4351aSDaniel Vetter /** 1213ed4351aSDaniel Vetter * @pipe: drm_crtc_index() of the &drm_crtc corresponding to this 1223ed4351aSDaniel Vetter * structure. 1233ed4351aSDaniel Vetter */ 1243ed4351aSDaniel Vetter unsigned int pipe; 1253ed4351aSDaniel Vetter /** 1263ed4351aSDaniel Vetter * @framedur_ns: Frame/Field duration in ns, used by 1273ed4351aSDaniel Vetter * drm_calc_vbltimestamp_from_scanoutpos() and computed by 1283ed4351aSDaniel Vetter * drm_calc_timestamping_constants(). 1293ed4351aSDaniel Vetter */ 1303ed4351aSDaniel Vetter int framedur_ns; 1313ed4351aSDaniel Vetter /** 1323ed4351aSDaniel Vetter * @linedur_ns: Line duration in ns, used by 1333ed4351aSDaniel Vetter * drm_calc_vbltimestamp_from_scanoutpos() and computed by 1343ed4351aSDaniel Vetter * drm_calc_timestamping_constants(). 1353ed4351aSDaniel Vetter */ 1363ed4351aSDaniel Vetter int linedur_ns; 1373ed4351aSDaniel Vetter 1383ed4351aSDaniel Vetter /** 1393ed4351aSDaniel Vetter * @hwmode: 1403ed4351aSDaniel Vetter * 1413ed4351aSDaniel Vetter * Cache of the current hardware display mode. Only valid when @enabled 1423ed4351aSDaniel Vetter * is set. This is used by helpers like 1433ed4351aSDaniel Vetter * drm_calc_vbltimestamp_from_scanoutpos(). We can't just access the 1443ed4351aSDaniel Vetter * hardware mode by e.g. looking at &drm_crtc_state.adjusted_mode, 1453ed4351aSDaniel Vetter * because that one is really hard to get from interrupt context. 1463ed4351aSDaniel Vetter */ 1473ed4351aSDaniel Vetter struct drm_display_mode hwmode; 1483ed4351aSDaniel Vetter 1493ed4351aSDaniel Vetter /** 1503ed4351aSDaniel Vetter * @enabled: Tracks the enabling state of the corresponding &drm_crtc to 1513ed4351aSDaniel Vetter * avoid double-disabling and hence corrupting saved state. Needed by 1523ed4351aSDaniel Vetter * drivers not using atomic KMS, since those might go through their CRTC 1533ed4351aSDaniel Vetter * disabling functions multiple times. 1543ed4351aSDaniel Vetter */ 1553ed4351aSDaniel Vetter bool enabled; 1563ed4351aSDaniel Vetter }; 1573ed4351aSDaniel Vetter 1583ed4351aSDaniel Vetter int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs); 159570e8696SKeith Packard u64 drm_crtc_vblank_count(struct drm_crtc *crtc); 160570e8696SKeith Packard u64 drm_crtc_vblank_count_and_time(struct drm_crtc *crtc, 16167680d3cSArnd Bergmann ktime_t *vblanktime); 1623ed4351aSDaniel Vetter void drm_crtc_send_vblank_event(struct drm_crtc *crtc, 1633ed4351aSDaniel Vetter struct drm_pending_vblank_event *e); 1643ed4351aSDaniel Vetter void drm_crtc_arm_vblank_event(struct drm_crtc *crtc, 1653ed4351aSDaniel Vetter struct drm_pending_vblank_event *e); 1663ed4351aSDaniel Vetter bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe); 1673ed4351aSDaniel Vetter bool drm_crtc_handle_vblank(struct drm_crtc *crtc); 1683ed4351aSDaniel Vetter int drm_crtc_vblank_get(struct drm_crtc *crtc); 1693ed4351aSDaniel Vetter void drm_crtc_vblank_put(struct drm_crtc *crtc); 1703ed4351aSDaniel Vetter void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe); 1713ed4351aSDaniel Vetter void drm_crtc_wait_one_vblank(struct drm_crtc *crtc); 1723ed4351aSDaniel Vetter void drm_crtc_vblank_off(struct drm_crtc *crtc); 1733ed4351aSDaniel Vetter void drm_crtc_vblank_reset(struct drm_crtc *crtc); 1743ed4351aSDaniel Vetter void drm_crtc_vblank_on(struct drm_crtc *crtc); 175ca814b25SDaniel Vetter u32 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc); 1763ed4351aSDaniel Vetter 1773ed4351aSDaniel Vetter bool drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, 1783ed4351aSDaniel Vetter unsigned int pipe, int *max_error, 17967680d3cSArnd Bergmann ktime_t *vblank_time, 1803ed4351aSDaniel Vetter bool in_vblank_irq); 1813ed4351aSDaniel Vetter void drm_calc_timestamping_constants(struct drm_crtc *crtc, 1823ed4351aSDaniel Vetter const struct drm_display_mode *mode); 1833ed4351aSDaniel Vetter wait_queue_head_t *drm_crtc_vblank_waitqueue(struct drm_crtc *crtc); 1843ed4351aSDaniel Vetter #endif 185