[PATCH v3 3/3] drm/xe/display: handle HPD polling in display runtime suspend/resume

Murthy, Arun R arun.r.murthy at intel.com
Fri Aug 23 05:30:18 UTC 2024



> -----Original Message-----
> From: Govindapillai, Vinod <vinod.govindapillai at intel.com>
> Sent: Tuesday, August 20, 2024 10:44 PM
> To: intel-xe at lists.freedesktop.org
> Cc: Govindapillai, Vinod <vinod.govindapillai at intel.com>; Deak, Imre
> <imre.deak at intel.com>; Murthy, Arun R <arun.r.murthy at intel.com>; Vivi,
> Rodrigo <rodrigo.vivi at intel.com>; Shankar, Uma <uma.shankar at intel.com>;
> ville.syrala at intel.com
> Subject: [PATCH v3 3/3] drm/xe/display: handle HPD polling in display runtime
> suspend/resume
> 
> In XE, display runtime suspend / resume routines are called only if d3cold is
> allowed. This makes the driver unable to detect any HPDs once the device goes
> into runtime suspend state in platforms like LNL. Update the display runtime
> suspend / resume routines to include HPD polling regardless of d3cold status.
> 
> While xe_display_pm_suspend/resume() performs steps during runtime
> suspend/resume that shouldn't happen, like suspending MST and they are
> missing other steps like enabling DC9, this patchset is meant to keep the current
> behavior wrt. these, leaving the corresponding updates for a follow-up
> 
> v2: have a separate function for display runtime s/r (Rodrigo)
> 
> v3: better streamlining of system s/r and runtime s/r calls (Imre)
> 
> Signed-off-by: Vinod Govindapillai <vinod.govindapillai at intel.com>
> ---

Reviewed-by: Arun R Murthy <arun.r.murthy at intel.com>

Thanks and Regards,
Arun R Murthy
--------------------

>  drivers/gpu/drm/xe/display/xe_display.c | 23 +++++++++++++++++++++++
> drivers/gpu/drm/xe/display/xe_display.h |  4 ++++
>  drivers/gpu/drm/xe/xe_pm.c              |  8 +++++---
>  3 files changed, 32 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c
> b/drivers/gpu/drm/xe/display/xe_display.c
> index b2a0b4b5c45c..3dc55edd390a 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -308,6 +308,18 @@ static void xe_display_flush_cleanup_work(struct
> xe_device *xe)
>  	}
>  }
> 
> +/* TODO: System and runtime suspend/resume sequences will be sanitized
> +as a follow-up. */ void xe_display_pm_runtime_suspend(struct xe_device
> +*xe) {
> +	if (!xe->info.probe_display)
> +		return;
> +
> +	if (xe->d3cold.allowed)
> +		xe_display_pm_suspend(xe, true);
> +
> +	intel_hpd_poll_enable(xe);
> +}
> +
>  void xe_display_pm_suspend(struct xe_device *xe, bool runtime)  {
>  	struct intel_display *display = &xe->display; @@ -355,6 +367,17 @@
> void xe_display_pm_suspend_late(struct xe_device *xe)
>  	intel_display_power_suspend_late(xe);
>  }
> 
> +void xe_display_pm_runtime_resume(struct xe_device *xe) {
> +	if (!xe->info.probe_display)
> +		return;
> +
> +	intel_hpd_poll_disable(xe);
> +
> +	if (xe->d3cold.allowed)
> +		xe_display_pm_resume(xe, true);
> +}
> +
>  void xe_display_pm_resume_early(struct xe_device *xe)  {
>  	if (!xe->info.probe_display)
> diff --git a/drivers/gpu/drm/xe/display/xe_display.h
> b/drivers/gpu/drm/xe/display/xe_display.h
> index 000fb5799df5..53d727fd792b 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.h
> +++ b/drivers/gpu/drm/xe/display/xe_display.h
> @@ -38,6 +38,8 @@ void xe_display_pm_suspend(struct xe_device *xe, bool
> runtime);  void xe_display_pm_suspend_late(struct xe_device *xe);  void
> xe_display_pm_resume_early(struct xe_device *xe);  void
> xe_display_pm_resume(struct xe_device *xe, bool runtime);
> +void xe_display_pm_runtime_suspend(struct xe_device *xe); void
> +xe_display_pm_runtime_resume(struct xe_device *xe);
> 
>  #else
> 
> @@ -67,6 +69,8 @@ static inline void xe_display_pm_suspend(struct xe_device
> *xe, bool runtime) {}  static inline void xe_display_pm_suspend_late(struct
> xe_device *xe) {}  static inline void xe_display_pm_resume_early(struct
> xe_device *xe) {}  static inline void xe_display_pm_resume(struct xe_device *xe,
> bool runtime) {}
> +static inline void xe_display_pm_runtime_suspend(struct xe_device *xe)
> +{} static inline void xe_display_pm_runtime_resume(struct xe_device
> +*xe) {}
> 
>  #endif /* CONFIG_DRM_XE_DISPLAY */
>  #endif /* _XE_DISPLAY_H_ */
> diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c index
> fcfb49af8c89..c247e1cb8aba 100644
> --- a/drivers/gpu/drm/xe/xe_pm.c
> +++ b/drivers/gpu/drm/xe/xe_pm.c
> @@ -366,9 +366,9 @@ int xe_pm_runtime_suspend(struct xe_device *xe)
>  		xe_bo_runtime_pm_release_mmap_offset(bo);
>  	mutex_unlock(&xe->mem_access.vram_userfault.lock);
> 
> -	if (xe->d3cold.allowed) {
> -		xe_display_pm_suspend(xe, true);
> +	xe_display_pm_runtime_suspend(xe);
> 
> +	if (xe->d3cold.allowed) {
>  		err = xe_bo_evict_all(xe);
>  		if (err)
>  			goto out;
> @@ -431,12 +431,14 @@ int xe_pm_runtime_resume(struct xe_device *xe)
>  	for_each_gt(gt, xe, id)
>  		xe_gt_resume(gt);
> 
> +	xe_display_pm_runtime_resume(xe);
> +
>  	if (xe->d3cold.allowed) {
> -		xe_display_pm_resume(xe, true);
>  		err = xe_bo_restore_user(xe);
>  		if (err)
>  			goto out;
>  	}
> +
>  out:
>  	lock_map_release(&xe_pm_runtime_lockdep_map);
>  	xe_pm_write_callback_task(xe, NULL);
> --
> 2.34.1



More information about the Intel-xe mailing list