xf86-video-intel: 2 commits - src/sna/sna_display.c

Chris Wilson ickle at kemper.freedesktop.org
Tue Jun 24 03:39:04 PDT 2014


 src/sna/sna_display.c |   57 ++++++++++++++++++++++++++++++++++----------------
 1 file changed, 39 insertions(+), 18 deletions(-)

New commits:
commit 5c8829b30ad3acd2e59dac9ffa2aba8aadcada61
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jun 24 11:35:23 2014 +0100

    sna: Add some more DBG around connector discovery
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=80355
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 45af254..0956619 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -2328,8 +2328,10 @@ sna_output_detect(xf86OutputPtr output)
 
 	DBG(("%s(%s:%d)\n", __FUNCTION__, output->name, sna_output->id));
 
-	if (!sna_output->id)
+	if (!sna_output->id) {
+		DBG(("%s(%s) hiding due to lost connection\n", __FUNCTION__, output->name));
 		return XF86OutputStatusDisconnected;
+	}
 
 	VG_CLEAR(compat_conn);
 	compat_conn.conn.connector_id = sna_output->id;
@@ -3275,6 +3277,7 @@ sna_output_add(struct sna *sna, unsigned id, unsigned serial)
 		DBG(("%s: GETCONNECTOR[%d] failed, ret=%d\n", __FUNCTION__, id, errno));
 		return -1;
 	}
+	assert(compat_conn.conn.connector_id == id);
 
 	if (compat_conn.conn.connector_type < ARRAY_SIZE(output_names))
 		output_name = output_names[compat_conn.conn.connector_type];
@@ -3365,6 +3368,7 @@ sna_output_add(struct sna *sna, unsigned id, unsigned serial)
 		DBG(("%s: second! GETCONNECTOR failed, ret=%d\n", __FUNCTION__, errno));
 		goto cleanup;
 	}
+	assert(compat_conn.conn.connector_id == id);
 
 	/* statically constructed property list */
 	assert(sna_output->num_props == compat_conn.conn.count_props);
@@ -3414,6 +3418,7 @@ sna_output_add(struct sna *sna, unsigned id, unsigned serial)
 		goto cleanup;
 	}
 
+	DBG(("%s: inserting output #%d of %d\n", __FUNCTION__, sna->mode.num_real_output, config->num_output));
 	for (i = config->num_output; i > sna->mode.num_real_output; i--) {
 		outputs[i] = outputs[i-1];
 		assert(outputs[i]->driver_private == NULL);
@@ -3489,6 +3494,7 @@ reset:
 	     sna_output->possible_encoders,
 	     serial, sna_output->edid_idx, sna_output->dpms_id,
 	     (unsigned long)(uintptr_t)output->crtc));
+	assert(sna_output->id == id);
 
 	return 1;
 
@@ -3522,6 +3528,8 @@ static void sna_output_del(xf86OutputPtr output)
 		if (config->output[i] == output)
 			break;
 	assert(i < to_sna(scrn)->mode.num_real_output);
+	DBG(("%s: removing output #%d of %d\n",
+	     __FUNCTION__, i, to_sna(scrn)->mode.num_real_output));
 
 	for (; i < config->num_output; i++) {
 		config->output[i] = config->output[i+1];
@@ -3630,7 +3638,9 @@ void sna_mode_discover(struct sna *sna)
 		if (to_sna_output(output)->serial == serial)
 			continue;
 
-		DBG(("%s: removing output %s (id=%d)\n", __FUNCTION__, output->name, to_sna_output(output)->id));
+		DBG(("%s: removing output %s (id=%d), serial=%u [now %u]\n",
+		     __FUNCTION__, output->name, to_sna_output(output)->id,
+		    to_sna_output(output)->serial, serial));
 		if (sna->flags & SNA_REMOVE_OUTPUTS) {
 			sna_output_del(output); i--;
 		} else {
commit 271ed88e517745505c133bd68c40a8566ec8a625
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jun 24 11:24:26 2014 +0100

    sna: Ensure serial is not 0 for runtime MST discovery
    
    We reserve serial==0 for the initial setup that is run before RandR is
    configured. After the server is running, we have to take extra steps to
    make the outputs visible to userspace.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index cb2fcc3..45af254 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -141,8 +141,8 @@ struct sna_property {
 
 struct sna_output {
 	xf86OutputPtr base;
-	int id;
-	int serial;
+	unsigned id;
+	unsigned serial;
 
 	unsigned possible_encoders;
 	unsigned attached_encoders;
@@ -3243,7 +3243,7 @@ static int name_from_path(struct sna *sna,
 }
 
 static int
-sna_output_add(struct sna *sna, int id, int serial)
+sna_output_add(struct sna *sna, unsigned id, unsigned serial)
 {
 	ScrnInfoPtr scrn = sna->scrn;
 	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
@@ -3579,8 +3579,9 @@ void sna_mode_discover(struct sna *sna)
 	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
 	struct drm_mode_card_res res;
 	uint32_t connectors[32];
-	int i, j, serial;
-	int changed = 0;
+	unsigned changed = 0;
+	unsigned serial;
+	int i, j;
 
 	DBG(("%s()\n", __FUNCTION__));
 	VG_CLEAR(connectors);
@@ -3601,11 +3602,16 @@ void sna_mode_discover(struct sna *sna)
 	assert(sna->mode.num_real_encoder == res.count_encoders);
 
 	serial = ++sna->mode.serial;
+	if (serial == 0)
+		serial = ++sna->mode.serial;
+
 	for (i = 0; i < res.count_connectors; i++) {
 		for (j = 0; j < sna->mode.num_real_output; j++) {
-			if (to_sna_output(config->output[j])->id == connectors[i]) {
-				DBG(("%s: found %s (id=%d)\n", __FUNCTION__, config->output[j]->name, connectors[i]));
-				to_sna_output(config->output[j])->serial = serial;
+			xf86OutputPtr output = config->output[j];
+			if (to_sna_output(output)->id == connectors[i]) {
+				DBG(("%s: found %s (id=%d)\n", __FUNCTION__, output->name, connectors[i]));
+				assert(to_sna_output(output)->id);
+				to_sna_output(output)->serial = serial;
 				break;
 			}
 		}
@@ -3617,16 +3623,21 @@ void sna_mode_discover(struct sna *sna)
 
 	for (i = 0; i < sna->mode.num_real_output; i++) {
 		xf86OutputPtr output = config->output[i];
-		if (to_sna_output(output)->serial != serial) {
-			DBG(("%s: removing output %s (id=%d)\n", __FUNCTION__, output->name, connectors[i]));
-			if (sna->flags & SNA_REMOVE_OUTPUTS) {
-				sna_output_del(output); i--;
-			} else {
-				to_sna_output(output)->id = 0;
-				output->crtc = NULL;
-			}
-			changed |= 2;
+
+		if (to_sna_output(output)->id == 0)
+			continue;
+
+		if (to_sna_output(output)->serial == serial)
+			continue;
+
+		DBG(("%s: removing output %s (id=%d)\n", __FUNCTION__, output->name, to_sna_output(output)->id));
+		if (sna->flags & SNA_REMOVE_OUTPUTS) {
+			sna_output_del(output); i--;
+		} else {
+			to_sna_output(output)->id = 0;
+			output->crtc = NULL;
 		}
+		changed |= 2;
 	}
 
 	if (changed) {


More information about the xorg-commit mailing list