Re: [PATCH 2/5] drm/bridge_connector: preserve connector status for IRQ-only HPD events
From: Dmitry Baryshkov
Date: Sun Jul 12 2026 - 06:34:18 EST
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 <yongxing.mou@xxxxxxxxxxxxxxxx>
> ---
> 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