• Alan Liu's avatar
    drm/amdgpu: Fix desktop freezed after gpu-reset · c8b5a95b
    Alan Liu authored
    [Why]
    After gpu-reset, sometimes the driver fails to enable vblank irq,
    causing flip_done timed out and the desktop freezed.
    
    During gpu-reset, we disable and enable vblank irq in dm_suspend() and
    dm_resume(). Later on in amdgpu_irq_gpu_reset_resume_helper(), we check
    irqs' refcount and decide to enable or disable the irqs again.
    
    However, we have 2 sets of API for controling vblank irq, one is
    dm_vblank_get/put() and another is amdgpu_irq_get/put(). Each API has
    its own refcount and flag to store the state of vblank irq, and they
    are not synchronized.
    
    In drm we use the first API to control vblank irq but in
    amdgpu_irq_gpu_reset_resume_helper() we use the second set of API.
    
    The failure happens when vblank irq was enabled by dm_vblank_get()
    before gpu-reset, we have vblank->enabled true. However, during
    gpu-reset, in amdgpu_irq_gpu_reset_resume_helper() vblank irq's state
    checked from amdgpu_irq_update() is DISABLED. So finally it disables
    vblank irq again. After gpu-reset, if there is a cursor plane commit,
    the driver will try to enable vblank irq by calling drm_vblank_enable(),
    but the vblank->enabled is still true, so it fails to turn on vblank
    irq and causes flip_done can't be completed in vblank irq handler and
    desktop become freezed.
    
    [How]
    Combining the 2 vblank control APIs by letting drm's API finally calls
    amdgpu_irq's API, so the irq's refcount and state of both APIs can be
    synchronized. Also add a check to prevent refcount from being less then
    0 in amdgpu_irq_put().
    
    v2:
    - Add warning in amdgpu_irq_enable() if the irq is already disabled.
    - Call dc_interrupt_set() in dm_set_vblank() to avoid refcount change
      if it is in gpu-reset.
    
    v3:
    - Improve commit message and code comments.
    Signed-off-by: default avatarAlan Liu <HaoPing.Liu@amd.com>
    Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
    Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
    Cc: stable@vger.kernel.org
    c8b5a95b
amdgpu_irq.c 17.8 KB