Re: [PATCH 1/1] drm/amd/display: allow self-refresh exit while entry is blocked

Leo Li <[email protected]> Tue, 4 Aug 2026 10:03:27 -0400
Newsgroups gmane.comp.freedesktop.amd-gfx,gmane.comp.video.dri.devel
Message-ID <[email protected]>

On 2026-07-29 23:32, David Weber wrote:
> [You don't often get email from weber.aulendorf-Re5JQEeQqe9fmgfxC/sS/[email protected] Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ]
> 
> amdgpu_dm_crtc_set_static_screen_optimze() maps sso_enable to the
> Replay and PSR1 vsync events. allow_sr_entry is an entry gate, but the
> helper currently applies it to both directions.
> 
> A non-fast update clears allow_sr_entry. During a modeset, a separate
> hardware-programming event keeps self-refresh blocked while the stream
> is reprogrammed. If vblank is enabled before the entry delay expires,
> the ISM calls the helper with sso_enable false. The early return drops
> the disable request, so the vsync events are not set.
> 
> After enough fast commits, allow_sr_entry becomes true and the
> hardware-programming event can be cleared. Since the vblank reference
> remains held, there is no further zero-to-one vblank transition to
> restore the missing vsync events. Replay or PSR1 can then become active
> while vblank is still enabled.
> 
> Gate only requests that enable static-screen optimization. Always
> process disable requests so a vblank requestor keeps Replay and PSR1
> blocked.
> 
> On a Phoenix system, repeated SDDM-to-VT handoffs produced stuck flips
> followed by flip_done and commit-wait timeouts. The timeout was not
> observed with this change applied.
> 

Reviewed-by: Leo Li <[email protected]>
Thanks!

> Fixes: 3c108046e1d6 ("drm/amd/display: Add power module on Linux")
> Assisted-by: Codex:gpt-5.6-sol
> Assisted-by: Claude:opus-5
> Signed-off-by: David Weber <[email protected]>
> ---
>  drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
> index 95d3da3c4..06598273d 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
> @@ -119,7 +119,11 @@ void amdgpu_dm_crtc_set_static_screen_optimze(
>         struct dc_link *link = stream->link;
>         bool set_vsync_event = !sso_enable;
> 
> -       if (!allow_sr_entry)
> +       /*
> +        * allow_sr_entry gates only entry. A disable request must still set
> +        * the vsync events to force Replay and PSR1 out and keep them blocked.
> +        */
> +       if (sso_enable && !allow_sr_entry)
>                 return;
> 
>         amdgpu_dm_replay_set_event(dm, stream,
> --
> 2.54.0
>