[PATCH] Revert "drm/amd/display: revert wait in pipelock"

Kazlauskas, Nicholas nicholas.kazlauskas at amd.com
Fri Nov 15 15:46:16 UTC 2019


On 2019-11-15 10:13 a.m., Alex Deucher wrote:
> This reverts commit 617089d5837a3aa4167a9c4afb34929e0d52805d.
> 
> This causes hangs in some games.
> 
> Bug: https://bugzilla.kernel.org/show_bug.cgi?id=205169
> Bug: https://bugs.freedesktop.org/show_bug.cgi?id=112266
> Bug: https://bugzilla.kernel.org/show_bug.cgi?id=205169
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

I think this will also just hang the system in some cases.

I know that if we're waiting for flip pending == 0 on plane enable we've 
hit cases where it's hung infinitely on dcn20.

Since this code is in pipe lock itself (where this timeout code was 
contained) this means that we'd similarly see a similar hang - but only 
in the case where we'd switching flip types.

This probably needs to have a timeout of 100ms or so like the plane enable:

	if (flip_immediate && lock) {
		const int TIMEOUT_FOR_FLIP_PENDING = 100000;
		int i;

		for (i = 0; i < TIMEOUT_FOR_FLIP_PENDING; ++i) {
			if (pipe->plane_res.hubp->funcs->hubp_is_flip_pending(
				    pipe->plane_res.hubp))
				break;

			udelay(1);
		}

		if (pipe->bottom_pipe != NULL) {
			for (i = 0; i < TIMEOUT_FOR_FLIP_PENDING; ++i) {
				if (pipe->bottom_pipe->plane_res.hubp->funcs
					    ->hubp_is_flip_pending(
						    pipe->bottom_pipe->plane_res
							    .hubp))
					break;

				udelay(1);
			}
		}
	}

Nicholas Kazlauskas

> ---
>   drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | 11 +++++++++++
>   1 file changed, 11 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
> index 0046a099c9e9..9b4488ef27d1 100644
> --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
> +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
> @@ -1033,6 +1033,17 @@ void dcn20_pipe_control_lock(
>   	if (pipe->plane_state != NULL)
>   		flip_immediate = pipe->plane_state->flip_immediate;
>   
> +	if (flip_immediate && lock) {
> +		while (pipe->plane_res.hubp->funcs->hubp_is_flip_pending(pipe->plane_res.hubp))	{
> +			udelay(1);
> +		}
> +
> +		if (pipe->bottom_pipe != NULL)
> +			while (pipe->bottom_pipe->plane_res.hubp->funcs->hubp_is_flip_pending(pipe->bottom_pipe->plane_res.hubp))	{
> +				udelay(1);
> +			}
> +	}
> +
>   	/* In flip immediate and pipe splitting case, we need to use GSL
>   	 * for synchronization. Only do setup on locking and on flip type change.
>   	 */
> 



More information about the amd-gfx mailing list