• Nicholas Kazlauskas's avatar
    drm/amd/display: Fix vblank and pageflip event handling for FreeSync · 2346ef47
    Nicholas Kazlauskas authored
    [Why]
    We're sending the drm vblank event a frame too early in the case where
    the pageflip happens close to VUPDATE and ends up blocking the signal.
    
    The implementation in DM was previously correct *before* we started
    sending vblank events from VSTARTUP unconditionally to handle cases
    where HUBP was off, OTG was ON and userspace was still requesting some
    DRM planes enabled. As part of that patch series we dropped VUPDATE
    since it was deemed close enough to VSTARTUP, but there's a key
    difference betweeen VSTARTUP and VUPDATE - the VUPDATE signal can be
    blocked if we're holding the pipe lock.
    
    There was a fix recently to revert the unconditional behavior for the
    DCN VSTARTUP vblank event since it was sending the pageflip event on
    the wrong frame - once again, due to blocking VUPDATE and having the
    address start scanning out two frames later.
    
    The problem with this fix is it didn't update the logic that calls
    drm_crtc_handle_vblank(), so the timestamps are totally bogus now.
    
    [How]
    Essentially reverts most of the original VSTARTUP series but retains
    the behavior to send back events when active planes == 0.
    
    Some refactoring/cleanup was done to not have duplicated code in both
    the handlers.
    
    Fixes: 16f17eda ("drm/amd/display: Send vblank and user events at vsartup for DCN")
    Fixes: 3a2ce8d6 ("drm/amd/display: Disable VUpdate interrupt for DCN hardware")
    Fixes: 2b5aed9a ("drm/amd/display: Fix pageflip event race condition for DCN.")
    Signed-off-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
    Reviewed-and-Tested-by: default avatarMario Kleiner <mario.kleiner.de@gmail.com>
    Reviewed-by: default avatarLeo Li <sunpeng.li@amd.com>
    Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
    Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
    Cc: stable@vger.kernel.org # 5.6.x
    2346ef47
amdgpu_dm.c 241 KB