xf86-video-intel: src/sna/sna_display.c
Chris Wilson
ickle at kemper.freedesktop.org
Fri May 20 10:45:22 UTC 2016
src/sna/sna_display.c | 34 +++++++++++++++++++++++++++++-----
1 file changed, 29 insertions(+), 5 deletions(-)
New commits:
commit 25d2c2d049a8c9f2b2ef0895d6079c8b273ad121
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed May 18 23:26:12 2016 +0100
sna: Confirm the EDID is the same after a hotplug before ignoring
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 16d0321..79c660f 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -5021,19 +5021,25 @@ output_check_status(struct sna *sna, struct sna_output *output)
{
union compat_mode_get_connector compat_conn;
struct drm_mode_modeinfo dummy;
+ struct drm_mode_get_blob blob;
xf86OutputStatus status;
+ char *edid;
VG_CLEAR(compat_conn);
+ compat_conn.conn.connection = -1;
compat_conn.conn.connector_id = output->id;
compat_conn.conn.count_modes = 1; /* skip detect */
compat_conn.conn.modes_ptr = (uintptr_t)&dummy;
compat_conn.conn.count_encoders = 0;
- compat_conn.conn.count_props = 0;
+ 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_props = output->num_props;
- (void)drmIoctl(sna->kgem.fd,
- DRM_IOCTL_MODE_GETCONNECTOR,
- &compat_conn.conn);
+ if (drmIoctl(sna->kgem.fd,
+ DRM_IOCTL_MODE_GETCONNECTOR,
+ &compat_conn.conn) == 0)
+ output->update_properties = false;
switch (compat_conn.conn.connection) {
case DRM_MODE_CONNECTED:
@@ -5047,7 +5053,25 @@ output_check_status(struct sna *sna, struct sna_output *output)
status = XF86OutputStatusUnknown;
break;
}
- return output->status == status;
+ if (output->status != status)
+ return false;
+
+ if (output->edid_len == 0)
+ return false;
+
+ edid = alloca(output->edid_len);
+
+ VG_CLEAR(blob);
+ blob.blob_id = output->prop_values[output->edid_idx];
+ blob.length = output->edid_len;
+ blob.data = (uintptr_t)edid;
+ if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPBLOB, &blob))
+ return false;
+
+ if (blob.length != output->edid_len)
+ return false;
+
+ return memcmp(edid, output->edid_raw, output->edid_len) == 0;
}
void sna_mode_discover(struct sna *sna, bool tell)
More information about the xorg-commit
mailing list