]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.5-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Sep 2012 23:13:45 +0000 (16:13 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Sep 2012 23:13:45 +0000 (16:13 -0700)
added patches:
drm-i915-extract-connector-update-from-intel_ddc_get_modes-for-reuse.patch
drm-i915-fall-back-to-bit-banging-if-gmbus-fails-in-crt-edid-reads.patch
drm-i915-use-hsw-rps-tuning-values-everywhere-on-gen6.patch
drm-radeon-init-lockup-timeout-on-ring-init.patch

queue-3.5/drm-i915-extract-connector-update-from-intel_ddc_get_modes-for-reuse.patch [new file with mode: 0644]
queue-3.5/drm-i915-fall-back-to-bit-banging-if-gmbus-fails-in-crt-edid-reads.patch [new file with mode: 0644]
queue-3.5/drm-i915-use-hsw-rps-tuning-values-everywhere-on-gen6.patch [new file with mode: 0644]
queue-3.5/drm-radeon-init-lockup-timeout-on-ring-init.patch [new file with mode: 0644]
queue-3.5/series

diff --git a/queue-3.5/drm-i915-extract-connector-update-from-intel_ddc_get_modes-for-reuse.patch b/queue-3.5/drm-i915-extract-connector-update-from-intel_ddc_get_modes-for-reuse.patch
new file mode 100644 (file)
index 0000000..aa8e4f1
--- /dev/null
@@ -0,0 +1,84 @@
+From 4eab81366465aedcfd26de960c595bc03599c09f Mon Sep 17 00:00:00 2001
+From: Jani Nikula <jani.nikula@intel.com>
+Date: Mon, 13 Aug 2012 13:22:34 +0300
+Subject: drm/i915: extract connector update from intel_ddc_get_modes() for reuse
+
+From: Jani Nikula <jani.nikula@intel.com>
+
+commit 4eab81366465aedcfd26de960c595bc03599c09f upstream.
+
+Refactor the connector update part of intel_ddc_get_modes() into a separate
+intel_connector_update_modes() function for reuse. No functional changes.
+
+Signed-off-by: Jani Nikula <jani.nikula@intel.com>
+Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=45881
+Tested-by: Alex Ferrando <alferpal@gmail.com>
+Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/i915/intel_drv.h   |    2 ++
+ drivers/gpu/drm/i915/intel_modes.c |   31 ++++++++++++++++++++++---------
+ 2 files changed, 24 insertions(+), 9 deletions(-)
+
+--- a/drivers/gpu/drm/i915/intel_drv.h
++++ b/drivers/gpu/drm/i915/intel_drv.h
+@@ -334,6 +334,8 @@ struct intel_fbc_work {
+       int interval;
+ };
++int intel_connector_update_modes(struct drm_connector *connector,
++                              struct edid *edid);
+ int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter);
+ extern bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus);
+--- a/drivers/gpu/drm/i915/intel_modes.c
++++ b/drivers/gpu/drm/i915/intel_modes.c
+@@ -61,6 +61,25 @@ bool intel_ddc_probe(struct intel_encode
+ }
+ /**
++ * intel_connector_update_modes - update connector from edid
++ * @connector: DRM connector device to use
++ * @edid: previously read EDID information
++ */
++int intel_connector_update_modes(struct drm_connector *connector,
++                              struct edid *edid)
++{
++      int ret;
++
++      drm_mode_connector_update_edid_property(connector, edid);
++      ret = drm_add_edid_modes(connector, edid);
++      drm_edid_to_eld(connector, edid);
++      connector->display_info.raw_edid = NULL;
++      kfree(edid);
++
++      return ret;
++}
++
++/**
+  * intel_ddc_get_modes - get modelist from monitor
+  * @connector: DRM connector device to use
+  * @adapter: i2c adapter
+@@ -71,18 +90,12 @@ int intel_ddc_get_modes(struct drm_conne
+                       struct i2c_adapter *adapter)
+ {
+       struct edid *edid;
+-      int ret = 0;
+       edid = drm_get_edid(connector, adapter);
+-      if (edid) {
+-              drm_mode_connector_update_edid_property(connector, edid);
+-              ret = drm_add_edid_modes(connector, edid);
+-              drm_edid_to_eld(connector, edid);
+-              connector->display_info.raw_edid = NULL;
+-              kfree(edid);
+-      }
++      if (!edid)
++              return 0;
+-      return ret;
++      return intel_connector_update_modes(connector, edid);
+ }
+ static const struct drm_prop_enum_list force_audio_names[] = {
diff --git a/queue-3.5/drm-i915-fall-back-to-bit-banging-if-gmbus-fails-in-crt-edid-reads.patch b/queue-3.5/drm-i915-fall-back-to-bit-banging-if-gmbus-fails-in-crt-edid-reads.patch
new file mode 100644 (file)
index 0000000..52ed060
--- /dev/null
@@ -0,0 +1,103 @@
+From f1a2f5b7c5f0941d23eef0a095c0b99bf8d051e6 Mon Sep 17 00:00:00 2001
+From: Jani Nikula <jani.nikula@intel.com>
+Date: Mon, 13 Aug 2012 13:22:35 +0300
+Subject: drm/i915: fall back to bit-banging if GMBUS fails in CRT EDID reads
+
+From: Jani Nikula <jani.nikula@intel.com>
+
+commit f1a2f5b7c5f0941d23eef0a095c0b99bf8d051e6 upstream.
+
+GMBUS was enabled over bit-banging as the default in commits:
+
+commit c3dfefa0a6d235bd465309e12f4c56ea16e71111
+Author: Daniel Vetter <daniel.vetter@ffwll.ch>
+Date:   Tue Feb 14 22:37:25 2012 +0100
+
+    drm/i915: reenable gmbus on gen3+ again
+
+and
+
+commit 0fb3f969c8683505fb7323c06bf8a999a5a45a15
+Author: Daniel Vetter <daniel.vetter@ffwll.ch>
+Date:   Fri Mar 2 19:38:30 2012 +0100
+
+    drm/i915: enable gmbus on gen2
+
+Unfortunately, GMBUS seems to fail on some CRT displays. Add a bit-banging
+fallback to CRT EDID reads.
+
+LKML-Reference: <201207251020.47637.maciej.rutecki@gmail.com>
+Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=45881
+Signed-off-by: Jani Nikula <jani.nikula@intel.com>
+Tested-by: Alex Ferrando <alferpal@gmail.com>
+Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/i915/intel_crt.c |   36 +++++++++++++++++++++++++++++++++---
+ 1 file changed, 33 insertions(+), 3 deletions(-)
+
+--- a/drivers/gpu/drm/i915/intel_crt.c
++++ b/drivers/gpu/drm/i915/intel_crt.c
+@@ -284,6 +284,36 @@ static bool intel_crt_detect_hotplug(str
+       return ret;
+ }
++static struct edid *intel_crt_get_edid(struct drm_connector *connector,
++                              struct i2c_adapter *i2c)
++{
++      struct edid *edid;
++
++      edid = drm_get_edid(connector, i2c);
++
++      if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
++              DRM_DEBUG_KMS("CRT GMBUS EDID read failed, retry using GPIO bit-banging\n");
++              intel_gmbus_force_bit(i2c, true);
++              edid = drm_get_edid(connector, i2c);
++              intel_gmbus_force_bit(i2c, false);
++      }
++
++      return edid;
++}
++
++/* local version of intel_ddc_get_modes() to use intel_crt_get_edid() */
++static int intel_crt_ddc_get_modes(struct drm_connector *connector,
++                              struct i2c_adapter *adapter)
++{
++      struct edid *edid;
++
++      edid = intel_crt_get_edid(connector, adapter);
++      if (!edid)
++              return 0;
++
++      return intel_connector_update_modes(connector, edid);
++}
++
+ static bool intel_crt_detect_ddc(struct drm_connector *connector)
+ {
+       struct intel_crt *crt = intel_attached_crt(connector);
+@@ -299,7 +329,7 @@ static bool intel_crt_detect_ddc(struct
+               struct i2c_adapter *i2c;
+               i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin);
+-              edid = drm_get_edid(connector, i2c);
++              edid = intel_crt_get_edid(connector, i2c);
+               /*
+                * This may be a DVI-I connector with a shared DDC
+                * link between analog and digital outputs, so we
+@@ -498,13 +528,13 @@ static int intel_crt_get_modes(struct dr
+       struct i2c_adapter *i2c;
+       i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin);
+-      ret = intel_ddc_get_modes(connector, i2c);
++      ret = intel_crt_ddc_get_modes(connector, i2c);
+       if (ret || !IS_G4X(dev))
+               return ret;
+       /* Try to probe digital port for output in DVI-I -> VGA mode. */
+       i2c = intel_gmbus_get_adapter(dev_priv, GMBUS_PORT_DPB);
+-      return intel_ddc_get_modes(connector, i2c);
++      return intel_crt_ddc_get_modes(connector, i2c);
+ }
+ static int intel_crt_set_property(struct drm_connector *connector,
diff --git a/queue-3.5/drm-i915-use-hsw-rps-tuning-values-everywhere-on-gen6.patch b/queue-3.5/drm-i915-use-hsw-rps-tuning-values-everywhere-on-gen6.patch
new file mode 100644 (file)
index 0000000..11cfeff
--- /dev/null
@@ -0,0 +1,68 @@
+From 1ee9ae3244c4789f3184c5123f3b2d7e405b3f4c Mon Sep 17 00:00:00 2001
+From: Daniel Vetter <daniel.vetter@ffwll.ch>
+Date: Wed, 15 Aug 2012 10:41:45 +0200
+Subject: drm/i915: use hsw rps tuning values everywhere on gen6+
+
+From: Daniel Vetter <daniel.vetter@ffwll.ch>
+
+commit 1ee9ae3244c4789f3184c5123f3b2d7e405b3f4c upstream.
+
+James Bottomley reported [1] a massive power regression, due to the
+enabling of semaphores by default in 3.5. A workaround for him is to
+again disable semaphores. And indeed, his system has a very hard time
+to enter rc6 with semaphores enabled.
+
+Ben Widawsky run around with a kill-a-watt a lot and noticed:
+- There are indeed a few rare systems that seem to have a hard time
+  entering rc6 when desktop-idle.
+- One machine, The Indestructible Toshiba regressed in this behaviour
+  between 3.5 and 3.6 in a merge commit! So rc6 behaviour with the
+  current setting seems to be highly timing dependent and not robust
+  at all.
+- The behaviour James reported wrt semaphores seems to be a freak
+  timing thing that only happens on his specific machine, confirming
+  that enabling semaphores shouldn't reduce rc6 residency.
+
+Now furthermore the Google ChromeOS guys reported [2] a while ago that
+at least on some machines a simply a blinking cursor can keep the gpu
+turbo at the highest frequency. This is because the current rps limits
+used on snb/ivb are highly asymmetric.
+
+On the theory that gpu turbo and rc6 tuning values are related, we've
+tried whether the much saner looking (since much less asymmetric) rps
+tuning values used for hsw would also help entering rc6 more robustly.
+
+And it seems to mostly work, and we don't really have the resources to
+through-roughly tune things in any better way: The values from the
+ChromeOS ppl seem to fare a bit worse for James' machine, so I guess
+we better stick with something vpg (the gpu hw/windows group)
+provided, hoping that they've done their jobs.
+
+Reference[1]: http://lists.freedesktop.org/archives/dri-devel/2012-July/025675.html
+Reference[2]: http://lists.freedesktop.org/archives/intel-gfx/2012-July/018692.html
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=53393
+Tested-by: Ben Widawsky <ben@bwidawsk.net>
+Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/i915/intel_pm.c |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+--- a/drivers/gpu/drm/i915/intel_pm.c
++++ b/drivers/gpu/drm/i915/intel_pm.c
+@@ -2431,10 +2431,10 @@ void gen6_enable_rps(struct drm_i915_pri
+       I915_WRITE(GEN6_RP_INTERRUPT_LIMITS,
+                  dev_priv->max_delay << 24 |
+                  dev_priv->min_delay << 16);
+-      I915_WRITE(GEN6_RP_UP_THRESHOLD, 10000);
+-      I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 1000000);
+-      I915_WRITE(GEN6_RP_UP_EI, 100000);
+-      I915_WRITE(GEN6_RP_DOWN_EI, 5000000);
++      I915_WRITE(GEN6_RP_UP_THRESHOLD, 59400);
++      I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 245000);
++      I915_WRITE(GEN6_RP_UP_EI, 66000);
++      I915_WRITE(GEN6_RP_DOWN_EI, 350000);
+       I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
+       I915_WRITE(GEN6_RP_CONTROL,
+                  GEN6_RP_MEDIA_TURBO |
diff --git a/queue-3.5/drm-radeon-init-lockup-timeout-on-ring-init.patch b/queue-3.5/drm-radeon-init-lockup-timeout-on-ring-init.patch
new file mode 100644 (file)
index 0000000..723df8c
--- /dev/null
@@ -0,0 +1,32 @@
+From 48c0ac9911839daf188e4a0b6b132ac31050a241 Mon Sep 17 00:00:00 2001
+From: Christian König <deathsimple@vodafone.de>
+Date: Mon, 20 Aug 2012 15:38:47 +0200
+Subject: drm/radeon: init lockup timeout on ring init
+
+From: Christian König <deathsimple@vodafone.de>
+
+commit 48c0ac9911839daf188e4a0b6b132ac31050a241 upstream.
+
+Reset the lockup timeout on ring (re-)initialisation.
+
+Otherwise we get error messages like this on gpu resets:
+[ 1559.949177] radeon 0000:01:00.0: GPU lockup CP stall for more than 1482270msec
+
+Signed-off-by: Christian König <deathsimple@vodafone.de>
+Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/radeon/radeon_ring.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/gpu/drm/radeon/radeon_ring.c
++++ b/drivers/gpu/drm/radeon/radeon_ring.c
+@@ -394,6 +394,7 @@ int radeon_ring_init(struct radeon_devic
+       if (radeon_debugfs_ring_init(rdev, ring)) {
+               DRM_ERROR("Failed to register debugfs file for rings !\n");
+       }
++      radeon_ring_lockup_update(ring);
+       return 0;
+ }
index b3efc18a0586f9d9a656af3004591d2b59d4b672..942d749961311983f7aeb4bf16bda9b04c369480 100644 (file)
@@ -184,3 +184,7 @@ drm-radeon-fence-virtual-address-and-free-it-once-idle-v4.patch
 drm-radeon-split-atrm-support-out-from-the-atpx-handler-v3.patch
 drm-radeon-implement-acpi-vfct-vbios-fetch-v3.patch
 drm-radeon-kms-extend-the-fujitsu-d3003-s2-board-connector-quirk-to-cover-later-silicon-stepping.patch
+drm-radeon-init-lockup-timeout-on-ring-init.patch
+drm-i915-extract-connector-update-from-intel_ddc_get_modes-for-reuse.patch
+drm-i915-fall-back-to-bit-banging-if-gmbus-fails-in-crt-edid-reads.patch
+drm-i915-use-hsw-rps-tuning-values-everywhere-on-gen6.patch