From: Ander Conselvan de Oliveira <[email protected]>

Compute new pipe_configs for all crtcs in the atomic state. The commit
part of the mode set (__intel_set_mode()) is already enabled to support
multiple pipes, the only thing missing was calculating a new pipe_config
for every crtc.

Signed-off-by: Maarten Lankhorst <[email protected]>
---
 drivers/gpu/drm/i915/intel_display.c | 138 +++++++++++++----------------------
 1 file changed, 52 insertions(+), 86 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 1c706623f99c..0a2a7b6e198c 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -82,8 +82,7 @@ static void i9xx_crtc_clock_get(struct intel_crtc *crtc,
 static void ironlake_pch_clock_get(struct intel_crtc *crtc,
                                   struct intel_crtc_state *pipe_config);
 
-static int intel_set_mode(struct drm_crtc *crtc,
-                         struct drm_atomic_state *state);
+static int intel_set_mode(struct drm_atomic_state *state);
 static int intel_framebuffer_init(struct drm_device *dev,
                                  struct intel_framebuffer *ifb,
                                  struct drm_mode_fb_cmd2 *mode_cmd,
@@ -9830,7 +9829,7 @@ retry:
 
        drm_mode_copy(&crtc_state->base.mode, mode);
 
-       if (intel_set_mode(crtc, state)) {
+       if (intel_set_mode(state)) {
                DRM_DEBUG_KMS("failed to set mode on load-detect pipe\n");
                if (old->release_fb)
                        old->release_fb->funcs->destroy(old->release_fb);
@@ -9904,7 +9903,7 @@ void intel_release_load_detect_pipe(struct drm_connector 
*connector,
                if (ret)
                        goto fail;
 
-               ret = intel_set_mode(crtc, state);
+               ret = intel_set_mode(state);
                if (ret)
                        goto fail;
 
@@ -11373,9 +11372,10 @@ clear_intel_crtc_state(struct intel_crtc_state 
*crtc_state)
 
 static int
 intel_modeset_pipe_config(struct drm_crtc *crtc,
-                         struct drm_atomic_state *state,
-                         struct intel_crtc_state *pipe_config)
+                         struct drm_atomic_state *state)
 {
+       struct drm_crtc_state *crtc_state;
+       struct intel_crtc_state *pipe_config;
        struct intel_encoder *encoder;
        struct drm_connector *connector;
        struct drm_connector_state *connector_state;
@@ -11393,6 +11393,12 @@ intel_modeset_pipe_config(struct drm_crtc *crtc,
                return -EINVAL;
        }
 
+       crtc_state = drm_atomic_get_existing_crtc_state(state, crtc);
+       if (WARN_ON(!crtc_state))
+               return -EINVAL;
+
+       pipe_config = to_intel_crtc_state(crtc_state);
+
        /*
         * XXX: Add all connectors to make the crtc state match the encoders.
         */
@@ -12107,45 +12113,35 @@ static void update_scanline_offset(struct intel_crtc 
*crtc)
                crtc->scanline_offset = 1;
 }
 
-static struct intel_crtc_state *
-intel_modeset_compute_config(struct drm_crtc *crtc,
-                            struct drm_atomic_state *state)
+static int
+intel_modeset_compute_config(struct drm_atomic_state *state)
 {
-       struct intel_crtc_state *pipe_config;
-       int ret = 0;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *crtc_state;
+       int ret, i;
 
        ret = drm_atomic_helper_check_modeset(state->dev, state);
        if (ret)
-               return ERR_PTR(ret);
-
-       /*
-        * Note this needs changes when we start tracking multiple modes
-        * and crtcs.  At that point we'll need to compute the whole config
-        * (i.e. one pipe_config for each crtc) rather than just the one
-        * for this crtc.
-        */
-       pipe_config = intel_atomic_get_crtc_state(state, to_intel_crtc(crtc));
-       if (IS_ERR(pipe_config))
-               return pipe_config;
-
-       if (!pipe_config->base.enable &&
-           WARN_ON(pipe_config->base.active))
-               pipe_config->base.active = false;
+               return ret;
 
-       if (!pipe_config->base.enable)
-               return pipe_config;
+       for_each_crtc_in_state(state, crtc, crtc_state, i) {
+               if (!crtc_state->enable &&
+                   WARN_ON(crtc_state->active))
+                       crtc_state->active = false;
 
-       ret = intel_modeset_pipe_config(crtc, state, pipe_config);
-       if (ret)
-               return ERR_PTR(ret);
+               if (!crtc_state->enable)
+                       continue;
 
-       intel_dump_pipe_config(to_intel_crtc(crtc), pipe_config, "[modeset]");
+               ret = intel_modeset_pipe_config(crtc, state);
+               if (ret)
+                       return ret;
 
-       ret = drm_atomic_helper_check_planes(state->dev, state);
-       if (ret)
-               return ERR_PTR(ret);
+               intel_dump_pipe_config(to_intel_crtc(crtc),
+                                      to_intel_crtc_state(crtc_state),
+                                      "[modeset]");
+       }
 
-       return pipe_config;
+       return drm_atomic_helper_check_planes(state->dev, state);
 }
 
 static int __intel_set_mode_setup_plls(struct drm_atomic_state *state)
@@ -12282,37 +12278,27 @@ static int __intel_set_mode(struct drm_atomic_state 
*state)
        return 0;
 }
 
-static int intel_set_mode_with_config(struct drm_crtc *crtc,
-                                     struct intel_crtc_state *pipe_config)
+static int intel_set_mode_checked(struct drm_atomic_state *state)
 {
+       struct drm_device *dev = state->dev;
        int ret;
 
-       ret = __intel_set_mode(pipe_config->base.state);
-
+       ret = __intel_set_mode(state);
        if (ret == 0)
-               intel_modeset_check_state(crtc->dev);
+               intel_modeset_check_state(dev);
 
        return ret;
 }
 
-static int intel_set_mode(struct drm_crtc *crtc,
-                         struct drm_atomic_state *state)
+static int intel_set_mode(struct drm_atomic_state *state)
 {
-       struct intel_crtc_state *pipe_config;
-       int ret = 0;
-
-       pipe_config = intel_modeset_compute_config(crtc, state);
-       if (IS_ERR(pipe_config)) {
-               ret = PTR_ERR(pipe_config);
-               goto out;
-       }
+       int ret;
 
-       ret = intel_set_mode_with_config(crtc, pipe_config);
+       ret = intel_modeset_compute_config(state);
        if (ret)
-               goto out;
+               return ret;
 
-out:
-       return ret;
+       return intel_set_mode_checked(state);
 }
 
 void intel_crtc_restore_mode(struct drm_crtc *crtc)
@@ -12384,7 +12370,7 @@ void intel_crtc_restore_mode(struct drm_crtc *crtc)
        intel_modeset_setup_plane_state(state, crtc, &crtc->mode,
                                        crtc->primary->fb, crtc->x, crtc->y);
 
-       ret = intel_set_mode(crtc, state);
+       ret = intel_set_mode(state);
        if (ret)
                drm_atomic_state_free(state);
 }
@@ -12542,7 +12528,6 @@ static int intel_crtc_set_config(struct drm_mode_set 
*set)
 {
        struct drm_device *dev;
        struct drm_atomic_state *state = NULL;
-       struct intel_crtc_state *pipe_config;
        bool primary_plane_was_visible;
        int ret;
 
@@ -12574,44 +12559,25 @@ static int intel_crtc_set_config(struct drm_mode_set 
*set)
        if (ret)
                goto out;
 
-       pipe_config = intel_modeset_compute_config(set->crtc, state);
-       if (IS_ERR(pipe_config)) {
-               ret = PTR_ERR(pipe_config);
+       primary_plane_was_visible = primary_plane_visible(set->crtc);
+
+       ret = intel_modeset_compute_config(state);
+       if (ret)
                goto out;
-       }
 
        intel_update_pipe_size(to_intel_crtc(set->crtc));
 
-       primary_plane_was_visible = primary_plane_visible(set->crtc);
-
-       ret = intel_set_mode_with_config(set->crtc, pipe_config);
-
+       ret = intel_set_mode_checked(state);
        if (ret == 0 &&
-           pipe_config->base.enable &&
-           pipe_config->base.planes_changed &&
-           !needs_modeset(&pipe_config->base)) {
-               struct intel_crtc *intel_crtc = to_intel_crtc(set->crtc);
-
+           set->crtc->state->active &&
+           !needs_modeset(set->crtc->state) &&
+           !primary_plane_was_visible &&
+           primary_plane_visible(set->crtc)) {
                /*
                 * We need to make sure the primary plane is re-enabled if it
                 * has previously been turned off.
                 */
-               if (ret == 0 && !primary_plane_was_visible &&
-                   primary_plane_visible(set->crtc)) {
-                       WARN_ON(!intel_crtc->active);
-                       intel_post_enable_primary(set->crtc);
-               }
-
-               /*
-                * In the fastboot case this may be our only check of the
-                * state after boot.  It would be better to only do it on
-                * the first update, but we don't have a nice way of doing that
-                * (and really, set_config isn't used much for high freq page
-                * flipping, so increasing its cost here shouldn't be a big
-                * deal).
-                */
-               if (i915.fastboot && ret == 0)
-                       intel_modeset_check_state(set->crtc->dev);
+               intel_post_enable_primary(set->crtc);
        }
 
        if (ret) {
-- 
2.1.0

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to