Add wakeref tracking for the DDI encoders' main lane AUX display power
domain references.

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

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index 9518d298b0f7..bfcfe8c3567e 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -2296,9 +2296,12 @@ static void intel_ddi_get_power_domains(struct 
intel_encoder *encoder,
         * ports.
         */
        if (intel_crtc_has_dp_encoder(crtc_state) ||
-           intel_phy_is_tc(dev_priv, phy))
-               intel_display_power_get(dev_priv,
-                                       
intel_ddi_main_link_aux_domain(dig_port));
+           intel_phy_is_tc(dev_priv, phy)) {
+               drm_WARN_ON(&dev_priv->drm, dig_port->aux_wakeref);
+               dig_port->aux_wakeref =
+                       intel_display_power_get(dev_priv,
+                                               
intel_ddi_main_link_aux_domain(dig_port));
+       }
 }
 
 void intel_ddi_enable_pipe_clock(struct intel_encoder *encoder,
@@ -4042,8 +4045,9 @@ static void intel_ddi_post_disable(struct 
intel_atomic_state *state,
                icl_unmap_plls_to_ports(encoder);
 
        if (intel_crtc_has_dp_encoder(old_crtc_state) || is_tc_port)
-               intel_display_power_put_unchecked(dev_priv,
-                                                 
intel_ddi_main_link_aux_domain(dig_port));
+               intel_display_power_put(dev_priv,
+                                       
intel_ddi_main_link_aux_domain(dig_port),
+                                       fetch_and_zero(&dig_port->aux_wakeref));
 
        if (is_tc_port)
                intel_tc_port_put_link(dig_port);
@@ -4378,9 +4382,12 @@ intel_ddi_pre_pll_enable(struct intel_atomic_state 
*state,
        if (is_tc_port)
                intel_tc_port_get_link(dig_port, crtc_state->lane_count);
 
-       if (intel_crtc_has_dp_encoder(crtc_state) || is_tc_port)
-               intel_display_power_get(dev_priv,
-                                       
intel_ddi_main_link_aux_domain(dig_port));
+       if (intel_crtc_has_dp_encoder(crtc_state) || is_tc_port) {
+               drm_WARN_ON(&dev_priv->drm, dig_port->aux_wakeref);
+               dig_port->aux_wakeref =
+                       intel_display_power_get(dev_priv,
+                                               
intel_ddi_main_link_aux_domain(dig_port));
+       }
 
        if (is_tc_port && dig_port->tc_mode != TC_PORT_TBT_ALT)
                /*
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index 91ed5c445150..22f7328023a0 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1467,6 +1467,7 @@ struct intel_digital_port {
        enum aux_ch aux_ch;
        enum intel_display_power_domain ddi_io_power_domain;
        intel_wakeref_t ddi_io_wakeref;
+       intel_wakeref_t aux_wakeref;
        struct mutex tc_lock;   /* protects the TypeC port mode */
        intel_wakeref_t tc_lock_wakeref;
        int tc_link_refcount;
-- 
2.25.1

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

Reply via email to