drm/i915/dp: Read DPRX for all long HPD pulses
The TBT DP tunnel BW request logic in the Thunderbolt Connection Manager depends on the GFX driver reading out the sink's DPRX capabilities in response to a long HPD pulse. Since in i915 this read-out can be blocked by another connector's/encoder's hotplug event handling (which is serialized by drm_mode_config::connection_mutex), do a dummy DPRX read-out in the encoder's HPD pulse handler (which is not blocked by other encoders). Reviewed-by: Uma Shankar <uma.shankar@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240220211841.448846-21-imre.deak@intel.com
This commit is contained in:
parent
fb687904aa
commit
a32f3a9541
@ -6165,6 +6165,7 @@ intel_dp_hpd_pulse(struct intel_digital_port *dig_port, bool long_hpd)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
struct intel_dp *intel_dp = &dig_port->dp;
|
||||
u8 dpcd[DP_RECEIVER_CAP_SIZE];
|
||||
|
||||
if (dig_port->base.type == INTEL_OUTPUT_EDP &&
|
||||
(long_hpd || !intel_pps_have_panel_power_or_vdd(intel_dp))) {
|
||||
@ -6187,6 +6188,17 @@ intel_dp_hpd_pulse(struct intel_digital_port *dig_port, bool long_hpd)
|
||||
dig_port->base.base.name,
|
||||
long_hpd ? "long" : "short");
|
||||
|
||||
/*
|
||||
* TBT DP tunnels require the GFX driver to read out the DPRX caps in
|
||||
* response to long HPD pulses. The DP hotplug handler does that,
|
||||
* however the hotplug handler may be blocked by another
|
||||
* connector's/encoder's hotplug handler. Since the TBT CM may not
|
||||
* complete the DP tunnel BW request for the latter connector/encoder
|
||||
* waiting for this encoder's DPRX read, perform a dummy read here.
|
||||
*/
|
||||
if (long_hpd)
|
||||
intel_dp_read_dprx_caps(intel_dp, dpcd);
|
||||
|
||||
if (long_hpd) {
|
||||
intel_dp->reset_link_params = true;
|
||||
return IRQ_NONE;
|
||||
|
Loading…
x
Reference in New Issue
Block a user