drm/i915: Fix HDMI 12bpc and pixel repeat clock readout for DDI platforms
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 30 Jun 2015 12:33:51 +0000 (15:33 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 6 Jul 2015 07:43:39 +0000 (09:43 +0200)
Take the HDMI 12bpc mode and pixel repeat into account when extracting
the dotclock from the hardware on DDI platforms.

Tested on HSW only.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-and-tested-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_ddi.c

index 15fc66a8da78b673aea1e389b8b4542296db513a..e7f0379453e83052e0a7a45db8e75bdd23c11e75 100644 (file)
@@ -1027,6 +1027,26 @@ static int skl_calc_wrpll_link(struct drm_i915_private *dev_priv,
        return dco_freq / (p0 * p1 * p2 * 5);
 }
 
+static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)
+{
+       int dotclock;
+
+       if (pipe_config->has_pch_encoder)
+               dotclock = intel_dotclock_calculate(pipe_config->port_clock,
+                                                   &pipe_config->fdi_m_n);
+       else if (pipe_config->has_dp_encoder)
+               dotclock = intel_dotclock_calculate(pipe_config->port_clock,
+                                                   &pipe_config->dp_m_n);
+       else if (pipe_config->has_hdmi_sink && pipe_config->pipe_bpp == 36)
+               dotclock = pipe_config->port_clock * 2 / 3;
+       else
+               dotclock = pipe_config->port_clock;
+
+       if (pipe_config->pixel_multiplier)
+               dotclock /= pipe_config->pixel_multiplier;
+
+       pipe_config->base.adjusted_mode.crtc_clock = dotclock;
+}
 
 static void skl_ddi_clock_get(struct intel_encoder *encoder,
                                struct intel_crtc_state *pipe_config)
@@ -1073,12 +1093,7 @@ static void skl_ddi_clock_get(struct intel_encoder *encoder,
 
        pipe_config->port_clock = link_clock;
 
-       if (pipe_config->has_dp_encoder)
-               pipe_config->base.adjusted_mode.crtc_clock =
-                       intel_dotclock_calculate(pipe_config->port_clock,
-                                                &pipe_config->dp_m_n);
-       else
-               pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
+       ddi_dotclock_get(pipe_config);
 }
 
 static void hsw_ddi_clock_get(struct intel_encoder *encoder,
@@ -1125,16 +1140,7 @@ static void hsw_ddi_clock_get(struct intel_encoder *encoder,
 
        pipe_config->port_clock = link_clock * 2;
 
-       if (pipe_config->has_pch_encoder)
-               pipe_config->base.adjusted_mode.crtc_clock =
-                       intel_dotclock_calculate(pipe_config->port_clock,
-                                                &pipe_config->fdi_m_n);
-       else if (pipe_config->has_dp_encoder)
-               pipe_config->base.adjusted_mode.crtc_clock =
-                       intel_dotclock_calculate(pipe_config->port_clock,
-                                                &pipe_config->dp_m_n);
-       else
-               pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
+       ddi_dotclock_get(pipe_config);
 }
 
 static int bxt_calc_pll_link(struct drm_i915_private *dev_priv,
@@ -1169,16 +1175,9 @@ static void bxt_ddi_clock_get(struct intel_encoder *encoder,
        enum port port = intel_ddi_get_encoder_port(encoder);
        uint32_t dpll = port;
 
-       pipe_config->port_clock =
-               bxt_calc_pll_link(dev_priv, dpll);
+       pipe_config->port_clock = bxt_calc_pll_link(dev_priv, dpll);
 
-       if (pipe_config->has_dp_encoder)
-               pipe_config->base.adjusted_mode.crtc_clock =
-                       intel_dotclock_calculate(pipe_config->port_clock,
-                                                       &pipe_config->dp_m_n);
-       else
-               pipe_config->base.adjusted_mode.crtc_clock =
-                                                       pipe_config->port_clock;
+       ddi_dotclock_get(pipe_config);
 }
 
 void intel_ddi_clock_get(struct intel_encoder *encoder,