From: Rob Clark <robdclark@gmail.com>
To: dri-devel@lists.freedesktop.org
Cc: freedreno@lists.freedesktop.org,
"Daniel Vetter" <daniel@ffwll.ch>,
"Christian König" <ckoenig.leichtzumerken@gmail.com>,
"Michel Dänzer" <michel@daenzer.net>,
"Tvrtko Ursulin" <tvrtko.ursulin@intel.com>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"Alex Deucher" <alexander.deucher@amd.com>,
"Pekka Paalanen" <ppaalanen@gmail.com>,
"Simon Ser" <contact@emersion.fr>,
"Luben Tuikov" <luben.tuikov@amd.com>,
"Rob Clark" <robdclark@chromium.org>,
"Mario Kleiner" <mario.kleiner.de@gmail.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"David Airlie" <airlied@gmail.com>,
linux-kernel@vger.kernel.org (open list)
Subject: [PATCH v9 10/15] drm/vblank: Add helper to get next vblank time
Date: Thu, 2 Mar 2023 15:53:32 -0800 [thread overview]
Message-ID: <20230302235356.3148279-11-robdclark@gmail.com> (raw)
In-Reply-To: <20230302235356.3148279-1-robdclark@gmail.com>
From: Rob Clark <robdclark@chromium.org>
Will be used in the next commit to set a deadline on fences that an
atomic update is waiting on.
v2: Calculate time at *start* of vblank period, not end
v3: Fix kbuild complaints
Signed-off-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Mario Kleiner <mario.kleiner.de@gmail.com>
---
drivers/gpu/drm/drm_vblank.c | 53 ++++++++++++++++++++++++++++++------
include/drm/drm_vblank.h | 1 +
2 files changed, 45 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 2ff31717a3de..299fa2a19a90 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -844,10 +844,9 @@ bool drm_crtc_vblank_helper_get_vblank_timestamp(struct drm_crtc *crtc,
EXPORT_SYMBOL(drm_crtc_vblank_helper_get_vblank_timestamp);
/**
- * drm_get_last_vbltimestamp - retrieve raw timestamp for the most recent
- * vblank interval
- * @dev: DRM device
- * @pipe: index of CRTC whose vblank timestamp to retrieve
+ * drm_crtc_get_last_vbltimestamp - retrieve raw timestamp for the most
+ * recent vblank interval
+ * @crtc: CRTC whose vblank timestamp to retrieve
* @tvblank: Pointer to target time which should receive the timestamp
* @in_vblank_irq:
* True when called from drm_crtc_handle_vblank(). Some drivers
@@ -865,10 +864,9 @@ EXPORT_SYMBOL(drm_crtc_vblank_helper_get_vblank_timestamp);
* True if timestamp is considered to be very precise, false otherwise.
*/
static bool
-drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
- ktime_t *tvblank, bool in_vblank_irq)
+drm_crtc_get_last_vbltimestamp(struct drm_crtc *crtc, ktime_t *tvblank,
+ bool in_vblank_irq)
{
- struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe);
bool ret = false;
/* Define requested maximum error on timestamps (nanoseconds). */
@@ -876,8 +874,6 @@ drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
/* Query driver if possible and precision timestamping enabled. */
if (crtc && crtc->funcs->get_vblank_timestamp && max_error > 0) {
- struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe);
-
ret = crtc->funcs->get_vblank_timestamp(crtc, &max_error,
tvblank, in_vblank_irq);
}
@@ -891,6 +887,15 @@ drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
return ret;
}
+static bool
+drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
+ ktime_t *tvblank, bool in_vblank_irq)
+{
+ struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe);
+
+ return drm_crtc_get_last_vbltimestamp(crtc, tvblank, in_vblank_irq);
+}
+
/**
* drm_crtc_vblank_count - retrieve "cooked" vblank counter value
* @crtc: which counter to retrieve
@@ -980,6 +985,36 @@ u64 drm_crtc_vblank_count_and_time(struct drm_crtc *crtc,
}
EXPORT_SYMBOL(drm_crtc_vblank_count_and_time);
+/**
+ * drm_crtc_next_vblank_start - 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 start of the next vblank period,
+ * based on time of previous vblank and frame duration
+ */
+int drm_crtc_next_vblank_start(struct drm_crtc *crtc, ktime_t *vblanktime)
+{
+ unsigned int pipe = drm_crtc_index(crtc);
+ struct drm_vblank_crtc *vblank = &crtc->dev->vblank[pipe];
+ struct drm_display_mode *mode = &vblank->hwmode;
+ u64 vblank_start;
+
+ if (!vblank->framedur_ns || !vblank->linedur_ns)
+ return -EINVAL;
+
+ if (!drm_crtc_get_last_vbltimestamp(crtc, vblanktime, false))
+ return -EINVAL;
+
+ vblank_start = DIV_ROUND_DOWN_ULL(
+ (u64)vblank->framedur_ns * mode->crtc_vblank_start,
+ mode->crtc_vtotal);
+ *vblanktime = ktime_add(*vblanktime, ns_to_ktime(vblank_start));
+
+ return 0;
+}
+EXPORT_SYMBOL(drm_crtc_next_vblank_start);
+
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..7f3957943dd1 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_start(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,
--
2.39.1
next prev parent reply other threads:[~2023-03-02 23:55 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-02 23:53 [PATCH v9 00/15] dma-fence: Deadline awareness Rob Clark
2023-03-02 23:53 ` [PATCH v9 01/15] dma-buf/dma-fence: Add deadline awareness Rob Clark
2023-03-02 23:53 ` [PATCH v9 02/15] dma-buf/fence-array: Add fence deadline support Rob Clark
2023-03-02 23:53 ` [PATCH v9 03/15] dma-buf/fence-chain: " Rob Clark
2023-03-02 23:53 ` [PATCH v9 04/15] dma-buf/dma-resv: Add a way to set fence deadline Rob Clark
2023-03-02 23:53 ` [PATCH v9 05/15] dma-buf/sync_file: Surface sync-file uABI Rob Clark
2023-03-02 23:53 ` [PATCH v9 06/15] dma-buf/sync_file: Add SET_DEADLINE ioctl Rob Clark
2023-03-02 23:53 ` [PATCH v9 07/15] dma-buf/sw_sync: Add fence deadline support Rob Clark
2023-03-02 23:53 ` [PATCH v9 08/15] drm/scheduler: " Rob Clark
2023-03-02 23:53 ` [PATCH v9 09/15] drm/syncobj: Add deadline support for syncobj waits Rob Clark
2023-03-02 23:53 ` Rob Clark [this message]
2023-03-02 23:53 ` [PATCH v9 11/15] drm/atomic-helper: Set fence deadline for vblank Rob Clark
2023-03-03 15:12 ` Ville Syrjälä
2023-03-03 15:45 ` Rob Clark
2023-03-03 15:52 ` Ville Syrjälä
2023-03-02 23:53 ` [PATCH v9 12/15] drm/msm: Add deadline based boost support Rob Clark
2023-03-03 10:10 ` Dmitry Baryshkov
2023-03-03 17:03 ` Rob Clark
2023-03-03 23:53 ` Dmitry Baryshkov
2023-03-02 23:53 ` [PATCH v9 13/15] drm/msm: Add wait-boost support Rob Clark
2023-03-03 10:04 ` Dmitry Baryshkov
2023-03-02 23:53 ` [PATCH v9 14/15] drm/msm/atomic: Switch to vblank_start helper Rob Clark
2023-03-03 10:04 ` Dmitry Baryshkov
2023-03-02 23:53 ` [PATCH v9 15/15] drm/i915: Add deadline based boost support Rob Clark
2023-03-03 3:21 ` Rodrigo Vivi
2023-03-03 9:58 ` Tvrtko Ursulin
2023-03-03 11:21 ` [Intel-gfx] " Andi Shyti
2023-03-03 14:48 ` Rob Clark
2023-03-03 15:00 ` Ville Syrjälä
2023-03-03 15:19 ` Ville Syrjälä
2023-03-03 15:43 ` Rob Clark
2023-03-03 15:07 ` Tvrtko Ursulin
2023-03-03 15:41 ` [Freedreno] " Rob Clark
2023-03-03 18:20 ` Matt Turner
2023-03-03 14:56 ` Rob Clark
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230302235356.3148279-11-robdclark@gmail.com \
--to=robdclark@gmail.com \
--cc=airlied@gmail.com \
--cc=alexander.deucher@amd.com \
--cc=ckoenig.leichtzumerken@gmail.com \
--cc=contact@emersion.fr \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luben.tuikov@amd.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mario.kleiner.de@gmail.com \
--cc=michel@daenzer.net \
--cc=mripard@kernel.org \
--cc=ppaalanen@gmail.com \
--cc=robdclark@chromium.org \
--cc=rodrigo.vivi@intel.com \
--cc=tvrtko.ursulin@intel.com \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox