drm/amd/display: revert to hacking bounding box for pipe split
Directly editing pipe config outside of formula is error prone and results in higher clocks being used when splitting. For this reason we reverted to using bounding box hacking to split. Since sometimes this erroneusly results in higher dpm being required we unhack the bounding box and recalculate to allow dpm0 is possible. Side effect is we will lose some stutter efficiency in non dpm0 cases. This is not a big concern since increased stutter efficiency saves an order of magnitude less power than lower dpm. Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> Acked-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
701ed303b2
commit
c7d76452d2
@ -626,7 +626,7 @@ static bool dcn_bw_apply_registry_override(struct dc *dc)
|
||||
return updated;
|
||||
}
|
||||
|
||||
void hack_disable_optional_pipe_split(struct dcn_bw_internal_vars *v)
|
||||
static void hack_disable_optional_pipe_split(struct dcn_bw_internal_vars *v)
|
||||
{
|
||||
/*
|
||||
* disable optional pipe split by lower dispclk bounding box
|
||||
@ -635,7 +635,7 @@ void hack_disable_optional_pipe_split(struct dcn_bw_internal_vars *v)
|
||||
v->max_dispclk[0] = v->max_dppclk_vmin0p65;
|
||||
}
|
||||
|
||||
void hack_force_pipe_split(struct dcn_bw_internal_vars *v,
|
||||
static void hack_force_pipe_split(struct dcn_bw_internal_vars *v,
|
||||
unsigned int pixel_rate_khz)
|
||||
{
|
||||
float pixel_rate_mhz = pixel_rate_khz / 1000;
|
||||
@ -648,25 +648,20 @@ void hack_force_pipe_split(struct dcn_bw_internal_vars *v,
|
||||
v->max_dppclk[0] = pixel_rate_mhz;
|
||||
}
|
||||
|
||||
void hack_bounding_box(struct dcn_bw_internal_vars *v,
|
||||
static void hack_bounding_box(struct dcn_bw_internal_vars *v,
|
||||
struct dc_debug *dbg,
|
||||
struct dc_state *context)
|
||||
{
|
||||
if (dbg->pipe_split_policy == MPC_SPLIT_AVOID) {
|
||||
if (dbg->pipe_split_policy == MPC_SPLIT_AVOID)
|
||||
hack_disable_optional_pipe_split(v);
|
||||
}
|
||||
|
||||
if (dbg->pipe_split_policy == MPC_SPLIT_AVOID_MULT_DISP &&
|
||||
context->stream_count >= 2) {
|
||||
context->stream_count >= 2)
|
||||
hack_disable_optional_pipe_split(v);
|
||||
}
|
||||
|
||||
if (context->stream_count == 1 &&
|
||||
dbg->force_single_disp_pipe_split) {
|
||||
struct dc_stream_state *stream0 = context->streams[0];
|
||||
|
||||
hack_force_pipe_split(v, stream0->timing.pix_clk_khz);
|
||||
}
|
||||
dbg->force_single_disp_pipe_split)
|
||||
hack_force_pipe_split(v, context->streams[0]->timing.pix_clk_khz);
|
||||
}
|
||||
|
||||
bool dcn_validate_bandwidth(
|
||||
@ -800,23 +795,10 @@ bool dcn_validate_bandwidth(
|
||||
v->phyclk_per_state[2] = v->phyclkv_nom0p8;
|
||||
v->phyclk_per_state[1] = v->phyclkv_mid0p72;
|
||||
v->phyclk_per_state[0] = v->phyclkv_min0p65;
|
||||
|
||||
hack_bounding_box(v, &dc->debug, context);
|
||||
|
||||
if (v->voltage_override == dcn_bw_v_max0p9) {
|
||||
v->voltage_override_level = number_of_states - 1;
|
||||
} else if (v->voltage_override == dcn_bw_v_nom0p8) {
|
||||
v->voltage_override_level = number_of_states - 2;
|
||||
} else if (v->voltage_override == dcn_bw_v_mid0p72) {
|
||||
v->voltage_override_level = number_of_states - 3;
|
||||
} else {
|
||||
v->voltage_override_level = 0;
|
||||
}
|
||||
v->synchronized_vblank = dcn_bw_no;
|
||||
v->ta_pscalculation = dcn_bw_override;
|
||||
v->allow_different_hratio_vratio = dcn_bw_yes;
|
||||
|
||||
|
||||
for (i = 0, input_idx = 0; i < pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
|
||||
|
||||
@ -949,8 +931,19 @@ bool dcn_validate_bandwidth(
|
||||
v->number_of_active_planes = input_idx;
|
||||
|
||||
scaler_settings_calculation(v);
|
||||
|
||||
hack_bounding_box(v, &dc->debug, context);
|
||||
|
||||
mode_support_and_system_configuration(v);
|
||||
|
||||
/* Unhack dppclk: dont bother with trying to pipe split if we cannot maintain dpm0 */
|
||||
if (v->voltage_level != 0
|
||||
&& context->stream_count == 1
|
||||
&& dc->debug.force_single_disp_pipe_split) {
|
||||
v->max_dppclk[0] = v->max_dppclk_vmin0p65;
|
||||
mode_support_and_system_configuration(v);
|
||||
}
|
||||
|
||||
if (v->voltage_level == 0 &&
|
||||
(dc->debug.sr_exit_time_dpm0_ns
|
||||
|| dc->debug.sr_enter_plus_exit_time_dpm0_ns)) {
|
||||
|
Loading…
Reference in New Issue
Block a user