Commit 6e7cc470 authored by Tvrtko Ursulin's avatar Tvrtko Ursulin Committed by Daniel Vetter

drm/i915/skl: Use correct use counters for force wakes

Write and reads following the block changed use engine specific use counters
and unless that is matched here force wake use counting goes bad. Same
force wake is attempted to be taken twice which leads to at least time outs.

NOTE: Depending on feedback from hardware designers it may not be necessary
to grab force wakes on Gen9 here. But for Gen8 it is needed due to a race
between RC6 and ELSP writes.

v2: Added blitter force wake engine and made more future proof.
    Added commit note.
Reviewed-by: default avatarDamien Lespiau <damien.lespiau@intel.com>
Signed-off-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Damien Lespiau <damien.lespiau@intel.com>
Signed-off-by: default avatarDamien Lespiau <damien.lespiau@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent dddab346
...@@ -276,7 +276,8 @@ static void execlists_elsp_write(struct intel_engine_cs *ring, ...@@ -276,7 +276,8 @@ static void execlists_elsp_write(struct intel_engine_cs *ring,
struct drm_i915_gem_object *ctx_obj0, struct drm_i915_gem_object *ctx_obj0,
struct drm_i915_gem_object *ctx_obj1) struct drm_i915_gem_object *ctx_obj1)
{ {
struct drm_i915_private *dev_priv = ring->dev->dev_private; struct drm_device *dev = ring->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
uint64_t temp = 0; uint64_t temp = 0;
uint32_t desc[4]; uint32_t desc[4];
unsigned long flags; unsigned long flags;
...@@ -301,13 +302,18 @@ static void execlists_elsp_write(struct intel_engine_cs *ring, ...@@ -301,13 +302,18 @@ static void execlists_elsp_write(struct intel_engine_cs *ring,
* Instead, we do the runtime_pm_get/put when creating/destroying requests. * Instead, we do the runtime_pm_get/put when creating/destroying requests.
*/ */
spin_lock_irqsave(&dev_priv->uncore.lock, flags); spin_lock_irqsave(&dev_priv->uncore.lock, flags);
if (IS_CHERRYVIEW(dev_priv->dev)) { if (IS_CHERRYVIEW(dev) || INTEL_INFO(dev)->gen >= 9) {
if (dev_priv->uncore.fw_rendercount++ == 0) if (dev_priv->uncore.fw_rendercount++ == 0)
dev_priv->uncore.funcs.force_wake_get(dev_priv, dev_priv->uncore.funcs.force_wake_get(dev_priv,
FORCEWAKE_RENDER); FORCEWAKE_RENDER);
if (dev_priv->uncore.fw_mediacount++ == 0) if (dev_priv->uncore.fw_mediacount++ == 0)
dev_priv->uncore.funcs.force_wake_get(dev_priv, dev_priv->uncore.funcs.force_wake_get(dev_priv,
FORCEWAKE_MEDIA); FORCEWAKE_MEDIA);
if (INTEL_INFO(dev)->gen >= 9) {
if (dev_priv->uncore.fw_blittercount++ == 0)
dev_priv->uncore.funcs.force_wake_get(dev_priv,
FORCEWAKE_BLITTER);
}
} else { } else {
if (dev_priv->uncore.forcewake_count++ == 0) if (dev_priv->uncore.forcewake_count++ == 0)
dev_priv->uncore.funcs.force_wake_get(dev_priv, dev_priv->uncore.funcs.force_wake_get(dev_priv,
...@@ -326,13 +332,18 @@ static void execlists_elsp_write(struct intel_engine_cs *ring, ...@@ -326,13 +332,18 @@ static void execlists_elsp_write(struct intel_engine_cs *ring,
/* Release Force Wakeup (see the big comment above). */ /* Release Force Wakeup (see the big comment above). */
spin_lock_irqsave(&dev_priv->uncore.lock, flags); spin_lock_irqsave(&dev_priv->uncore.lock, flags);
if (IS_CHERRYVIEW(dev_priv->dev)) { if (IS_CHERRYVIEW(dev) || INTEL_INFO(dev)->gen >= 9) {
if (--dev_priv->uncore.fw_rendercount == 0) if (--dev_priv->uncore.fw_rendercount == 0)
dev_priv->uncore.funcs.force_wake_put(dev_priv, dev_priv->uncore.funcs.force_wake_put(dev_priv,
FORCEWAKE_RENDER); FORCEWAKE_RENDER);
if (--dev_priv->uncore.fw_mediacount == 0) if (--dev_priv->uncore.fw_mediacount == 0)
dev_priv->uncore.funcs.force_wake_put(dev_priv, dev_priv->uncore.funcs.force_wake_put(dev_priv,
FORCEWAKE_MEDIA); FORCEWAKE_MEDIA);
if (INTEL_INFO(dev)->gen >= 9) {
if (--dev_priv->uncore.fw_blittercount == 0)
dev_priv->uncore.funcs.force_wake_put(dev_priv,
FORCEWAKE_BLITTER);
}
} else { } else {
if (--dev_priv->uncore.forcewake_count == 0) if (--dev_priv->uncore.forcewake_count == 0)
dev_priv->uncore.funcs.force_wake_put(dev_priv, dev_priv->uncore.funcs.force_wake_put(dev_priv,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment