diff options
author | Imre Deak <imre.deak@intel.com> | 2016-06-28 06:37:32 -0400 |
---|---|---|
committer | Jani Nikula <jani.nikula@intel.com> | 2016-06-29 04:18:04 -0400 |
commit | fa7c13e5b1e2076b0ec716ed584ab76f9e65b7a6 (patch) | |
tree | c091a063780a5c3ba38505ee36373bca00b2b1e2 | |
parent | 11f6145791775ce41b8993fd29e19eb53ef0ff14 (diff) |
drm/i915/hsw: Avoid early timeout during LCPLL disable/restore
Since wait_for_atomic doesn't re-check the wait-for condition after
expiry of the timeout it can fail when called from non-atomic context
even if the condition is set correctly before the expiry. Fix this by
using the non-atomic wait_for instead.
Fixes: 0351b93992aa ("drm/i915: Do not lie about atomic timeout granularity")
CC: Chris Wilson <chris@chris-wilson.co.uk>
CC: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
CC: drm-intel-fixes@lists.freedesktop.org
Link: http://patchwork.freedesktop.org/patch/msgid/1467110253-16046-4-git-send-email-imre.deak@intel.com
(cherry picked from commit f53dd63f1119a98a16d1a5a7cb3277a2f1ff483d)
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index a164ea44f668..04452cf3eae8 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -9440,8 +9440,8 @@ static void hsw_disable_lcpll(struct drm_i915_private *dev_priv, | |||
9440 | val |= LCPLL_CD_SOURCE_FCLK; | 9440 | val |= LCPLL_CD_SOURCE_FCLK; |
9441 | I915_WRITE(LCPLL_CTL, val); | 9441 | I915_WRITE(LCPLL_CTL, val); |
9442 | 9442 | ||
9443 | if (wait_for_atomic_us(I915_READ(LCPLL_CTL) & | 9443 | if (wait_for_us(I915_READ(LCPLL_CTL) & |
9444 | LCPLL_CD_SOURCE_FCLK_DONE, 1)) | 9444 | LCPLL_CD_SOURCE_FCLK_DONE, 1)) |
9445 | DRM_ERROR("Switching to FCLK failed\n"); | 9445 | DRM_ERROR("Switching to FCLK failed\n"); |
9446 | 9446 | ||
9447 | val = I915_READ(LCPLL_CTL); | 9447 | val = I915_READ(LCPLL_CTL); |
@@ -9514,8 +9514,8 @@ static void hsw_restore_lcpll(struct drm_i915_private *dev_priv) | |||
9514 | val &= ~LCPLL_CD_SOURCE_FCLK; | 9514 | val &= ~LCPLL_CD_SOURCE_FCLK; |
9515 | I915_WRITE(LCPLL_CTL, val); | 9515 | I915_WRITE(LCPLL_CTL, val); |
9516 | 9516 | ||
9517 | if (wait_for_atomic_us((I915_READ(LCPLL_CTL) & | 9517 | if (wait_for_us((I915_READ(LCPLL_CTL) & |
9518 | LCPLL_CD_SOURCE_FCLK_DONE) == 0, 1)) | 9518 | LCPLL_CD_SOURCE_FCLK_DONE) == 0, 1)) |
9519 | DRM_ERROR("Switching back to LCPLL failed\n"); | 9519 | DRM_ERROR("Switching back to LCPLL failed\n"); |
9520 | } | 9520 | } |
9521 | 9521 | ||