From: Leon Huang <leon.hua...@amd.com>

[ Upstream commit 0d9cabc8f591ea1cd97c071b853b75b155c13259 ]

[Why]
When switching between PSR/Replay,
the DPCD config of previous mode is not cleared,
resulting in unexpected behavior in TCON.

[How]
Initialize the DPCD in setup function

Reviewed-by: Robin Chen <robin.c...@amd.com>
Signed-off-by: Leon Huang <leon.hua...@amd.com>
Signed-off-by: Tom Chung <chiahsuan.ch...@amd.com>
Tested-by: Daniel Wheeler <daniel.whee...@amd.com>
Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 .../link/protocols/link_edp_panel_control.c   | 25 ++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git 
a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c 
b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c
index 13104d000b9e0..d4d92da153ece 100644
--- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c
+++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c
@@ -662,6 +662,18 @@ bool edp_setup_psr(struct dc_link *link,
        if (!link)
                return false;
 
+       //Clear PSR cfg
+       memset(&psr_configuration, 0, sizeof(psr_configuration));
+       dm_helpers_dp_write_dpcd(
+               link->ctx,
+               link,
+               DP_PSR_EN_CFG,
+               &psr_configuration.raw,
+               sizeof(psr_configuration.raw));
+
+       if (link->psr_settings.psr_version == DC_PSR_VERSION_UNSUPPORTED)
+               return false;
+
        dc = link->ctx->dc;
        dmcu = dc->res_pool->dmcu;
        psr = dc->res_pool->psr;
@@ -672,9 +684,6 @@ bool edp_setup_psr(struct dc_link *link,
        if (!dc_get_edp_link_panel_inst(dc, link, &panel_inst))
                return false;
 
-
-       memset(&psr_configuration, 0, sizeof(psr_configuration));
-
        psr_configuration.bits.ENABLE                    = 1;
        psr_configuration.bits.CRC_VERIFICATION          = 1;
        psr_configuration.bits.FRAME_CAPTURE_INDICATION  =
@@ -938,6 +947,16 @@ bool edp_setup_replay(struct dc_link *link, const struct 
dc_stream_state *stream
        if (!link)
                return false;
 
+       //Clear Replay config
+       dm_helpers_dp_write_dpcd(link->ctx, link,
+               DP_SINK_PR_ENABLE_AND_CONFIGURATION,
+               (uint8_t *)&(replay_config.raw), sizeof(uint8_t));
+
+       if (!(link->replay_settings.config.replay_supported))
+               return false;
+
+       link->replay_settings.config.replay_error_status.raw = 0;
+
        dc = link->ctx->dc;
 
        replay = dc->res_pool->replay;
-- 
2.39.5

Reply via email to