xserver-xorg-video-intel: Changes to 'ubuntu-quantal'
debian/changelog | 7 +
debian/patches/fix-possible-clones-computation.patch | 126 +++++++++++++++++++
debian/patches/series | 1
3 files changed, 134 insertions(+)
New commits:
commit e7c37292e6ac8a1c91554b75e80daee008fb942a
Author: Timo Aaltonen <tjaalton@ubuntu.com>
Date: Thu Oct 3 09:57:12 2013 +0300
commit -0u2.3
diff --git a/debian/changelog b/debian/changelog
index 527bb16..eaced1d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+xserver-xorg-video-intel (2:2.20.9-0ubuntu2.3) quantal-proposed; urgency=low
+
+ * Add fix-possible-clones-computation.patch: Backport from 2.20.10 to fix
+ clone mode on haswell laptops. (LP: #1202524)
+
+ -- Robert Hooker <sarvatt@ubuntu.com> Thu, 01 Aug 2013 09:24:13 -0400
+
xserver-xorg-video-intel (2:2.20.9-0ubuntu2.2) quantal-proposed; urgency=low
* Added patches to add/fix Haswell pci-id's (LP: #1175533)
diff --git a/debian/patches/fix-possible-clones-computation.patch b/debian/patches/fix-possible-clones-computation.patch
new file mode 100644
index 0000000..f7883a6
--- /dev/null
+++ b/debian/patches/fix-possible-clones-computation.patch
@@ -0,0 +1,126 @@
+--- a/src/intel_display.c
++++ b/src/intel_display.c
+@@ -1435,7 +1435,6 @@
+ intel_output_backlight_init(output);
+
+ output->possible_crtcs = kencoder->possible_crtcs;
+- output->possible_clones = kencoder->possible_clones;
+ output->interlaceAllowed = TRUE;
+
+ intel_output->output = output;
+@@ -1680,6 +1679,60 @@
+ drmHandleEvent(mode->fd, &mode->event_context);
+ }
+
++static drmModeEncoderPtr
++intel_get_kencoder(struct intel_mode *mode, int num)
++{
++ struct intel_output *iterator;
++ int id = mode->mode_res->encoders[num];
++
++ list_for_each_entry(iterator, &mode->outputs, link)
++ if (iterator->mode_encoder->encoder_id == id)
++ return iterator->mode_encoder;
++
++ return NULL;
++}
++
++/*
++ * Libdrm's possible_clones is a mask of encoders, Xorg's possible_clones is a
++ * mask of outputs. This function sets Xorg's possible_clones based on the
++ * values read from libdrm.
++ */
++static void
++intel_compute_possible_clones(ScrnInfoPtr scrn, struct intel_mode *mode)
++{
++ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
++ struct intel_output *intel_output, *clone;
++ drmModeEncoderPtr cloned_encoder;
++ uint32_t mask;
++ int i, j, k;
++ CARD32 possible_clones;
++
++ for (i = 0; i < config->num_output; i++) {
++ possible_clones = 0;
++ intel_output = config->output[i]->driver_private;
++
++ mask = intel_output->mode_encoder->possible_clones;
++ for (j = 0; mask != 0; j++, mask >>= 1) {
++
++ if ((mask & 1) == 0)
++ continue;
++
++ cloned_encoder = intel_get_kencoder(mode, j);
++ if (!cloned_encoder)
++ continue;
++
++ for (k = 0; k < config->num_output; k++) {
++ clone = config->output[k]->driver_private;
++ if (clone->mode_encoder->encoder_id ==
++ cloned_encoder->encoder_id)
++ possible_clones |= (1 << k);
++ }
++ }
++
++ config->output[i]->possible_clones = possible_clones;
++ }
++}
++
+ Bool intel_mode_pre_init(ScrnInfoPtr scrn, int fd, int cpp)
+ {
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+@@ -1715,6 +1768,7 @@
+
+ for (i = 0; i < mode->mode_res->count_connectors; i++)
+ intel_output_init(scrn, mode, i);
++ intel_compute_possible_clones(scrn, mode);
+
+ #ifdef INTEL_PIXMAP_SHARING
+ xf86ProviderSetup(scrn, NULL, "Intel");
+--- a/src/sna/sna_display.c
++++ b/src/sna/sna_display.c
+@@ -2291,6 +2291,35 @@
+ drmModeFreeConnector(koutput);
+ }
+
++/* The kernel reports possible encoder clones, whereas X uses a list of
++ * possible connector clones. This is works when we have a 1:1 mapping
++ * between encoders and connectors, but breaks for Haswell which has a pair
++ * of DP/HDMI connectors hanging off a single encoder.
++ */
++static void
++sna_mode_compute_possible_clones(ScrnInfoPtr scrn)
++{
++ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
++ unsigned clones[32] = { 0 };
++ int i, j;
++
++ assert(config->num_output <= 32);
++
++ /* Convert from encoder numbering to output numbering */
++ for (i = 0; i < config->num_output; i++) {
++ unsigned mask = config->output[i]->possible_clones;
++ for (j = 0; mask != 0; j++, mask >>= 1) {
++ if ((mask & 1) == 0)
++ continue;
++
++ clones[j] |= 1 << i;
++ }
++ }
++
++ for (i = 0; i < config->num_output; i++)
++ config->output[i]->possible_clones = clones[i];
++}
++
+ struct sna_visit_set_pixmap_window {
+ PixmapPtr old, new;
+ };
+@@ -2573,6 +2602,8 @@
+
+ for (i = 0; i < mode->kmode->count_connectors; i++)
+ sna_output_init(scrn, mode, i);
++ if (!xf86IsEntityShared(scrn->entityList[0]))
++ sna_mode_compute_possible_clones(scrn);
+
+ #if HAS_PIXMAP_SHARING
+ xf86ProviderSetup(scrn, NULL, "Intel");
diff --git a/debian/patches/series b/debian/patches/series
index b481396..90e7480 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -6,3 +6,4 @@ fix-hsw-gt3-names.diff
add-more-reserved-hsw-ids.diff
add-known-hsw-names.diff
add-more-correct-hsw-names.diff
+fix-possible-clones-computation.patch
Reply to: