|
@@ -5864,6 +5864,93 @@ static int intel_crtc_compute_config(struct intel_crtc *crtc,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int skylake_get_display_clock_speed(struct drm_device *dev)
|
|
|
+{
|
|
|
+ struct drm_i915_private *dev_priv = to_i915(dev);
|
|
|
+ uint32_t lcpll1 = I915_READ(LCPLL1_CTL);
|
|
|
+ uint32_t cdctl = I915_READ(CDCLK_CTL);
|
|
|
+ uint32_t linkrate;
|
|
|
+
|
|
|
+ if (!(lcpll1 & LCPLL_PLL_ENABLE)) {
|
|
|
+ WARN(1, "LCPLL1 not enabled\n");
|
|
|
+ return 24000; /* 24MHz is the cd freq with NSSC ref */
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((cdctl & CDCLK_FREQ_SEL_MASK) == CDCLK_FREQ_540)
|
|
|
+ return 540000;
|
|
|
+
|
|
|
+ linkrate = (I915_READ(DPLL_CTRL1) &
|
|
|
+ DPLL_CRTL1_LINK_RATE_MASK(SKL_DPLL0)) >> 1;
|
|
|
+
|
|
|
+ if (linkrate == DPLL_CRTL1_LINK_RATE_2160 ||
|
|
|
+ linkrate == DPLL_CRTL1_LINK_RATE_1080) {
|
|
|
+ /* vco 8640 */
|
|
|
+ switch (cdctl & CDCLK_FREQ_SEL_MASK) {
|
|
|
+ case CDCLK_FREQ_450_432:
|
|
|
+ return 432000;
|
|
|
+ case CDCLK_FREQ_337_308:
|
|
|
+ return 308570;
|
|
|
+ case CDCLK_FREQ_675_617:
|
|
|
+ return 617140;
|
|
|
+ default:
|
|
|
+ WARN(1, "Unknown cd freq selection\n");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /* vco 8100 */
|
|
|
+ switch (cdctl & CDCLK_FREQ_SEL_MASK) {
|
|
|
+ case CDCLK_FREQ_450_432:
|
|
|
+ return 450000;
|
|
|
+ case CDCLK_FREQ_337_308:
|
|
|
+ return 337500;
|
|
|
+ case CDCLK_FREQ_675_617:
|
|
|
+ return 675000;
|
|
|
+ default:
|
|
|
+ WARN(1, "Unknown cd freq selection\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* error case, do as if DPLL0 isn't enabled */
|
|
|
+ return 24000;
|
|
|
+}
|
|
|
+
|
|
|
+static int broadwell_get_display_clock_speed(struct drm_device *dev)
|
|
|
+{
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+ uint32_t lcpll = I915_READ(LCPLL_CTL);
|
|
|
+ uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
|
|
|
+
|
|
|
+ if (lcpll & LCPLL_CD_SOURCE_FCLK)
|
|
|
+ return 800000;
|
|
|
+ else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
|
|
|
+ return 450000;
|
|
|
+ else if (freq == LCPLL_CLK_FREQ_450)
|
|
|
+ return 450000;
|
|
|
+ else if (freq == LCPLL_CLK_FREQ_54O_BDW)
|
|
|
+ return 540000;
|
|
|
+ else if (freq == LCPLL_CLK_FREQ_337_5_BDW)
|
|
|
+ return 337500;
|
|
|
+ else
|
|
|
+ return 675000;
|
|
|
+}
|
|
|
+
|
|
|
+static int haswell_get_display_clock_speed(struct drm_device *dev)
|
|
|
+{
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+ uint32_t lcpll = I915_READ(LCPLL_CTL);
|
|
|
+ uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
|
|
|
+
|
|
|
+ if (lcpll & LCPLL_CD_SOURCE_FCLK)
|
|
|
+ return 800000;
|
|
|
+ else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
|
|
|
+ return 450000;
|
|
|
+ else if (freq == LCPLL_CLK_FREQ_450)
|
|
|
+ return 450000;
|
|
|
+ else if (IS_HSW_ULT(dev))
|
|
|
+ return 337500;
|
|
|
+ else
|
|
|
+ return 540000;
|
|
|
+}
|
|
|
+
|
|
|
static int valleyview_get_display_clock_speed(struct drm_device *dev)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
@@ -13500,7 +13587,16 @@ static void intel_init_display(struct drm_device *dev)
|
|
|
}
|
|
|
|
|
|
/* Returns the core display clock speed */
|
|
|
- if (IS_VALLEYVIEW(dev))
|
|
|
+ if (IS_SKYLAKE(dev))
|
|
|
+ dev_priv->display.get_display_clock_speed =
|
|
|
+ skylake_get_display_clock_speed;
|
|
|
+ else if (IS_BROADWELL(dev))
|
|
|
+ dev_priv->display.get_display_clock_speed =
|
|
|
+ broadwell_get_display_clock_speed;
|
|
|
+ else if (IS_HASWELL(dev))
|
|
|
+ dev_priv->display.get_display_clock_speed =
|
|
|
+ haswell_get_display_clock_speed;
|
|
|
+ else if (IS_VALLEYVIEW(dev))
|
|
|
dev_priv->display.get_display_clock_speed =
|
|
|
valleyview_get_display_clock_speed;
|
|
|
else if (IS_GEN5(dev))
|