]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
drm/i915: Only run idle processing from i915_gem_retire_requests_worker
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 8 Jan 2013 11:02:57 +0000 (11:02 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Feb 2013 13:38:36 +0000 (05:38 -0800)
commit 725a5b54028916cd2511a251c5b5b13d1715addc upstream.

When adding the fb idle detection to mark-inactive, it was forgotten
that userspace can drive the processing of retire-requests. We assumed
that it would be principally driven by the retire requests worker,
running once every second whilst active and so we would get the deferred
timer for free. Instead we spend too many CPU cycles reclocking the LVDS
preventing real work from being done.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reported-and-tested-by: Alexander Lam <lambchop468@gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=58843
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h

index 8febea6daa0840b08f8aae13418b859204b7bc2d..3a4199f4177afba0d2a8a68ffd365fa32f6e268a 100644 (file)
@@ -1918,9 +1918,6 @@ i915_gem_object_move_to_inactive(struct drm_i915_gem_object *obj)
        BUG_ON(obj->base.write_domain & ~I915_GEM_GPU_DOMAINS);
        BUG_ON(!obj->active);
 
-       if (obj->pin_count) /* are we a framebuffer? */
-               intel_mark_fb_idle(obj);
-
        list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
 
        list_del_init(&obj->ring_list);
index da1ad9c80bb53722e7afd423b27a819f31ff6927..6dad9575eb2863e26322fbbf1efa479e29a4bc76 100644 (file)
@@ -6993,11 +6993,6 @@ void intel_mark_busy(struct drm_device *dev)
 
 void intel_mark_idle(struct drm_device *dev)
 {
-}
-
-void intel_mark_fb_busy(struct drm_i915_gem_object *obj)
-{
-       struct drm_device *dev = obj->base.dev;
        struct drm_crtc *crtc;
 
        if (!i915_powersave)
@@ -7007,12 +7002,11 @@ void intel_mark_fb_busy(struct drm_i915_gem_object *obj)
                if (!crtc->fb)
                        continue;
 
-               if (to_intel_framebuffer(crtc->fb)->obj == obj)
-                       intel_increase_pllclock(crtc);
+               intel_decrease_pllclock(crtc);
        }
 }
 
-void intel_mark_fb_idle(struct drm_i915_gem_object *obj)
+void intel_mark_fb_busy(struct drm_i915_gem_object *obj)
 {
        struct drm_device *dev = obj->base.dev;
        struct drm_crtc *crtc;
@@ -7025,7 +7019,7 @@ void intel_mark_fb_idle(struct drm_i915_gem_object *obj)
                        continue;
 
                if (to_intel_framebuffer(crtc->fb)->obj == obj)
-                       intel_decrease_pllclock(crtc);
+                       intel_increase_pllclock(crtc);
        }
 }
 
index afa45a98ef6ba88fae3a5fb28911a40db1baec12..42dd62e22fbbf47a7135d7bd3f8f504dd65ea092 100644 (file)
@@ -440,9 +440,8 @@ extern bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg,
 extern void intel_dvo_init(struct drm_device *dev);
 extern void intel_tv_init(struct drm_device *dev);
 extern void intel_mark_busy(struct drm_device *dev);
-extern void intel_mark_idle(struct drm_device *dev);
 extern void intel_mark_fb_busy(struct drm_i915_gem_object *obj);
-extern void intel_mark_fb_idle(struct drm_i915_gem_object *obj);
+extern void intel_mark_idle(struct drm_device *dev);
 extern bool intel_lvds_init(struct drm_device *dev);
 extern void intel_dp_init(struct drm_device *dev, int output_reg,
                          enum port port);