Lines Matching refs:dev

46 #define vblanktimestamp(dev, crtc, count) \  argument
47 ((dev)->vblank[crtc].time[(count) % DRM_VBLANKTIME_RBSIZE])
60 drm_get_last_vbltimestamp(struct drm_device *dev, int crtc,
93 static void drm_update_vblank_count(struct drm_device *dev, int crtc) in drm_update_vblank_count() argument
95 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_update_vblank_count()
113 cur_vblank = dev->driver->get_vblank_counter(dev, crtc); in drm_update_vblank_count()
114 rc = drm_get_last_vbltimestamp(dev, crtc, &t_vblank, 0); in drm_update_vblank_count()
115 } while (cur_vblank != dev->driver->get_vblank_counter(dev, crtc)); in drm_update_vblank_count()
120 diff += dev->max_vblank_count; in drm_update_vblank_count()
138 vblanktimestamp(dev, crtc, tslot) = rc ? t_vblank : (struct timeval) {0, 0}; in drm_update_vblank_count()
151 static void vblank_disable_and_save(struct drm_device *dev, int crtc) in vblank_disable_and_save() argument
153 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in vblank_disable_and_save()
165 spin_lock_irqsave(&dev->vblank_time_lock, irqflags); in vblank_disable_and_save()
181 drm_get_last_vbltimestamp(dev, crtc, &tvblank, 0)) { in vblank_disable_and_save()
182 drm_update_vblank_count(dev, crtc); in vblank_disable_and_save()
183 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags); in vblank_disable_and_save()
193 dev->driver->disable_vblank(dev, crtc); in vblank_disable_and_save()
210 vblank->last = dev->driver->get_vblank_counter(dev, crtc); in vblank_disable_and_save()
211 vblrc = drm_get_last_vbltimestamp(dev, crtc, &tvblank, 0); in vblank_disable_and_save()
212 } while (vblank->last != dev->driver->get_vblank_counter(dev, crtc) && (--count) && vblrc); in vblank_disable_and_save()
222 timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount)); in vblank_disable_and_save()
238 vblanktimestamp(dev, crtc, vblcount + 1) = tvblank; in vblank_disable_and_save()
248 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags); in vblank_disable_and_save()
254 struct drm_device *dev = vblank->dev; in vblank_disable_fn() local
258 if (!dev->vblank_disable_allowed) in vblank_disable_fn()
261 spin_lock_irqsave(&dev->vbl_lock, irqflags); in vblank_disable_fn()
264 vblank_disable_and_save(dev, crtc); in vblank_disable_fn()
266 spin_unlock_irqrestore(&dev->vbl_lock, irqflags); in vblank_disable_fn()
275 void drm_vblank_cleanup(struct drm_device *dev) in drm_vblank_cleanup() argument
280 if (dev->num_crtcs == 0) in drm_vblank_cleanup()
283 for (crtc = 0; crtc < dev->num_crtcs; crtc++) { in drm_vblank_cleanup()
284 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_cleanup()
287 drm_core_check_feature(dev, DRIVER_MODESET)); in drm_vblank_cleanup()
292 kfree(dev->vblank); in drm_vblank_cleanup()
294 dev->num_crtcs = 0; in drm_vblank_cleanup()
308 int drm_vblank_init(struct drm_device *dev, int num_crtcs) in drm_vblank_init() argument
312 spin_lock_init(&dev->vbl_lock); in drm_vblank_init()
313 spin_lock_init(&dev->vblank_time_lock); in drm_vblank_init()
315 dev->num_crtcs = num_crtcs; in drm_vblank_init()
317 dev->vblank = kcalloc(num_crtcs, sizeof(*dev->vblank), GFP_KERNEL); in drm_vblank_init()
318 if (!dev->vblank) in drm_vblank_init()
322 struct drm_vblank_crtc *vblank = &dev->vblank[i]; in drm_vblank_init()
324 vblank->dev = dev; in drm_vblank_init()
334 if (dev->driver->get_vblank_timestamp) in drm_vblank_init()
339 dev->vblank_disable_allowed = false; in drm_vblank_init()
344 dev->num_crtcs = 0; in drm_vblank_init()
351 struct drm_device *dev = cookie; in drm_irq_vgaarb_nokms() local
353 if (dev->driver->vgaarb_irq) { in drm_irq_vgaarb_nokms()
354 dev->driver->vgaarb_irq(dev, state); in drm_irq_vgaarb_nokms()
358 if (!dev->irq_enabled) in drm_irq_vgaarb_nokms()
362 if (dev->driver->irq_uninstall) in drm_irq_vgaarb_nokms()
363 dev->driver->irq_uninstall(dev); in drm_irq_vgaarb_nokms()
365 if (dev->driver->irq_preinstall) in drm_irq_vgaarb_nokms()
366 dev->driver->irq_preinstall(dev); in drm_irq_vgaarb_nokms()
367 if (dev->driver->irq_postinstall) in drm_irq_vgaarb_nokms()
368 dev->driver->irq_postinstall(dev); in drm_irq_vgaarb_nokms()
389 int drm_irq_install(struct drm_device *dev, int irq) in drm_irq_install() argument
394 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) in drm_irq_install()
401 if (!dev->dev_private) in drm_irq_install()
404 if (dev->irq_enabled) in drm_irq_install()
406 dev->irq_enabled = true; in drm_irq_install()
411 if (dev->driver->irq_preinstall) in drm_irq_install()
412 dev->driver->irq_preinstall(dev); in drm_irq_install()
415 if (drm_core_check_feature(dev, DRIVER_IRQ_SHARED)) in drm_irq_install()
418 ret = request_irq(irq, dev->driver->irq_handler, in drm_irq_install()
419 sh_flags, dev->driver->name, dev); in drm_irq_install()
422 dev->irq_enabled = false; in drm_irq_install()
426 if (!drm_core_check_feature(dev, DRIVER_MODESET)) in drm_irq_install()
427 vga_client_register(dev->pdev, (void *)dev, drm_irq_vgaarb_nokms, NULL); in drm_irq_install()
430 if (dev->driver->irq_postinstall) in drm_irq_install()
431 ret = dev->driver->irq_postinstall(dev); in drm_irq_install()
434 dev->irq_enabled = false; in drm_irq_install()
435 if (!drm_core_check_feature(dev, DRIVER_MODESET)) in drm_irq_install()
436 vga_client_register(dev->pdev, NULL, NULL, NULL); in drm_irq_install()
437 free_irq(irq, dev); in drm_irq_install()
439 dev->irq = irq; in drm_irq_install()
462 int drm_irq_uninstall(struct drm_device *dev) in drm_irq_uninstall() argument
468 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) in drm_irq_uninstall()
471 irq_enabled = dev->irq_enabled; in drm_irq_uninstall()
472 dev->irq_enabled = false; in drm_irq_uninstall()
480 if (dev->num_crtcs) { in drm_irq_uninstall()
481 spin_lock_irqsave(&dev->vbl_lock, irqflags); in drm_irq_uninstall()
482 for (i = 0; i < dev->num_crtcs; i++) { in drm_irq_uninstall()
483 struct drm_vblank_crtc *vblank = &dev->vblank[i]; in drm_irq_uninstall()
488 WARN_ON(drm_core_check_feature(dev, DRIVER_MODESET)); in drm_irq_uninstall()
490 vblank_disable_and_save(dev, i); in drm_irq_uninstall()
493 spin_unlock_irqrestore(&dev->vbl_lock, irqflags); in drm_irq_uninstall()
499 DRM_DEBUG("irq=%d\n", dev->irq); in drm_irq_uninstall()
501 if (!drm_core_check_feature(dev, DRIVER_MODESET)) in drm_irq_uninstall()
502 vga_client_register(dev->pdev, NULL, NULL, NULL); in drm_irq_uninstall()
504 if (dev->driver->irq_uninstall) in drm_irq_uninstall()
505 dev->driver->irq_uninstall(dev); in drm_irq_uninstall()
507 free_irq(dev->irq, dev); in drm_irq_uninstall()
524 int drm_control(struct drm_device *dev, void *data, in drm_control() argument
534 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) in drm_control()
536 if (drm_core_check_feature(dev, DRIVER_MODESET)) in drm_control()
539 if (WARN_ON(!dev->pdev)) in drm_control()
544 irq = dev->pdev->irq; in drm_control()
546 if (dev->if_version < DRM_IF_VERSION(1, 2) && in drm_control()
549 mutex_lock(&dev->struct_mutex); in drm_control()
550 ret = drm_irq_install(dev, irq); in drm_control()
551 mutex_unlock(&dev->struct_mutex); in drm_control()
555 mutex_lock(&dev->struct_mutex); in drm_control()
556 ret = drm_irq_uninstall(dev); in drm_control()
557 mutex_unlock(&dev->struct_mutex); in drm_control()
663 int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc, in drm_calc_vbltimestamp_from_scanoutpos() argument
677 if (crtc < 0 || crtc >= dev->num_crtcs) { in drm_calc_vbltimestamp_from_scanoutpos()
683 if (!dev->driver->get_scanout_position) { in drm_calc_vbltimestamp_from_scanoutpos()
713 vbl_status = dev->driver->get_scanout_position(dev, crtc, flags, &vpos, in drm_calc_vbltimestamp_from_scanoutpos()
810 drm_get_last_vbltimestamp(struct drm_device *dev, int crtc, in drm_get_last_vbltimestamp() argument
819 if (dev->driver->get_vblank_timestamp && (max_error > 0)) { in drm_get_last_vbltimestamp()
820 ret = dev->driver->get_vblank_timestamp(dev, crtc, &max_error, in drm_get_last_vbltimestamp()
848 u32 drm_vblank_count(struct drm_device *dev, int crtc) in drm_vblank_count() argument
850 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_count()
852 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_count()
873 return drm_vblank_count(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_vblank_count()
890 u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc, in drm_vblank_count_and_time() argument
893 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_count_and_time()
896 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_count_and_time()
906 *vblanktime = vblanktimestamp(dev, crtc, cur_vblank); in drm_vblank_count_and_time()
914 static void send_vblank_event(struct drm_device *dev, in send_vblank_event() argument
918 WARN_ON_SMP(!spin_is_locked(&dev->event_lock)); in send_vblank_event()
941 void drm_send_vblank_event(struct drm_device *dev, int crtc, in drm_send_vblank_event() argument
948 seq = drm_vblank_count_and_time(dev, crtc, &now); in drm_send_vblank_event()
955 send_vblank_event(dev, e, seq, &now); in drm_send_vblank_event()
972 drm_send_vblank_event(crtc->dev, drm_crtc_index(crtc), e); in drm_crtc_send_vblank_event()
981 static int drm_vblank_enable(struct drm_device *dev, int crtc) in drm_vblank_enable() argument
983 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_enable()
986 assert_spin_locked(&dev->vbl_lock); in drm_vblank_enable()
988 spin_lock(&dev->vblank_time_lock); in drm_vblank_enable()
998 ret = dev->driver->enable_vblank(dev, crtc); in drm_vblank_enable()
1004 drm_update_vblank_count(dev, crtc); in drm_vblank_enable()
1008 spin_unlock(&dev->vblank_time_lock); in drm_vblank_enable()
1026 int drm_vblank_get(struct drm_device *dev, int crtc) in drm_vblank_get() argument
1028 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_get()
1032 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_get()
1035 spin_lock_irqsave(&dev->vbl_lock, irqflags); in drm_vblank_get()
1038 ret = drm_vblank_enable(dev, crtc); in drm_vblank_get()
1045 spin_unlock_irqrestore(&dev->vbl_lock, irqflags); in drm_vblank_get()
1065 return drm_vblank_get(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_vblank_get()
1079 void drm_vblank_put(struct drm_device *dev, int crtc) in drm_vblank_put() argument
1081 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_put()
1086 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_put()
1093 else if (dev->vblank_disable_immediate || drm_vblank_offdelay < 0) in drm_vblank_put()
1113 drm_vblank_put(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_vblank_put()
1126 void drm_wait_one_vblank(struct drm_device *dev, int crtc) in drm_wait_one_vblank() argument
1131 ret = drm_vblank_get(dev, crtc); in drm_wait_one_vblank()
1135 last = drm_vblank_count(dev, crtc); in drm_wait_one_vblank()
1137 ret = wait_event_timeout(dev->vblank[crtc].queue, in drm_wait_one_vblank()
1138 last != drm_vblank_count(dev, crtc), in drm_wait_one_vblank()
1143 drm_vblank_put(dev, crtc); in drm_wait_one_vblank()
1157 drm_wait_one_vblank(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_wait_one_vblank()
1175 void drm_vblank_off(struct drm_device *dev, int crtc) in drm_vblank_off() argument
1177 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_off()
1183 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_off()
1186 spin_lock_irqsave(&dev->event_lock, irqflags); in drm_vblank_off()
1188 spin_lock(&dev->vbl_lock); in drm_vblank_off()
1189 vblank_disable_and_save(dev, crtc); in drm_vblank_off()
1200 spin_unlock(&dev->vbl_lock); in drm_vblank_off()
1203 seq = drm_vblank_count_and_time(dev, crtc, &now); in drm_vblank_off()
1205 list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) { in drm_vblank_off()
1212 drm_vblank_put(dev, e->pipe); in drm_vblank_off()
1213 send_vblank_event(dev, e, seq, &now); in drm_vblank_off()
1215 spin_unlock_irqrestore(&dev->event_lock, irqflags); in drm_vblank_off()
1234 drm_vblank_off(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_vblank_off()
1250 struct drm_device *dev = drm_crtc->dev; in drm_crtc_vblank_reset() local
1253 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_crtc_vblank_reset()
1255 spin_lock_irqsave(&dev->vbl_lock, irqflags); in drm_crtc_vblank_reset()
1264 spin_unlock_irqrestore(&dev->vbl_lock, irqflags); in drm_crtc_vblank_reset()
1266 WARN_ON(!list_empty(&dev->vblank_event_list)); in drm_crtc_vblank_reset()
1282 void drm_vblank_on(struct drm_device *dev, int crtc) in drm_vblank_on() argument
1284 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_on()
1287 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_on()
1290 spin_lock_irqsave(&dev->vbl_lock, irqflags); in drm_vblank_on()
1305 (dev->driver->get_vblank_counter(dev, crtc) - 1) & in drm_vblank_on()
1306 dev->max_vblank_count; in drm_vblank_on()
1312 (!dev->vblank_disable_immediate && drm_vblank_offdelay == 0)) in drm_vblank_on()
1313 WARN_ON(drm_vblank_enable(dev, crtc)); in drm_vblank_on()
1314 spin_unlock_irqrestore(&dev->vbl_lock, irqflags); in drm_vblank_on()
1331 drm_vblank_on(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_vblank_on()
1358 void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) in drm_vblank_pre_modeset() argument
1360 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_pre_modeset()
1363 if (!dev->num_crtcs) in drm_vblank_pre_modeset()
1366 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_pre_modeset()
1378 if (drm_vblank_get(dev, crtc) == 0) in drm_vblank_pre_modeset()
1392 void drm_vblank_post_modeset(struct drm_device *dev, int crtc) in drm_vblank_post_modeset() argument
1394 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_post_modeset()
1398 if (!dev->num_crtcs) in drm_vblank_post_modeset()
1402 spin_lock_irqsave(&dev->vbl_lock, irqflags); in drm_vblank_post_modeset()
1403 dev->vblank_disable_allowed = true; in drm_vblank_post_modeset()
1404 spin_unlock_irqrestore(&dev->vbl_lock, irqflags); in drm_vblank_post_modeset()
1407 drm_vblank_put(dev, crtc); in drm_vblank_post_modeset()
1425 int drm_modeset_ctl(struct drm_device *dev, void *data, in drm_modeset_ctl() argument
1432 if (!dev->num_crtcs) in drm_modeset_ctl()
1436 if (drm_core_check_feature(dev, DRIVER_MODESET)) in drm_modeset_ctl()
1440 if (crtc >= dev->num_crtcs) in drm_modeset_ctl()
1445 drm_vblank_pre_modeset(dev, crtc); in drm_modeset_ctl()
1448 drm_vblank_post_modeset(dev, crtc); in drm_modeset_ctl()
1457 static int drm_queue_vblank_event(struct drm_device *dev, int pipe, in drm_queue_vblank_event() argument
1461 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; in drm_queue_vblank_event()
1483 spin_lock_irqsave(&dev->event_lock, flags); in drm_queue_vblank_event()
1503 seq = drm_vblank_count_and_time(dev, pipe, &now); in drm_queue_vblank_event()
1519 drm_vblank_put(dev, pipe); in drm_queue_vblank_event()
1520 send_vblank_event(dev, e, seq, &now); in drm_queue_vblank_event()
1524 list_add_tail(&e->base.link, &dev->vblank_event_list); in drm_queue_vblank_event()
1528 spin_unlock_irqrestore(&dev->event_lock, flags); in drm_queue_vblank_event()
1533 spin_unlock_irqrestore(&dev->event_lock, flags); in drm_queue_vblank_event()
1536 drm_vblank_put(dev, pipe); in drm_queue_vblank_event()
1554 int drm_wait_vblank(struct drm_device *dev, void *data, in drm_wait_vblank() argument
1562 if (!dev->irq_enabled) in drm_wait_vblank()
1584 if (crtc >= dev->num_crtcs) in drm_wait_vblank()
1587 vblank = &dev->vblank[crtc]; in drm_wait_vblank()
1589 ret = drm_vblank_get(dev, crtc); in drm_wait_vblank()
1594 seq = drm_vblank_count(dev, crtc); in drm_wait_vblank()
1611 return drm_queue_vblank_event(dev, crtc, vblwait, file_priv); in drm_wait_vblank()
1623 (((drm_vblank_count(dev, crtc) - in drm_wait_vblank()
1626 !dev->irq_enabled)); in drm_wait_vblank()
1631 vblwait->reply.sequence = drm_vblank_count_and_time(dev, crtc, &now); in drm_wait_vblank()
1642 drm_vblank_put(dev, crtc); in drm_wait_vblank()
1646 static void drm_handle_vblank_events(struct drm_device *dev, int crtc) in drm_handle_vblank_events() argument
1652 assert_spin_locked(&dev->event_lock); in drm_handle_vblank_events()
1654 seq = drm_vblank_count_and_time(dev, crtc, &now); in drm_handle_vblank_events()
1656 list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) { in drm_handle_vblank_events()
1666 drm_vblank_put(dev, e->pipe); in drm_handle_vblank_events()
1667 send_vblank_event(dev, e, seq, &now); in drm_handle_vblank_events()
1683 bool drm_handle_vblank(struct drm_device *dev, int crtc) in drm_handle_vblank() argument
1685 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_handle_vblank()
1691 if (WARN_ON_ONCE(!dev->num_crtcs)) in drm_handle_vblank()
1694 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_handle_vblank()
1697 spin_lock_irqsave(&dev->event_lock, irqflags); in drm_handle_vblank()
1703 spin_lock(&dev->vblank_time_lock); in drm_handle_vblank()
1707 spin_unlock(&dev->vblank_time_lock); in drm_handle_vblank()
1708 spin_unlock_irqrestore(&dev->event_lock, irqflags); in drm_handle_vblank()
1718 drm_get_last_vbltimestamp(dev, crtc, &tvblank, DRM_CALLED_FROM_VBLIRQ); in drm_handle_vblank()
1722 timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount)); in drm_handle_vblank()
1735 vblanktimestamp(dev, crtc, vblcount + 1) = tvblank; in drm_handle_vblank()
1748 spin_unlock(&dev->vblank_time_lock); in drm_handle_vblank()
1751 drm_handle_vblank_events(dev, crtc); in drm_handle_vblank()
1753 spin_unlock_irqrestore(&dev->event_lock, irqflags); in drm_handle_vblank()
1773 return drm_handle_vblank(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_handle_vblank()