[PATCH 3/4] drm/i915: Disable/enable planes around mode set
ville.syrjala at linux.intel.com
ville.syrjala at linux.intel.com
Thu May 24 11:29:49 PDT 2012
From: Ville Syrjälä <ville.syrjala at linux.intel.com>
When setting a display mode, disable all planes on the CRTC beforehand,
and re-enable them after the new mode has been set.
Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
---
drivers/gpu/drm/i915/intel_display.c | 48 ++++++++++++++++++++++++++++++++++
1 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 72ac2f9..aec6cac 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -3012,6 +3012,49 @@ void intel_cpt_verify_modeset(struct drm_device *dev, int pipe)
}
}
+static int intel_crtc_disable_planes(struct drm_crtc *crtc)
+{
+ struct drm_device *dev = crtc->dev;
+ struct drm_plane *plane;
+
+ list_for_each_entry(plane, &dev->mode_config.plane_list, head) {
+ int ret;
+
+ if (plane->crtc != crtc || !plane->fb)
+ continue;
+
+ ret = plane->funcs->disable_plane(plane);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+static int intel_crtc_enable_planes(struct drm_crtc *crtc)
+{
+ struct drm_device *dev = crtc->dev;
+ struct drm_plane *plane;
+
+ list_for_each_entry(plane, &dev->mode_config.plane_list, head) {
+ int ret;
+
+ if (plane->crtc != crtc || !plane->fb)
+ continue;
+
+ ret = plane->funcs->update_plane(plane,
+ plane->crtc, plane->fb,
+ plane->crtc_x, plane->crtc_y,
+ plane->crtc_w, plane->crtc_h,
+ plane->src_x, plane->src_y,
+ plane->src_w, plane->src_h);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
static void ironlake_crtc_enable(struct drm_crtc *crtc)
{
struct drm_device *dev = crtc->dev;
@@ -3060,6 +3103,7 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
intel_crtc_load_lut(crtc);
intel_enable_pipe(dev_priv, pipe, is_pch_port);
+ intel_crtc_enable_planes(crtc);
intel_enable_plane(dev_priv, plane, pipe);
if (is_pch_port)
@@ -3088,6 +3132,7 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
drm_vblank_off(dev, pipe);
intel_crtc_update_cursor(crtc, false);
+ intel_crtc_disable_planes(crtc);
intel_disable_plane(dev_priv, plane, pipe);
if (dev_priv->cfb_plane == plane)
@@ -3233,6 +3278,7 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)
intel_enable_pll(dev_priv, pipe);
intel_enable_pipe(dev_priv, pipe, false);
+
intel_enable_plane(dev_priv, plane, pipe);
intel_crtc_load_lut(crtc);
@@ -3241,6 +3287,7 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)
/* Give the overlay scaler a chance to enable if it's on this pipe */
intel_crtc_dpms_overlay(intel_crtc, true);
intel_crtc_update_cursor(crtc, true);
+ intel_crtc_enable_planes(crtc);
}
static void i9xx_crtc_disable(struct drm_crtc *crtc)
@@ -3259,6 +3306,7 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
drm_vblank_off(dev, pipe);
intel_crtc_dpms_overlay(intel_crtc, false);
intel_crtc_update_cursor(crtc, false);
+ intel_crtc_disable_planes(crtc);
if (dev_priv->cfb_plane == plane)
intel_disable_fbc(dev);
--
1.7.3.4
More information about the dri-devel
mailing list