]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amd/display: Remove hw w/a toggle if on DP2/HPO
authorAusef Yousof <Ausef.Yousof@amd.com>
Thu, 24 Oct 2024 18:06:39 +0000 (14:06 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 14 Dec 2024 19:03:53 +0000 (20:03 +0100)
[ Upstream commit b4c804628485af2b46f0d24a87190735cac37d61 ]

[why&how]
Applying a hw w/a only relevant to DIG FIFO causing corruption
using HPO, do not apply the w/a if on DP2/HPO

Reviewed-by: Charlene Liu <charlene.liu@amd.com>
Signed-off-by: Ausef Yousof <Ausef.Yousof@amd.com>
Signed-off-by: Zaeem Mohamed <zaeem.mohamed@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c

index 7d68006137a97f5f2dfdf6a812ebfb601ae54f35..3bd0d46c17010966ec0df12f41dbb59057316a6e 100644 (file)
@@ -132,6 +132,8 @@ static void dcn35_disable_otg_wa(struct clk_mgr *clk_mgr_base, struct dc_state *
        for (i = 0; i < dc->res_pool->pipe_count; ++i) {
                struct pipe_ctx *old_pipe = &dc->current_state->res_ctx.pipe_ctx[i];
                struct pipe_ctx *new_pipe = &context->res_ctx.pipe_ctx[i];
+               struct clk_mgr_internal *clk_mgr_internal = TO_CLK_MGR_INTERNAL(clk_mgr_base);
+               struct dccg *dccg = clk_mgr_internal->dccg;
                struct pipe_ctx *pipe = safe_to_lower
                        ? &context->res_ctx.pipe_ctx[i]
                        : &dc->current_state->res_ctx.pipe_ctx[i];
@@ -148,8 +150,13 @@ static void dcn35_disable_otg_wa(struct clk_mgr *clk_mgr_base, struct dc_state *
                new_pipe->stream_res.stream_enc &&
                new_pipe->stream_res.stream_enc->funcs->is_fifo_enabled &&
                new_pipe->stream_res.stream_enc->funcs->is_fifo_enabled(new_pipe->stream_res.stream_enc);
-               if (pipe->stream && (pipe->stream->dpms_off || dc_is_virtual_signal(pipe->stream->signal) ||
-                       !pipe->stream->link_enc) && !stream_changed_otg_dig_on) {
+               bool has_active_hpo = dccg->ctx->dc->link_srv->dp_is_128b_132b_signal(old_pipe) && dccg->ctx->dc->link_srv->dp_is_128b_132b_signal(new_pipe);
+
+               if (!has_active_hpo && !dccg->ctx->dc->link_srv->dp_is_128b_132b_signal(pipe) &&
+                                       (pipe->stream && (pipe->stream->dpms_off || dc_is_virtual_signal(pipe->stream->signal) ||
+                                       !pipe->stream->link_enc) && !stream_changed_otg_dig_on)) {
+
+
                        /* This w/a should not trigger when we have a dig active */
                        if (disable) {
                                if (pipe->stream_res.tg && pipe->stream_res.tg->funcs->immediate_disable_crtc)