Commit 63985d9a authored by Sung Joon Kim's avatar Sung Joon Kim Committed by Alex Deucher
Browse files

drm/amd/display: Modify resource allocation logic



To reduce the complexity of pipe resource allocation for different
use-cases, now we search for any free pipe sequentially rather than from
bottom up.

Reviewed-by: default avatarWenjing Liu <wenjing.liu@amd.com>
Acked-by: default avatarRodrigo Siqueira <rodrigo.siqueira@amd.com>
Signed-off-by: default avatarSung Joon Kim <sungjoon.kim@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent ab956ed9
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2547,7 +2547,7 @@ struct resource_pool *dcn32_create_resource_pool(
 * full update which delays the flip for 1 frame. If we use the original pipe
 * we don't have to toggle its power. So we can flip faster.
 */
static int find_optimal_free_pipe_as_secondary_dpp_pipe(
int dcn32_find_optimal_free_pipe_as_secondary_dpp_pipe(
		const struct resource_context *cur_res_ctx,
		struct resource_context *new_res_ctx,
		const struct resource_pool *pool,
@@ -2730,7 +2730,7 @@ struct pipe_ctx *dcn32_acquire_free_pipe_as_secondary_dpp_pipe(
		return dcn32_acquire_idle_pipe_for_head_pipe_in_layer(
				new_ctx, pool, opp_head_pipe->stream, opp_head_pipe);

	free_pipe_idx = find_optimal_free_pipe_as_secondary_dpp_pipe(
	free_pipe_idx = dcn32_find_optimal_free_pipe_as_secondary_dpp_pipe(
					&cur_ctx->res_ctx, &new_ctx->res_ctx,
					pool, opp_head_pipe);
	if (free_pipe_idx >= 0) {
+6 −0
Original line number Diff line number Diff line
@@ -137,6 +137,12 @@ bool dcn32_any_surfaces_rotated(struct dc *dc, struct dc_state *context);
bool dcn32_is_center_timing(struct pipe_ctx *pipe);
bool dcn32_is_psr_capable(struct pipe_ctx *pipe);

int dcn32_find_optimal_free_pipe_as_secondary_dpp_pipe(
		const struct resource_context *cur_res_ctx,
		struct resource_context *new_res_ctx,
		const struct resource_pool *pool,
		const struct pipe_ctx *new_opp_head);

struct pipe_ctx *dcn32_acquire_free_pipe_as_secondary_dpp_pipe(
		const struct dc_state *cur_ctx,
		struct dc_state *new_ctx,
+34 −1
Original line number Diff line number Diff line
@@ -1728,6 +1728,37 @@ static bool dcn351_validate_bandwidth(struct dc *dc,
	return out;
}

struct pipe_ctx *dcn351_acquire_free_pipe_as_secondary_dpp_pipe(
		const struct dc_state *cur_ctx,
		struct dc_state *new_ctx,
		const struct resource_pool *pool,
		const struct pipe_ctx *opp_head_pipe)
{
	int free_pipe_idx;
	struct pipe_ctx *free_pipe;

	free_pipe_idx = dcn32_find_optimal_free_pipe_as_secondary_dpp_pipe(
					&cur_ctx->res_ctx, &new_ctx->res_ctx,
					pool, opp_head_pipe);
	if (free_pipe_idx >= 0) {
		free_pipe = &new_ctx->res_ctx.pipe_ctx[free_pipe_idx];
		free_pipe->pipe_idx = free_pipe_idx;
		free_pipe->stream = opp_head_pipe->stream;
		free_pipe->stream_res.tg = opp_head_pipe->stream_res.tg;
		free_pipe->stream_res.opp = opp_head_pipe->stream_res.opp;

		free_pipe->plane_res.hubp = pool->hubps[free_pipe->pipe_idx];
		free_pipe->plane_res.ipp = pool->ipps[free_pipe->pipe_idx];
		free_pipe->plane_res.dpp = pool->dpps[free_pipe->pipe_idx];
		free_pipe->plane_res.mpcc_inst =
				pool->dpps[free_pipe->pipe_idx]->inst;
	} else {
		ASSERT(opp_head_pipe);
		free_pipe = NULL;
	}

	return free_pipe;
}

static struct resource_funcs dcn351_res_pool_funcs = {
	.destroy = dcn351_destroy_resource_pool,
@@ -1740,7 +1771,8 @@ static struct resource_funcs dcn351_res_pool_funcs = {
	.calculate_wm_and_dlg = NULL,
	.update_soc_for_wm_a = dcn31_update_soc_for_wm_a,
	.populate_dml_pipes = dcn351_populate_dml_pipes_from_context_fpu,
	.acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
	.acquire_free_pipe_as_secondary_dpp_pipe = dcn351_acquire_free_pipe_as_secondary_dpp_pipe,
	.acquire_free_pipe_as_secondary_opp_head = dcn32_acquire_free_pipe_as_secondary_opp_head,
	.release_pipe = dcn20_release_pipe,
	.add_stream_to_ctx = dcn30_add_stream_to_ctx,
	.add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
@@ -2130,6 +2162,7 @@ static bool dcn351_resource_construct(

	dc->dml2_options.max_segments_per_hubp = 24;
	dc->dml2_options.det_segment_size = DCN3_2_DET_SEG_SIZE;/*todo*/
	dc->dml2_options.map_dc_pipes_with_callbacks = true;

	if (dc->config.sdpif_request_limit_words_per_umc == 0)
		dc->config.sdpif_request_limit_words_per_umc = 16;/*todo*/
+6 −0
Original line number Diff line number Diff line
@@ -20,4 +20,10 @@ struct resource_pool *dcn351_create_resource_pool(
		const struct dc_init_data *init_data,
		struct dc *dc);

struct pipe_ctx *dcn351_acquire_free_pipe_as_secondary_dpp_pipe(
		const struct dc_state *cur_ctx,
		struct dc_state *new_ctx,
		const struct resource_pool *pool,
		const struct pipe_ctx *opp_head_pipe);

#endif /* _DCN351_RESOURCE_H_ */