diff options
| author | Imre Deak <imre.deak@intel.com> | 2026-02-25 18:46:18 +0200 |
|---|---|---|
| committer | Imre Deak <imre.deak@intel.com> | 2026-03-03 17:49:11 +0200 |
| commit | 7dc457ace829e2e3efb1503afe992b5f217387c0 (patch) | |
| tree | 3c203c492b23c99df635897bbd41597a96362c1f /drivers/gpu | |
| parent | 683853b166f051eba43088092d4d1d85cd8ac3cd (diff) | |
| download | linux-7dc457ace829e2e3efb1503afe992b5f217387c0.tar.gz linux-7dc457ace829e2e3efb1503afe992b5f217387c0.zip | |
drm/i915/dp: Ack only the handled link service IRQs
Ack only those SST link service IRQs that will be handled, similarly to
device service IRQs. While at it add asserts that only the known/acked
link service IRQs are handled both in the MST and SST case.
Reviewed-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://patch.msgid.link/20260225164618.1261368-21-imre.deak@intel.com
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_dp.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 17439a415926..0c03b6fb6fd8 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -4937,6 +4937,16 @@ intel_dp_mst_disconnect(struct intel_dp *intel_dp) DP_DOWN_REP_MSG_RDY | \ DP_UP_REQ_MSG_RDY) +#define INTEL_DP_LINK_SERVICE_IRQ_MASK_SST (RX_CAP_CHANGED | \ + LINK_STATUS_CHANGED | \ + HDMI_LINK_STATUS_CHANGED | \ + CONNECTED_OFF_ENTRY_REQUESTED | \ + DP_TUNNELING_IRQ) + +#define INTEL_DP_LINK_SERVICE_IRQ_MASK_MST (RX_CAP_CHANGED | \ + LINK_STATUS_CHANGED | \ + DP_TUNNELING_IRQ) + static bool intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *esi) { @@ -5035,6 +5045,7 @@ static bool intel_dp_get_and_ack_sink_irq_esi_sst(struct intel_dp *intel_dp, u8 esi); esi[1] &= INTEL_DP_DEVICE_SERVICE_IRQ_MASK_SST; + esi[3] &= INTEL_DP_LINK_SERVICE_IRQ_MASK_SST; if (mem_is_zero(&esi[1], 3)) return true; @@ -5573,7 +5584,7 @@ intel_dp_check_mst_status(struct intel_dp *intel_dp) drm_dbg_kms(display->drm, "DPRX ESI: %4ph\n", esi); - ack[3] |= esi[3] & (RX_CAP_CHANGED | LINK_STATUS_CHANGED | DP_TUNNELING_IRQ); + ack[3] |= esi[3] & INTEL_DP_LINK_SERVICE_IRQ_MASK_MST; intel_dp_mst_hpd_irq(intel_dp, esi, ack); @@ -5581,6 +5592,7 @@ intel_dp_check_mst_status(struct intel_dp *intel_dp) break; drm_WARN_ON(display->drm, ack[1] & ~INTEL_DP_DEVICE_SERVICE_IRQ_MASK_MST); + drm_WARN_ON(display->drm, ack[3] & ~INTEL_DP_LINK_SERVICE_IRQ_MASK_MST); if (!intel_dp_ack_sink_irq_esi(intel_dp, ack)) drm_dbg_kms(display->drm, "Failed to ack ESI\n"); @@ -5890,6 +5902,9 @@ static bool intel_dp_handle_link_service_irq(struct intel_dp *intel_dp, u8 irq_m struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; bool reprobe_needed = false; + 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) reprobe_needed = true; |
