In the transcoder port sync mode, the slave transcoders mask their vblanks
until master transcoder's vblank so while disabling them, make
sure slaves are disabled first and then the masters.

v2:
* Use the intel_old_crtc_state_disables() helper

Cc: Ville Syrjälä <ville.syrj...@linux.intel.com>
Cc: Maarten Lankhorst <maarten.lankho...@linux.intel.com>
Cc: Matt Roper <matthew.d.ro...@intel.com>
Cc: Jani Nikula <jani.nik...@intel.com>
Signed-off-by: Manasi Navare <manasi.d.nav...@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c | 68 ++++++++++++++++++--
 1 file changed, 62 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 3ccba539cce0..e244d9cb4e33 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -13912,6 +13912,57 @@ static void intel_commit_modeset_disables(struct 
drm_atomic_state *state)
        }
 }
 
+static void icl_commit_modeset_disables(struct drm_atomic_state *state)
+{
+       struct drm_crtc_state *old_crtc_state, *new_crtc_state;
+       struct intel_crtc_state *new_intel_crtc_state, *old_intel_crtc_state;
+       struct drm_crtc *crtc;
+       struct intel_crtc *intel_crtc;
+       int i;
+
+       /*
+        * Disable all the Port Sync Slaves first
+        */
+       for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, 
new_crtc_state, i) {
+               old_intel_crtc_state = to_intel_crtc_state(old_crtc_state);
+               new_intel_crtc_state = to_intel_crtc_state(new_crtc_state);
+               intel_crtc = to_intel_crtc(crtc);
+
+               if (!needs_modeset(new_crtc_state) ||
+                   !is_trans_port_sync_slave(old_intel_crtc_state))
+                       continue;
+
+               intel_pre_plane_update(old_intel_crtc_state, 
new_intel_crtc_state);
+
+               if (old_crtc_state->active)
+                       intel_old_crtc_state_disables(state,
+                                                     old_intel_crtc_state,
+                                                     new_intel_crtc_state,
+                                                     intel_crtc);
+       }
+
+       /*
+        * Disable rest of the CRTCs other than slaves
+        */
+       for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, 
new_crtc_state, i) {
+               old_intel_crtc_state = to_intel_crtc_state(old_crtc_state);
+               new_intel_crtc_state = to_intel_crtc_state(new_crtc_state);
+               intel_crtc = to_intel_crtc(crtc);
+
+               if (!needs_modeset(new_crtc_state) ||
+                   is_trans_port_sync_slave(old_intel_crtc_state))
+                       continue;
+
+               intel_pre_plane_update(old_intel_crtc_state, 
new_intel_crtc_state);
+
+               if (old_crtc_state->active)
+                       intel_old_crtc_state_disables(state,
+                                                     old_intel_crtc_state,
+                                                     new_intel_crtc_state,
+                                                     intel_crtc);
+       }
+}
+
 static void intel_commit_modeset_enables(struct drm_atomic_state *state)
 {
        struct drm_crtc *crtc;
@@ -14268,6 +14319,11 @@ static void intel_atomic_commit_tail(struct 
drm_atomic_state *state)
 
        intel_atomic_commit_fence_wait(intel_state);
 
+       drm_atomic_helper_wait_for_dependencies(state);
+
+       if (intel_state->modeset)
+               wakeref = intel_display_power_get(dev_priv, 
POWER_DOMAIN_MODESET);
+
        for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, 
new_crtc_state, i) {
                new_intel_crtc_state = to_intel_crtc_state(new_crtc_state);
                intel_crtc = to_intel_crtc(crtc);
@@ -14280,11 +14336,6 @@ static void intel_atomic_commit_tail(struct 
drm_atomic_state *state)
                }
        }
 
-       drm_atomic_helper_wait_for_dependencies(state);
-
-       if (intel_state->modeset)
-               wakeref = intel_display_power_get(dev_priv, 
POWER_DOMAIN_MODESET);
-
        dev_priv->display.commit_modeset_disables(state);
 
        /* FIXME: Eventually get rid of our intel_crtc->config pointer */
@@ -16181,7 +16232,12 @@ void intel_init_display_hooks(struct drm_i915_private 
*dev_priv)
        else
                dev_priv->display.commit_modeset_enables = 
intel_commit_modeset_enables;
 
-       dev_priv->display.commit_modeset_disables = 
intel_commit_modeset_disables;
+       if (INTEL_GEN(dev_priv) >= 11)
+               dev_priv->display.commit_modeset_disables =
+                       icl_commit_modeset_disables;
+       else
+               dev_priv->display.commit_modeset_disables =
+                       intel_commit_modeset_disables;
 
 }
 
-- 
2.19.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to