On Sat, 18 Feb 2023 13:15:53 -0800 Rob Clark <robdclark@xxxxxxxxx> wrote: > From: Rob Clark <robdclark@xxxxxxxxxxxx> > > Will be used in the next commit to set a deadline on fences that an > atomic update is waiting on. > > Signed-off-by: Rob Clark <robdclark@xxxxxxxxxxxx> > --- > drivers/gpu/drm/drm_vblank.c | 32 ++++++++++++++++++++++++++++++++ > include/drm/drm_vblank.h | 1 + > 2 files changed, 33 insertions(+) > > diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c > index 2ff31717a3de..caf25ebb34c5 100644 > --- a/drivers/gpu/drm/drm_vblank.c > +++ b/drivers/gpu/drm/drm_vblank.c > @@ -980,6 +980,38 @@ u64 drm_crtc_vblank_count_and_time(struct drm_crtc *crtc, > } > EXPORT_SYMBOL(drm_crtc_vblank_count_and_time); > > +/** > + * drm_crtc_next_vblank_time - calculate the time of the next vblank > + * @crtc: the crtc for which to calculate next vblank time > + * @vblanktime: pointer to time to receive the next vblank timestamp. > + * > + * Calculate the expected time of the next vblank based on time of previous > + * vblank and frame duration Hi, for VRR this targets the highest frame rate possible for the current VRR mode, right? Thanks, pq > + */ > +int drm_crtc_next_vblank_time(struct drm_crtc *crtc, ktime_t *vblanktime) > +{ > + unsigned int pipe = drm_crtc_index(crtc); > + struct drm_vblank_crtc *vblank = &crtc->dev->vblank[pipe]; > + u64 count; > + > + if (!vblank->framedur_ns) > + return -EINVAL; > + > + count = drm_vblank_count_and_time(crtc->dev, pipe, vblanktime); > + > + /* > + * If we don't get a valid count, then we probably also don't > + * have a valid time: > + */ > + if (!count) > + return -EINVAL; > + > + *vblanktime = ktime_add(*vblanktime, ns_to_ktime(vblank->framedur_ns)); > + > + return 0; > +} > +EXPORT_SYMBOL(drm_crtc_next_vblank_time); > + > static void send_vblank_event(struct drm_device *dev, > struct drm_pending_vblank_event *e, > u64 seq, ktime_t now) > diff --git a/include/drm/drm_vblank.h b/include/drm/drm_vblank.h > index 733a3e2d1d10..a63bc2c92f3c 100644 > --- a/include/drm/drm_vblank.h > +++ b/include/drm/drm_vblank.h > @@ -230,6 +230,7 @@ bool drm_dev_has_vblank(const struct drm_device *dev); > u64 drm_crtc_vblank_count(struct drm_crtc *crtc); > u64 drm_crtc_vblank_count_and_time(struct drm_crtc *crtc, > ktime_t *vblanktime); > +int drm_crtc_next_vblank_time(struct drm_crtc *crtc, ktime_t *vblanktime); > void drm_crtc_send_vblank_event(struct drm_crtc *crtc, > struct drm_pending_vblank_event *e); > void drm_crtc_arm_vblank_event(struct drm_crtc *crtc,
Attachment:
pgpJetfmKNZmS.pgp
Description: OpenPGP digital signature