Commit fa896813 authored by Isabel Zhang's avatar Isabel Zhang Committed by Alex Deucher

drm/amd/display: Prevent freesync power optimization during validation

[Why]
Due to the freesync power optimization increasing vtotal, the driver
believes that MPO is supported. MPO is turned on. Freesync then
exits, MPO can no longer be supported and immediate flip fails. This
causes corruption on the panel.

[How]
Avoid the freesync optimization when doing validation so in the case
freesync exits, driver can still support the configuration.
Signed-off-by: default avatarIsabel Zhang <isabel.zhang@amd.com>
Acked-by: default avatarBindu Ramamurthy <bindu.r@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 103cd0b1
...@@ -2012,7 +2012,10 @@ void dcn20_populate_dml_writeback_from_context( ...@@ -2012,7 +2012,10 @@ void dcn20_populate_dml_writeback_from_context(
} }
int dcn20_populate_dml_pipes_from_context( int dcn20_populate_dml_pipes_from_context(
struct dc *dc, struct dc_state *context, display_e2e_pipe_params_st *pipes) struct dc *dc,
struct dc_state *context,
display_e2e_pipe_params_st *pipes,
bool fast_validate)
{ {
int pipe_cnt, i; int pipe_cnt, i;
bool synchronized_vblank = true; bool synchronized_vblank = true;
...@@ -2050,6 +2053,7 @@ int dcn20_populate_dml_pipes_from_context( ...@@ -2050,6 +2053,7 @@ int dcn20_populate_dml_pipes_from_context(
v_total = timing->v_total; v_total = timing->v_total;
front_porch = timing->v_front_porch; front_porch = timing->v_front_porch;
/* todo: /* todo:
pipes[pipe_cnt].pipe.src.dynamic_metadata_enable = 0; pipes[pipe_cnt].pipe.src.dynamic_metadata_enable = 0;
pipes[pipe_cnt].pipe.src.dcc = 0; pipes[pipe_cnt].pipe.src.dcc = 0;
...@@ -2827,7 +2831,8 @@ bool dcn20_fast_validate_bw( ...@@ -2827,7 +2831,8 @@ bool dcn20_fast_validate_bw(
display_e2e_pipe_params_st *pipes, display_e2e_pipe_params_st *pipes,
int *pipe_cnt_out, int *pipe_cnt_out,
int *pipe_split_from, int *pipe_split_from,
int *vlevel_out) int *vlevel_out,
bool fast_validate)
{ {
bool out = false; bool out = false;
int split[MAX_PIPES] = { 0 }; int split[MAX_PIPES] = { 0 };
...@@ -2839,7 +2844,7 @@ bool dcn20_fast_validate_bw( ...@@ -2839,7 +2844,7 @@ bool dcn20_fast_validate_bw(
dcn20_merge_pipes_for_validate(dc, context); dcn20_merge_pipes_for_validate(dc, context);
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes); pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
*pipe_cnt_out = pipe_cnt; *pipe_cnt_out = pipe_cnt;
...@@ -2943,7 +2948,8 @@ static void dcn20_calculate_wm( ...@@ -2943,7 +2948,8 @@ static void dcn20_calculate_wm(
display_e2e_pipe_params_st *pipes, display_e2e_pipe_params_st *pipes,
int *out_pipe_cnt, int *out_pipe_cnt,
int *pipe_split_from, int *pipe_split_from,
int vlevel) int vlevel,
bool fast_validate)
{ {
int pipe_cnt, i, pipe_idx; int pipe_cnt, i, pipe_idx;
...@@ -2988,10 +2994,10 @@ static void dcn20_calculate_wm( ...@@ -2988,10 +2994,10 @@ static void dcn20_calculate_wm(
if (pipe_cnt != pipe_idx) { if (pipe_cnt != pipe_idx) {
if (dc->res_pool->funcs->populate_dml_pipes) if (dc->res_pool->funcs->populate_dml_pipes)
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc,
context, pipes); context, pipes, fast_validate);
else else
pipe_cnt = dcn20_populate_dml_pipes_from_context(dc, pipe_cnt = dcn20_populate_dml_pipes_from_context(dc,
context, pipes); context, pipes, fast_validate);
} }
*out_pipe_cnt = pipe_cnt; *out_pipe_cnt = pipe_cnt;
...@@ -3136,7 +3142,7 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co ...@@ -3136,7 +3142,7 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co
BW_VAL_TRACE_COUNT(); BW_VAL_TRACE_COUNT();
out = dcn20_fast_validate_bw(dc, context, pipes, &pipe_cnt, pipe_split_from, &vlevel); out = dcn20_fast_validate_bw(dc, context, pipes, &pipe_cnt, pipe_split_from, &vlevel, fast_validate);
if (pipe_cnt == 0) if (pipe_cnt == 0)
goto validate_out; goto validate_out;
...@@ -3151,7 +3157,7 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co ...@@ -3151,7 +3157,7 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co
goto validate_out; goto validate_out;
} }
dcn20_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel); dcn20_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel, fast_validate);
dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel); dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel);
BW_VAL_TRACE_END_WATERMARKS(); BW_VAL_TRACE_END_WATERMARKS();
......
...@@ -50,7 +50,10 @@ unsigned int dcn20_calc_max_scaled_time( ...@@ -50,7 +50,10 @@ unsigned int dcn20_calc_max_scaled_time(
enum mmhubbub_wbif_mode mode, enum mmhubbub_wbif_mode mode,
unsigned int urgent_watermark); unsigned int urgent_watermark);
int dcn20_populate_dml_pipes_from_context( int dcn20_populate_dml_pipes_from_context(
struct dc *dc, struct dc_state *context, display_e2e_pipe_params_st *pipes); struct dc *dc,
struct dc_state *context,
display_e2e_pipe_params_st *pipes,
bool fast_validate);
struct pipe_ctx *dcn20_acquire_idle_pipe_for_layer( struct pipe_ctx *dcn20_acquire_idle_pipe_for_layer(
struct dc_state *state, struct dc_state *state,
const struct resource_pool *pool, const struct resource_pool *pool,
...@@ -155,7 +158,8 @@ bool dcn20_fast_validate_bw( ...@@ -155,7 +158,8 @@ bool dcn20_fast_validate_bw(
display_e2e_pipe_params_st *pipes, display_e2e_pipe_params_st *pipes,
int *pipe_cnt_out, int *pipe_cnt_out,
int *pipe_split_from, int *pipe_split_from,
int *vlevel_out); int *vlevel_out,
bool fast_validate);
void dcn20_calculate_dlg_params( void dcn20_calculate_dlg_params(
struct dc *dc, struct dc_state *context, struct dc *dc, struct dc_state *context,
display_e2e_pipe_params_st *pipes, display_e2e_pipe_params_st *pipes,
......
...@@ -704,7 +704,10 @@ static const struct dcn10_stream_encoder_mask se_mask = { ...@@ -704,7 +704,10 @@ static const struct dcn10_stream_encoder_mask se_mask = {
static void dcn21_pp_smu_destroy(struct pp_smu_funcs **pp_smu); static void dcn21_pp_smu_destroy(struct pp_smu_funcs **pp_smu);
static int dcn21_populate_dml_pipes_from_context( static int dcn21_populate_dml_pipes_from_context(
struct dc *dc, struct dc_state *context, display_e2e_pipe_params_st *pipes); struct dc *dc,
struct dc_state *context,
display_e2e_pipe_params_st *pipes,
bool fast_validate);
static struct input_pixel_processor *dcn21_ipp_create( static struct input_pixel_processor *dcn21_ipp_create(
struct dc_context *ctx, uint32_t inst) struct dc_context *ctx, uint32_t inst)
...@@ -1091,7 +1094,8 @@ void dcn21_calculate_wm( ...@@ -1091,7 +1094,8 @@ void dcn21_calculate_wm(
display_e2e_pipe_params_st *pipes, display_e2e_pipe_params_st *pipes,
int *out_pipe_cnt, int *out_pipe_cnt,
int *pipe_split_from, int *pipe_split_from,
int vlevel_req) int vlevel_req,
bool fast_validate)
{ {
int pipe_cnt, i, pipe_idx; int pipe_cnt, i, pipe_idx;
int vlevel, vlevel_max; int vlevel, vlevel_max;
...@@ -1133,10 +1137,10 @@ void dcn21_calculate_wm( ...@@ -1133,10 +1137,10 @@ void dcn21_calculate_wm(
if (pipe_cnt != pipe_idx) { if (pipe_cnt != pipe_idx) {
if (dc->res_pool->funcs->populate_dml_pipes) if (dc->res_pool->funcs->populate_dml_pipes)
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc,
context, pipes); context, pipes, fast_validate);
else else
pipe_cnt = dcn21_populate_dml_pipes_from_context(dc, pipe_cnt = dcn21_populate_dml_pipes_from_context(dc,
context, pipes); context, pipes, fast_validate);
} }
*out_pipe_cnt = pipe_cnt; *out_pipe_cnt = pipe_cnt;
...@@ -1177,7 +1181,8 @@ static bool dcn21_fast_validate_bw( ...@@ -1177,7 +1181,8 @@ static bool dcn21_fast_validate_bw(
display_e2e_pipe_params_st *pipes, display_e2e_pipe_params_st *pipes,
int *pipe_cnt_out, int *pipe_cnt_out,
int *pipe_split_from, int *pipe_split_from,
int *vlevel_out) int *vlevel_out,
bool fast_validate)
{ {
bool out = false; bool out = false;
int split[MAX_PIPES] = { 0 }; int split[MAX_PIPES] = { 0 };
...@@ -1189,7 +1194,7 @@ static bool dcn21_fast_validate_bw( ...@@ -1189,7 +1194,7 @@ static bool dcn21_fast_validate_bw(
dcn20_merge_pipes_for_validate(dc, context); dcn20_merge_pipes_for_validate(dc, context);
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes); pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
*pipe_cnt_out = pipe_cnt; *pipe_cnt_out = pipe_cnt;
...@@ -1339,7 +1344,7 @@ bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context, ...@@ -1339,7 +1344,7 @@ bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context,
/*Unsafe due to current pipe merge and split logic*/ /*Unsafe due to current pipe merge and split logic*/
ASSERT(context != dc->current_state); ASSERT(context != dc->current_state);
out = dcn21_fast_validate_bw(dc, context, pipes, &pipe_cnt, pipe_split_from, &vlevel); out = dcn21_fast_validate_bw(dc, context, pipes, &pipe_cnt, pipe_split_from, &vlevel, fast_validate);
if (pipe_cnt == 0) if (pipe_cnt == 0)
goto validate_out; goto validate_out;
...@@ -1354,7 +1359,7 @@ bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context, ...@@ -1354,7 +1359,7 @@ bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context,
goto validate_out; goto validate_out;
} }
dcn21_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel); dcn21_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel, fast_validate);
dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel); dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel);
BW_VAL_TRACE_END_WATERMARKS(); BW_VAL_TRACE_END_WATERMARKS();
...@@ -1870,9 +1875,12 @@ static uint32_t read_pipe_fuses(struct dc_context *ctx) ...@@ -1870,9 +1875,12 @@ static uint32_t read_pipe_fuses(struct dc_context *ctx)
} }
static int dcn21_populate_dml_pipes_from_context( static int dcn21_populate_dml_pipes_from_context(
struct dc *dc, struct dc_state *context, display_e2e_pipe_params_st *pipes) struct dc *dc,
struct dc_state *context,
display_e2e_pipe_params_st *pipes,
bool fast_validate)
{ {
uint32_t pipe_cnt = dcn20_populate_dml_pipes_from_context(dc, context, pipes); uint32_t pipe_cnt = dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
int i; int i;
for (i = 0; i < pipe_cnt; i++) { for (i = 0; i < pipe_cnt; i++) {
......
...@@ -1451,12 +1451,13 @@ static struct clock_source *dcn30_clock_source_create( ...@@ -1451,12 +1451,13 @@ static struct clock_source *dcn30_clock_source_create(
int dcn30_populate_dml_pipes_from_context( int dcn30_populate_dml_pipes_from_context(
struct dc *dc, struct dc_state *context, struct dc *dc, struct dc_state *context,
display_e2e_pipe_params_st *pipes) display_e2e_pipe_params_st *pipes,
bool fast_validate)
{ {
int i, pipe_cnt; int i, pipe_cnt;
struct resource_context *res_ctx = &context->res_ctx; struct resource_context *res_ctx = &context->res_ctx;
dcn20_populate_dml_pipes_from_context(dc, context, pipes); dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) { for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
if (!res_ctx->pipe_ctx[i].stream) if (!res_ctx->pipe_ctx[i].stream)
...@@ -1996,7 +1997,7 @@ static bool dcn30_internal_validate_bw( ...@@ -1996,7 +1997,7 @@ static bool dcn30_internal_validate_bw(
if (!pipes) if (!pipes)
return false; return false;
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes); pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
if (!pipe_cnt) { if (!pipe_cnt) {
out = true; out = true;
...@@ -2210,7 +2211,7 @@ static bool dcn30_internal_validate_bw( ...@@ -2210,7 +2211,7 @@ static bool dcn30_internal_validate_bw(
} }
if (repopulate_pipes) if (repopulate_pipes)
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes); pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
*vlevel_out = vlevel; *vlevel_out = vlevel;
*pipe_cnt_out = pipe_cnt; *pipe_cnt_out = pipe_cnt;
......
...@@ -65,7 +65,8 @@ void dcn30_populate_dml_writeback_from_context( ...@@ -65,7 +65,8 @@ void dcn30_populate_dml_writeback_from_context(
int dcn30_populate_dml_pipes_from_context( int dcn30_populate_dml_pipes_from_context(
struct dc *dc, struct dc_state *context, struct dc *dc, struct dc_state *context,
display_e2e_pipe_params_st *pipes); display_e2e_pipe_params_st *pipes,
bool fast_validate);
bool dcn30_acquire_post_bldn_3dlut( bool dcn30_acquire_post_bldn_3dlut(
struct resource_context *res_ctx, struct resource_context *res_ctx,
......
...@@ -109,7 +109,8 @@ struct resource_funcs { ...@@ -109,7 +109,8 @@ struct resource_funcs {
int (*populate_dml_pipes)( int (*populate_dml_pipes)(
struct dc *dc, struct dc *dc,
struct dc_state *context, struct dc_state *context,
display_e2e_pipe_params_st *pipes); display_e2e_pipe_params_st *pipes,
bool fast_validate);
enum dc_status (*validate_global)( enum dc_status (*validate_global)(
struct dc *dc, struct dc *dc,
......
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