There is no reason to distinguish between DPRX capability changes
signaled via a long HPD and via an RX_CAP_CHANGED HPD IRQ.

Both cases result in reading out the DPRX capabilities and updating the
corresponding sink and common capabilities cached in intel_dp, however
only the long HPD resets the link training/recovery state and MST link
probe parameters correspondingly. The link training/recovery state may
contain reduced maximum link rate/lane count values left over from a
previous link training failure.

Based on the above after an RX_CAP_CHANGED increased the link rate, lane
count parameters the maximum link rate/lane count in the link
training/recovery state may remain below these, leaving the newly added
valid configurations unavailable for subsequent modesets in an
inconsistent way.

Handle RX_CAP_CHANGED IRQs the same way as long HPDs and reset the link
recovery state and MST link probe parameters in that case as well.

Signed-off-by: Imre Deak <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_dp.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 13163dd085e91..9c530ef12b7cc 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -6026,8 +6026,10 @@ static bool intel_dp_handle_link_service_irq(struct 
intel_dp *intel_dp, u8 irq_m
        drm_WARN_ON(display->drm, irq_mask & 
~(INTEL_DP_LINK_SERVICE_IRQ_MASK_SST |
                                               
INTEL_DP_LINK_SERVICE_IRQ_MASK_MST));
 
-       if (irq_mask & RX_CAP_CHANGED)
+       if (irq_mask & RX_CAP_CHANGED) {
+               intel_dp_reset_link_params_defer(intel_dp);
                reprobe_needed = true;
+       }
 
        if (irq_mask & LINK_STATUS_CHANGED)
                intel_dp_check_link_state(intel_dp);
-- 
2.49.1

Reply via email to