Commit 39d39a01 authored by Wenjing Liu's avatar Wenjing Liu Committed by Alex Deucher

drm/amd/display: switch to new ODM policy for windowed MPO ODM support

We need to align windowed MPO ODM support on DCN3x with new ODM policy.
Reviewed-by: default avatarJun Lei <jun.lei@amd.com>
Acked-by: default avatarHamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: default avatarWenjing Liu <wenjing.liu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 9d1e1722
......@@ -1885,6 +1885,67 @@ bool dcn32_validate_bandwidth(struct dc *dc,
return out;
}
static bool should_allow_odm_power_optimization(struct dc *dc,
struct dc_state *context)
{
struct dc_stream_state *stream = context->streams[0];
/*
* this debug flag allows us to disable ODM power optimization feature
* unconditionally. we force the feature off if this is set to false.
*/
if (!dc->debug.enable_single_display_2to1_odm_policy)
return false;
/* current design and test coverage is only limited to allow ODM power
* optimization for single stream. Supporting it for multiple streams
* use case would require additional algorithm to decide how to
* optimize power consumption when there are not enough free pipes to
* allocate for all the streams. This level of optimization would
* require multiple attempts of revalidation to make an optimized
* decision. Unfortunately We do not support revalidation flow in
* current version of DML.
*/
if (context->stream_count != 1)
return false;
/*
* Our hardware doesn't support ODM for HDMI TMDS
*/
if (dc_is_hdmi_signal(stream->signal))
return false;
/*
* ODM Combine 2:1 requires horizontal timing divisible by 2 so each
* ODM segment has the same size.
*/
if (!is_h_timing_divisible_by_2(stream))
return false;
/*
* No power benefits if the timing's pixel clock is not high enough to
* raise display clock from minimum power state.
*/
if (stream->timing.pix_clk_100hz * 100 <= DCN3_2_VMIN_DISPCLK_HZ)
return false;
/* the new ODM power optimization feature reduces software design
* limitation and allows ODM power optimization to be supported even
* with presence of overlay planes. The new feature is enabled based on
* enable_windowed_mpo_odm flag. If the flag is not set, we limit our
* feature scope due to previous software design limitation */
if (!dc->config.enable_windowed_mpo_odm) {
if (context->stream_status[0].plane_count != 1)
return false;
if (stream->src.width >= 5120 &&
stream->src.width > stream->dst.width)
return false;
}
return true;
}
int dcn32_populate_dml_pipes_from_context(
struct dc *dc, struct dc_state *context,
display_e2e_pipe_params_st *pipes,
......@@ -1895,35 +1956,20 @@ int dcn32_populate_dml_pipes_from_context(
struct pipe_ctx *pipe = NULL;
bool subvp_in_use = false;
struct dc_crtc_timing *timing;
bool vsr_odm_support = false;
dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
/* Determine whether we will apply ODM 2to1 policy:
* Applies to single display and where the number of planes is less than 3.
* For 3 plane case ( 2 MPO planes ), we will not set the policy for the MPO pipes.
*
/*
* Apply pipe split policy first so we can predict the pipe split correctly
* (dcn32_predict_pipe_split).
*/
for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
if (!res_ctx->pipe_ctx[i].stream)
continue;
pipe = &res_ctx->pipe_ctx[i];
timing = &pipe->stream->timing;
pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_dal;
vsr_odm_support = (res_ctx->pipe_ctx[i].stream->src.width >= 5120 &&
res_ctx->pipe_ctx[i].stream->src.width > res_ctx->pipe_ctx[i].stream->dst.width);
if (context->stream_count == 1 &&
context->stream_status[0].plane_count == 1 &&
!dc_is_hdmi_signal(res_ctx->pipe_ctx[i].stream->signal) &&
is_h_timing_divisible_by_2(res_ctx->pipe_ctx[i].stream) &&
pipe->stream->timing.pix_clk_100hz * 100 > DCN3_2_VMIN_DISPCLK_HZ &&
dc->debug.enable_single_display_2to1_odm_policy &&
!vsr_odm_support) { //excluding 2to1 ODM combine on >= 5k vsr
if (should_allow_odm_power_optimization(dc, context))
pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_2to1;
}
else
pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_dal;
pipe_cnt++;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment