* [PATCH v3 00/25] drm/vblank: refactoring and cleanups
@ 2025-12-05 11:27 Jani Nikula
2025-12-05 11:27 ` [PATCH v3 01/25] drm/vblank: Unexport drm_wait_one_vblank() Jani Nikula
` (25 more replies)
0 siblings, 26 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
v3 of [1], just a resend to dri-devel, which I forgot to add, and
Thomas' R-b's, which I also forgot to add, in v2.
Fingers crossed I don't fumble it this time.
BR,
Jani.
[1] https://lore.kernel.org/r/cover.1764845757.git.jani.nikula@intel.com
Jani Nikula (24):
drm/vblank: remove drm_wait_one_vblank() completely
drm/vblank: remove superfluous pipe check
drm/vblank: add return value to drm_crtc_wait_one_vblank()
drm/vblank: limit vblank variable scope to atomic
drm/vblank: use the drm_vblank_crtc() and drm_crtc_vblank_crtc()
helpers more
drm/vblank: prefer drm_crtc_vblank_crtc() over drm_vblank_crtc()
drm/vblank: pass vlank to drm_vblank_get()/_put()/_count()
drm/vblank: pass vblank to drm_update_vblank_count()
drm/vblank: pass vblank to drm_handle_vblank_events()
drm/vblank: use the vblank based interfaces more
drm/vblank: pass vblank to drm_queue_vblank_event()
drm/vblank: pass vblank to drm_wait_vblank_reply()
drm/vblank: pass vblank to drm_vblank_count_and_time()
drm/vblank: pass vblank to drm_reset_vblank_timestamp()
drm/vblank: pass vblank to store_vblank()
drm/vblank: pass vblank to drm_vblank_enable()
drm/vblank: merge drm_vblank_restore() into drm_crtc_vblank_restore()
drm/vblank: add drm_crtc_from_vblank() helper
drm/vblank: pass vblank to __get_vblank_counter() and
drm_max_vblank_count()
drm/vblank: pass vblank to __{enable,disable}_vblank()
drm/vblank: pass vblank to drm_get_last_vbltimestamp()
drm/vblank: pass vblank to drm_vblank_disable_and_save(), make static
drm/vblank: reduce pipe checks
drm/vblank: clean up debug logging
Thomas Zimmermann (1):
drm/vblank: Unexport drm_wait_one_vblank()
drivers/gpu/drm/drm_internal.h | 7 +-
drivers/gpu/drm/drm_vblank.c | 533 ++++++++++++++----------------
drivers/gpu/drm/drm_vblank_work.c | 12 +-
include/drm/drm_vblank.h | 3 +-
4 files changed, 257 insertions(+), 298 deletions(-)
--
2.47.3
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v3 01/25] drm/vblank: Unexport drm_wait_one_vblank()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 02/25] drm/vblank: remove drm_wait_one_vblank() completely Jani Nikula
` (24 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
From: Thomas Zimmermann <tzimmermann@suse.de>
Make drm_wait_on_vblank() static. The function is an internal interface
and not invoked directly by drivers.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 14 +-------------
include/drm/drm_vblank.h | 1 -
2 files changed, 1 insertion(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 32d013c5c8fc..c15d6d9d0082 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -1286,18 +1286,7 @@ void drm_crtc_vblank_put(struct drm_crtc *crtc)
}
EXPORT_SYMBOL(drm_crtc_vblank_put);
-/**
- * drm_wait_one_vblank - wait for one vblank
- * @dev: DRM device
- * @pipe: CRTC index
- *
- * This waits for one vblank to pass on @pipe, using the irq driver interfaces.
- * It is a failure to call this when the vblank irq for @pipe is disabled, e.g.
- * due to lack of driver support or because the crtc is off.
- *
- * This is the legacy version of drm_crtc_wait_one_vblank().
- */
-void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe)
+static void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe)
{
struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
int ret;
@@ -1321,7 +1310,6 @@ void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe)
drm_vblank_put(dev, pipe);
}
-EXPORT_SYMBOL(drm_wait_one_vblank);
/**
* drm_crtc_wait_one_vblank - wait for one vblank
diff --git a/include/drm/drm_vblank.h b/include/drm/drm_vblank.h
index ffa564d79638..94ee09b48895 100644
--- a/include/drm/drm_vblank.h
+++ b/include/drm/drm_vblank.h
@@ -302,7 +302,6 @@ bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe);
bool drm_crtc_handle_vblank(struct drm_crtc *crtc);
int drm_crtc_vblank_get(struct drm_crtc *crtc);
void drm_crtc_vblank_put(struct drm_crtc *crtc);
-void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe);
void drm_crtc_wait_one_vblank(struct drm_crtc *crtc);
void drm_crtc_vblank_off(struct drm_crtc *crtc);
void drm_crtc_vblank_reset(struct drm_crtc *crtc);
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 02/25] drm/vblank: remove drm_wait_one_vblank() completely
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
2025-12-05 11:27 ` [PATCH v3 01/25] drm/vblank: Unexport drm_wait_one_vblank() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 03/25] drm/vblank: remove superfluous pipe check Jani Nikula
` (23 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
There's really no need for the extra static function at all.
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 25 +++++++++++--------------
1 file changed, 11 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index c15d6d9d0082..1d12836e3d80 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -1286,8 +1286,18 @@ void drm_crtc_vblank_put(struct drm_crtc *crtc)
}
EXPORT_SYMBOL(drm_crtc_vblank_put);
-static void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe)
+/**
+ * drm_crtc_wait_one_vblank - wait for one vblank
+ * @crtc: DRM crtc
+ *
+ * This waits for one vblank to pass on @crtc, using the irq driver interfaces.
+ * It is a failure to call this when the vblank irq for @crtc is disabled, e.g.
+ * due to lack of driver support or because the crtc is off.
+ */
+void drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
{
+ struct drm_device *dev = crtc->dev;
+ int pipe = drm_crtc_index(crtc);
struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
int ret;
u64 last;
@@ -1310,19 +1320,6 @@ static void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe)
drm_vblank_put(dev, pipe);
}
-
-/**
- * drm_crtc_wait_one_vblank - wait for one vblank
- * @crtc: DRM crtc
- *
- * This waits for one vblank to pass on @crtc, using the irq driver interfaces.
- * It is a failure to call this when the vblank irq for @crtc is disabled, e.g.
- * due to lack of driver support or because the crtc is off.
- */
-void drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
-{
- drm_wait_one_vblank(crtc->dev, drm_crtc_index(crtc));
-}
EXPORT_SYMBOL(drm_crtc_wait_one_vblank);
/**
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 03/25] drm/vblank: remove superfluous pipe check
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
2025-12-05 11:27 ` [PATCH v3 01/25] drm/vblank: Unexport drm_wait_one_vblank() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 02/25] drm/vblank: remove drm_wait_one_vblank() completely Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 04/25] drm/vblank: add return value to drm_crtc_wait_one_vblank() Jani Nikula
` (22 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Now that the pipe is crtc->pipe, there's no need to check it's within
range.
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 1d12836e3d80..f4d1fe182a4d 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -1302,9 +1302,6 @@ void drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
int ret;
u64 last;
- if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
- return;
-
ret = drm_vblank_get(dev, pipe);
if (drm_WARN(dev, ret, "vblank not available on crtc %i, ret=%i\n",
pipe, ret))
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 04/25] drm/vblank: add return value to drm_crtc_wait_one_vblank()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (2 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 03/25] drm/vblank: remove superfluous pipe check Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 05/25] drm/vblank: limit vblank variable scope to atomic Jani Nikula
` (21 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Let drivers deal with the vblank wait failures if they so desire. If the
current warning backtrace gets toned down to a simple warning message,
the drivers may wish to add the backtrace themselves.
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 8 ++++++--
include/drm/drm_vblank.h | 2 +-
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index f4d1fe182a4d..503eb23d38d2 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -1293,8 +1293,10 @@ EXPORT_SYMBOL(drm_crtc_vblank_put);
* This waits for one vblank to pass on @crtc, using the irq driver interfaces.
* It is a failure to call this when the vblank irq for @crtc is disabled, e.g.
* due to lack of driver support or because the crtc is off.
+ *
+ * Returns: 0 on success, negative error on failures.
*/
-void drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
+int drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
{
struct drm_device *dev = crtc->dev;
int pipe = drm_crtc_index(crtc);
@@ -1305,7 +1307,7 @@ void drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
ret = drm_vblank_get(dev, pipe);
if (drm_WARN(dev, ret, "vblank not available on crtc %i, ret=%i\n",
pipe, ret))
- return;
+ return ret;
last = drm_vblank_count(dev, pipe);
@@ -1316,6 +1318,8 @@ void drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
drm_WARN(dev, ret == 0, "vblank wait timed out on crtc %i\n", pipe);
drm_vblank_put(dev, pipe);
+
+ return ret ? 0 : -ETIMEDOUT;
}
EXPORT_SYMBOL(drm_crtc_wait_one_vblank);
diff --git a/include/drm/drm_vblank.h b/include/drm/drm_vblank.h
index 94ee09b48895..2fcef9c0f5b1 100644
--- a/include/drm/drm_vblank.h
+++ b/include/drm/drm_vblank.h
@@ -302,7 +302,7 @@ bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe);
bool drm_crtc_handle_vblank(struct drm_crtc *crtc);
int drm_crtc_vblank_get(struct drm_crtc *crtc);
void drm_crtc_vblank_put(struct drm_crtc *crtc);
-void drm_crtc_wait_one_vblank(struct drm_crtc *crtc);
+int drm_crtc_wait_one_vblank(struct drm_crtc *crtc);
void drm_crtc_vblank_off(struct drm_crtc *crtc);
void drm_crtc_vblank_reset(struct drm_crtc *crtc);
void drm_crtc_vblank_on_config(struct drm_crtc *crtc,
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 05/25] drm/vblank: limit vblank variable scope to atomic
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (3 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 04/25] drm/vblank: add return value to drm_crtc_wait_one_vblank() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 06/25] drm/vblank: use the drm_vblank_crtc() and drm_crtc_vblank_crtc() helpers more Jani Nikula
` (20 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
In drm_crtc_vblank_helper_get_vblank_timestamp_internal(), we only need
the vblank variable for atomic modesetting. Limit the scope to make
upcoming changes easier.
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 503eb23d38d2..91e63177daaf 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -710,7 +710,6 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
{
struct drm_device *dev = crtc->dev;
unsigned int pipe = crtc->index;
- struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
struct timespec64 ts_etime, ts_vblank_time;
ktime_t stime, etime;
bool vbl_status;
@@ -729,10 +728,13 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
return false;
}
- if (drm_drv_uses_atomic_modeset(dev))
+ if (drm_drv_uses_atomic_modeset(dev)) {
+ struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
+
mode = &vblank->hwmode;
- else
+ } else {
mode = &crtc->hwmode;
+ }
/* If mode timing undefined, just return as no-op:
* Happens during initial modesetting of a crtc.
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 06/25] drm/vblank: use the drm_vblank_crtc() and drm_crtc_vblank_crtc() helpers more
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (4 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 05/25] drm/vblank: limit vblank variable scope to atomic Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 07/25] drm/vblank: prefer drm_crtc_vblank_crtc() over drm_vblank_crtc() Jani Nikula
` (19 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
We have the helpers to avoid open coding dev->vblank[pipe] access.
v2: Rebase
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 91e63177daaf..a86561c4b999 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -551,7 +551,7 @@ int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs)
dev->num_crtcs = num_crtcs;
for (i = 0; i < num_crtcs; i++) {
- struct drm_vblank_crtc *vblank = &dev->vblank[i];
+ struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, i);
vblank->dev = dev;
vblank->pipe = i;
@@ -605,7 +605,9 @@ EXPORT_SYMBOL(drm_dev_has_vblank);
*/
wait_queue_head_t *drm_crtc_vblank_waitqueue(struct drm_crtc *crtc)
{
- return &crtc->dev->vblank[drm_crtc_index(crtc)].queue;
+ struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
+
+ return &vblank->queue;
}
EXPORT_SYMBOL(drm_crtc_vblank_waitqueue);
@@ -729,7 +731,7 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
}
if (drm_drv_uses_atomic_modeset(dev)) {
- struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
+ struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
mode = &vblank->hwmode;
} else {
@@ -1784,7 +1786,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
if (pipe >= dev->num_crtcs)
return -EINVAL;
- vblank = &dev->vblank[pipe];
+ vblank = drm_vblank_crtc(dev, pipe);
/* If the counter is currently enabled and accurate, short-circuit
* queries to return the cached timestamp of the last vblank.
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 07/25] drm/vblank: prefer drm_crtc_vblank_crtc() over drm_vblank_crtc()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (5 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 06/25] drm/vblank: use the drm_vblank_crtc() and drm_crtc_vblank_crtc() helpers more Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 08/25] drm/vblank: pass vlank to drm_vblank_get()/_put()/_count() Jani Nikula
` (18 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the higher level function where crtc is available.
v2: Rebase
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index a86561c4b999..498fc91450e6 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -731,7 +731,7 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
}
if (drm_drv_uses_atomic_modeset(dev)) {
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
+ struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
mode = &vblank->hwmode;
} else {
@@ -1304,7 +1304,7 @@ int drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
{
struct drm_device *dev = crtc->dev;
int pipe = drm_crtc_index(crtc);
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
+ struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
int ret;
u64 last;
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 08/25] drm/vblank: pass vlank to drm_vblank_get()/_put()/_count()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (6 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 07/25] drm/vblank: prefer drm_crtc_vblank_crtc() over drm_vblank_crtc() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 09/25] drm/vblank: pass vblank to drm_update_vblank_count() Jani Nikula
` (17 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Pass struct drm_vblank_crtc * to drm_vblank_get(), drm_vblank_put(), and
drm_vblank_count(). They'll figure out the vblank pointer as the first
thing anyway, so it's handy to pass it when available. We can also rely
on vblank having a valid pipe, and can reduce the number of checks we
do.
Rename the functions to drm_vblank_crtc_*() naming. Directly convert the
call sites that already have the vblank pointer available.
v2: Use drm_vblank_crtc_* naming (Thomas)
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_internal.h | 6 +--
drivers/gpu/drm/drm_vblank.c | 69 +++++++++++++++++++------------
drivers/gpu/drm/drm_vblank_work.c | 12 +++---
3 files changed, 51 insertions(+), 36 deletions(-)
diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
index f893b1e3a596..6e7ac5b16d92 100644
--- a/drivers/gpu/drm/drm_internal.h
+++ b/drivers/gpu/drm/drm_internal.h
@@ -112,9 +112,9 @@ static inline bool drm_vblank_passed(u64 seq, u64 ref)
}
void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe);
-int drm_vblank_get(struct drm_device *dev, unsigned int pipe);
-void drm_vblank_put(struct drm_device *dev, unsigned int pipe);
-u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe);
+int drm_vblank_crtc_get(struct drm_vblank_crtc *vblank);
+void drm_vblank_crtc_put(struct drm_vblank_crtc *vblank);
+u64 drm_vblank_crtc_count(struct drm_vblank_crtc *vblank);
/* drm_vblank_work.c */
static inline void drm_vblank_flush_worker(struct drm_vblank_crtc *vblank)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 498fc91450e6..aeb931c825ca 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -384,14 +384,10 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
store_vblank(dev, pipe, diff, t_vblank, cur_vblank);
}
-u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe)
+u64 drm_vblank_crtc_count(struct drm_vblank_crtc *vblank)
{
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
u64 count;
- if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
- return 0;
-
count = atomic64_read(&vblank->count);
/*
@@ -406,6 +402,14 @@ u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe)
return count;
}
+static u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe)
+{
+ if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+ return 0;
+
+ return drm_vblank_crtc_count(drm_vblank_crtc(dev, pipe));
+}
+
/**
* drm_crtc_accurate_vblank_count - retrieve the master vblank counter
* @crtc: which counter to retrieve
@@ -1210,18 +1214,16 @@ static int drm_vblank_enable(struct drm_device *dev, unsigned int pipe)
return ret;
}
-int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
+int drm_vblank_crtc_get(struct drm_vblank_crtc *vblank)
{
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
+ struct drm_device *dev = vblank->dev;
+ int pipe = vblank->pipe;
unsigned long irqflags;
int ret = 0;
if (!drm_dev_has_vblank(dev))
return -EINVAL;
- if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
- return -EINVAL;
-
spin_lock_irqsave(&dev->vbl_lock, irqflags);
/* Going from 0->1 means we have to enable interrupts again */
if (atomic_add_return(1, &vblank->refcount) == 1) {
@@ -1237,6 +1239,14 @@ int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
return ret;
}
+static int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
+{
+ if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+ return -EINVAL;
+
+ return drm_vblank_crtc_get(drm_vblank_crtc(dev, pipe));
+}
+
/**
* drm_crtc_vblank_get - get a reference count on vblank events
* @crtc: which CRTC to own
@@ -1253,14 +1263,11 @@ int drm_crtc_vblank_get(struct drm_crtc *crtc)
}
EXPORT_SYMBOL(drm_crtc_vblank_get);
-void drm_vblank_put(struct drm_device *dev, unsigned int pipe)
+void drm_vblank_crtc_put(struct drm_vblank_crtc *vblank)
{
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
+ struct drm_device *dev = vblank->dev;
int vblank_offdelay = vblank->config.offdelay_ms;
- if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
- return;
-
if (drm_WARN_ON(dev, atomic_read(&vblank->refcount) == 0))
return;
@@ -1276,6 +1283,14 @@ void drm_vblank_put(struct drm_device *dev, unsigned int pipe)
}
}
+static void drm_vblank_put(struct drm_device *dev, unsigned int pipe)
+{
+ if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+ return;
+
+ drm_vblank_crtc_put(drm_vblank_crtc(dev, pipe));
+}
+
/**
* drm_crtc_vblank_put - give up ownership of vblank events
* @crtc: which counter to give up
@@ -1308,20 +1323,20 @@ int drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
int ret;
u64 last;
- ret = drm_vblank_get(dev, pipe);
+ ret = drm_vblank_crtc_get(vblank);
if (drm_WARN(dev, ret, "vblank not available on crtc %i, ret=%i\n",
pipe, ret))
return ret;
- last = drm_vblank_count(dev, pipe);
+ last = drm_vblank_crtc_count(vblank);
ret = wait_event_timeout(vblank->queue,
- last != drm_vblank_count(dev, pipe),
+ last != drm_vblank_crtc_count(vblank),
msecs_to_jiffies(1000));
drm_WARN(dev, ret == 0, "vblank wait timed out on crtc %i\n", pipe);
- drm_vblank_put(dev, pipe);
+ drm_vblank_crtc_put(vblank);
return ret ? 0 : -ETIMEDOUT;
}
@@ -1368,7 +1383,7 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
wake_up(&vblank->queue);
/*
- * Prevent subsequent drm_vblank_get() from re-enabling
+ * Prevent subsequent drm_vblank_crtc_get() from re-enabling
* the vblank interrupt by bumping the refcount.
*/
if (!vblank->inmodeset) {
@@ -1424,7 +1439,7 @@ void drm_crtc_vblank_reset(struct drm_crtc *crtc)
spin_lock_irq(&dev->vbl_lock);
/*
- * Prevent subsequent drm_vblank_get() from enabling the vblank
+ * Prevent subsequent drm_vblank_crtc_get() from enabling the vblank
* interrupt by bumping the refcount.
*/
if (!vblank->inmodeset) {
@@ -1497,7 +1512,7 @@ void drm_crtc_vblank_on_config(struct drm_crtc *crtc,
vblank->config = *config;
- /* Drop our private "prevent drm_vblank_get" refcount */
+ /* Drop our private "prevent drm_vblank_crtc_get" refcount */
if (vblank->inmodeset) {
atomic_dec(&vblank->refcount);
vblank->inmodeset = 0;
@@ -1639,9 +1654,9 @@ static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe,
/*
* drm_crtc_vblank_off() might have been called after we called
- * drm_vblank_get(). drm_crtc_vblank_off() holds event_lock around the
+ * drm_vblank_crtc_get(). drm_crtc_vblank_off() holds event_lock around the
* vblank disable, so no need for further locking. The reference from
- * drm_vblank_get() protects against vblank disable from another source.
+ * drm_vblank_crtc_get() protects against vblank disable from another source.
*/
if (!READ_ONCE(vblank->enabled)) {
ret = -EINVAL;
@@ -1667,7 +1682,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe,
send_vblank_event(dev, e, seq, now);
vblwait->reply.sequence = seq;
} else {
- /* drm_handle_vblank_events will call drm_vblank_put */
+ /* drm_handle_vblank_events will call drm_vblank_crtc_put */
list_add_tail(&e->base.link, &dev->vblank_event_list);
vblwait->reply.sequence = req_seq;
}
@@ -1830,7 +1845,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
if (flags & _DRM_VBLANK_EVENT) {
/* must hold on to the vblank ref until the event fires
- * drm_vblank_put will be called asynchronously
+ * drm_vblank_crtc_put will be called asynchronously
*/
return drm_queue_vblank_event(dev, pipe, req_seq, vblwait, file_priv);
}
@@ -2148,7 +2163,7 @@ int drm_crtc_queue_sequence_ioctl(struct drm_device *dev, void *data,
send_vblank_event(dev, e, seq, now);
queue_seq->sequence = seq;
} else {
- /* drm_handle_vblank_events will call drm_vblank_put */
+ /* drm_handle_vblank_events will call drm_vblank_crtc_put */
list_add_tail(&e->base.link, &dev->vblank_event_list);
queue_seq->sequence = req_seq;
}
diff --git a/drivers/gpu/drm/drm_vblank_work.c b/drivers/gpu/drm/drm_vblank_work.c
index 70f0199251ea..52158f85c855 100644
--- a/drivers/gpu/drm/drm_vblank_work.c
+++ b/drivers/gpu/drm/drm_vblank_work.c
@@ -58,7 +58,7 @@ void drm_handle_vblank_works(struct drm_vblank_crtc *vblank)
continue;
list_del_init(&work->node);
- drm_vblank_put(vblank->dev, vblank->pipe);
+ drm_vblank_crtc_put(vblank);
kthread_queue_work(vblank->worker, &work->base);
wake = true;
}
@@ -80,7 +80,7 @@ void drm_vblank_cancel_pending_works(struct drm_vblank_crtc *vblank)
list_for_each_entry_safe(work, next, &vblank->pending_work, node) {
list_del_init(&work->node);
- drm_vblank_put(vblank->dev, vblank->pipe);
+ drm_vblank_crtc_put(vblank);
}
wake_up_all(&vblank->work_wait_queue);
@@ -129,7 +129,7 @@ int drm_vblank_work_schedule(struct drm_vblank_work *work,
goto out;
if (list_empty(&work->node)) {
- ret = drm_vblank_get(dev, vblank->pipe);
+ ret = drm_vblank_crtc_get(vblank);
if (ret < 0)
goto out;
} else if (work->count == count) {
@@ -140,7 +140,7 @@ int drm_vblank_work_schedule(struct drm_vblank_work *work,
}
work->count = count;
- cur_vbl = drm_vblank_count(dev, vblank->pipe);
+ cur_vbl = drm_vblank_crtc_count(vblank);
passed = drm_vblank_passed(cur_vbl, count);
if (passed)
drm_dbg_core(dev,
@@ -148,7 +148,7 @@ int drm_vblank_work_schedule(struct drm_vblank_work *work,
vblank->pipe, count, cur_vbl);
if (!nextonmiss && passed) {
- drm_vblank_put(dev, vblank->pipe);
+ drm_vblank_crtc_put(vblank);
ret = kthread_queue_work(vblank->worker, &work->base);
if (rescheduling) {
@@ -193,7 +193,7 @@ bool drm_vblank_work_cancel_sync(struct drm_vblank_work *work)
spin_lock_irq(&dev->event_lock);
if (!list_empty(&work->node)) {
list_del_init(&work->node);
- drm_vblank_put(vblank->dev, vblank->pipe);
+ drm_vblank_crtc_put(vblank);
ret = true;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 09/25] drm/vblank: pass vblank to drm_update_vblank_count()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (7 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 08/25] drm/vblank: pass vlank to drm_vblank_get()/_put()/_count() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 10/25] drm/vblank: pass vblank to drm_handle_vblank_events() Jani Nikula
` (16 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the vblank pointer instead of a dev, pipe pair to simplify
code. Rename to drm_vblank_crtc_update_count().
v2: Rename the function (Thomas)
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de> # v1
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 32 +++++++++++++++++---------------
1 file changed, 17 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index aeb931c825ca..da8ca8928232 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -292,10 +292,11 @@ static void drm_reset_vblank_timestamp(struct drm_device *dev, unsigned int pipe
* Note: caller must hold &drm_device.vbl_lock since this reads & writes
* device vblank fields.
*/
-static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
- bool in_vblank_irq)
+static void drm_vblank_crtc_update_count(struct drm_vblank_crtc *vblank,
+ bool in_vblank_irq)
{
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
+ struct drm_device *dev = vblank->dev;
+ unsigned int pipe = vblank->pipe;
u32 cur_vblank, diff;
bool rc;
ktime_t t_vblank;
@@ -424,8 +425,8 @@ static u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe)
u64 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc)
{
struct drm_device *dev = crtc->dev;
- unsigned int pipe = drm_crtc_index(crtc);
- u64 vblank;
+ struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
+ u64 vblank_count;
unsigned long flags;
drm_WARN_ONCE(dev, drm_debug_enabled(DRM_UT_VBL) &&
@@ -434,12 +435,12 @@ u64 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc)
spin_lock_irqsave(&dev->vblank_time_lock, flags);
- drm_update_vblank_count(dev, pipe, false);
- vblank = drm_vblank_count(dev, pipe);
+ drm_vblank_crtc_update_count(vblank, false);
+ vblank_count = drm_vblank_crtc_count(vblank);
spin_unlock_irqrestore(&dev->vblank_time_lock, flags);
- return vblank;
+ return vblank_count;
}
EXPORT_SYMBOL(drm_crtc_accurate_vblank_count);
@@ -490,7 +491,7 @@ void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe)
* this time. This makes the count account for the entire time
* between drm_crtc_vblank_on() and drm_crtc_vblank_off().
*/
- drm_update_vblank_count(dev, pipe, false);
+ drm_vblank_crtc_update_count(vblank, false);
__disable_vblank(dev, pipe);
vblank->enabled = false;
@@ -1199,11 +1200,12 @@ static int drm_vblank_enable(struct drm_device *dev, unsigned int pipe)
if (ret) {
atomic_dec(&vblank->refcount);
} else {
- drm_update_vblank_count(dev, pipe, 0);
- /* drm_update_vblank_count() includes a wmb so we just
- * need to ensure that the compiler emits the write
- * to mark the vblank as enabled after the call
- * to drm_update_vblank_count().
+ drm_vblank_crtc_update_count(vblank, 0);
+ /*
+ * drm_vblank_crtc_update_count() includes a wmb so we
+ * just need to ensure that the compiler emits the write
+ * to mark the vblank as enabled after the call to
+ * drm_vblank_crtc_update_count().
*/
WRITE_ONCE(vblank->enabled, true);
}
@@ -1959,7 +1961,7 @@ bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe)
return false;
}
- drm_update_vblank_count(dev, pipe, true);
+ drm_vblank_crtc_update_count(vblank, true);
spin_unlock(&dev->vblank_time_lock);
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 10/25] drm/vblank: pass vblank to drm_handle_vblank_events()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (8 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 09/25] drm/vblank: pass vblank to drm_update_vblank_count() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 11/25] drm/vblank: use the vblank based interfaces more Jani Nikula
` (15 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the vblank pointer instead of a dev, pipe pair to simplify
code. Rename to drm_vblank_crtc_handle_events().
v2: Rename (Thomas)
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index da8ca8928232..49b59af1512e 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -1684,7 +1684,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe,
send_vblank_event(dev, e, seq, now);
vblwait->reply.sequence = seq;
} else {
- /* drm_handle_vblank_events will call drm_vblank_crtc_put */
+ /* drm_vblank_crtc_handle_events will call drm_vblank_crtc_put */
list_add_tail(&e->base.link, &dev->vblank_event_list);
vblwait->reply.sequence = req_seq;
}
@@ -1892,8 +1892,10 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
return ret;
}
-static void drm_handle_vblank_events(struct drm_device *dev, unsigned int pipe)
+static void drm_vblank_crtc_handle_events(struct drm_vblank_crtc *vblank)
{
+ struct drm_device *dev = vblank->dev;
+ unsigned int pipe = vblank->pipe;
struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe);
bool high_prec = false;
struct drm_pending_vblank_event *e, *t;
@@ -1914,7 +1916,7 @@ static void drm_handle_vblank_events(struct drm_device *dev, unsigned int pipe)
e->sequence, seq);
list_del(&e->base.link);
- drm_vblank_put(dev, pipe);
+ drm_vblank_crtc_put(vblank);
send_vblank_event(dev, e, seq, now);
}
@@ -1970,13 +1972,13 @@ bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe)
/* With instant-off, we defer disabling the interrupt until after
* we finish processing the following vblank after all events have
* been signaled. The disable has to be last (after
- * drm_handle_vblank_events) so that the timestamp is always accurate.
+ * drm_vblank_crtc_handle_events) so that the timestamp is always accurate.
*/
disable_irq = (vblank->config.disable_immediate &&
vblank->config.offdelay_ms > 0 &&
!atomic_read(&vblank->refcount));
- drm_handle_vblank_events(dev, pipe);
+ drm_vblank_crtc_handle_events(vblank);
drm_handle_vblank_works(vblank);
spin_unlock_irqrestore(&dev->event_lock, irqflags);
@@ -2165,7 +2167,7 @@ int drm_crtc_queue_sequence_ioctl(struct drm_device *dev, void *data,
send_vblank_event(dev, e, seq, now);
queue_seq->sequence = seq;
} else {
- /* drm_handle_vblank_events will call drm_vblank_crtc_put */
+ /* drm_vblank_crtc_handle_events will call drm_vblank_crtc_put */
list_add_tail(&e->base.link, &dev->vblank_event_list);
queue_seq->sequence = req_seq;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 11/25] drm/vblank: use the vblank based interfaces more
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (9 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 10/25] drm/vblank: pass vblank to drm_handle_vblank_events() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 12/25] drm/vblank: pass vblank to drm_queue_vblank_event() Jani Nikula
` (14 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
With the prep work in place, we can get rid of _drm_vblank_get(),
_drm_vblank_put(), and _drm_vblank_count().
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 44 ++++++++----------------------------
1 file changed, 10 insertions(+), 34 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 49b59af1512e..d0460cd5d345 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -403,14 +403,6 @@ u64 drm_vblank_crtc_count(struct drm_vblank_crtc *vblank)
return count;
}
-static u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe)
-{
- if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
- return 0;
-
- return drm_vblank_crtc_count(drm_vblank_crtc(dev, pipe));
-}
-
/**
* drm_crtc_accurate_vblank_count - retrieve the master vblank counter
* @crtc: which counter to retrieve
@@ -942,7 +934,7 @@ drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
*/
u64 drm_crtc_vblank_count(struct drm_crtc *crtc)
{
- return drm_vblank_count(crtc->dev, drm_crtc_index(crtc));
+ return drm_vblank_crtc_count(drm_crtc_vblank_crtc(crtc));
}
EXPORT_SYMBOL(drm_crtc_vblank_count);
@@ -1241,14 +1233,6 @@ int drm_vblank_crtc_get(struct drm_vblank_crtc *vblank)
return ret;
}
-static int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
-{
- if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
- return -EINVAL;
-
- return drm_vblank_crtc_get(drm_vblank_crtc(dev, pipe));
-}
-
/**
* drm_crtc_vblank_get - get a reference count on vblank events
* @crtc: which CRTC to own
@@ -1261,7 +1245,7 @@ static int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
*/
int drm_crtc_vblank_get(struct drm_crtc *crtc)
{
- return drm_vblank_get(crtc->dev, drm_crtc_index(crtc));
+ return drm_vblank_crtc_get(drm_crtc_vblank_crtc(crtc));
}
EXPORT_SYMBOL(drm_crtc_vblank_get);
@@ -1285,14 +1269,6 @@ void drm_vblank_crtc_put(struct drm_vblank_crtc *vblank)
}
}
-static void drm_vblank_put(struct drm_device *dev, unsigned int pipe)
-{
- if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
- return;
-
- drm_vblank_crtc_put(drm_vblank_crtc(dev, pipe));
-}
-
/**
* drm_crtc_vblank_put - give up ownership of vblank events
* @crtc: which counter to give up
@@ -1303,7 +1279,7 @@ static void drm_vblank_put(struct drm_device *dev, unsigned int pipe)
*/
void drm_crtc_vblank_put(struct drm_crtc *crtc)
{
- drm_vblank_put(crtc->dev, drm_crtc_index(crtc));
+ drm_vblank_crtc_put(drm_crtc_vblank_crtc(crtc));
}
EXPORT_SYMBOL(drm_crtc_vblank_put);
@@ -1404,7 +1380,7 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
"wanted %llu, current %llu\n",
e->sequence, seq);
list_del(&e->base.link);
- drm_vblank_put(dev, pipe);
+ drm_vblank_crtc_put(vblank);
send_vblank_event(dev, e, seq, now);
}
@@ -1680,7 +1656,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe,
e->sequence = req_seq;
if (drm_vblank_passed(seq, req_seq)) {
- drm_vblank_put(dev, pipe);
+ drm_vblank_crtc_put(vblank);
send_vblank_event(dev, e, seq, now);
vblwait->reply.sequence = seq;
} else {
@@ -1697,7 +1673,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe,
spin_unlock_irq(&dev->event_lock);
kfree(e);
err_put:
- drm_vblank_put(dev, pipe);
+ drm_vblank_crtc_put(vblank);
return ret;
}
@@ -1815,14 +1791,14 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
return 0;
}
- ret = drm_vblank_get(dev, pipe);
+ ret = drm_vblank_crtc_get(vblank);
if (ret) {
drm_dbg_core(dev,
"crtc %d failed to acquire vblank counter, %d\n",
pipe, ret);
return ret;
}
- seq = drm_vblank_count(dev, pipe);
+ seq = drm_vblank_crtc_count(vblank);
switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) {
case _DRM_VBLANK_RELATIVE:
@@ -1858,7 +1834,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
drm_dbg_core(dev, "waiting on vblank count %llu, crtc %u\n",
req_seq, pipe);
wait = wait_event_interruptible_timeout(vblank->queue,
- drm_vblank_passed(drm_vblank_count(dev, pipe), req_seq) ||
+ drm_vblank_passed(drm_vblank_crtc_count(vblank), req_seq) ||
!READ_ONCE(vblank->enabled),
msecs_to_jiffies(3000));
@@ -1888,7 +1864,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
}
done:
- drm_vblank_put(dev, pipe);
+ drm_vblank_crtc_put(vblank);
return ret;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 12/25] drm/vblank: pass vblank to drm_queue_vblank_event()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (10 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 11/25] drm/vblank: use the vblank based interfaces more Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 13/25] drm/vblank: pass vblank to drm_wait_vblank_reply() Jani Nikula
` (13 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the vblank pointer instead of a dev, pipe pair to simplify
code. Rename to drm_vblank_crtc_queue_event().
v2: Rename (Thomas)
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index d0460cd5d345..6be354415529 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -1599,12 +1599,13 @@ void drm_crtc_vblank_restore(struct drm_crtc *crtc)
}
EXPORT_SYMBOL(drm_crtc_vblank_restore);
-static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe,
- u64 req_seq,
- union drm_wait_vblank *vblwait,
- struct drm_file *file_priv)
+static int drm_vblank_crtc_queue_event(struct drm_vblank_crtc *vblank,
+ u64 req_seq,
+ union drm_wait_vblank *vblwait,
+ struct drm_file *file_priv)
{
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
+ struct drm_device *dev = vblank->dev;
+ unsigned int pipe = vblank->pipe;
struct drm_pending_vblank_event *e;
ktime_t now;
u64 seq;
@@ -1825,7 +1826,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
/* must hold on to the vblank ref until the event fires
* drm_vblank_crtc_put will be called asynchronously
*/
- return drm_queue_vblank_event(dev, pipe, req_seq, vblwait, file_priv);
+ return drm_vblank_crtc_queue_event(vblank, req_seq, vblwait, file_priv);
}
if (req_seq != seq) {
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 13/25] drm/vblank: pass vblank to drm_wait_vblank_reply()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (11 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 12/25] drm/vblank: pass vblank to drm_queue_vblank_event() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 14/25] drm/vblank: pass vblank to drm_vblank_count_and_time() Jani Nikula
` (12 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the vblank pointer instead of a dev, pipe pair to simplify
code. Rename to drm_vblank_crtc_wait_reply().
v2: Rename (Thomas)
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 6be354415529..233c60860c78 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -1705,18 +1705,18 @@ static u64 widen_32_to_64(u32 narrow, u64 near)
return near + (s32) (narrow - near);
}
-static void drm_wait_vblank_reply(struct drm_device *dev, unsigned int pipe,
- struct drm_wait_vblank_reply *reply)
+static void drm_vblank_crtc_wait_reply(struct drm_vblank_crtc *vblank,
+ struct drm_wait_vblank_reply *reply)
{
ktime_t now;
struct timespec64 ts;
/*
- * drm_wait_vblank_reply is a UAPI structure that uses 'long'
+ * drm_vblank_crtc_wait_reply is a UAPI structure that uses 'long'
* to store the seconds. This is safe as we always use monotonic
* timestamps since linux-4.15.
*/
- reply->sequence = drm_vblank_count_and_time(dev, pipe, &now);
+ reply->sequence = drm_vblank_count_and_time(vblank->dev, vblank->pipe, &now);
ts = ktime_to_timespec64(now);
reply->tval_sec = (u32)ts.tv_sec;
reply->tval_usec = ts.tv_nsec / 1000;
@@ -1788,7 +1788,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
if (vblank->config.disable_immediate &&
drm_wait_vblank_is_query(vblwait) &&
READ_ONCE(vblank->enabled)) {
- drm_wait_vblank_reply(dev, pipe, &vblwait->reply);
+ drm_vblank_crtc_wait_reply(vblank, &vblwait->reply);
return 0;
}
@@ -1855,7 +1855,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
}
if (ret != -EINTR) {
- drm_wait_vblank_reply(dev, pipe, &vblwait->reply);
+ drm_vblank_crtc_wait_reply(vblank, &vblwait->reply);
drm_dbg_core(dev, "crtc %d returning %u to client\n",
pipe, vblwait->reply.sequence);
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 14/25] drm/vblank: pass vblank to drm_vblank_count_and_time()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (12 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 13/25] drm/vblank: pass vblank to drm_wait_vblank_reply() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 15/25] drm/vblank: pass vblank to drm_reset_vblank_timestamp() Jani Nikula
` (11 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the vblank pointer instead of a dev, pipe pair to simplify
code. Rename to drm_vblank_crtc_count_and_time().
Drop the pipe check warning, as we can be sure vblank->pipe is within
limits.
v2: Rename (Thomas)
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 38 +++++++++++++++---------------------
1 file changed, 16 insertions(+), 22 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 233c60860c78..5182dfc7b930 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -395,8 +395,8 @@ u64 drm_vblank_crtc_count(struct drm_vblank_crtc *vblank)
* This read barrier corresponds to the implicit write barrier of the
* write seqlock in store_vblank(). Note that this is the only place
* where we need an explicit barrier, since all other access goes
- * through drm_vblank_count_and_time(), which already has the required
- * read barrier curtesy of the read seqlock.
+ * through drm_vblank_crtc_count_and_time(), which already has the
+ * required read barrier curtesy of the read seqlock.
*/
smp_rmb();
@@ -939,7 +939,7 @@ u64 drm_crtc_vblank_count(struct drm_crtc *crtc)
EXPORT_SYMBOL(drm_crtc_vblank_count);
/**
- * drm_vblank_count_and_time - retrieve "cooked" vblank counter value and the
+ * drm_vblank_crtc_count_and_time - retrieve "cooked" vblank counter value and the
* system timestamp corresponding to that vblank counter value.
* @dev: DRM device
* @pipe: index of CRTC whose counter to retrieve
@@ -952,18 +952,12 @@ EXPORT_SYMBOL(drm_crtc_vblank_count);
*
* This is the legacy version of drm_crtc_vblank_count_and_time().
*/
-static u64 drm_vblank_count_and_time(struct drm_device *dev, unsigned int pipe,
- ktime_t *vblanktime)
+static u64 drm_vblank_crtc_count_and_time(struct drm_vblank_crtc *vblank,
+ ktime_t *vblanktime)
{
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
u64 vblank_count;
unsigned int seq;
- if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) {
- *vblanktime = 0;
- return 0;
- }
-
do {
seq = read_seqbegin(&vblank->seqlock);
vblank_count = atomic64_read(&vblank->count);
@@ -995,8 +989,8 @@ static u64 drm_vblank_count_and_time(struct drm_device *dev, unsigned int pipe,
u64 drm_crtc_vblank_count_and_time(struct drm_crtc *crtc,
ktime_t *vblanktime)
{
- return drm_vblank_count_and_time(crtc->dev, drm_crtc_index(crtc),
- vblanktime);
+ return drm_vblank_crtc_count_and_time(drm_crtc_vblank_crtc(crtc),
+ vblanktime);
}
EXPORT_SYMBOL(drm_crtc_vblank_count_and_time);
@@ -1138,18 +1132,18 @@ void drm_crtc_send_vblank_event(struct drm_crtc *crtc,
struct drm_pending_vblank_event *e)
{
struct drm_device *dev = crtc->dev;
+ struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
u64 seq;
- unsigned int pipe = drm_crtc_index(crtc);
ktime_t now;
if (drm_dev_has_vblank(dev)) {
- seq = drm_vblank_count_and_time(dev, pipe, &now);
+ seq = drm_vblank_crtc_count_and_time(vblank, &now);
} else {
seq = 0;
now = ktime_get();
}
- e->pipe = pipe;
+ e->pipe = vblank->pipe;
send_vblank_event(dev, e, seq, now);
}
EXPORT_SYMBOL(drm_crtc_send_vblank_event);
@@ -1371,7 +1365,7 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
spin_unlock(&dev->vbl_lock);
/* Send any queued vblank events, lest the natives grow disquiet */
- seq = drm_vblank_count_and_time(dev, pipe, &now);
+ seq = drm_vblank_crtc_count_and_time(vblank, &now);
list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
if (e->pipe != pipe)
@@ -1648,7 +1642,7 @@ static int drm_vblank_crtc_queue_event(struct drm_vblank_crtc *vblank,
if (ret)
goto err_unlock;
- seq = drm_vblank_count_and_time(dev, pipe, &now);
+ seq = drm_vblank_crtc_count_and_time(vblank, &now);
drm_dbg_core(dev, "event on vblank count %llu, current %llu, crtc %u\n",
req_seq, seq, pipe);
@@ -1716,7 +1710,7 @@ static void drm_vblank_crtc_wait_reply(struct drm_vblank_crtc *vblank,
* to store the seconds. This is safe as we always use monotonic
* timestamps since linux-4.15.
*/
- reply->sequence = drm_vblank_count_and_time(vblank->dev, vblank->pipe, &now);
+ reply->sequence = drm_vblank_crtc_count_and_time(vblank, &now);
ts = ktime_to_timespec64(now);
reply->tval_sec = (u32)ts.tv_sec;
reply->tval_usec = ts.tv_nsec / 1000;
@@ -1881,7 +1875,7 @@ static void drm_vblank_crtc_handle_events(struct drm_vblank_crtc *vblank)
assert_spin_locked(&dev->event_lock);
- seq = drm_vblank_count_and_time(dev, pipe, &now);
+ seq = drm_vblank_crtc_count_and_time(vblank, &now);
list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
if (e->pipe != pipe)
@@ -2043,7 +2037,7 @@ int drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data,
else
get_seq->active = crtc->enabled;
drm_modeset_unlock(&crtc->mutex);
- get_seq->sequence = drm_vblank_count_and_time(dev, pipe, &now);
+ get_seq->sequence = drm_vblank_crtc_count_and_time(vblank, &now);
get_seq->sequence_ns = ktime_to_ns(now);
if (!vblank_enabled)
drm_crtc_vblank_put(crtc);
@@ -2104,7 +2098,7 @@ int drm_crtc_queue_sequence_ioctl(struct drm_device *dev, void *data,
goto err_free;
}
- seq = drm_vblank_count_and_time(dev, pipe, &now);
+ seq = drm_vblank_crtc_count_and_time(vblank, &now);
req_seq = queue_seq->sequence;
if (flags & DRM_CRTC_SEQUENCE_RELATIVE)
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 15/25] drm/vblank: pass vblank to drm_reset_vblank_timestamp()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (13 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 14/25] drm/vblank: pass vblank to drm_vblank_count_and_time() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 16/25] drm/vblank: pass vblank to store_vblank() Jani Nikula
` (10 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the vblank pointer instead of a dev, pipe pair to simplify
code. Rename to drm_vblank_crtc_reset_timestamp().
v2: Rename (Thomas)
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 5182dfc7b930..ed4a589c408f 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -245,8 +245,10 @@ static u32 __get_vblank_counter(struct drm_device *dev, unsigned int pipe)
* Note: caller must hold &drm_device.vbl_lock since this reads & writes
* device vblank fields.
*/
-static void drm_reset_vblank_timestamp(struct drm_device *dev, unsigned int pipe)
+static void drm_vblank_crtc_reset_timestamp(struct drm_vblank_crtc *vblank)
{
+ struct drm_device *dev = vblank->dev;
+ unsigned int pipe = vblank->pipe;
u32 cur_vblank;
bool rc;
ktime_t t_vblank;
@@ -1490,7 +1492,7 @@ void drm_crtc_vblank_on_config(struct drm_crtc *crtc,
vblank->inmodeset = 0;
}
- drm_reset_vblank_timestamp(dev, pipe);
+ drm_vblank_crtc_reset_timestamp(vblank);
/*
* re-enable interrupts if there are users left, or the
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 16/25] drm/vblank: pass vblank to store_vblank()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (14 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 15/25] drm/vblank: pass vblank to drm_reset_vblank_timestamp() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 17/25] drm/vblank: pass vblank to drm_vblank_enable() Jani Nikula
` (9 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the vblank pointer instead of a dev, pipe pair to simplify
code. Rename to drm_vblank_crtc_store().
v2: Rename (Thomas)
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index ed4a589c408f..81224946df9d 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -188,11 +188,11 @@ drm_crtc_vblank_crtc(struct drm_crtc *crtc)
}
EXPORT_SYMBOL(drm_crtc_vblank_crtc);
-static void store_vblank(struct drm_device *dev, unsigned int pipe,
- u32 vblank_count_inc,
- ktime_t t_vblank, u32 last)
+static void drm_vblank_crtc_store(struct drm_vblank_crtc *vblank,
+ u32 vblank_count_inc,
+ ktime_t t_vblank, u32 last)
{
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
+ struct drm_device *dev = vblank->dev;
assert_spin_locked(&dev->vblank_time_lock);
@@ -277,7 +277,7 @@ static void drm_vblank_crtc_reset_timestamp(struct drm_vblank_crtc *vblank)
* +1 to make sure user will never see the same
* vblank counter value before and after a modeset
*/
- store_vblank(dev, pipe, 1, t_vblank, cur_vblank);
+ drm_vblank_crtc_store(vblank, 1, t_vblank, cur_vblank);
spin_unlock(&dev->vblank_time_lock);
}
@@ -384,7 +384,7 @@ static void drm_vblank_crtc_update_count(struct drm_vblank_crtc *vblank,
if (!rc && !in_vblank_irq)
t_vblank = 0;
- store_vblank(dev, pipe, diff, t_vblank, cur_vblank);
+ drm_vblank_crtc_store(vblank, diff, t_vblank, cur_vblank);
}
u64 drm_vblank_crtc_count(struct drm_vblank_crtc *vblank)
@@ -395,8 +395,8 @@ u64 drm_vblank_crtc_count(struct drm_vblank_crtc *vblank)
/*
* This read barrier corresponds to the implicit write barrier of the
- * write seqlock in store_vblank(). Note that this is the only place
- * where we need an explicit barrier, since all other access goes
+ * write seqlock in drm_vblank_crtc_store(). Note that this is the only
+ * place where we need an explicit barrier, since all other access goes
* through drm_vblank_crtc_count_and_time(), which already has the
* required read barrier curtesy of the read seqlock.
*/
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 17/25] drm/vblank: pass vblank to drm_vblank_enable()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (15 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 16/25] drm/vblank: pass vblank to store_vblank() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 18/25] drm/vblank: merge drm_vblank_restore() into drm_crtc_vblank_restore() Jani Nikula
` (8 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the vblank pointer instead of a dev, pipe pair to simplify code.
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 81224946df9d..e4c8af7fb5db 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -1165,9 +1165,10 @@ static int __enable_vblank(struct drm_device *dev, unsigned int pipe)
return -EINVAL;
}
-static int drm_vblank_enable(struct drm_device *dev, unsigned int pipe)
+static int drm_vblank_enable(struct drm_vblank_crtc *vblank)
{
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
+ struct drm_device *dev = vblank->dev;
+ unsigned int pipe = vblank->pipe;
int ret = 0;
assert_spin_locked(&dev->vbl_lock);
@@ -1207,7 +1208,6 @@ static int drm_vblank_enable(struct drm_device *dev, unsigned int pipe)
int drm_vblank_crtc_get(struct drm_vblank_crtc *vblank)
{
struct drm_device *dev = vblank->dev;
- int pipe = vblank->pipe;
unsigned long irqflags;
int ret = 0;
@@ -1217,7 +1217,7 @@ int drm_vblank_crtc_get(struct drm_vblank_crtc *vblank)
spin_lock_irqsave(&dev->vbl_lock, irqflags);
/* Going from 0->1 means we have to enable interrupts again */
if (atomic_add_return(1, &vblank->refcount) == 1) {
- ret = drm_vblank_enable(dev, pipe);
+ ret = drm_vblank_enable(vblank);
} else {
if (!vblank->enabled) {
atomic_dec(&vblank->refcount);
@@ -1499,7 +1499,7 @@ void drm_crtc_vblank_on_config(struct drm_crtc *crtc,
* user wishes vblank interrupts to be enabled all the time.
*/
if (atomic_read(&vblank->refcount) != 0 || !vblank->config.offdelay_ms)
- drm_WARN_ON(dev, drm_vblank_enable(dev, pipe));
+ drm_WARN_ON(dev, drm_vblank_enable(vblank));
spin_unlock_irq(&dev->vbl_lock);
}
EXPORT_SYMBOL(drm_crtc_vblank_on_config);
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 18/25] drm/vblank: merge drm_vblank_restore() into drm_crtc_vblank_restore()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (16 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 17/25] drm/vblank: pass vblank to drm_vblank_enable() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 19/25] drm/vblank: add drm_crtc_from_vblank() helper Jani Nikula
` (7 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
The extra function serves no useful purpose.
This allows us to drop another superfluous pipe check warning.
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 57 +++++++++++++++---------------------
1 file changed, 23 insertions(+), 34 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index e4c8af7fb5db..ad44fea4ff67 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -1527,23 +1527,41 @@ void drm_crtc_vblank_on(struct drm_crtc *crtc)
}
EXPORT_SYMBOL(drm_crtc_vblank_on);
-static void drm_vblank_restore(struct drm_device *dev, unsigned int pipe)
+/**
+ * drm_crtc_vblank_restore - estimate missed vblanks and update vblank count.
+ * @crtc: CRTC in question
+ *
+ * Power manamement features can cause frame counter resets between vblank
+ * disable and enable. Drivers can use this function in their
+ * &drm_crtc_funcs.enable_vblank implementation to estimate missed vblanks since
+ * the last &drm_crtc_funcs.disable_vblank using timestamps and update the
+ * vblank counter.
+ *
+ * Note that drivers must have race-free high-precision timestamping support,
+ * i.e. &drm_crtc_funcs.get_vblank_timestamp must be hooked up and
+ * &drm_vblank_crtc_config.disable_immediate must be set to indicate the
+ * time-stamping functions are race-free against vblank hardware counter
+ * increments.
+ */
+void drm_crtc_vblank_restore(struct drm_crtc *crtc)
{
+ struct drm_device *dev = crtc->dev;
+ unsigned int pipe = drm_crtc_index(crtc);
+ struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
ktime_t t_vblank;
- struct drm_vblank_crtc *vblank;
int framedur_ns;
u64 diff_ns;
u32 cur_vblank, diff = 1;
int count = DRM_TIMESTAMP_MAXRETRIES;
u32 max_vblank_count = drm_max_vblank_count(dev, pipe);
- if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
- return;
+ drm_WARN_ON_ONCE(dev, !crtc->funcs->get_vblank_timestamp);
+ drm_WARN_ON_ONCE(dev, vblank->inmodeset);
+ drm_WARN_ON_ONCE(dev, !vblank->config.disable_immediate);
assert_spin_locked(&dev->vbl_lock);
assert_spin_locked(&dev->vblank_time_lock);
- vblank = drm_vblank_crtc(dev, pipe);
drm_WARN_ONCE(dev,
drm_debug_enabled(DRM_UT_VBL) && !vblank->framedur_ns,
"Cannot compute missed vblanks without frame duration\n");
@@ -1564,35 +1582,6 @@ static void drm_vblank_restore(struct drm_device *dev, unsigned int pipe)
diff, diff_ns, framedur_ns, cur_vblank - vblank->last);
vblank->last = (cur_vblank - diff) & max_vblank_count;
}
-
-/**
- * drm_crtc_vblank_restore - estimate missed vblanks and update vblank count.
- * @crtc: CRTC in question
- *
- * Power manamement features can cause frame counter resets between vblank
- * disable and enable. Drivers can use this function in their
- * &drm_crtc_funcs.enable_vblank implementation to estimate missed vblanks since
- * the last &drm_crtc_funcs.disable_vblank using timestamps and update the
- * vblank counter.
- *
- * Note that drivers must have race-free high-precision timestamping support,
- * i.e. &drm_crtc_funcs.get_vblank_timestamp must be hooked up and
- * &drm_vblank_crtc_config.disable_immediate must be set to indicate the
- * time-stamping functions are race-free against vblank hardware counter
- * increments.
- */
-void drm_crtc_vblank_restore(struct drm_crtc *crtc)
-{
- struct drm_device *dev = crtc->dev;
- unsigned int pipe = drm_crtc_index(crtc);
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
-
- drm_WARN_ON_ONCE(dev, !crtc->funcs->get_vblank_timestamp);
- drm_WARN_ON_ONCE(dev, vblank->inmodeset);
- drm_WARN_ON_ONCE(dev, !vblank->config.disable_immediate);
-
- drm_vblank_restore(dev, pipe);
-}
EXPORT_SYMBOL(drm_crtc_vblank_restore);
static int drm_vblank_crtc_queue_event(struct drm_vblank_crtc *vblank,
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 19/25] drm/vblank: add drm_crtc_from_vblank() helper
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (17 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 18/25] drm/vblank: merge drm_vblank_restore() into drm_crtc_vblank_restore() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 20/25] drm/vblank: pass vblank to __get_vblank_counter() and drm_max_vblank_count() Jani Nikula
` (6 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
We have a handful of places where we need to get the crtc from the
vblank. Add a small helper for it.
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index ad44fea4ff67..d43165ee594a 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -188,6 +188,11 @@ drm_crtc_vblank_crtc(struct drm_crtc *crtc)
}
EXPORT_SYMBOL(drm_crtc_vblank_crtc);
+static struct drm_crtc *drm_crtc_from_vblank(struct drm_vblank_crtc *vblank)
+{
+ return drm_crtc_from_index(vblank->dev, vblank->pipe);
+}
+
static void drm_vblank_crtc_store(struct drm_vblank_crtc *vblank,
u32 vblank_count_inc,
ktime_t t_vblank, u32 last)
@@ -1608,7 +1613,7 @@ static int drm_vblank_crtc_queue_event(struct drm_vblank_crtc *vblank,
e->event.vbl.user_data = vblwait->request.signal;
e->event.vbl.crtc_id = 0;
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
- struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe);
+ struct drm_crtc *crtc = drm_crtc_from_vblank(vblank);
if (crtc)
e->event.vbl.crtc_id = crtc->base.id;
@@ -1858,7 +1863,7 @@ static void drm_vblank_crtc_handle_events(struct drm_vblank_crtc *vblank)
{
struct drm_device *dev = vblank->dev;
unsigned int pipe = vblank->pipe;
- struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe);
+ struct drm_crtc *crtc = drm_crtc_from_vblank(vblank);
bool high_prec = false;
struct drm_pending_vblank_event *e, *t;
ktime_t now;
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 20/25] drm/vblank: pass vblank to __get_vblank_counter() and drm_max_vblank_count()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (18 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 19/25] drm/vblank: add drm_crtc_from_vblank() helper Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 21/25] drm/vblank: pass vblank to __{enable, disable}_vblank() Jani Nikula
` (5 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the vblank pointer instead of a dev, pipe pair to simplify
code. Rename the functions to drm_vblank_crtc_get_counter() and
drm_vblank_crtc_max_count().
v2: Rename (Thomas)
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 34 +++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index d43165ee594a..04c75cdbb916 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -209,27 +209,27 @@ static void drm_vblank_crtc_store(struct drm_vblank_crtc *vblank,
write_sequnlock(&vblank->seqlock);
}
-static u32 drm_max_vblank_count(struct drm_device *dev, unsigned int pipe)
+static u32 drm_vblank_crtc_max_count(struct drm_vblank_crtc *vblank)
{
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
-
- return vblank->max_vblank_count ?: dev->max_vblank_count;
+ return vblank->max_vblank_count ?: vblank->dev->max_vblank_count;
}
/*
* "No hw counter" fallback implementation of .get_vblank_counter() hook,
* if there is no usable hardware frame counter available.
*/
-static u32 drm_vblank_no_hw_counter(struct drm_device *dev, unsigned int pipe)
+static u32 drm_vblank_crtc_no_hw_counter(struct drm_vblank_crtc *vblank)
{
- drm_WARN_ON_ONCE(dev, drm_max_vblank_count(dev, pipe) != 0);
+ drm_WARN_ON_ONCE(vblank->dev, drm_vblank_crtc_max_count(vblank) != 0);
return 0;
}
-static u32 __get_vblank_counter(struct drm_device *dev, unsigned int pipe)
+static u32 drm_vblank_crtc_get_counter(struct drm_vblank_crtc *vblank)
{
+ struct drm_device *dev = vblank->dev;
+
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
- struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe);
+ struct drm_crtc *crtc = drm_crtc_from_vblank(vblank);
if (drm_WARN_ON(dev, !crtc))
return 0;
@@ -238,7 +238,7 @@ static u32 __get_vblank_counter(struct drm_device *dev, unsigned int pipe)
return crtc->funcs->get_vblank_counter(crtc);
}
- return drm_vblank_no_hw_counter(dev, pipe);
+ return drm_vblank_crtc_no_hw_counter(vblank);
}
/*
@@ -266,9 +266,9 @@ static void drm_vblank_crtc_reset_timestamp(struct drm_vblank_crtc *vblank)
* when drm_vblank_enable() applies the diff
*/
do {
- cur_vblank = __get_vblank_counter(dev, pipe);
+ cur_vblank = drm_vblank_crtc_get_counter(vblank);
rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, false);
- } while (cur_vblank != __get_vblank_counter(dev, pipe) && --count > 0);
+ } while (cur_vblank != drm_vblank_crtc_get_counter(vblank) && --count > 0);
/*
* Only reinitialize corresponding vblank timestamp if high-precision query
@@ -309,7 +309,7 @@ static void drm_vblank_crtc_update_count(struct drm_vblank_crtc *vblank,
ktime_t t_vblank;
int count = DRM_TIMESTAMP_MAXRETRIES;
int framedur_ns = vblank->framedur_ns;
- u32 max_vblank_count = drm_max_vblank_count(dev, pipe);
+ u32 max_vblank_count = drm_vblank_crtc_max_count(vblank);
/*
* Interrupts were disabled prior to this call, so deal with counter
@@ -324,9 +324,9 @@ static void drm_vblank_crtc_update_count(struct drm_vblank_crtc *vblank,
* corresponding vblank timestamp.
*/
do {
- cur_vblank = __get_vblank_counter(dev, pipe);
+ cur_vblank = drm_vblank_crtc_get_counter(vblank);
rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, in_vblank_irq);
- } while (cur_vblank != __get_vblank_counter(dev, pipe) && --count > 0);
+ } while (cur_vblank != drm_vblank_crtc_get_counter(vblank) && --count > 0);
if (max_vblank_count) {
/* trust the hw counter when it's around */
@@ -1558,7 +1558,7 @@ void drm_crtc_vblank_restore(struct drm_crtc *crtc)
u64 diff_ns;
u32 cur_vblank, diff = 1;
int count = DRM_TIMESTAMP_MAXRETRIES;
- u32 max_vblank_count = drm_max_vblank_count(dev, pipe);
+ u32 max_vblank_count = drm_vblank_crtc_max_count(vblank);
drm_WARN_ON_ONCE(dev, !crtc->funcs->get_vblank_timestamp);
drm_WARN_ON_ONCE(dev, vblank->inmodeset);
@@ -1573,9 +1573,9 @@ void drm_crtc_vblank_restore(struct drm_crtc *crtc)
framedur_ns = vblank->framedur_ns;
do {
- cur_vblank = __get_vblank_counter(dev, pipe);
+ cur_vblank = drm_vblank_crtc_get_counter(vblank);
drm_get_last_vbltimestamp(dev, pipe, &t_vblank, false);
- } while (cur_vblank != __get_vblank_counter(dev, pipe) && --count > 0);
+ } while (cur_vblank != drm_vblank_crtc_get_counter(vblank) && --count > 0);
diff_ns = ktime_to_ns(ktime_sub(t_vblank, vblank->time));
if (framedur_ns)
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 21/25] drm/vblank: pass vblank to __{enable, disable}_vblank()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (19 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 20/25] drm/vblank: pass vblank to __get_vblank_counter() and drm_max_vblank_count() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 22/25] drm/vblank: pass vblank to drm_get_last_vbltimestamp() Jani Nikula
` (4 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the vblank pointer instead of a dev, pipe pair to simplify code.
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 04c75cdbb916..52fa4ca361e3 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -443,10 +443,12 @@ u64 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc)
}
EXPORT_SYMBOL(drm_crtc_accurate_vblank_count);
-static void __disable_vblank(struct drm_device *dev, unsigned int pipe)
+static void __disable_vblank(struct drm_vblank_crtc *vblank)
{
+ struct drm_device *dev = vblank->dev;
+
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
- struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe);
+ struct drm_crtc *crtc = drm_crtc_from_vblank(vblank);
if (drm_WARN_ON(dev, !crtc))
return;
@@ -491,7 +493,7 @@ void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe)
* between drm_crtc_vblank_on() and drm_crtc_vblank_off().
*/
drm_vblank_crtc_update_count(vblank, false);
- __disable_vblank(dev, pipe);
+ __disable_vblank(vblank);
vblank->enabled = false;
out:
@@ -1155,10 +1157,12 @@ void drm_crtc_send_vblank_event(struct drm_crtc *crtc,
}
EXPORT_SYMBOL(drm_crtc_send_vblank_event);
-static int __enable_vblank(struct drm_device *dev, unsigned int pipe)
+static int __enable_vblank(struct drm_vblank_crtc *vblank)
{
+ struct drm_device *dev = vblank->dev;
+
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
- struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe);
+ struct drm_crtc *crtc = drm_crtc_from_vblank(vblank);
if (drm_WARN_ON(dev, !crtc))
return 0;
@@ -1188,7 +1192,7 @@ static int drm_vblank_enable(struct drm_vblank_crtc *vblank)
* timestamps. Filtercode in drm_handle_vblank() will
* prevent double-accounting of same vblank interval.
*/
- ret = __enable_vblank(dev, pipe);
+ ret = __enable_vblank(vblank);
drm_dbg_core(dev, "enabling vblank on crtc %u, ret: %d\n",
pipe, ret);
if (ret) {
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 22/25] drm/vblank: pass vblank to drm_get_last_vbltimestamp()
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (20 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 21/25] drm/vblank: pass vblank to __{enable, disable}_vblank() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 23/25] drm/vblank: pass vblank to drm_vblank_disable_and_save(), make static Jani Nikula
` (3 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the vblank pointer instead of a dev, pipe pair to simplify
code. Rename to drm_vblank_crtc_get_last_timestamp().
v2: Rename (Thomas)
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 20 ++++++++------------
1 file changed, 8 insertions(+), 12 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 52fa4ca361e3..4a88cdea086d 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -162,9 +162,8 @@
*/
#define DRM_REDUNDANT_VBLIRQ_THRESH_NS 1000000
-static bool
-drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
- ktime_t *tvblank, bool in_vblank_irq);
+static bool drm_vblank_crtc_get_last_timestamp(struct drm_vblank_crtc *vblank,
+ ktime_t *tvblank, bool in_vblank_irq);
static unsigned int drm_timestamp_precision = 20; /* Default to 20 usecs. */
@@ -253,7 +252,6 @@ static u32 drm_vblank_crtc_get_counter(struct drm_vblank_crtc *vblank)
static void drm_vblank_crtc_reset_timestamp(struct drm_vblank_crtc *vblank)
{
struct drm_device *dev = vblank->dev;
- unsigned int pipe = vblank->pipe;
u32 cur_vblank;
bool rc;
ktime_t t_vblank;
@@ -267,7 +265,7 @@ static void drm_vblank_crtc_reset_timestamp(struct drm_vblank_crtc *vblank)
*/
do {
cur_vblank = drm_vblank_crtc_get_counter(vblank);
- rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, false);
+ rc = drm_vblank_crtc_get_last_timestamp(vblank, &t_vblank, false);
} while (cur_vblank != drm_vblank_crtc_get_counter(vblank) && --count > 0);
/*
@@ -325,7 +323,7 @@ static void drm_vblank_crtc_update_count(struct drm_vblank_crtc *vblank,
*/
do {
cur_vblank = drm_vblank_crtc_get_counter(vblank);
- rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, in_vblank_irq);
+ rc = drm_vblank_crtc_get_last_timestamp(vblank, &t_vblank, in_vblank_irq);
} while (cur_vblank != drm_vblank_crtc_get_counter(vblank) && --count > 0);
if (max_vblank_count) {
@@ -911,11 +909,10 @@ drm_crtc_get_last_vbltimestamp(struct drm_crtc *crtc, ktime_t *tvblank,
return ret;
}
-static bool
-drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
- ktime_t *tvblank, bool in_vblank_irq)
+static bool drm_vblank_crtc_get_last_timestamp(struct drm_vblank_crtc *vblank,
+ ktime_t *tvblank, bool in_vblank_irq)
{
- struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe);
+ struct drm_crtc *crtc = drm_crtc_from_vblank(vblank);
return drm_crtc_get_last_vbltimestamp(crtc, tvblank, in_vblank_irq);
}
@@ -1555,7 +1552,6 @@ EXPORT_SYMBOL(drm_crtc_vblank_on);
void drm_crtc_vblank_restore(struct drm_crtc *crtc)
{
struct drm_device *dev = crtc->dev;
- unsigned int pipe = drm_crtc_index(crtc);
struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
ktime_t t_vblank;
int framedur_ns;
@@ -1578,7 +1574,7 @@ void drm_crtc_vblank_restore(struct drm_crtc *crtc)
do {
cur_vblank = drm_vblank_crtc_get_counter(vblank);
- drm_get_last_vbltimestamp(dev, pipe, &t_vblank, false);
+ drm_vblank_crtc_get_last_timestamp(vblank, &t_vblank, false);
} while (cur_vblank != drm_vblank_crtc_get_counter(vblank) && --count > 0);
diff_ns = ktime_to_ns(ktime_sub(t_vblank, vblank->time));
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 23/25] drm/vblank: pass vblank to drm_vblank_disable_and_save(), make static
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (21 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 22/25] drm/vblank: pass vblank to drm_get_last_vbltimestamp() Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 24/25] drm/vblank: reduce pipe checks Jani Nikula
` (2 subsequent siblings)
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the vblank pointer instead of a dev, pipe pair to simplify
code. Rename to drm_vblank_crtc_disable_and_save().
drm_vblank_disable_and_save() is also no longer used outside of
drm_vblank.c; make it static while at it.
v2: Rename (Thomas)
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_internal.h | 1 -
drivers/gpu/drm/drm_vblank.c | 8 ++++----
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
index 6e7ac5b16d92..4458221685f7 100644
--- a/drivers/gpu/drm/drm_internal.h
+++ b/drivers/gpu/drm/drm_internal.h
@@ -111,7 +111,6 @@ static inline bool drm_vblank_passed(u64 seq, u64 ref)
return (seq - ref) <= (1 << 23);
}
-void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe);
int drm_vblank_crtc_get(struct drm_vblank_crtc *vblank);
void drm_vblank_crtc_put(struct drm_vblank_crtc *vblank);
u64 drm_vblank_crtc_count(struct drm_vblank_crtc *vblank);
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 4a88cdea086d..445b62b8b661 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -462,9 +462,9 @@ static void __disable_vblank(struct drm_vblank_crtc *vblank)
* are preserved, even if there are any spurious vblank irq's after
* disable.
*/
-void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe)
+static void drm_vblank_crtc_disable_and_save(struct drm_vblank_crtc *vblank)
{
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
+ struct drm_device *dev = vblank->dev;
unsigned long irqflags;
assert_spin_locked(&dev->vbl_lock);
@@ -509,7 +509,7 @@ static void vblank_disable_fn(struct timer_list *t)
spin_lock_irqsave(&dev->vbl_lock, irqflags);
if (atomic_read(&vblank->refcount) == 0 && vblank->enabled) {
drm_dbg_core(dev, "disabling vblank on crtc %u\n", pipe);
- drm_vblank_disable_and_save(dev, pipe);
+ drm_vblank_crtc_disable_and_save(vblank);
}
spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
}
@@ -1358,7 +1358,7 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
/* Avoid redundant vblank disables without previous
* drm_crtc_vblank_on(). */
if (drm_core_check_feature(dev, DRIVER_ATOMIC) || !vblank->inmodeset)
- drm_vblank_disable_and_save(dev, pipe);
+ drm_vblank_crtc_disable_and_save(vblank);
wake_up(&vblank->queue);
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 24/25] drm/vblank: reduce pipe checks
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (22 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 23/25] drm/vblank: pass vblank to drm_vblank_disable_and_save(), make static Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-05 11:27 ` [PATCH v3 25/25] drm/vblank: clean up debug logging Jani Nikula
2025-12-08 15:18 ` [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Now that drm_vblank_crtc() is the only place that indexes dev->vblank[],
and its usage has reduced considerably, add the primary pipe
out-of-bounds check there, and return NULL. Expect callers to check it
and act accordingly.
In drm_crtc_vblank_crtc(), warn and return NULL, and let it go boom. If
the crtc->pipe is out of bounds, it's a driver error that needs to be
fixed.
Remove superfluous pipe checks all around.
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 36 +++++++++++++++---------------------
1 file changed, 15 insertions(+), 21 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 445b62b8b661..ba16981a5b1e 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -177,13 +177,22 @@ MODULE_PARM_DESC(timestamp_precision_usec, "Max. error on timestamps [usecs]");
static struct drm_vblank_crtc *
drm_vblank_crtc(struct drm_device *dev, unsigned int pipe)
{
+ if (pipe >= dev->num_crtcs)
+ return NULL;
+
return &dev->vblank[pipe];
}
struct drm_vblank_crtc *
drm_crtc_vblank_crtc(struct drm_crtc *crtc)
{
- return drm_vblank_crtc(crtc->dev, drm_crtc_index(crtc));
+ struct drm_vblank_crtc *vblank;
+
+ vblank = drm_vblank_crtc(crtc->dev, drm_crtc_index(crtc));
+ if (drm_WARN_ON(crtc->dev, !vblank))
+ return NULL;
+
+ return vblank;
}
EXPORT_SYMBOL(drm_crtc_vblank_crtc);
@@ -631,7 +640,6 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc,
const struct drm_display_mode *mode)
{
struct drm_device *dev = crtc->dev;
- unsigned int pipe = drm_crtc_index(crtc);
struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
int linedur_ns = 0, framedur_ns = 0;
int dotclock = mode->crtc_clock;
@@ -639,9 +647,6 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc,
if (!drm_dev_has_vblank(dev))
return;
- if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
- return;
-
/* Valid dotclock? */
if (dotclock > 0) {
int frame_size = mode->crtc_htotal * mode->crtc_vtotal;
@@ -723,11 +728,6 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
int vpos, hpos, i;
int delta_ns, duration_ns;
- if (pipe >= dev->num_crtcs) {
- drm_err(dev, "Invalid crtc %u\n", pipe);
- return false;
- }
-
/* Scanout position query not supported? Should not happen. */
if (!get_scanout_position) {
drm_err(dev, "Called from CRTC w/o get_scanout_position()!?\n");
@@ -1342,9 +1342,6 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
ktime_t now;
u64 seq;
- if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
- return;
-
/*
* Grab event_lock early to prevent vblank work from being scheduled
* while we're in the middle of shutting down vblank interrupts
@@ -1483,9 +1480,6 @@ void drm_crtc_vblank_on_config(struct drm_crtc *crtc,
unsigned int pipe = drm_crtc_index(crtc);
struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
- if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
- return;
-
spin_lock_irq(&dev->vbl_lock);
drm_dbg_vbl(dev, "crtc %d, vblank enabled %d, inmodeset %d\n",
pipe, vblank->enabled, vblank->inmodeset);
@@ -1767,10 +1761,9 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
pipe = pipe_index;
}
- if (pipe >= dev->num_crtcs)
- return -EINVAL;
-
vblank = drm_vblank_crtc(dev, pipe);
+ if (!vblank)
+ return -EINVAL;
/* If the counter is currently enabled and accurate, short-circuit
* queries to return the cached timestamp of the last vblank.
@@ -1905,14 +1898,15 @@ static void drm_vblank_crtc_handle_events(struct drm_vblank_crtc *vblank)
*/
bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe)
{
- struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
+ struct drm_vblank_crtc *vblank;
unsigned long irqflags;
bool disable_irq;
if (drm_WARN_ON_ONCE(dev, !drm_dev_has_vblank(dev)))
return false;
- if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+ vblank = drm_vblank_crtc(dev, pipe);
+ if (drm_WARN_ON(dev, !vblank))
return false;
spin_lock_irqsave(&dev->event_lock, irqflags);
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 25/25] drm/vblank: clean up debug logging
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (23 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 24/25] drm/vblank: reduce pipe checks Jani Nikula
@ 2025-12-05 11:27 ` Jani Nikula
2025-12-08 15:18 ` [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-05 11:27 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe, jani.nikula
Use the usual [CRTC:%d:%s] when crtc is available. Start using a new
uniform [VBLANK:%u] prefix with the pipe when crtc is not
available. Remove extra line breaks. Use string choice helpers here and
there. Use %pe to decode error returns.
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_vblank.c | 109 ++++++++++++++++-------------------
1 file changed, 50 insertions(+), 59 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index ba16981a5b1e..653ee422e697 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -27,6 +27,7 @@
#include <linux/export.h>
#include <linux/kthread.h>
#include <linux/moduleparam.h>
+#include <linux/string_choices.h>
#include <drm/drm_crtc.h>
#include <drm/drm_drv.h>
@@ -347,14 +348,13 @@ static void drm_vblank_crtc_update_count(struct drm_vblank_crtc *vblank,
* frame/field duration.
*/
- drm_dbg_vbl(dev, "crtc %u: Calculating number of vblanks."
- " diff_ns = %lld, framedur_ns = %d)\n",
+ drm_dbg_vbl(dev, "[VBLANK:%u] Calculating number of vblanks. diff_ns = %lld, framedur_ns = %d)\n",
pipe, (long long)diff_ns, framedur_ns);
diff = DIV_ROUND_CLOSEST_ULL(diff_ns, framedur_ns);
if (diff == 0 && in_vblank_irq)
- drm_dbg_vbl(dev, "crtc %u: Redundant vblirq ignored\n",
+ drm_dbg_vbl(dev, "[VBLANK:%u] Redundant vblirq ignored\n",
pipe);
} else {
/* some kind of default for drivers w/o accurate vbl timestamping */
@@ -372,13 +372,12 @@ static void drm_vblank_crtc_update_count(struct drm_vblank_crtc *vblank,
*/
if (diff > 1 && (vblank->inmodeset & 0x2)) {
drm_dbg_vbl(dev,
- "clamping vblank bump to 1 on crtc %u: diffr=%u"
- " due to pre-modeset.\n", pipe, diff);
+ "[VBLANK:%u] clamping vblank bump to 1: diffr=%u due to pre-modeset.\n",
+ pipe, diff);
diff = 1;
}
- drm_dbg_vbl(dev, "updating vblank count on crtc %u:"
- " current=%llu, diff=%u, hw=%u hw_last=%u\n",
+ drm_dbg_vbl(dev, "[VBLANK:%u] updating vblank count: current=%llu, diff=%u, hw=%u hw_last=%u\n",
pipe, (unsigned long long)atomic64_read(&vblank->count),
diff, cur_vblank, vblank->last);
@@ -517,7 +516,7 @@ static void vblank_disable_fn(struct timer_list *t)
spin_lock_irqsave(&dev->vbl_lock, irqflags);
if (atomic_read(&vblank->refcount) == 0 && vblank->enabled) {
- drm_dbg_core(dev, "disabling vblank on crtc %u\n", pipe);
+ drm_dbg_core(dev, "[VBLANK:%u] disabling vblank\n", pipe);
drm_vblank_crtc_disable_and_save(vblank);
}
spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
@@ -665,8 +664,8 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc,
if (mode->flags & DRM_MODE_FLAG_INTERLACE)
framedur_ns /= 2;
} else {
- drm_err(dev, "crtc %u: Can't calculate constants, dotclock = 0!\n",
- crtc->base.id);
+ drm_err(dev, "[CRTC:%d:%s] Can't calculate constants, dotclock = 0!\n",
+ crtc->base.id, crtc->name);
}
vblank->linedur_ns = linedur_ns;
@@ -674,11 +673,11 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc,
drm_mode_copy(&vblank->hwmode, mode);
drm_dbg_core(dev,
- "crtc %u: hwmode: htotal %d, vtotal %d, vdisplay %d\n",
- crtc->base.id, mode->crtc_htotal,
+ "[CRTC:%d:%s] hwmode: htotal %d, vtotal %d, vdisplay %d\n",
+ crtc->base.id, crtc->name, mode->crtc_htotal,
mode->crtc_vtotal, mode->crtc_vdisplay);
- drm_dbg_core(dev, "crtc %u: clock %d kHz framedur %d linedur %d\n",
- crtc->base.id, dotclock, framedur_ns, linedur_ns);
+ drm_dbg_core(dev, "[CRTC:%d:%s] clock %d kHz framedur %d linedur %d\n",
+ crtc->base.id, crtc->name, dotclock, framedur_ns, linedur_ns);
}
EXPORT_SYMBOL(drm_calc_timestamping_constants);
@@ -730,7 +729,8 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
/* Scanout position query not supported? Should not happen. */
if (!get_scanout_position) {
- drm_err(dev, "Called from CRTC w/o get_scanout_position()!?\n");
+ drm_err(dev, "[CRTC:%d:%s] Called from CRTC w/o get_scanout_position()!?\n",
+ crtc->base.id, crtc->name);
return false;
}
@@ -746,7 +746,7 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
* Happens during initial modesetting of a crtc.
*/
if (mode->crtc_clock == 0) {
- drm_dbg_core(dev, "crtc %u: Noop due to uninitialized mode.\n",
+ drm_dbg_core(dev, "[VBLANK:%u] Noop due to uninitialized mode.\n",
pipe);
drm_WARN_ON_ONCE(dev, drm_drv_uses_atomic_modeset(dev));
return false;
@@ -771,9 +771,8 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
/* Return as no-op if scanout query unsupported or failed. */
if (!vbl_status) {
- drm_dbg_core(dev,
- "crtc %u : scanoutpos query failed.\n",
- pipe);
+ drm_dbg_core(dev, "[CRTC:%d:%s] scanoutpos query failed.\n",
+ crtc->base.id, crtc->name);
return false;
}
@@ -787,9 +786,8 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
/* Noisy system timing? */
if (i == DRM_TIMESTAMP_MAXRETRIES) {
- drm_dbg_core(dev,
- "crtc %u: Noisy timestamp %d us > %d us [%d reps].\n",
- pipe, duration_ns / 1000, *max_error / 1000, i);
+ drm_dbg_core(dev, "[CRTC:%d:%s] Noisy timestamp %d us > %d us [%d reps].\n",
+ crtc->base.id, crtc->name, duration_ns / 1000, *max_error / 1000, i);
}
/* Return upper bound of timestamp precision error. */
@@ -813,9 +811,8 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
ts_etime = ktime_to_timespec64(etime);
ts_vblank_time = ktime_to_timespec64(*vblank_time);
- drm_dbg_vbl(dev,
- "crtc %u : v p(%d,%d)@ %lld.%06ld -> %lld.%06ld [e %d us, %d rep]\n",
- pipe, hpos, vpos,
+ drm_dbg_vbl(dev, "[CRTC:%d:%s] v p(%d,%d)@ %lld.%06ld -> %lld.%06ld [e %d us, %d rep]\n",
+ crtc->base.id, crtc->name, hpos, vpos,
(u64)ts_etime.tv_sec, ts_etime.tv_nsec / 1000,
(u64)ts_vblank_time.tv_sec, ts_vblank_time.tv_nsec / 1000,
duration_ns / 1000, i);
@@ -1190,7 +1187,7 @@ static int drm_vblank_enable(struct drm_vblank_crtc *vblank)
* prevent double-accounting of same vblank interval.
*/
ret = __enable_vblank(vblank);
- drm_dbg_core(dev, "enabling vblank on crtc %u, ret: %d\n",
+ drm_dbg_core(dev, "[VBLANK:%u] enabling vblank, ret: %d\n",
pipe, ret);
if (ret) {
atomic_dec(&vblank->refcount);
@@ -1349,8 +1346,9 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
spin_lock_irq(&dev->event_lock);
spin_lock(&dev->vbl_lock);
- drm_dbg_vbl(dev, "crtc %d, vblank enabled %d, inmodeset %d\n",
- pipe, vblank->enabled, vblank->inmodeset);
+ drm_dbg_vbl(dev, "[CRTC:%d:%s] vblank %s, inmodeset: %s\n",
+ crtc->base.id, crtc->name, str_enabled_disabled(vblank->enabled),
+ str_yes_no(vblank->inmodeset));
/* Avoid redundant vblank disables without previous
* drm_crtc_vblank_on(). */
@@ -1375,9 +1373,8 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
if (e->pipe != pipe)
continue;
- drm_dbg_core(dev, "Sending premature vblank event on disable: "
- "wanted %llu, current %llu\n",
- e->sequence, seq);
+ drm_dbg_core(dev, "[CRTC:%d:%s] Sending premature vblank event on disable: wanted %llu, current %llu\n",
+ crtc->base.id, crtc->name, e->sequence, seq);
list_del(&e->base.link);
drm_vblank_crtc_put(vblank);
send_vblank_event(dev, e, seq, now);
@@ -1477,12 +1474,12 @@ void drm_crtc_vblank_on_config(struct drm_crtc *crtc,
const struct drm_vblank_crtc_config *config)
{
struct drm_device *dev = crtc->dev;
- unsigned int pipe = drm_crtc_index(crtc);
struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
spin_lock_irq(&dev->vbl_lock);
- drm_dbg_vbl(dev, "crtc %d, vblank enabled %d, inmodeset %d\n",
- pipe, vblank->enabled, vblank->inmodeset);
+ drm_dbg_vbl(dev, "[CRTC:%d:%s] vblank %s, inmodeset: %s\n",
+ crtc->base.id, crtc->name, str_enabled_disabled(vblank->enabled),
+ str_yes_no(vblank->inmodeset));
vblank->config = *config;
@@ -1576,8 +1573,8 @@ void drm_crtc_vblank_restore(struct drm_crtc *crtc)
diff = DIV_ROUND_CLOSEST_ULL(diff_ns, framedur_ns);
- drm_dbg_vbl(dev,
- "missed %d vblanks in %lld ns, frame duration=%d ns, hw_diff=%d\n",
+ drm_dbg_vbl(dev, "[CRTC:%d:%s] missed %d vblanks in %lld ns, frame duration=%d ns, hw_diff=%d\n",
+ crtc->base.id, crtc->name,
diff, diff_ns, framedur_ns, cur_vblank - vblank->last);
vblank->last = (cur_vblank - diff) & max_vblank_count;
}
@@ -1634,8 +1631,8 @@ static int drm_vblank_crtc_queue_event(struct drm_vblank_crtc *vblank,
seq = drm_vblank_crtc_count_and_time(vblank, &now);
- drm_dbg_core(dev, "event on vblank count %llu, current %llu, crtc %u\n",
- req_seq, seq, pipe);
+ drm_dbg_core(dev, "[VBLANK:%u] event on vblank count %llu, current %llu\n",
+ pipe, req_seq, seq);
trace_drm_vblank_event_queued(file_priv, pipe, req_seq);
@@ -1731,8 +1728,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
if (vblwait->request.type &
~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
_DRM_VBLANK_HIGH_CRTC_MASK)) {
- drm_dbg_core(dev,
- "Unsupported type value 0x%x, supported mask 0x%x\n",
+ drm_dbg_core(dev, "Unsupported type value 0x%x, supported mask 0x%x\n",
vblwait->request.type,
(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
_DRM_VBLANK_HIGH_CRTC_MASK));
@@ -1777,9 +1773,8 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
ret = drm_vblank_crtc_get(vblank);
if (ret) {
- drm_dbg_core(dev,
- "crtc %d failed to acquire vblank counter, %d\n",
- pipe, ret);
+ drm_dbg_core(dev, "[VBLANK:%u] failed to acquire vblank counter %pe\n",
+ pipe, ERR_PTR(ret));
return ret;
}
seq = drm_vblank_crtc_count(vblank);
@@ -1815,8 +1810,8 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
if (req_seq != seq) {
int wait;
- drm_dbg_core(dev, "waiting on vblank count %llu, crtc %u\n",
- req_seq, pipe);
+ drm_dbg_core(dev, "[VBLANK:%d] waiting on vblank count %llu\n",
+ pipe, req_seq);
wait = wait_event_interruptible_timeout(vblank->queue,
drm_vblank_passed(drm_vblank_crtc_count(vblank), req_seq) ||
!READ_ONCE(vblank->enabled),
@@ -1840,10 +1835,10 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
if (ret != -EINTR) {
drm_vblank_crtc_wait_reply(vblank, &vblwait->reply);
- drm_dbg_core(dev, "crtc %d returning %u to client\n",
+ drm_dbg_core(dev, "[VBLANK:%u] returning %u to client\n",
pipe, vblwait->reply.sequence);
} else {
- drm_dbg_core(dev, "crtc %d vblank wait interrupted by signal\n",
+ drm_dbg_core(dev, "[VBLANK:%u] vblank wait interrupted by signal\n",
pipe);
}
@@ -1872,8 +1867,8 @@ static void drm_vblank_crtc_handle_events(struct drm_vblank_crtc *vblank)
if (!drm_vblank_passed(seq, e->sequence))
continue;
- drm_dbg_core(dev, "vblank event on %llu, current %llu\n",
- e->sequence, seq);
+ drm_dbg_core(dev, "[VBLANK:%u] vblank event on %llu, current %llu\n",
+ pipe, e->sequence, seq);
list_del(&e->base.link);
drm_vblank_crtc_put(vblank);
@@ -1990,7 +1985,6 @@ int drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data,
{
struct drm_crtc *crtc;
struct drm_vblank_crtc *vblank;
- int pipe;
struct drm_crtc_get_sequence *get_seq = data;
ktime_t now;
bool vblank_enabled;
@@ -2006,8 +2000,6 @@ int drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data,
if (!crtc)
return -ENOENT;
- pipe = drm_crtc_index(crtc);
-
vblank = drm_crtc_vblank_crtc(crtc);
vblank_enabled = READ_ONCE(vblank->config.disable_immediate) &&
READ_ONCE(vblank->enabled);
@@ -2015,9 +2007,8 @@ int drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data,
if (!vblank_enabled) {
ret = drm_crtc_vblank_get(crtc);
if (ret) {
- drm_dbg_core(dev,
- "crtc %d failed to acquire vblank counter, %d\n",
- pipe, ret);
+ drm_dbg_core(dev, "[CRTC:%d:%s] failed to acquire vblank counter %pe\n",
+ crtc->base.id, crtc->name, ERR_PTR(ret));
return ret;
}
}
@@ -2082,9 +2073,8 @@ int drm_crtc_queue_sequence_ioctl(struct drm_device *dev, void *data,
ret = drm_crtc_vblank_get(crtc);
if (ret) {
- drm_dbg_core(dev,
- "crtc %d failed to acquire vblank counter, %d\n",
- pipe, ret);
+ drm_dbg_core(dev, "[CRTC:%d:%s] failed to acquire vblank counter %pe\n",
+ crtc->base.id, crtc->name, ERR_PTR(ret));
goto err_free;
}
@@ -2169,7 +2159,8 @@ static enum hrtimer_restart drm_vblank_timer_function(struct hrtimer *timer)
ret_overrun = hrtimer_forward_now(&vtimer->timer, interval);
if (ret_overrun != 1)
- drm_dbg_vbl(dev, "vblank timer overrun\n");
+ drm_dbg_vbl(dev, "[CRTC:%d:%s] vblank timer overrun\n",
+ crtc->base.id, crtc->name);
if (crtc_funcs->handle_vblank_timeout)
succ = crtc_funcs->handle_vblank_timeout(crtc);
--
2.47.3
^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [PATCH v3 00/25] drm/vblank: refactoring and cleanups
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (24 preceding siblings ...)
2025-12-05 11:27 ` [PATCH v3 25/25] drm/vblank: clean up debug logging Jani Nikula
@ 2025-12-08 15:18 ` Jani Nikula
25 siblings, 0 replies; 27+ messages in thread
From: Jani Nikula @ 2025-12-08 15:18 UTC (permalink / raw)
To: dri-devel; +Cc: tzimmermann, intel-gfx, intel-xe
On Fri, 05 Dec 2025, Jani Nikula <jani.nikula@intel.com> wrote:
> v3 of [1], just a resend to dri-devel, which I forgot to add, and
> Thomas' R-b's, which I also forgot to add, in v2.
>
> Fingers crossed I don't fumble it this time.
Yeah well, didn't fumble as such, but kunit breaks all over the place
with this. There are so many places that subtly call the interfaces when
there are no vblanks.
I tried to fix it, but looks like the only sane way is to add
drm_dev_has_vblank(dev) checks at the highest level functions and return
early. Back to the drawing board a bit. Maybe I'll send some of the
early patches separately.
BR,
Jani.
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 27+ messages in thread
end of thread, other threads:[~2025-12-08 15:18 UTC | newest]
Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-05 11:27 [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
2025-12-05 11:27 ` [PATCH v3 01/25] drm/vblank: Unexport drm_wait_one_vblank() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 02/25] drm/vblank: remove drm_wait_one_vblank() completely Jani Nikula
2025-12-05 11:27 ` [PATCH v3 03/25] drm/vblank: remove superfluous pipe check Jani Nikula
2025-12-05 11:27 ` [PATCH v3 04/25] drm/vblank: add return value to drm_crtc_wait_one_vblank() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 05/25] drm/vblank: limit vblank variable scope to atomic Jani Nikula
2025-12-05 11:27 ` [PATCH v3 06/25] drm/vblank: use the drm_vblank_crtc() and drm_crtc_vblank_crtc() helpers more Jani Nikula
2025-12-05 11:27 ` [PATCH v3 07/25] drm/vblank: prefer drm_crtc_vblank_crtc() over drm_vblank_crtc() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 08/25] drm/vblank: pass vlank to drm_vblank_get()/_put()/_count() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 09/25] drm/vblank: pass vblank to drm_update_vblank_count() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 10/25] drm/vblank: pass vblank to drm_handle_vblank_events() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 11/25] drm/vblank: use the vblank based interfaces more Jani Nikula
2025-12-05 11:27 ` [PATCH v3 12/25] drm/vblank: pass vblank to drm_queue_vblank_event() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 13/25] drm/vblank: pass vblank to drm_wait_vblank_reply() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 14/25] drm/vblank: pass vblank to drm_vblank_count_and_time() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 15/25] drm/vblank: pass vblank to drm_reset_vblank_timestamp() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 16/25] drm/vblank: pass vblank to store_vblank() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 17/25] drm/vblank: pass vblank to drm_vblank_enable() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 18/25] drm/vblank: merge drm_vblank_restore() into drm_crtc_vblank_restore() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 19/25] drm/vblank: add drm_crtc_from_vblank() helper Jani Nikula
2025-12-05 11:27 ` [PATCH v3 20/25] drm/vblank: pass vblank to __get_vblank_counter() and drm_max_vblank_count() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 21/25] drm/vblank: pass vblank to __{enable, disable}_vblank() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 22/25] drm/vblank: pass vblank to drm_get_last_vbltimestamp() Jani Nikula
2025-12-05 11:27 ` [PATCH v3 23/25] drm/vblank: pass vblank to drm_vblank_disable_and_save(), make static Jani Nikula
2025-12-05 11:27 ` [PATCH v3 24/25] drm/vblank: reduce pipe checks Jani Nikula
2025-12-05 11:27 ` [PATCH v3 25/25] drm/vblank: clean up debug logging Jani Nikula
2025-12-08 15:18 ` [PATCH v3 00/25] drm/vblank: refactoring and cleanups Jani Nikula
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).