Message ID | 20191217135646.89481-1-jose.souza@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] drm/i915/display: Force the state compute phase once to enable PSR | expand |
On Tue, 17 Dec 2019, José Roberto de Souza <jose.souza@intel.com> 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 > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112253 > Reported-by: <s.zharkoff@gmail.com> > Cc: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com> > Signed-off-by: José Roberto de Souza <jose.souza@intel.com> > --- > 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 | 6 ++++++ > drivers/gpu/drm/i915/i915_drv.h | 1 + > 4 files changed, 33 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c b/drivers/gpu/drm/i915/display/intel_atomic.c > index fd0026fc3618..59be1d0c4f36 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..6348df32baed 100644 > --- a/drivers/gpu/drm/i915/display/intel_psr.h > +++ b/drivers/gpu/drm/i915/display/intel_psr.h > @@ -6,6 +6,9 @@ > #ifndef __INTEL_PSR_H__ > #define __INTEL_PSR_H__ > > +#include <drm/drm_atomic.h> > +#include <drm/drm_connector.h> > + Please use forward declarations instead of #includes when that's enough. BR, Jani. > #include "intel_frontbuffer.h" > > struct drm_i915_private; > @@ -35,5 +38,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 0781b6326b8c..873eec1e37e9 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)
diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c b/drivers/gpu/drm/i915/display/intel_atomic.c index fd0026fc3618..59be1d0c4f36 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..6348df32baed 100644 --- a/drivers/gpu/drm/i915/display/intel_psr.h +++ b/drivers/gpu/drm/i915/display/intel_psr.h @@ -6,6 +6,9 @@ #ifndef __INTEL_PSR_H__ #define __INTEL_PSR_H__ +#include <drm/drm_atomic.h> +#include <drm/drm_connector.h> + #include "intel_frontbuffer.h" struct drm_i915_private; @@ -35,5 +38,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 0781b6326b8c..873eec1e37e9 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)
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 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112253 Reported-by: <s.zharkoff@gmail.com> Cc: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com> Signed-off-by: José Roberto de Souza <jose.souza@intel.com> --- 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 | 6 ++++++ drivers/gpu/drm/i915/i915_drv.h | 1 + 4 files changed, 33 insertions(+)