]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: disable replay when crc source is enabled
authorRay Wu <ray.wu@amd.com>
Tue, 16 Dec 2025 10:09:45 +0000 (18:09 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Sat, 10 Jan 2026 19:21:53 +0000 (14:21 -0500)
[Why]
IGT CRC tests fail on replay panels due to invalid CRC values
captured when replay is active.

[How]
- Disable replay when CRC source is enabled; set flag to
  prevent unexpected re-enable
- Reset flag when CRC source is disabled to allow replay

Reviewed-by: ChiaHsuan (Tom) Chung <chiahsuan.chung@amd.com>
Signed-off-by: Ray Wu <ray.wu@amd.com>
Signed-off-by: Matthew Stewart <matthew.stewart2@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_replay.c

index ab363f2f6d479e219b70a05ae62c13a82be2db2c..f0f371718d0333bb5333c430074ebb2012c958e4 100644 (file)
@@ -815,6 +815,7 @@ struct amdgpu_dm_connector {
 
        int sr_skip_count;
        bool disallow_edp_enter_psr;
+       bool disallow_edp_enter_replay;
 
        /* Record progress status of mst*/
        uint8_t mst_status;
index 327b20055729c5113b8b59e71f7f549eaa96b3c6..5851f2d55dde1d90ad6862c0742b72d229cef6ac 100644 (file)
@@ -32,6 +32,7 @@
 #include "dc.h"
 #include "amdgpu_securedisplay.h"
 #include "amdgpu_dm_psr.h"
+#include "amdgpu_dm_replay.h"
 
 static const char *const pipe_crc_sources[] = {
        "none",
@@ -502,6 +503,7 @@ int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc,
 {
        struct amdgpu_device *adev = drm_to_adev(crtc->dev);
        struct dc_stream_state *stream_state = dm_crtc_state->stream;
+       struct amdgpu_dm_connector *aconnector = NULL;
        bool enable = amdgpu_dm_is_valid_crc_source(source);
        int ret = 0;
 
@@ -509,11 +511,22 @@ int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc,
        if (!stream_state)
                return -EINVAL;
 
+       /* Get connector from stream */
+       aconnector = (struct amdgpu_dm_connector *)stream_state->dm_stream_context;
+
        mutex_lock(&adev->dm.dc_lock);
 
-       /* For PSR1, check that the panel has exited PSR */
-       if (stream_state->link->psr_settings.psr_version < DC_PSR_VERSION_SU_1)
-               amdgpu_dm_psr_wait_disable(stream_state);
+
+       if (enable) {
+               /* For PSR1, check that the panel has exited PSR */
+               if (stream_state->link->psr_settings.psr_version < DC_PSR_VERSION_SU_1)
+                       amdgpu_dm_psr_wait_disable(stream_state);
+
+               /* Set flag to disallow enter replay when CRC source is enabled */
+               if (aconnector)
+                       aconnector->disallow_edp_enter_replay = true;
+               amdgpu_dm_replay_disable(stream_state);
+       }
 
        /* Enable or disable CRTC CRC generation */
        if (dm_is_crc_source_crtc(source) || source == AMDGPU_DM_PIPE_CRC_SOURCE_NONE) {
@@ -536,6 +549,12 @@ int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc,
                                            DYN_EXPANSION_AUTO);
        }
 
+       if (!enable) {
+               /* Clear flag to allow enter replay when CRC source is disabled */
+               if (aconnector)
+                       aconnector->disallow_edp_enter_replay = false;
+       }
+
 unlock:
        mutex_unlock(&adev->dm.dc_lock);
 
index fb619a3336b70f69495711511e63af2253e8b6fd..8c150b00110598e2f8d38a7daf0719b659195aa3 100644 (file)
@@ -154,10 +154,17 @@ bool amdgpu_dm_replay_enable(struct dc_stream_state *stream, bool wait)
 {
        bool replay_active = true;
        struct dc_link *link = NULL;
+       struct amdgpu_dm_connector *aconnector = NULL;
 
        if (stream == NULL)
                return false;
 
+       /* Check if replay is disabled by connector flag */
+       aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
+       if (!aconnector || aconnector->disallow_edp_enter_replay) {
+               return false;
+       }
+
        link = stream->link;
 
        if (link) {