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

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
		 */
		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 */
		if (!dc_rem_all_planes_for_stream(dc, stream, context)) {
+39 −25
Original line number Diff line number Diff line
@@ -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
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;
	bool removed_pipe = false;
@@ -1770,6 +1770,14 @@ bool dcn32_remove_phantom_pipes(struct dc *dc, struct dc_state *context)
			removed_pipe = true;
		}

		/* For non-full updates, a shallow copy of the current state
		 * is created. In this case we don't want to erase the current
		 * state (there can be 2 HIRQL threads, one in flip, and one in
		 * 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;
@@ -1780,6 +1788,7 @@ bool dcn32_remove_phantom_pipes(struct dc *dc, struct dc_state *context)
				pipe->plane_state->is_phantom = false;
			}
		}
	}
	return removed_pipe;
}

@@ -1950,6 +1959,10 @@ int dcn32_populate_dml_pipes_from_context(
		pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
		pipes[pipe_cnt].pipe.scale_ratio_depth.lb_depth = dm_lb_19;

		/* Only populate DML input with subvp info for full updates.
		 * This is just a workaround -- needs a proper fix.
		 */
		if (!fast_validate) {
			switch (pipe->stream->mall_stream_config.type) {
			case SUBVP_MAIN:
				pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_sub_viewport;
@@ -1968,6 +1981,7 @@ int dcn32_populate_dml_pipes_from_context(
			default:
				break;
			}
		}

		pipes[pipe_cnt].dout.dsc_input_bpc = 0;
		if (pipes[pipe_cnt].dout.dsc_enable) {
+1 −1
Original line number Diff line number Diff line
@@ -81,7 +81,7 @@ bool dcn32_release_post_bldn_3dlut(
		struct dc_transfer_func **shaper);

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,
		struct dc_state *context);
+2 −2
Original line number Diff line number Diff line
@@ -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)
		// remove phantom pipes and repopulate dml pipes
		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;
			*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,
		return false;

	// 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);

+1 −1
Original line number Diff line number Diff line
@@ -240,7 +240,7 @@ struct resource_funcs {
			unsigned int pipe_cnt,
            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 (*get_panel_config_defaults)(struct dc_panel_config *panel_config);
};