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

Assume the callers lock everything with drm_modeset_lock_all.

This change had to be done after converting suspend/resume to
use atomic_state so the atomic state is preserved, otherwise
all transitional state is erased.

Now all callers of .crtc_enable and .crtc_disable go through
atomic modeset! :-D

Changes since v1:
- Only check for crtc_state->active in valleyview_modeset_global_pipes.
- Only check for crtc_state->active in modeset_update_crtc_power_domains.
Changes since v2:
- Rework on top of the changed patch order.
Changes since v3:
- Rename intel_crtc_toggle in description to *_control

Signed-off-by: Maarten Lankhorst <maarten.lankho...@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_display.c | 55 ++++++++++++++++++++++++------------
 1 file changed, 37 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index a42e7d7bf86b..e819f1738458 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -5952,10 +5952,13 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
 void intel_crtc_control(struct drm_crtc *crtc, bool enable)
 {
        struct drm_device *dev = crtc->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_mode_config *config = &dev->mode_config;
+       struct drm_modeset_acquire_ctx *ctx = config->acquire_ctx;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       enum intel_display_power_domain domain;
-       unsigned long domains;
+       struct intel_crtc_state *pipe_config;
+       struct drm_plane_state *plane_state;
+       struct drm_atomic_state *state;
+       int ret;
 
        if (enable == intel_crtc->active)
                return;
@@ -5963,24 +5966,40 @@ void intel_crtc_control(struct drm_crtc *crtc, bool 
enable)
        if (enable && !crtc->state->enable)
                return;
 
-       crtc->state->active = enable;
-       if (enable) {
-               domains = get_crtc_power_domains(crtc);
-               for_each_power_domain(domain, domains)
-                       intel_display_power_get(dev_priv, domain);
-               intel_crtc->enabled_power_domains = domains;
+       /* this function should be called with drm_modeset_lock_all for now */
+       if (WARN_ON(!ctx))
+               return;
+       lockdep_assert_held(&ctx->ww_ctx);
 
-               dev_priv->display.crtc_enable(crtc);
-               intel_crtc_enable_planes(crtc);
-       } else {
-               intel_crtc_disable_planes(crtc);
-               dev_priv->display.crtc_disable(crtc);
+       state = drm_atomic_state_alloc(dev);
+       if (WARN_ON(!state))
+               return;
 
-               domains = intel_crtc->enabled_power_domains;
-               for_each_power_domain(domain, domains)
-                       intel_display_power_put(dev_priv, domain);
-               intel_crtc->enabled_power_domains = 0;
+       state->acquire_ctx = ctx;
+       state->allow_modeset = true;
+
+       pipe_config = intel_atomic_get_crtc_state(state, intel_crtc);
+       if (IS_ERR(pipe_config)) {
+               ret = PTR_ERR(pipe_config);
+               goto err;
+       }
+       pipe_config->base.active = enable;
+
+       plane_state = drm_atomic_get_plane_state(state, crtc->primary);
+       if (IS_ERR(plane_state)) {
+               ret = PTR_ERR(plane_state);
+               goto err;
        }
+
+       ret = intel_set_mode(state);
+       if (!ret)
+               return;
+
+       DRM_ERROR("Failed to toggle crtc!\n");
+
+err:
+       DRM_ERROR("Updating crtc active failed with %i\n", ret);
+       drm_atomic_state_free(state);
 }
 
 /**
-- 
2.1.0

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

Reply via email to