Lines Matching full:vblank
2 * drm_irq.c IRQ and vblank support
43 * DOC: vblank handling
54 * scanlines is referred to as the vertical blanking region, or vblank for
98 * this programming has to both start and end in the same vblank. To help
101 * The interrupt is in this context named the vblank interrupt.
103 * The vblank interrupt may be fired at different points depending on the
122 * drm_crtc_handle_vblank() in its vblank interrupt handler for working vblank
129 * call drm_crtc_vblank_get() and release the vblank reference again with
130 * drm_crtc_vblank_put(). In between these two calls vblank interrupts are
133 * On many hardware disabling the vblank interrupt cannot be done in a race-free
135 * &drm_driver.max_vblank_count. In that case the vblank core only disables the
141 * automatically generate fake vblank events as part of the display update.
152 * vblank irq in drm_handle_vblank(). 1 msec should be ok.
166 MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [msecs] (0: never disable, <0…
172 return &dev->vblank[pipe]; in drm_vblank_crtc()
186 struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); in store_vblank() local
190 vblank->last = last; in store_vblank()
192 write_seqlock(&vblank->seqlock); in store_vblank()
193 vblank->time = t_vblank; in store_vblank()
194 atomic64_add(vblank_count_inc, &vblank->count); in store_vblank()
195 write_sequnlock(&vblank->seqlock); in store_vblank()
200 struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); in drm_max_vblank_count() local
202 return vblank->max_vblank_count ?: dev->max_vblank_count; in drm_max_vblank_count()
231 * Reset the stored timestamp for the current vblank count to correspond
232 * to the last vblank occurred.
237 * device vblank fields.
258 * Only reinitialize corresponding vblank timestamp if high-precision query in drm_reset_vblank_timestamp()
259 * available and didn't fail. Otherwise reinitialize delayed at next vblank in drm_reset_vblank_timestamp()
267 * vblank counter value before and after a modeset in drm_reset_vblank_timestamp()
275 * Call back into the driver to update the appropriate vblank counter
284 * device vblank fields.
289 struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); in drm_update_vblank_count() local
294 int framedur_ns = vblank->framedur_ns; in drm_update_vblank_count()
301 * here if the register is small or we had vblank interrupts off for in drm_update_vblank_count()
304 * We repeat the hardware vblank counter & timestamp query until in drm_update_vblank_count()
307 * corresponding vblank timestamp. in drm_update_vblank_count()
316 diff = (cur_vblank - vblank->last) & max_vblank_count; in drm_update_vblank_count()
318 u64 diff_ns = ktime_to_ns(ktime_sub(t_vblank, vblank->time)); in drm_update_vblank_count()
342 * interval? If so then vblank irqs keep running and it will likely in drm_update_vblank_count()
343 * happen that the hardware vblank counter is not trustworthy as it in drm_update_vblank_count()
344 * might reset at some point in that interval and vblank timestamps in drm_update_vblank_count()
347 * random large forward jumps of the software vblank counter. in drm_update_vblank_count()
349 if (diff > 1 && (vblank->inmodeset & 0x2)) { in drm_update_vblank_count()
351 "clamping vblank bump to 1 on crtc %u: diffr=%u" in drm_update_vblank_count()
356 drm_dbg_vbl(dev, "updating vblank count on crtc %u:" in drm_update_vblank_count()
358 pipe, (unsigned long long)atomic64_read(&vblank->count), in drm_update_vblank_count()
359 diff, cur_vblank, vblank->last); in drm_update_vblank_count()
362 drm_WARN_ON_ONCE(dev, cur_vblank != vblank->last); in drm_update_vblank_count()
367 * Only reinitialize corresponding vblank timestamp if high-precision query in drm_update_vblank_count()
368 * available and didn't fail, or we were called from the vblank interrupt. in drm_update_vblank_count()
369 * Otherwise reinitialize delayed at next vblank interrupt and assign 0 in drm_update_vblank_count()
380 struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); in drm_vblank_count() local
386 count = atomic64_read(&vblank->count); in drm_vblank_count()
401 * drm_crtc_accurate_vblank_count - retrieve the master vblank counter
405 * interpolates to handle a race with vblank interrupts using the high precision
415 u64 vblank; in drm_crtc_accurate_vblank_count() local
420 "This function requires support for accurate vblank timestamps."); in drm_crtc_accurate_vblank_count()
425 vblank = drm_vblank_count(dev, pipe); in drm_crtc_accurate_vblank_count()
429 return vblank; in drm_crtc_accurate_vblank_count()
447 * Disable vblank irq's on crtc, make sure that last vblank count
448 * of hardware and corresponding consistent software vblank counter
449 * are preserved, even if there are any spurious vblank irq's after
454 struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); in drm_vblank_disable_and_save() local
459 /* Prevent vblank irq processing while disabling vblank irqs, in drm_vblank_disable_and_save()
466 * Update vblank count and disable vblank interrupts only if the in drm_vblank_disable_and_save()
471 if (!vblank->enabled) in drm_vblank_disable_and_save()
482 vblank->enabled = false; in drm_vblank_disable_and_save()
490 struct drm_vblank_crtc *vblank = from_timer(vblank, t, disable_timer); in vblank_disable_fn() local
491 struct drm_device *dev = vblank->dev; in vblank_disable_fn()
492 unsigned int pipe = vblank->pipe; in vblank_disable_fn()
496 if (atomic_read(&vblank->refcount) == 0 && vblank->enabled) { in vblank_disable_fn()
497 drm_dbg_core(dev, "disabling vblank on crtc %u\n", pipe); in vblank_disable_fn()
505 struct drm_vblank_crtc *vblank = ptr; in drm_vblank_init_release() local
507 drm_WARN_ON(dev, READ_ONCE(vblank->enabled) && in drm_vblank_init_release()
510 drm_vblank_destroy_worker(vblank); in drm_vblank_init_release()
511 del_timer_sync(&vblank->disable_timer); in drm_vblank_init_release()
515 * drm_vblank_init - initialize vblank support
519 * This function initializes vblank support for @num_crtcs display pipelines.
534 dev->vblank = drmm_kcalloc(dev, num_crtcs, sizeof(*dev->vblank), GFP_KERNEL); in drm_vblank_init()
535 if (!dev->vblank) in drm_vblank_init()
541 struct drm_vblank_crtc *vblank = &dev->vblank[i]; in drm_vblank_init() local
543 vblank->dev = dev; in drm_vblank_init()
544 vblank->pipe = i; in drm_vblank_init()
545 init_waitqueue_head(&vblank->queue); in drm_vblank_init()
546 timer_setup(&vblank->disable_timer, vblank_disable_fn, 0); in drm_vblank_init()
547 seqlock_init(&vblank->seqlock); in drm_vblank_init()
550 vblank); in drm_vblank_init()
554 ret = drm_vblank_worker_init(vblank); in drm_vblank_init()
568 * Drivers may call this function to test if vblank support is
586 * drm_crtc_vblank_waitqueue - get vblank waitqueue for the CRTC
587 * @crtc: which CRTC's vblank waitqueue to retrieve
589 * This function returns a pointer to the vblank waitqueue for the CRTC.
590 * Drivers can use this to implement vblank waits using wait_event() and related
595 return &crtc->dev->vblank[drm_crtc_index(crtc)].queue; in drm_crtc_vblank_waitqueue()
601 * drm_calc_timestamping_constants - calculate vblank timestamp constants
605 * Calculate and store various constants which are later needed by vblank and
616 struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc); in drm_calc_timestamping_constants() local
648 vblank->linedur_ns = linedur_ns; in drm_calc_timestamping_constants()
649 vblank->framedur_ns = framedur_ns; in drm_calc_timestamping_constants()
650 drm_mode_copy(&vblank->hwmode, mode); in drm_calc_timestamping_constants()
662 * drm_crtc_vblank_helper_get_vblank_timestamp_internal - precise vblank
664 * @crtc: CRTC whose vblank timestamp to retrieve
670 * need to apply some workarounds for gpu-specific vblank irq quirks
676 * Implements calculation of exact vblank timestamps from given drm_display_mode
700 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_crtc_vblank_helper_get_vblank_timestamp_internal() local
720 mode = &vblank->hwmode; in drm_crtc_vblank_helper_get_vblank_timestamp_internal()
785 * vblank_time timestamp for end of vblank. in drm_crtc_vblank_helper_get_vblank_timestamp_internal()
807 * drm_crtc_vblank_helper_get_vblank_timestamp - precise vblank timestamp
809 * @crtc: CRTC whose vblank timestamp to retrieve
815 * need to apply some workarounds for gpu-specific vblank irq quirks
818 * Implements calculation of exact vblank timestamps from given drm_display_mode
849 * recent vblank interval
850 * @crtc: CRTC whose vblank timestamp to retrieve
854 * need to apply some workarounds for gpu-specific vblank irq quirks
858 * vblank interval on specified CRTC. May call into kms-driver to
862 * call, i.e., it isn't very precisely locked to the true vblank.
901 * drm_crtc_vblank_count - retrieve "cooked" vblank counter value
904 * Fetches the "cooked" vblank count value that represents the number of
905 * vblank events since the system was booted, including lost events due to
907 * vblank interrupt (since it only reports the software vblank counter), see
910 * Note that for a given vblank counter value drm_crtc_handle_vblank()
914 * functions, if the vblank count is the same or a later one.
919 * The software vblank counter.
928 * drm_vblank_count_and_time - retrieve "cooked" vblank counter value and the
929 * system timestamp corresponding to that vblank counter value.
932 * @vblanktime: Pointer to ktime_t to receive the vblank timestamp.
934 * Fetches the "cooked" vblank count value that represents the number of
935 * vblank events since the system was booted, including lost events due to
937 * of the vblank interval that corresponds to the current vblank counter value.
944 struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); in drm_vblank_count_and_time() local
954 seq = read_seqbegin(&vblank->seqlock); in drm_vblank_count_and_time()
955 vblank_count = atomic64_read(&vblank->count); in drm_vblank_count_and_time()
956 *vblanktime = vblank->time; in drm_vblank_count_and_time()
957 } while (read_seqretry(&vblank->seqlock, seq)); in drm_vblank_count_and_time()
963 * drm_crtc_vblank_count_and_time - retrieve "cooked" vblank counter value
964 * and the system timestamp corresponding to that vblank counter value
966 * @vblanktime: Pointer to time to receive the vblank timestamp.
968 * Fetches the "cooked" vblank count value that represents the number of
969 * vblank events since the system was booted, including lost events due to
971 * of the vblank interval that corresponds to the current vblank counter value.
973 * Note that for a given vblank counter value drm_crtc_handle_vblank()
977 * functions, if the vblank count is the same or a later one.
990 * drm_crtc_next_vblank_start - calculate the time of the next vblank
991 * @crtc: the crtc for which to calculate next vblank time
992 * @vblanktime: pointer to time to receive the next vblank timestamp.
994 * Calculate the expected time of the start of the next vblank period,
995 * based on time of previous vblank and frame duration
999 struct drm_vblank_crtc *vblank; in drm_crtc_next_vblank_start() local
1006 vblank = drm_crtc_vblank_crtc(crtc); in drm_crtc_next_vblank_start()
1007 mode = &vblank->hwmode; in drm_crtc_next_vblank_start()
1009 if (!vblank->framedur_ns || !vblank->linedur_ns) in drm_crtc_next_vblank_start()
1016 (u64)vblank->framedur_ns * mode->crtc_vblank_start, in drm_crtc_next_vblank_start()
1061 * drm_crtc_arm_vblank_event - arm vblank event after pageflip
1062 * @crtc: the source CRTC of the vblank event
1065 * A lot of drivers need to generate vblank events for the very next vblank
1067 * flip gets armed, but not when it actually executes within the next vblank
1068 * period. This helper function implements exactly the required vblank arming
1072 * atomic commit must ensure that the next vblank happens at exactly the same
1074 * does **not** protect against the next vblank interrupt racing with either this
1077 * 1. Driver commits new hardware state into vblank-synchronized registers.
1078 * 2. A vblank happens, committing the hardware state. Also the corresponding
1079 * vblank interrupt is fired off and fully processed by the interrupt
1082 * 4. The event is only send out for the next vblank, which is wrong.
1087 * The only way to make this work safely is to prevent the vblank from firing
1095 * Caller must hold a vblank reference for the event @e acquired by a
1096 * drm_crtc_vblank_get(), which will be dropped when the next vblank arrives.
1113 * drm_crtc_send_vblank_event - helper to send vblank event after pageflip
1114 * @crtc: the source CRTC of the vblank event
1118 * vblank, and sends it to userspace. Caller must hold event lock.
1160 struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); in drm_vblank_enable() local
1167 if (!vblank->enabled) { in drm_vblank_enable()
1169 * Enable vblank irqs under vblank_time_lock protection. in drm_vblank_enable()
1170 * All vblank count & timestamp updates are held off in drm_vblank_enable()
1173 * prevent double-accounting of same vblank interval. in drm_vblank_enable()
1176 drm_dbg_core(dev, "enabling vblank on crtc %u, ret: %d\n", in drm_vblank_enable()
1179 atomic_dec(&vblank->refcount); in drm_vblank_enable()
1184 * to mark the vblank as enabled after the call in drm_vblank_enable()
1187 WRITE_ONCE(vblank->enabled, true); in drm_vblank_enable()
1198 struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); in drm_vblank_get() local
1210 if (atomic_add_return(1, &vblank->refcount) == 1) { in drm_vblank_get()
1213 if (!vblank->enabled) { in drm_vblank_get()
1214 atomic_dec(&vblank->refcount); in drm_vblank_get()
1224 * drm_crtc_vblank_get - get a reference count on vblank events
1227 * Acquire a reference count on vblank events to avoid having them disabled
1241 struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); in drm_vblank_put() local
1242 int vblank_offdelay = vblank->config.offdelay_ms; in drm_vblank_put()
1247 if (drm_WARN_ON(dev, atomic_read(&vblank->refcount) == 0)) in drm_vblank_put()
1251 if (atomic_dec_and_test(&vblank->refcount)) { in drm_vblank_put()
1255 vblank_disable_fn(&vblank->disable_timer); in drm_vblank_put()
1256 else if (!vblank->config.disable_immediate) in drm_vblank_put()
1257 mod_timer(&vblank->disable_timer, in drm_vblank_put()
1263 * drm_crtc_vblank_put - give up ownership of vblank events
1266 * Release ownership of a given vblank counter, turning off interrupts
1277 * drm_wait_one_vblank - wait for one vblank
1281 * This waits for one vblank to pass on @pipe, using the irq driver interfaces.
1282 * It is a failure to call this when the vblank irq for @pipe is disabled, e.g.
1289 struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); in drm_wait_one_vblank() local
1297 if (drm_WARN(dev, ret, "vblank not available on crtc %i, ret=%i\n", in drm_wait_one_vblank()
1303 ret = wait_event_timeout(vblank->queue, in drm_wait_one_vblank()
1307 drm_WARN(dev, ret == 0, "vblank wait timed out on crtc %i\n", pipe); in drm_wait_one_vblank()
1314 * drm_crtc_wait_one_vblank - wait for one vblank
1317 * This waits for one vblank to pass on @crtc, using the irq driver interfaces.
1318 * It is a failure to call this when the vblank irq for @crtc is disabled, e.g.
1328 * drm_crtc_vblank_off - disable vblank events on a CRTC
1331 * Drivers can use this function to shut down the vblank interrupt handling when
1332 * disabling a crtc. This function ensures that the latest vblank frame count is
1335 * Drivers must use this function when the hardware vblank counter can get
1342 struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc); in drm_crtc_vblank_off() local
1351 * Grab event_lock early to prevent vblank work from being scheduled in drm_crtc_vblank_off()
1352 * while we're in the middle of shutting down vblank interrupts in drm_crtc_vblank_off()
1357 drm_dbg_vbl(dev, "crtc %d, vblank enabled %d, inmodeset %d\n", in drm_crtc_vblank_off()
1358 pipe, vblank->enabled, vblank->inmodeset); in drm_crtc_vblank_off()
1360 /* Avoid redundant vblank disables without previous in drm_crtc_vblank_off()
1362 if (drm_core_check_feature(dev, DRIVER_ATOMIC) || !vblank->inmodeset) in drm_crtc_vblank_off()
1365 wake_up(&vblank->queue); in drm_crtc_vblank_off()
1369 * the vblank interrupt by bumping the refcount. in drm_crtc_vblank_off()
1371 if (!vblank->inmodeset) { in drm_crtc_vblank_off()
1372 atomic_inc(&vblank->refcount); in drm_crtc_vblank_off()
1373 vblank->inmodeset = 1; in drm_crtc_vblank_off()
1377 /* Send any queued vblank events, lest the natives grow disquiet */ in drm_crtc_vblank_off()
1383 drm_dbg_core(dev, "Sending premature vblank event on disable: " in drm_crtc_vblank_off()
1391 /* Cancel any leftover pending vblank work */ in drm_crtc_vblank_off()
1392 drm_vblank_cancel_pending_works(vblank); in drm_crtc_vblank_off()
1398 vblank->hwmode.crtc_clock = 0; in drm_crtc_vblank_off()
1400 /* Wait for any vblank work that's still executing to finish */ in drm_crtc_vblank_off()
1401 drm_vblank_flush_worker(vblank); in drm_crtc_vblank_off()
1406 * drm_crtc_vblank_reset - reset vblank state to off on a CRTC
1409 * Drivers can use this function to reset the vblank state to off at load time.
1412 * drm_crtc_vblank_off() is that this function doesn't save the vblank counter
1420 struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc); in drm_crtc_vblank_reset() local
1424 * Prevent subsequent drm_vblank_get() from enabling the vblank in drm_crtc_vblank_reset()
1427 if (!vblank->inmodeset) { in drm_crtc_vblank_reset()
1428 atomic_inc(&vblank->refcount); in drm_crtc_vblank_reset()
1429 vblank->inmodeset = 1; in drm_crtc_vblank_reset()
1434 drm_WARN_ON(dev, !list_empty(&vblank->pending_work)); in drm_crtc_vblank_reset()
1439 * drm_crtc_set_max_vblank_count - configure the hw max vblank counter value
1441 * @max_vblank_count: max hardware vblank counter value
1443 * Update the maximum hardware vblank counter value for @crtc
1445 * hardware vblank counter depends on the currently active
1448 * For example, if the hardware vblank counter does not work
1459 struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc); in drm_crtc_set_max_vblank_count() local
1462 drm_WARN_ON(dev, !READ_ONCE(vblank->inmodeset)); in drm_crtc_set_max_vblank_count()
1464 vblank->max_vblank_count = max_vblank_count; in drm_crtc_set_max_vblank_count()
1469 * drm_crtc_vblank_on_config - enable vblank events on a CRTC with custom
1472 * @config: Vblank configuration value
1475 * custom vblank configuration for a given CRTC.
1486 struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc); in drm_crtc_vblank_on_config() local
1492 drm_dbg_vbl(dev, "crtc %d, vblank enabled %d, inmodeset %d\n", in drm_crtc_vblank_on_config()
1493 pipe, vblank->enabled, vblank->inmodeset); in drm_crtc_vblank_on_config()
1495 vblank->config = *config; in drm_crtc_vblank_on_config()
1498 if (vblank->inmodeset) { in drm_crtc_vblank_on_config()
1499 atomic_dec(&vblank->refcount); in drm_crtc_vblank_on_config()
1500 vblank->inmodeset = 0; in drm_crtc_vblank_on_config()
1507 * user wishes vblank interrupts to be enabled all the time. in drm_crtc_vblank_on_config()
1509 if (atomic_read(&vblank->refcount) != 0 || !vblank->config.offdelay_ms) in drm_crtc_vblank_on_config()
1516 * drm_crtc_vblank_on - enable vblank events on a CRTC
1519 * This functions restores the vblank interrupt state captured with
1541 struct drm_vblank_crtc *vblank; in drm_vblank_restore() local
1554 vblank = drm_vblank_crtc(dev, pipe); in drm_vblank_restore()
1556 drm_debug_enabled(DRM_UT_VBL) && !vblank->framedur_ns, in drm_vblank_restore()
1558 framedur_ns = vblank->framedur_ns; in drm_vblank_restore()
1565 diff_ns = ktime_to_ns(ktime_sub(t_vblank, vblank->time)); in drm_vblank_restore()
1572 diff, diff_ns, framedur_ns, cur_vblank - vblank->last); in drm_vblank_restore()
1573 vblank->last = (cur_vblank - diff) & max_vblank_count; in drm_vblank_restore()
1577 * drm_crtc_vblank_restore - estimate missed vblanks and update vblank count.
1580 * Power manamement features can cause frame counter resets between vblank
1584 * vblank counter.
1589 * time-stamping functions are race-free against vblank hardware counter
1596 struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); in drm_crtc_vblank_restore() local
1599 drm_WARN_ON_ONCE(dev, vblank->inmodeset); in drm_crtc_vblank_restore()
1600 drm_WARN_ON_ONCE(dev, !vblank->config.disable_immediate); in drm_crtc_vblank_restore()
1611 struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); in drm_queue_vblank_event() local
1640 * vblank disable, so no need for further locking. The reference from in drm_queue_vblank_event()
1641 * drm_vblank_get() protects against vblank disable from another source. in drm_queue_vblank_event()
1643 if (!READ_ONCE(vblank->enabled)) { in drm_queue_vblank_event()
1656 drm_dbg_core(dev, "event on vblank count %llu, current %llu, crtc %u\n", in drm_queue_vblank_event()
1737 struct drm_vblank_crtc *vblank; in drm_wait_vblank_ioctl() local
1786 vblank = &dev->vblank[pipe]; in drm_wait_vblank_ioctl()
1789 * queries to return the cached timestamp of the last vblank. in drm_wait_vblank_ioctl()
1791 if (vblank->config.disable_immediate && in drm_wait_vblank_ioctl()
1793 READ_ONCE(vblank->enabled)) { in drm_wait_vblank_ioctl()
1801 "crtc %d failed to acquire vblank counter, %d\n", in drm_wait_vblank_ioctl()
1829 /* must hold on to the vblank ref until the event fires in drm_wait_vblank_ioctl()
1838 drm_dbg_core(dev, "waiting on vblank count %llu, crtc %u\n", in drm_wait_vblank_ioctl()
1840 wait = wait_event_interruptible_timeout(vblank->queue, in drm_wait_vblank_ioctl()
1842 !READ_ONCE(vblank->enabled), in drm_wait_vblank_ioctl()
1866 drm_dbg_core(dev, "crtc %d vblank wait interrupted by signal\n", in drm_wait_vblank_ioctl()
1893 drm_dbg_core(dev, "vblank event on %llu, current %llu\n", in drm_handle_vblank_events()
1908 * drm_handle_vblank - handle a vblank event
1912 * Drivers should call this routine in their vblank interrupt handlers to
1913 * update the vblank counter and send any signals that may be pending.
1919 struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); in drm_handle_vblank() local
1932 * vblank enable/disable, as this would cause inconsistent in drm_handle_vblank()
1933 * or corrupted timestamps and vblank counts. in drm_handle_vblank()
1937 /* Vblank irq handling disabled. Nothing to do. */ in drm_handle_vblank()
1938 if (!vblank->enabled) { in drm_handle_vblank()
1948 wake_up(&vblank->queue); in drm_handle_vblank()
1951 * we finish processing the following vblank after all events have in drm_handle_vblank()
1955 disable_irq = (vblank->config.disable_immediate && in drm_handle_vblank()
1956 vblank->config.offdelay_ms > 0 && in drm_handle_vblank()
1957 !atomic_read(&vblank->refcount)); in drm_handle_vblank()
1960 drm_handle_vblank_works(vblank); in drm_handle_vblank()
1965 vblank_disable_fn(&vblank->disable_timer); in drm_handle_vblank()
1972 * drm_crtc_handle_vblank - handle a vblank event
1975 * Drivers should call this routine in their vblank interrupt handlers to
1976 * update the vblank counter and send any signals that may be pending.
1980 * Note that for a given vblank counter value drm_crtc_handle_vblank()
1984 * functions, if the vblank count is the same or a later one.
1998 * Get crtc VBLANK count.
2009 struct drm_vblank_crtc *vblank; in drm_crtc_get_sequence_ioctl() local
2028 vblank = drm_crtc_vblank_crtc(crtc); in drm_crtc_get_sequence_ioctl()
2029 vblank_enabled = READ_ONCE(vblank->config.disable_immediate) && in drm_crtc_get_sequence_ioctl()
2030 READ_ONCE(vblank->enabled); in drm_crtc_get_sequence_ioctl()
2036 "crtc %d failed to acquire vblank counter, %d\n", in drm_crtc_get_sequence_ioctl()
2055 * Queue a event for VBLANK sequence
2066 struct drm_vblank_crtc *vblank; in drm_crtc_queue_sequence_ioctl() local
2094 vblank = drm_crtc_vblank_crtc(crtc); in drm_crtc_queue_sequence_ioctl()
2103 "crtc %d failed to acquire vblank counter, %d\n", in drm_crtc_queue_sequence_ioctl()
2127 * vblank disable, so no need for further locking. The reference from in drm_crtc_queue_sequence_ioctl()
2128 * drm_crtc_vblank_get() protects against vblank disable from another source. in drm_crtc_queue_sequence_ioctl()
2130 if (!READ_ONCE(vblank->enabled)) { in drm_crtc_queue_sequence_ioctl()