diff options
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.patch | 83 |
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 + |