On Mon, 2020-01-06 at 07:21 -0800, José Roberto de Souza wrote: > Recent improvements in the state tracking in i915 caused PSR to not > be > enabled when reusing firmware/BIOS modeset, this is due to all > initial > commits returning ealier in intel_atomic_check() as needs_modeset() > is always false. > > To fix that here forcing the state compute phase in CRTC that is > driving the eDP that supports PSR once. Enable or disable PSR do not > require a fullmodeset, so user will still experience glitch free boot > process plus the power savings that PSR brings. > > It was tried to set mode_changed in intel_initial_commit() but at > this point the connectors are not registered causing a crash when > computing encoder state. > > v2: > - removed function return > - change arguments to match intel_hdcp_atomic_check > > v3: > - replaced drm includes in intel_psr.h by forward declaration(Jani) > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112253 > Reported-by: <s.zharkoff@xxxxxxxxx> > Cc: Gwan-gyeong Mun <gwan-gyeong.mun@xxxxxxxxx> > Cc: Jani Nikula <jani.nikula@xxxxxxxxx> > Signed-off-by: José Roberto de Souza <jose.souza@xxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_atomic.c | 2 ++ > drivers/gpu/drm/i915/display/intel_psr.c | 24 > +++++++++++++++++++++ > drivers/gpu/drm/i915/display/intel_psr.h | 5 +++++ > drivers/gpu/drm/i915/i915_drv.h | 1 + > 4 files changed, 32 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c > b/drivers/gpu/drm/i915/display/intel_atomic.c > index 0eb973f65977..c362eecdd414 100644 > --- a/drivers/gpu/drm/i915/display/intel_atomic.c > +++ b/drivers/gpu/drm/i915/display/intel_atomic.c > @@ -37,6 +37,7 @@ > #include "intel_atomic.h" > #include "intel_display_types.h" > #include "intel_hdcp.h" > +#include "intel_psr.h" > #include "intel_sprite.h" > > /** > @@ -129,6 +130,7 @@ int intel_digital_connector_atomic_check(struct > drm_connector *conn, > struct drm_crtc_state *crtc_state; > > intel_hdcp_atomic_check(conn, old_state, new_state); > + intel_psr_atomic_check(conn, old_state, new_state); > > if (!new_state->crtc) > return 0; > diff --git a/drivers/gpu/drm/i915/display/intel_psr.c > b/drivers/gpu/drm/i915/display/intel_psr.c > index 16e9ff47d519..e3fd5f1e2d21 100644 > --- a/drivers/gpu/drm/i915/display/intel_psr.c > +++ b/drivers/gpu/drm/i915/display/intel_psr.c > @@ -1523,3 +1523,27 @@ bool intel_psr_enabled(struct intel_dp > *intel_dp) > > return ret; > } > + > +void intel_psr_atomic_check(struct drm_connector *connector, > + struct drm_connector_state *old_state, > + struct drm_connector_state *new_state) > +{ > + struct drm_i915_private *dev_priv = to_i915(connector->dev); > + struct intel_connector *intel_connector; > + struct intel_digital_port *dig_port; > + struct drm_crtc_state *crtc_state; > + > + if (!CAN_PSR(dev_priv) || !new_state->crtc || > + dev_priv->psr.initially_probed) > + return; > + > + intel_connector = to_intel_connector(connector); > + dig_port = enc_to_dig_port(&intel_connector->encoder->base); > + if (dev_priv->psr.dp != &dig_port->dp) > + return; > + > + crtc_state = drm_atomic_get_new_crtc_state(new_state->state, > + new_state->crtc); > + crtc_state->mode_changed = true; > + dev_priv->psr.initially_probed = true; > +} > diff --git a/drivers/gpu/drm/i915/display/intel_psr.h > b/drivers/gpu/drm/i915/display/intel_psr.h > index 46e4de8b8cd5..c58a1d438808 100644 > --- a/drivers/gpu/drm/i915/display/intel_psr.h > +++ b/drivers/gpu/drm/i915/display/intel_psr.h > @@ -8,6 +8,8 @@ > > #include "intel_frontbuffer.h" > > +struct drm_connector; > +struct drm_connector_state; > struct drm_i915_private; > struct intel_crtc_state; > struct intel_dp; > @@ -35,5 +37,8 @@ void intel_psr_short_pulse(struct intel_dp > *intel_dp); > int intel_psr_wait_for_idle(const struct intel_crtc_state > *new_crtc_state, > u32 *out_value); > bool intel_psr_enabled(struct intel_dp *intel_dp); > +void intel_psr_atomic_check(struct drm_connector *connector, > + struct drm_connector_state *old_state, > + struct drm_connector_state *new_state); > > #endif /* __INTEL_PSR_H__ */ > diff --git a/drivers/gpu/drm/i915/i915_drv.h > b/drivers/gpu/drm/i915/i915_drv.h > index 50181113dd2b..1025d783f494 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -505,6 +505,7 @@ struct i915_psr { > bool dc3co_enabled; > u32 dc3co_exit_delay; > struct delayed_work idle_work; > + bool initially_probed; > }; > > #define QUIRK_LVDS_SSC_DISABLE (1<<1) Looks good to me. Reviewed-by: Gwan-gyeong Mun <gwan-gyeong.mun@xxxxxxxxx> _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx