On Mon, 2 Jul 2018 10:37:22 +0200 Daniel Vetter <daniel@xxxxxxxx> wrote: > On Mon, Jul 02, 2018 at 10:14:51AM +0200, Boris Brezillon wrote: > > On Mon, 2 Jul 2018 10:02:52 +0200 > > Daniel Vetter <daniel@xxxxxxxx> wrote: > > > > > On Fri, Jun 29, 2018 at 01:17:17PM +0200, Boris Brezillon wrote: > > > > In some cases CRTCs are active but are not able to generating events, at > > > > least not at every frame at it's expected to. > > > > This is typically the case when the CRTC is feeding a writeback connector > > > > that has no job queued. In this situation the CRTC is usually stopped > > > > until a new job is queued, and this can lead to timeouts when part of > > > > the pipeline is updated but no new jobs are queued to the active > > > > writeback connector. > > > > > > > > In order to solve that, we add a ->no_vblank flag to drm_crtc_state > > > > and ask the CRTC drivers to set it to true when they know they're not > > > > able to generate VBLANK events. The core drm_atomic_helper_fake_vblank() > > > > helper can then be used to fake VBLANKs at commit time. > > > > > > > > Signed-off-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxx> > > > > --- > > > > drivers/gpu/drm/drm_atomic_helper.c | 40 +++++++++++++++++++++++++++++++++++++ > > > > include/drm/drm_atomic_helper.h | 1 + > > > > include/drm/drm_crtc.h | 15 ++++++++++++++ > > > > 3 files changed, 56 insertions(+) > > > > > > > > diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c > > > > index 69063bcf2334..ca586993c2a2 100644 > > > > --- a/drivers/gpu/drm/drm_atomic_helper.c > > > > +++ b/drivers/gpu/drm/drm_atomic_helper.c > > > > @@ -2051,6 +2051,46 @@ void drm_atomic_helper_wait_for_dependencies(struct drm_atomic_state *old_state) > > > > } > > > > EXPORT_SYMBOL(drm_atomic_helper_wait_for_dependencies); > > > > > > > > +/** > > > > + * drm_atomic_helper_fake_vblank - fake VBLANK events if needed > > > > + * @old_state: atomic state object with old state structures > > > > + * > > > > + * This function walks all CRTCs and fake VBLANK events on those with > > > > + * &drm_crtc_state.no_vblank set to true and &drm_crtc_state.event != NULL. > > > > + * The primary use of this function is writeback connectors working in oneshot > > > > + * mode and faking VBLANK events. In this case they only fake the VBLANK event > > > > + * when a job is queued, and any change to the pipeline that does not touch the > > > > + * connector is leading to timeouts when calling > > > > + * drm_atomic_helper_wait_for_vblanks() or > > > > + * drm_atomic_helper_wait_for_flip_done(). > > > > + * > > > > + * This is part of the atomic helper support for nonblocking commits, see > > > > + * drm_atomic_helper_setup_commit() for an overview. > > > > + */ > > > > +void drm_atomic_helper_fake_vblank(struct drm_atomic_state *old_state) > > > > +{ > > > > + struct drm_crtc_state *old_crtc_state, *new_crtc_state; > > > > + struct drm_crtc *crtc; > > > > + int i; > > > > + > > > > + for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, > > > > + new_crtc_state, i) { > > > > + unsigned long flags; > > > > + > > > > + if (!new_crtc_state->no_vblank && !old_crtc_state->no_vblank) > > > > > > Uh, this essentially makes it impossible to reset no_vblank. > > > > I don't want ->no_vblank to be reset by the core. It's up to the CRTC > > driver to clear/set it when something changes in the pipeline. > > > > > For control > > > flow state bits we only check the new state for it (see e.g. the various > > > *_changed or plane_bits or whatever). > > > > I tried with !new_crtc_state->no_vblank only, but then it does not > > handle the case where the CRTC and connector are being disabled, and I > > end up with a timeout. > > Why that? You should have a new_crtc_state even when you disable the crtc, > and you can set the ->no_vblank on that one too. Hm, right. I'll have to check why I didn't have ->no_blank set to true when I disable the CRTC. Probably a problem in vc4_crtc.c. -- Boris Brezillon, Bootlin (formerly Free Electrons) Embedded Linux and Kernel engineering https://bootlin.com _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel