* [PATCH v2 01/25] drm/vblank: Unexport drm_wait_one_vblank()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 02/25] drm/vblank: remove drm_wait_one_vblank() completely Jani Nikula
` (25 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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>
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] 34+ messages in thread* [PATCH v2 02/25] drm/vblank: remove drm_wait_one_vblank() completely
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
2025-12-04 10:57 ` [PATCH v2 01/25] drm/vblank: Unexport drm_wait_one_vblank() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 03/25] drm/vblank: remove superfluous pipe check Jani Nikula
` (24 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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] 34+ messages in thread* [PATCH v2 03/25] drm/vblank: remove superfluous pipe check
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
2025-12-04 10:57 ` [PATCH v2 01/25] drm/vblank: Unexport drm_wait_one_vblank() Jani Nikula
2025-12-04 10:57 ` [PATCH v2 02/25] drm/vblank: remove drm_wait_one_vblank() completely Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 04/25] drm/vblank: add return value to drm_crtc_wait_one_vblank() Jani Nikula
` (23 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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] 34+ messages in thread* [PATCH v2 04/25] drm/vblank: add return value to drm_crtc_wait_one_vblank()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (2 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 03/25] drm/vblank: remove superfluous pipe check Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 05/25] drm/vblank: limit vblank variable scope to atomic Jani Nikula
` (22 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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.
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] 34+ messages in thread* [PATCH v2 05/25] drm/vblank: limit vblank variable scope to atomic
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (3 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 04/25] drm/vblank: add return value to drm_crtc_wait_one_vblank() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 06/25] drm/vblank: use the drm_vblank_crtc() and drm_crtc_vblank_crtc() helpers more Jani Nikula
` (21 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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.
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] 34+ messages in thread* [PATCH v2 06/25] drm/vblank: use the drm_vblank_crtc() and drm_crtc_vblank_crtc() helpers more
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (4 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 05/25] drm/vblank: limit vblank variable scope to atomic Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 07/25] drm/vblank: prefer drm_crtc_vblank_crtc() over drm_vblank_crtc() Jani Nikula
` (20 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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] 34+ messages in thread* [PATCH v2 07/25] drm/vblank: prefer drm_crtc_vblank_crtc() over drm_vblank_crtc()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (5 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 06/25] drm/vblank: use the drm_vblank_crtc() and drm_crtc_vblank_crtc() helpers more Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 08/25] drm/vblank: pass vlank to drm_vblank_get()/_put()/_count() Jani Nikula
` (19 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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] 34+ messages in thread* [PATCH v2 08/25] drm/vblank: pass vlank to drm_vblank_get()/_put()/_count()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (6 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 07/25] drm/vblank: prefer drm_crtc_vblank_crtc() over drm_vblank_crtc() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 09/25] drm/vblank: pass vblank to drm_update_vblank_count() Jani Nikula
` (18 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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)
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] 34+ messages in thread* [PATCH v2 09/25] drm/vblank: pass vblank to drm_update_vblank_count()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (7 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 08/25] drm/vblank: pass vlank to drm_vblank_get()/_put()/_count() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 10/25] drm/vblank: pass vblank to drm_handle_vblank_events() Jani Nikula
` (17 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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] 34+ messages in thread* [PATCH v2 10/25] drm/vblank: pass vblank to drm_handle_vblank_events()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (8 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 09/25] drm/vblank: pass vblank to drm_update_vblank_count() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 11/25] drm/vblank: use the vblank based interfaces more Jani Nikula
` (16 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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)
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] 34+ messages in thread* [PATCH v2 11/25] drm/vblank: use the vblank based interfaces more
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (9 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 10/25] drm/vblank: pass vblank to drm_handle_vblank_events() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 12/25] drm/vblank: pass vblank to drm_queue_vblank_event() Jani Nikula
` (15 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, Jani Nikula
With the prep work in place, we can get rid of _drm_vblank_get(),
_drm_vblank_put(), and _drm_vblank_count().
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] 34+ messages in thread* [PATCH v2 12/25] drm/vblank: pass vblank to drm_queue_vblank_event()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (10 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 11/25] drm/vblank: use the vblank based interfaces more Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 13/25] drm/vblank: pass vblank to drm_wait_vblank_reply() Jani Nikula
` (14 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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)
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] 34+ messages in thread* [PATCH v2 13/25] drm/vblank: pass vblank to drm_wait_vblank_reply()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (11 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 12/25] drm/vblank: pass vblank to drm_queue_vblank_event() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 14/25] drm/vblank: pass vblank to drm_vblank_count_and_time() Jani Nikula
` (13 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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)
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] 34+ messages in thread* [PATCH v2 14/25] drm/vblank: pass vblank to drm_vblank_count_and_time()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (12 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 13/25] drm/vblank: pass vblank to drm_wait_vblank_reply() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-05 5:18 ` kernel test robot
2025-12-04 10:57 ` [PATCH v2 15/25] drm/vblank: pass vblank to drm_reset_vblank_timestamp() Jani Nikula
` (12 subsequent siblings)
26 siblings, 1 reply; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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)
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] 34+ messages in thread* Re: [PATCH v2 14/25] drm/vblank: pass vblank to drm_vblank_count_and_time()
2025-12-04 10:57 ` [PATCH v2 14/25] drm/vblank: pass vblank to drm_vblank_count_and_time() Jani Nikula
@ 2025-12-05 5:18 ` kernel test robot
0 siblings, 0 replies; 34+ messages in thread
From: kernel test robot @ 2025-12-05 5:18 UTC (permalink / raw)
To: Jani Nikula, intel-gfx, intel-xe
Cc: llvm, oe-kbuild-all, tzimmermann, ville.syrjala, Jani Nikula
Hi Jani,
kernel test robot noticed the following build warnings:
[auto build test WARNING on drm-misc/drm-misc-next]
[also build test WARNING on drm-i915/for-linux-next drm-tip/drm-tip linus/master next-20251204]
[cannot apply to drm-i915/for-linux-next-fixes v6.18]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Jani-Nikula/drm-vblank-Unexport-drm_wait_one_vblank/20251204-195701
base: https://gitlab.freedesktop.org/drm/misc/kernel.git drm-misc-next
patch link: https://lore.kernel.org/r/2d2d9b12117be566ac63b9e67b79e50de4924ecc.1764845757.git.jani.nikula%40intel.com
patch subject: [PATCH v2 14/25] drm/vblank: pass vblank to drm_vblank_count_and_time()
config: i386-buildonly-randconfig-002-20251205 (https://download.01.org/0day-ci/archive/20251205/202512051216.oxayTqRt-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251205/202512051216.oxayTqRt-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512051216.oxayTqRt-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> Warning: drivers/gpu/drm/drm_vblank.c:956 function parameter 'vblank' not described in 'drm_vblank_crtc_count_and_time'
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v2 15/25] drm/vblank: pass vblank to drm_reset_vblank_timestamp()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (13 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 14/25] drm/vblank: pass vblank to drm_vblank_count_and_time() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 16/25] drm/vblank: pass vblank to store_vblank() Jani Nikula
` (11 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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)
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] 34+ messages in thread* [PATCH v2 16/25] drm/vblank: pass vblank to store_vblank()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (14 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 15/25] drm/vblank: pass vblank to drm_reset_vblank_timestamp() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 17/25] drm/vblank: pass vblank to drm_vblank_enable() Jani Nikula
` (10 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, Jani Nikula
Use the vblank pointer instead of a dev, pipe pair to simplify
code. Rename to drm_vblank_crtc_store().
v2: Rename (Thomas)
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] 34+ messages in thread* [PATCH v2 17/25] drm/vblank: pass vblank to drm_vblank_enable()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (15 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 16/25] drm/vblank: pass vblank to store_vblank() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 18/25] drm/vblank: merge drm_vblank_restore() into drm_crtc_vblank_restore() Jani Nikula
` (9 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, Jani Nikula
Use the vblank pointer instead of a dev, pipe pair to simplify code.
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] 34+ messages in thread* [PATCH v2 18/25] drm/vblank: merge drm_vblank_restore() into drm_crtc_vblank_restore()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (16 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 17/25] drm/vblank: pass vblank to drm_vblank_enable() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 19/25] drm/vblank: add drm_crtc_from_vblank() helper Jani Nikula
` (8 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, Jani Nikula
The extra function serves no useful purpose.
This allows us to drop another superfluous pipe check warning.
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] 34+ messages in thread* [PATCH v2 19/25] drm/vblank: add drm_crtc_from_vblank() helper
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (17 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 18/25] drm/vblank: merge drm_vblank_restore() into drm_crtc_vblank_restore() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 20/25] drm/vblank: pass vblank to __get_vblank_counter() and drm_max_vblank_count() Jani Nikula
` (7 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, Jani Nikula
We have a handful of places where we need to get the crtc from the
vblank. Add a small helper for it.
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] 34+ messages in thread* [PATCH v2 20/25] drm/vblank: pass vblank to __get_vblank_counter() and drm_max_vblank_count()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (18 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 19/25] drm/vblank: add drm_crtc_from_vblank() helper Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 21/25] drm/vblank: pass vblank to __{enable, disable}_vblank() Jani Nikula
` (6 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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)
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] 34+ messages in thread* [PATCH v2 21/25] drm/vblank: pass vblank to __{enable, disable}_vblank()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (19 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 20/25] drm/vblank: pass vblank to __get_vblank_counter() and drm_max_vblank_count() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 22/25] drm/vblank: pass vblank to drm_get_last_vbltimestamp() Jani Nikula
` (5 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, Jani Nikula
Use the vblank pointer instead of a dev, pipe pair to simplify code.
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] 34+ messages in thread* [PATCH v2 22/25] drm/vblank: pass vblank to drm_get_last_vbltimestamp()
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (20 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 21/25] drm/vblank: pass vblank to __{enable, disable}_vblank() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 23/25] drm/vblank: pass vblank to drm_vblank_disable_and_save(), make static Jani Nikula
` (4 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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)
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] 34+ messages in thread* [PATCH v2 23/25] drm/vblank: pass vblank to drm_vblank_disable_and_save(), make static
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (21 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 22/25] drm/vblank: pass vblank to drm_get_last_vbltimestamp() Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 24/25] drm/vblank: reduce pipe checks Jani Nikula
` (3 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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)
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] 34+ messages in thread* [PATCH v2 24/25] drm/vblank: reduce pipe checks
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (22 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 23/25] drm/vblank: pass vblank to drm_vblank_disable_and_save(), make static Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 10:57 ` [PATCH v2 25/25] drm/vblank: clean up debug logging Jani Nikula
` (2 subsequent siblings)
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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.
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] 34+ messages in thread* [PATCH v2 25/25] drm/vblank: clean up debug logging
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (23 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 24/25] drm/vblank: reduce pipe checks Jani Nikula
@ 2025-12-04 10:57 ` Jani Nikula
2025-12-04 12:21 ` ✓ i915.CI.BAT: success for drm/vblank: refactoring and cleanups (rev2) Patchwork
2025-12-04 12:46 ` [PATCH v2 00/25] drm/vblank: refactoring and cleanups Thomas Zimmermann
26 siblings, 0 replies; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 10:57 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: tzimmermann, ville.syrjala, 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.
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] 34+ messages in thread* ✓ i915.CI.BAT: success for drm/vblank: refactoring and cleanups (rev2)
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (24 preceding siblings ...)
2025-12-04 10:57 ` [PATCH v2 25/25] drm/vblank: clean up debug logging Jani Nikula
@ 2025-12-04 12:21 ` Patchwork
2025-12-04 12:46 ` [PATCH v2 00/25] drm/vblank: refactoring and cleanups Thomas Zimmermann
26 siblings, 0 replies; 34+ messages in thread
From: Patchwork @ 2025-12-04 12:21 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
[-- Attachment #1: Type: text/plain, Size: 4611 bytes --]
== Series Details ==
Series: drm/vblank: refactoring and cleanups (rev2)
URL : https://patchwork.freedesktop.org/series/157331/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_17633 -> Patchwork_157331v2
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_157331v2/index.html
Participating hosts (45 -> 44)
------------------------------
Missing (1): fi-snb-2520m
Known issues
------------
Here are the changes found in Patchwork_157331v2 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@i915_selftest@live@workarounds:
- bat-mtlp-6: [PASS][1] -> [DMESG-FAIL][2] ([i915#12061]) +1 other test dmesg-fail
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17633/bat-mtlp-6/igt@i915_selftest@live@workarounds.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_157331v2/bat-mtlp-6/igt@i915_selftest@live@workarounds.html
- bat-dg2-14: [PASS][3] -> [DMESG-FAIL][4] ([i915#12061]) +1 other test dmesg-fail
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17633/bat-dg2-14/igt@i915_selftest@live@workarounds.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_157331v2/bat-dg2-14/igt@i915_selftest@live@workarounds.html
#### Possible fixes ####
* igt@i915_selftest@live:
- bat-arlh-2: [INCOMPLETE][5] ([i915#14837]) -> [PASS][6]
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17633/bat-arlh-2/igt@i915_selftest@live.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_157331v2/bat-arlh-2/igt@i915_selftest@live.html
* igt@i915_selftest@live@gt_engines:
- bat-arlh-2: [INCOMPLETE][7] -> [PASS][8]
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17633/bat-arlh-2/igt@i915_selftest@live@gt_engines.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_157331v2/bat-arlh-2/igt@i915_selftest@live@gt_engines.html
* igt@i915_selftest@live@workarounds:
- bat-arlh-3: [DMESG-FAIL][9] ([i915#12061]) -> [PASS][10] +1 other test pass
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17633/bat-arlh-3/igt@i915_selftest@live@workarounds.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_157331v2/bat-arlh-3/igt@i915_selftest@live@workarounds.html
- bat-dg2-9: [DMESG-FAIL][11] ([i915#12061]) -> [PASS][12] +1 other test pass
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17633/bat-dg2-9/igt@i915_selftest@live@workarounds.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_157331v2/bat-dg2-9/igt@i915_selftest@live@workarounds.html
- bat-mtlp-9: [DMESG-FAIL][13] ([i915#12061]) -> [PASS][14] +1 other test pass
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17633/bat-mtlp-9/igt@i915_selftest@live@workarounds.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_157331v2/bat-mtlp-9/igt@i915_selftest@live@workarounds.html
#### Warnings ####
* igt@i915_selftest@live:
- bat-atsm-1: [DMESG-FAIL][15] ([i915#12061] / [i915#13929]) -> [DMESG-FAIL][16] ([i915#12061] / [i915#14204])
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17633/bat-atsm-1/igt@i915_selftest@live.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_157331v2/bat-atsm-1/igt@i915_selftest@live.html
* igt@i915_selftest@live@mman:
- bat-atsm-1: [DMESG-FAIL][17] ([i915#13929]) -> [DMESG-FAIL][18] ([i915#14204])
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17633/bat-atsm-1/igt@i915_selftest@live@mman.html
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_157331v2/bat-atsm-1/igt@i915_selftest@live@mman.html
[i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
[i915#13929]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13929
[i915#14204]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14204
[i915#14837]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14837
Build changes
-------------
* Linux: CI_DRM_17633 -> Patchwork_157331v2
CI-20190529: 20190529
CI_DRM_17633: 4eb27c4b4b45606c79769918ab8736249f94035a @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_8654: 38d9fde0432aa6f2bf6add062f1d4334ad467fbc @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
Patchwork_157331v2: 4eb27c4b4b45606c79769918ab8736249f94035a @ git://anongit.freedesktop.org/gfx-ci/linux
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_157331v2/index.html
[-- Attachment #2: Type: text/html, Size: 5954 bytes --]
^ permalink raw reply [flat|nested] 34+ messages in thread* Re: [PATCH v2 00/25] drm/vblank: refactoring and cleanups
2025-12-04 10:57 [PATCH v2 00/25] drm/vblank: refactoring and cleanups Jani Nikula
` (25 preceding siblings ...)
2025-12-04 12:21 ` ✓ i915.CI.BAT: success for drm/vblank: refactoring and cleanups (rev2) Patchwork
@ 2025-12-04 12:46 ` Thomas Zimmermann
2025-12-04 12:57 ` Jani Nikula
26 siblings, 1 reply; 34+ messages in thread
From: Thomas Zimmermann @ 2025-12-04 12:46 UTC (permalink / raw)
To: Jani Nikula, intel-gfx, intel-xe; +Cc: ville.syrjala
Hi
Am 04.12.25 um 11:57 schrieb Jani Nikula:
> v2 of [1], hopefully addressing all review comments.
I gave an r-b to most of the patches in v1 of this series. Why didn't
you keep those?
Best regards
Thomas
>
> BR,
> Jani.
>
>
> [1] https://lore.kernel.org/r/cover.1762791343.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(-)
>
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg)
^ permalink raw reply [flat|nested] 34+ messages in thread* Re: [PATCH v2 00/25] drm/vblank: refactoring and cleanups
2025-12-04 12:46 ` [PATCH v2 00/25] drm/vblank: refactoring and cleanups Thomas Zimmermann
@ 2025-12-04 12:57 ` Jani Nikula
2025-12-04 13:06 ` Thomas Zimmermann
0 siblings, 1 reply; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 12:57 UTC (permalink / raw)
To: Thomas Zimmermann, intel-gfx, intel-xe; +Cc: ville.syrjala
On Thu, 04 Dec 2025, Thomas Zimmermann <tzimmermann@suse.de> wrote:
> Hi
>
> Am 04.12.25 um 11:57 schrieb Jani Nikula:
>> v2 of [1], hopefully addressing all review comments.
>
> I gave an r-b to most of the patches in v1 of this series. Why didn't
> you keep those?
Aww crap, sorry, I meant to, but forgot. :(
BR,
Jani.
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH v2 00/25] drm/vblank: refactoring and cleanups
2025-12-04 12:57 ` Jani Nikula
@ 2025-12-04 13:06 ` Thomas Zimmermann
2025-12-04 13:07 ` Thomas Zimmermann
0 siblings, 1 reply; 34+ messages in thread
From: Thomas Zimmermann @ 2025-12-04 13:06 UTC (permalink / raw)
To: Jani Nikula, intel-gfx, intel-xe; +Cc: ville.syrjala
Hi
Am 04.12.25 um 13:57 schrieb Jani Nikula:
> On Thu, 04 Dec 2025, Thomas Zimmermann <tzimmermann@suse.de> wrote:
>> Hi
>>
>> Am 04.12.25 um 11:57 schrieb Jani Nikula:
>>> v2 of [1], hopefully addressing all review comments.
>> I gave an r-b to most of the patches in v1 of this series. Why didn't
>> you keep those?
> Aww crap, sorry, I meant to, but forgot. :(
I see. I looked through the rename changes. Seems good. For the whole series
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Thanks for this cleanup.
Best regards
Thomas
>
> BR,
> Jani.
>
>
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg)
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH v2 00/25] drm/vblank: refactoring and cleanups
2025-12-04 13:06 ` Thomas Zimmermann
@ 2025-12-04 13:07 ` Thomas Zimmermann
2025-12-04 13:12 ` Jani Nikula
0 siblings, 1 reply; 34+ messages in thread
From: Thomas Zimmermann @ 2025-12-04 13:07 UTC (permalink / raw)
To: Jani Nikula, intel-gfx, intel-xe; +Cc: ville.syrjala
And another thing I noticed is that this series didn't go to dri-devel.
Am 04.12.25 um 14:06 schrieb Thomas Zimmermann:
> Hi
>
> Am 04.12.25 um 13:57 schrieb Jani Nikula:
>> On Thu, 04 Dec 2025, Thomas Zimmermann <tzimmermann@suse.de> wrote:
>>> Hi
>>>
>>> Am 04.12.25 um 11:57 schrieb Jani Nikula:
>>>> v2 of [1], hopefully addressing all review comments.
>>> I gave an r-b to most of the patches in v1 of this series. Why didn't
>>> you keep those?
>> Aww crap, sorry, I meant to, but forgot. :(
>
> I see. I looked through the rename changes. Seems good. For the whole
> series
>
> Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
>
> Thanks for this cleanup.
>
> Best regards
> Thomas
>
>>
>> BR,
>> Jani.
>>
>>
>
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg)
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH v2 00/25] drm/vblank: refactoring and cleanups
2025-12-04 13:07 ` Thomas Zimmermann
@ 2025-12-04 13:12 ` Jani Nikula
2025-12-04 13:15 ` Thomas Zimmermann
0 siblings, 1 reply; 34+ messages in thread
From: Jani Nikula @ 2025-12-04 13:12 UTC (permalink / raw)
To: Thomas Zimmermann, intel-gfx, intel-xe; +Cc: ville.syrjala
On Thu, 04 Dec 2025, Thomas Zimmermann <tzimmermann@suse.de> wrote:
> And another thing I noticed is that this series didn't go to dri-devel.
*facepalm*
Should I just resend the entire series?
>> Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Thanks a lot for the reviews, and sorry about the goof-ups.
BR,
Jani.
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH v2 00/25] drm/vblank: refactoring and cleanups
2025-12-04 13:12 ` Jani Nikula
@ 2025-12-04 13:15 ` Thomas Zimmermann
0 siblings, 0 replies; 34+ messages in thread
From: Thomas Zimmermann @ 2025-12-04 13:15 UTC (permalink / raw)
To: Jani Nikula, intel-gfx, intel-xe; +Cc: ville.syrjala
Hi
Am 04.12.25 um 14:12 schrieb Jani Nikula:
> On Thu, 04 Dec 2025, Thomas Zimmermann <tzimmermann@suse.de> wrote:
>> And another thing I noticed is that this series didn't go to dri-devel.
> *facepalm*
Happens :)
>
> Should I just resend the entire series?
I'd include the r-bs and send it as v3 to dri-devel and the others.
Best regards
Thomas
>
>>> Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
> Thanks a lot for the reviews, and sorry about the goof-ups.
>
> BR,
> Jani.
>
>
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg)
^ permalink raw reply [flat|nested] 34+ messages in thread