On Mon, May 25, 2026 at 02:05:53PM +0300, Jani Nikula wrote:
> xe_display_flush_cleanup_work() is a bit of an oddball function in xe
> display code. There shouldn't be anything this specific or xe
> specific. While I'm not sure what the correct refactor for the function
> should be, move it to shared display code for starters, next to the
> eerily similar but slightly different intel_has_pending_fb_unpin() that
> is only called from i915 core.
> 
> The main goal here is to unblock some refactors on
> for_each_intel_crtc().
> 
> v2: Add FIXME comment (Ville)
> 
> Signed-off-by: Jani Nikula <[email protected]>
> ---
>  drivers/gpu/drm/i915/display/intel_display.c | 22 ++++++++++++++++
>  drivers/gpu/drm/i915/display/intel_display.h |  1 +
>  drivers/gpu/drm/xe/display/xe_display.c      | 27 +++-----------------
>  3 files changed, 26 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
> b/drivers/gpu/drm/i915/display/intel_display.c
> index 6c8935f69db1..a6cee0f81358 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -737,6 +737,28 @@ bool intel_has_pending_fb_unpin(struct intel_display 
> *display)
>       return false;
>  }
>  
> +/* FIXME: All callers need to be audited and unified between i915 and xe */

That makes me think we want to keep this. I was more thinking of
something like
/* FIXME remove this and just flush the cleanup wq where appropriate */

> +void intel_display_flush_cleanup_work(struct intel_display *display)
> +{
> +     struct intel_crtc *crtc;
> +
> +     for_each_intel_crtc(display->drm, crtc) {
> +             struct drm_crtc_commit *commit;
> +
> +             spin_lock(&crtc->base.commit_lock);
> +             commit = list_first_entry_or_null(&crtc->base.commit_list,
> +                                               struct drm_crtc_commit, 
> commit_entry);
> +             if (commit)
> +                     drm_crtc_commit_get(commit);
> +             spin_unlock(&crtc->base.commit_lock);
> +
> +             if (commit) {
> +                     wait_for_completion(&commit->cleanup_done);
> +                     drm_crtc_commit_put(commit);
> +             }
> +     }
> +}
> +
>  /*
>   * Finds the encoder associated with the given CRTC. This can only be
>   * used when we know that the CRTC isn't feeding multiple encoders!
> diff --git a/drivers/gpu/drm/i915/display/intel_display.h 
> b/drivers/gpu/drm/i915/display/intel_display.h
> index 45a90d2fe6ec..72f33113a5a3 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.h
> +++ b/drivers/gpu/drm/i915/display/intel_display.h
> @@ -402,6 +402,7 @@ void intel_disable_transcoder(const struct 
> intel_crtc_state *old_crtc_state);
>  void i830_enable_pipe(struct intel_display *display, enum pipe pipe);
>  void i830_disable_pipe(struct intel_display *display, enum pipe pipe);
>  bool intel_has_pending_fb_unpin(struct intel_display *display);
> +void intel_display_flush_cleanup_work(struct intel_display *display);
>  void intel_encoder_destroy(struct drm_encoder *encoder);
>  struct drm_display_mode *
>  intel_encoder_current_mode(struct intel_encoder *encoder);
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c 
> b/drivers/gpu/drm/xe/display/xe_display.c
> index 8d08da60336d..a5066de3d789 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -244,27 +244,6 @@ static bool suspend_to_idle(void)
>       return false;
>  }
>  
> -static void xe_display_flush_cleanup_work(struct xe_device *xe)
> -{
> -     struct intel_crtc *crtc;
> -
> -     for_each_intel_crtc(&xe->drm, crtc) {
> -             struct drm_crtc_commit *commit;
> -
> -             spin_lock(&crtc->base.commit_lock);
> -             commit = list_first_entry_or_null(&crtc->base.commit_list,
> -                                               struct drm_crtc_commit, 
> commit_entry);
> -             if (commit)
> -                     drm_crtc_commit_get(commit);
> -             spin_unlock(&crtc->base.commit_lock);
> -
> -             if (commit) {
> -                     wait_for_completion(&commit->cleanup_done);
> -                     drm_crtc_commit_put(commit);
> -             }
> -     }
> -}
> -
>  static void xe_display_enable_d3cold(struct xe_device *xe)
>  {
>       struct intel_display *display = xe->display;
> @@ -278,7 +257,7 @@ static void xe_display_enable_d3cold(struct xe_device *xe)
>        */
>       intel_power_domains_disable(display);
>  
> -     xe_display_flush_cleanup_work(xe);
> +     intel_display_flush_cleanup_work(display);
>  
>       intel_opregion_suspend(display, PCI_D3cold);
>  
> @@ -333,7 +312,7 @@ void xe_display_pm_suspend(struct xe_device *xe)
>               intel_display_driver_suspend(display);
>       }
>  
> -     xe_display_flush_cleanup_work(xe);
> +     intel_display_flush_cleanup_work(display);
>  
>       intel_encoder_block_all_hpds(display);
>  
> @@ -365,7 +344,7 @@ void xe_display_pm_shutdown(struct xe_device *xe)
>               intel_display_driver_suspend(display);
>       }
>  
> -     xe_display_flush_cleanup_work(xe);
> +     intel_display_flush_cleanup_work(display);
>       intel_dp_mst_suspend(display);
>       intel_encoder_block_all_hpds(display);
>       intel_hpd_cancel_work(display);
> -- 
> 2.47.3

-- 
Ville Syrjälä
Intel

Reply via email to