Commit acd3f3d3 authored by Bob Paauwe's avatar Bob Paauwe Committed by Daniel Vetter

drm/i915: Add the ddi get cdclk code for BXT (v3)

The registers and process differ from other platforms. If the hardware
was programmed incorrectly, this will return invalid cdclk values, which
should then cause reprogramming of the hardware.

v2(Matt): Return 19.2 MHz when DE PLL is disabled (Ville)
v3: Make less assumptions about the hardware state (Ville)

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: default avatarBob Paauwe <bob.j.paauwe@intel.com>
Signed-off-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 9e759ff1
...@@ -6624,6 +6624,34 @@ static int skylake_get_display_clock_speed(struct drm_device *dev) ...@@ -6624,6 +6624,34 @@ static int skylake_get_display_clock_speed(struct drm_device *dev)
return 24000; return 24000;
} }
static int broxton_get_display_clock_speed(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = to_i915(dev);
uint32_t cdctl = I915_READ(CDCLK_CTL);
uint32_t pll_ratio = I915_READ(BXT_DE_PLL_CTL) & BXT_DE_PLL_RATIO_MASK;
uint32_t pll_enab = I915_READ(BXT_DE_PLL_ENABLE);
int cdclk;
if (!(pll_enab & BXT_DE_PLL_PLL_ENABLE))
return 19200;
cdclk = 19200 * pll_ratio / 2;
switch (cdctl & BXT_CDCLK_CD2X_DIV_SEL_MASK) {
case BXT_CDCLK_CD2X_DIV_SEL_1:
return cdclk; /* 576MHz or 624MHz */
case BXT_CDCLK_CD2X_DIV_SEL_1_5:
return cdclk * 2 / 3; /* 384MHz */
case BXT_CDCLK_CD2X_DIV_SEL_2:
return cdclk / 2; /* 288MHz */
case BXT_CDCLK_CD2X_DIV_SEL_4:
return cdclk / 4; /* 144MHz */
}
/* error case, do as if DE PLL isn't enabled */
return 19200;
}
static int broadwell_get_display_clock_speed(struct drm_device *dev) static int broadwell_get_display_clock_speed(struct drm_device *dev)
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
...@@ -14615,6 +14643,9 @@ static void intel_init_display(struct drm_device *dev) ...@@ -14615,6 +14643,9 @@ static void intel_init_display(struct drm_device *dev)
if (IS_SKYLAKE(dev)) if (IS_SKYLAKE(dev))
dev_priv->display.get_display_clock_speed = dev_priv->display.get_display_clock_speed =
skylake_get_display_clock_speed; skylake_get_display_clock_speed;
else if (IS_BROXTON(dev))
dev_priv->display.get_display_clock_speed =
broxton_get_display_clock_speed;
else if (IS_BROADWELL(dev)) else if (IS_BROADWELL(dev))
dev_priv->display.get_display_clock_speed = dev_priv->display.get_display_clock_speed =
broadwell_get_display_clock_speed; broadwell_get_display_clock_speed;
......
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