aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/0863-drm-amdgpu-Correct-get_crtc_scanoutpos-behavior-when.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0863-drm-amdgpu-Correct-get_crtc_scanoutpos-behavior-when.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/0863-drm-amdgpu-Correct-get_crtc_scanoutpos-behavior-when.patch54
1 files changed, 54 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0863-drm-amdgpu-Correct-get_crtc_scanoutpos-behavior-when.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0863-drm-amdgpu-Correct-get_crtc_scanoutpos-behavior-when.patch
new file mode 100644
index 00000000..139d549b
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0863-drm-amdgpu-Correct-get_crtc_scanoutpos-behavior-when.patch
@@ -0,0 +1,54 @@
+From 481c7934495299035e9ad644c409aca695a8a890 Mon Sep 17 00:00:00 2001
+From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Date: Thu, 1 Nov 2018 11:00:59 -0400
+Subject: [PATCH 0863/2940] drm/amdgpu: Correct get_crtc_scanoutpos behavior
+ when vpos >= vtotal
+
+When variable refresh rate is active the hardware counter can return
+a position >= vtotal. This results in a vpos being returned from
+amdgpu_display_get_crtc_scanoutpos that's a positive value. The
+positive value indicates to the caller that the display is
+currently in scanout when the display is actually still in vblank.
+
+This is because the vfront porch duration is unknown with variable
+refresh active and will end when either a page flip occurs or the
+timeout specified by the driver/display is reached.
+
+The behavior of the amdgpu_display_get_crtc_scanoutpos remains the
+same when the position is below vtotal. When the position is above
+vtotal the function will return a value that is effectively -vbl_end,
+the size of the vback porch.
+
+The only caller affected by this change is the DRM helper for
+calculating vblank timestamps. This change corrects behavior for
+calculating the page flip timestamp from being the previous timestamp
+to the calculation to the next timestamp when position >= vtotal.
+
+Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Reviewed-by: Harry Wentland <harry.wentland@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+index a42d6a1dfe29..43b6fbbc23b1 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+@@ -882,7 +882,12 @@ int amdgpu_display_get_crtc_scanoutpos(struct drm_device *dev,
+ /* Inside "upper part" of vblank area? Apply corrective offset if so: */
+ if (in_vbl && (*vpos >= vbl_start)) {
+ vtotal = mode->crtc_vtotal;
+- *vpos = *vpos - vtotal;
++
++ /* With variable refresh rate displays the vpos can exceed
++ * the vtotal value. Clamp to 0 to return -vbl_end instead
++ * of guessing the remaining number of lines until scanout.
++ */
++ *vpos = (*vpos < vtotal) ? (*vpos - vtotal) : 0;
+ }
+
+ /* Correct for shifted end of vbl at vbl_end. */
+--
+2.17.1
+