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