drm/i915: Use wait_for() to wait for Punit to change GPU freq on VLV

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>
This commit is contained in:
Ville Syrjälä 2013-06-26 17:43:24 +03:00 committed by Daniel Vetter
parent 510d5f2f6b
commit e8474409d7
2 changed files with 3 additions and 9 deletions

View File

@ -363,6 +363,7 @@
#define PUNIT_REG_GPU_LFM 0xd3 #define PUNIT_REG_GPU_LFM 0xd3
#define PUNIT_REG_GPU_FREQ_REQ 0xd4 #define PUNIT_REG_GPU_FREQ_REQ 0xd4
#define PUNIT_REG_GPU_FREQ_STS 0xd8 #define PUNIT_REG_GPU_FREQ_STS 0xd8
#define GENFREQSTATUS (1<<0)
#define PUNIT_REG_MEDIA_TURBO_FREQ_REQ 0xdc #define PUNIT_REG_MEDIA_TURBO_FREQ_REQ 0xdc
#define PUNIT_FUSE_BUS2 0xf6 /* bits 47:40 */ #define PUNIT_FUSE_BUS2 0xf6 /* bits 47:40 */

View File

@ -3075,19 +3075,12 @@ void gen6_set_rps(struct drm_device *dev, u8 val)
*/ */
static void vlv_update_rps_cur_delay(struct drm_i915_private *dev_priv) static void vlv_update_rps_cur_delay(struct drm_i915_private *dev_priv)
{ {
unsigned long timeout = jiffies + msecs_to_jiffies(10);
u32 pval; u32 pval;
WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock)); WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
do { if (wait_for(((pval = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS)) & GENFREQSTATUS) == 0, 10))
pval = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS); DRM_DEBUG_DRIVER("timed out waiting for Punit\n");
if (time_after(jiffies, timeout)) {
DRM_DEBUG_DRIVER("timed out waiting for Punit\n");
break;
}
udelay(10);
} while (pval & 1);
pval >>= 8; pval >>= 8;