• Yakir Yang's avatar
    drm: bridge: analogix/dp: Fix the possible dead lock in bridge disable time · 7b4b7a8d
    Yakir Yang authored
    It may caused a dead lock if we flush the hpd work in bridge disable time.
    
    The normal flow would like:
      IN --> DRM IOCTL
            1. Acquire crtc_ww_class_mutex (DRM IOCTL)
      IN --> analogix_dp_bridge
            2. Acquire hpd work lock (Flush hpd work)
            3. HPD work already in idle, no need to run the work function.
      OUT <-- analogix_dp_bridge
      OUT <-- DRM IOCTL
    
    The dead lock flow would like:
      IN --> DRM IOCTL
            1. Acquire crtc_ww_class_mutex (DRM IOCTL)
      IN --> analogix_dp_bridge
            2. Acquire hpd work lock (Flush hpd work)
      IN --> analogix_dp_hotplug
      IN --> drm_helper_hpd_irq_event
            3. Acquire mode_config lock (This lock already have been acquired in previous step 1)
    ** Dead Lock Now **
    
    It's wrong to flush the hpd work in bridge->disable time, I guess the
    original code just want to ensure the delay work must be finish before
    encoder disabled.
    
    The flush work in bridge disable time is try to ensure the HPD event
    won't be missed before display card disabled, actually we can take a
    fast respond way(interrupt thread) to update DRM HPD event to fix the
    delay update and possible dead lock.
    Tested-by: default avatarCaesar Wang <wxt@rock-chips.com>
    Tested-by: default avatarDouglas Anderson <dianders@chromium.org>
    Tested-by: default avatarHeiko Stuebner <heiko@sntech.de>
    Tested-by: default avatarJavier Martinez Canillas <javier@osg.samsung.com>
    Signed-off-by: default avatarYakir Yang <ykk@rock-chips.com>
    7b4b7a8d
analogix_dp_reg.c 33.9 KB