intel_de_read(dev_priv, CLKGATE_DIS_PSL(pipe)) & ~DPFR_GATING_DIS);
 }
 
+/* Wa_1604331009:icl,jsl,ehl */
+static void
+icl_wa_cursorclkgating(struct drm_i915_private *dev_priv, enum pipe pipe,
+                      bool enable)
+{
+       intel_de_rmw(dev_priv, CLKGATE_DIS_PSL(pipe), CURSOR_GATING_DIS,
+                    enable ? CURSOR_GATING_DIS : 0);
+}
+
 static bool
 is_trans_port_sync_slave(const struct intel_crtc_state *crtc_state)
 {
        return false;
 }
 
+static bool needs_cursorclk_wa(const struct intel_crtc_state *crtc_state)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
+
+       /* Wa_1604331009:icl,jsl,ehl */
+       if (is_hdr_mode(crtc_state) &&
+           crtc_state->active_planes & BIT(PLANE_CURSOR) &&
+           DISPLAY_VER(dev_priv) == 11)
+               return true;
+
+       return false;
+}
+
 static bool planes_enabling(const struct intel_crtc_state *old_crtc_state,
                            const struct intel_crtc_state *new_crtc_state)
 {
        if (needs_scalerclk_wa(old_crtc_state) &&
            !needs_scalerclk_wa(new_crtc_state))
                icl_wa_scalerclkgating(dev_priv, pipe, false);
+
+       if (needs_cursorclk_wa(old_crtc_state) &&
+           !needs_cursorclk_wa(new_crtc_state))
+               icl_wa_cursorclkgating(dev_priv, pipe, false);
+
 }
 
 static void intel_crtc_enable_flip_done(struct intel_atomic_state *state,
            needs_scalerclk_wa(new_crtc_state))
                icl_wa_scalerclkgating(dev_priv, pipe, true);
 
+       /* Wa_1604331009:icl,jsl,ehl */
+       if (!needs_cursorclk_wa(old_crtc_state) &&
+           needs_cursorclk_wa(new_crtc_state))
+               icl_wa_cursorclkgating(dev_priv, pipe, true);
+
        /*
         * Vblank time updates from the shadow to live plane control register
         * are blocked if the memory self-refresh mode is active at that