Allows using atomic flip helpers for drivers
using ASYNC flip.
Remove ASYNC_FLIP restriction in helpers and
caches the page flip flags in drm_crtc_state
to be used in the low level drivers.

v2:
Resending the patch since the original was broken.

v3:
Save flag in crtc_state instead of plane_state

v4:
Reset the flag before using again.

v5:
Fix type in header.
Rename the field to pageflip_flags.
Remove unrelated hunk.

Signed-off-by: Andrey Grodzovsky <andrey.grodzov...@amd.com>
---
 drivers/gpu/drm/drm_atomic_helper.c | 20 ++++++--------------
 include/drm/drm_crtc.h              |  9 ++++++++-
 2 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/drm_atomic_helper.c 
b/drivers/gpu/drm/drm_atomic_helper.c
index a4e5477..63efa05 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -2737,7 +2737,8 @@ static int page_flip_common(
                                struct drm_atomic_state *state,
                                struct drm_crtc *crtc,
                                struct drm_framebuffer *fb,
-                               struct drm_pending_vblank_event *event)
+                               struct drm_pending_vblank_event *event,
+                               uint32_t flags)
 {
        struct drm_plane *plane = crtc->primary;
        struct drm_plane_state *plane_state;
@@ -2749,12 +2750,12 @@ static int page_flip_common(
                return PTR_ERR(crtc_state);
 
        crtc_state->event = event;
+       crtc_state->pageflip_flags = flags;
 
        plane_state = drm_atomic_get_plane_state(state, plane);
        if (IS_ERR(plane_state))
                return PTR_ERR(plane_state);
 
-
        ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
        if (ret != 0)
                return ret;
@@ -2781,10 +2782,6 @@ static int page_flip_common(
  * Provides a default &drm_crtc_funcs.page_flip implementation
  * using the atomic driver interface.
  *
- * Note that for now so called async page flips (i.e. updates which are not
- * synchronized to vblank) are not supported, since the atomic interfaces have
- * no provisions for this yet.
- *
  * Returns:
  * Returns 0 on success, negative errno numbers on failure.
  *
@@ -2800,9 +2797,6 @@ int drm_atomic_helper_page_flip(struct drm_crtc *crtc,
        struct drm_atomic_state *state;
        int ret = 0;
 
-       if (flags & DRM_MODE_PAGE_FLIP_ASYNC)
-               return -EINVAL;
-
        state = drm_atomic_state_alloc(plane->dev);
        if (!state)
                return -ENOMEM;
@@ -2810,7 +2804,7 @@ int drm_atomic_helper_page_flip(struct drm_crtc *crtc,
        state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
 
 retry:
-       ret = page_flip_common(state, crtc, fb, event);
+       ret = page_flip_common(state, crtc, fb, event, flags);
        if (ret != 0)
                goto fail;
 
@@ -2865,9 +2859,6 @@ int drm_atomic_helper_page_flip_target(
        struct drm_crtc_state *crtc_state;
        int ret = 0;
 
-       if (flags & DRM_MODE_PAGE_FLIP_ASYNC)
-               return -EINVAL;
-
        state = drm_atomic_state_alloc(plane->dev);
        if (!state)
                return -ENOMEM;
@@ -2875,7 +2866,7 @@ int drm_atomic_helper_page_flip_target(
        state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
 
 retry:
-       ret = page_flip_common(state, crtc, fb, event);
+       ret = page_flip_common(state, crtc, fb, event, flags);
        if (ret != 0)
                goto fail;
 
@@ -3072,6 +3063,7 @@ void __drm_atomic_helper_crtc_duplicate_state(struct 
drm_crtc *crtc,
        state->color_mgmt_changed = false;
        state->zpos_changed = false;
        state->event = NULL;
+       state->pageflip_flags = 0;
 }
 EXPORT_SYMBOL(__drm_atomic_helper_crtc_duplicate_state);
 
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 5c77c3f..76561fb 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -162,10 +162,17 @@ struct drm_crtc_state {
         * Target vertical blank period when a page flip
         * should take effect.
         */
-
        u32 target_vblank;
 
        /**
+        * @pageflip_flags:
+        *
+        * DRM_MODE_PAGE_FLIP_* flags, as passed to the page flip ioctl.
+        * Zero in any other case.
+        */
+       u32 pageflip_flags;
+
+       /**
         * @event:
         *
         * Optional pointer to a DRM event to signal upon completion of the
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to