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

Reply via email to