On Wed, 2025-08-27 at 16:06 +0300, Ville Syrjälä wrote:
> On Tue, Aug 26, 2025 at 02:30:50PM +0000, Hogander, Jouni wrote:
> > On Tue, 2025-08-26 at 15:36 +0300, Ville Syrjälä wrote:
> > > On Wed, Aug 06, 2025 at 08:22:13AM +0300, Jouni Högander wrote:
> > > > We are currently observing crc failures after we started using
> > > > dsb
> > > > for PSR
> > > > updates as well. This seems to happen because PSR HW is still
> > > > sending
> > > > couple of updates using old framebuffers on wake-up.
> > > > 
> > > > Fix this by adding poll ensuring PSR is idle before starting
> > > > update.
> > > > 
> > > > Signed-off-by: Jouni Högander <jouni.hogan...@intel.com>
> > > > ---
> > > >  drivers/gpu/drm/i915/display/intel_display.c | 2 ++
> > > >  1 file changed, 2 insertions(+)
> > > > 
> > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> > > > b/drivers/gpu/drm/i915/display/intel_display.c
> > > > index c1a3a95c65f0..411c74c73eae 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > > > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > > > @@ -7271,6 +7271,8 @@ static void
> > > > intel_atomic_dsb_finish(struct
> > > > intel_atomic_state *state,
> > > >                 intel_psr_trigger_frame_change_event(new_crtc_
> > > > stat
> > > > e->dsb_commit,
> > > >                                                      state,
> > > > crtc);
> > > >  
> > > > +               intel_psr_wait_for_idle_dsb(new_crtc_state);
> > > > +
> > > >                 if (new_crtc_state->use_dsb)
> > > >                         intel_dsb_vblank_evade(state,
> > > > new_crtc_state->dsb_commit);
> > > 
> > > How come the 'evade scanline 0 + normal evasion' in
> > > intel_dsb_vblank_evade()
> > > is not enough here?
> > 
> > the problem doesn't happen when PSR is in SRD_ENT/DEEP_SLEEP as
> > committing new changes is started. It seems to happen when PSR
> > transitioning into SRD_ENT/DEEP_SLEEP is ongoing when new changes
> > are
> > being committed. In this case evasion passes and PSR is continuing
> > transitioning into SRD_ENT/DEEP_SLEEP. Then wake-up starts
> > immediately
> > due to pending "Frame Change" event and in this case HW is sending
> > a
> > frame using old plane configuration.
> 
> That's a bit weird. I think we are configuring things so that there
> should be that extra vblank already for the first frame after PSR
> exit. So I would expect things to latch properly even if we write
> the registers during the PSR entry sequence.
> 
> Hmm, though the DSB itself never waits for the delayed vblank
> directly. Maybe the delayed vblank does get suppressed for
> one frame during the sequence somewhere, but the undelayed
> vblank used by the DSB does not.
> 
> One could perhaps try to sample a timestamp from the DSB after
> it thinks the vblank has happened, and sample another one from
> the CPU delayed vblank interrupt (which I would expect to match
> when the hardware really latches stuff), and compare how they
> look. Though that does require one to enable the CPU interrupt
> which itself will trigger the PSR exit (at least on some hw),
> so not sure how easy it is to hit the exact conditions required.
> I suppose one might try to wait for the PSR state machine to
> be in the right state just before triggering the exit.

Enabling the interrupt will trigger exit. Are you thinking that state
machine wait as a solution or as a experiment? :

Original issue this patch is targeted is triggering rarely in one
testcase and only with one specific panel. I found out that I can
reproduce the issue pretty much on any panel if I adjust idle_frames. I
.e. the configuration how many idle frames before transition to SRDENT
is started.

BR,

Jouni Högander
> 
> > 
> > Bspec is saying this transition to SRD_ENT/DEEP_SLEEP can't be
> > interrupted.
> > 
> > BR,
> > 
> > Jouni Högander
> > > 
> > 
> 

Reply via email to