aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
authorBob Paauwe <bob.j.paauwe@intel.com>2015-06-23 17:14:26 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-06-24 09:11:15 -0400
commitacd3f3d3516838ebe001b7048fe59ab5b93bb645 (patch)
tree36daff5b7372b7fe08ddc03f52e25b38404a9c8b /drivers/gpu/drm/i915/intel_display.c
parent9e759ff1f4a047c405034dfff1ee5c87abba41db (diff)
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: Bob Paauwe <bob.j.paauwe@intel.com> Signed-off-by: Matt Roper <matthew.d.roper@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 292d69e52cc5..cc68e4179a5a 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -6624,6 +6624,34 @@ static int skylake_get_display_clock_speed(struct drm_device *dev)
6624 return 24000; 6624 return 24000;
6625} 6625}
6626 6626
6627static int broxton_get_display_clock_speed(struct drm_device *dev)
6628{
6629 struct drm_i915_private *dev_priv = to_i915(dev);
6630 uint32_t cdctl = I915_READ(CDCLK_CTL);
6631 uint32_t pll_ratio = I915_READ(BXT_DE_PLL_CTL) & BXT_DE_PLL_RATIO_MASK;
6632 uint32_t pll_enab = I915_READ(BXT_DE_PLL_ENABLE);
6633 int cdclk;
6634
6635 if (!(pll_enab & BXT_DE_PLL_PLL_ENABLE))
6636 return 19200;
6637
6638 cdclk = 19200 * pll_ratio / 2;
6639
6640 switch (cdctl & BXT_CDCLK_CD2X_DIV_SEL_MASK) {
6641 case BXT_CDCLK_CD2X_DIV_SEL_1:
6642 return cdclk; /* 576MHz or 624MHz */
6643 case BXT_CDCLK_CD2X_DIV_SEL_1_5:
6644 return cdclk * 2 / 3; /* 384MHz */
6645 case BXT_CDCLK_CD2X_DIV_SEL_2:
6646 return cdclk / 2; /* 288MHz */
6647 case BXT_CDCLK_CD2X_DIV_SEL_4:
6648 return cdclk / 4; /* 144MHz */
6649 }
6650
6651 /* error case, do as if DE PLL isn't enabled */
6652 return 19200;
6653}
6654
6627static int broadwell_get_display_clock_speed(struct drm_device *dev) 6655static int broadwell_get_display_clock_speed(struct drm_device *dev)
6628{ 6656{
6629 struct drm_i915_private *dev_priv = dev->dev_private; 6657 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -14615,6 +14643,9 @@ static void intel_init_display(struct drm_device *dev)
14615 if (IS_SKYLAKE(dev)) 14643 if (IS_SKYLAKE(dev))
14616 dev_priv->display.get_display_clock_speed = 14644 dev_priv->display.get_display_clock_speed =
14617 skylake_get_display_clock_speed; 14645 skylake_get_display_clock_speed;
14646 else if (IS_BROXTON(dev))
14647 dev_priv->display.get_display_clock_speed =
14648 broxton_get_display_clock_speed;
14618 else if (IS_BROADWELL(dev)) 14649 else if (IS_BROADWELL(dev))
14619 dev_priv->display.get_display_clock_speed = 14650 dev_priv->display.get_display_clock_speed =
14620 broadwell_get_display_clock_speed; 14651 broadwell_get_display_clock_speed;