瀏覽代碼

drm/i915: preserve SSC if previously set v3

Some machines may have a broken VBT or no VBT at all, but we still want
to use SSC there.  So check for it and keep it enabled if we see it
already on.  Based on an earlier fix from Kristian.

v2: honor modparam if set too (Daniel)
    read out at init time and store for panel_use_ssc() use (Jesse)
v3: trust BIOS configuration over VBT like we do for DP (Jani)

Reported-by: Kristian Høgsberg <hoegsberg@gmail.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Jesse Barnes 11 年之前
父節點
當前提交
92122789b2
共有 1 個文件被更改,包括 11 次插入0 次删除
  1. 11 0
      drivers/gpu/drm/i915/intel_display.c

+ 11 - 0
drivers/gpu/drm/i915/intel_display.c

@@ -13331,6 +13331,7 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
 
 
 void intel_modeset_gem_init(struct drm_device *dev)
 void intel_modeset_gem_init(struct drm_device *dev)
 {
 {
+	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct drm_crtc *c;
 	struct drm_crtc *c;
 	struct drm_i915_gem_object *obj;
 	struct drm_i915_gem_object *obj;
 
 
@@ -13338,6 +13339,16 @@ void intel_modeset_gem_init(struct drm_device *dev)
 	intel_init_gt_powersave(dev);
 	intel_init_gt_powersave(dev);
 	mutex_unlock(&dev->struct_mutex);
 	mutex_unlock(&dev->struct_mutex);
 
 
+	/*
+	 * There may be no VBT; and if the BIOS enabled SSC we can
+	 * just keep using it to avoid unnecessary flicker.  Whereas if the
+	 * BIOS isn't using it, don't assume it will work even if the VBT
+	 * indicates as much.
+	 */
+	if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev))
+		dev_priv->vbt.lvds_use_ssc = !!(I915_READ(PCH_DREF_CONTROL) &
+						DREF_SSC1_ENABLE);
+
 	intel_modeset_init_hw(dev);
 	intel_modeset_init_hw(dev);
 
 
 	intel_setup_overlay(dev);
 	intel_setup_overlay(dev);