From: Ray Wu <[email protected]>

[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 <[email protected]>
Signed-off-by: Ray Wu <[email protected]>
Signed-off-by: Matthew Stewart <[email protected]>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  1 +
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c | 25 ++++++++++++++++---
 .../amd/display/amdgpu_dm/amdgpu_dm_replay.c  |  7 ++++++
 3 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index 7065b20aa2e6..5775c722dd92 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -810,6 +810,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;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
index 327b20055729..5851f2d55dde 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
@@ -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);
 
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_replay.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_replay.c
index fb619a3336b7..8c150b001105 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_replay.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_replay.c
@@ -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) {
-- 
2.52.0

Reply via email to