drm/i915/bxt: Determine programmed frequency
authorSatheeshakrishna M <satheeshakrishna.m@intel.com>
Fri, 22 Aug 2014 04:19:12 +0000 (09:49 +0530)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 16 Apr 2015 09:42:37 +0000 (11:42 +0200)
Add placeholder function for calculating programmed pixel clock.
Note: Formula to back calculate link clock from dividers not
available currently.

v2:
- rebased on upstream s/crtc_config/crtc_state/ change (imre)

Signed-off-by: Satheeshakrishna M <satheeshakrishna.m@intel.com> (v1)
Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_ddi.c
drivers/gpu/drm/i915/intel_dp.c

index 404cef0536882e5085571320bc35e5798195e3c1..f9f55bc05e7d82f4fcd6ede49315d206455a94ec 100644 (file)
@@ -880,6 +880,32 @@ static void hsw_ddi_clock_get(struct intel_encoder *encoder,
                pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
 }
 
+static int bxt_calc_pll_link(struct drm_i915_private *dev_priv,
+                               enum intel_dpll_id dpll)
+{
+       /* FIXME formula not available in bspec */
+       return 0;
+}
+
+static void bxt_ddi_clock_get(struct intel_encoder *encoder,
+                               struct intel_crtc_state *pipe_config)
+{
+       struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
+       enum port port = intel_ddi_get_encoder_port(encoder);
+       uint32_t dpll = port;
+
+       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;
+}
+
 void intel_ddi_clock_get(struct intel_encoder *encoder,
                         struct intel_crtc_state *pipe_config)
 {
@@ -887,8 +913,10 @@ void intel_ddi_clock_get(struct intel_encoder *encoder,
 
        if (INTEL_INFO(dev)->gen <= 8)
                hsw_ddi_clock_get(encoder, pipe_config);
-       else
+       else if (IS_SKYLAKE(dev))
                skl_ddi_clock_get(encoder, pipe_config);
+       else if (IS_BROXTON(dev))
+               bxt_ddi_clock_get(encoder, pipe_config);
 }
 
 static void
index 3ea68e164873a584cc49f2a249382afc38c6e07d..550ac9be1f58eacf8c426678040539f4ecdd0b38 100644 (file)
@@ -1471,6 +1471,8 @@ found:
 
        if (IS_SKYLAKE(dev) && is_edp(intel_dp))
                skl_edp_set_pll_config(pipe_config, common_rates[clock]);
+       else if (IS_BROXTON(dev))
+               /* handled in ddi */;
        else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
                hsw_dp_set_ddi_pll_sel(pipe_config, intel_dp->link_bw);
        else