From patchwork Tue Sep 25 16:49:54 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [Quantal] UBUNTU: SAUCE: drm/i915: Explicitly disable RC6 for certain models Date: Tue, 25 Sep 2012 06:49:54 -0000 From: Jesse Sung X-Patchwork-Id: 186854 Message-Id: <1348591794-15819-1-git-send-email-jesse.sung@canonical.com> To: kernel-team@lists.ubuntu.com From: Wen-chien Jesse Sung BugLink: https://launchpad.net/bugs/1002170 BugLink: https://launchpad.net/bugs/1008867 Enabling RC6 may cause system hang on Lenovo S510 after idle for a while. It also makes Asus ET2012E sometimes fail to resume from suspend. Explicitly disable RC6 on these models. Signed-off-by: Wen-chien Jesse Sung --- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/intel_display.c | 13 +++++++++++++ drivers/gpu/drm/i915/intel_pm.c | 5 +++++ 3 files changed, 19 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 4253e61..ce24707 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -329,6 +329,7 @@ enum intel_pch { #define QUIRK_PIPEA_FORCE (1<<0) #define QUIRK_LVDS_SSC_DISABLE (1<<1) #define QUIRK_INVERT_BRIGHTNESS (1<<2) +#define QUIRK_RC6_DISABLE (1<<3) struct intel_fbdev; struct intel_fbc_work; diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 87f7055..225f599 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -6833,6 +6833,13 @@ static void quirk_invert_brightness(struct drm_device *dev) DRM_INFO("applying inverted panel brightness quirk\n"); } +static void quirk_rc6_force_disable(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + dev_priv->quirks |= QUIRK_RC6_DISABLE; + DRM_INFO("applying RC6 disable quirk\n"); +} + struct intel_quirk { int device; int subsystem_vendor; @@ -6868,6 +6875,12 @@ static struct intel_quirk intel_quirks[] = { /* Acer Aspire 5734Z must invert backlight brightness */ { 0x2a42, 0x1025, 0x0459, quirk_invert_brightness }, + + /* Asus ET2012E may fail to resume from S3 if RC6 is enabled */ + { 0x0102, 0x1043, 0x844d, quirk_rc6_force_disable }, + + /* Lenovo ThinkCentre S510 may hang after idle for a long time */ + { 0x0102, 0x17aa, 0x307b, quirk_rc6_force_disable }, }; static void intel_init_quirks(struct drm_device *dev) diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 760a01d..ccc8683 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -2320,12 +2320,17 @@ void gen6_disable_rps(struct drm_device *dev) int intel_enable_rc6(const struct drm_device *dev) { + struct drm_i915_private *dev_priv = dev->dev_private; + /* * Respect the kernel parameter if it is set */ if (i915_enable_rc6 >= 0) return i915_enable_rc6; + if (dev_priv->quirks & QUIRK_RC6_DISABLE) + return 0; + /* * Disable RC6 on Ironlake */