• Imre Deak's avatar
    drm/i915: Fix fastsets on TypeC ports following a non-blocking modeset · a59308a5
    Imre Deak authored
    After a non-blocking modeset on a TypeC port's CRTC - possibly blocked
    later in drm_atomic_helper_wait_for_dependencies() - a fastset on the
    same CRTC may copy the state of CRTC before this gets updated to reflect
    the up-to-date DP-alt vs. TBT-alt TypeC mode DPLL used for the CRTC. In
    this case after the first (non-blocking) commit completes enabling the
    DPLL required for the up-to-date TypeC mode the following fastset will
    update the CRTC state pointing to the wrong DPLL. A subsequent disabling
    modeset will try to disable the wrong PLL, triggering a state checker
    WARN (and leaving the DPLL which is actually used active for good).
    
    Fix the above race by copying the DPLL state for fastset CRTCs from the
    old CRTC state at the point where it's guaranteed to be up-to-date
    already. This could be handled in the encoder's update_prepare() hook as
    well, but that's a bigger change, which is better done as a follow-up.
    
    v2: Copy dpll_hw_state as well. (Ville)
    
    Testcase: igt/kms_busy/extended-modeset-hang-newfb-with-reset
    Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/4308
    Cc: Ville Syrjala <ville.syrjala@linux.intel.com>
    Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
    Reviewed-by: default avatarMika Kahola <mika.kahola@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20211115181121.156197-1-imre.deak@intel.com
    a59308a5
intel_display.c 316 KB