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 - [email protected] + +- 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> --- 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 <[email protected]> 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 <[email protected]> Converting from switch(value) { case 1: return 1; ... default: return -1; } you must remember to insert the breaks! Signed-off-by: Chris Wilson <[email protected]> --- 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 <[email protected]> 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 <[email protected]> Signed-off-by: Chris Wilson <[email protected]> --- 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> --- 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 <[email protected]> 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 <[email protected]> Signed-off-by: Chris Wilson <[email protected]> --- 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> Cc: Dave Airlie <[email protected]> --- 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> --- 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> --- 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> --- 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 <memcheck.h> #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 <[email protected]> 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 <[email protected]> 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 <[email protected]> --- 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; }
