Merge branch 'x86-build-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / gpu / drm / drm_plane_helper.c
index a393756..0fff72d 100644 (file)
  * primary plane support on top of the normal CRTC configuration interface.
  * Since the legacy &drm_mode_config_funcs.set_config interface ties the primary
  * plane together with the CRTC state this does not allow userspace to disable
- * the primary plane itself.  To avoid too much duplicated code use
- * drm_plane_helper_check_update() which can be used to enforce the same
- * restrictions as primary planes had thus. The default primary plane only
- * expose XRBG8888 and ARGB8888 as valid pixel formats for the attached
- * framebuffer.
+ * the primary plane itself. The default primary plane only expose XRBG8888 and
+ * ARGB8888 as valid pixel formats for the attached framebuffer.
  *
  * Drivers are highly recommended to implement proper support for primary
  * planes, and newly merged drivers must not rely upon these transitional
@@ -100,43 +97,17 @@ static int get_connectors_for_crtc(struct drm_crtc *crtc,
        return count;
 }
 
-/**
- * drm_plane_helper_check_update() - Check plane update for validity
- * @plane: plane object to update
- * @crtc: owning CRTC of owning plane
- * @fb: framebuffer to flip onto plane
- * @src: source coordinates in 16.16 fixed point
- * @dst: integer destination coordinates
- * @rotation: plane rotation
- * @min_scale: minimum @src:@dest scaling factor in 16.16 fixed point
- * @max_scale: maximum @src:@dest scaling factor in 16.16 fixed point
- * @can_position: is it legal to position the plane such that it
- *                doesn't cover the entire crtc?  This will generally
- *                only be false for primary planes.
- * @can_update_disabled: can the plane be updated while the crtc
- *                       is disabled?
- * @visible: output parameter indicating whether plane is still visible after
- *           clipping
- *
- * Checks that a desired plane update is valid.  Drivers that provide
- * their own plane handling rather than helper-provided implementations may
- * still wish to call this function to avoid duplication of error checking
- * code.
- *
- * RETURNS:
- * Zero if update appears valid, error code on failure
- */
-int drm_plane_helper_check_update(struct drm_plane *plane,
-                                 struct drm_crtc *crtc,
-                                 struct drm_framebuffer *fb,
-                                 struct drm_rect *src,
-                                 struct drm_rect *dst,
-                                 unsigned int rotation,
-                                 int min_scale,
-                                 int max_scale,
-                                 bool can_position,
-                                 bool can_update_disabled,
-                                 bool *visible)
+static int drm_plane_helper_check_update(struct drm_plane *plane,
+                                        struct drm_crtc *crtc,
+                                        struct drm_framebuffer *fb,
+                                        struct drm_rect *src,
+                                        struct drm_rect *dst,
+                                        unsigned int rotation,
+                                        int min_scale,
+                                        int max_scale,
+                                        bool can_position,
+                                        bool can_update_disabled,
+                                        bool *visible)
 {
        struct drm_plane_state plane_state = {
                .plane = plane,
@@ -173,52 +144,14 @@ int drm_plane_helper_check_update(struct drm_plane *plane,
 
        return 0;
 }
-EXPORT_SYMBOL(drm_plane_helper_check_update);
 
-/**
- * drm_primary_helper_update() - Helper for primary plane update
- * @plane: plane object to update
- * @crtc: owning CRTC of owning plane
- * @fb: framebuffer to flip onto plane
- * @crtc_x: x offset of primary plane on crtc
- * @crtc_y: y offset of primary plane on crtc
- * @crtc_w: width of primary plane rectangle on crtc
- * @crtc_h: height of primary plane rectangle on crtc
- * @src_x: x offset of @fb for panning
- * @src_y: y offset of @fb for panning
- * @src_w: width of source rectangle in @fb
- * @src_h: height of source rectangle in @fb
- * @ctx: lock acquire context, not used here
- *
- * Provides a default plane update handler for primary planes.  This is handler
- * is called in response to a userspace SetPlane operation on the plane with a
- * non-NULL framebuffer.  We call the driver's modeset handler to update the
- * framebuffer.
- *
- * SetPlane() on a primary plane of a disabled CRTC is not supported, and will
- * return an error.
- *
- * Note that we make some assumptions about hardware limitations that may not be
- * true for all hardware --
- *
- * 1. Primary plane cannot be repositioned.
- * 2. Primary plane cannot be scaled.
- * 3. Primary plane must cover the entire CRTC.
- * 4. Subpixel positioning is not supported.
- *
- * Drivers for hardware that don't have these restrictions can provide their
- * own implementation rather than using this helper.
- *
- * RETURNS:
- * Zero on success, error code on failure
- */
-int drm_primary_helper_update(struct drm_plane *plane, struct drm_crtc *crtc,
-                             struct drm_framebuffer *fb,
-                             int crtc_x, int crtc_y,
-                             unsigned int crtc_w, unsigned int crtc_h,
-                             uint32_t src_x, uint32_t src_y,
-                             uint32_t src_w, uint32_t src_h,
-                             struct drm_modeset_acquire_ctx *ctx)
+static int drm_primary_helper_update(struct drm_plane *plane, struct drm_crtc *crtc,
+                                    struct drm_framebuffer *fb,
+                                    int crtc_x, int crtc_y,
+                                    unsigned int crtc_w, unsigned int crtc_h,
+                                    uint32_t src_x, uint32_t src_y,
+                                    uint32_t src_w, uint32_t src_h,
+                                    struct drm_modeset_acquire_ctx *ctx)
 {
        struct drm_mode_set set = {
                .crtc = crtc,
@@ -285,35 +218,12 @@ int drm_primary_helper_update(struct drm_plane *plane, struct drm_crtc *crtc,
        kfree(connector_list);
        return ret;
 }
-EXPORT_SYMBOL(drm_primary_helper_update);
 
-/**
- * drm_primary_helper_disable() - Helper for primary plane disable
- * @plane: plane to disable
- * @ctx: lock acquire context, not used here
- *
- * Provides a default plane disable handler for primary planes.  This is handler
- * is called in response to a userspace SetPlane operation on the plane with a
- * NULL framebuffer parameter.  It unconditionally fails the disable call with
- * -EINVAL the only way to disable the primary plane without driver support is
- * to disable the entire CRTC. Which does not match the plane
- * &drm_plane_funcs.disable_plane hook.
- *
- * Note that some hardware may be able to disable the primary plane without
- * disabling the whole CRTC.  Drivers for such hardware should provide their
- * own disable handler that disables just the primary plane (and they'll likely
- * need to provide their own update handler as well to properly re-enable a
- * disabled primary plane).
- *
- * RETURNS:
- * Unconditionally returns -EINVAL.
- */
-int drm_primary_helper_disable(struct drm_plane *plane,
-                              struct drm_modeset_acquire_ctx *ctx)
+static int drm_primary_helper_disable(struct drm_plane *plane,
+                                     struct drm_modeset_acquire_ctx *ctx)
 {
        return -EINVAL;
 }
-EXPORT_SYMBOL(drm_primary_helper_disable);
 
 /**
  * drm_primary_helper_destroy() - Helper for primary plane destruction
@@ -336,200 +246,3 @@ const struct drm_plane_funcs drm_primary_helper_funcs = {
        .destroy = drm_primary_helper_destroy,
 };
 EXPORT_SYMBOL(drm_primary_helper_funcs);
-
-int drm_plane_helper_commit(struct drm_plane *plane,
-                           struct drm_plane_state *plane_state,
-                           struct drm_framebuffer *old_fb)
-{
-       const struct drm_plane_helper_funcs *plane_funcs;
-       struct drm_crtc *crtc[2];
-       const struct drm_crtc_helper_funcs *crtc_funcs[2];
-       int i, ret = 0;
-
-       plane_funcs = plane->helper_private;
-
-       /* Since this is a transitional helper we can't assume that plane->state
-        * is always valid. Hence we need to use plane->crtc instead of
-        * plane->state->crtc as the old crtc. */
-       crtc[0] = plane->crtc;
-       crtc[1] = crtc[0] != plane_state->crtc ? plane_state->crtc : NULL;
-
-       for (i = 0; i < 2; i++)
-               crtc_funcs[i] = crtc[i] ? crtc[i]->helper_private : NULL;
-
-       if (plane_funcs->atomic_check) {
-               ret = plane_funcs->atomic_check(plane, plane_state);
-               if (ret)
-                       goto out;
-       }
-
-       if (plane_funcs->prepare_fb && plane_state->fb != old_fb) {
-               ret = plane_funcs->prepare_fb(plane,
-                                             plane_state);
-               if (ret)
-                       goto out;
-       }
-
-       /* Point of no return, commit sw state. */
-       swap(plane->state, plane_state);
-
-       for (i = 0; i < 2; i++) {
-               if (crtc_funcs[i] && crtc_funcs[i]->atomic_begin)
-                       crtc_funcs[i]->atomic_begin(crtc[i], crtc[i]->state);
-       }
-
-       /*
-        * Drivers may optionally implement the ->atomic_disable callback, so
-        * special-case that here.
-        */
-       if (drm_atomic_plane_disabling(plane_state, plane->state) &&
-           plane_funcs->atomic_disable)
-               plane_funcs->atomic_disable(plane, plane_state);
-       else
-               plane_funcs->atomic_update(plane, plane_state);
-
-       for (i = 0; i < 2; i++) {
-               if (crtc_funcs[i] && crtc_funcs[i]->atomic_flush)
-                       crtc_funcs[i]->atomic_flush(crtc[i], crtc[i]->state);
-       }
-
-       /*
-        * If we only moved the plane and didn't change fb's, there's no need to
-        * wait for vblank.
-        */
-       if (plane->state->fb == old_fb)
-               goto out;
-
-       for (i = 0; i < 2; i++) {
-               if (!crtc[i])
-                       continue;
-
-               if (crtc[i]->cursor == plane)
-                       continue;
-
-               /* There's no other way to figure out whether the crtc is running. */
-               ret = drm_crtc_vblank_get(crtc[i]);
-               if (ret == 0) {
-                       drm_crtc_wait_one_vblank(crtc[i]);
-                       drm_crtc_vblank_put(crtc[i]);
-               }
-
-               ret = 0;
-       }
-
-       if (plane_funcs->cleanup_fb)
-               plane_funcs->cleanup_fb(plane, plane_state);
-out:
-       if (plane->funcs->atomic_destroy_state)
-               plane->funcs->atomic_destroy_state(plane, plane_state);
-       else
-               drm_atomic_helper_plane_destroy_state(plane, plane_state);
-
-       return ret;
-}
-
-/**
- * drm_plane_helper_update() - Transitional helper for plane update
- * @plane: plane object to update
- * @crtc: owning CRTC of owning plane
- * @fb: framebuffer to flip onto plane
- * @crtc_x: x offset of primary plane on crtc
- * @crtc_y: y offset of primary plane on crtc
- * @crtc_w: width of primary plane rectangle on crtc
- * @crtc_h: height of primary plane rectangle on crtc
- * @src_x: x offset of @fb for panning
- * @src_y: y offset of @fb for panning
- * @src_w: width of source rectangle in @fb
- * @src_h: height of source rectangle in @fb
- * @ctx: lock acquire context, not used here
- *
- * Provides a default plane update handler using the atomic plane update
- * functions. It is fully left to the driver to check plane constraints and
- * handle corner-cases like a fully occluded or otherwise invisible plane.
- *
- * This is useful for piecewise transitioning of a driver to the atomic helpers.
- *
- * RETURNS:
- * Zero on success, error code on failure
- */
-int drm_plane_helper_update(struct drm_plane *plane, struct drm_crtc *crtc,
-                           struct drm_framebuffer *fb,
-                           int crtc_x, int crtc_y,
-                           unsigned int crtc_w, unsigned int crtc_h,
-                           uint32_t src_x, uint32_t src_y,
-                           uint32_t src_w, uint32_t src_h,
-                           struct drm_modeset_acquire_ctx *ctx)
-{
-       struct drm_plane_state *plane_state;
-
-       if (plane->funcs->atomic_duplicate_state)
-               plane_state = plane->funcs->atomic_duplicate_state(plane);
-       else {
-               if (!plane->state)
-                       drm_atomic_helper_plane_reset(plane);
-
-               plane_state = drm_atomic_helper_plane_duplicate_state(plane);
-       }
-       if (!plane_state)
-               return -ENOMEM;
-       plane_state->plane = plane;
-
-       plane_state->crtc = crtc;
-       drm_atomic_set_fb_for_plane(plane_state, fb);
-       plane_state->crtc_x = crtc_x;
-       plane_state->crtc_y = crtc_y;
-       plane_state->crtc_h = crtc_h;
-       plane_state->crtc_w = crtc_w;
-       plane_state->src_x = src_x;
-       plane_state->src_y = src_y;
-       plane_state->src_h = src_h;
-       plane_state->src_w = src_w;
-
-       return drm_plane_helper_commit(plane, plane_state, plane->fb);
-}
-EXPORT_SYMBOL(drm_plane_helper_update);
-
-/**
- * drm_plane_helper_disable() - Transitional helper for plane disable
- * @plane: plane to disable
- * @ctx: lock acquire context, not used here
- *
- * Provides a default plane disable handler using the atomic plane update
- * functions. It is fully left to the driver to check plane constraints and
- * handle corner-cases like a fully occluded or otherwise invisible plane.
- *
- * This is useful for piecewise transitioning of a driver to the atomic helpers.
- *
- * RETURNS:
- * Zero on success, error code on failure
- */
-int drm_plane_helper_disable(struct drm_plane *plane,
-                            struct drm_modeset_acquire_ctx *ctx)
-{
-       struct drm_plane_state *plane_state;
-       struct drm_framebuffer *old_fb;
-
-       /* crtc helpers love to call disable functions for already disabled hw
-        * functions. So cope with that. */
-       if (!plane->crtc)
-               return 0;
-
-       if (plane->funcs->atomic_duplicate_state)
-               plane_state = plane->funcs->atomic_duplicate_state(plane);
-       else {
-               if (!plane->state)
-                       drm_atomic_helper_plane_reset(plane);
-
-               plane_state = drm_atomic_helper_plane_duplicate_state(plane);
-       }
-       if (!plane_state)
-               return -ENOMEM;
-       plane_state->plane = plane;
-
-       plane_state->crtc = NULL;
-       old_fb = plane_state->fb;
-       drm_atomic_set_fb_for_plane(plane_state, NULL);
-
-       return drm_plane_helper_commit(plane, plane_state, old_fb);
-}
-EXPORT_SYMBOL(drm_plane_helper_disable);