drm/i915: Pass intel state to plane functions as well
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Fri, 28 Jun 2019 08:55:16 +0000 (10:55 +0200)
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Mon, 1 Jul 2019 08:32:45 +0000 (10:32 +0200)
Pass along the correct state as much as possible, instead of relying
on the drm state internally. This is required to rely on hw state
internally soon.

While at it, clean up intel_plane_atomic_check slightly, by using a
helper function to get the intel_crtc. (Ville)

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190628085517.31886-6-maarten.lankhorst@linux.intel.com
drivers/gpu/drm/i915/display/intel_atomic_plane.c
drivers/gpu/drm/i915/display/intel_atomic_plane.h
drivers/gpu/drm/i915/display/intel_display.c

index 30bd4e7..ab411d5 100644 (file)
@@ -176,33 +176,49 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
        new_crtc_state->data_rate[plane->id] =
                intel_plane_data_rate(new_crtc_state, new_plane_state);
 
-       return intel_plane_atomic_calc_changes(old_crtc_state,
-                                              &new_crtc_state->base,
-                                              old_plane_state,
-                                              &new_plane_state->base);
+       return intel_plane_atomic_calc_changes(old_crtc_state, new_crtc_state,
+                                              old_plane_state, new_plane_state);
 }
 
-static int intel_plane_atomic_check(struct drm_plane *plane,
-                                   struct drm_plane_state *new_plane_state)
+static struct intel_crtc *
+get_crtc_from_states(const struct intel_plane_state *old_plane_state,
+                    const struct intel_plane_state *new_plane_state)
 {
-       struct drm_atomic_state *state = new_plane_state->state;
-       const struct drm_plane_state *old_plane_state =
-               drm_atomic_get_old_plane_state(state, plane);
-       struct drm_crtc *crtc = new_plane_state->crtc ?: old_plane_state->crtc;
-       const struct drm_crtc_state *old_crtc_state;
-       struct drm_crtc_state *new_crtc_state;
-
-       new_plane_state->visible = false;
+       if (new_plane_state->base.crtc)
+               return to_intel_crtc(new_plane_state->base.crtc);
+
+       if (old_plane_state->base.crtc)
+               return to_intel_crtc(old_plane_state->base.crtc);
+
+       return NULL;
+}
+
+static int intel_plane_atomic_check(struct drm_plane *_plane,
+                                   struct drm_plane_state *_new_plane_state)
+{
+       struct intel_plane *plane = to_intel_plane(_plane);
+       struct intel_atomic_state *state =
+               to_intel_atomic_state(_new_plane_state->state);
+       struct intel_plane_state *new_plane_state =
+               to_intel_plane_state(_new_plane_state);
+       const struct intel_plane_state *old_plane_state =
+               intel_atomic_get_old_plane_state(state, plane);
+       struct intel_crtc *crtc =
+               get_crtc_from_states(old_plane_state, new_plane_state);
+       const struct intel_crtc_state *old_crtc_state;
+       struct intel_crtc_state *new_crtc_state;
+
+       new_plane_state->base.visible = false;
        if (!crtc)
                return 0;
 
-       old_crtc_state = drm_atomic_get_old_crtc_state(state, crtc);
-       new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
+       old_crtc_state = intel_atomic_get_old_crtc_state(state, crtc);
+       new_crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
 
-       return intel_plane_atomic_check_with_state(to_intel_crtc_state(old_crtc_state),
-                                                  to_intel_crtc_state(new_crtc_state),
-                                                  to_intel_plane_state(old_plane_state),
-                                                  to_intel_plane_state(new_plane_state));
+       return intel_plane_atomic_check_with_state(old_crtc_state,
+                                                  new_crtc_state,
+                                                  old_plane_state,
+                                                  new_plane_state);
 }
 
 static struct intel_plane *
index 1437a87..cb7ef4f 100644 (file)
@@ -8,7 +8,6 @@
 
 #include <linux/types.h>
 
-struct drm_crtc_state;
 struct drm_plane;
 struct drm_property;
 struct intel_atomic_state;
@@ -43,8 +42,8 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
                                        const struct intel_plane_state *old_plane_state,
                                        struct intel_plane_state *intel_state);
 int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_state,
-                                   struct drm_crtc_state *crtc_state,
+                                   struct intel_crtc_state *crtc_state,
                                    const struct intel_plane_state *old_plane_state,
-                                   struct drm_plane_state *plane_state);
+                                   struct intel_plane_state *plane_state);
 
 #endif /* __INTEL_ATOMIC_PLANE_H__ */
index 4ea6302..c97c0a9 100644 (file)
@@ -11286,7 +11286,7 @@ static void intel_crtc_destroy(struct drm_crtc *crtc)
  *
  * Returns true or false.
  */
