From: Lyude Paul <[email protected]>

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.

Changes since v1:
 - Fix removal of break statements from switch case

Signed-off-by: Lyude <[email protected]>
---
 src/sna/sna_display.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 0cf2bdb..79c72cc 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -5114,7 +5114,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;
@@ -5146,7 +5146,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++) {
@@ -5172,13 +5171,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
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to