Message ID | 20191018172725.1338-6-manasi.d.navare@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [CI,v12,1/6] drm/i915/display/icl: Save Master transcoder in slave's crtc_state for Transcoder Port Sync | expand |
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@linux.intel.com> > Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> > Cc: Matt Roper <matthew.d.roper@intel.com> > Cc: Jani Nikula <jani.nikula@intel.com> > Signed-off-by: Manasi Navare <manasi.d.navare@intel.com> > Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> > --- > 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 >
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); + } } }