On 2026-07-29 23:32, David Weber wrote:
> [You don't often get email from [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
>