Lines Matching refs:crtc
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()
123 crtc, vblank->last, cur_vblank, diff); in drm_update_vblank_count()
127 crtc, diff); 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()
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()
187 dev->driver->disable_vblank(dev, crtc); in vblank_disable_and_save()
203 vblank->last = dev->driver->get_vblank_counter(dev, crtc); in vblank_disable_and_save()
204 vblrc = drm_get_last_vbltimestamp(dev, crtc, &tvblank, 0); in vblank_disable_and_save()
205 } while (vblank->last != dev->driver->get_vblank_counter(dev, crtc) && (--count) && vblrc); in vblank_disable_and_save()
215 timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount)); in vblank_disable_and_save()
231 vblanktimestamp(dev, crtc, vblcount + 1) = tvblank; in vblank_disable_and_save()
249 int crtc = vblank->crtc; in vblank_disable_fn() local
256 DRM_DEBUG("disabling vblank on crtc %d\n", crtc); in vblank_disable_fn()
257 vblank_disable_and_save(dev, crtc); in vblank_disable_fn()
270 int crtc; in drm_vblank_cleanup() local
277 for (crtc = 0; crtc < dev->num_crtcs; crtc++) { in drm_vblank_cleanup()
278 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_cleanup()
283 vblank_disable_and_save(dev, crtc); in drm_vblank_cleanup()
320 vblank->crtc = i; in drm_vblank_init()
565 void drm_calc_timestamping_constants(struct drm_crtc *crtc, in drm_calc_timestamping_constants() argument
591 crtc->base.id); in drm_calc_timestamping_constants()
593 crtc->pixeldur_ns = pixeldur_ns; in drm_calc_timestamping_constants()
594 crtc->linedur_ns = linedur_ns; in drm_calc_timestamping_constants()
595 crtc->framedur_ns = framedur_ns; in drm_calc_timestamping_constants()
598 crtc->base.id, mode->crtc_htotal, in drm_calc_timestamping_constants()
601 crtc->base.id, dotclock, framedur_ns, in drm_calc_timestamping_constants()
652 int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc, in drm_calc_vbltimestamp_from_scanoutpos() argument
666 if (crtc < 0 || crtc >= dev->num_crtcs) { in drm_calc_vbltimestamp_from_scanoutpos()
667 DRM_ERROR("Invalid crtc %d\n", crtc); in drm_calc_vbltimestamp_from_scanoutpos()
686 DRM_DEBUG("crtc %d: Noop due to uninitialized mode.\n", crtc); in drm_calc_vbltimestamp_from_scanoutpos()
702 vbl_status = dev->driver->get_scanout_position(dev, crtc, flags, &vpos, in drm_calc_vbltimestamp_from_scanoutpos()
708 crtc, vbl_status); in drm_calc_vbltimestamp_from_scanoutpos()
723 crtc, duration_ns/1000, *max_error/1000, i); in drm_calc_vbltimestamp_from_scanoutpos()
757 crtc, (int)vbl_status, hpos, vpos, in drm_calc_vbltimestamp_from_scanoutpos()
799 drm_get_last_vbltimestamp(struct drm_device *dev, int crtc, in drm_get_last_vbltimestamp() argument
809 ret = dev->driver->get_vblank_timestamp(dev, crtc, &max_error, in drm_get_last_vbltimestamp()
835 u32 drm_vblank_count(struct drm_device *dev, int crtc) in drm_vblank_count() argument
837 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_count()
839 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_count()
858 u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc, in drm_vblank_count_and_time() argument
861 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_count_and_time()
864 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_count_and_time()
874 *vblanktime = vblanktimestamp(dev, crtc, cur_vblank); in drm_vblank_count_and_time()
907 void drm_send_vblank_event(struct drm_device *dev, int crtc, in drm_send_vblank_event() argument
912 if (crtc >= 0) { in drm_send_vblank_event()
913 seq = drm_vblank_count_and_time(dev, crtc, &now); in drm_send_vblank_event()
919 e->pipe = crtc; in drm_send_vblank_event()
929 static int drm_vblank_enable(struct drm_device *dev, int crtc) in drm_vblank_enable() argument
931 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_enable()
946 ret = dev->driver->enable_vblank(dev, crtc); in drm_vblank_enable()
947 DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n", crtc, ret); in drm_vblank_enable()
952 drm_update_vblank_count(dev, crtc); in drm_vblank_enable()
974 int drm_vblank_get(struct drm_device *dev, int crtc) in drm_vblank_get() argument
976 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_get()
980 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_get()
986 ret = drm_vblank_enable(dev, crtc); in drm_vblank_get()
1011 int drm_crtc_vblank_get(struct drm_crtc *crtc) in drm_crtc_vblank_get() argument
1013 return drm_vblank_get(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_vblank_get()
1027 void drm_vblank_put(struct drm_device *dev, int crtc) in drm_vblank_put() argument
1029 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_put()
1034 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_put()
1059 void drm_crtc_vblank_put(struct drm_crtc *crtc) in drm_crtc_vblank_put() argument
1061 drm_vblank_put(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_vblank_put()
1074 void drm_wait_one_vblank(struct drm_device *dev, int crtc) in drm_wait_one_vblank() argument
1079 ret = drm_vblank_get(dev, crtc); in drm_wait_one_vblank()
1080 if (WARN(ret, "vblank not available on crtc %i, ret=%i\n", crtc, ret)) in drm_wait_one_vblank()
1083 last = drm_vblank_count(dev, crtc); in drm_wait_one_vblank()
1085 ret = wait_event_timeout(dev->vblank[crtc].queue, in drm_wait_one_vblank()
1086 last != drm_vblank_count(dev, crtc), in drm_wait_one_vblank()
1089 WARN(ret == 0, "vblank wait timed out on crtc %i\n", crtc); in drm_wait_one_vblank()
1091 drm_vblank_put(dev, crtc); in drm_wait_one_vblank()
1103 void drm_crtc_wait_one_vblank(struct drm_crtc *crtc) in drm_crtc_wait_one_vblank() argument
1105 drm_wait_one_vblank(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_wait_one_vblank()
1123 void drm_vblank_off(struct drm_device *dev, int crtc) in drm_vblank_off() argument
1125 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_off()
1131 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_off()
1137 vblank_disable_and_save(dev, crtc); in drm_vblank_off()
1151 seq = drm_vblank_count_and_time(dev, crtc, &now); in drm_vblank_off()
1154 if (e->pipe != crtc) in drm_vblank_off()
1180 void drm_crtc_vblank_off(struct drm_crtc *crtc) in drm_crtc_vblank_off() argument
1182 drm_vblank_off(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_vblank_off()
1198 void drm_vblank_on(struct drm_device *dev, int crtc) in drm_vblank_on() argument
1200 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_on()
1203 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_on()
1221 (dev->driver->get_vblank_counter(dev, crtc) - 1) & in drm_vblank_on()
1229 WARN_ON(drm_vblank_enable(dev, crtc)); in drm_vblank_on()
1245 void drm_crtc_vblank_on(struct drm_crtc *crtc) in drm_crtc_vblank_on() argument
1247 drm_vblank_on(crtc->dev, drm_crtc_index(crtc)); in drm_crtc_vblank_on()
1274 void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) in drm_vblank_pre_modeset() argument
1276 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_pre_modeset()
1282 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_vblank_pre_modeset()
1294 if (drm_vblank_get(dev, crtc) == 0) in drm_vblank_pre_modeset()
1308 void drm_vblank_post_modeset(struct drm_device *dev, int crtc) in drm_vblank_post_modeset() argument
1310 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_vblank_post_modeset()
1323 drm_vblank_put(dev, crtc); in drm_vblank_post_modeset()
1345 unsigned int crtc; in drm_modeset_ctl() local
1355 crtc = modeset->crtc; in drm_modeset_ctl()
1356 if (crtc >= dev->num_crtcs) in drm_modeset_ctl()
1361 drm_vblank_pre_modeset(dev, crtc); in drm_modeset_ctl()
1364 drm_vblank_post_modeset(dev, crtc); in drm_modeset_ctl()
1476 unsigned int flags, seq, crtc, high_crtc; in drm_wait_vblank() local
1497 crtc = high_crtc >> _DRM_VBLANK_HIGH_CRTC_SHIFT; in drm_wait_vblank()
1499 crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0; in drm_wait_vblank()
1500 if (crtc >= dev->num_crtcs) in drm_wait_vblank()
1503 vblank = &dev->vblank[crtc]; in drm_wait_vblank()
1505 ret = drm_vblank_get(dev, crtc); in drm_wait_vblank()
1510 seq = drm_vblank_count(dev, crtc); in drm_wait_vblank()
1527 return drm_queue_vblank_event(dev, crtc, vblwait, file_priv); in drm_wait_vblank()
1536 vblwait->request.sequence, crtc); in drm_wait_vblank()
1539 (((drm_vblank_count(dev, crtc) - in drm_wait_vblank()
1547 vblwait->reply.sequence = drm_vblank_count_and_time(dev, crtc, &now); in drm_wait_vblank()
1558 drm_vblank_put(dev, crtc); in drm_wait_vblank()
1562 static void drm_handle_vblank_events(struct drm_device *dev, int crtc) in drm_handle_vblank_events() argument
1570 seq = drm_vblank_count_and_time(dev, crtc, &now); in drm_handle_vblank_events()
1573 if (e->pipe != crtc) in drm_handle_vblank_events()
1586 trace_drm_vblank_event(crtc, seq); in drm_handle_vblank_events()
1597 bool drm_handle_vblank(struct drm_device *dev, int crtc) in drm_handle_vblank() argument
1599 struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; in drm_handle_vblank()
1608 if (WARN_ON(crtc >= dev->num_crtcs)) in drm_handle_vblank()
1632 drm_get_last_vbltimestamp(dev, crtc, &tvblank, DRM_CALLED_FROM_VBLIRQ); in drm_handle_vblank()
1636 timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount)); in drm_handle_vblank()
1649 vblanktimestamp(dev, crtc, vblcount + 1) = tvblank; in drm_handle_vblank()
1659 crtc, (int) diff_ns); in drm_handle_vblank()
1665 drm_handle_vblank_events(dev, crtc); in drm_handle_vblank()