-static bool intel_wm_need_update(struct intel_plane_state *cur,
+static bool intel_wm_need_update(const struct intel_plane_state *cur,
                                 struct intel_plane_state *new)
 {
        /* Update watermarks on tiling or size changes. */
@@ -11318,33 +11318,28 @@ static bool needs_scaling(const struct intel_plane_state *state)
 }
 
 int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_state,
-                                   struct drm_crtc_state *crtc_state,
+                                   struct intel_crtc_state *crtc_state,
                                    const struct intel_plane_state *old_plane_state,
-                                   struct drm_plane_state *plane_state)
+                                   struct intel_plane_state *plane_state)
 {
-       struct intel_crtc_state *pipe_config = to_intel_crtc_state(crtc_state);
-       struct drm_crtc *crtc = crtc_state->crtc;
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       struct intel_plane *plane = to_intel_plane(plane_state->plane);
-       struct drm_device *dev = crtc->dev;
-       struct drm_i915_private *dev_priv = to_i915(dev);
-       bool mode_changed = needs_modeset(pipe_config);
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
+       struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       bool mode_changed = needs_modeset(crtc_state);
        bool was_crtc_enabled = old_crtc_state->base.active;
-       bool is_crtc_enabled = crtc_state->active;
+       bool is_crtc_enabled = crtc_state->base.active;
        bool turn_off, turn_on, visible, was_visible;
-       struct drm_framebuffer *fb = plane_state->fb;
+       struct drm_framebuffer *fb = plane_state->base.fb;
        int ret;
 
        if (INTEL_GEN(dev_priv) >= 9 && plane->id != PLANE_CURSOR) {
-               ret = skl_update_scaler_plane(
-                       to_intel_crtc_state(crtc_state),
-                       to_intel_plane_state(plane_state));
+               ret = skl_update_scaler_plane(crtc_state, plane_state);
                if (ret)
                        return ret;
        }
 
        was_visible = old_plane_state->base.visible;
-       visible = plane_state->visible;
+       visible = plane_state->base.visible;
 
        if (!was_crtc_enabled && WARN_ON(was_visible))
                was_visible = false;
@@ -11360,22 +11355,22 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat
         * only combine the results from all planes in the current place?
         */
        if (!is_crtc_enabled) {
-               plane_state->visible = visible = false;
-               to_intel_crtc_state(crtc_state)->active_planes &= ~BIT(plane->id);
-               to_intel_crtc_state(crtc_state)->data_rate[plane->id] = 0;
+               plane_state->base.visible = visible = false;
+               crtc_state->active_planes &= ~BIT(plane->id);
+               crtc_state->data_rate[plane->id] = 0;
        }
 
        if (!was_visible && !visible)
                return 0;
 
        if (fb != old_plane_state->base.fb)
-               pipe_config->fb_changed = true;
+               crtc_state->fb_changed = true;
 
        turn_off = was_visible && (!visible || mode_changed);
        turn_on = visible && (!was_visible || mode_changed);
 
        DRM_DEBUG_ATOMIC("[CRTC:%d:%s] has [PLANE:%d:%s] with fb %i\n",
-                        intel_crtc->base.base.id, intel_crtc->base.name,
+                        crtc->base.base.id, crtc->base.name,
                         plane->base.base.id, plane->base.name,
                         fb ? fb->base.id : -1);
 
@@ -11386,29 +11381,28 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat
 
        if (turn_on) {
                if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
-                       pipe_config->update_wm_pre = true;
+                       crtc_state->update_wm_pre = true;
 
                /* must disable cxsr around plane enable/disable */
                if (plane->id != PLANE_CURSOR)
-                       pipe_config->disable_cxsr = true;
+                       crtc_state->disable_cxsr = true;
        } else if (turn_off) {
                if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
-                       pipe_config->update_wm_post = true;
+                       crtc_state->update_wm_post = true;
 
                /* must disable cxsr around plane enable/disable */
                if (plane->id != PLANE_CURSOR)
-                       pipe_config->disable_cxsr = true;
-       } else if (intel_wm_need_update(to_intel_plane_state(plane->base.state),
-                                       to_intel_plane_state(plane_state))) {
+                       crtc_state->disable_cxsr = true;
+       } else if (intel_wm_need_update(old_plane_state, plane_state)) {
                if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv)) {
                        /* FIXME bollocks */
-                       pipe_config->update_wm_pre = true;
-                       pipe_config->update_wm_post = true;
+                       crtc_state->update_wm_pre = true;
+                       crtc_state->update_wm_post = true;
                }
        }
 
        if (visible || was_visible)
-               pipe_config->fb_bits |= plane->frontbuffer_bit;
+               crtc_state->fb_bits |= plane->frontbuffer_bit;
 
        /*
         * ILK/SNB DVSACNTR/Sprite Enable
@@ -11447,8 +11441,8 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat
            (IS_GEN_RANGE(dev_priv, 5, 6) ||
             IS_IVYBRIDGE(dev_priv)) &&
            (turn_on || (!needs_scaling(old_plane_state) &&
-                        needs_scaling(to_intel_plane_state(plane_state)))))
-               pipe_config->disable_lp_wm = true;
+                        needs_scaling(plane_state))))
+               crtc_state->disable_lp_wm = true;
 
        return 0;
 }