Skip to content

Commit

Permalink
drm/xe/display: handle HPD polling in display runtime suspend/resume
Browse files Browse the repository at this point in the history
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)

v4: rebased

Reviewed-by: Arun R Murthy <[email protected]>
Signed-off-by: Vinod Govindapillai <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
  • Loading branch information
vgovind2 committed Aug 23, 2024
1 parent 1228241 commit 66a0f6b
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 3 deletions.
23 changes: 23 additions & 0 deletions drivers/gpu/drm/xe/display/xe_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -354,6 +366,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)
Expand Down
4 changes: 4 additions & 0 deletions drivers/gpu/drm/xe/display/xe_display.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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_ */
8 changes: 5 additions & 3 deletions drivers/gpu/drm/xe/xe_pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 66a0f6b

Please sign in to comment.