• Imre Deak's avatar
    drm/i915/icl: Fix HPD handling for TypeC legacy ports · f6bff60e
    Imre Deak authored
    Atm HPD disconnect events on TypeC ports will break things, since we'll
    switch the TypeC mode (between legacy and disconnected modes as well as
    among USB DP alternate, Thunderbolt alternate and disconnected modes) on
    the fly from the HPD disconnect interrupt work while the port may be
    still active.
    
    Even if the port happens to be not active during the disconnect we'd
    still have a problem during a subsequent modeset or AUX transfer that
    could happen regardless of the port's connected state. For instance the
    system resume display mode restore code and userspace could perform a
    modeset on the port or userspace could start an AUX transfer even if the
    port is in disconnected state.
    
    To fix this keep TypeC legacy ports in legacy mode whenever we're not
    suspended. This mode is a static configuration as opposed to the
    Thunderbolt and USB DP alternate modes between which we can switch
    dynamically.
    
    We determine if a TypeC port is legacy (wired to a legacy HDMI or a
    legacy DP connector) via the VBT DDI port specific USB-TypeC and
    Thunderbolt flags. If both these flags are cleared then the port is
    configured for legacy mode.
    
    On such legacy ports we'll run the TypeC PHY connect sequence explicitly
    during driver loading and system resume (vs. running the sequence during
    HPD processing). The connect will succeed even if the display is not
    connected to begin with (or disappears during the suspended state) since
    for legacy ports the PORT_TX_DFLEXDPPMS / DP_PHY_MODE_STATUS_COMPLETED
    flag is always set (as opposed to the USB DP alternate mode where it
    gets set only when a display is connected).
    
    Correspondingly run the TypeC PHY disconnect sequence during system
    suspend and driver unloading. For the unloading case I had to split
    up intel_dp_encoder_destroy() to be able to have the 1. flush any
    pending encoder work, 2. disconnect TC PHY, 3. call DRM core cleanup and
    kfree on the encoder object.
    
    For now run the PHY disconnect during suspend only for TypeC legacy
    ports. We will need to disconnect even in USB DP alternate mode in the
    future, but atm we don't have a way to reconnect the port in this mode
    during resume if the display disappears while being suspended. So for
    now punt on this case.
    
    Note that we do not disconnect the port during runtime suspend; in
    legacy mode there are no shared HW resources (PHY lanes) with other HW
    blocks (USB), so no need to release / reacquire these resources as with
    USB DP alternate mode. The only reason to disconnect legacy ports during
    system suspend is that the PORT_TX_DFLEXDPPMS /
    DP_PHY_MODE_STATUS_COMPLETED flag must be rechecked and the port must be
    connected again during system resume. We'll also have to turn the check
    for this flag into a poll, after figuring out what's the proper timeout
    value for it.
    
    v2:
    - Remove the redundant special casing of legacy mode when doing a
      disconnect in icl_tc_port_connected(). It's guaranteed already that we
      won't disconnect legacy ports in that function.
    - Add a note about the new intel_ddi_encoder_destroy() hook.
    - Reword the commit message after switching to the VBT based detection.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108070
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108924
    Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
    Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
    Cc: José Roberto de Souza <jose.souza@intel.com>
    Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
    Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
    Reviewed-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20181214182703.18865-4-imre.deak@intel.com
    f6bff60e
intel_drv.h 79.4 KB