Commit fd9978aa authored by Alvin Lee's avatar Alvin Lee Committed by Alex Deucher

drm/amd/display: Don't overwrite subvp pipe info in fast updates

[Description]
- This is a workaround to avoid concurrency issues -- a fast update
  creates a shallow copy of the dc current_state, and removes all
  subvp/phantom related flags.
- We want to prevent the fast update thread from removing those
  flags in case there's another thread running that requires
  the info for proper programming
Reviewed-by: default avatarJun Lei <Jun.Lei@amd.com>
Acked-by: default avatarJasdeep Dhillon <jdhillon@amd.com>
Signed-off-by: default avatarAlvin Lee <Alvin.Lee2@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 6609141c
...@@ -3061,7 +3061,7 @@ static bool update_planes_and_stream_state(struct dc *dc, ...@@ -3061,7 +3061,7 @@ static bool update_planes_and_stream_state(struct dc *dc,
* Ensures that we have enough pipes for newly added MPO planes * Ensures that we have enough pipes for newly added MPO planes
*/ */
if (dc->res_pool->funcs->remove_phantom_pipes) if (dc->res_pool->funcs->remove_phantom_pipes)
dc->res_pool->funcs->remove_phantom_pipes(dc, context); dc->res_pool->funcs->remove_phantom_pipes(dc, context, false);
/*remove old surfaces from context */ /*remove old surfaces from context */
if (!dc_rem_all_planes_for_stream(dc, stream, context)) { if (!dc_rem_all_planes_for_stream(dc, stream, context)) {
......
...@@ -1743,7 +1743,7 @@ void dcn32_retain_phantom_pipes(struct dc *dc, struct dc_state *context) ...@@ -1743,7 +1743,7 @@ void dcn32_retain_phantom_pipes(struct dc *dc, struct dc_state *context)
} }
// return true if removed piped from ctx, false otherwise // return true if removed piped from ctx, false otherwise
bool dcn32_remove_phantom_pipes(struct dc *dc, struct dc_state *context) bool dcn32_remove_phantom_pipes(struct dc *dc, struct dc_state *context, bool fast_update)
{ {
int i; int i;
bool removed_pipe = false; bool removed_pipe = false;
...@@ -1770,14 +1770,23 @@ bool dcn32_remove_phantom_pipes(struct dc *dc, struct dc_state *context) ...@@ -1770,14 +1770,23 @@ bool dcn32_remove_phantom_pipes(struct dc *dc, struct dc_state *context)
removed_pipe = true; removed_pipe = true;
} }
// Clear all phantom stream info /* For non-full updates, a shallow copy of the current state
if (pipe->stream) { * is created. In this case we don't want to erase the current
pipe->stream->mall_stream_config.type = SUBVP_NONE; * state (there can be 2 HIRQL threads, one in flip, and one in
pipe->stream->mall_stream_config.paired_stream = NULL; * checkMPO) that can cause a race condition.
} *
* This is just a workaround, needs a proper fix.
*/
if (!fast_update) {
// Clear all phantom stream info
if (pipe->stream) {
pipe->stream->mall_stream_config.type = SUBVP_NONE;
pipe->stream->mall_stream_config.paired_stream = NULL;
}
if (pipe->plane_state) { if (pipe->plane_state) {
pipe->plane_state->is_phantom = false; pipe->plane_state->is_phantom = false;
}
} }
} }
return removed_pipe; return removed_pipe;
...@@ -1950,23 +1959,28 @@ int dcn32_populate_dml_pipes_from_context( ...@@ -1950,23 +1959,28 @@ int dcn32_populate_dml_pipes_from_context(
pipes[pipe_cnt].pipe.src.unbounded_req_mode = false; pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
pipes[pipe_cnt].pipe.scale_ratio_depth.lb_depth = dm_lb_19; pipes[pipe_cnt].pipe.scale_ratio_depth.lb_depth = dm_lb_19;
switch (pipe->stream->mall_stream_config.type) { /* Only populate DML input with subvp info for full updates.
case SUBVP_MAIN: * This is just a workaround -- needs a proper fix.
pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_sub_viewport; */
subvp_in_use = true; if (!fast_validate) {
break; switch (pipe->stream->mall_stream_config.type) {
case SUBVP_PHANTOM: case SUBVP_MAIN:
pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_phantom_pipe; pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_sub_viewport;
pipes[pipe_cnt].pipe.src.use_mall_for_static_screen = dm_use_mall_static_screen_disable; subvp_in_use = true;
// Disallow unbounded req for SubVP according to DCHUB programming guide break;
pipes[pipe_cnt].pipe.src.unbounded_req_mode = false; case SUBVP_PHANTOM:
break; pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_phantom_pipe;
case SUBVP_NONE: pipes[pipe_cnt].pipe.src.use_mall_for_static_screen = dm_use_mall_static_screen_disable;
pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_disable; // Disallow unbounded req for SubVP according to DCHUB programming guide
pipes[pipe_cnt].pipe.src.use_mall_for_static_screen = dm_use_mall_static_screen_disable; pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
break; break;
default: case SUBVP_NONE:
break; pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_disable;
pipes[pipe_cnt].pipe.src.use_mall_for_static_screen = dm_use_mall_static_screen_disable;
break;
default:
break;
}
} }
pipes[pipe_cnt].dout.dsc_input_bpc = 0; pipes[pipe_cnt].dout.dsc_input_bpc = 0;
......
...@@ -81,7 +81,7 @@ bool dcn32_release_post_bldn_3dlut( ...@@ -81,7 +81,7 @@ bool dcn32_release_post_bldn_3dlut(
struct dc_transfer_func **shaper); struct dc_transfer_func **shaper);
bool dcn32_remove_phantom_pipes(struct dc *dc, bool dcn32_remove_phantom_pipes(struct dc *dc,
struct dc_state *context); struct dc_state *context, bool fast_update);
void dcn32_retain_phantom_pipes(struct dc *dc, void dcn32_retain_phantom_pipes(struct dc *dc,
struct dc_state *context); struct dc_state *context);
......
...@@ -1203,7 +1203,7 @@ static void dcn32_full_validate_bw_helper(struct dc *dc, ...@@ -1203,7 +1203,7 @@ static void dcn32_full_validate_bw_helper(struct dc *dc,
// If SubVP pipe config is unsupported (or cannot be used for UCLK switching) // If SubVP pipe config is unsupported (or cannot be used for UCLK switching)
// remove phantom pipes and repopulate dml pipes // remove phantom pipes and repopulate dml pipes
if (!found_supported_config) { if (!found_supported_config) {
dc->res_pool->funcs->remove_phantom_pipes(dc, context); dc->res_pool->funcs->remove_phantom_pipes(dc, context, false);
vba->DRAMClockChangeSupport[*vlevel][vba->maxMpcComb] = dm_dram_clock_change_unsupported; vba->DRAMClockChangeSupport[*vlevel][vba->maxMpcComb] = dm_dram_clock_change_unsupported;
*pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, false); *pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, false);
...@@ -1518,7 +1518,7 @@ bool dcn32_internal_validate_bw(struct dc *dc, ...@@ -1518,7 +1518,7 @@ bool dcn32_internal_validate_bw(struct dc *dc,
return false; return false;
// For each full update, remove all existing phantom pipes first // For each full update, remove all existing phantom pipes first
dc->res_pool->funcs->remove_phantom_pipes(dc, context); dc->res_pool->funcs->remove_phantom_pipes(dc, context, fast_validate);
dc->res_pool->funcs->update_soc_for_wm_a(dc, context); dc->res_pool->funcs->update_soc_for_wm_a(dc, context);
......
...@@ -240,7 +240,7 @@ struct resource_funcs { ...@@ -240,7 +240,7 @@ struct resource_funcs {
unsigned int pipe_cnt, unsigned int pipe_cnt,
unsigned int index); unsigned int index);
bool (*remove_phantom_pipes)(struct dc *dc, struct dc_state *context); bool (*remove_phantom_pipes)(struct dc *dc, struct dc_state *context, bool fast_update);
void (*retain_phantom_pipes)(struct dc *dc, struct dc_state *context); void (*retain_phantom_pipes)(struct dc *dc, struct dc_state *context);
void (*get_panel_config_defaults)(struct dc_panel_config *panel_config); void (*get_panel_config_defaults)(struct dc_panel_config *panel_config);
}; };
......
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