Message ID | 1463607358-22734-1-git-send-email-cpaul@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Ping, any update on this? On Wed, 2016-05-18 at 17:35 -0400, Lyude wrote: > From: Lyude Paul <cpaul@redhat.com> > > 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@redhat.com> > --- > 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; > }
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; }