On Mon, Jun 29, 2026 at 10:48:04PM +0800, Yongxing Mou wrote: > The bridge connector HPD handling path currently updates > connector->status for every hpd_notify() invocation. > > This does not work well for IRQ-only notifications where the event being > reported is carried by extra_status and no connector status transition is > associated with it. > > One example is DP MST. HPD IRQs are propagated through > drm_bridge_hpd_notify_*() so that bridge drivers can process the > notification. During MST operation, however, the SST connector attached > to the bridge connector is intentionally kept disconnected while the MST > topology manager handles all connector creation, removal and hotplug > processing. > > Updating connector->status for an IRQ-only MST notification may cause > the SST connector state to oscillate between connected and disconnected > depending on the notification path. These artificial state transitions > can later be detected by the polling logic and result in unnecessary > hotplug events being generated. Userspace then re-probes connector > status, potentially triggering the same sequence again.
Then the API might need to be adjusted. Remember, we have two usecases, which we must be able to interpret correctly: - The driver gets separate HPD and IRQ_HPD events. - The driver gets HPD and IRQ_HPD at the same time. > > Treat notifications with status == connector_status_unknown and a valid > extra_status as IRQ-only events. Forward the notification to bridge > drivers without modifying connector->status. > > This keeps IRQ delivery working while leaving connector state management > to the component that actually owns it, such as the DP MST topology > framework. How is it handled by other drivers (i915, amd, nouveau)? > > Signed-off-by: Yongxing Mou <[email protected]> > --- > drivers/gpu/drm/display/drm_bridge_connector.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c > b/drivers/gpu/drm/display/drm_bridge_connector.c > index 5edca47a025f..7334d6677604 100644 > --- a/drivers/gpu/drm/display/drm_bridge_connector.c > +++ b/drivers/gpu/drm/display/drm_bridge_connector.c > @@ -163,6 +163,18 @@ static void drm_bridge_connector_handle_hpd(struct > drm_bridge_connector *drm_bri > struct drm_connector *connector = &drm_bridge_connector->base; > struct drm_device *dev = connector->dev; > > + /* > + * IRQ-only notification: extra_status carries the event but > + * status is unknown — do not overwrite connector->status. But it's not unknown at this point. The connector status is reported following the HPD status. > + */ > + if (status == connector_status_unknown && > + extra_status != DRM_CONNECTOR_NO_EXTRA_STATUS) { > + drm_bridge_connector_hpd_notify(connector, > + connector->status, > + extra_status, NULL); > + return; > + } > + > mutex_lock(&dev->mode_config.mutex); > connector->status = status; > mutex_unlock(&dev->mode_config.mutex); > > -- > 2.43.0 > -- With best wishes Dmitry
