On 1/23/26 01:05, Hamza Mahfooz wrote:
> There should be a mechanism for drivers to respond to flip_done
> time outs.
I can only see two reasons why you could run into a timeout:
1. A dma_fence never signals.
How that should be handled is already well documented and doesn't
require any of this.
2. A coding error in the vblank or page flip handler leading to waiting forever.
In that case calling back into the driver doesn't help either.
So as far as I can see the whole approach doesn't make any sense at all.
Regards,
Christian.
> Since, as it stands it is possible for the display
> to stall indefinitely, necessitating a hard reset. So, introduce
> a new crtc callback that is called by
> drm_atomic_helper_wait_for_flip_done() to give drivers a shot
> at recovering from page flip timeouts.
>
> Signed-off-by: Hamza Mahfooz <[email protected]>
> ---
> drivers/gpu/drm/drm_atomic_helper.c | 6 +++++-
> include/drm/drm_crtc.h | 9 +++++++++
> 2 files changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c
> b/drivers/gpu/drm/drm_atomic_helper.c
> index 5840e9cc6f66..3a144c324b19 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> @@ -1881,9 +1881,13 @@ void drm_atomic_helper_wait_for_flip_done(struct
> drm_device *dev,
> continue;
>
> ret = wait_for_completion_timeout(&commit->flip_done, 10 * HZ);
> - if (ret == 0)
> + if (!ret) {
> drm_err(dev, "[CRTC:%d:%s] flip_done timed out\n",
> crtc->base.id, crtc->name);
> +
> + if (crtc->funcs->page_flip_timeout)
> + crtc->funcs->page_flip_timeout(crtc);
> + }
> }
>
> if (state->fake_commit)
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 66278ffeebd6..45dc5a76e915 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -609,6 +609,15 @@ struct drm_crtc_funcs {
> uint32_t flags, uint32_t target,
> struct drm_modeset_acquire_ctx *ctx);
>
> + /**
> + * @page_flip_timeout:
> + *
> + * This optional hook is called if &drm_crtc_commit.flip_done times out,
> + * and can be used by drivers to attempt to recover from a page flip
> + * timeout.
> + */
> + void (*page_flip_timeout)(struct drm_crtc *crtc);
> +
> /**
> * @set_property:
> *