Commit addc80f0 authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915/tv: Fix adjusted_mode dotclock for interlaced modes

intel_tv_mode_to_mode() assumes the pipe will be in progressive
fetch mode, and thus when programming the pipe into interlaced
mode we have to halve the calculated dotclock to get the correct
field duration.

This becomes more important when we start to program the pipe
into interlaced mode on i965gm as we depend on the timestamps
to get accurate frame counter values. Withot halving the clock
our guesstimated frame counter would tick at twice the expected
speed.

Cc: Imre Deak <imre.deak@intel.com>
Fixes: 690157f0 ("drm/i915/tv: Fix >1024 modes on gen3")
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190129141913.5515-1-ville.syrjala@linux.intel.comAcked-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 5a3db6f0
...@@ -1150,6 +1150,8 @@ intel_tv_get_config(struct intel_encoder *encoder, ...@@ -1150,6 +1150,8 @@ intel_tv_get_config(struct intel_encoder *encoder,
ypos, mode.vdisplay - ysize - ypos); ypos, mode.vdisplay - ysize - ypos);
adjusted_mode->crtc_clock = mode.clock; adjusted_mode->crtc_clock = mode.clock;
if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
adjusted_mode->crtc_clock /= 2;
/* pixel counter doesn't work on i965gm TV output */ /* pixel counter doesn't work on i965gm TV output */
if (IS_I965GM(dev_priv)) if (IS_I965GM(dev_priv))
...@@ -1214,8 +1216,11 @@ intel_tv_compute_config(struct intel_encoder *encoder, ...@@ -1214,8 +1216,11 @@ intel_tv_compute_config(struct intel_encoder *encoder,
tv_conn_state->bypass_vfilter = true; tv_conn_state->bypass_vfilter = true;
if (!tv_mode->progressive) if (!tv_mode->progressive) {
adjusted_mode->clock /= 2;
adjusted_mode->crtc_clock /= 2;
adjusted_mode->flags |= DRM_MODE_FLAG_INTERLACE; adjusted_mode->flags |= DRM_MODE_FLAG_INTERLACE;
}
} else { } else {
tv_conn_state->margins.top = conn_state->tv.margins.top; tv_conn_state->margins.top = conn_state->tv.margins.top;
tv_conn_state->margins.bottom = conn_state->tv.margins.bottom; tv_conn_state->margins.bottom = conn_state->tv.margins.bottom;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment