]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/amd/display: Fix Xorg desktop unresponsive on Replay panel
authorTom Chung <chiahsuan.chung@amd.com>
Fri, 18 Jul 2025 10:25:08 +0000 (18:25 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 18 Aug 2025 21:56:53 +0000 (17:56 -0400)
[WHY & HOW]
IPS & self-fresh feature can cause vblank counter resets between
vblank disable and enable.
It may cause system stuck due to wait the vblank counter.

Call the drm_crtc_vblank_restore() during vblank enable to estimate
missed vblanks by using timestamps and update the vblank counter in
DRM.

It can make the vblank counter increase smoothly and resolve this issue.

Cc: Mario Limonciello <mario.limonciello@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Sun peng (Leo) Li <sunpeng.li@amd.com>
Signed-off-by: Tom Chung <chiahsuan.chung@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 34d66bc7ff10e146a4cec76cf286979740a10954)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c

index 010172f930aef91613a012322dea0155b3bfbdb8..45feb404b0979e498e0b8193b957bc54074621e1 100644 (file)
@@ -299,6 +299,25 @@ static inline int amdgpu_dm_crtc_set_vblank(struct drm_crtc *crtc, bool enable)
        irq_type = amdgpu_display_crtc_idx_to_irq_type(adev, acrtc->crtc_id);
 
        if (enable) {
+               struct dc *dc = adev->dm.dc;
+               struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
+               struct psr_settings *psr = &acrtc_state->stream->link->psr_settings;
+               struct replay_settings *pr = &acrtc_state->stream->link->replay_settings;
+               bool sr_supported = (psr->psr_version != DC_PSR_VERSION_UNSUPPORTED) ||
+                                                               pr->config.replay_supported;
+
+               /*
+                * IPS & self-refresh feature can cause vblank counter resets between
+                * vblank disable and enable.
+                * It may cause system stuck due to waiting for the vblank counter.
+                * Call this function to estimate missed vblanks by using timestamps and
+                * update the vblank counter in DRM.
+                */
+               if (dc->caps.ips_support &&
+                       dc->config.disable_ips != DMUB_IPS_DISABLE_ALL &&
+                       sr_supported && vblank->config.disable_immediate)
+                       drm_crtc_vblank_restore(crtc);
+
                /* vblank irq on -> Only need vupdate irq in vrr mode */
                if (amdgpu_dm_crtc_vrr_active(acrtc_state))
                        rc = amdgpu_dm_crtc_set_vupdate_irq(crtc, true);