mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-07 00:59:06 +00:00
drm/amd/display: Update DTBCLK for DCN32
[ Upstream commit 128c1ca030
]
[Why&How]
- Implement interface to program DTBCLK DTO’s
according to reference DTBCLK returned by PMFW
- This is required because DTO programming
requires exact DTBCLK reference freq or it could
result in underflow
Acked-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: Alvin Lee <Alvin.Lee2@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>
This commit is contained in:
parent
86fd1f1ec4
commit
dd2e5d3f80
1 changed files with 27 additions and 0 deletions
|
@ -233,6 +233,32 @@ void dcn32_init_clocks(struct clk_mgr *clk_mgr_base)
|
|||
DC_FP_END();
|
||||
}
|
||||
|
||||
static void dcn32_update_clocks_update_dtb_dto(struct clk_mgr_internal *clk_mgr,
|
||||
struct dc_state *context,
|
||||
int ref_dtbclk_khz)
|
||||
{
|
||||
struct dccg *dccg = clk_mgr->dccg;
|
||||
uint32_t tg_mask = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < clk_mgr->base.ctx->dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
|
||||
struct dtbclk_dto_params dto_params = {0};
|
||||
|
||||
/* use mask to program DTO once per tg */
|
||||
if (pipe_ctx->stream_res.tg &&
|
||||
!(tg_mask & (1 << pipe_ctx->stream_res.tg->inst))) {
|
||||
tg_mask |= (1 << pipe_ctx->stream_res.tg->inst);
|
||||
|
||||
dto_params.otg_inst = pipe_ctx->stream_res.tg->inst;
|
||||
dto_params.ref_dtbclk_khz = ref_dtbclk_khz;
|
||||
|
||||
dccg->funcs->set_dtbclk_dto(clk_mgr->dccg, &dto_params);
|
||||
//dccg->funcs->set_audio_dtbclk_dto(clk_mgr->dccg, &dto_params);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Since DPPCLK request to PMFW needs to be exact (due to DPP DTO programming),
|
||||
* update DPPCLK to be the exact frequency that will be set after the DPPCLK
|
||||
* divider is updated. This will prevent rounding issues that could cause DPP
|
||||
|
@ -570,6 +596,7 @@ static void dcn32_update_clocks(struct clk_mgr *clk_mgr_base,
|
|||
/* DCCG requires KHz precision for DTBCLK */
|
||||
clk_mgr_base->clks.ref_dtbclk_khz =
|
||||
dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_DTBCLK, khz_to_mhz_ceil(new_clocks->ref_dtbclk_khz));
|
||||
dcn32_update_clocks_update_dtb_dto(clk_mgr, context, clk_mgr_base->clks.ref_dtbclk_khz);
|
||||
}
|
||||
|
||||
if (dc->config.forced_clocks == false || (force_reset && safe_to_lower)) {
|
||||
|
|
Loading…
Reference in a new issue