From: Maarten Lankhorst <maarten.lankho...@linux.intel.com>

This allows disabling all planes affecting a crtc without caring what type it 
is.

Signed-off-by: Maarten Lankhorst <maarten.lankho...@linux.intel.com>
Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan.de.olive...@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h      |  5 ++
 drivers/gpu/drm/i915/intel_display.c | 91 ++++++------------------------------
 2 files changed, 20 insertions(+), 76 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index f5020a8..32439ae 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -238,6 +238,11 @@ enum hpd_pin {
 #define for_each_crtc(dev, crtc) \
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
 
+#define for_each_intel_plane(dev, intel_plane) \
+       list_for_each_entry(intel_plane,                        \
+                           &dev->mode_config.plane_list,       \
+                           base.head)
+
 #define for_each_intel_crtc(dev, intel_crtc) \
        list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list, base.head)
 
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 97db75b..acf3494 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2254,32 +2254,6 @@ static void intel_enable_primary_hw_plane(struct 
drm_plane *plane,
                intel_wait_for_vblank(dev, intel_crtc->pipe);
 }
 
-/**
- * intel_disable_primary_hw_plane - disable the primary hardware plane
- * @plane: plane to be disabled
- * @crtc: crtc for the plane
- *
- * Disable @plane on @crtc, making sure that the pipe is running first.
- */
-static void intel_disable_primary_hw_plane(struct drm_plane *plane,
-                                          struct drm_crtc *crtc)
-{
-       struct drm_device *dev = plane->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-
-       if (WARN_ON(!intel_crtc->active))
-               return;
-
-       if (!intel_crtc->primary_enabled)
-               return;
-
-       intel_crtc->primary_enabled = false;
-
-       dev_priv->display.update_primary_plane(crtc, plane->fb,
-                                              crtc->x, crtc->y);
-}
-
 static bool need_vtd_wa(struct drm_device *dev)
 {
 #ifdef CONFIG_INTEL_IOMMU
@@ -4561,38 +4535,6 @@ static void intel_enable_sprite_planes(struct drm_crtc 
*crtc)
        }
 }
 
-/*
- * Disable a plane internally without actually modifying the plane's state.
- * This will allow us to easily restore the plane later by just reprogramming
- * its state.
- */
-static void disable_plane_internal(struct drm_plane *plane)
-{
-       struct intel_plane *intel_plane = to_intel_plane(plane);
-       struct drm_plane_state *state =
-               plane->funcs->atomic_duplicate_state(plane);
-       struct intel_plane_state *intel_state = to_intel_plane_state(state);
-
-       intel_state->visible = false;
-       intel_plane->commit_plane(plane, intel_state);
-
-       intel_plane_destroy_state(plane, state);
-}
-
-static void intel_disable_sprite_planes(struct drm_crtc *crtc)
-{
-       struct drm_device *dev = crtc->dev;
-       enum pipe pipe = to_intel_crtc(crtc)->pipe;
-       struct drm_plane *plane;
-       struct intel_plane *intel_plane;
-
-       drm_for_each_legacy_plane(plane, &dev->mode_config.plane_list) {
-               intel_plane = to_intel_plane(plane);
-               if (plane->fb && intel_plane->pipe == pipe)
-                       disable_plane_internal(plane);
-       }
-}
-
 void hsw_enable_ips(struct intel_crtc *crtc)
 {
        struct drm_device *dev = crtc->base.dev;
@@ -4746,6 +4688,7 @@ static void intel_crtc_disable_planes(struct drm_crtc 
*crtc)
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       struct intel_plane *intel_plane;
        int pipe = intel_crtc->pipe;
 
        intel_crtc_wait_for_pending_flips(crtc);
@@ -4756,9 +4699,15 @@ static void intel_crtc_disable_planes(struct drm_crtc 
*crtc)
        hsw_disable_ips(intel_crtc);
 
        intel_crtc_dpms_overlay(intel_crtc, false);
-       intel_crtc_update_cursor(crtc, false);
-       intel_disable_sprite_planes(crtc);
-       intel_disable_primary_hw_plane(crtc->primary, crtc);
+       intel_crtc->primary_enabled = false;
+       for_each_intel_plane(dev, intel_plane) {
+               if (intel_plane->pipe == pipe) {
+                       struct drm_crtc *from = intel_plane->base.crtc;
+
+                       intel_plane->disable_plane(&intel_plane->base,
+                                                  from ?: crtc, true);
+               }
+       }
 
        /*
         * FIXME: Once we grow proper nuclear flip support out of this we need
@@ -13224,24 +13173,14 @@ intel_commit_primary_plane(struct drm_plane *plane,
        crtc->y = src->y1 >> 16;
 
        if (intel_crtc->active) {
-               if (state->visible) {
+               intel_crtc->primary_enabled = state->visible;
+
+               if (state->visible)
                        /* FIXME: kill this fastboot hack */
                        intel_update_pipe_size(intel_crtc);
 
-                       intel_crtc->primary_enabled = true;
-
-                       dev_priv->display.update_primary_plane(crtc, plane->fb,
-                                       crtc->x, crtc->y);
-               } else {
-                       /*
-                        * If clipping results in a non-visible primary plane,
-                        * we'll disable the primary plane.  Note that this is
-                        * a bit different than what happens if userspace
-                        * explicitly disables the plane by passing fb=0
-                        * because plane->fb still gets set and pinned.
-                        */
-                       intel_disable_primary_hw_plane(plane, crtc);
-               }
+               dev_priv->display.update_primary_plane(crtc, plane->fb,
+                                                      crtc->x, crtc->y);
        }
 }
 
-- 
2.1.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to