• Imre Deak's avatar
    drm/i915/tc: Reset TypeC PHYs left enabled in DP-alt mode after the sink disconnects · c598c335
    Imre Deak authored
    If the output on a DP-alt link with its sink disconnected is kept
    enabled for too long (about 20 sec), then some IOM/TCSS firmware timeout
    will cause havoc on the PCI bus, at least for other GFX devices on it
    which will stop powering up. Since user space is not guaranteed to do a
    disabling modeset in time, switch such disconnected but active links to
    TBT mode - which is without such shortcomings - with a 2 second delay.
    
    If the above condition is detected already during the driver load/system
    resume sanitization step disable the output instead, as at that point no
    user space or kernel client depends on a consistent output state yet and
    because subsequent atomic modeset on such connectors - without the
    actual sink capabilities available - can fail.
    
    An active/disconnected port as above will also block the HPD status of
    other active/disconnected ports to get updated (stuck in the connected
    state), until the former port is disabled, its PHY is disconnected and
    a ~10 ms delay has elapsed. This means the link state for all TypeC
    ports/CRTCs must be rechecked after a CRTC is disabled due to the above
    reason. For this disconnect the PHY synchronously after the CRTC/port is
    disabled and recheck all CRTCs for the above condition whenever such a
    port is disabled.
    
    To account for a race condition during driver loading where the sink is
    disconnected after the above sanitization step and before the HPD
    interrupts get enabled, do an explicit check/link reset if needed from
    the encoder's late_register hook, which is called after the HPD
    interrupts are enabled already.
    
    v2:
    - Handle an active/disconnected port blocking the HPD state update of
      another active/disconnected port.
    - Cancel the delayed work resetting the link also from the encoder
      enable/suspend/shutdown hooks.
    - Rebase on the earlier intel_modeset_lock_ctx_retry() addition,
      fixing here the missed atomic state reset in case of a retry.
    - Fix handling of an error return from intel_atomic_get_crtc_state().
    - Recheck if the port needs to be reset after all the atomic state
      is locked and async commits are waited on.
    
    v3:
    - Add intel_crtc_needs_link_reset(), instead of open-coding it,
      keep intel_crtc_has_encoders(). (Ville)
    - Fix state dumping and use a bitmask to track disabled CRTCs in
      intel_sanitize_all_crtcs(). (Ville)
    - Set internal in intel_atomic_state right after allocating it.
      (Ville)
    - Recheck all CRTCs (not yet force-disabled) after a CRTC is
      force-disabled for any reason (not only due to a link state)
      in intel_sanitize_all_crtcs().
    - Reduce delay after CRTC disabling to 20ms, and use the simpler
      msleep().
    - Clarify code comment about HPD behaviour in
      intel_sanitize_all_crtcs().
    - Move all the TC link reset logic to intel_tc.c .
    - Cancel the link reset work synchronously during system suspend,
      driver unload and shutdown.
    
    v4:
    - Rebased on previous patch, which allows calling the TC port
      suspend/cleanup handlers without modeset locks held; remove the
      display driver suspended assert from the link reset work
      accordingly.
    
    v5: (Ville)
    - Remove reset work canceling from intel_ddi_pre_pll_enable().
    - Track a crtc vs. pipe mask in intel_sanitize_all_crtcs().
    - Add reset_link_commit() to clarify the
      intel_modeset_lock_ctx_retry loop.
    
    Cc: Kai-Heng Feng <kai.heng.feng@canonical.com>
    Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
    Tested-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
    Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/5860Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20230512195513.2699-2-imre.deak@intel.com
    c598c335
intel_dp.c 166 KB