From: Greg Kroah-Hartman Date: Wed, 26 Sep 2012 23:13:45 +0000 (-0700) Subject: 3.5-stable patches X-Git-Tag: v3.0.44~57 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f157bc0b9bcbb46a9617932e0ae1ec5dce3a8b0a;p=thirdparty%2Fkernel%2Fstable-queue.git 3.5-stable patches 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 --- 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 index 00000000000..aa8e4f18e3c --- /dev/null +++ b/queue-3.5/drm-i915-extract-connector-update-from-intel_ddc_get_modes-for-reuse.patch @@ -0,0 +1,84 @@ +From 4eab81366465aedcfd26de960c595bc03599c09f Mon Sep 17 00:00:00 2001 +From: Jani Nikula +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 + +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 +Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=45881 +Tested-by: Alex Ferrando +Signed-off-by: Daniel Vetter +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..52ed060c4e5 --- /dev/null +++ b/queue-3.5/drm-i915-fall-back-to-bit-banging-if-gmbus-fails-in-crt-edid-reads.patch @@ -0,0 +1,103 @@ +From f1a2f5b7c5f0941d23eef0a095c0b99bf8d051e6 Mon Sep 17 00:00:00 2001 +From: Jani Nikula +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 + +commit f1a2f5b7c5f0941d23eef0a095c0b99bf8d051e6 upstream. + +GMBUS was enabled over bit-banging as the default in commits: + +commit c3dfefa0a6d235bd465309e12f4c56ea16e71111 +Author: Daniel Vetter +Date: Tue Feb 14 22:37:25 2012 +0100 + + drm/i915: reenable gmbus on gen3+ again + +and + +commit 0fb3f969c8683505fb7323c06bf8a999a5a45a15 +Author: Daniel Vetter +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 +Tested-by: Alex Ferrando +Signed-off-by: Daniel Vetter +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..11cfeff9d22 --- /dev/null +++ b/queue-3.5/drm-i915-use-hsw-rps-tuning-values-everywhere-on-gen6.patch @@ -0,0 +1,68 @@ +From 1ee9ae3244c4789f3184c5123f3b2d7e405b3f4c Mon Sep 17 00:00:00 2001 +From: Daniel Vetter +Date: Wed, 15 Aug 2012 10:41:45 +0200 +Subject: drm/i915: use hsw rps tuning values everywhere on gen6+ + +From: Daniel Vetter + +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 +Signed-off-by: Daniel Vetter +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..723df8cb8ca --- /dev/null +++ b/queue-3.5/drm-radeon-init-lockup-timeout-on-ring-init.patch @@ -0,0 +1,32 @@ +From 48c0ac9911839daf188e4a0b6b132ac31050a241 Mon Sep 17 00:00:00 2001 +From: Christian König +Date: Mon, 20 Aug 2012 15:38:47 +0200 +Subject: drm/radeon: init lockup timeout on ring init + +From: Christian König + +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 +Reviewed-by: Michel Dänzer +Signed-off-by: Greg Kroah-Hartman + +--- + 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; + } + diff --git a/queue-3.5/series b/queue-3.5/series index b3efc18a058..942d7499613 100644 --- a/queue-3.5/series +++ b/queue-3.5/series @@ -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