| From 146ed2dc4084703339fabe90de214c211737a3e7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 22 Apr 2020 18:07:56 -0400 |
| Subject: drm/amd/display: Defer cursor update around VUPDATE for all ASIC |
| |
| From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> |
| |
| [ Upstream commit fdfd2a858590d318cfee483bd1c73e00f77533af ] |
| |
| [Why] |
| Fixes the following scenario: |
| |
| - Flip has been prepared sometime during the frame, update pending |
| - Cursor update happens right when VUPDATE would happen |
| - OPTC lock acquired, VUPDATE is blocked until next frame |
| - Flip is delayed potentially infinitely |
| |
| With the igt@kms_cursor_legacy cursor-vs-flip-legacy test we can |
| observe nearly *13* frames of delay for some flips on Navi. |
| |
| [How] |
| Apply the Raven workaround generically. When close enough to VUPDATE |
| block cursor updates from occurring from the dc_stream_set_cursor_* |
| helpers. |
| |
| This could perhaps be a little smarter by checking if there were |
| pending updates or flips earlier in the frame on the HUBP side before |
| applying the delay, but this should be fine for now. |
| |
| This fixes the kms_cursor_legacy test. |
| |
| Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> |
| Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> |
| Acked-by: Aurabindo Pillai <aurabindo.pillai@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../gpu/drm/amd/display/dc/core/dc_stream.c | 28 +++++++++---------- |
| 1 file changed, 14 insertions(+), 14 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c |
| index 6ddbb00ed37a5..8c20e9e907b2f 100644 |
| --- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c |
| +++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c |
| @@ -239,24 +239,24 @@ static void delay_cursor_until_vupdate(struct pipe_ctx *pipe_ctx, struct dc *dc) |
| struct dc_stream_state *stream = pipe_ctx->stream; |
| unsigned int us_per_line; |
| |
| - if (stream->ctx->asic_id.chip_family == FAMILY_RV && |
| - ASICREV_IS_RAVEN(stream->ctx->asic_id.hw_internal_rev)) { |
| + if (!dc->hwss.get_vupdate_offset_from_vsync) |
| + return; |
| |
| - vupdate_line = dc->hwss.get_vupdate_offset_from_vsync(pipe_ctx); |
| - if (!dc_stream_get_crtc_position(dc, &stream, 1, &vpos, &nvpos)) |
| - return; |
| + vupdate_line = dc->hwss.get_vupdate_offset_from_vsync(pipe_ctx); |
| + if (!dc_stream_get_crtc_position(dc, &stream, 1, &vpos, &nvpos)) |
| + return; |
| |
| - if (vpos >= vupdate_line) |
| - return; |
| + if (vpos >= vupdate_line) |
| + return; |
| |
| - us_per_line = stream->timing.h_total * 10000 / stream->timing.pix_clk_100hz; |
| - lines_to_vupdate = vupdate_line - vpos; |
| - us_to_vupdate = lines_to_vupdate * us_per_line; |
| + us_per_line = |
| + stream->timing.h_total * 10000 / stream->timing.pix_clk_100hz; |
| + lines_to_vupdate = vupdate_line - vpos; |
| + us_to_vupdate = lines_to_vupdate * us_per_line; |
| |
| - /* 70 us is a conservative estimate of cursor update time*/ |
| - if (us_to_vupdate < 70) |
| - udelay(us_to_vupdate); |
| - } |
| + /* 70 us is a conservative estimate of cursor update time*/ |
| + if (us_to_vupdate < 70) |
| + udelay(us_to_vupdate); |
| #endif |
| } |
| |
| -- |
| 2.20.1 |
| |