Add wakeref tracking for display power domain references taken for
enabled CRTCs.

Cc: Chris Wilson <ch...@chris-wilson.co.uk>
Signed-off-by: Imre Deak <imre.d...@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c  | 38 ++++++++-----------
 .../drm/i915/display/intel_display_types.h    |  2 +-
 2 files changed, 17 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index d80d15d96d4c..a6043197171b 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7575,25 +7575,25 @@ modeset_get_crtc_power_domains(struct intel_crtc_state 
*crtc_state)
        enum intel_display_power_domain domain;
        u64 domains, new_domains, old_domains;
 
-       old_domains = crtc->enabled_power_domains;
-       crtc->enabled_power_domains = new_domains =
-               get_crtc_power_domains(crtc_state);
+       domains = get_crtc_power_domains(crtc_state);
 
-       domains = new_domains & ~old_domains;
+       new_domains = domains & ~crtc->enabled_power_domains.mask;
+       old_domains = crtc->enabled_power_domains.mask & ~domains;
 
-       for_each_power_domain(domain, domains)
-               intel_display_power_get(dev_priv, domain);
+       for_each_power_domain(domain, new_domains)
+               intel_display_power_get_in_set(dev_priv,
+                                              &crtc->enabled_power_domains,
+                                              domain);
 
-       return old_domains & ~new_domains;
+       return old_domains;
 }
 
-static void modeset_put_power_domains(struct drm_i915_private *dev_priv,
-                                     u64 domains)
+static void modeset_put_crtc_power_domains(struct intel_crtc *crtc,
+                                          u64 domains)
 {
-       enum intel_display_power_domain domain;
-
-       for_each_power_domain(domain, domains)
-               intel_display_power_put_unchecked(dev_priv, domain);
+       intel_display_power_put_mask_in_set(to_i915(crtc->base.dev),
+                                           &crtc->enabled_power_domains,
+                                           domains);
 }
 
 static void valleyview_crtc_enable(struct intel_atomic_state *state,
@@ -7789,12 +7789,10 @@ static void intel_crtc_disable_noatomic(struct 
intel_crtc *crtc,
                to_intel_dbuf_state(dev_priv->dbuf.obj.state);
        struct intel_crtc_state *crtc_state =
                to_intel_crtc_state(crtc->base.state);
-       enum intel_display_power_domain domain;
        struct intel_plane *plane;
        struct drm_atomic_state *state;
        struct intel_crtc_state *temp_crtc_state;
        enum pipe pipe = crtc->pipe;
-       u64 domains;
        int ret;
 
        if (!crtc_state->hw.active)
@@ -7850,10 +7848,7 @@ static void intel_crtc_disable_noatomic(struct 
intel_crtc *crtc,
        intel_update_watermarks(crtc);
        intel_disable_shared_dpll(crtc_state);
 
-       domains = crtc->enabled_power_domains;
-       for_each_power_domain(domain, domains)
-               intel_display_power_put_unchecked(dev_priv, domain);
-       crtc->enabled_power_domains = 0;
+       intel_display_power_put_all_in_set(dev_priv, 
&crtc->enabled_power_domains);
 
        dev_priv->active_pipes &= ~BIT(pipe);
        cdclk_state->min_cdclk[pipe] = 0;
@@ -16342,8 +16337,7 @@ static void intel_atomic_commit_tail(struct 
intel_atomic_state *state)
        for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, 
new_crtc_state, i) {
                intel_post_plane_update(state, crtc);
 
-               if (put_domains[crtc->pipe])
-                       modeset_put_power_domains(dev_priv, 
put_domains[crtc->pipe]);
+               modeset_put_crtc_power_domains(crtc, put_domains[crtc->pipe]);
 
                intel_modeset_verify_crtc(crtc, state, old_crtc_state, 
new_crtc_state);
 
@@ -19554,7 +19548,7 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
 
                put_domains = modeset_get_crtc_power_domains(crtc_state);
                if (drm_WARN_ON(dev, put_domains))
-                       modeset_put_power_domains(dev_priv, put_domains);
+                       modeset_put_crtc_power_domains(crtc, put_domains);
        }
 
        intel_display_power_put(dev_priv, POWER_DOMAIN_INIT, wakeref);
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index ce82d654d0f2..2dcda480b714 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1160,7 +1160,7 @@ struct intel_crtc {
        /* I915_MODE_FLAG_* */
        u8 mode_flags;
 
-       unsigned long long enabled_power_domains;
+       struct intel_display_power_domain_set enabled_power_domains;
        struct intel_overlay *overlay;
 
        struct intel_crtc_state *config;
-- 
2.25.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to