aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1303-drm-amd-display-Clean-up-wait-on-vblank-event.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1303-drm-amd-display-Clean-up-wait-on-vblank-event.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1303-drm-amd-display-Clean-up-wait-on-vblank-event.patch83
1 files changed, 83 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1303-drm-amd-display-Clean-up-wait-on-vblank-event.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1303-drm-amd-display-Clean-up-wait-on-vblank-event.patch
new file mode 100644
index 00000000..8d1f497b
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1303-drm-amd-display-Clean-up-wait-on-vblank-event.patch
@@ -0,0 +1,83 @@
+From 2b6de264ca1aa1b1788b4c40a26fd58f76ba1616 Mon Sep 17 00:00:00 2001
+From: David Francis <David.Francis@amd.com>
+Date: Fri, 1 Feb 2019 14:22:24 -0500
+Subject: [PATCH 1303/2940] drm/amd/display: Clean up wait on vblank event
+
+[Why]
+The wait_for_vblank boolean in commit_tail was passed by reference
+into each stream commit, and if that commit was an asynchronous
+flip, it would disable vblank waits on all subsequent flips.
+
+This made the behaviour depend on crtc order in a non-intuitive way,
+although since the asynchronous pageflip flag is only used by the
+legacy IOCTLs at the moment it is never an issue
+
+[How]
+Find wait_for_vblank before doing any stream commits
+
+Signed-off-by: David Francis <David.Francis@amd.com>
+Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+---
+ .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 18 +++++++-----------
+ 1 file changed, 7 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+index 537e00f1c895..1b56da5a32d4 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -4746,7 +4746,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
+ struct drm_device *dev,
+ struct amdgpu_display_manager *dm,
+ struct drm_crtc *pcrtc,
+- bool *wait_for_vblank)
++ bool wait_for_vblank)
+ {
+ uint32_t i, r;
+ uint64_t timestamp_ns;
+@@ -4812,14 +4812,6 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
+ dc_plane = dm_new_plane_state->dc_state;
+
+ if (pflip_needed) {
+- /*
+- * Assume even ONE crtc with immediate flip means
+- * entire can't wait for VBLANK
+- * TODO Check if it's correct
+- */
+- if (new_pcrtc_state->pageflip_flags & DRM_MODE_PAGE_FLIP_ASYNC)
+- *wait_for_vblank = false;
+-
+ /*
+ * TODO This might fail and hence better not used, wait
+ * explicitly on fences instead
+@@ -4922,7 +4914,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
+ * hopefully eliminating dc_*_update structs in their entirety.
+ */
+ if (flip_count) {
+- target = (uint32_t)drm_crtc_vblank_count(pcrtc) + *wait_for_vblank;
++ target = (uint32_t)drm_crtc_vblank_count(pcrtc) + wait_for_vblank;
+ /* Prepare wait for target vblank early - before the fence-waits */
+ target_vblank = target - (uint32_t)drm_crtc_vblank_count(pcrtc) +
+ amdgpu_get_vblank_counter_kms(pcrtc->dev, acrtc_attach->crtc_id);
+@@ -5295,13 +5287,17 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
+ #endif
+ }
+
++ for_each_new_crtc_in_state(state, crtc, new_crtc_state, j)
++ if (new_crtc_state->pageflip_flags & DRM_MODE_PAGE_FLIP_ASYNC)
++ wait_for_vblank = false;
++
+ /* update planes when needed per crtc*/
+ for_each_new_crtc_in_state(state, crtc, new_crtc_state, j) {
+ dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
+
+ if (dm_new_crtc_state->stream)
+ amdgpu_dm_commit_planes(state, dc_state, dev,
+- dm, crtc, &wait_for_vblank);
++ dm, crtc, wait_for_vblank);
+ }
+
+
+--
+2.17.1
+