intel_de_rmw(dev_priv, SOUTH_DSPCLK_GATE_D, 0,
                             PCH_DPMGUNIT_CLOCK_GATE_DISABLE);
 
-       /* Wa_16015201720:adl-p,dg2 */
-       if (DISPLAY_VER(dev_priv) == 13) {
-               intel_de_rmw(dev_priv, CLKGATE_DIS_PSL_EXT(PIPE_A),
-                            0, PIPEDMC_GATING_DIS);
-               intel_de_rmw(dev_priv, CLKGATE_DIS_PSL_EXT(PIPE_B),
-                            0, PIPEDMC_GATING_DIS);
-       }
-
        /* 1. Enable PCH reset handshake. */
        intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));
 
 
        }
 }
 
+static void pipedmc_clock_gating_wa(struct drm_i915_private *i915, bool enable)
+{
+       enum pipe pipe;
+
+       if (DISPLAY_VER(i915) != 13)
+               return;
+
+       /*
+        * Wa_16015201720:adl-p,dg2
+        * The WA requires clock gating to be disabled all the time
+        * for pipe A and B.
+        * For pipe C and D clock gating needs to be disabled only
+        * during initializing the firmware.
+        */
+       if (enable)
+               for (pipe = PIPE_A; pipe <= PIPE_D; pipe++)
+                       intel_de_rmw(i915, CLKGATE_DIS_PSL_EXT(pipe),
+                                    0, PIPEDMC_GATING_DIS);
+       else
+               for (pipe = PIPE_C; pipe <= PIPE_D; pipe++)
+                       intel_de_rmw(i915, CLKGATE_DIS_PSL_EXT(pipe),
+                                    PIPEDMC_GATING_DIS, 0);
+}
+
 /**
  * intel_dmc_load_program() - write the firmware from memory to register.
  * @dev_priv: i915 drm device.
        if (!intel_dmc_has_payload(dev_priv))
                return;
 
+       pipedmc_clock_gating_wa(dev_priv, true);
+
        disable_all_event_handlers(dev_priv);
 
        assert_rpm_wakelock_held(&dev_priv->runtime_pm);
         * here.
         */
        disable_all_flip_queue_events(dev_priv);
+
+       pipedmc_clock_gating_wa(dev_priv, false);
 }
 
 /**
        if (!intel_dmc_has_payload(i915))
                return;
 
+       pipedmc_clock_gating_wa(i915, true);
        disable_all_event_handlers(i915);
+       pipedmc_clock_gating_wa(i915, false);
 }
 
 void assert_dmc_loaded(struct drm_i915_private *i915)