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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxx>

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.
  	 */


_______________________________________________
amd-gfx mailing list
amd-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/amd-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux