[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