• Mario Kleiner's avatar
    drm/amdgpu: Don't hang in amdgpu_flip_work_func on disabled crtc. · ae4fa0cb
    Mario Kleiner authored
    commit e1d09dc0 upstream.
    
    This fixes a regression introduced in Linux 4.4.
    
    This is a port of the same fix for radeon-kms in the
    patch "drm/radeon: Don't hang in radeon_flip_work_func
    on disabled crtc. (v2)"
    
    Limit the amount of time amdgpu_flip_work_func can
    delay programming a page flip, by both limiting the
    maximum amount of time per wait cycle and the maximum
    number of wait cycles. Continue the flip if the limit
    is exceeded, even if that may result in a visual or
    timing glitch.
    
    This is to prevent a hang of page flips, as reported
    in fdo bug #93746: Disconnecting a DisplayPort display
    in parallel to a kms pageflip getting queued can cause
    the following hang of page flips and thereby an unusable
    desktop:
    
    1. kms pageflip ioctl() queues pageflip -> queues execution
       of amdgpu_flip_work_func.
    
    2. Hotunplug of display causes the driver to DPMS OFF
       the unplugged display. Display engine shuts down,
       scanout no longer moves, but stays at its resting
       position at start line of vblank.
    
    3. amdgpu_flip_work_func executes while crtc is off, and
       due to the non-moving scanout position, the new flip
       delay code introduced into Linux 4.4 by
       commit 8e36f9d3 ("drm/amdgpu: Fixup hw vblank counter/ts..")
       enters an infinite wait loop.
    
    4. After reconnecting the display, the pageflip continues
       to hang in 3. and the display doesn't update its view
       of the desktop.
    
    This patch fixes the Linux 4.4 regression from fdo bug #93746
    
    <https://bugs.freedesktop.org/show_bug.cgi?id=93746>
    Reported-by: default avatarBernd Steinhauser <linux@bernd-steinhauser.de>
    Signed-off-by: default avatarMario Kleiner <mario.kleiner.de@gmail.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    
    Cc: Michel Dänzer <michel.daenzer@amd.com>
    Cc: Alex Deucher <alexander.deucher@amd.com>
    Reviewed-by: default avatarMichel Dänzer <michel.daenzer@amd.com>
    Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
    ae4fa0cb
amdgpu_display.c 27.3 KB