Lines Matching defs:crtc

221 #define vblanktimestamp(dev, crtc, count) ( \
222 (dev)->_vblank_time[(crtc) * DRM_VBLANKTIME_RBSIZE + \
270 * Clear vblank timestamp buffer for a crtc.
272 static void clear_vblank_timestamps(struct drm_device *dev, int crtc)
274 (void) memset(&dev->_vblank_time[crtc * DRM_VBLANKTIME_RBSIZE], -1,
279 * Disable vblank irq's on crtc, make sure that last vblank count
284 static void vblank_disable_and_save(struct drm_device *dev, int crtc)
299 dev->driver->disable_vblank(dev, crtc);
300 dev->vblank_enabled[crtc] = 0;
315 dev->last_vblank[crtc] = dev->driver->get_vblank_counter(dev, crtc);
316 vblrc = drm_get_last_vbltimestamp(dev, crtc, &tvblank, 0);
317 } while (dev->last_vblank[crtc] != dev->driver->get_vblank_counter(dev, crtc) && (--count) && vblrc);
325 vblcount = atomic_read(&dev->_vblank_count[crtc]);
327 timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount));
342 atomic_inc(&dev->_vblank_count[crtc]);
346 clear_vblank_timestamps(dev, crtc);
364 DRM_DEBUG("disabling vblank on crtc %d\n", i);
451 /* Zero per-crtc vblank stuff */
647 * They are derived from crtc's true scanout timing,
651 * @crtc drm_crtc whose timestamp constants should be updated.
654 void drm_calc_timestamping_constants(struct drm_crtc *crtc)
660 dotclock = (u64) crtc->hwmode.clock * 1000;
665 if (crtc->hwmode.flags & DRM_MODE_FLAG_INTERLACE)
676 linedur_ns = (s64) div_u64(((u64) crtc->hwmode.crtc_htotal *
678 frame_size = crtc->hwmode.crtc_htotal *
679 crtc->hwmode.crtc_vtotal;
683 DRM_ERROR("crtc %d: Can't calculate constants, dotclock = 0!\n",
684 crtc->base.id);
686 crtc->pixeldur_ns = pixeldur_ns;
687 crtc->linedur_ns = linedur_ns;
688 crtc->framedur_ns = framedur_ns;
690 DRM_DEBUG("crtc %d: hwmode: htotal %d, vtotal %d, vdisplay %d\n",
691 crtc->base.id, crtc->hwmode.crtc_htotal,
692 crtc->hwmode.crtc_vtotal, crtc->hwmode.crtc_vdisplay);
693 DRM_DEBUG("crtc %d: clock %d kHz framedur %d linedur %d, pixeldur %d\n",
694 crtc->base.id, (int) dotclock/1000, (int) framedur_ns,
702 * of a crtc. This can be called from within get_vblank_timestamp()
719 * @crtc: Which crtc's vblank timestamp to retrieve.
726 * @refcrtc: drm_crtc* of crtc which defines scanout timing.
731 * -EINVAL - Invalid crtc.
742 int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc,
755 if (crtc < 0 || crtc >= dev->num_crtcs) {
756 DRM_ERROR("Invalid crtc %d\n", crtc);
776 * Happens during initial modesetting of a crtc.
779 DRM_DEBUG("crtc %d: Noop due to uninitialized mode.\n", crtc);
799 vbl_status = dev->driver->get_scanout_position(dev, crtc, &vpos, &hpos);
806 DRM_DEBUG("crtc %d : scanoutpos query failed [%d].\n",
807 crtc, vbl_status);
820 DRM_DEBUG("crtc %d: Noisy timestamp %d us > %d us [%d reps].\n",
821 crtc, (int) duration_ns/1000, *max_error/1000, i);
863 DRM_DEBUG("crtc %d : v %d p(%d,%d)@ %ld.%ld -> %ld.%ld [e %d us, %d rep]\n",
864 crtc, (int) vbl_status, hpos, vpos, raw_time.tv_sec,
880 * @crtc: which crtc's vblank timestamp to retrieve
887 * vblank interval on specified crtc. May call into kms-driver to
895 u32 drm_get_last_vbltimestamp(struct drm_device *dev, int crtc,
905 ret = dev->driver->get_vblank_timestamp(dev, crtc, &max_error,
922 * @crtc: which counter to retrieve
928 u32 drm_vblank_count(struct drm_device *dev, int crtc)
930 return atomic_read(&dev->_vblank_count[crtc]);
938 * @crtc: which counter to retrieve
947 u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc,
958 cur_vblank = atomic_read(&dev->_vblank_count[crtc]);
959 *vblanktime = vblanktimestamp(dev, crtc, cur_vblank);
960 } while (cur_vblank != atomic_read(&dev->_vblank_count[crtc]));
981 * @crtc: CRTC in question
987 void drm_send_vblank_event(struct drm_device *dev, int crtc,
992 if (crtc >= 0) {
993 seq = drm_vblank_count_and_time(dev, crtc, &now);
999 e->pipe = crtc;
1006 * @crtc: counter to update
1009 * (specified by @crtc). Deal with wraparound, if it occurred, and
1019 static void drm_update_vblank_count(struct drm_device *dev, int crtc)
1037 cur_vblank = dev->driver->get_vblank_counter(dev, crtc);
1038 rc = drm_get_last_vbltimestamp(dev, crtc, &t_vblank, 0);
1039 } while (cur_vblank != dev->driver->get_vblank_counter(dev, crtc));
1042 diff = cur_vblank - dev->last_vblank[crtc];
1043 if (cur_vblank < dev->last_vblank[crtc]) {
1047 crtc, dev->last_vblank[crtc], cur_vblank, diff);
1050 DRM_DEBUG("enabling vblank interrupts on crtc %d, missed %d\n",
1051 crtc, diff);
1058 tslot = atomic_read(&dev->_vblank_count[crtc]) + diff;
1059 vblanktimestamp(dev, crtc, tslot) = t_vblank;
1062 atomic_add(diff, &dev->_vblank_count[crtc]);
1068 * @crtc: which CRTC to own
1076 int drm_vblank_get(struct drm_device *dev, int crtc)
1083 if (atomic_add_return(1, &dev->vblank_refcount[crtc]) == 1) {
1085 if (!dev->vblank_enabled[crtc]) {
1086 ret = dev->driver->enable_vblank(dev, crtc);
1087 DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n",
1088 crtc, ret);
1090 atomic_dec(&dev->vblank_refcount[crtc]);
1092 dev->vblank_enabled[crtc] = 1;
1093 drm_update_vblank_count(dev, crtc);
1098 if (!dev->vblank_enabled[crtc]) {
1099 atomic_dec(&dev->vblank_refcount[crtc]);
1111 * @crtc: which counter to give up
1116 void drm_vblank_put(struct drm_device *dev, int crtc)
1118 BUG_ON (atomic_read (&dev->vblank_refcount[crtc]) == 0);
1121 if (atomic_dec_and_test(&dev->vblank_refcount[crtc]) &&
1130 * @crtc: CRTC in question
1134 void drm_vblank_off(struct drm_device *dev, int crtc)
1142 vblank_disable_and_save(dev, crtc);
1143 DRM_WAKEUP(&dev->vbl_queue[crtc]);
1146 seq = drm_vblank_count_and_time(dev, crtc, &now);
1151 if (e->pipe != crtc)
1168 * @crtc: CRTC in question
1174 void drm_vblank_pre_modeset(struct drm_device *dev, int crtc)
1186 if (!dev->vblank_inmodeset[crtc]) {
1187 dev->vblank_inmodeset[crtc] = 0x1;
1188 if (drm_vblank_get(dev, crtc) == 0)
1189 dev->vblank_inmodeset[crtc] |= 0x2;
1193 void drm_vblank_post_modeset(struct drm_device *dev, int crtc)
1201 if (dev->vblank_inmodeset[crtc]) {
1206 if (dev->vblank_inmodeset[crtc] & 0x2)
1207 drm_vblank_put(dev, crtc);
1209 dev->vblank_inmodeset[crtc] = 0;
1228 unsigned int crtc;
1238 crtc = modeset->crtc;
1239 if (crtc >= dev->num_crtcs)
1244 drm_vblank_pre_modeset(dev, crtc);
1247 drm_vblank_post_modeset(dev, crtc);
1297 DRM_DEBUG("event on vblank count %d, current %d, crtc %d\n",
1342 unsigned int flags, seq, crtc, high_crtc;
1363 crtc = high_crtc >> _DRM_VBLANK_HIGH_CRTC_SHIFT;
1365 crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0;
1366 if (crtc >= dev->num_crtcs)
1369 ret = drm_vblank_get(dev, crtc);
1374 seq = drm_vblank_count(dev, crtc);
1392 return drm_queue_vblank_event(dev, crtc, vblwait, file);
1400 DRM_DEBUG("waiting on vblank count %d, crtc %d\n",
1401 vblwait->request.sequence, crtc);
1402 dev->last_vblank_wait[crtc] = vblwait->request.sequence;
1403 DRM_WAIT_ON(ret, &dev->vbl_queue[crtc], 3 * DRM_HZ,
1404 (((drm_vblank_count(dev, crtc) -
1411 vblwait->reply.sequence = drm_vblank_count_and_time(dev, crtc, &now);
1422 drm_vblank_put(dev, crtc);
1426 static void drm_handle_vblank_events(struct drm_device *dev, int crtc)
1433 seq = drm_vblank_count_and_time(dev, crtc, &now);
1439 if (e->pipe != crtc)
1459 * @crtc: where this event occurred
1464 bool drm_handle_vblank(struct drm_device *dev, int crtc)
1481 if (!dev->vblank_enabled[crtc]) {
1491 vblcount = atomic_read(&dev->_vblank_count[crtc]);
1492 (void) drm_get_last_vbltimestamp(dev, crtc, &tvblank, DRM_CALLED_FROM_VBLIRQ);
1496 timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount));
1509 vblanktimestamp(dev, crtc, vblcount + 1) = tvblank;
1514 atomic_inc(&dev->_vblank_count[crtc]);
1516 DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n",
1517 crtc, (int) diff_ns);
1520 DRM_WAKEUP(&dev->vbl_queue[crtc]);
1521 drm_handle_vblank_events(dev, crtc);