From: Lyude Paul <cpaul@xxxxxxxxxx> DRM does not always update the status of each connector during a hotplug event, and it's generally expected that userspace is supposed to handle that by reprobing. This happens in a couple situations: suspend/resume, MST hotplugs, and probably a few others. As a result, making this assumption actually breaks MST hotplugging. Signed-off-by: Lyude <cpaul@xxxxxxxxxx> --- src/sna/sna_display.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c index 16d0321..6299d1e 100644 --- a/src/sna/sna_display.c +++ b/src/sna/sna_display.c @@ -5038,14 +5038,11 @@ output_check_status(struct sna *sna, struct sna_output *output) switch (compat_conn.conn.connection) { case DRM_MODE_CONNECTED: status = XF86OutputStatusConnected; - break; case DRM_MODE_DISCONNECTED: status = XF86OutputStatusDisconnected; - break; default: case DRM_MODE_UNKNOWNCONNECTION: status = XF86OutputStatusUnknown; - break; } return output->status == status; } @@ -5055,7 +5052,7 @@ void sna_mode_discover(struct sna *sna, bool tell) ScreenPtr screen = xf86ScrnToScreen(sna->scrn); xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn); struct drm_mode_card_res res; - uint32_t connectors[32], now; + uint32_t connectors[32]; unsigned changed = 0; unsigned serial; int i, j; @@ -5087,7 +5084,6 @@ void sna_mode_discover(struct sna *sna, bool tell) if (serial == 0) serial = ++sna->mode.serial; - now = GetTimeInMillis(); for (i = 0; i < res.count_connectors; i++) { DBG(("%s: connector[%d] = %d\n", __FUNCTION__, i, connectors[i])); for (j = 0; j < sna->mode.num_real_output; j++) { @@ -5113,13 +5109,10 @@ void sna_mode_discover(struct sna *sna, bool tell) continue; if (sna_output->serial == serial) { - if (output_check_status(sna, sna_output)) { - DBG(("%s: output %s (id=%d), retained state\n", - __FUNCTION__, output->name, sna_output->id)); - sna_output->last_detect = now; - } else { - DBG(("%s: output %s (id=%d), changed state, reprobing\n", - __FUNCTION__, output->name, sna_output->id)); + if (!output_check_status(sna, sna_output)) { + DBG(("%s: output %s (id=%d), changed state, reprobing]\n", + __FUNCTION__, output->name, sna_output->id, + sna_output->serial, serial)); sna_output->last_detect = 0; changed |= 4; } -- 2.5.5 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx