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:
>        *

Reply via email to