On Fri, 02 Oct 2026, Jani Nikula <[email protected]> wrote: > 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);
This is topology manager internal stuff we have no business messing with in drivers. So much so that drm_dp_mst_topology_get_mstb() and drm_dp_mst_topology_put_mstb() are *static* functions in drm_dp_mst_topology.c. How did you build and run this? >> } >> } >> } -- Jani Nikula, Intel
