• Imre Deak's avatar
    drm/dp: Add support for DP tunneling · 295654f7
    Imre Deak authored
    Add support for Display Port tunneling. For now this includes the
    support for Bandwidth Allocation Mode (BWA), leaving adding Panel Replay
    support for later.
    
    BWA allows using displays that share the same (Thunderbolt) link with
    their maximum resolution. Atm, this may not be possible due to the
    coarse granularity of partitioning the link BW among the displays on the
    link: the BW allocation policy is in a SW/FW/HW component on the link
    (on Thunderbolt it's the SW or FW Connection Manager), independent of
    the driver. This policy will set the DPRX maximum rate and lane count
    DPCD registers the GFX driver will see (0x00000, 0x00001, 0x02200,
    0x02201) based on the available link BW.
    
    The granularity of the current BW allocation policy is coarse, based on
    the required link rate in the 1.62Gbs..8.1Gbps range and it may prevent
    using higher resolutions all together: the display connected first will
    get a share of the link BW which corresponds to its full DPRX capability
    (regardless of the actual mode it uses). A subsequent display connected
    will only get the remaining BW, which could be well below its full
    capability.
    
    BWA solves the above coarse granularity (reducing it to a 250Mbs..1Gps
    range) and first-come/first-served issues by letting the driver request
    the BW for each display on a link which reflects the actual modes the
    displays use.
    
    This patch adds the DRM core helper functions, while a follow-up change
    in the patchset takes them into use in the i915 driver.
    
    v2:
    - Fix prepare_to_wait vs. wake-up cond check order in
      allocate_tunnel_bw(). (Ville)
    - Move tunnel==NULL checks from callers in drivers to here. (Ville)
    - Avoid var inits in declaration blocks that can fail or have
      side-effects. (Ville)
    - Use u8 for driver and group IDs. (Ville)
    - Simplify API removing drm_dp_tunnel_get/put_untracked(). (Ville)
    - Reuse str_yes_no() instead of a local yes_no_chr(). (Ville)
    - s/drm_dp_tunnel_atomic_clear_state()/free_tunnel_state() and unexport
      the function. (Ville)
    - s/clear_tunnel_group_state()/free_group_state() and move kfree() to
      this function. (Ville)
    - Add separate group_free_bw() helper and describe what the tunnel
      estimated BW includes. (Ville)
    - Improve help text for CONFIG_DRM_DISPLAY_DP_TUNNEL. (Ville)
    - Add code comment explaining the purpose of DPCD reg read helpers.
      (Ville)
    - Add code comment describing the tunnel group name prefix format.
      (Ville)
    - Report the allocated BW as undetermined until the first allocation
      request.
    - Skip allocation requests matching the previous request.
    - Clear any stale BW request status flags before a new request.
    - Add missing error return check of drm_dp_tunnel_atomic_get_group_state()
      in drm_dp_tunnel_atomic_set_stream_bw().
    - Add drm_dp_tunnel_get_allocated_bw().
    - s/drm_dp_tunnel_atomic_get_tunnel_bw/drm_dp_tunnel_atomic_get_required_bw
    - Fix return value description in function doc of drm_dp_tunnel_detect().
    - Add function documentation to all exported functions.
    
    v3:
    - Improve grouping of fields in drm_dp_tunnel_group struct. (Uma)
    - Fix validating the BW granularity DPCD reg value. (Uma)
    - Document return value of check_and_clear_status_change(). (Uma)
    - Fix resetting drm_dp_tunnel_ref::tunnel in drm_dp_tunnel_ref_put().
      (Ville)
    - Allow for ALLOCATED_BW to change after a BWA enable/disable sequence.
    
    Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
    Reviewed-by: default avatarUma Shankar <uma.shankar@intel.com>
    Reviewed-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/20240226185246.1276018-2-imre.deak@intel.com
    295654f7
drm_dp_tunnel.h 6.2 KB