]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/i915/intel_atomic_plane.c
Merge branch 'tee/initial-merge' into fixes
[karo-tx-linux.git] / drivers / gpu / drm / i915 / intel_atomic_plane.c
index 8d3e515f27bade27acda9544a30d975628ac8ab3..cfb47293fd53cf93563aa8e159758b8275e30b9e 100644 (file)
@@ -123,36 +123,24 @@ intel_plane_destroy_state(struct drm_plane *plane,
        drm_atomic_helper_plane_destroy_state(plane, state);
 }
 
-static int intel_plane_atomic_check(struct drm_plane *plane,
-                                   struct drm_plane_state *state)
+int intel_plane_atomic_check_with_state(struct intel_crtc_state *crtc_state,
+                                       struct intel_plane_state *intel_state)
 {
+       struct drm_plane *plane = intel_state->base.plane;
        struct drm_i915_private *dev_priv = to_i915(plane->dev);
-       struct drm_crtc *crtc = state->crtc;
-       struct intel_crtc *intel_crtc;
-       struct intel_crtc_state *crtc_state;
+       struct drm_plane_state *state = &intel_state->base;
        struct intel_plane *intel_plane = to_intel_plane(plane);
-       struct intel_plane_state *intel_state = to_intel_plane_state(state);
-       struct drm_crtc_state *drm_crtc_state;
        int ret;
 
-       crtc = crtc ? crtc : plane->state->crtc;
-       intel_crtc = to_intel_crtc(crtc);
-
        /*
         * Both crtc and plane->crtc could be NULL if we're updating a
         * property while the plane is disabled.  We don't actually have
         * anything driver-specific we need to test in that case, so
         * just return success.
         */
-       if (!crtc)
+       if (!intel_state->base.crtc && !plane->state->crtc)
                return 0;
 
-       drm_crtc_state = drm_atomic_get_existing_crtc_state(state->state, crtc);
-       if (WARN_ON(!drm_crtc_state))
-               return -EINVAL;
-
-       crtc_state = to_intel_crtc_state(drm_crtc_state);
-
        /* Clip all planes to CRTC size, or 0x0 if CRTC is disabled */
        intel_state->clip.x1 = 0;
        intel_state->clip.y1 = 0;
@@ -175,11 +163,11 @@ static int intel_plane_atomic_check(struct drm_plane *plane,
                 * RGB 16-bit 5:6:5, and Indexed 8-bit.
                 * TBD: Add RGB64 case once its added in supported format list.
                 */
-               switch (state->fb->pixel_format) {
+               switch (state->fb->format->format) {
                case DRM_FORMAT_C8:
                case DRM_FORMAT_RGB565:
                        DRM_DEBUG_KMS("Unsupported pixel format %s for 90/270!\n",
-                                     drm_get_format_name(state->fb->pixel_format,
+                                     drm_get_format_name(state->fb->format->format,
                                                          &format_name));
                        return -EINVAL;
 
@@ -201,9 +189,40 @@ static int intel_plane_atomic_check(struct drm_plane *plane,
        if (ret)
                return ret;
 
+       /* FIXME pre-g4x don't work like this */
+       if (intel_state->base.visible)
+               crtc_state->active_planes |= BIT(intel_plane->id);
+       else
+               crtc_state->active_planes &= ~BIT(intel_plane->id);
+
        return intel_plane_atomic_calc_changes(&crtc_state->base, state);
 }
 
+static int intel_plane_atomic_check(struct drm_plane *plane,
+                                   struct drm_plane_state *state)
+{
+       struct drm_crtc *crtc = state->crtc;
+       struct drm_crtc_state *drm_crtc_state;
+
+       crtc = crtc ? crtc : plane->state->crtc;
+
+       /*
+        * Both crtc and plane->crtc could be NULL if we're updating a
+        * property while the plane is disabled.  We don't actually have
+        * anything driver-specific we need to test in that case, so
+        * just return success.
+        */
+       if (!crtc)
+               return 0;
+
+       drm_crtc_state = drm_atomic_get_existing_crtc_state(state->state, crtc);
+       if (WARN_ON(!drm_crtc_state))
+               return -EINVAL;
+
+       return intel_plane_atomic_check_with_state(to_intel_crtc_state(drm_crtc_state),
+                                                  to_intel_plane_state(state));
+}
+
 static void intel_plane_atomic_update(struct drm_plane *plane,
                                      struct drm_plane_state *old_state)
 {
@@ -212,12 +231,19 @@ static void intel_plane_atomic_update(struct drm_plane *plane,
                to_intel_plane_state(plane->state);
        struct drm_crtc *crtc = plane->state->crtc ?: old_state->crtc;
 
-       if (intel_state->base.visible)
+       if (intel_state->base.visible) {
+               trace_intel_update_plane(plane,
+                                        to_intel_crtc(crtc));
+
                intel_plane->update_plane(plane,
                                          to_intel_crtc_state(crtc->state),
                                          intel_state);
-       else
+       } else {
+               trace_intel_disable_plane(plane,
+                                         to_intel_crtc(crtc));
+
                intel_plane->disable_plane(plane, crtc);
+       }
 }
 
 const struct drm_plane_helper_funcs intel_plane_helper_funcs = {