Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9be6f8a9 authored by Mario Kleiner's avatar Mario Kleiner Committed by Dave Airlie
Browse files

drm/vblank: Enable precise vblank timestamps for interlaced and doublescan modes.



Testing showed the current code can already handle doublescan
video modes just fine. A trivial tweak makes it work for interlaced
scanout as well.

Tested and shown to be precise on Radeon rv530, r600 and
Intel 945-GME.

Signed-off-by: default avatarMario Kleiner <mario.kleiner@tuebingen.mpg.de>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent bc215128
Loading
Loading
Loading
Loading
+6 −8
Original line number Original line Diff line number Diff line
@@ -493,6 +493,12 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc)
	/* Dot clock in Hz: */
	/* Dot clock in Hz: */
	dotclock = (u64) crtc->hwmode.clock * 1000;
	dotclock = (u64) crtc->hwmode.clock * 1000;


	/* Fields of interlaced scanout modes are only halve a frame duration.
	 * Double the dotclock to get halve the frame-/line-/pixelduration.
	 */
	if (crtc->hwmode.flags & DRM_MODE_FLAG_INTERLACE)
		dotclock *= 2;

	/* Valid dotclock? */
	/* Valid dotclock? */
	if (dotclock > 0) {
	if (dotclock > 0) {
		/* Convert scanline length in pixels and video dot clock to
		/* Convert scanline length in pixels and video dot clock to
@@ -605,14 +611,6 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc,
		return -EAGAIN;
		return -EAGAIN;
	}
	}


	/* Don't know yet how to handle interlaced or
	 * double scan modes. Just no-op for now.
	 */
	if (mode->flags & (DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLSCAN)) {
		DRM_DEBUG("crtc %d: Noop due to unsupported mode.\n", crtc);
		return -ENOTSUPP;
	}

	/* Get current scanout position with system timestamp.
	/* Get current scanout position with system timestamp.
	 * Repeat query up to DRM_TIMESTAMP_MAXRETRIES times
	 * Repeat query up to DRM_TIMESTAMP_MAXRETRIES times
	 * if single query takes longer than max_error nanoseconds.
	 * if single query takes longer than max_error nanoseconds.