drm/i915: Limit calling mark-busy only for potential scanouts
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 3 May 2012 14:47:57 +0000 (15:47 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 8 May 2012 13:10:34 +0000 (15:10 +0200)
The principle of intel_mark_busy() is that we want to spot the
transition of when the display engine is being used in order to bump
powersaving modes and increase display clocks. As such it is only
important when the display is changing, i.e. when rendering to the
scanout or other sprite/plane, and these are characterised by being
pinned.

v2: Mark the whole device as busy on execbuffer and pageflips as well
and rebase against dinq for the minor bug fix to be immediately
applicable.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
[danvet: fix compile fail.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_gem_execbuffer.c
drivers/gpu/drm/i915/intel_display.c

index 206b9bbe6979d9c491c7e84832f68adc317ce09a..21fc11d8471274e83965b42f671a5b8528ac319e 100644 (file)
@@ -967,11 +967,14 @@ i915_gem_execbuffer_move_to_active(struct list_head *objects,
                        obj->pending_gpu_write = true;
                        list_move_tail(&obj->gpu_write_list,
                                       &ring->gpu_write_list);
-                       intel_mark_busy(ring->dev, obj);
+                       if (obj->pin_count) /* check for potential scanout */
+                               intel_mark_busy(ring->dev, obj);
                }
 
                trace_i915_gem_object_change_domain(obj, old_read, old_write);
        }
+
+       intel_mark_busy(ring->dev, NULL);
 }
 
 static void
index b322bde98675bba80b060248c2e5a12188124de3..1cbe2680fdec04aa7daf252b914d872d9d2111e0 100644 (file)
@@ -5558,6 +5558,9 @@ void intel_mark_busy(struct drm_device *dev, struct drm_i915_gem_object *obj)
                mod_timer(&dev_priv->idle_timer, jiffies +
                          msecs_to_jiffies(GPU_IDLE_TIMEOUT));
 
+       if (obj == NULL)
+               return;
+
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
                if (!crtc->fb)
                        continue;
@@ -6007,6 +6010,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
                goto cleanup_pending;
 
        intel_disable_fbc(dev);
+       intel_mark_busy(dev, obj);
        mutex_unlock(&dev->struct_mutex);
 
        trace_i915_flip_request(intel_crtc->plane, obj);