Pushed to dinq, thanks for reviews manasi On Fri, Oct 18, 2019 at 10:27:25AM -0700, Manasi Navare wrote: > 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. > > v5: > * Dont pass dev priv to get_slave_crtc (Ville) > v4: > * Obtain slave state from master (Maarten) > v3: > * Rebase > v2: > * Use the intel_old_crtc_state_disables() helper > > Cc: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > Cc: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> > Cc: Matt Roper <matthew.d.roper@xxxxxxxxx> > Cc: Jani Nikula <jani.nikula@xxxxxxxxx> > Signed-off-by: Manasi Navare <manasi.d.navare@xxxxxxxxx> > Reviewed-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_display.c | 58 ++++++++++++++++++-- > 1 file changed, 52 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > index 22f5b213b80b..b57c9806b585 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -14130,6 +14130,37 @@ static void intel_old_crtc_state_disables(struct intel_atomic_state *state, > new_crtc_state); > } > > +static void intel_trans_port_sync_modeset_disables(struct intel_atomic_state *state, > + struct intel_crtc *crtc, > + struct intel_crtc_state *old_crtc_state, > + struct intel_crtc_state *new_crtc_state) > +{ > + struct intel_crtc *slave_crtc = intel_get_slave_crtc(new_crtc_state); > + struct intel_crtc_state *new_slave_crtc_state = > + intel_atomic_get_new_crtc_state(state, slave_crtc); > + struct intel_crtc_state *old_slave_crtc_state = > + intel_atomic_get_old_crtc_state(state, slave_crtc); > + > + WARN_ON(!slave_crtc || !new_slave_crtc_state || > + !old_slave_crtc_state); > + > + /* Disable Slave first */ > + intel_pre_plane_update(old_slave_crtc_state, new_slave_crtc_state); > + if (old_slave_crtc_state->base.active) > + intel_old_crtc_state_disables(state, > + old_slave_crtc_state, > + new_slave_crtc_state, > + slave_crtc); > + > + /* Disable Master */ > + intel_pre_plane_update(old_crtc_state, new_crtc_state); > + if (old_crtc_state->base.active) > + intel_old_crtc_state_disables(state, > + old_crtc_state, > + new_crtc_state, > + crtc); > +} > + > static void intel_commit_modeset_disables(struct intel_atomic_state *state) > { > struct intel_crtc_state *new_crtc_state, *old_crtc_state; > @@ -14148,13 +14179,28 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state) > if (!needs_modeset(new_crtc_state)) > continue; > > - intel_pre_plane_update(old_crtc_state, new_crtc_state); > + /* In case of Transcoder port Sync master slave CRTCs can be > + * assigned in any order and we need to make sure that > + * slave CRTCs are disabled first and then master CRTC since > + * Slave vblanks are masked till Master Vblanks. > + */ > + if (is_trans_port_sync_mode(new_crtc_state)) { > + if (is_trans_port_sync_master(new_crtc_state)) > + intel_trans_port_sync_modeset_disables(state, > + crtc, > + old_crtc_state, > + new_crtc_state); > + else > + continue; > + } else { > + intel_pre_plane_update(old_crtc_state, new_crtc_state); > > - if (old_crtc_state->base.active) > - intel_old_crtc_state_disables(state, > - old_crtc_state, > - new_crtc_state, > - crtc); > + if (old_crtc_state->base.active) > + intel_old_crtc_state_disables(state, > + old_crtc_state, > + new_crtc_state, > + crtc); > + } > } > } > > -- > 2.19.1 > _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx