Hi Andrey,
Thank you for the patch.
On Saturday 28 Jan 2017 21:26:49 Andrey Grodzovsky wrote:
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
Signed-off-by: Andrey Grodzovsky Andrey.Grodzovsky@amd.com
drivers/gpu/drm/drm_atomic_helper.c | 19 +++++-------------- include/drm/drm_crtc.h | 8 +++++++- include/drm/drm_plane.h | 1 + 3 files changed, 13 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index a4e5477..28065ee 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->pflip_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;
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 5c77c3f..76457a4 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -162,10 +162,16 @@ struct drm_crtc_state { * Target vertical blank period when a page flip * should take effect. */
u32 target_vblank;
/**
* @pflip_flags:
*
* Flip related config options
This isn't detailed enough. I propose something along the lines of
"DRM_MODE_PAGE_FLIP_* page flip flags, as passed to the page flip ioctl. Always zero for atomic commits that don't originate from a page flip ioctl."
You will then also need to reset the field to 0 at an appropriate point, as it's more an atomic commit transaction information than a state. Apart from that this patch looks good to me.
*/
- u32 pflip_flags;
- /**
- @event:
- Optional pointer to a DRM event to signal upon completion of the
diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h index db3bbde..57414ae 100644 --- a/include/drm/drm_plane.h +++ b/include/drm/drm_plane.h @@ -122,6 +122,7 @@ struct drm_plane_state { */ bool visible;
struct drm_atomic_state *state; };