FAILED: patch "[PATCH] drm/amd/display: Prevent Gating DTBCLK before It Is Properly" failed to apply to 6.12-stable tree
[email protected]
maintainerThe patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.12.y
git checkout FETCH_HEAD
git cherry-pick -x cfa0904a35fd0231f4d05da0190f0a22ed881cce
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025112425-aspirin-conduit-e44b@gregkh' --subject-prefix 'PATCH 6.12.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From cfa0904a35fd0231f4d05da0190f0a22ed881cce Mon Sep 17 00:00:00 2001
From: Fangzhi Zuo <[email protected]>
Date: Thu, 18 Sep 2025 16:25:45 -0400
Subject: [PATCH] drm/amd/display: Prevent Gating DTBCLK before It Is Properly
Latched
[why]
1. With allow_0_dtb_clk enabled, the time required to latch DTBCLK to 600 MHz depends on the SMU. If DTBCLK is not latched to 600 MHz before set_mode completes, gating DTBCLK causes the DP2 sink to lose its clock source.
2. The existing DTBCLK gating sequence ungates DTBCLK based on both pix_clk and ref_dtbclk, but gates DTBCLK when either pix_clk or ref_dtbclk is zero.pix_clk can be zero outside the set_mode sequence before DTBCLK is properly latched, which can lead to DTBCLK being gated by mistake.
[how]
Consider both pixel_clk and ref_dtbclk when determining when it is safe to gate DTBCLK; this is more accurate.
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c +3 -1
@@ -394,6 +394,8 @@ void dcn35_update_clocks(struct clk_mgr *clk_mgr_base, display_count =dcn35_get_active_display_cnt_wa (dc, context, &all_active_disps);if (new_clocks->dtbclk_en && !new_clocks->ref_dtbclk_khz) new_clocks->ref_dtbclk_khz =600000 ; +else if (!new_clocks->dtbclk_en && new_clocks->ref_dtbclk_khz >590000 ) + new_clocks->ref_dtbclk_khz =0 ;/* * if it is safe to lower, but we are already in the lower state, we don't have to do anything
@@ -435,7 +437,7 @@ void dcn35_update_clocks(struct clk_mgr *clk_mgr_base, actual_dtbclk =REG_READ (CLK1_CLK4_CURRENT_CNT ); -if (actual_dtbclk) { +if (actual_dtbclk >590000 ) { clk_mgr_base->clks.ref_dtbclk_khz = new_clocks->ref_dtbclk_khz; clk_mgr_base->clks.dtbclk_en = new_clocks->dtbclk_en; }
drivers/gpu/drm/amd/display/dc/dccg/dcn35/dcn35_dccg.c +1 -1
@@ -1411,7 +1411,7 @@ static void dccg35_set_dtbclk_dto( __func__, params->otg_inst, params->pixclk_khz, params->ref_dtbclk_khz, req_dtbclk_khz, phase, modulo); - }else { + }else if (!params->ref_dtbclk_khz && !req_dtbclk_khz) {switch (params->otg_inst) {case 0 :REG_UPDATE (DCCG_GATE_DISABLE_CNTL5 ,DTBCLK_P0_GATE_DISABLE ,0 );
Sasha Levin
maintainerPATCH 1/4 drm/amd/display: avoid reset DTBCLK at clock init
From: Charlene Liu <[email protected]>
[ Upstream commit 0ae47e971b9add8f7b8f8d55ac5f407f6f346758 ]
[why & how]
this is to init to HW real DTBCLK.
and use real HW DTBCLK status to update internal logic state
Stable-dep-of: cfa0904a35fd ("drm/amd/display: Prevent Gating DTBCLK before It Is Properly Latched")
--- .../display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c +12 -6
@@ -393,6 +393,7 @@ void dcn35_update_clocks(struct clk_mgr *clk_mgr_base,if (clk_mgr_base->clks.dtbclk_en && !new_clocks->dtbclk_en) {if (clk_mgr->base.ctx->dc->config.allow_0_dtb_clk)dcn35_smu_set_dtbclk (clk_mgr, false); + clk_mgr_base->clks.dtbclk_en = new_clocks->dtbclk_en; }/* check that we're not already in lower */
@@ -410,11 +411,17 @@ void dcn35_update_clocks(struct clk_mgr *clk_mgr_base, }if (!clk_mgr_base->clks.dtbclk_en && new_clocks->dtbclk_en) { -dcn35_smu_set_dtbclk (clk_mgr, true); - clk_mgr_base->clks.dtbclk_en = new_clocks->dtbclk_en; +int actual_dtbclk =0 ;dcn35_update_clocks_update_dtb_dto (clk_mgr, context, new_clocks->ref_dtbclk_khz); - clk_mgr_base->clks.ref_dtbclk_khz = new_clocks->ref_dtbclk_khz; +dcn35_smu_set_dtbclk (clk_mgr, true); + + actual_dtbclk =REG_READ (CLK1_CLK4_CURRENT_CNT ); + +if (actual_dtbclk) { + clk_mgr_base->clks.ref_dtbclk_khz = new_clocks->ref_dtbclk_khz; + clk_mgr_base->clks.dtbclk_en = new_clocks->dtbclk_en; + } }/* check that we're not already in D0 */
@@ -581,12 +588,10 @@ static bool dcn35_is_spll_ssc_enabled(struct clk_mgr *clk_mgr_base)static void init_clk_states (struct clk_mgr *clk_mgr) { -struct clk_mgr_internal *clk_mgr_int =TO_CLK_MGR_INTERNAL (clk_mgr);uint32_t ref_dtbclk = clk_mgr->clks.ref_dtbclk_khz; +memset (&(clk_mgr->clks),0 ,sizeof (struct dc_clocks )); -if (clk_mgr_int->smu_ver >=SMU_VER_THRESHOLD ) - clk_mgr->clks.dtbclk_en = true;// request DTBCLK disable on first commit clk_mgr->clks.ref_dtbclk_khz = ref_dtbclk;// restore ref_dtbclk clk_mgr->clks.p_state_change_support = true; clk_mgr->clks.prev_p_state_change_support = true;
@@ -597,6 +602,7 @@ static void init_clk_states(struct clk_mgr *clk_mgr)void dcn35_init_clocks (struct clk_mgr *clk_mgr) {struct clk_mgr_internal *clk_mgr_int =TO_CLK_MGR_INTERNAL (clk_mgr); +init_clk_states (clk_mgr);// to adjust dp_dto reference clock if ssc is enable otherwise to apply dprefclk
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 2/4 drm/amd/display: disable DPP RCG before DPP CLK enable
From: Charlene Liu <[email protected]>
[ Upstream commit 1bcd679209420305a86833bc357d50021909edaf ]
[why]
DPP CLK enable needs to disable DPPCLK RCG first.
The DPPCLK_en in dccg should always be enabled when the corresponding pipe is enabled.
Stable-dep-of: cfa0904a35fd ("drm/amd/display: Prevent Gating DTBCLK before It Is Properly Latched")
--- .../amd/display/dc/dccg/dcn35/dcn35_dccg.c | 38 ++++++++++++------- .../amd/display/dc/hwss/dcn35/dcn35_hwseq.c | 21 ++++++---- 2 files changed, 38 insertions(+), 21 deletions(-)
drivers/gpu/drm/amd/display/dc/dccg/dcn35/dcn35_dccg.c +24 -14
@@ -391,6 +391,7 @@ static void dccg35_set_dppclk_rcg(struct dccg *dccg,struct dcn_dccg *dccg_dcn =TO_DCN_DCCG (dccg); +if (!dccg->ctx->dc->debug.root_clock_optimization.bits.dpp && enable)return ;
@@ -411,6 +412,8 @@ static void dccg35_set_dppclk_rcg(struct dccg *dccg,BREAK_TO_DEBUGGER ();break ; } +//DC_LOG_DEBUG("%s: inst(%d) DPPCLK rcg_disable: %d\n", __func__, inst, enable ? 0 : 1); + } static void dccg35_set_dpstreamclk_rcg(
@@ -1112,30 +1115,24 @@ static void dcn35_set_dppclk_enable(struct dccg *dccg, {struct dcn_dccg *dccg_dcn =TO_DCN_DCCG (dccg); +switch (dpp_inst) {case 0 :REG_UPDATE (DPPCLK_CTRL ,DPPCLK0_EN , enable); -if (dccg->ctx->dc->debug.root_clock_optimization.bits.dpp) -REG_UPDATE (DCCG_GATE_DISABLE_CNTL6 ,DPPCLK0_ROOT_GATE_DISABLE , enable);break ;case 1 :REG_UPDATE (DPPCLK_CTRL ,DPPCLK1_EN , enable); -if (dccg->ctx->dc->debug.root_clock_optimization.bits.dpp) -REG_UPDATE (DCCG_GATE_DISABLE_CNTL6 ,DPPCLK1_ROOT_GATE_DISABLE , enable);break ;case 2 :REG_UPDATE (DPPCLK_CTRL ,DPPCLK2_EN , enable); -if (dccg->ctx->dc->debug.root_clock_optimization.bits.dpp) -REG_UPDATE (DCCG_GATE_DISABLE_CNTL6 ,DPPCLK2_ROOT_GATE_DISABLE , enable);break ;case 3 :REG_UPDATE (DPPCLK_CTRL ,DPPCLK3_EN , enable); -if (dccg->ctx->dc->debug.root_clock_optimization.bits.dpp) -REG_UPDATE (DCCG_GATE_DISABLE_CNTL6 ,DPPCLK3_ROOT_GATE_DISABLE , enable);break ;default :break ; } +//DC_LOG_DEBUG("%s: dpp_inst(%d) DPPCLK_EN = %d\n", __func__, dpp_inst, enable); }
@@ -1163,14 +1160,18 @@ static void dccg35_update_dpp_dto(struct dccg *dccg, int dpp_inst,ASSERT (false); phase =0xff ; } +dccg35_set_dppclk_rcg (dccg, dpp_inst, false);REG_SET_2 (DPPCLK_DTO_PARAM [dpp_inst],0 ,DPPCLK0_DTO_PHASE , phase,DPPCLK0_DTO_MODULO , modulo);dcn35_set_dppclk_enable (dccg, dpp_inst, true); - }else + }else {dcn35_set_dppclk_enable (dccg, dpp_inst, false); +/*we have this in hwss: disable_plane*/ +//dccg35_set_dppclk_rcg(dccg, dpp_inst, true); + } dccg->pipe_dppclk_khz[dpp_inst] = req_dppclk; }
@@ -1182,6 +1183,7 @@ static void dccg35_set_dppclk_root_clock_gating(struct dccg *dccg,if (!dccg->ctx->dc->debug.root_clock_optimization.bits.dpp)return ; +switch (dpp_inst) {case 0 :REG_UPDATE (DCCG_GATE_DISABLE_CNTL6 ,DPPCLK0_ROOT_GATE_DISABLE , enable);
@@ -1198,6 +1200,8 @@ static void dccg35_set_dppclk_root_clock_gating(struct dccg *dccg,default :break ; } +//DC_LOG_DEBUG("%s: dpp_inst(%d) rcg: %d\n", __func__, dpp_inst, enable); + } static void dccg35_get_pixel_rate_div(
@@ -1521,28 +1525,30 @@ static void dccg35_set_physymclk_root_clock_gating(switch (phy_inst) {case 0 :REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 , -PHYASYMCLK_ROOT_GATE_DISABLE , enable ?1 :0 ); +PHYASYMCLK_ROOT_GATE_DISABLE , enable ?0 :1 );break ;case 1 :REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 , -PHYBSYMCLK_ROOT_GATE_DISABLE , enable ?1 :0 ); +PHYBSYMCLK_ROOT_GATE_DISABLE , enable ?0 :1 );break ;case 2 :REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 , -PHYCSYMCLK_ROOT_GATE_DISABLE , enable ?1 :0 ); +PHYCSYMCLK_ROOT_GATE_DISABLE , enable ?0 :1 );break ;case 3 :REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 , -PHYDSYMCLK_ROOT_GATE_DISABLE , enable ?1 :0 ); +PHYDSYMCLK_ROOT_GATE_DISABLE , enable ?0 :1 );break ;case 4 :REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 , -PHYESYMCLK_ROOT_GATE_DISABLE , enable ?1 :0 ); +PHYESYMCLK_ROOT_GATE_DISABLE , enable ?0 :1 );break ;default :BREAK_TO_DEBUGGER ();return ; } +//DC_LOG_DEBUG("%s: dpp_inst(%d) PHYESYMCLK_ROOT_GATE_DISABLE:\n", __func__, phy_inst, enable ? 0 : 1); + } static void dccg35_set_physymclk(
@@ -1643,6 +1649,8 @@ static void dccg35_dpp_root_clock_control(return ;if (clock_on) { +dccg35_set_dppclk_rcg (dccg, dpp_inst, false); +/* turn off the DTO and leave phase/modulo at max */ dcn35_set_dppclk_enable (dccg, dpp_inst,1 ); REG_SET_2(DPPCLK_DTO_PARAM[dpp_inst], 0,
@@ -1654,6 +1662,8 @@ static void dccg35_dpp_root_clock_control(REG_SET_2 (DPPCLK_DTO_PARAM [dpp_inst],0 ,DPPCLK0_DTO_PHASE ,0 ,DPPCLK0_DTO_MODULO ,1 ); +/*we have this in hwss: disable_plane*/ +//dccg35_set_dppclk_rcg(dccg, dpp_inst, true); } dccg->dpp_clock_gated[dpp_inst] = !clock_on;
drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c +14 -7
@@ -241,11 +241,6 @@ void dcn35_init_hw(struct dc *dc) dc->res_pool->hubbub->funcs->allow_self_refresh_control (dc->res_pool->hubbub, !dc->res_pool->hubbub->ctx->dc->debug.disable_stutter); } -if (res_pool->dccg->funcs->dccg_root_gate_disable_control) { -for (i =0 ; i < res_pool->pipe_count; i++) - res_pool->dccg->funcs->dccg_root_gate_disable_control (res_pool->dccg, i,0 ); - } -for (i =0 ; i < res_pool->audio_count; i++) {struct audio *audio = res_pool->audios[i];
@@ -885,12 +880,18 @@ void dcn35_init_pipes(struct dc *dc, struct dc_state *context)void dcn35_enable_plane (struct dc *dc,struct pipe_ctx *pipe_ctx,struct dc_state *context) { +struct dpp *dpp = pipe_ctx->plane_res.dpp; +struct dccg *dccg = dc->res_pool->dccg; + +/* enable DCFCLK current DCHUB */ pipe_ctx->plane_res.hubp->funcs->hubp_clk_cntl (pipe_ctx->plane_res.hubp, true);/* initialize HUBP on power up */ pipe_ctx->plane_res.hubp->funcs->hubp_init (pipe_ctx->plane_res.hubp); - +/*make sure DPPCLK is on*/ + dccg->funcs->dccg_root_gate_disable_control (dccg, dpp->inst, true); + dpp->funcs->dpp_dppclk_control (dpp, false, true);/* make sure OPP_PIPE_CLOCK_EN = 1 */ pipe_ctx->stream_res.opp->funcs->opp_pipe_clock_control( pipe_ctx->stream_res.opp,
@@ -907,6 +908,7 @@ void dcn35_enable_plane(struct dc *dc, struct pipe_ctx *pipe_ctx,// Program system aperture settings pipe_ctx->plane_res.hubp->funcs->hubp_set_vm_system_aperture_settings (pipe_ctx->plane_res.hubp, &apt); } +//DC_LOG_DEBUG("%s: dpp_inst(%d) =\n", __func__, dpp->inst); if (!pipe_ctx->top_pipe && pipe_ctx->plane_state
@@ -922,6 +924,8 @@ void dcn35_plane_atomic_disable(struct dc *dc, struct pipe_ctx *pipe_ctx) {struct hubp *hubp = pipe_ctx->plane_res.hubp;struct dpp *dpp = pipe_ctx->plane_res.dpp; +struct dccg *dccg = dc->res_pool->dccg; + dc->hwss.wait_for_mpcc_disconnect (dc, dc->res_pool, pipe_ctx);
@@ -939,7 +943,8 @@ void dcn35_plane_atomic_disable(struct dc *dc, struct pipe_ctx *pipe_ctx) hubp->funcs->hubp_clk_cntl (hubp, false); dpp->funcs->dpp_dppclk_control (dpp, false, false); -/*to do, need to support both case*/ + dccg->funcs->dccg_root_gate_disable_control (dccg, dpp->inst, false); + hubp->power_gated = true; hubp->funcs->hubp_reset (hubp);
@@ -951,6 +956,8 @@ void dcn35_plane_atomic_disable(struct dc *dc, struct pipe_ctx *pipe_ctx) pipe_ctx->top_pipe =NULL ; pipe_ctx->bottom_pipe =NULL ; pipe_ctx->plane_state =NULL ; +//DC_LOG_DEBUG("%s: dpp_inst(%d)=\n", __func__, dpp->inst); + }void dcn35_disable_plane (struct dc *dc,struct dc_state *state,struct pipe_ctx *pipe_ctx)
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 3/4 drm/amd/display: Insert dccg log for easy debug
In reply to Sasha LevinFrom: Charlene Liu <[email protected]>
[ Upstream commit 35bcc9168f3ce6416cbf3f776758be0937f84cb3 ]
[why]
Log for sequence tracking
Stable-dep-of: cfa0904a35fd ("drm/amd/display: Prevent Gating DTBCLK before It Is Properly Latched")
--- .../amd/display/dc/dccg/dcn35/dcn35_dccg.c | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/display/dc/dccg/dcn35/dcn35_dccg.c +21 -3
@@ -39,6 +39,7 @@#define CTX \ dccg_dcn->base.ctx +#include "logger_types.h" #define DC_LOGGER \ dccg->ctx->logger
@@ -1132,7 +1133,7 @@ static void dcn35_set_dppclk_enable(struct dccg *dccg,default :break ; } -//DC_LOG_DEBUG("%s: dpp_inst(%d) DPPCLK_EN = %d\n", __func__, dpp_inst, enable); +DC_LOG_DEBUG ("%s: dpp_inst(%d) DPPCLK_EN = %d\n" , __func__, dpp_inst, enable); }
@@ -1400,6 +1401,10 @@ static void dccg35_set_dtbclk_dto(* PIPEx_DTO_SRC_SEL should not be programmed during DTBCLK update since OTG may still be on, and the * programming is handled in program_pix_clk() regardless, so it can be removed from here. */ +DC_LOG_DEBUG ("%s: OTG%d DTBCLK DTO enabled: pixclk_khz=%d, ref_dtbclk_khz=%d, req_dtbclk_khz=%d, phase=%d, modulo=%d\n" , + __func__, params->otg_inst, params->pixclk_khz, + params->ref_dtbclk_khz, req_dtbclk_khz, phase, modulo); + }else {switch (params->otg_inst) {case 0 :
@@ -1425,6 +1430,8 @@ static void dccg35_set_dtbclk_dto(REG_WRITE (DTBCLK_DTO_MODULO [params->otg_inst],0 );REG_WRITE (DTBCLK_DTO_PHASE [params->otg_inst],0 ); + +DC_LOG_DEBUG ("%s: OTG%d DTBCLK DTO disabled\n" , __func__, params->otg_inst); } }
@@ -1469,6 +1476,8 @@ static void dccg35_set_dpstreamclk(BREAK_TO_DEBUGGER ();return ; } +DC_LOG_DEBUG ("%s: dp_hpo_inst(%d) DPSTREAMCLK_EN = %d, DPSTREAMCLK_SRC_SEL = %d\n" , + __func__, dp_hpo_inst, (src ==REFCLK ) ?0 :1 , otg_inst); }
@@ -1508,6 +1517,8 @@ static void dccg35_set_dpstreamclk_root_clock_gating(BREAK_TO_DEBUGGER ();return ; } +DC_LOG_DEBUG ("%s: dp_hpo_inst(%d) DPSTREAMCLK_ROOT_GATE_DISABLE = %d\n" , + __func__, dp_hpo_inst, enable ?1 :0 ); }
@@ -1547,7 +1558,7 @@ static void dccg35_set_physymclk_root_clock_gating(BREAK_TO_DEBUGGER ();return ; } -//DC_LOG_DEBUG("%s: dpp_inst(%d) PHYESYMCLK_ROOT_GATE_DISABLE:\n", __func__, phy_inst, enable ? 0 : 1); +DC_LOG_DEBUG ("%s: dpp_inst(%d) PHYESYMCLK_ROOT_GATE_DISABLE: %d\n" , __func__, phy_inst, enable ?0 :1 ); }
@@ -1620,6 +1631,8 @@ static void dccg35_set_physymclk(BREAK_TO_DEBUGGER ();return ; } +DC_LOG_DEBUG ("%s: phy_inst(%d) PHYxSYMCLK_EN = %d, PHYxSYMCLK_SRC_SEL = %d\n" , + __func__, phy_inst, force_enable ?1 :0 , clk_src); } static void dccg35_set_valid_pixel_rate(
@@ -1667,6 +1680,7 @@ static void dccg35_dpp_root_clock_control( } dccg->dpp_clock_gated[dpp_inst] = !clock_on; +DC_LOG_DEBUG ("%s: dpp_inst(%d) clock_on = %d\n" , __func__, dpp_inst, clock_on); } static void dccg35_disable_symclk32_se(
@@ -1725,6 +1739,7 @@ static void dccg35_disable_symclk32_se(BREAK_TO_DEBUGGER ();return ; } + }static void dccg35_init_cb (struct dccg *dccg)
@@ -1732,7 +1747,6 @@ static void dccg35_init_cb(struct dccg *dccg) (void )dccg;/* Any RCG should be done when driver enter low power mode*/ } -void dccg35_init (struct dccg *dccg) {int otg_inst;
@@ -1747,6 +1761,8 @@ void dccg35_init(struct dccg *dccg)for (otg_inst =0 ; otg_inst <2 ; otg_inst++) {dccg31_disable_symclk32_le (dccg, otg_inst);dccg31_set_symclk32_le_root_clock_gating (dccg, otg_inst, false); +DC_LOG_DEBUG ("%s: OTG%d SYMCLK32_LE disabled and root clock gating disabled\n" , + __func__, otg_inst); }// if (dccg->ctx->dc->debug.root_clock_optimization.bits.symclk32_se)
@@ -1759,6 +1775,8 @@ void dccg35_init(struct dccg *dccg)dccg35_set_dpstreamclk (dccg,REFCLK , otg_inst, otg_inst);dccg35_set_dpstreamclk_root_clock_gating (dccg, otg_inst, false); +DC_LOG_DEBUG ("%s: OTG%d DPSTREAMCLK disabled and root clock gating disabled\n" , + __func__, otg_inst); }/*
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 4/4 drm/amd/display: Prevent Gating DTBCLK before It Is Properly Latched
In reply to Sasha LevinFrom: Fangzhi Zuo <[email protected]>
[ Upstream commit cfa0904a35fd0231f4d05da0190f0a22ed881cce ]
[why]
1. With allow_0_dtb_clk enabled, the time required to latch DTBCLK to 600 MHz depends on the SMU. If DTBCLK is not latched to 600 MHz before set_mode completes, gating DTBCLK causes the DP2 sink to lose its clock source.
2. The existing DTBCLK gating sequence ungates DTBCLK based on both pix_clk and ref_dtbclk, but gates DTBCLK when either pix_clk or ref_dtbclk is zero.pix_clk can be zero outside the set_mode sequence before DTBCLK is properly latched, which can lead to DTBCLK being gated by mistake.
[how]
Consider both pixel_clk and ref_dtbclk when determining when it is safe to gate DTBCLK; this is more accurate.
--- drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c | 4 +++- drivers/gpu/drm/amd/display/dc/dccg/dcn35/dcn35_dccg.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c +3 -1
@@ -377,6 +377,8 @@ void dcn35_update_clocks(struct clk_mgr *clk_mgr_base, display_count =dcn35_get_active_display_cnt_wa (dc, context, &all_active_disps);if (new_clocks->dtbclk_en && !new_clocks->ref_dtbclk_khz) new_clocks->ref_dtbclk_khz =600000 ; +else if (!new_clocks->dtbclk_en && new_clocks->ref_dtbclk_khz >590000 ) + new_clocks->ref_dtbclk_khz =0 ;/* * if it is safe to lower, but we are already in the lower state, we don't have to do anything
@@ -418,7 +420,7 @@ void dcn35_update_clocks(struct clk_mgr *clk_mgr_base, actual_dtbclk =REG_READ (CLK1_CLK4_CURRENT_CNT ); -if (actual_dtbclk) { +if (actual_dtbclk >590000 ) { clk_mgr_base->clks.ref_dtbclk_khz = new_clocks->ref_dtbclk_khz; clk_mgr_base->clks.dtbclk_en = new_clocks->dtbclk_en; }
drivers/gpu/drm/amd/display/dc/dccg/dcn35/dcn35_dccg.c +1 -1
@@ -1405,7 +1405,7 @@ static void dccg35_set_dtbclk_dto( __func__, params->otg_inst, params->pixclk_khz, params->ref_dtbclk_khz, req_dtbclk_khz, phase, modulo); - }else { + }else if (!params->ref_dtbclk_khz && !req_dtbclk_khz) {switch (params->otg_inst) {case 0 :REG_UPDATE (DCCG_GATE_DISABLE_CNTL5 ,DTBCLK_P0_GATE_DISABLE ,0 );
Signature · 1 line
2.51.0