| From e01f07cb92513ca4b9b219ab9caa34d607bc1e2d Mon Sep 17 00:00:00 2001 |
| From: Lo-an Chen <lo-an.chen@amd.com> |
| Date: Fri, 17 Jan 2025 17:56:25 +0800 |
| Subject: drm/amd/display: Fix seamless boot sequence |
| |
| From: Lo-an Chen <lo-an.chen@amd.com> |
| |
| 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 | 2 +- |
| drivers/gpu/drm/amd/display/dc/hubbub/dcn30/dcn30_hubbub.c | 3 ++- |
| drivers/gpu/drm/amd/display/dc/hubbub/dcn31/dcn31_hubbub.c | 3 ++- |
| drivers/gpu/drm/amd/display/dc/hubbub/dcn32/dcn32_hubbub.c | 3 ++- |
| drivers/gpu/drm/amd/display/dc/hubbub/dcn35/dcn35_hubbub.c | 3 ++- |
| drivers/gpu/drm/amd/display/dc/hubp/dcn30/dcn30_hubp.c | 2 ++ |
| drivers/gpu/drm/amd/display/dc/hubp/dcn32/dcn32_hubp.c | 2 ++ |
| drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c | 3 ++- |
| 8 files changed, 15 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/gpu/drm/amd/display/dc/core/dc.c |
| +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c |
| @@ -2032,7 +2032,7 @@ static enum dc_status dc_commit_state_no |
| |
| 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); |
| --- a/drivers/gpu/drm/amd/display/dc/hubbub/dcn30/dcn30_hubbub.c |
| +++ b/drivers/gpu/drm/amd/display/dc/hubbub/dcn30/dcn30_hubbub.c |
| @@ -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; |
| } |
| --- a/drivers/gpu/drm/amd/display/dc/hubbub/dcn31/dcn31_hubbub.c |
| +++ b/drivers/gpu/drm/amd/display/dc/hubbub/dcn31/dcn31_hubbub.c |
| @@ -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; |
| } |
| |
| --- a/drivers/gpu/drm/amd/display/dc/hubbub/dcn32/dcn32_hubbub.c |
| +++ b/drivers/gpu/drm/amd/display/dc/hubbub/dcn32/dcn32_hubbub.c |
| @@ -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); |
| |
| --- a/drivers/gpu/drm/amd/display/dc/hubbub/dcn35/dcn35_hubbub.c |
| +++ b/drivers/gpu/drm/amd/display/dc/hubbub/dcn35/dcn35_hubbub.c |
| @@ -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); |
| |
| --- a/drivers/gpu/drm/amd/display/dc/hubp/dcn30/dcn30_hubp.c |
| +++ b/drivers/gpu/drm/amd/display/dc/hubp/dcn30/dcn30_hubp.c |
| @@ -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); |
| } |
| |
| --- a/drivers/gpu/drm/amd/display/dc/hubp/dcn32/dcn32_hubp.c |
| +++ b/drivers/gpu/drm/amd/display/dc/hubp/dcn32/dcn32_hubp.c |
| @@ -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, |
| --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c |
| +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c |
| @@ -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); |
| } |