[PATCH v6 4/5] drm/amdgpu: Correct get_crtc_scanoutpos behavior when vpos >= vtotal
Wentland, Harry
Harry.Wentland at amd.com
Wed Nov 7 14:58:38 UTC 2018
On 2018-11-06 3:24 p.m., Nicholas Kazlauskas wrote:
> 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 timestap from being the previous timestamp
> to the calculation to the next timestamp when position >= vtotal.
>
> Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>
Reviewed-by: Harry Wentland <harry.wentland at amd.com>
Harry
> Cc: Michel Dänzer <michel at daenzer.net>
> Cc: Harry Wentland <harry.wentland at 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 6748cd7fc129..cb331319f225 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> @@ -850,7 +850,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. */
>
More information about the amd-gfx
mailing list