Lines Matching refs:dev

157 drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
169 static void store_vblank(struct drm_device *dev, unsigned int pipe, in store_vblank() argument
173 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in store_vblank()
175 assert_spin_locked(&dev->vblank_time_lock); in store_vblank()
185 static u32 drm_max_vblank_count(struct drm_device *dev, unsigned int pipe) in drm_max_vblank_count() argument
187 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_max_vblank_count()
189 return vblank->max_vblank_count ?: dev->max_vblank_count; in drm_max_vblank_count()
196 static u32 drm_vblank_no_hw_counter(struct drm_device *dev, unsigned int pipe) in drm_vblank_no_hw_counter() argument
198 drm_WARN_ON_ONCE(dev, drm_max_vblank_count(dev, pipe) != 0); in drm_vblank_no_hw_counter()
202 static u32 __get_vblank_counter(struct drm_device *dev, unsigned int pipe) in __get_vblank_counter() argument
204 if (drm_core_check_feature(dev, DRIVER_MODESET)) { in __get_vblank_counter()
205 struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe); in __get_vblank_counter()
207 if (drm_WARN_ON(dev, !crtc)) in __get_vblank_counter()
214 else if (dev->driver->get_vblank_counter) { in __get_vblank_counter()
215 return dev->driver->get_vblank_counter(dev, pipe); in __get_vblank_counter()
219 return drm_vblank_no_hw_counter(dev, pipe); in __get_vblank_counter()
231 static void drm_reset_vblank_timestamp(struct drm_device *dev, unsigned int pipe) in drm_reset_vblank_timestamp() argument
238 spin_lock(&dev->vblank_time_lock); in drm_reset_vblank_timestamp()
245 cur_vblank = __get_vblank_counter(dev, pipe); in drm_reset_vblank_timestamp()
246 rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, false); in drm_reset_vblank_timestamp()
247 } while (cur_vblank != __get_vblank_counter(dev, pipe) && --count > 0); in drm_reset_vblank_timestamp()
261 store_vblank(dev, pipe, 1, t_vblank, cur_vblank); in drm_reset_vblank_timestamp()
263 spin_unlock(&dev->vblank_time_lock); in drm_reset_vblank_timestamp()
278 static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe, in drm_update_vblank_count() argument
281 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_update_vblank_count()
287 u32 max_vblank_count = drm_max_vblank_count(dev, pipe); in drm_update_vblank_count()
302 cur_vblank = __get_vblank_counter(dev, pipe); in drm_update_vblank_count()
303 rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, in_vblank_irq); in drm_update_vblank_count()
304 } while (cur_vblank != __get_vblank_counter(dev, pipe) && --count > 0); in drm_update_vblank_count()
318 drm_dbg_vbl(dev, "crtc %u: Calculating number of vblanks." in drm_update_vblank_count()
325 drm_dbg_vbl(dev, "crtc %u: Redundant vblirq ignored\n", in drm_update_vblank_count()
342 drm_dbg_vbl(dev, in drm_update_vblank_count()
348 drm_dbg_vbl(dev, "updating vblank count on crtc %u:" in drm_update_vblank_count()
354 drm_WARN_ON_ONCE(dev, cur_vblank != vblank->last); in drm_update_vblank_count()
367 store_vblank(dev, pipe, diff, t_vblank, cur_vblank); in drm_update_vblank_count()
370 u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe) in drm_vblank_count() argument
372 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_vblank_count()
375 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) in drm_vblank_count()
405 struct drm_device *dev = crtc->dev; in drm_crtc_accurate_vblank_count() local
410 drm_WARN_ONCE(dev, drm_debug_enabled(DRM_UT_VBL) && in drm_crtc_accurate_vblank_count()
414 spin_lock_irqsave(&dev->vblank_time_lock, flags); in drm_crtc_accurate_vblank_count()
416 drm_update_vblank_count(dev, pipe, false); in drm_crtc_accurate_vblank_count()
417 vblank = drm_vblank_count(dev, pipe); in drm_crtc_accurate_vblank_count()
419 spin_unlock_irqrestore(&dev->vblank_time_lock, flags); in drm_crtc_accurate_vblank_count()
425 static void __disable_vblank(struct drm_device *dev, unsigned int pipe) in __disable_vblank() argument
427 if (drm_core_check_feature(dev, DRIVER_MODESET)) { in __disable_vblank()
428 struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe); in __disable_vblank()
430 if (drm_WARN_ON(dev, !crtc)) in __disable_vblank()
438 dev->driver->disable_vblank(dev, pipe); in __disable_vblank()
449 void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe) in drm_vblank_disable_and_save() argument
451 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_vblank_disable_and_save()
454 assert_spin_locked(&dev->vbl_lock); in drm_vblank_disable_and_save()
460 spin_lock_irqsave(&dev->vblank_time_lock, irqflags); in drm_vblank_disable_and_save()
477 drm_update_vblank_count(dev, pipe, false); in drm_vblank_disable_and_save()
478 __disable_vblank(dev, pipe); in drm_vblank_disable_and_save()
482 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags); in drm_vblank_disable_and_save()
488 struct drm_device *dev = vblank->dev; in vblank_disable_fn() local
492 spin_lock_irqsave(&dev->vbl_lock, irqflags); in vblank_disable_fn()
494 drm_dbg_core(dev, "disabling vblank on crtc %u\n", pipe); in vblank_disable_fn()
495 drm_vblank_disable_and_save(dev, pipe); in vblank_disable_fn()
497 spin_unlock_irqrestore(&dev->vbl_lock, irqflags); in vblank_disable_fn()
500 static void drm_vblank_init_release(struct drm_device *dev, void *ptr) in drm_vblank_init_release() argument
504 drm_WARN_ON(dev, READ_ONCE(vblank->enabled) && in drm_vblank_init_release()
505 drm_core_check_feature(dev, DRIVER_MODESET)); in drm_vblank_init_release()
523 int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs) in drm_vblank_init() argument
528 spin_lock_init(&dev->vbl_lock); in drm_vblank_init()
529 spin_lock_init(&dev->vblank_time_lock); in drm_vblank_init()
531 dev->vblank = drmm_kcalloc(dev, num_crtcs, sizeof(*dev->vblank), GFP_KERNEL); in drm_vblank_init()
532 if (!dev->vblank) in drm_vblank_init()
535 dev->num_crtcs = num_crtcs; in drm_vblank_init()
538 struct drm_vblank_crtc *vblank = &dev->vblank[i]; in drm_vblank_init()
540 vblank->dev = dev; in drm_vblank_init()
546 ret = drmm_add_action_or_reset(dev, drm_vblank_init_release, in drm_vblank_init()
576 bool drm_dev_has_vblank(const struct drm_device *dev) in drm_dev_has_vblank() argument
578 return dev->num_crtcs != 0; in drm_dev_has_vblank()
592 return &crtc->dev->vblank[drm_crtc_index(crtc)].queue; in drm_crtc_vblank_waitqueue()
611 struct drm_device *dev = crtc->dev; in drm_calc_timestamping_constants() local
613 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_calc_timestamping_constants()
617 if (!drm_dev_has_vblank(dev)) in drm_calc_timestamping_constants()
620 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) in drm_calc_timestamping_constants()
641 drm_err(dev, "crtc %u: Can't calculate constants, dotclock = 0!\n", in drm_calc_timestamping_constants()
649 drm_dbg_core(dev, in drm_calc_timestamping_constants()
653 drm_dbg_core(dev, "crtc %u: clock %d kHz framedur %d linedur %d\n", in drm_calc_timestamping_constants()
696 struct drm_device *dev = crtc->dev; in drm_crtc_vblank_helper_get_vblank_timestamp_internal() local
698 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_crtc_vblank_helper_get_vblank_timestamp_internal()
706 if (pipe >= dev->num_crtcs) { in drm_crtc_vblank_helper_get_vblank_timestamp_internal()
707 drm_err(dev, "Invalid crtc %u\n", pipe); in drm_crtc_vblank_helper_get_vblank_timestamp_internal()
713 drm_err(dev, "Called from CRTC w/o get_scanout_position()!?\n"); in drm_crtc_vblank_helper_get_vblank_timestamp_internal()
717 if (drm_drv_uses_atomic_modeset(dev)) in drm_crtc_vblank_helper_get_vblank_timestamp_internal()
726 drm_dbg_core(dev, "crtc %u: Noop due to uninitialized mode.\n", in drm_crtc_vblank_helper_get_vblank_timestamp_internal()
728 drm_WARN_ON_ONCE(dev, drm_drv_uses_atomic_modeset(dev)); in drm_crtc_vblank_helper_get_vblank_timestamp_internal()
751 drm_dbg_core(dev, in drm_crtc_vblank_helper_get_vblank_timestamp_internal()
767 drm_dbg_core(dev, in drm_crtc_vblank_helper_get_vblank_timestamp_internal()
793 drm_dbg_vbl(dev, in drm_crtc_vblank_helper_get_vblank_timestamp_internal()
891 drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe, in drm_get_last_vbltimestamp() argument
894 struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe); in drm_get_last_vbltimestamp()
922 return drm_vblank_count(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_vblank_count()
940 static u64 drm_vblank_count_and_time(struct drm_device *dev, unsigned int pipe, in drm_vblank_count_and_time() argument
943 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_vblank_count_and_time()
947 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) { in drm_vblank_count_and_time()
983 return drm_vblank_count_and_time(crtc->dev, drm_crtc_index(crtc), in drm_crtc_vblank_count_and_time()
1003 if (!drm_dev_has_vblank(crtc->dev)) in drm_crtc_next_vblank_start()
1006 vblank = &crtc->dev->vblank[pipe]; in drm_crtc_next_vblank_start()
1024 static void send_vblank_event(struct drm_device *dev, in send_vblank_event() argument
1057 drm_send_event_timestamp_locked(dev, &e->base, now); in send_vblank_event()
1101 struct drm_device *dev = crtc->dev; in drm_crtc_arm_vblank_event() local
1104 assert_spin_locked(&dev->event_lock); in drm_crtc_arm_vblank_event()
1108 list_add_tail(&e->base.link, &dev->vblank_event_list); in drm_crtc_arm_vblank_event()
1126 struct drm_device *dev = crtc->dev; in drm_crtc_send_vblank_event() local
1131 if (drm_dev_has_vblank(dev)) { in drm_crtc_send_vblank_event()
1132 seq = drm_vblank_count_and_time(dev, pipe, &now); in drm_crtc_send_vblank_event()
1139 send_vblank_event(dev, e, seq, now); in drm_crtc_send_vblank_event()
1143 static int __enable_vblank(struct drm_device *dev, unsigned int pipe) in __enable_vblank() argument
1145 if (drm_core_check_feature(dev, DRIVER_MODESET)) { in __enable_vblank()
1146 struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe); in __enable_vblank()
1148 if (drm_WARN_ON(dev, !crtc)) in __enable_vblank()
1155 else if (dev->driver->enable_vblank) { in __enable_vblank()
1156 return dev->driver->enable_vblank(dev, pipe); in __enable_vblank()
1163 static int drm_vblank_enable(struct drm_device *dev, unsigned int pipe) in drm_vblank_enable() argument
1165 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_vblank_enable()
1168 assert_spin_locked(&dev->vbl_lock); in drm_vblank_enable()
1170 spin_lock(&dev->vblank_time_lock); in drm_vblank_enable()
1180 ret = __enable_vblank(dev, pipe); in drm_vblank_enable()
1181 drm_dbg_core(dev, "enabling vblank on crtc %u, ret: %d\n", in drm_vblank_enable()
1186 drm_update_vblank_count(dev, pipe, 0); in drm_vblank_enable()
1196 spin_unlock(&dev->vblank_time_lock); in drm_vblank_enable()
1201 int drm_vblank_get(struct drm_device *dev, unsigned int pipe) in drm_vblank_get() argument
1203 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_vblank_get()
1207 if (!drm_dev_has_vblank(dev)) in drm_vblank_get()
1210 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) in drm_vblank_get()
1213 spin_lock_irqsave(&dev->vbl_lock, irqflags); in drm_vblank_get()
1216 ret = drm_vblank_enable(dev, pipe); in drm_vblank_get()
1223 spin_unlock_irqrestore(&dev->vbl_lock, irqflags); in drm_vblank_get()
1240 return drm_vblank_get(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_vblank_get()
1244 void drm_vblank_put(struct drm_device *dev, unsigned int pipe) in drm_vblank_put() argument
1246 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_vblank_put()
1248 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) in drm_vblank_put()
1251 if (drm_WARN_ON(dev, atomic_read(&vblank->refcount) == 0)) in drm_vblank_put()
1260 else if (!dev->vblank_disable_immediate) in drm_vblank_put()
1275 drm_vblank_put(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_vblank_put()
1290 void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe) in drm_wait_one_vblank() argument
1292 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_wait_one_vblank()
1296 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) in drm_wait_one_vblank()
1299 ret = drm_vblank_get(dev, pipe); in drm_wait_one_vblank()
1300 if (drm_WARN(dev, ret, "vblank not available on crtc %i, ret=%i\n", in drm_wait_one_vblank()
1304 last = drm_vblank_count(dev, pipe); in drm_wait_one_vblank()
1307 last != drm_vblank_count(dev, pipe), in drm_wait_one_vblank()
1310 drm_WARN(dev, ret == 0, "vblank wait timed out on crtc %i\n", pipe); in drm_wait_one_vblank()
1312 drm_vblank_put(dev, pipe); in drm_wait_one_vblank()
1326 drm_wait_one_vblank(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_wait_one_vblank()
1343 struct drm_device *dev = crtc->dev; in drm_crtc_vblank_off() local
1345 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_crtc_vblank_off()
1350 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) in drm_crtc_vblank_off()
1357 spin_lock_irq(&dev->event_lock); in drm_crtc_vblank_off()
1359 spin_lock(&dev->vbl_lock); in drm_crtc_vblank_off()
1360 drm_dbg_vbl(dev, "crtc %d, vblank enabled %d, inmodeset %d\n", in drm_crtc_vblank_off()
1365 if (drm_core_check_feature(dev, DRIVER_ATOMIC) || !vblank->inmodeset) in drm_crtc_vblank_off()
1366 drm_vblank_disable_and_save(dev, pipe); in drm_crtc_vblank_off()
1378 spin_unlock(&dev->vbl_lock); in drm_crtc_vblank_off()
1381 seq = drm_vblank_count_and_time(dev, pipe, &now); in drm_crtc_vblank_off()
1383 list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) { in drm_crtc_vblank_off()
1386 drm_dbg_core(dev, "Sending premature vblank event on disable: " in drm_crtc_vblank_off()
1390 drm_vblank_put(dev, pipe); in drm_crtc_vblank_off()
1391 send_vblank_event(dev, e, seq, now); in drm_crtc_vblank_off()
1397 spin_unlock_irq(&dev->event_lock); in drm_crtc_vblank_off()
1422 struct drm_device *dev = crtc->dev; in drm_crtc_vblank_reset() local
1424 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_crtc_vblank_reset()
1426 spin_lock_irq(&dev->vbl_lock); in drm_crtc_vblank_reset()
1435 spin_unlock_irq(&dev->vbl_lock); in drm_crtc_vblank_reset()
1437 drm_WARN_ON(dev, !list_empty(&dev->vblank_event_list)); in drm_crtc_vblank_reset()
1438 drm_WARN_ON(dev, !list_empty(&vblank->pending_work)); in drm_crtc_vblank_reset()
1462 struct drm_device *dev = crtc->dev; in drm_crtc_set_max_vblank_count() local
1464 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_crtc_set_max_vblank_count()
1466 drm_WARN_ON(dev, dev->max_vblank_count); in drm_crtc_set_max_vblank_count()
1467 drm_WARN_ON(dev, !READ_ONCE(vblank->inmodeset)); in drm_crtc_set_max_vblank_count()
1485 struct drm_device *dev = crtc->dev; in drm_crtc_vblank_on() local
1487 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_crtc_vblank_on()
1489 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) in drm_crtc_vblank_on()
1492 spin_lock_irq(&dev->vbl_lock); in drm_crtc_vblank_on()
1493 drm_dbg_vbl(dev, "crtc %d, vblank enabled %d, inmodeset %d\n", in drm_crtc_vblank_on()
1502 drm_reset_vblank_timestamp(dev, pipe); in drm_crtc_vblank_on()
1509 drm_WARN_ON(dev, drm_vblank_enable(dev, pipe)); in drm_crtc_vblank_on()
1510 spin_unlock_irq(&dev->vbl_lock); in drm_crtc_vblank_on()
1514 static void drm_vblank_restore(struct drm_device *dev, unsigned int pipe) in drm_vblank_restore() argument
1522 u32 max_vblank_count = drm_max_vblank_count(dev, pipe); in drm_vblank_restore()
1524 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) in drm_vblank_restore()
1527 assert_spin_locked(&dev->vbl_lock); in drm_vblank_restore()
1528 assert_spin_locked(&dev->vblank_time_lock); in drm_vblank_restore()
1530 vblank = &dev->vblank[pipe]; in drm_vblank_restore()
1531 drm_WARN_ONCE(dev, in drm_vblank_restore()
1537 cur_vblank = __get_vblank_counter(dev, pipe); in drm_vblank_restore()
1538 drm_get_last_vbltimestamp(dev, pipe, &t_vblank, false); in drm_vblank_restore()
1539 } while (cur_vblank != __get_vblank_counter(dev, pipe) && --count > 0); in drm_vblank_restore()
1546 drm_dbg_vbl(dev, in drm_vblank_restore()
1571 WARN_ON_ONCE(!crtc->dev->vblank_disable_immediate); in drm_crtc_vblank_restore()
1573 drm_vblank_restore(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_vblank_restore()
1577 static void drm_legacy_vblank_pre_modeset(struct drm_device *dev, in drm_legacy_vblank_pre_modeset() argument
1580 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_legacy_vblank_pre_modeset()
1583 if (!drm_dev_has_vblank(dev)) in drm_legacy_vblank_pre_modeset()
1586 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) in drm_legacy_vblank_pre_modeset()
1598 if (drm_vblank_get(dev, pipe) == 0) in drm_legacy_vblank_pre_modeset()
1603 static void drm_legacy_vblank_post_modeset(struct drm_device *dev, in drm_legacy_vblank_post_modeset() argument
1606 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_legacy_vblank_post_modeset()
1609 if (!drm_dev_has_vblank(dev)) in drm_legacy_vblank_post_modeset()
1612 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) in drm_legacy_vblank_post_modeset()
1616 spin_lock_irq(&dev->vbl_lock); in drm_legacy_vblank_post_modeset()
1617 drm_reset_vblank_timestamp(dev, pipe); in drm_legacy_vblank_post_modeset()
1618 spin_unlock_irq(&dev->vbl_lock); in drm_legacy_vblank_post_modeset()
1621 drm_vblank_put(dev, pipe); in drm_legacy_vblank_post_modeset()
1627 int drm_legacy_modeset_ctl_ioctl(struct drm_device *dev, void *data, in drm_legacy_modeset_ctl_ioctl() argument
1634 if (!drm_dev_has_vblank(dev)) in drm_legacy_modeset_ctl_ioctl()
1638 if (!drm_core_check_feature(dev, DRIVER_LEGACY)) in drm_legacy_modeset_ctl_ioctl()
1642 if (pipe >= dev->num_crtcs) in drm_legacy_modeset_ctl_ioctl()
1647 drm_legacy_vblank_pre_modeset(dev, pipe); in drm_legacy_modeset_ctl_ioctl()
1650 drm_legacy_vblank_post_modeset(dev, pipe); in drm_legacy_modeset_ctl_ioctl()
1659 static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe, in drm_queue_vblank_event() argument
1664 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_queue_vblank_event()
1681 if (drm_core_check_feature(dev, DRIVER_MODESET)) { in drm_queue_vblank_event()
1682 struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe); in drm_queue_vblank_event()
1688 spin_lock_irq(&dev->event_lock); in drm_queue_vblank_event()
1701 ret = drm_event_reserve_init_locked(dev, file_priv, &e->base, in drm_queue_vblank_event()
1707 seq = drm_vblank_count_and_time(dev, pipe, &now); in drm_queue_vblank_event()
1709 drm_dbg_core(dev, "event on vblank count %llu, current %llu, crtc %u\n", in drm_queue_vblank_event()
1716 drm_vblank_put(dev, pipe); in drm_queue_vblank_event()
1717 send_vblank_event(dev, e, seq, now); in drm_queue_vblank_event()
1721 list_add_tail(&e->base.link, &dev->vblank_event_list); in drm_queue_vblank_event()
1725 spin_unlock_irq(&dev->event_lock); in drm_queue_vblank_event()
1730 spin_unlock_irq(&dev->event_lock); in drm_queue_vblank_event()
1733 drm_vblank_put(dev, pipe); in drm_queue_vblank_event()
1764 static void drm_wait_vblank_reply(struct drm_device *dev, unsigned int pipe, in drm_wait_vblank_reply() argument
1775 reply->sequence = drm_vblank_count_and_time(dev, pipe, &now); in drm_wait_vblank_reply()
1781 static bool drm_wait_vblank_supported(struct drm_device *dev) in drm_wait_vblank_supported() argument
1784 if (unlikely(drm_core_check_feature(dev, DRIVER_LEGACY))) in drm_wait_vblank_supported()
1785 return dev->irq_enabled; in drm_wait_vblank_supported()
1787 return drm_dev_has_vblank(dev); in drm_wait_vblank_supported()
1790 int drm_wait_vblank_ioctl(struct drm_device *dev, void *data, in drm_wait_vblank_ioctl() argument
1801 if (!drm_wait_vblank_supported(dev)) in drm_wait_vblank_ioctl()
1810 drm_dbg_core(dev, in drm_wait_vblank_ioctl()
1826 if (drm_core_check_feature(dev, DRIVER_MODESET)) { in drm_wait_vblank_ioctl()
1828 drm_for_each_crtc(crtc, dev) { in drm_wait_vblank_ioctl()
1840 if (pipe >= dev->num_crtcs) in drm_wait_vblank_ioctl()
1843 vblank = &dev->vblank[pipe]; in drm_wait_vblank_ioctl()
1848 if (dev->vblank_disable_immediate && in drm_wait_vblank_ioctl()
1851 drm_wait_vblank_reply(dev, pipe, &vblwait->reply); in drm_wait_vblank_ioctl()
1855 ret = drm_vblank_get(dev, pipe); in drm_wait_vblank_ioctl()
1857 drm_dbg_core(dev, in drm_wait_vblank_ioctl()
1862 seq = drm_vblank_count(dev, pipe); in drm_wait_vblank_ioctl()
1889 return drm_queue_vblank_event(dev, pipe, req_seq, vblwait, file_priv); in drm_wait_vblank_ioctl()
1895 drm_dbg_core(dev, "waiting on vblank count %llu, crtc %u\n", in drm_wait_vblank_ioctl()
1898 drm_vblank_passed(drm_vblank_count(dev, pipe), req_seq) || in drm_wait_vblank_ioctl()
1918 drm_wait_vblank_reply(dev, pipe, &vblwait->reply); in drm_wait_vblank_ioctl()
1920 drm_dbg_core(dev, "crtc %d returning %u to client\n", in drm_wait_vblank_ioctl()
1923 drm_dbg_core(dev, "crtc %d vblank wait interrupted by signal\n", in drm_wait_vblank_ioctl()
1928 drm_vblank_put(dev, pipe); in drm_wait_vblank_ioctl()
1932 static void drm_handle_vblank_events(struct drm_device *dev, unsigned int pipe) in drm_handle_vblank_events() argument
1934 struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe); in drm_handle_vblank_events()
1940 assert_spin_locked(&dev->event_lock); in drm_handle_vblank_events()
1942 seq = drm_vblank_count_and_time(dev, pipe, &now); in drm_handle_vblank_events()
1944 list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) { in drm_handle_vblank_events()
1950 drm_dbg_core(dev, "vblank event on %llu, current %llu\n", in drm_handle_vblank_events()
1954 drm_vblank_put(dev, pipe); in drm_handle_vblank_events()
1955 send_vblank_event(dev, e, seq, now); in drm_handle_vblank_events()
1974 bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe) in drm_handle_vblank() argument
1976 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_handle_vblank()
1980 if (drm_WARN_ON_ONCE(dev, !drm_dev_has_vblank(dev))) in drm_handle_vblank()
1983 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) in drm_handle_vblank()
1986 spin_lock_irqsave(&dev->event_lock, irqflags); in drm_handle_vblank()
1992 spin_lock(&dev->vblank_time_lock); in drm_handle_vblank()
1996 spin_unlock(&dev->vblank_time_lock); in drm_handle_vblank()
1997 spin_unlock_irqrestore(&dev->event_lock, irqflags); in drm_handle_vblank()
2001 drm_update_vblank_count(dev, pipe, true); in drm_handle_vblank()
2003 spin_unlock(&dev->vblank_time_lock); in drm_handle_vblank()
2012 disable_irq = (dev->vblank_disable_immediate && in drm_handle_vblank()
2016 drm_handle_vblank_events(dev, pipe); in drm_handle_vblank()
2019 spin_unlock_irqrestore(&dev->event_lock, irqflags); in drm_handle_vblank()
2050 return drm_handle_vblank(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_handle_vblank()
2062 int drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data, in drm_crtc_get_sequence_ioctl() argument
2073 if (!drm_core_check_feature(dev, DRIVER_MODESET)) in drm_crtc_get_sequence_ioctl()
2076 if (!drm_dev_has_vblank(dev)) in drm_crtc_get_sequence_ioctl()
2079 crtc = drm_crtc_find(dev, file_priv, get_seq->crtc_id); in drm_crtc_get_sequence_ioctl()
2085 vblank = &dev->vblank[pipe]; in drm_crtc_get_sequence_ioctl()
2086 vblank_enabled = dev->vblank_disable_immediate && READ_ONCE(vblank->enabled); in drm_crtc_get_sequence_ioctl()
2091 drm_dbg_core(dev, in drm_crtc_get_sequence_ioctl()
2103 get_seq->sequence = drm_vblank_count_and_time(dev, pipe, &now); in drm_crtc_get_sequence_ioctl()
2118 int drm_crtc_queue_sequence_ioctl(struct drm_device *dev, void *data, in drm_crtc_queue_sequence_ioctl() argument
2132 if (!drm_core_check_feature(dev, DRIVER_MODESET)) in drm_crtc_queue_sequence_ioctl()
2135 if (!drm_dev_has_vblank(dev)) in drm_crtc_queue_sequence_ioctl()
2138 crtc = drm_crtc_find(dev, file_priv, queue_seq->crtc_id); in drm_crtc_queue_sequence_ioctl()
2150 vblank = &dev->vblank[pipe]; in drm_crtc_queue_sequence_ioctl()
2158 drm_dbg_core(dev, in drm_crtc_queue_sequence_ioctl()
2164 seq = drm_vblank_count_and_time(dev, pipe, &now); in drm_crtc_queue_sequence_ioctl()
2178 spin_lock_irq(&dev->event_lock); in drm_crtc_queue_sequence_ioctl()
2191 ret = drm_event_reserve_init_locked(dev, file_priv, &e->base, in drm_crtc_queue_sequence_ioctl()
2201 send_vblank_event(dev, e, seq, now); in drm_crtc_queue_sequence_ioctl()
2205 list_add_tail(&e->base.link, &dev->vblank_event_list); in drm_crtc_queue_sequence_ioctl()
2209 spin_unlock_irq(&dev->event_lock); in drm_crtc_queue_sequence_ioctl()
2213 spin_unlock_irq(&dev->event_lock); in drm_crtc_queue_sequence_ioctl()