Move more of the d3cold logic into display runtime pm functions. Add intel_parent_d3cold_allowed() to query whether d3cold is allowed or not.
Signed-off-by: Jani Nikula <[email protected]> --- .../drm/i915/display/intel_display_driver.c | 18 ++++++++++++++-- .../drm/i915/display/intel_display_driver.h | 2 -- drivers/gpu/drm/i915/display/intel_parent.c | 5 +++++ drivers/gpu/drm/i915/display/intel_parent.h | 1 + drivers/gpu/drm/xe/display/xe_display.c | 21 +++++++------------ include/drm/intel/display_parent_interface.h | 3 +++ 6 files changed, 33 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c index 15ba4c2ac985..0ca5344cd50d 100644 --- a/drivers/gpu/drm/i915/display/intel_display_driver.c +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c @@ -58,6 +58,7 @@ #include "intel_modeset_setup.h" #include "intel_opregion.h" #include "intel_overlay.h" +#include "intel_parent.h" #include "intel_pmdemand.h" #include "intel_pps.h" #include "intel_psr.h" @@ -834,7 +835,7 @@ static bool suspend_to_idle(void) return false; } -void intel_display_driver_pm_enable_d3cold(struct intel_display *display) +static void intel_display_driver_pm_enable_d3cold(struct intel_display *display) { /* * We do a lot of poking in a lot of registers, make sure they work @@ -852,7 +853,7 @@ void intel_display_driver_pm_enable_d3cold(struct intel_display *display) intel_hpd_poll_enable(display); } -void intel_display_driver_pm_disable_d3cold(struct intel_display *display) +static void intel_display_driver_pm_disable_d3cold(struct intel_display *display) { intel_dmc_resume(display); @@ -950,11 +951,19 @@ void intel_display_driver_pm_resume(struct intel_display *display) void intel_display_driver_pm_runtime_suspend(struct intel_display *display) { + if (intel_parent_d3cold_allowed(display)) { + intel_display_driver_pm_enable_d3cold(display); + return; + } + intel_hpd_poll_enable(display); } void intel_display_driver_pm_runtime_suspend_late(struct intel_display *display) { + if (intel_parent_d3cold_allowed(display)) + intel_display_driver_pm_suspend_late(display); + /* * If xe_display_pm_suspend_late() is not called, it is likely * that we will be on dynamic DC states with DMC wakelock enabled. We @@ -965,6 +974,11 @@ void intel_display_driver_pm_runtime_suspend_late(struct intel_display *display) void intel_display_driver_pm_runtime_resume(struct intel_display *display) { + if (intel_parent_d3cold_allowed(display)) { + intel_display_driver_pm_disable_d3cold(display); + return; + } + intel_hpd_init(display); intel_hpd_poll_disable(display); skl_watermark_ipc_update(display); diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h index e4ce17efe793..31e4d7624400 100644 --- a/drivers/gpu/drm/i915/display/intel_display_driver.h +++ b/drivers/gpu/drm/i915/display/intel_display_driver.h @@ -40,8 +40,6 @@ void intel_display_driver_suspend_access(struct intel_display *display); void intel_display_driver_resume_access(struct intel_display *display); bool intel_display_driver_check_access(struct intel_display *display); -void intel_display_driver_pm_enable_d3cold(struct intel_display *display); -void intel_display_driver_pm_disable_d3cold(struct intel_display *display); void intel_display_driver_pm_suspend(struct intel_display *display); void intel_display_driver_pm_suspend_late(struct intel_display *display); void intel_display_driver_pm_resume_early(struct intel_display *display); diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c index a5816561be40..e7acd5231a2e 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.c +++ b/drivers/gpu/drm/i915/display/intel_parent.c @@ -439,6 +439,11 @@ void intel_parent_fence_priority_display(struct intel_display *display, struct d display->parent->fence_priority_display(fence); } +bool intel_parent_d3cold_allowed(struct intel_display *display) +{ + return display->parent->d3cold_allowed && display->parent->d3cold_allowed(display->drm); +} + bool intel_parent_has_auxccs(struct intel_display *display) { return display->parent->has_auxccs && display->parent->has_auxccs(display->drm); diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h index 27e35f891a6b..6f940390aa8d 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.h +++ b/drivers/gpu/drm/i915/display/intel_parent.h @@ -151,6 +151,7 @@ u32 intel_parent_vlv_iosf_read(struct intel_display *display, enum vlv_iosf_sb_u int intel_parent_vlv_iosf_write(struct intel_display *display, enum vlv_iosf_sb_unit unit, u32 addr, u32 val); /* generic */ +bool intel_parent_d3cold_allowed(struct intel_display *display); bool intel_parent_has_auxccs(struct intel_display *display); bool intel_parent_has_fenced_regions(struct intel_display *display); bool intel_parent_vgpu_active(struct intel_display *display); diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c index 6aba5668e4df..68773032c1b8 100644 --- a/drivers/gpu/drm/xe/display/xe_display.c +++ b/drivers/gpu/drm/xe/display/xe_display.c @@ -248,11 +248,6 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe) if (!xe->info.probe_display) return; - if (xe->d3cold.allowed) { - intel_display_driver_pm_enable_d3cold(display); - return; - } - intel_display_driver_pm_runtime_suspend(display); } @@ -273,9 +268,6 @@ void xe_display_pm_runtime_suspend_late(struct xe_device *xe) if (!xe->info.probe_display) return; - if (xe->d3cold.allowed) - intel_display_driver_pm_suspend_late(display); - intel_display_driver_pm_runtime_suspend_late(display); } @@ -316,11 +308,6 @@ void xe_display_pm_runtime_resume(struct xe_device *xe) if (!xe->info.probe_display) return; - if (xe->d3cold.allowed) { - intel_display_driver_pm_disable_d3cold(display); - return; - } - intel_display_driver_pm_runtime_resume(display); } @@ -350,6 +337,13 @@ static const struct intel_display_irq_interface xe_display_irq_interface = { .synchronize = irq_synchronize, }; +static bool d3cold_allowed(struct drm_device *drm) +{ + struct xe_device *xe = to_xe_device(drm); + + return xe->d3cold.allowed; +} + static bool has_auxccs(struct drm_device *drm) { struct xe_device *xe = to_xe_device(drm); @@ -369,6 +363,7 @@ static const struct intel_display_parent_interface parent = { .pcode = &xe_display_pcode_interface, .rpm = &xe_display_rpm_interface, .stolen = &xe_display_stolen_interface, + .d3cold_allowed = d3cold_allowed, .has_auxccs = has_auxccs, }; diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 39991afeb173..8ea1c0dae783 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -294,6 +294,9 @@ struct intel_display_parent_interface { /** @fence_priority_display: Set display priority. Optional. */ void (*fence_priority_display)(struct dma_fence *fence); + /** @d3cold_allowed: Is d3cold allowed. Optional. */ + bool (*d3cold_allowed)(struct drm_device *drm); + /** @has_auxccs: Are AuxCCS formats supported by the parent. Optional. */ bool (*has_auxccs)(struct drm_device *drm); -- 2.47.3
