To save power when the sprite is full screen, we can disable the primary
plane on the same pipe.  Track the sprite status and enable/disable the
primary opportunistically.

Signed-off-by: Jesse Barnes
---
 drivers/gpu/drm/i915/intel_drv.h    |    1 +
 drivers/gpu/drm/i915/intel_sprite.c |   19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index b0081d2..ff553a6 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -180,6 +180,7 @@ struct intel_plane {
        struct drm_plane base;
        enum pipe pipe;
        struct drm_i915_gem_object *obj;
+       bool primary_disabled;
        int max_downscale;
        u32 lut_r[1024], lut_g[1024], lut_b[1024];
        void (*update_plane)(struct drm_plane *plane,
diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
b/drivers/gpu/drm/i915/intel_sprite.c
index 1adeda8..e65498d 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -395,9 +395,23 @@ intel_update_plane(struct drm_plane *plane, struct 
drm_crtc *crtc,

        start = obj->gtt_offset;

+       /*
+        * Be sure to re-enable the primary before the sprite is no longer
+        * covering it fully.
+        */
+       if (!disable_primary && intel_plane->primary_disabled) {
+               //dev_priv->display.enable_primary(dev, crtc);
+               intel_plane->primary_disabled = false;
+       }
+
        intel_plane->update_plane(plane, fb, start, crtc_x, crtc_y,
                                  crtc_w, crtc_h, x, y, src_w, src_h);

+       if (disable_primary) {
+               //dev_priv->display.disable_primary(dev, crtc);
+               intel_plane->primary_disabled = true;
+       }
+
        /* Unpin old obj after new one is active to avoid ugliness */
        if (old_obj) {
                /*
@@ -427,6 +441,11 @@ intel_disable_plane(struct drm_plane *plane)

        mutex_lock(&dev->struct_mutex);

+       if (intel_plane->primary_disabled) {
+               //dev_priv->display.enable_primary(dev, crtc);
+               intel_plane->primary_disabled = false;
+       }
+
        intel_plane->disable_plane(plane);

        if (!intel_plane->obj)
-- 
1.7.4.1

Reply via email to