drm/i915/ddi: Track power reference taken for encoder main lane AUX use
authorImre Deak <imre.deak@intel.com>
Mon, 30 Nov 2020 21:21:56 +0000 (23:21 +0200)
committerImre Deak <imre.deak@intel.com>
Thu, 3 Dec 2020 13:31:55 +0000 (15:31 +0200)
Add wakeref tracking for the DDI encoders' main lane AUX display power
domain references.

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20201130212200.2811939-6-imre.deak@intel.com
drivers/gpu/drm/i915/display/intel_ddi.c
drivers/gpu/drm/i915/display/intel_display_types.h

index ba2da3d..5193473 100644 (file)
@@ -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);
@@ -4382,9 +4386,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)
                /*
index a648ce6..fa7d36f 100644 (file)
@@ -1483,6 +1483,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;