]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amd/display: Fix seamless boot sequence
authorLo-an Chen <lo-an.chen@amd.com>
Fri, 17 Jan 2025 09:56:25 +0000 (17:56 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 17 Feb 2025 09:05:09 +0000 (10:05 +0100)
commit e01f07cb92513ca4b9b219ab9caa34d607bc1e2d upstream.

[WHY]
When the system powers up eDP with external monitors in seamless boot
sequence, stutter get enabled before TTU and HUBP registers being
programmed, which resulting in underflow.

[HOW]
Enable TTU in hubp_init.
Change the sequence that do not perpare_bandwidth and optimize_bandwidth
while having seamless boot streams.

Cc: Mario Limonciello <mario.limonciello@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Lo-an Chen <lo-an.chen@amd.com>
Signed-off-by: Paul Hsieh <paul.hsieh@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/hubbub/dcn30/dcn30_hubbub.c
drivers/gpu/drm/amd/display/dc/hubbub/dcn31/dcn31_hubbub.c
drivers/gpu/drm/amd/display/dc/hubbub/dcn32/dcn32_hubbub.c
drivers/gpu/drm/amd/display/dc/hubbub/dcn35/dcn35_hubbub.c
drivers/gpu/drm/amd/display/dc/hubp/dcn30/dcn30_hubp.c
drivers/gpu/drm/amd/display/dc/hubp/dcn32/dcn32_hubp.c
drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c

index 6d4ee8fe615c383d07c0609761d0961c4587d6b2..216b525bd75e79fc232adf295f3576d54b8b9aa7 100644 (file)
@@ -2032,7 +2032,7 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c
 
        dc_enable_stereo(dc, context, dc_streams, context->stream_count);
 
-       if (context->stream_count > get_seamless_boot_stream_count(context) ||
+       if (get_seamless_boot_stream_count(context) == 0 ||
                context->stream_count == 0) {
                /* Must wait for no flips to be pending before doing optimize bw */
                hwss_wait_for_no_pipes_pending(dc, context);
index fe741100c0f880f69b4c83460fc3cbf9cb268256..d347bb06577ac69e0e039397f4b0528ff93a3b90 100644 (file)
@@ -129,7 +129,8 @@ bool hubbub3_program_watermarks(
        REG_UPDATE(DCHUBBUB_ARB_DF_REQ_OUTSTAND,
                        DCHUBBUB_ARB_MIN_REQ_OUTSTAND, 0x1FF);
 
-       hubbub1_allow_self_refresh_control(hubbub, !hubbub->ctx->dc->debug.disable_stutter);
+       if (safe_to_lower || hubbub->ctx->dc->debug.disable_stutter)
+               hubbub1_allow_self_refresh_control(hubbub, !hubbub->ctx->dc->debug.disable_stutter);
 
        return wm_pending;
 }
index 7fb5523f972244ce0526b7e236158d435c4ecc84..b98505b240a797bc243043f35dffca8588b586c8 100644 (file)
@@ -750,7 +750,8 @@ static bool hubbub31_program_watermarks(
        REG_UPDATE(DCHUBBUB_ARB_DF_REQ_OUTSTAND,
                        DCHUBBUB_ARB_MIN_REQ_OUTSTAND, 0x1FF);*/
 
-       hubbub1_allow_self_refresh_control(hubbub, !hubbub->ctx->dc->debug.disable_stutter);
+       if (safe_to_lower || hubbub->ctx->dc->debug.disable_stutter)
+               hubbub1_allow_self_refresh_control(hubbub, !hubbub->ctx->dc->debug.disable_stutter);
        return wm_pending;
 }
 
index 5264dc26cce1fadc00f77c78c51363a9974b68df..32a6be543105c147f31c04d452c1a456a931a0af 100644 (file)
@@ -786,7 +786,8 @@ static bool hubbub32_program_watermarks(
        REG_UPDATE(DCHUBBUB_ARB_DF_REQ_OUTSTAND,
                        DCHUBBUB_ARB_MIN_REQ_OUTSTAND, 0x1FF);*/
 
-       hubbub1_allow_self_refresh_control(hubbub, !hubbub->ctx->dc->debug.disable_stutter);
+       if (safe_to_lower || hubbub->ctx->dc->debug.disable_stutter)
+               hubbub1_allow_self_refresh_control(hubbub, !hubbub->ctx->dc->debug.disable_stutter);
 
        hubbub32_force_usr_retraining_allow(hubbub, hubbub->ctx->dc->debug.force_usr_allow);
 
index 5eb3da8d5206e91e595d03e4db96439cca9080bc..dce7269959ce74613166060b22e972fa9e9cb0e3 100644 (file)
@@ -326,7 +326,8 @@ static bool hubbub35_program_watermarks(
                        DCHUBBUB_ARB_MIN_REQ_OUTSTAND_COMMIT_THRESHOLD, 0xA);/*hw delta*/
        REG_UPDATE(DCHUBBUB_ARB_HOSTVM_CNTL, DCHUBBUB_ARB_MAX_QOS_COMMIT_THRESHOLD, 0xF);
 
-       hubbub1_allow_self_refresh_control(hubbub, !hubbub->ctx->dc->debug.disable_stutter);
+       if (safe_to_lower || hubbub->ctx->dc->debug.disable_stutter)
+               hubbub1_allow_self_refresh_control(hubbub, !hubbub->ctx->dc->debug.disable_stutter);
 
        hubbub32_force_usr_retraining_allow(hubbub, hubbub->ctx->dc->debug.force_usr_allow);
 
index c55b1b8be8ffd6cb70b8ef13b4bca2017fcf7f74..5cf7e6771cb49e8ba63f57cfba255fb1ca2ceee4 100644 (file)
@@ -484,6 +484,8 @@ void hubp3_init(struct hubp *hubp)
        //hubp[i].HUBPREQ_DEBUG.HUBPREQ_DEBUG[26] = 1;
        REG_WRITE(HUBPREQ_DEBUG, 1 << 26);
 
+       REG_UPDATE(DCHUBP_CNTL, HUBP_TTU_DISABLE, 0);
+
        hubp_reset(hubp);
 }
 
index 45023fa9b708dcf0620bc85161999518f0eda4c7..c4f41350d1b3ce67ebddab90391d3be683806457 100644 (file)
@@ -168,6 +168,8 @@ void hubp32_init(struct hubp *hubp)
 {
        struct dcn20_hubp *hubp2 = TO_DCN20_HUBP(hubp);
        REG_WRITE(HUBPREQ_DEBUG_DB, 1 << 8);
+
+       REG_UPDATE(DCHUBP_CNTL, HUBP_TTU_DISABLE, 0);
 }
 static struct hubp_funcs dcn32_hubp_funcs = {
        .hubp_enable_tripleBuffer = hubp2_enable_triplebuffer,
index f6b17bd3f714fa7f7139318fd2c26cdc6f80a8c5..38755ca771401bda6542a26dd715a8ead8ed80a4 100644 (file)
@@ -236,7 +236,8 @@ void dcn35_init_hw(struct dc *dc)
                }
 
                hws->funcs.init_pipes(dc, dc->current_state);
-               if (dc->res_pool->hubbub->funcs->allow_self_refresh_control)
+               if (dc->res_pool->hubbub->funcs->allow_self_refresh_control &&
+                       !dc->res_pool->hubbub->ctx->dc->debug.disable_stutter)
                        dc->res_pool->hubbub->funcs->allow_self_refresh_control(dc->res_pool->hubbub,
                                        !dc->res_pool->hubbub->ctx->dc->debug.disable_stutter);
        }