|
@@ -5747,6 +5747,21 @@ static int valleyview_get_vco(struct drm_i915_private *dev_priv)
|
|
|
return vco_freq[hpll_freq] * 1000;
|
|
|
}
|
|
|
|
|
|
+static void intel_update_max_cdclk(struct drm_device *dev)
|
|
|
+{
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+
|
|
|
+ if (IS_VALLEYVIEW(dev)) {
|
|
|
+ dev_priv->max_cdclk_freq = 400000;
|
|
|
+ } else {
|
|
|
+ /* otherwise assume cdclk is fixed */
|
|
|
+ dev_priv->max_cdclk_freq = dev_priv->cdclk_freq;
|
|
|
+ }
|
|
|
+
|
|
|
+ DRM_DEBUG_DRIVER("Max CD clock rate: %d kHz\n",
|
|
|
+ dev_priv->max_cdclk_freq);
|
|
|
+}
|
|
|
+
|
|
|
static void intel_update_cdclk(struct drm_device *dev)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
@@ -5768,6 +5783,9 @@ static void intel_update_cdclk(struct drm_device *dev)
|
|
|
*/
|
|
|
I915_WRITE(GMBUSFREQ_VLV, DIV_ROUND_UP(dev_priv->cdclk_freq, 1000));
|
|
|
}
|
|
|
+
|
|
|
+ if (dev_priv->max_cdclk_freq == 0)
|
|
|
+ intel_update_max_cdclk(dev);
|
|
|
}
|
|
|
|
|
|
/* Adjust CDclk dividers to allow high res or save power if possible */
|
|
@@ -6610,7 +6628,7 @@ static int intel_crtc_compute_config(struct intel_crtc *crtc,
|
|
|
|
|
|
/* FIXME should check pixel clock limits on all platforms */
|
|
|
if (INTEL_INFO(dev)->gen < 4) {
|
|
|
- int clock_limit = dev_priv->cdclk_freq;
|
|
|
+ int clock_limit = dev_priv->max_cdclk_freq;
|
|
|
|
|
|
/*
|
|
|
* Enable pixel doubling when the dot clock
|