On Mon, 19 May 2025, Imre Deak <[email protected]> wrote:
> Due to a problem in the iTBT DP-in adapter's firmware the sink on a TBT
> link may get disconnected inadvertently if the SINK_COUNT_ESI and the
> DP_LINK_SERVICE_IRQ_VECTOR_ESI0 registers are read in a single AUX
> transaction. Work around the issue by reading these registers in
> separate transactions.
>
> The issue affects MTL+ platforms and will be fixed in the DP-in adapter
> firmware, however releasing that firmware fix may take some time and is
> not guaranteed to be available for all systems. Based on this apply the
> workaround on affected platforms.
>
> See HSD #13013007775.
>
> v2: Cc'ing Mika Westerberg.

In general, please don't resend just for the sake of adding a Cc. It
triggers a full CI rerun.

BR,
Jani.

>
> Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13760
> Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14147
> Cc: Mika Westerberg <[email protected]>
> Cc: [email protected]
> Signed-off-by: Imre Deak <[email protected]>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index 21297bc4cc00d..208a953b04a2f 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -4538,6 +4538,23 @@ intel_dp_mst_disconnect(struct intel_dp *intel_dp)
>  static bool
>  intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *esi)
>  {
> +     struct intel_display *display = to_intel_display(intel_dp);
> +
> +     /*
> +      * Display WA for HSD #13013007775: mtl/arl/lnl
> +      * Read the sink count and link service IRQ registers in separate
> +      * transactions to prevent disconnecting the sink on a TBT link
> +      * inadvertently.
> +      */
> +     if (IS_DISPLAY_VER(display, 14, 20) && !display->platform.battlemage) {
> +             if (drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_COUNT_ESI, esi, 3) 
> != 3)
> +                     return false;
> +
> +             /* DP_SINK_COUNT_ESI + 3 == DP_LINK_SERVICE_IRQ_VECTOR_ESI0 */
> +             return drm_dp_dpcd_readb(&intel_dp->aux, 
> DP_LINK_SERVICE_IRQ_VECTOR_ESI0,
> +                                      &esi[3]) == 1;
> +     }
> +
>       return drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_COUNT_ESI, esi, 4) == 4;
>  }

-- 
Jani Nikula, Intel

Reply via email to