Message ID | 20200129120531.6891-16-tzimmermann@suse.de (mailing list archive) |
---|---|
State | Accepted |
Commit | a3c27df2ada92c0fb2758d03782871f5872f6b2c |
Headers | show |
Series | Use no_vblank property for drivers without VBLANK | expand |
On 1/29/20 2:05 PM, Thomas Zimmermann wrote: > The atomic helpers automatically send out fake VBLANK events if no > vblanking has been initialized. This would apply to xen, but xen has > its own vblank logic. To avoid interfering with the atomic helpers, > disable automatic vblank events explicitly. > > v5: > * update comment > v4: > * separate commit from core vblank changes > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> > Acked-by: Gerd Hoffmann <kraxel@redhat.com> > Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Thank you for your work, Reviewed-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> > --- > drivers/gpu/drm/xen/xen_drm_front_kms.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/drivers/gpu/drm/xen/xen_drm_front_kms.c b/drivers/gpu/drm/xen/xen_drm_front_kms.c > index 4f34c5208180..78096bbcd226 100644 > --- a/drivers/gpu/drm/xen/xen_drm_front_kms.c > +++ b/drivers/gpu/drm/xen/xen_drm_front_kms.c > @@ -220,6 +220,24 @@ static bool display_send_page_flip(struct drm_simple_display_pipe *pipe, > return false; > } > > +static int display_check(struct drm_simple_display_pipe *pipe, > + struct drm_plane_state *plane_state, > + struct drm_crtc_state *crtc_state) > +{ > + /* > + * Xen doesn't initialize vblanking via drm_vblank_init(), so > + * DRM helpers assume that it doesn't handle vblanking and start > + * sending out fake VBLANK events automatically. > + * > + * As xen contains it's own logic for sending out VBLANK events > + * in send_pending_event(), disable no_vblank (i.e., the xen > + * driver has vblanking support). > + */ > + crtc_state->no_vblank = false; > + > + return 0; > +} > + > static void display_update(struct drm_simple_display_pipe *pipe, > struct drm_plane_state *old_plane_state) > { > @@ -284,6 +302,7 @@ static const struct drm_simple_display_pipe_funcs display_funcs = { > .enable = display_enable, > .disable = display_disable, > .prepare_fb = drm_gem_fb_simple_display_pipe_prepare_fb, > + .check = display_check, > .update = display_update, > }; >
diff --git a/drivers/gpu/drm/xen/xen_drm_front_kms.c b/drivers/gpu/drm/xen/xen_drm_front_kms.c index 4f34c5208180..78096bbcd226 100644 --- a/drivers/gpu/drm/xen/xen_drm_front_kms.c +++ b/drivers/gpu/drm/xen/xen_drm_front_kms.c @@ -220,6 +220,24 @@ static bool display_send_page_flip(struct drm_simple_display_pipe *pipe, return false; } +static int display_check(struct drm_simple_display_pipe *pipe, + struct drm_plane_state *plane_state, + struct drm_crtc_state *crtc_state) +{ + /* + * Xen doesn't initialize vblanking via drm_vblank_init(), so + * DRM helpers assume that it doesn't handle vblanking and start + * sending out fake VBLANK events automatically. + * + * As xen contains it's own logic for sending out VBLANK events + * in send_pending_event(), disable no_vblank (i.e., the xen + * driver has vblanking support). + */ + crtc_state->no_vblank = false; + + return 0; +} + static void display_update(struct drm_simple_display_pipe *pipe, struct drm_plane_state *old_plane_state) { @@ -284,6 +302,7 @@ static const struct drm_simple_display_pipe_funcs display_funcs = { .enable = display_enable, .disable = display_disable, .prepare_fb = drm_gem_fb_simple_display_pipe_prepare_fb, + .check = display_check, .update = display_update, };