drm/i915: Replace the .modeset_commit_cdclk() hook with a more direct .set_cdclk...
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / intel_atomic_plane.c
index dbe9fb4..41fd94e 100644 (file)
@@ -85,6 +85,8 @@ intel_plane_duplicate_state(struct drm_plane *plane)
 
        __drm_atomic_helper_plane_duplicate_state(plane, state);
 
+       intel_state->vma = NULL;
+
        return state;
 }
 
@@ -100,39 +102,45 @@ void
 intel_plane_destroy_state(struct drm_plane *plane,
                          struct drm_plane_state *state)
 {
+       struct i915_vma *vma;
+
+       vma = fetch_and_zero(&to_intel_plane_state(state)->vma);
+
+       /*
+        * FIXME: Normally intel_cleanup_plane_fb handles destruction of vma.
+        * We currently don't clear all planes during driver unload, so we have
+        * to be able to unpin vma here for now.
+        *
+        * Normally this can only happen during unload when kmscon is disabled
+        * and userspace doesn't attempt to set a framebuffer at all.
+        */
+       if (vma) {
+               mutex_lock(&plane->dev->struct_mutex);
+               intel_unpin_fb_vma(vma);
+               mutex_unlock(&plane->dev->struct_mutex);
+       }
+
        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;
@@ -155,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;
 
@@ -184,6 +192,31 @@ static int intel_plane_atomic_check(struct drm_plane *plane,
        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)
 {