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

Chris Wilson ickle at kemper.freedesktop.org
Fri Oct 30 09:16:31 PDT 2015


 src/sna/sna_display.c |   77 +++++++++++++++++++++++++++++++-------------------
 1 file changed, 48 insertions(+), 29 deletions(-)

New commits:
commit d78200e53e6e5b889a71f79c103aa4e1ba148c95
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 30 15:53:06 2015 +0000

    sna: Always refresh the blob property before reading
    
    Ensure that the property value for the EDID is current before
    retreiving the blob.
    
    Reported-by: Rui Tiago Matos <tiagomatos at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92728
    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 5cacedc..7d06450 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3113,6 +3113,29 @@ find_property(struct sna *sna, struct sna_output *output, const char *name)
 	return -1;
 }
 
+static void update_properties(struct sna *sna, struct sna_output *output)
+{
+	union compat_mode_get_connector compat_conn;
+	struct drm_mode_modeinfo dummy;
+
+	VG_CLEAR(compat_conn);
+
+	compat_conn.conn.connector_id = output->id;
+	compat_conn.conn.count_props = output->num_props;
+	compat_conn.conn.props_ptr = (uintptr_t)output->prop_ids;
+	compat_conn.conn.prop_values_ptr = (uintptr_t)output->prop_values;
+	compat_conn.conn.count_modes = 1; /* skip detect */
+	compat_conn.conn.modes_ptr = (uintptr_t)&dummy;
+	compat_conn.conn.count_encoders = 0;
+
+	(void)drmIoctl(sna->kgem.fd,
+		       DRM_IOCTL_MODE_GETCONNECTOR,
+		       &compat_conn.conn);
+
+	assert(compat_conn.conn.count_props == output->num_props);
+	output->update_properties = false;
+}
+
 static xf86OutputStatus
 sna_output_detect(xf86OutputPtr output)
 {
@@ -3240,6 +3263,13 @@ sna_output_attach_edid(xf86OutputPtr output)
 	if (sna_output->edid_idx == -1)
 		return;
 
+	/* Always refresh the blob as the kernel may randomly update the
+	 * id even if the contents of the blob doesn't change, and a
+	 * request for the stale id will return nothing.
+	 */
+	if (sna_output->update_properties)
+		update_properties(sna, sna_output);
+
 	raw = sna_output->edid_raw;
 	blob.length = sna_output->edid_len;
 
@@ -3352,6 +3382,9 @@ sna_output_attach_tile(xf86OutputPtr output)
 	if (id == -1)
 		goto out;
 
+	if (sna_output->update_properties)
+		update_properties(sna, sna_output);
+
 	VG_CLEAR(blob);
 	blob.blob_id = sna_output->prop_values[id];
 	blob.length = 0;
@@ -3962,29 +3995,6 @@ sna_output_set_property(xf86OutputPtr output, Atom property,
 	return TRUE;
 }
 
-static void update_properties(struct sna *sna, struct sna_output *output)
-{
-	union compat_mode_get_connector compat_conn;
-	struct drm_mode_modeinfo dummy;
-
-	VG_CLEAR(compat_conn);
-
-	compat_conn.conn.connector_id = output->id;
-	compat_conn.conn.count_props = output->num_props;
-	compat_conn.conn.props_ptr = (uintptr_t)output->prop_ids;
-	compat_conn.conn.prop_values_ptr = (uintptr_t)output->prop_values;
-	compat_conn.conn.count_modes = 1; /* skip detect */
-	compat_conn.conn.modes_ptr = (uintptr_t)&dummy;
-	compat_conn.conn.count_encoders = 0;
-
-	(void)drmIoctl(sna->kgem.fd,
-		       DRM_IOCTL_MODE_GETCONNECTOR,
-		       &compat_conn.conn);
-
-	assert(compat_conn.conn.count_props == output->num_props);
-	output->update_properties = false;
-}
-
 static Bool
 sna_output_get_property(xf86OutputPtr output, Atom property)
 {
commit 0196fa2da8140853e9542bf41b63cbd345e857be
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 30 15:26:02 2015 +0000

    sna: Handle getblob failures gracefully
    
    As the EDID property blob may be lost at time after we perform the
    detection probe (as the kernel may recreate the EDID blob at any time with
    a new id), presume that if there is no matching property that we can
    simply keep using the last known EDID.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=92728
    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 e2969b6..5cacedc 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3250,8 +3250,12 @@ sna_output_attach_edid(xf86OutputPtr output)
 		old = NULL;
 
 	blob.blob_id = sna_output->prop_values[sna_output->edid_idx];
-	DBG(("%s: attaching EDID id=%d, current=%d\n",
-	     __FUNCTION__, blob.blob_id, sna_output->edid_blob_id));
+	if (!blob.blob_id)
+		goto done;
+
+	DBG(("%s(%s): attaching EDID id=%d, current=%d\n",
+	     __FUNCTION__, output->name,
+	     blob.blob_id, sna_output->edid_blob_id));
 	if (blob.blob_id == sna_output->edid_blob_id && 0) { /* sigh */
 		if (output->MonInfo) {
 			/* XXX the property keeps on disappearing... */
@@ -3269,11 +3273,14 @@ sna_output_attach_edid(xf86OutputPtr output)
 	}
 
 	blob.data = (uintptr_t)raw;
-	if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPBLOB, &blob))
-		goto done;
+	if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPBLOB, &blob)) {
+		DBG(("%s(%s): failed to read blob, reusing previous\n",
+		     __FUNCTION__, output->name));
+		goto skip_read;
+	}
 
-	DBG(("%s: retrieving blob id=%d, length=%d\n",
-	     __FUNCTION__, blob.blob_id, blob.length));
+	DBG(("%s(%s): retrieving blob id=%d, length=%d\n",
+	     __FUNCTION__, output->name, blob.blob_id, blob.length));
 
 	if (blob.length > sna_output->edid_len) {
 		raw = realloc(raw, blob.length);
@@ -3300,6 +3307,8 @@ sna_output_attach_edid(xf86OutputPtr output)
 	if (old &&
 	    blob.length == sna_output->edid_len &&
 	    memcmp(old, raw, blob.length) == 0) {
+		DBG(("%s(%s): EDID + MonInfo is unchanged\n",
+		     __FUNCTION__, output->name));
 		assert(sna_output->edid_raw == raw);
 		sna_output->edid_blob_id = blob.blob_id;
 		RRChangeOutputProperty(output->randr_output,


More information about the xorg-commit mailing list