Hello community,
here is the log from the commit of package xf86-video-intel for openSUSE:Factory checked in at 2016-04-05 10:42:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/xf86-video-intel (Old)
and /work/SRC/openSUSE:Factory/.xf86-video-intel.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xf86-video-intel"
Changes:
--------
--- /work/SRC/openSUSE:Factory/xf86-video-intel/xf86-video-intel.changes 2016-03-09 15:16:02.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.xf86-video-intel.new/xf86-video-intel.changes 2016-04-05 10:42:37.000000000 +0200
@@ -1,0 +2,19 @@
+Thu Mar 24 14:31:55 UTC 2016 - eich@suse.com
+
+- Populate mode list in Xserver on startup. This helps to a avoid
+ issues with a change to a recent version of xrandr which doesn't
+ force-scan the mode list before setting a mode any more.
+ Backported:
+ U_01-sna-Cache-the-output-status-and-modes-for-15s.patch
+ U_02-sna-Add-missing-break-from-last-patch.patch
+ U_03-sna-Improve-DBG-messages-for-MST-probing.patch
+ U_04-Convert-from-RRSetChanged-to-RROutputChanged.patch
+ U_05-sna-Remove-redundant-RRGetInfo-on-hotplug-discovery.patch
+ U_06-Remove-the-driver-option-to-delete-connectors-on-unplugging.patch
+ U_07-sna-On-hotplug-events-update-the-output-status.patch
+ U_08-sna-Hook-up-kernel-modes-on-hotplug-notification.patch
+ U_09-sna-Coldplug-all-outputs-on-startup.patch
+ U_10-sna-Use-RRGetInfo-for-setting-hotplug-coldplug-information.patch
+ (boo#971885).
+
+-------------------------------------------------------------------
New:
----
U_01-sna-Cache-the-output-status-and-modes-for-15s.patch
U_02-sna-Add-missing-break-from-last-patch.patch
U_03-sna-Improve-DBG-messages-for-MST-probing.patch
U_04-Convert-from-RRSetChanged-to-RROutputChanged.patch
U_05-sna-Remove-redundant-RRGetInfo-on-hotplug-discovery.patch
U_06-Remove-the-driver-option-to-delete-connectors-on-unplugging.patch
U_07-sna-On-hotplug-events-update-the-output-status.patch
U_08-sna-Hook-up-kernel-modes-on-hotplug-notification.patch
U_09-sna-Coldplug-all-outputs-on-startup.patch
U_10-sna-Use-RRGetInfo-for-setting-hotplug-coldplug-information.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ xf86-video-intel.spec ++++++
--- /var/tmp/diff_new_pack.vbg0dU/_old 2016-04-05 10:42:38.000000000 +0200
+++ /var/tmp/diff_new_pack.vbg0dU/_new 2016-04-05 10:42:38.000000000 +0200
@@ -38,6 +38,18 @@
Patch10: U_uxa_fix_the_call_to_PixmapSyncDirtyHelper_broken_by_xservers_90db5ed.patch
Patch11: U_gen8-Fix-the-YUV-RGB-shader.patch
Patch12: U_tools-intel-virtual-output-Check-for-DRI3-more-carefully.patch
+
+Patch13: U_01-sna-Cache-the-output-status-and-modes-for-15s.patch
+Patch14: U_02-sna-Add-missing-break-from-last-patch.patch
+Patch15: U_03-sna-Improve-DBG-messages-for-MST-probing.patch
+Patch16: U_04-Convert-from-RRSetChanged-to-RROutputChanged.patch
+Patch17: U_05-sna-Remove-redundant-RRGetInfo-on-hotplug-discovery.patch
+Patch18: U_06-Remove-the-driver-option-to-delete-connectors-on-unplugging.patch
+Patch19: U_07-sna-On-hotplug-events-update-the-output-status.patch
+Patch20: U_08-sna-Hook-up-kernel-modes-on-hotplug-notification.patch
+Patch21: U_09-sna-Coldplug-all-outputs-on-startup.patch
+Patch22: U_10-sna-Use-RRGetInfo-for-setting-hotplug-coldplug-information.patch
+
%if %glamor
Requires: glamor
%endif
@@ -114,6 +126,16 @@
%patch10 -p1
%patch11 -p1
%patch12 -p1
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
+%patch17 -p1
+%patch18 -p1
+%patch19 -p1
+%patch20 -p1
+%patch21 -p1
+%patch22 -p1
%build
### --enable-dri3 \
++++++ U_01-sna-Cache-the-output-status-and-modes-for-15s.patch ++++++
From: Chris Wilson
Date: Sat Feb 21 16:50:50 2015 +0000
Subject: [PATCH 1/10]sna: Cache the output status and modes for 15s
Patch-mainline: Upstream
Git-repo: git://anongit.freedesktop.org/git/xorg/driver/xf86-video-intel
Git-commit: b6d4f49176c6177561b760b116ae3e5f0a39aa95
References: boo#971885
Signed-off-by: Egbert Eich
As the output configuration rarely changes, and is normally accompanied
by a hotplug event, we can cache the last probe for a small number of
seconds. If a hotplug event does fire, in the worst case by the 30s
output polling thread, then we reset the cache and force the probe. This
should improve application (and desktop) startup times as they often
seem to do many full xrandr probes (rather than query current status).
Signed-off-by: Chris Wilson
---
src/sna/sna_display.c | 36 ++++++++++++++++++++++++++++--------
1 file changed, 28 insertions(+), 8 deletions(-)
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 63ce7c5..657e998 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -88,6 +88,8 @@ union compat_mode_get_connector{
#define DEFAULT_DPI 96
#endif
+#define OUTPUT_STATUS_CACHE_MS 15000
+
#define DRM_MODE_PAGE_FLIP_ASYNC 0x02
#define DRM_CLIENT_CAP_UNIVERSAL_PLANES 2
@@ -187,6 +189,9 @@ struct sna_output {
struct backlight backlight;
int backlight_active_level;
+ uint32_t last_detect;
+ uint32_t status;
+
int num_modes;
struct drm_mode_modeinfo *modes;
@@ -2898,6 +2903,7 @@ sna_output_detect(xf86OutputPtr output)
struct sna *sna = to_sna(output->scrn);
struct sna_output *sna_output = output->driver_private;
union compat_mode_get_connector compat_conn;
+ uint32_t now;
DBG(("%s(%s:%d)\n", __FUNCTION__, output->name, sna_output->id));
@@ -2906,6 +2912,16 @@ sna_output_detect(xf86OutputPtr output)
return XF86OutputStatusDisconnected;
}
+ /* Cache detections for 15s or hotplug event */
+ now = GetTimeInMillis();
+ if (sna_output->last_detect != 0 &&
+ (int32_t)(now - sna_output->last_detect) <= OUTPUT_STATUS_CACHE_MS) {
+ DBG(("%s(%s) reporting cached status (since %dms): %d\n",
+ __FUNCTION__, output->name, now - sna_output->last_detect,
+ sna_output->status));
+ return sna_output->status;
+ }
+
VG_CLEAR(compat_conn);
compat_conn.conn.connector_id = sna_output->id;
sna_output->num_modes = compat_conn.conn.count_modes = 0; /* reprobe */
@@ -2948,15 +2964,17 @@ sna_output_detect(xf86OutputPtr output)
DBG(("%s(%s): found %d modes, connection status=%d\n",
__FUNCTION__, output->name, sna_output->num_modes, compat_conn.conn.connection));
+ sna_output->last_detect = now;
switch (compat_conn.conn.connection) {
case DRM_MODE_CONNECTED:
- return XF86OutputStatusConnected;
+ sna_output->status = XF86OutputStatusConnected;
case DRM_MODE_DISCONNECTED:
- return XF86OutputStatusDisconnected;
+ sna_output->status = XF86OutputStatusDisconnected;
default:
case DRM_MODE_UNKNOWNCONNECTION:
- return XF86OutputStatusUnknown;
+ sna_output->status = XF86OutputStatusUnknown;
}
+ return sna_output->status;
}
static Bool
@@ -4259,16 +4277,18 @@ void sna_mode_discover(struct sna *sna)
for (i = 0; i < sna->mode.num_real_output; i++) {
xf86OutputPtr output = config->output[i];
+ struct sna_output *sna_output = to_sna_output(output);
- if (to_sna_output(output)->id == 0)
+ if (sna_output->id == 0)
continue;
- if (to_sna_output(output)->serial == serial)
+ sna_output->last_detect = 0;
+ if (sna_output->serial == serial)
continue;
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));
+ __FUNCTION__, output->name, sna_output->id,
+ sna_output->serial, serial));
xf86DrvMsg(sna->scrn->scrnIndex, X_INFO,
"%s output %s\n",
@@ -4278,7 +4298,7 @@ void sna_mode_discover(struct sna *sna)
sna_output_del(output);
i--;
} else {
- to_sna_output(output)->id = 0;
+ sna_output->id = 0;
output->crtc = NULL;
}
changed |= 2;
++++++ U_02-sna-Add-missing-break-from-last-patch.patch ++++++
From: Chris Wilson
Date: Sat Feb 21 17:08:06 2015 +0000
Subject: [PATCH 2/10]sna: Add missing 'break' from last patch
Patch-mainline: Upstream
Git-repo: git://anongit.freedesktop.org/git/xorg/driver/xf86-video-intel
Git-commit: fef0f3dc0ca8d7f6e50fd841a7fff23a4d357121
References: boo#971885
Signed-off-by: Egbert Eich
Converting from
switch(value)
{
case 1: return 1;
...
default: return -1;
}
you must remember to insert the breaks!
Signed-off-by: Chris Wilson
---
src/sna/sna_display.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 657e998..606c13a 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -2968,11 +2968,14 @@ sna_output_detect(xf86OutputPtr output)
switch (compat_conn.conn.connection) {
case DRM_MODE_CONNECTED:
sna_output->status = XF86OutputStatusConnected;
+ break;
case DRM_MODE_DISCONNECTED:
sna_output->status = XF86OutputStatusDisconnected;
+ break;
default:
case DRM_MODE_UNKNOWNCONNECTION:
sna_output->status = XF86OutputStatusUnknown;
+ break;
}
return sna_output->status;
}
++++++ U_03-sna-Improve-DBG-messages-for-MST-probing.patch ++++++
From: Chris Wilson
Date: Tue Feb 24 22:36:11 2015 +0000
Subject: [PATCH 3/10]sna: Improve DBG messages for MST probing
Patch-mainline: Upstream
Git-repo: git://anongit.freedesktop.org/git/xorg/driver/xf86-video-intel
Git-commit: 98245a5cff095a3a50cfe6fa41a0233f5bd6f75e
References: boo#971885
Signed-off-by: Egbert Eich
Signed-off-by: Chris Wilson
---
src/sna/sna_display.c | 24 +++++++++++++++++++-----
1 file changed, 19 insertions(+), 5 deletions(-)
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 606c13a..d7f5500 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3689,14 +3689,20 @@ gather_encoders(struct sna *sna, uint32_t id, int count,
struct drm_mode_get_encoder enc;
uint32_t *ids = NULL;
+ DBG(("%s(%d): expected count=%d\n", __FUNCTION__, id, count));
+
VG_CLEAR(compat_conn);
memset(out, 0, sizeof(*out));
do {
- free(ids);
- ids = malloc(sizeof(*ids) * count);
- if (ids == 0)
+ uint32_t *nids;
+
+ nids = realloc(ids, sizeof(*ids) * count);
+ if (nids == NULL) {
+ free(ids);
return false;
+ }
+ ids = nids;
compat_conn.conn.connector_id = id;
compat_conn.conn.count_props = 0;
@@ -3716,6 +3722,7 @@ gather_encoders(struct sna *sna, uint32_t id, int count,
count = compat_conn.conn.count_encoders;
} while (1);
+ DBG(("%s(%d): gathering %d encoders\n", __FUNCTION__, id, count));
for (count = 0; count < compat_conn.conn.count_encoders; count++) {
enc.encoder_id = ids[count];
if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETENCODER, &enc)) {
@@ -3723,6 +3730,8 @@ gather_encoders(struct sna *sna, uint32_t id, int count,
count = 0;
break;
}
+ DBG(("%s(%d): encoder=%d, possible_crtcs=%x, possible_clones=%x\n",
+ __FUNCTION__, id, enc.encoder_id, enc.possible_crtcs, enc.possible_clones));
out->possible_crtcs |= enc.possible_crtcs;
out->possible_clones |= enc.possible_clones;
@@ -3882,6 +3891,7 @@ sna_output_add(struct sna *sna, unsigned id, unsigned serial)
return -1;
}
assert(compat_conn.conn.connector_id == id);
+ DBG(("%s(%d): has %d associated encoders\n", __FUNCTION__, id, compat_conn.conn.count_encoders));
if (compat_conn.conn.connector_type < ARRAY_SIZE(output_names))
output_name = output_names[compat_conn.conn.connector_type];
@@ -4247,8 +4257,9 @@ void sna_mode_discover(struct sna *sna)
if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETRESOURCES, &res))
return;
- DBG(("%s: now %d (was %d) connectors\n", __FUNCTION__,
- res.count_connectors, sna->mode.num_real_output));
+ DBG(("%s: now %d (was %d) connectors, %d encoders, %d crtc\n", __FUNCTION__,
+ res.count_connectors, sna->mode.num_real_output,
+ res.count_encoders, res.count_crtcs));
if (res.count_connectors > 32)
return;
@@ -6052,6 +6063,9 @@ bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
if (res) {
xf86CrtcConfigPtr xf86_config;
+ DBG(("%s: found %d CRTC, %d encoders, %d connectors\n",
+ __FUNCTION__, res->count_crtcs, res->count_encoders, res->count_connectors));
+
assert(res->count_crtcs);
assert(res->count_connectors);
++++++ U_04-Convert-from-RRSetChanged-to-RROutputChanged.patch ++++++
From: Chris Wilson
Date: Tue Mar 3 12:25:39 2015 +0000
Subject: [PATCH 4/10]Convert from RRSetChanged() to RROutputChanged()
Patch-mainline: Upstream
Git-repo: git://anongit.freedesktop.org/git/xorg/driver/xf86-video-intel
Git-commit: a5978074dba200b4059f53ab94b9c34863250520
References: boo#971885
Signed-off-by: Egbert Eich
RRSetChanged() is much more recent than RROutputChanged(), and
RROutptChanged() allows for more finer grained updates. Switch to
RROutputChanged for compilation with xorg-server-1.14 and older.
Signed-off-by: Chris Wilson
---
src/sna/sna_display.c | 4 +++-
src/uxa/intel_display.c | 6 +++---
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index c3cc6ba..cc82806 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -4103,6 +4103,7 @@ reset:
goto cleanup;
}
+ RROutputChanged(output->randr_output, TRUE);
sna_output_create_resources(output);
RRPostPendingProperties(output->randr_output);
@@ -4314,6 +4315,7 @@ void sna_mode_discover(struct sna *sna)
} else {
sna_output->id = 0;
output->crtc = NULL;
+ RROutputChanged(output->randr_output, TRUE);
}
changed |= 2;
}
@@ -6167,7 +6169,7 @@ sna_mode_set_primary(struct sna *sna)
DBG(("%s: setting PrimaryOutput %s\n", __FUNCTION__, output->name));
rr->primaryOutput = output->randr_output;
- RROutputChanged(rr->primaryOutput, 0);
+ RROutputChanged(rr->primaryOutput, FALSE);
rr->layoutChanged = TRUE;
break;
}
diff --git a/src/uxa/intel_display.c b/src/uxa/intel_display.c
index 45afbae..544382a 100644
--- a/src/uxa/intel_display.c
+++ b/src/uxa/intel_display.c
@@ -1493,6 +1493,7 @@ intel_output_init(ScrnInfoPtr scrn, struct intel_mode *mode, drmModeResPtr mode_
intel_output = output->driver_private;
intel_output->output_id = mode_res->connectors[num];
intel_output->mode_output = koutput;
+ RROutputChanged(output->randr_output, TRUE);
return;
}
}
@@ -2495,6 +2496,7 @@ restart_destroy:
drmModeFreeConnector(intel_output->mode_output);
intel_output->mode_output = NULL;
intel_output->output_id = -1;
+ RROutputChanged(output->randr_output, TRUE);
changed = TRUE;
if (mode->delete_dp_12_displays) {
@@ -2525,10 +2527,8 @@ restart_destroy:
intel_output_init(scrn, intel->modes, mode_res, i, 1);
}
- if (changed) {
- RRSetChanged(xf86ScrnToScreen(scrn));
+ if (changed)
RRTellChanged(xf86ScrnToScreen(scrn));
- }
drmModeFreeResources(mode_res);
out:
++++++ U_05-sna-Remove-redundant-RRGetInfo-on-hotplug-discovery.patch ++++++
From: Chris Wilson
Date: Fri Mar 13 14:39:56 2015 +0000
Subject: [PATCH 5/10]sna: Remove redundant RRGetInfo on hotplug discovery
Patch-mainline: Upstream
Git-repo: git://anongit.freedesktop.org/git/xorg/driver/xf86-video-intel
Git-commit: c2381ac065e0d7fc39ae029045eda54b36766324
References: boo#971885
Signed-off-by: Egbert Eich
Signed-off-by: Chris Wilson
---
src/sna/sna_display.c | 7 ++++++-
src/sna/sna_driver.c | 6 ++----
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index fae91d7..2ddbf6d 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -4460,8 +4460,11 @@ void sna_mode_discover(struct sna *sna)
continue;
sna_output->last_detect = 0;
- if (sna_output->serial == serial)
+ if (sna_output->serial == serial) {
+ if (sna_output_detect(output) != output->status)
+ RROutputChanged(output->randr_output, TRUE);
continue;
+ }
DBG(("%s: removing output %s (id=%d), serial=%u [now %u]\n",
__FUNCTION__, output->name, sna_output->id,
@@ -4496,6 +4499,8 @@ void sna_mode_discover(struct sna *sna)
xf86RandR12TellChanged(screen);
}
+
+ RRTellChanged(screen);
}
static void copy_front(struct sna *sna, PixmapPtr old, PixmapPtr new)
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index ab9ce04..5092bfb 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -770,7 +770,6 @@ sna_handle_uevents(int fd, void *closure)
if (scrn->vtSema) {
sna_mode_discover(sna);
sna_mode_check(sna);
- RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
} else
sna->flags |= SNA_REPROBE;
}
@@ -1206,12 +1205,11 @@ static Bool sna_enter_vt(VT_FUNC_ARGS_DECL)
return FALSE;
if (sna->flags & SNA_REPROBE) {
- DBG(("%s: reporting deferred hotplug event\n",
- __FUNCTION__));
+ DBG(("%s: reporting deferred hotplug event\n", __FUNCTION__));
sna_mode_discover(sna);
- RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
sna->flags &= ~SNA_REPROBE;
}
+ sna_mode_check(sna);
if (!sna_set_desired_mode(sna)) {
intel_put_master(sna->dev);
++++++ U_06-Remove-the-driver-option-to-delete-connectors-on-unplugging.patch ++++++
From: Chris Wilson
Date: Mon May 4 14:00:13 2015 +0100
Subject: [PATCH 6/10]Remove the driver option to delete connectors on unplugging
Patch-mainline: Upstream
Git-repo: git://anongit.freedesktop.org/git/xorg/driver/xf86-video-intel
Git-commit: 5054e2271210a52bf88b0f12c35d687ce9e8210d
References: boo#971885
Signed-off-by: Egbert Eich
With a MST topology change, we can find outputs may disappear. We offered
a choice as to whether to simply disable them or completely remove them
from the listing of available outputs. However, clients never expected
that their operation on any output could trigger a BadID XError (or that
there is anyway to prevent race conditions). As such an option was made to
disable by default, but allow testing complete removal. Now the RandR
protocol has been clarified such that XID assigned to outputs are now
permanent, as such the option breaks the spec, so drop it.
See randrproto commit 895ee5264524c7c239ee4ef5e39c4e295323fb51
Author: Dave Airlie
Date: Wed Apr 22 10:58:18 2015 +1000
randrproto: clarify output XID lifetimes.
This just makes a note that randr won't make outputs disappear
dynamically.
Signed-off-by: Chris Wilson
Cc: Dave Airlie
---
src/intel_options.c | 1 -
src/intel_options.h | 1 -
src/sna/sna.h | 1 -
src/sna/sna_display.c | 46 ++++------------------------------------------
src/sna/sna_driver.c | 3 ---
src/uxa/intel_display.c | 14 +-------------
6 files changed, 5 insertions(+), 61 deletions(-)
diff --git a/src/intel_options.c b/src/intel_options.c
index 034b591..465f739 100644
--- a/src/intel_options.c
+++ b/src/intel_options.c
@@ -25,7 +25,6 @@ const OptionInfoRec intel_options[] = {
{OPTION_PREFER_OVERLAY, "XvPreferOverlay", OPTV_BOOLEAN, {0}, 0},
{OPTION_HOTPLUG, "HotPlug", OPTV_BOOLEAN, {0}, 1},
{OPTION_REPROBE, "ReprobeOutputs", OPTV_BOOLEAN, {0}, 0},
- {OPTION_DELETE_DP12, "DeleteUnusedDP12Displays", OPTV_BOOLEAN, {0}, 0},
#ifdef INTEL_XVMC
{OPTION_XVMC, "XvMC", OPTV_BOOLEAN, {0}, 1},
#endif
diff --git a/src/intel_options.h b/src/intel_options.h
index 56ba279..492e03f 100644
--- a/src/intel_options.h
+++ b/src/intel_options.h
@@ -28,7 +28,6 @@ enum intel_options {
OPTION_PREFER_OVERLAY,
OPTION_HOTPLUG,
OPTION_REPROBE,
- OPTION_DELETE_DP12,
#if defined(XvMCExtension) && defined(ENABLE_XVMC)
OPTION_XVMC,
#define INTEL_XVMC 1
diff --git a/src/sna/sna.h b/src/sna/sna.h
index e51ee14..374754b 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -248,7 +248,6 @@ struct sna {
#define SNA_FLUSH_GTT 0x400
#define SNA_PERFORMANCE 0x1000
#define SNA_POWERSAVE 0x2000
-#define SNA_REMOVE_OUTPUTS 0x4000
#define SNA_HAS_FLIP 0x10000
#define SNA_HAS_ASYNC_FLIP 0x20000
#define SNA_LINEAR_FB 0x40000
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 3ba2df9..e96040d 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -4502,38 +4502,6 @@ skip:
return len;
}
-static void sna_output_del(xf86OutputPtr output)
-{
- ScrnInfoPtr scrn = output->scrn;
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
- int i;
-
- DBG(("%s(%s)\n", __FUNCTION__, output->name));
- assert(to_sna_output(output));
-
- RROutputDestroy(output->randr_output);
- sna_output_destroy(output);
-
- while (output->probed_modes)
- xf86DeleteMode(&output->probed_modes, output->probed_modes);
-
- free(output);
-
- for (i = 0; i < config->num_output; i++)
- 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];
- config->output[i]->possible_clones >>= 1;
- }
- config->num_output--;
- to_sna(scrn)->mode.num_real_output--;
-}
-
static int output_rank(const void *A, const void *B)
{
const xf86OutputPtr *a = A;
@@ -4674,17 +4642,11 @@ void sna_mode_discover(struct sna *sna)
sna_output->serial, serial));
xf86DrvMsg(sna->scrn->scrnIndex, X_INFO,
- "%s output %s\n",
- sna->flags & SNA_REMOVE_OUTPUTS ? "Removed" : "Disabled",
+ "Disabled output %s\n",
output->name);
- if (sna->flags & SNA_REMOVE_OUTPUTS) {
- sna_output_del(output);
- i--;
- } else {
- sna_output->id = 0;
- output->crtc = NULL;
- RROutputChanged(output->randr_output, TRUE);
- }
+ sna_output->id = 0;
+ output->crtc = NULL;
+ RROutputChanged(output->randr_output, TRUE);
changed |= 2;
}
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 488ca9b..4e76fd0 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -621,9 +621,6 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int probe)
if (xf86ReturnOptValBool(sna->Options, OPTION_TILING_FB, FALSE))
sna->flags |= SNA_LINEAR_FB;
- if (xf86ReturnOptValBool(sna->Options, OPTION_DELETE_DP12, FALSE))
- sna->flags |= SNA_REMOVE_OUTPUTS;
-
if (!xf86ReturnOptValBool(sna->Options, OPTION_SWAPBUFFERS_WAIT, TRUE))
sna->flags |= SNA_NO_WAIT;
DBG(("%s: swapbuffer wait? %s\n", __FUNCTION__, sna->flags & SNA_NO_WAIT ? "disabled" : "enabled"));
diff --git a/src/uxa/intel_display.c b/src/uxa/intel_display.c
index a95b3de..0cdc8d2 100644
--- a/src/uxa/intel_display.c
+++ b/src/uxa/intel_display.c
@@ -97,5 +97,3 @@ struct intel_mode {
-
- Bool delete_dp_12_displays;
};
struct intel_pageflip {
@@ -2248,10 +2246,6 @@ Bool intel_mode_pre_init(ScrnInfoPtr scrn, int fd, int cpp)
intel->use_pageflipping = TRUE;
}
- if (xf86ReturnOptValBool(intel->Options, OPTION_DELETE_DP12, FALSE)) {
- mode->delete_dp_12_displays = TRUE;
- }
-
intel->modes = mode;
drmModeFreeResources(mode_res);
return TRUE;
@@ -2515,12 +2509,11 @@ intel_mode_hotplug(struct intel_screen_private *intel)
int i, j;
Bool found;
Bool changed = FALSE;
- struct intel_mode *mode = intel->modes;
+
mode_res = drmModeGetResources(intel->drmSubFD);
if (!mode_res)
goto out;
-restart_destroy:
for (i = 0; i < config->num_output; i++) {
xf86OutputPtr output = config->output[i];
struct intel_output *intel_output;
@@ -2542,11 +2535,6 @@ restart_destroy:
RROutputChanged(output->randr_output, TRUE);
changed = TRUE;
- if (mode->delete_dp_12_displays) {
- RROutputDestroy(output->randr_output);
- xf86OutputDestroy(output);
- goto restart_destroy;
- }
}
/* find new output ids we don't have outputs for */
++++++ U_07-sna-On-hotplug-events-update-the-output-status.patch ++++++
From: Chris Wilson
Date: Wed Sep 9 11:18:15 2015 +0100
Subject: [PATCH 7/10]sna: On hotplug events, update the output->status
Patch-mainline: Upstream
Git-repo: git://anongit.freedesktop.org/git/xorg/driver/xf86-video-intel
Git-commit: f5aabb7bddc6fc5dc910a983d1291c9864f65f06
References: boo#971885
Signed-off-by: Egbert Eich
During the hotplug event, we query the current connector status and use
that to trigger an output changed event to the clients. However, since
we know the new status, we can set that on the RROutput immediately.
Note the modelist is left unchanged, and will only be queried when the
user requests it (though we may want to provide that in the hotplug
notify as well).
References: https://bugs.freedesktop.org/show_bug.cgi?id=91929#c2
Signed-off-by: Chris Wilson
---
src/sna/sna_display.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 34d19bb..d13d283 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -4848,8 +4848,29 @@ void sna_mode_discover(struct sna *sna)
sna_output->last_detect = 0;
if (sna_output->serial == serial) {
- if (sna_output_detect(output) != output->status)
- RROutputChanged(output->randr_output, TRUE);
+ xf86OutputStatus status = sna_output_detect(output);
+ if (status != output->status) {
+ RROutputPtr rr = output->randr_output;
+ unsigned value;
+
+ DBG(("%s: output %s (id=%d), changed status %d -> %d\n",
+ __FUNCTION__, output->name, sna_output->id, output->status, status));
+
+ output->status = status;
+ switch (status) {
+ case XF86OutputStatusConnected:
+ value = RR_Connected;
+ break;
+ case XF86OutputStatusDisconnected:
+ value = RR_Disconnected;
+ break;
+ default:
+ case XF86OutputStatusUnknown:
+ value = RR_UnknownConnection;
+ break;
+ }
+ RROutputSetConnection(rr, value);
+ }
continue;
}
++++++ U_08-sna-Hook-up-kernel-modes-on-hotplug-notification.patch ++++++
From: Chris Wilson
Date: Wed Sep 9 20:28:19 2015 +0100
Subject: [PATCH 8/10]sna: Hook up kernel modes on hotplug notification
Patch-mainline: Upstream
Git-repo: git://anongit.freedesktop.org/git/xorg/driver/xf86-video-intel
Git-commit: f384af433cbb39ad74e02b10d3700e71c8668506
References: boo#971885
Signed-off-by: Egbert Eich
Some display managers, for example mutter, only use
XRRScreenResourcesCurrent() which means they only query the existing
modes on an output. We need to therefore update the list of available
modes after a hotplug event.
Signed-off-by: Chris Wilson
---
src/sna/sna_display.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 73 insertions(+)
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index d13d283..d82585b 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -4787,6 +4787,78 @@ static bool disable_unused_crtc(struct sna *sna)
return update;
}
+static int modecmp(DisplayModePtr a, DisplayModePtr b)
+{
+ int diff;
+
+ diff = (b->type & M_T_PREFERRED)- (a->type & M_T_PREFERRED);
+ if (diff)
+ return diff;
+
+ diff = b->HDisplay * b->VDisplay - a->HDisplay * a->VDisplay;
+ if (diff)
+ return diff;
+
+ return b->Clock - a->Clock;
+}
+
+static DisplayModePtr sort_modes(DisplayModePtr in)
+{
+ DisplayModePtr out = NULL, i, o, *op, prev;
+
+ /* sort by preferred status and pixel area */
+ while (in) {
+ i = in;
+ in = in->next;
+ for (op = &out; (o = *op); op = &o->next) {
+ int ret = modecmp(o, i);
+ if (ret > 0)
+ break;
+ if (ret < 0)
+ continue;
+ if (!strcmp(o->name, i->name) && xf86ModesEqual(o, i)) {
+ free((void *)i->name);
+ free(i);
+ goto skip;
+ }
+ }
+ i->next = *op;
+ *op = i;
+skip: ;
+ }
+
+ /* hook up backward links */
+ prev = NULL;
+ for (o = out; o; o = o->next) {
+ o->prev = prev;
+ prev = o;
+ }
+ return out;
+}
+
+static void update_modes(xf86OutputPtr output)
+{
+ while (output->probed_modes)
+ xf86DeleteMode(&output->probed_modes, output->probed_modes);
+
+ if (output->status != XF86OutputStatusConnected)
+ return;
+
+ output->probed_modes = NULL;
+
+ if (output->conf_monitor)
+ output->probed_modes =
+ xf86ModesAdd(output->probed_modes,
+ xf86GetMonitorModes(output->scrn,
+ output->conf_monitor));
+
+ output->probed_modes =
+ xf86ModesAdd(output->probed_modes,
+ output->funcs->get_modes(output));
+
+ output->probed_modes = sort_modes(output->probed_modes);
+}
+
void sna_mode_discover(struct sna *sna)
{
ScreenPtr screen = xf86ScrnToScreen(sna->scrn);
@@ -4870,6 +4942,7 @@ void sna_mode_discover(struct sna *sna)
break;
}
RROutputSetConnection(rr, value);
+ update_modes(output);
}
continue;
}
++++++ U_09-sna-Coldplug-all-outputs-on-startup.patch ++++++
From: Chris Wilson
Date: Wed Sep 9 20:44:42 2015 +0100
Subject: [PATCH 9/10]sna: Coldplug all outputs on startup
Patch-mainline: Upstream
Git-repo: git://anongit.freedesktop.org/git/xorg/driver/xf86-video-intel
Git-commit: d50d336605e9be7280529b0eb565402d7646c913
References: boo#971885
Signed-off-by: Egbert Eich
Since we only update the mode list when the user queries xrandr or upon
a hotplug event, queue a deferred probe for 2s after X starts in order
to fill in the unknown modes.
Signed-off-by: Chris Wilson
---
src/sna/sna_display.c | 97 ++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 72 insertions(+), 25 deletions(-)
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index d82585b..d75d282 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -90,6 +90,8 @@ void *alloca(size_t);
#include
#endif
+#define COLDPLUG_DELAY_MS 2000
+
/* Minor discrepancy between 32-bit/64-bit ABI in old kernels */
union compat_mode_get_connector{
struct drm_mode_get_connector conn;
@@ -4836,8 +4838,13 @@ skip: ;
return out;
}
-static void update_modes(xf86OutputPtr output)
+static void output_update_modes(xf86OutputPtr output)
{
+ DBG(("%s: updating modes on output %s (id=%d): status=%d\n",
+ __FUNCTION__, output->name, sna_output->id,
+ sna_output->serial, serial, output->status));
+ RROutputChanged(output->randr_output, TRUE);
+
while (output->probed_modes)
xf86DeleteMode(&output->probed_modes, output->probed_modes);
@@ -4859,6 +4866,33 @@ static void update_modes(xf86OutputPtr output)
output->probed_modes = sort_modes(output->probed_modes);
}
+static bool output_set_status(xf86OutputPtr output, xf86OutputStatus status)
+{
+ unsigned value;
+
+ if (status == output->status)
+ return false;
+
+ DBG(("%s: output %s (id=%d), changed status %d -> %d\n",
+ __FUNCTION__, output->name, sna_output->id, output->status, status));
+
+ output->status = status;
+ switch (status) {
+ case XF86OutputStatusConnected:
+ value = RR_Connected;
+ break;
+ case XF86OutputStatusDisconnected:
+ value = RR_Disconnected;
+ break;
+ default:
+ case XF86OutputStatusUnknown:
+ value = RR_UnknownConnection;
+ break;
+ }
+ RROutputSetConnection(output->randr_output, value);
+ return true;
+}
+
void sna_mode_discover(struct sna *sna)
{
ScreenPtr screen = xf86ScrnToScreen(sna->scrn);
@@ -4920,30 +4954,9 @@ void sna_mode_discover(struct sna *sna)
sna_output->last_detect = 0;
if (sna_output->serial == serial) {
- xf86OutputStatus status = sna_output_detect(output);
- if (status != output->status) {
- RROutputPtr rr = output->randr_output;
- unsigned value;
-
- DBG(("%s: output %s (id=%d), changed status %d -> %d\n",
- __FUNCTION__, output->name, sna_output->id, output->status, status));
-
- output->status = status;
- switch (status) {
- case XF86OutputStatusConnected:
- value = RR_Connected;
- break;
- case XF86OutputStatusDisconnected:
- value = RR_Disconnected;
- break;
- default:
- case XF86OutputStatusUnknown:
- value = RR_UnknownConnection;
- break;
- }
- RROutputSetConnection(rr, value);
- update_modes(output);
- }
+ if (output_set_status(output,
+ sna_output_detect(output)))
+ output_update_modes(output);
continue;
}
@@ -4978,6 +4991,39 @@ void sna_mode_discover(struct sna *sna)
RRTellChanged(screen);
}
+/* Since we only probe the current mode on startup, we may not have the full
+ * list of modes available until the user explicitly requests them. Fake a
+ * hotplug event after a second after starting to fill in any missing modes.
+ */
+static CARD32 sna_mode_coldplug(OsTimerPtr timer, CARD32 now, void *data)
+{
+ struct sna *sna = data;
+ ScreenPtr screen = xf86ScrnToScreen(sna->scrn);
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
+ int i;
+
+ DBG(("%s()\n", __FUNCTION__));
+
+ for (i = 0; i < sna->mode.num_real_output; i++) {
+ xf86OutputPtr output = config->output[i];
+ struct sna_output *sna_output = to_sna_output(output);
+
+ if (sna_output->id == 0)
+ continue;
+ if (sna_output->last_detect)
+ continue;
+ if (output->status != XF86OutputStatusConnected)
+ continue;
+
+ output_set_status(output, sna_output_detect(output));
+ output_update_modes(output);
+ }
+
+ RRTellChanged(screen);
+ free(timer);
+ return 0;
+}
+
static void copy_front(struct sna *sna, PixmapPtr old, PixmapPtr new)
{
struct sna_pixmap *old_priv, *new_priv;
@@ -6912,6 +6958,7 @@ bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
}
}
sort_config_outputs(sna);
+ TimerSet(NULL, 0, COLDPLUG_DELAY_MS, sna_mode_coldplug, sna);
sna_setup_provider(scrn);
return scrn->modes != NULL;
++++++ U_10-sna-Use-RRGetInfo-for-setting-hotplug-coldplug-information.patch ++++++
From: Chris Wilson
Date: Thu Sep 10 10:21:00 2015 +0100
Subject: [PATCH 10/10]sna: Use RRGetInfo() for setting hotplug/coldplug information
Patch-mainline: Upstream
Git-repo: git://anongit.freedesktop.org/git/xorg/driver/xf86-video-intel
Git-commit: 2c08d72393e4c8ddf5926571b087459aaa225cb1
References: boo#971885
Signed-off-by: Egbert Eich
Force the full reprobe, resetting all the output properties on all
outputs if we detect a status change on hotplug. Rather than simply
translate the kernel mode lists ourselves, use the common functions in
case more settings change.
References: https://bugs.freedesktop.org/show_bug.cgi?id=91929
Signed-off-by: Chris Wilson
---
src/sna/sna_display.c | 138 +++++++++++++-------------------------------------
1 file changed, 36 insertions(+), 102 deletions(-)
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index d75d282..0d7a2a1 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -4789,108 +4789,35 @@ static bool disable_unused_crtc(struct sna *sna)
return update;
}
-static int modecmp(DisplayModePtr a, DisplayModePtr b)
-{
- int diff;
-
- diff = (b->type & M_T_PREFERRED)- (a->type & M_T_PREFERRED);
- if (diff)
- return diff;
-
- diff = b->HDisplay * b->VDisplay - a->HDisplay * a->VDisplay;
- if (diff)
- return diff;
-
- return b->Clock - a->Clock;
-}
-
-static DisplayModePtr sort_modes(DisplayModePtr in)
-{
- DisplayModePtr out = NULL, i, o, *op, prev;
-
- /* sort by preferred status and pixel area */
- while (in) {
- i = in;
- in = in->next;
- for (op = &out; (o = *op); op = &o->next) {
- int ret = modecmp(o, i);
- if (ret > 0)
- break;
- if (ret < 0)
- continue;
- if (!strcmp(o->name, i->name) && xf86ModesEqual(o, i)) {
- free((void *)i->name);
- free(i);
- goto skip;
- }
- }
- i->next = *op;
- *op = i;
-skip: ;
- }
-
- /* hook up backward links */
- prev = NULL;
- for (o = out; o; o = o->next) {
- o->prev = prev;
- prev = o;
- }
- return out;
-}
-
-static void output_update_modes(xf86OutputPtr output)
+static bool
+output_check_status(struct sna *sna, struct sna_output *output)
{
- DBG(("%s: updating modes on output %s (id=%d): status=%d\n",
- __FUNCTION__, output->name, sna_output->id,
- sna_output->serial, serial, output->status));
- RROutputChanged(output->randr_output, TRUE);
-
- while (output->probed_modes)
- xf86DeleteMode(&output->probed_modes, output->probed_modes);
-
- if (output->status != XF86OutputStatusConnected)
- return;
-
- output->probed_modes = NULL;
-
- if (output->conf_monitor)
- output->probed_modes =
- xf86ModesAdd(output->probed_modes,
- xf86GetMonitorModes(output->scrn,
- output->conf_monitor));
-
- output->probed_modes =
- xf86ModesAdd(output->probed_modes,
- output->funcs->get_modes(output));
-
- output->probed_modes = sort_modes(output->probed_modes);
-}
+ union compat_mode_get_connector compat_conn;
+ struct drm_mode_modeinfo dummy;
+ xf86OutputStatus status;
-static bool output_set_status(xf86OutputPtr output, xf86OutputStatus status)
-{
- unsigned value;
+ VG_CLEAR(compat_conn);
- if (status == output->status)
- return false;
+ 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;
- DBG(("%s: output %s (id=%d), changed status %d -> %d\n",
- __FUNCTION__, output->name, sna_output->id, output->status, status));
+ (void)drmIoctl(sna->kgem.fd,
+ DRM_IOCTL_MODE_GETCONNECTOR,
+ &compat_conn.conn);
- output->status = status;
- switch (status) {
- case XF86OutputStatusConnected:
- value = RR_Connected;
- break;
- case XF86OutputStatusDisconnected:
- value = RR_Disconnected;
- break;
+ switch (compat_conn.conn.connection) {
+ case DRM_MODE_CONNECTED:
+ status = XF86OutputStatusConnected;
+ case DRM_MODE_DISCONNECTED:
+ status = XF86OutputStatusDisconnected;
default:
- case XF86OutputStatusUnknown:
- value = RR_UnknownConnection;
- break;
+ case DRM_MODE_UNKNOWNCONNECTION:
+ status = XF86OutputStatusUnknown;
}
- RROutputSetConnection(output->randr_output, value);
- return true;
+ return output->status == status;
}
void sna_mode_discover(struct sna *sna)
@@ -4952,11 +4879,13 @@ void sna_mode_discover(struct sna *sna)
if (sna_output->id == 0)
continue;
- sna_output->last_detect = 0;
if (sna_output->serial == serial) {
- if (output_set_status(output,
- sna_output_detect(output)))
- output_update_modes(output);
+ 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;
+ }
continue;
}
@@ -4968,6 +4897,7 @@ void sna_mode_discover(struct sna *sna)
"Disabled output %s\n",
output->name);
sna_output->id = 0;
+ sna_output->last_detect = 0;
output->crtc = NULL;
RROutputChanged(output->randr_output, TRUE);
changed |= 2;
@@ -4988,6 +4918,7 @@ void sna_mode_discover(struct sna *sna)
xf86RandR12TellChanged(screen);
}
+ RRGetInfo(screen, TRUE);
RRTellChanged(screen);
}
@@ -5000,6 +4931,7 @@ static CARD32 sna_mode_coldplug(OsTimerPtr timer, CARD32 now, void *data)
struct sna *sna = data;
ScreenPtr screen = xf86ScrnToScreen(sna->scrn);
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
+ bool reprobe = false;
int i;
DBG(("%s()\n", __FUNCTION__));
@@ -5015,11 +4947,13 @@ static CARD32 sna_mode_coldplug(OsTimerPtr timer, CARD32 now, void *data)
if (output->status != XF86OutputStatusConnected)
continue;
- output_set_status(output, sna_output_detect(output));
- output_update_modes(output);
+ reprobe = true;
}
- RRTellChanged(screen);
+ if (reprobe) {
+ RRGetInfo(screen, TRUE);
+ RRTellChanged(screen);
+ }
free(timer);
return 0;
}