On Thu, 01 Oct 2026, FNU VISHWANATHA <[email protected]> wrote:
> After resume from warm boot/G3, immediately force a topology link address
> reprobe to ensure all MST ports are properly detected. This works around a
> race condition where some MST hubs incorrectly report port status bits before
> their internal state is fully initialized.
>
> By forcing the reprobe immediately after resume, combined with the fix in
> drm_dp_mst_handle_link_address_port() that detects input->output port
> transitions, we ensure that all displays are reliably detected even if the
> hub initially reports incorrect port status.
>
> Signed-off-by: FNU VISHWANATHA <[email protected]>

Is there a bug report about this with logs?

> ---
>  drivers/gpu/drm/i915/display/intel_dp.c | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index 3a67990411b3..fceda523efa3 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -7088,6 +7088,7 @@ void intel_dp_mst_resume(struct intel_display *display)
>  
>         for_each_intel_encoder(display->drm, encoder) {
>                 struct intel_dp *intel_dp;
> +               struct drm_dp_mst_branch *mstb;
>                 int ret;
>  
>                 if (encoder->type != INTEL_OUTPUT_DDI)
> @@ -7102,6 +7103,23 @@ void intel_dp_mst_resume(struct intel_display *display)
>                 if (ret) {
>                         intel_dp->is_mst = false;
>                         drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst.mgr, 
> false);
> +                       continue;
> +               }
> +
> +               /* After resume, force a link address reprobe to ensure all 
> ports
> +                * are properly detected. This works around a race condition 
> where
> +                * some MST hubs incorrectly report port status bits during 
> warm boot/G3.
> +                * Ref: Sporadic second display not detected after warm 
> boot/G3
> +                */
> +               if (intel_dp->is_mst) {
> +                       mutex_lock(&intel_dp->mst.mgr.lock);
> +                       mstb = intel_dp->mst.mgr.mst_primary;
> +                       if (mstb) {
> +                               drm_dp_mst_topology_get_mstb(mstb);
> +                               mstb->link_address_sent = false;
> +                               drm_dp_mst_topology_put_mstb(mstb);
> +                       }
> +                       mutex_unlock(&intel_dp->mst.mgr.lock);
>                 }
>         }
>  }

-- 
Jani Nikula, Intel

Reply via email to