On Fri, Nov 10, 2017 at 12:34:59PM +0100, Maarten Lankhorst wrote: > IPS can only be enabled if the primary plane is visible, so > first make sure sw state matches hw state by waiting for hw_done. > > After this pass crtc_state to intel_dp_sink_crc() so that can be used, > instead of using legacy pointers. > > Signed-off-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_debugfs.c | 17 +++++++++++++++-- > drivers/gpu/drm/i915/intel_dp.c | 23 +++++++++++++---------- > drivers/gpu/drm/i915/intel_drv.h | 3 ++- > 3 files changed, 30 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c > index 7e8f40eb970d..31db026494e0 100644 > --- a/drivers/gpu/drm/i915/i915_debugfs.c > +++ b/drivers/gpu/drm/i915/i915_debugfs.c > @@ -2747,6 +2747,7 @@ static int i915_sink_crc(struct seq_file *m, void *data) > for_each_intel_connector_iter(connector, &conn_iter) { > struct drm_crtc *crtc; > struct drm_connector_state *state; > + struct intel_crtc_state *crtc_state; > > if (connector->base.connector_type != DRM_MODE_CONNECTOR_eDP) > continue; > @@ -2765,12 +2766,24 @@ static int i915_sink_crc(struct seq_file *m, void *data) > if (ret) > goto err; > > - if (!crtc->state->active) > + crtc_state = to_intel_crtc_state(crtc->state); We're under modeset_lock_all() so we can do this safely. > + if (!crtc_state->base.active) > continue; > > + /* > + * We need to wait for all crtc updates to complete, to make > + * sure any pending modesets and plane updates are completed. > + */ > + if (crtc_state->base.commit) { > + ret = wait_for_completion_interruptible(&crtc_state->base.commit->hw_done); I guess it would be nice if we could actually keep grabbing crcs across a longer period instead of just one frame. But we can't do that with the current uapi for thos. Given that constraint this seems like the right solution. Reviewed-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > + > + if (ret) > + goto err; > + } > + > intel_dp = enc_to_intel_dp(state->best_encoder); > > - ret = intel_dp_sink_crc(intel_dp, crc); > + ret = intel_dp_sink_crc(intel_dp, crtc_state, crc); > if (ret) > goto err; > > diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c > index cddd96b24878..abef0392abb9 100644 > --- a/drivers/gpu/drm/i915/intel_dp.c > +++ b/drivers/gpu/drm/i915/intel_dp.c > @@ -3907,11 +3907,12 @@ intel_dp_configure_mst(struct intel_dp *intel_dp) > intel_dp->is_mst); > } > > -static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp) > +static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp, > + struct intel_crtc_state *crtc_state, bool disable_wa) > { > struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); > - struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc); > + struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc); > u8 buf; > int ret = 0; > int count = 0; > @@ -3947,15 +3948,17 @@ static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp) > } > > out: > - hsw_enable_ips(intel_crtc); > + if (disable_wa) > + hsw_enable_ips(intel_crtc); > return ret; > } > > -static int intel_dp_sink_crc_start(struct intel_dp *intel_dp) > +static int intel_dp_sink_crc_start(struct intel_dp *intel_dp, > + struct intel_crtc_state *crtc_state) > { > struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); > - struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc); > + struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc); > u8 buf; > int ret; > > @@ -3969,7 +3972,7 @@ static int intel_dp_sink_crc_start(struct intel_dp *intel_dp) > return -EIO; > > if (buf & DP_TEST_SINK_START) { > - ret = intel_dp_sink_crc_stop(intel_dp); > + ret = intel_dp_sink_crc_stop(intel_dp, crtc_state, false); > if (ret) > return ret; > } > @@ -3986,16 +3989,16 @@ static int intel_dp_sink_crc_start(struct intel_dp *intel_dp) > return 0; > } > > -int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc) > +int intel_dp_sink_crc(struct intel_dp *intel_dp, struct intel_crtc_state *crtc_state, u8 *crc) > { > struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); > struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); > - struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc); > + struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc); > u8 buf; > int count, ret; > int attempts = 6; > > - ret = intel_dp_sink_crc_start(intel_dp); > + ret = intel_dp_sink_crc_start(intel_dp, crtc_state); > if (ret) > return ret; > > @@ -4023,7 +4026,7 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc) > } > > stop: > - intel_dp_sink_crc_stop(intel_dp); > + intel_dp_sink_crc_stop(intel_dp, crtc_state, true); > return ret; > } > > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h > index 00b488688042..6abe52161437 100644 > --- a/drivers/gpu/drm/i915/intel_drv.h > +++ b/drivers/gpu/drm/i915/intel_drv.h > @@ -1534,7 +1534,8 @@ void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode); > void intel_dp_encoder_reset(struct drm_encoder *encoder); > void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder); > void intel_dp_encoder_destroy(struct drm_encoder *encoder); > -int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc); > +int intel_dp_sink_crc(struct intel_dp *intel_dp, > + struct intel_crtc_state *crtc_state, u8 *crc); > bool intel_dp_compute_config(struct intel_encoder *encoder, > struct intel_crtc_state *pipe_config, > struct drm_connector_state *conn_state); > -- > 2.15.0 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Ville Syrjälä Intel OTC _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx