drm/i915: Do not enable DRRS when PSR is enabled
authorRadhakrishna Sripada <radhakrishna.sripada@intel.com>
Thu, 14 Sep 2017 18:16:41 +0000 (11:16 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Mon, 18 Sep 2017 19:37:57 +0000 (12:37 -0700)
Some platforms do not support PSR and DRRS simultaneously.
Visual artifacts and flickering were reported on BDW HP Spectre
x360 Convertible. Deferring to PSR when both PSR and DRRS are
supported by the panel.

V2: Minor code-style changes suggested by Rodrigo
V3: Add a WARN_ON during PSR init suggested by Dhinakaran
    Correct debug message,title suggested by Jani

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101111
Cc: Nicholas Stommel <nicholas.stommel@gmail.com>
Cc: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Clinton Taylor <clinton.a.taylor@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Radhakrishna Sripada <radhakrishna.sripada@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20170914181641.24393-1-radhakrishna.sripada@intel.com
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_psr.c

index 887953c0f495df533c02b3cd457fab6d6912fc86..8db6b11f103f25201434106cf29371bd7e73baef 100644 (file)
@@ -5467,11 +5467,6 @@ static void intel_dp_set_drrs_state(struct drm_i915_private *dev_priv,
                return;
        }
 
-       /*
-        * FIXME: This needs proper synchronization with psr state for some
-        * platforms that cannot have PSR and DRRS enabled at the same time.
-        */
-
        dig_port = dp_to_dig_port(intel_dp);
        encoder = &dig_port->base;
        intel_crtc = to_intel_crtc(encoder->base.crtc);
@@ -5555,6 +5550,11 @@ void intel_edp_drrs_enable(struct intel_dp *intel_dp,
                return;
        }
 
+       if (dev_priv->psr.enabled) {
+               DRM_DEBUG_KMS("PSR enabled. Not enabling DRRS.\n");
+               return;
+       }
+
        mutex_lock(&dev_priv->drrs.mutex);
        if (WARN_ON(dev_priv->drrs.dp)) {
                DRM_ERROR("DRRS already enabled\n");
index 55b4002bbe53feb27a86894d4baaa09de17613c1..acb50945bfa83c4cdb13daf112b4573ffba15142 100644 (file)
@@ -530,6 +530,7 @@ void intel_psr_enable(struct intel_dp *intel_dp,
                return;
        }
 
+       WARN_ON(dev_priv->drrs.dp);
        mutex_lock(&dev_priv->psr.lock);
        if (dev_priv->psr.enabled) {
                DRM_DEBUG_KMS("PSR already in use\n");