| From 32a1e9c9ae4dfc6539b02de59424f48791bf83f9 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com> |
| Date: Wed, 26 Jun 2013 17:43:24 +0300 |
| Subject: drm/i915: Use wait_for() to wait for Punit to change GPU freq on VLV |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Use wait_for() instead of the open coded loop to avoid spreading the |
| same old timeout related bugs. |
| |
| This changes the loop to use msleep(1) instead of udelay(10) when the |
| Punit had not yet completed the frequency change. In practice that |
| doesn't seem to hurt performance as the Punit appears to be ready pretty |
| much always. |
| |
| Also give the status bit a name, instead of using the magic number 1. |
| |
| Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> |
| Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit e8474409d7ab6dac38d4a3a6a365504b302f6c16) |
| (cherry picked from drm-intel-next-queued) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_reg.h | 1 + |
| drivers/gpu/drm/i915/intel_pm.c | 11 ++--------- |
| 2 files changed, 3 insertions(+), 9 deletions(-) |
| |
| --- a/drivers/gpu/drm/i915/i915_reg.h |
| +++ b/drivers/gpu/drm/i915/i915_reg.h |
| @@ -364,6 +364,7 @@ |
| #define PUNIT_REG_GPU_LFM 0xd3 |
| #define PUNIT_REG_GPU_FREQ_REQ 0xd4 |
| #define PUNIT_REG_GPU_FREQ_STS 0xd8 |
| +#define GENFREQSTATUS (1<<0) |
| #define PUNIT_REG_MEDIA_TURBO_FREQ_REQ 0xdc |
| |
| #define PUNIT_FUSE_BUS2 0xf6 /* bits 47:40 */ |
| --- a/drivers/gpu/drm/i915/intel_pm.c |
| +++ b/drivers/gpu/drm/i915/intel_pm.c |
| @@ -3075,19 +3075,12 @@ void gen6_set_rps(struct drm_device *dev |
| */ |
| static void vlv_update_rps_cur_delay(struct drm_i915_private *dev_priv) |
| { |
| - unsigned long timeout = jiffies + msecs_to_jiffies(10); |
| u32 pval; |
| |
| WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock)); |
| |
| - do { |
| - pval = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS); |
| - if (time_after(jiffies, timeout)) { |
| - DRM_DEBUG_DRIVER("timed out waiting for Punit\n"); |
| - break; |
| - } |
| - udelay(10); |
| - } while (pval & 1); |
| + if (wait_for(((pval = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS)) & GENFREQSTATUS) == 0, 10)) |
| + DRM_DEBUG_DRIVER("timed out waiting for Punit\n"); |
| |
| pval >>= 8; |
| |