drm/i915: Streamline VLV forcewake handling
It occured to me that when we're trying to wake up both render and media wells on VLV, we might end up calling the low level force_wake_get/put two times even though one call would be enough. Make that happen by figuring out which wells really need to be woken up based on the forcewake counts. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by:Deepak S <deepak.s@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
fc9d83f747
commit
6fe7286530
|
@ -257,16 +257,16 @@ void vlv_force_wake_get(struct drm_i915_private *dev_priv,
|
|||
unsigned long irqflags;
|
||||
|
||||
spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
|
||||
if (FORCEWAKE_RENDER & fw_engine) {
|
||||
if (dev_priv->uncore.fw_rendercount++ == 0)
|
||||
dev_priv->uncore.funcs.force_wake_get(dev_priv,
|
||||
FORCEWAKE_RENDER);
|
||||
}
|
||||
if (FORCEWAKE_MEDIA & fw_engine) {
|
||||
if (dev_priv->uncore.fw_mediacount++ == 0)
|
||||
dev_priv->uncore.funcs.force_wake_get(dev_priv,
|
||||
FORCEWAKE_MEDIA);
|
||||
}
|
||||
|
||||
if (fw_engine & FORCEWAKE_RENDER &&
|
||||
dev_priv->uncore.fw_rendercount++ != 0)
|
||||
fw_engine &= ~FORCEWAKE_RENDER;
|
||||
if (fw_engine & FORCEWAKE_MEDIA &&
|
||||
dev_priv->uncore.fw_mediacount++ != 0)
|
||||
fw_engine &= ~FORCEWAKE_MEDIA;
|
||||
|
||||
if (fw_engine)
|
||||
dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_engine);
|
||||
|
||||
spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
|
||||
}
|
||||
|
@ -278,19 +278,15 @@ void vlv_force_wake_put(struct drm_i915_private *dev_priv,
|
|||
|
||||
spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
|
||||
|
||||
if (FORCEWAKE_RENDER & fw_engine) {
|
||||
WARN_ON(dev_priv->uncore.fw_rendercount == 0);
|
||||
if (--dev_priv->uncore.fw_rendercount == 0)
|
||||
dev_priv->uncore.funcs.force_wake_put(dev_priv,
|
||||
FORCEWAKE_RENDER);
|
||||
}
|
||||
if (fw_engine & FORCEWAKE_RENDER &&
|
||||
--dev_priv->uncore.fw_rendercount != 0)
|
||||
fw_engine &= ~FORCEWAKE_RENDER;
|
||||
if (fw_engine & FORCEWAKE_MEDIA &&
|
||||
--dev_priv->uncore.fw_mediacount != 0)
|
||||
fw_engine &= ~FORCEWAKE_MEDIA;
|
||||
|
||||
if (FORCEWAKE_MEDIA & fw_engine) {
|
||||
WARN_ON(dev_priv->uncore.fw_mediacount == 0);
|
||||
if (--dev_priv->uncore.fw_mediacount == 0)
|
||||
dev_priv->uncore.funcs.force_wake_put(dev_priv,
|
||||
FORCEWAKE_MEDIA);
|
||||
}
|
||||
if (fw_engine)
|
||||
dev_priv->uncore.funcs.force_wake_put(dev_priv, fw_engine);
|
||||
|
||||
spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
|
||||
}
|
||||
|
@ -516,27 +512,19 @@ gen6_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
|
|||
static u##x \
|
||||
vlv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
|
||||
unsigned fwengine = 0; \
|
||||
unsigned fwcount; \
|
||||
REG_READ_HEADER(x); \
|
||||
if (FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg)) { \
|
||||
fwengine = FORCEWAKE_RENDER; \
|
||||
fwcount = dev_priv->uncore.fw_rendercount; \
|
||||
} \
|
||||
else if (FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg)) { \
|
||||
fwengine = FORCEWAKE_MEDIA; \
|
||||
fwcount = dev_priv->uncore.fw_mediacount; \
|
||||
if (FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg)) { \
|
||||
if (dev_priv->uncore.fw_rendercount == 0) \
|
||||
fwengine = FORCEWAKE_RENDER; \
|
||||
} else if (FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg)) { \
|
||||
if (dev_priv->uncore.fw_mediacount == 0) \
|
||||
fwengine = FORCEWAKE_MEDIA; \
|
||||
} \
|
||||
if (fwengine != 0) { \
|
||||
if (fwcount == 0) \
|
||||
(dev_priv)->uncore.funcs.force_wake_get(dev_priv, \
|
||||
fwengine); \
|
||||
val = __raw_i915_read##x(dev_priv, reg); \
|
||||
if (fwcount == 0) \
|
||||
(dev_priv)->uncore.funcs.force_wake_put(dev_priv, \
|
||||
fwengine); \
|
||||
} else { \
|
||||
val = __raw_i915_read##x(dev_priv, reg); \
|
||||
} \
|
||||
if (fwengine) \
|
||||
dev_priv->uncore.funcs.force_wake_get(dev_priv, fwengine); \
|
||||
val = __raw_i915_read##x(dev_priv, reg); \
|
||||
if (fwengine) \
|
||||
dev_priv->uncore.funcs.force_wake_put(dev_priv, fwengine); \
|
||||
REG_READ_FOOTER; \
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue