On Tue, 17 Dec 2019, José Roberto de Souza <[email protected]> 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: <[email protected]>
> Cc: Gwan-gyeong Mun <[email protected]>
> Signed-off-by: José Roberto de Souza <[email protected]>
> ---
>  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)

-- 
Jani Nikula, Intel Open Source Graphics Center
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to