[PATCH] amd/drm/display: avoid dcn3 on flip opp change for slave pipes

Rodrigo Siqueira Rodrigo.Siqueira at amd.com
Mon Sep 28 17:01:01 UTC 2020


LGTM,

Reviewed-by: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>

On 09/28, Bhawanpreet Lakha wrote:
> From: Dmytro Laktyushkin <Dmytro.Laktyushkin at amd.com>
> 
> At the moment on flip opp reassignment does not work in all cases
> for non root pipes.
> This change simply makes sure we prefer pipes not used previously
> when splitting in dcn3.
> 
> Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin at amd.com>
> Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha at amd.com>
> ---
>  .../drm/amd/display/dc/dcn30/dcn30_resource.c | 43 +++++++++++++++++--
>  1 file changed, 40 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
> index dde87baf1370..60ee4062dc8c 100644
> --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
> @@ -1899,6 +1899,41 @@ static bool dcn30_split_stream_for_mpc_or_odm(
>  	return true;
>  }
>  
> +static struct pipe_ctx *dcn30_find_split_pipe(
> +		struct dc *dc,
> +		struct dc_state *context)
> +{
> +	struct pipe_ctx *pipe = NULL;
> +	int i;
> +
> +	for (i = dc->res_pool->pipe_count - 1; i >= 0; i--) {
> +		if (dc->current_state->res_ctx.pipe_ctx[i].top_pipe == NULL
> +				&& dc->current_state->res_ctx.pipe_ctx[i].prev_odm_pipe == NULL) {
> +			if (context->res_ctx.pipe_ctx[i].stream == NULL) {
> +				pipe = &context->res_ctx.pipe_ctx[i];
> +				pipe->pipe_idx = i;
> +				break;
> +			}
> +		}
> +	}
> +
> +	/*
> +	 * May need to fix pipes getting tossed from 1 opp to another on flip
> +	 * Add for debugging transient underflow during topology updates:
> +	 * ASSERT(pipe);
> +	 */
> +	if (!pipe)
> +		for (i = dc->res_pool->pipe_count - 1; i >= 0; i--) {
> +			if (context->res_ctx.pipe_ctx[i].stream == NULL) {
> +				pipe = &context->res_ctx.pipe_ctx[i];
> +				pipe->pipe_idx = i;
> +				break;
> +			}
> +		}
> +
> +	return pipe;
> +}
> +
>  static bool dcn30_internal_validate_bw(
>  		struct dc *dc,
>  		struct dc_state *context,
> @@ -2024,6 +2059,7 @@ static bool dcn30_internal_validate_bw(
>  				dcn20_release_dsc(&context->res_ctx, dc->res_pool, &pipe->stream_res.dsc);
>  			memset(&pipe->plane_res, 0, sizeof(pipe->plane_res));
>  			memset(&pipe->stream_res, 0, sizeof(pipe->stream_res));
> +			repopulate_pipes = true;
>  		} else if (pipe->top_pipe && pipe->top_pipe->plane_state == pipe->plane_state) {
>  			struct pipe_ctx *top_pipe = pipe->top_pipe;
>  			struct pipe_ctx *bottom_pipe = pipe->bottom_pipe;
> @@ -2038,6 +2074,7 @@ static bool dcn30_internal_validate_bw(
>  			pipe->stream = NULL;
>  			memset(&pipe->plane_res, 0, sizeof(pipe->plane_res));
>  			memset(&pipe->stream_res, 0, sizeof(pipe->stream_res));
> +			repopulate_pipes = true;
>  		} else
>  			ASSERT(0); /* Should never try to merge master pipe */
>  
> @@ -2058,7 +2095,7 @@ static bool dcn30_internal_validate_bw(
>  			continue;
>  
>  		if (split[i]) {
> -			hsplit_pipe = find_idle_secondary_pipe(&context->res_ctx, dc->res_pool, pipe);
> +			hsplit_pipe = dcn30_find_split_pipe(dc, context);
>  			ASSERT(hsplit_pipe);
>  			if (!hsplit_pipe)
>  				goto validate_fail;
> @@ -2072,7 +2109,7 @@ static bool dcn30_internal_validate_bw(
>  			repopulate_pipes = true;
>  		}
>  		if (split[i] == 4) {
> -			struct pipe_ctx *pipe_4to1 = find_idle_secondary_pipe(&context->res_ctx, dc->res_pool, pipe);
> +			struct pipe_ctx *pipe_4to1 = dcn30_find_split_pipe(dc, context);
>  
>  			ASSERT(pipe_4to1);
>  			if (!pipe_4to1)
> @@ -2083,7 +2120,7 @@ static bool dcn30_internal_validate_bw(
>  				goto validate_fail;
>  			newly_split[pipe_4to1->pipe_idx] = true;
>  
> -			pipe_4to1 = find_idle_secondary_pipe(&context->res_ctx, dc->res_pool, pipe);
> +			pipe_4to1 = dcn30_find_split_pipe(dc, context);
>  			ASSERT(pipe_4to1);
>  			if (!pipe_4to1)
>  				goto validate_fail;
> -- 
> 2.25.1
> 

-- 
Rodrigo Siqueira
https://siqueira.tech
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20200928/35b5f2df/attachment.sig>


More information about the amd-gfx mailing list