Re: [Intel-gfx] [PATCH v4] drm/i915/psr: Force PSR probe only after full initialization

2020-02-21 Thread Mun, Gwan-gyeong
On Fri, 2020-02-21 at 12:11 -0800, Souza, Jose wrote:
> On Fri, 2020-02-21 at 20:04 +, Mun, Gwan-gyeong wrote:
> > On Thu, 2020-02-20 at 15:15 -0800, José Roberto de Souza wrote:
> > > Commit 60c6a14b489b ("drm/i915/display: Force the state compute
> > > phase
> > > once to enable PSR") was forcing the state compute too earlier
> > > causing errors because not everything was initialized, so here
> > > moving to the end of i915_driver_modeset_probe() when the display
> > > is
> > > all initialized.
> > > 
> > > Also fixing the place where it disarm the force probe as during
> > > the
> > > atomic check phase errors could happen like the ones due locking
> > > and
> > > it would cause PSR to never be enabled if that happens.
> > > Leaving the disarm to the atomic commit phase, intel_psr_enable()
> > > or
> > > intel_psr_update() will be called even if the current state do
> > > not
> > > allow PSR to be enabled.
> > > 
> > > v2: Check if intel_dp is null in
> > > intel_psr_force_mode_changed_set()
> > > v3: Check intel_dp before get dev_priv
> > > v4:
> > > - renamed intel_psr_force_mode_changed_set() to
> > > intel_psr_set_force_mode_changed()
> > > - removed the set parameter from
> > > intel_psr_set_force_mode_changed()
> > > - not calling intel_psr_set_force_mode_changed() from
> > > intel_psr_enable/update(), directly setting it after the same
> > > checks
> > > that intel_psr_set_force_mode_changed() does
> > > - moved intel_psr_set_force_mode_changed() arm call to
> > > i915_driver_modeset_probe() as it is a better for a PSR call, all
> > > the
> > > functions calls happening between the old and the new function
> > > call
> > > will cause issue
> > > 
> > > Fixes: 60c6a14b489b ("drm/i915/display: Force the state compute
> > > phase
> > > once to enable PSR")
> > > Closes: https://gitlab.freedesktop.org/drm/intel/issues/1151
> > > Tested-by: Ross Zwisler 
> > > Reported-by: Ross Zwisler 
> > > Cc: Gwan-gyeong Mun 
> > > Cc: Jani Nikula 
> > > Cc: Anshuman Gupta 
> > > Signed-off-by: José Roberto de Souza 
> > > ---
> > >  drivers/gpu/drm/i915/display/intel_psr.c | 25
> > > 
> > > 
> > >  drivers/gpu/drm/i915/display/intel_psr.h |  1 +
> > >  drivers/gpu/drm/i915/i915_drv.c  |  3 +++
> > >  drivers/gpu/drm/i915/i915_drv.h  |  2 +-
> > >  4 files changed, 26 insertions(+), 5 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/i915/display/intel_psr.c
> > > b/drivers/gpu/drm/i915/display/intel_psr.c
> > > index b4942b6445ae..7e754201f54d 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_psr.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> > > @@ -936,10 +936,12 @@ void intel_psr_enable(struct intel_dp
> > > *intel_dp,
> > >  {
> > >   struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
> > >  
> > > - if (!crtc_state->has_psr)
> > Enabling of crtc_state->has_psr is handled on
> > intel_psr_compute_config().
> > And the intel_psr_compute_config() checks "CAN_PSR(dev_priv) and
> > intel_dp != dev_priv->psr.dp".
> > therefore if we have this line "if (!crtc_state->has_psr)", we
> > don't
> > need to add "if (!CAN_PSR(dev_priv) || dev_priv->psr.dp !=
> > intel_dp)"
> 
> crtc_state->has_psr will only be set to true if the state allows, we
> don't want to keep computing pipe configuration for every following
> page flip if PSR can not be enable(like PSR setup time do not fit in
> vblank).
> 
Yes, you are right. we also have to handle the case which can not
support PSR. (I missed those cases.)

> That is why it is unseting force_mode_changed even if crtc_state-
> > has_psr is false.
> > Except that, looks good to me.
> > 
> > Reviewed-by: Gwan-gyeong Mun 
> > 
> > > + if (!CAN_PSR(dev_priv) || dev_priv->psr.dp != intel_dp)
> > >   return;
> > >  
> > > - if (drm_WARN_ON(_priv->drm, !CAN_PSR(dev_priv)))
> > > + dev_priv->psr.force_mode_changed = false;
> > > +
> > > + if (!crtc_state->has_psr)
> > >   return;
> > >  
> > >   drm_WARN_ON(_priv->drm, dev_priv->drrs.dp);
> > > @@ -1099,6 +1101,8 @@ void intel_psr_update(struct intel_dp
> > > *intel_dp,
> > >   if (!CAN_PSR(dev_priv) || READ_ONCE(psr->dp) != intel_dp)
> > >   return;
> > >  
> > > + dev_priv->psr.force_mode_changed = false;
> > > +
> > >   mutex_lock(_priv->psr.lock);
> > >  
> > >   enable = crtc_state->has_psr && psr_global_enabled(dev_priv);
> > > @@ -1629,7 +1633,7 @@ void intel_psr_atomic_check(struct
> > > drm_connector *connector,
> > >   struct drm_crtc_state *crtc_state;
> > >  
> > >   if (!CAN_PSR(dev_priv) || !new_state->crtc ||
> > > - dev_priv->psr.initially_probed)
> > > + !dev_priv->psr.force_mode_changed)
> > >   return;
> > >  
> > >   intel_connector = to_intel_connector(connector);
> > > @@ -1640,5 +1644,18 @@ void intel_psr_atomic_check(struct
> > > drm_connector *connector,
> > >   crtc_state = drm_atomic_get_new_crtc_state(new_state->state,
> > >  new_state->crtc);
> > >   

Re: [Intel-gfx] [PATCH v4] drm/i915/psr: Force PSR probe only after full initialization

2020-02-21 Thread Souza, Jose
On Fri, 2020-02-21 at 20:04 +, Mun, Gwan-gyeong wrote:
> On Thu, 2020-02-20 at 15:15 -0800, José Roberto de Souza wrote:
> > Commit 60c6a14b489b ("drm/i915/display: Force the state compute
> > phase
> > once to enable PSR") was forcing the state compute too earlier
> > causing errors because not everything was initialized, so here
> > moving to the end of i915_driver_modeset_probe() when the display
> > is
> > all initialized.
> > 
> > Also fixing the place where it disarm the force probe as during the
> > atomic check phase errors could happen like the ones due locking
> > and
> > it would cause PSR to never be enabled if that happens.
> > Leaving the disarm to the atomic commit phase, intel_psr_enable()
> > or
> > intel_psr_update() will be called even if the current state do not
> > allow PSR to be enabled.
> > 
> > v2: Check if intel_dp is null in intel_psr_force_mode_changed_set()
> > v3: Check intel_dp before get dev_priv
> > v4:
> > - renamed intel_psr_force_mode_changed_set() to
> > intel_psr_set_force_mode_changed()
> > - removed the set parameter from intel_psr_set_force_mode_changed()
> > - not calling intel_psr_set_force_mode_changed() from
> > intel_psr_enable/update(), directly setting it after the same
> > checks
> > that intel_psr_set_force_mode_changed() does
> > - moved intel_psr_set_force_mode_changed() arm call to
> > i915_driver_modeset_probe() as it is a better for a PSR call, all
> > the
> > functions calls happening between the old and the new function call
> > will cause issue
> > 
> > Fixes: 60c6a14b489b ("drm/i915/display: Force the state compute
> > phase
> > once to enable PSR")
> > Closes: https://gitlab.freedesktop.org/drm/intel/issues/1151
> > Tested-by: Ross Zwisler 
> > Reported-by: Ross Zwisler 
> > Cc: Gwan-gyeong Mun 
> > Cc: Jani Nikula 
> > Cc: Anshuman Gupta 
> > Signed-off-by: José Roberto de Souza 
> > ---
> >  drivers/gpu/drm/i915/display/intel_psr.c | 25 
> > 
> >  drivers/gpu/drm/i915/display/intel_psr.h |  1 +
> >  drivers/gpu/drm/i915/i915_drv.c  |  3 +++
> >  drivers/gpu/drm/i915/i915_drv.h  |  2 +-
> >  4 files changed, 26 insertions(+), 5 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_psr.c
> > b/drivers/gpu/drm/i915/display/intel_psr.c
> > index b4942b6445ae..7e754201f54d 100644
> > --- a/drivers/gpu/drm/i915/display/intel_psr.c
> > +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> > @@ -936,10 +936,12 @@ void intel_psr_enable(struct intel_dp
> > *intel_dp,
> >  {
> > struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
> >  
> > -   if (!crtc_state->has_psr)
> Enabling of crtc_state->has_psr is handled on
> intel_psr_compute_config().
> And the intel_psr_compute_config() checks "CAN_PSR(dev_priv) and
> intel_dp != dev_priv->psr.dp".
> therefore if we have this line "if (!crtc_state->has_psr)", we don't
> need to add "if (!CAN_PSR(dev_priv) || dev_priv->psr.dp != intel_dp)"

crtc_state->has_psr will only be set to true if the state allows, we
don't want to keep computing pipe configuration for every following
page flip if PSR can not be enable(like PSR setup time do not fit in
vblank).

That is why it is unseting force_mode_changed even if crtc_state-
>has_psr is false.

> 
> Except that, looks good to me.
> 
> Reviewed-by: Gwan-gyeong Mun 
> 
> > +   if (!CAN_PSR(dev_priv) || dev_priv->psr.dp != intel_dp)
> > return;
> >  
> > -   if (drm_WARN_ON(_priv->drm, !CAN_PSR(dev_priv)))
> > +   dev_priv->psr.force_mode_changed = false;
> > +
> > +   if (!crtc_state->has_psr)
> > return;
> >  
> > drm_WARN_ON(_priv->drm, dev_priv->drrs.dp);
> > @@ -1099,6 +1101,8 @@ void intel_psr_update(struct intel_dp
> > *intel_dp,
> > if (!CAN_PSR(dev_priv) || READ_ONCE(psr->dp) != intel_dp)
> > return;
> >  
> > +   dev_priv->psr.force_mode_changed = false;
> > +
> > mutex_lock(_priv->psr.lock);
> >  
> > enable = crtc_state->has_psr && psr_global_enabled(dev_priv);
> > @@ -1629,7 +1633,7 @@ void intel_psr_atomic_check(struct
> > drm_connector *connector,
> > struct drm_crtc_state *crtc_state;
> >  
> > if (!CAN_PSR(dev_priv) || !new_state->crtc ||
> > -   dev_priv->psr.initially_probed)
> > +   !dev_priv->psr.force_mode_changed)
> > return;
> >  
> > intel_connector = to_intel_connector(connector);
> > @@ -1640,5 +1644,18 @@ void intel_psr_atomic_check(struct
> > drm_connector *connector,
> > 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;
> > +}
> > +
> > +void intel_psr_set_force_mode_changed(struct intel_dp *intel_dp)
> > +{
> > +   struct drm_i915_private *dev_priv;
> > +
> > +   if (!intel_dp)
> > +   return;
> > +
> > +   dev_priv = dp_to_i915(intel_dp);
> > +   if (!CAN_PSR(dev_priv) || intel_dp != dev_priv->psr.dp)
> > +   

Re: [Intel-gfx] [PATCH v4] drm/i915/psr: Force PSR probe only after full initialization

2020-02-21 Thread Mun, Gwan-gyeong
On Thu, 2020-02-20 at 15:15 -0800, José Roberto de Souza wrote:
> Commit 60c6a14b489b ("drm/i915/display: Force the state compute phase
> once to enable PSR") was forcing the state compute too earlier
> causing errors because not everything was initialized, so here
> moving to the end of i915_driver_modeset_probe() when the display is
> all initialized.
> 
> Also fixing the place where it disarm the force probe as during the
> atomic check phase errors could happen like the ones due locking and
> it would cause PSR to never be enabled if that happens.
> Leaving the disarm to the atomic commit phase, intel_psr_enable() or
> intel_psr_update() will be called even if the current state do not
> allow PSR to be enabled.
> 
> v2: Check if intel_dp is null in intel_psr_force_mode_changed_set()
> v3: Check intel_dp before get dev_priv
> v4:
> - renamed intel_psr_force_mode_changed_set() to
> intel_psr_set_force_mode_changed()
> - removed the set parameter from intel_psr_set_force_mode_changed()
> - not calling intel_psr_set_force_mode_changed() from
> intel_psr_enable/update(), directly setting it after the same checks
> that intel_psr_set_force_mode_changed() does
> - moved intel_psr_set_force_mode_changed() arm call to
> i915_driver_modeset_probe() as it is a better for a PSR call, all the
> functions calls happening between the old and the new function call
> will cause issue
> 
> Fixes: 60c6a14b489b ("drm/i915/display: Force the state compute phase
> once to enable PSR")
> Closes: https://gitlab.freedesktop.org/drm/intel/issues/1151
> Tested-by: Ross Zwisler 
> Reported-by: Ross Zwisler 
> Cc: Gwan-gyeong Mun 
> Cc: Jani Nikula 
> Cc: Anshuman Gupta 
> Signed-off-by: José Roberto de Souza 
> ---
>  drivers/gpu/drm/i915/display/intel_psr.c | 25 
> 
>  drivers/gpu/drm/i915/display/intel_psr.h |  1 +
>  drivers/gpu/drm/i915/i915_drv.c  |  3 +++
>  drivers/gpu/drm/i915/i915_drv.h  |  2 +-
>  4 files changed, 26 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_psr.c
> b/drivers/gpu/drm/i915/display/intel_psr.c
> index b4942b6445ae..7e754201f54d 100644
> --- a/drivers/gpu/drm/i915/display/intel_psr.c
> +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> @@ -936,10 +936,12 @@ void intel_psr_enable(struct intel_dp
> *intel_dp,
>  {
>   struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
>  
> - if (!crtc_state->has_psr)
Enabling of crtc_state->has_psr is handled on
intel_psr_compute_config().
And the intel_psr_compute_config() checks "CAN_PSR(dev_priv) and
intel_dp != dev_priv->psr.dp".
therefore if we have this line "if (!crtc_state->has_psr)", we don't
need to add "if (!CAN_PSR(dev_priv) || dev_priv->psr.dp != intel_dp)"

Except that, looks good to me.

Reviewed-by: Gwan-gyeong Mun 

> + if (!CAN_PSR(dev_priv) || dev_priv->psr.dp != intel_dp)
>   return;
>  
> - if (drm_WARN_ON(_priv->drm, !CAN_PSR(dev_priv)))
> + dev_priv->psr.force_mode_changed = false;
> +
> + if (!crtc_state->has_psr)
>   return;
>  
>   drm_WARN_ON(_priv->drm, dev_priv->drrs.dp);
> @@ -1099,6 +1101,8 @@ void intel_psr_update(struct intel_dp
> *intel_dp,
>   if (!CAN_PSR(dev_priv) || READ_ONCE(psr->dp) != intel_dp)
>   return;
>  
> + dev_priv->psr.force_mode_changed = false;
> +
>   mutex_lock(_priv->psr.lock);
>  
>   enable = crtc_state->has_psr && psr_global_enabled(dev_priv);
> @@ -1629,7 +1633,7 @@ void intel_psr_atomic_check(struct
> drm_connector *connector,
>   struct drm_crtc_state *crtc_state;
>  
>   if (!CAN_PSR(dev_priv) || !new_state->crtc ||
> - dev_priv->psr.initially_probed)
> + !dev_priv->psr.force_mode_changed)
>   return;
>  
>   intel_connector = to_intel_connector(connector);
> @@ -1640,5 +1644,18 @@ void intel_psr_atomic_check(struct
> drm_connector *connector,
>   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;
> +}
> +
> +void intel_psr_set_force_mode_changed(struct intel_dp *intel_dp)
> +{
> + struct drm_i915_private *dev_priv;
> +
> + if (!intel_dp)
> + return;
> +
> + dev_priv = dp_to_i915(intel_dp);
> + if (!CAN_PSR(dev_priv) || intel_dp != dev_priv->psr.dp)
> + return;
> +
> + dev_priv->psr.force_mode_changed = true;
>  }
> diff --git a/drivers/gpu/drm/i915/display/intel_psr.h
> b/drivers/gpu/drm/i915/display/intel_psr.h
> index c58a1d438808..274fc6bb6221 100644
> --- a/drivers/gpu/drm/i915/display/intel_psr.h
> +++ b/drivers/gpu/drm/i915/display/intel_psr.h
> @@ -40,5 +40,6 @@ 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 

[Intel-gfx] [PATCH v4] drm/i915/psr: Force PSR probe only after full initialization

2020-02-20 Thread José Roberto de Souza
Commit 60c6a14b489b ("drm/i915/display: Force the state compute phase
once to enable PSR") was forcing the state compute too earlier
causing errors because not everything was initialized, so here
moving to the end of i915_driver_modeset_probe() when the display is
all initialized.

Also fixing the place where it disarm the force probe as during the
atomic check phase errors could happen like the ones due locking and
it would cause PSR to never be enabled if that happens.
Leaving the disarm to the atomic commit phase, intel_psr_enable() or
intel_psr_update() will be called even if the current state do not
allow PSR to be enabled.

v2: Check if intel_dp is null in intel_psr_force_mode_changed_set()
v3: Check intel_dp before get dev_priv
v4:
- renamed intel_psr_force_mode_changed_set() to
intel_psr_set_force_mode_changed()
- removed the set parameter from intel_psr_set_force_mode_changed()
- not calling intel_psr_set_force_mode_changed() from
intel_psr_enable/update(), directly setting it after the same checks
that intel_psr_set_force_mode_changed() does
- moved intel_psr_set_force_mode_changed() arm call to
i915_driver_modeset_probe() as it is a better for a PSR call, all the
functions calls happening between the old and the new function call
will cause issue

Fixes: 60c6a14b489b ("drm/i915/display: Force the state compute phase once to 
enable PSR")
Closes: https://gitlab.freedesktop.org/drm/intel/issues/1151
Tested-by: Ross Zwisler 
Reported-by: Ross Zwisler 
Cc: Gwan-gyeong Mun 
Cc: Jani Nikula 
Cc: Anshuman Gupta 
Signed-off-by: José Roberto de Souza 
---
 drivers/gpu/drm/i915/display/intel_psr.c | 25 
 drivers/gpu/drm/i915/display/intel_psr.h |  1 +
 drivers/gpu/drm/i915/i915_drv.c  |  3 +++
 drivers/gpu/drm/i915/i915_drv.h  |  2 +-
 4 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_psr.c 
b/drivers/gpu/drm/i915/display/intel_psr.c
index b4942b6445ae..7e754201f54d 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -936,10 +936,12 @@ void intel_psr_enable(struct intel_dp *intel_dp,
 {
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 
-   if (!crtc_state->has_psr)
+   if (!CAN_PSR(dev_priv) || dev_priv->psr.dp != intel_dp)
return;
 
-   if (drm_WARN_ON(_priv->drm, !CAN_PSR(dev_priv)))
+   dev_priv->psr.force_mode_changed = false;
+
+   if (!crtc_state->has_psr)
return;
 
drm_WARN_ON(_priv->drm, dev_priv->drrs.dp);
@@ -1099,6 +1101,8 @@ void intel_psr_update(struct intel_dp *intel_dp,
if (!CAN_PSR(dev_priv) || READ_ONCE(psr->dp) != intel_dp)
return;
 
+   dev_priv->psr.force_mode_changed = false;
+
mutex_lock(_priv->psr.lock);
 
enable = crtc_state->has_psr && psr_global_enabled(dev_priv);
@@ -1629,7 +1633,7 @@ void intel_psr_atomic_check(struct drm_connector 
*connector,
struct drm_crtc_state *crtc_state;
 
if (!CAN_PSR(dev_priv) || !new_state->crtc ||
-   dev_priv->psr.initially_probed)
+   !dev_priv->psr.force_mode_changed)
return;
 
intel_connector = to_intel_connector(connector);
@@ -1640,5 +1644,18 @@ void intel_psr_atomic_check(struct drm_connector 
*connector,
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;
+}
+
+void intel_psr_set_force_mode_changed(struct intel_dp *intel_dp)
+{
+   struct drm_i915_private *dev_priv;
+
+   if (!intel_dp)
+   return;
+
+   dev_priv = dp_to_i915(intel_dp);
+   if (!CAN_PSR(dev_priv) || intel_dp != dev_priv->psr.dp)
+   return;
+
+   dev_priv->psr.force_mode_changed = true;
 }
diff --git a/drivers/gpu/drm/i915/display/intel_psr.h 
b/drivers/gpu/drm/i915/display/intel_psr.h
index c58a1d438808..274fc6bb6221 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.h
+++ b/drivers/gpu/drm/i915/display/intel_psr.h
@@ -40,5 +40,6 @@ 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);
+void intel_psr_set_force_mode_changed(struct intel_dp *intel_dp);
 
 #endif /* __INTEL_PSR_H__ */
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 759d333448e1..066934327345 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -58,6 +58,7 @@
 #include "display/intel_hotplug.h"
 #include "display/intel_overlay.h"
 #include "display/intel_pipe_crc.h"
+#include "display/intel_psr.h"
 #include "display/intel_sprite.h"
 #include "display/intel_vga.h"
 
@@ -264,6 +265,8 @@ static int