mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-23 14:02:06 -04:00
drm/amd/display: implement dc_mode_memclk
why: Need interface to lower clocks when in dc (power save) mode. Must be able to work with p_state unsupported cases Can cause flicker when OS notifies us of dc state change how: added dal3 interface for KMD added pathway to query smu for this softmax added blank before clock change to override underflow added logic to change clk based on pstatesupport and softmax added logic in prepare/optimize_bw to conform while changing clocks Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> Acked-by: Pavle Kotarac <Pavle.Kotarac@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Martin Leung <Martin.Leung@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
b477143566
commit
4866b0bfea
@@ -928,6 +928,16 @@ bool hubp2_is_flip_pending(struct hubp *hubp)
|
||||
}
|
||||
|
||||
void hubp2_set_blank(struct hubp *hubp, bool blank)
|
||||
{
|
||||
hubp2_set_blank_regs(hubp, blank);
|
||||
|
||||
if (blank) {
|
||||
hubp->mpcc_id = 0xf;
|
||||
hubp->opp_id = OPP_ID_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
void hubp2_set_blank_regs(struct hubp *hubp, bool blank)
|
||||
{
|
||||
struct dcn20_hubp *hubp2 = TO_DCN20_HUBP(hubp);
|
||||
uint32_t blank_en = blank ? 1 : 0;
|
||||
@@ -950,9 +960,6 @@ void hubp2_set_blank(struct hubp *hubp, bool blank)
|
||||
HUBP_NO_OUTSTANDING_REQ, 1,
|
||||
1, 200);
|
||||
}
|
||||
|
||||
hubp->mpcc_id = 0xf;
|
||||
hubp->opp_id = OPP_ID_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1602,6 +1609,7 @@ static struct hubp_funcs dcn20_hubp_funcs = {
|
||||
.hubp_setup_interdependent = hubp2_setup_interdependent,
|
||||
.hubp_set_vm_system_aperture_settings = hubp2_set_vm_system_aperture_settings,
|
||||
.set_blank = hubp2_set_blank,
|
||||
.set_blank_regs = hubp2_set_blank_regs,
|
||||
.dcc_control = hubp2_dcc_control,
|
||||
.mem_program_viewport = min_set_viewport,
|
||||
.set_cursor_attributes = hubp2_cursor_set_attributes,
|
||||
|
||||
@@ -330,6 +330,7 @@ void hubp2_program_surface_config(
|
||||
bool hubp2_is_flip_pending(struct hubp *hubp);
|
||||
|
||||
void hubp2_set_blank(struct hubp *hubp, bool blank);
|
||||
void hubp2_set_blank_regs(struct hubp *hubp, bool blank);
|
||||
|
||||
void hubp2_cursor_set_position(
|
||||
struct hubp *hubp,
|
||||
|
||||
@@ -615,6 +615,11 @@ void dcn20_disable_plane(struct dc *dc, struct pipe_ctx *pipe_ctx)
|
||||
pipe_ctx->pipe_idx);
|
||||
}
|
||||
|
||||
void dcn20_disable_pixel_data(struct dc *dc, struct pipe_ctx *pipe_ctx, bool blank)
|
||||
{
|
||||
dcn20_blank_pixel_data(dc, pipe_ctx, blank);
|
||||
}
|
||||
|
||||
static int calc_mpc_flow_ctrl_cnt(const struct dc_stream_state *stream,
|
||||
int opp_cnt)
|
||||
{
|
||||
@@ -1840,6 +1845,11 @@ void dcn20_optimize_bandwidth(
|
||||
dc->res_pool->ref_clocks.dchub_ref_clock_inKhz / 1000,
|
||||
true);
|
||||
|
||||
if (dc->clk_mgr->dc_mode_softmax_enabled)
|
||||
if (dc->clk_mgr->clks.dramclk_khz > dc->clk_mgr->bw_params->dc_mode_softmax_memclk * 1000 &&
|
||||
context->bw_ctx.bw.dcn.clk.dramclk_khz <= dc->clk_mgr->bw_params->dc_mode_softmax_memclk * 1000)
|
||||
dc->clk_mgr->funcs->set_max_memclk(dc->clk_mgr, dc->clk_mgr->bw_params->dc_mode_softmax_memclk);
|
||||
|
||||
dc->clk_mgr->funcs->update_clocks(
|
||||
dc->clk_mgr,
|
||||
context,
|
||||
|
||||
@@ -53,6 +53,10 @@ void dcn20_enable_stream(struct pipe_ctx *pipe_ctx);
|
||||
void dcn20_unblank_stream(struct pipe_ctx *pipe_ctx,
|
||||
struct dc_link_settings *link_settings);
|
||||
void dcn20_disable_plane(struct dc *dc, struct pipe_ctx *pipe_ctx);
|
||||
void dcn20_disable_pixel_data(
|
||||
struct dc *dc,
|
||||
struct pipe_ctx *pipe_ctx,
|
||||
bool blank);
|
||||
void dcn20_blank_pixel_data(
|
||||
struct dc *dc,
|
||||
struct pipe_ctx *pipe_ctx,
|
||||
|
||||
Reference in New Issue
Block a user