]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpu/drm/i915/intel_engine_cs.c
Merge tag 'mips_fixes_4.16_2' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan...
[linux.git] / drivers / gpu / drm / i915 / intel_engine_cs.c
index 6bb51a502b8b4e35a13908344c047d89f1f32c6a..fa960cfd2764f8e44d3d48d0e810cb2cfe4b087a 100644 (file)
@@ -1458,7 +1458,9 @@ static bool ring_is_idle(struct intel_engine_cs *engine)
        struct drm_i915_private *dev_priv = engine->i915;
        bool idle = true;
 
-       intel_runtime_pm_get(dev_priv);
+       /* If the whole device is asleep, the engine must be idle */
+       if (!intel_runtime_pm_get_if_in_use(dev_priv))
+               return true;
 
        /* First check that no commands are left in the ring */
        if ((I915_READ_HEAD(engine) & HEAD_ADDR) !=
@@ -1943,24 +1945,42 @@ intel_engine_lookup_user(struct drm_i915_private *i915, u8 class, u8 instance)
  */
 int intel_enable_engine_stats(struct intel_engine_cs *engine)
 {
+       struct intel_engine_execlists *execlists = &engine->execlists;
        unsigned long flags;
+       int err = 0;
 
        if (!intel_engine_supports_stats(engine))
                return -ENODEV;
 
+       tasklet_disable(&execlists->tasklet);
        spin_lock_irqsave(&engine->stats.lock, flags);
-       if (engine->stats.enabled == ~0)
-               goto busy;
-       if (engine->stats.enabled++ == 0)
+
+       if (unlikely(engine->stats.enabled == ~0)) {
+               err = -EBUSY;
+               goto unlock;
+       }
+
+       if (engine->stats.enabled++ == 0) {
+               const struct execlist_port *port = execlists->port;
+               unsigned int num_ports = execlists_num_ports(execlists);
+
                engine->stats.enabled_at = ktime_get();
-       spin_unlock_irqrestore(&engine->stats.lock, flags);
 
-       return 0;
+               /* XXX submission method oblivious? */
+               while (num_ports-- && port_isset(port)) {
+                       engine->stats.active++;
+                       port++;
+               }
 
-busy:
+               if (engine->stats.active)
+                       engine->stats.start = engine->stats.enabled_at;
+       }
+
+unlock:
        spin_unlock_irqrestore(&engine->stats.lock, flags);
+       tasklet_enable(&execlists->tasklet);
 
-       return -EBUSY;
+       return err;
 }
 
 static ktime_t __intel_engine_get_busy_time(struct intel_engine_cs *engine)