[PATCH 17/20] drm/i915/dp: Check SST link status while handling link service IRQs

Luca Coelho luca at coelho.fi
Thu Jul 3 13:05:57 UTC 2025


On Thu, 2025-06-26 at 11:20 +0300, Imre Deak wrote:
> From: Imre Deak <imre.deak at gmail.com>
> 
> Move checking the link status for SST to
> intel_dp_handle_link_service_irq(). This is the logical place for the
> check which should only happen in response to a LINK_STATUS_CHANGE sink
> IRQ. This IRQ is only supported by DPCD revision >= 1.2, so for sinks
> with an older DPCD revision the link status is checked in response to
> any HPD IRQ. For newer DPCD revisions however the link status check can
> be made conditional on LINK_STATUS_CHANGE.
> 
> For now keep the current behavior of always forcing a link status check
> regardless of LINK_STATUS_CHANGE being set or not.
> 
> This also prepares for a follow-up change sharing the link service IRQ
> handler for SST and MST (on MST the link status check only happening in
> response to a LINK_STATUS_CHANGE IRQ).
> 
> Signed-off-by: Imre Deak <imre.deak at gmail.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 90f6fe20e4c0d..000c57da92d60 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -5481,6 +5481,9 @@ static bool intel_dp_handle_link_service_irq(struct intel_dp *intel_dp, u8 irq_m
>  	if (irq_mask & RX_CAP_CHANGED)
>  		reprobe_needed = true;
>  
> +	if (irq_mask & LINK_STATUS_CHANGED)
> +		intel_dp_check_link_state(intel_dp);
> +
>  	if (irq_mask & HDMI_LINK_STATUS_CHANGED)
>  		intel_dp_handle_hdmi_link_status_change(intel_dp);
>  
> @@ -5534,14 +5537,18 @@ intel_dp_short_pulse(struct intel_dp *intel_dp)
>  
>  	intel_dp_handle_device_service_irq(intel_dp, esi[1]);
>  
> +	/*
> +	 * Force checking the link status for DPCD_REV < 1.2
> +	 * TODO: let the link status check depend on LINK_STATUS_CHANGED
> +	 * for DPCD_REV >= 1.2
> +	 */
> +	esi[3] |= LINK_STATUS_CHANGED;
>  	if (intel_dp_handle_link_service_irq(intel_dp, esi[3]))
>  		reprobe_needed = true;
>  
>  	/* Handle CEC interrupts, if any */
>  	drm_dp_cec_irq(&intel_dp->aux);
>  
> -	intel_dp_check_link_state(intel_dp);
> -
>  	if (READ_ONCE(intel_dp->downstream_port_changed)) {
>  		WRITE_ONCE(intel_dp->downstream_port_changed, false);
>  		reprobe_needed = true;

Reviewed-by: Luca Coelho <luciano.coelho at intel.com>

--
Cheers,
Luca.


More information about the Intel-gfx mailing list