]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/i915/cdclk: Extract intel_cdclk_update_bw_min_cdclk()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 23 Sep 2025 17:19:31 +0000 (20:19 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 10 Oct 2025 23:50:30 +0000 (02:50 +0300)
Hide the cdclk state details better by providing a helper
(intel_cdclk_update_bw_min_cdclk()) by which the bw code can
inform the cdclk code about a new bw_min_cdclk value.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250923171943.7319-10-ville.syrjala@linux.intel.com
Reviewed-by: Mika Kahola <mika.kahola@intel.com>
drivers/gpu/drm/i915/display/intel_bw.c
drivers/gpu/drm/i915/display/intel_cdclk.c
drivers/gpu/drm/i915/display/intel_cdclk.h

index 8232b344a88f61918228c09210751e1880e60d46..7499ddec2b140c7a06c6240f4feadba11130b1de 100644 (file)
@@ -1405,12 +1405,10 @@ int intel_bw_calc_min_cdclk(struct intel_atomic_state *state,
        struct intel_display *display = to_intel_display(state);
        struct intel_bw_state *new_bw_state = NULL;
        const struct intel_bw_state *old_bw_state = NULL;
-       const struct intel_cdclk_state *cdclk_state;
        const struct intel_crtc_state *old_crtc_state;
        const struct intel_crtc_state *new_crtc_state;
-       int old_min_cdclk, new_min_cdclk;
        struct intel_crtc *crtc;
-       int i;
+       int ret, i;
 
        if (DISPLAY_VER(display) < 9)
                return 0;
@@ -1443,39 +1441,12 @@ int intel_bw_calc_min_cdclk(struct intel_atomic_state *state,
                        return ret;
        }
 
-       old_min_cdclk = intel_bw_min_cdclk(display, old_bw_state);
-       new_min_cdclk = intel_bw_min_cdclk(display, new_bw_state);
-
-       /*
-        * No need to check against the cdclk state if
-        * the min cdclk doesn't increase.
-        *
-        * Ie. we only ever increase the cdclk due to bandwidth
-        * requirements. This can reduce back and forth
-        * display blinking due to constant cdclk changes.
-        */
-       if (new_min_cdclk <= old_min_cdclk)
-               return 0;
-
-       cdclk_state = intel_atomic_get_cdclk_state(state);
-       if (IS_ERR(cdclk_state))
-               return PTR_ERR(cdclk_state);
-
-       /*
-        * No need to recalculate the cdclk state if
-        * the min cdclk doesn't increase.
-        *
-        * Ie. we only ever increase the cdclk due to bandwidth
-        * requirements. This can reduce back and forth
-        * display blinking due to constant cdclk changes.
-        */
-       if (new_min_cdclk <= intel_cdclk_bw_min_cdclk(cdclk_state))
-               return 0;
-
-       drm_dbg_kms(display->drm,
-                   "new bandwidth min cdclk (%d kHz) > old min cdclk (%d kHz)\n",
-                   new_min_cdclk, intel_cdclk_bw_min_cdclk(cdclk_state));
-       *need_cdclk_calc = true;
+       ret = intel_cdclk_update_bw_min_cdclk(state,
+                                             intel_bw_min_cdclk(display, old_bw_state),
+                                             intel_bw_min_cdclk(display, new_bw_state),
+                                             need_cdclk_calc);
+       if (ret)
+               return ret;
 
        return 0;
 }
index 0ef87e0aaeb1ad5bb05e0b24834ec5a1d38882c5..c1f00bb7b8d34698dcce1f4fcac5a357ef1eada1 100644 (file)
@@ -2837,6 +2837,34 @@ static int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_stat
        return min_cdclk;
 }
 
+int intel_cdclk_update_bw_min_cdclk(struct intel_atomic_state *state,
+                                   int old_min_cdclk, int new_min_cdclk,
+                                   bool *need_cdclk_calc)
+{
+       struct intel_display *display = to_intel_display(state);
+       struct intel_cdclk_state *cdclk_state;
+
+       if (new_min_cdclk <= old_min_cdclk)
+               return 0;
+
+       cdclk_state = intel_atomic_get_cdclk_state(state);
+       if (IS_ERR(cdclk_state))
+               return PTR_ERR(cdclk_state);
+
+       old_min_cdclk = cdclk_state->bw_min_cdclk;
+
+       if (new_min_cdclk <= old_min_cdclk)
+               return 0;
+
+       *need_cdclk_calc = true;
+
+       drm_dbg_kms(display->drm,
+                   "bandwidth min cdclk: %d kHz -> %d kHz\n",
+                   old_min_cdclk, new_min_cdclk);
+
+       return 0;
+}
+
 static bool glk_cdclk_audio_wa_needed(struct intel_display *display,
                                      const struct intel_cdclk_state *cdclk_state)
 {
index cacee598af0e2a8d0c379b011f65dcc610a7b9d7..0e67c75ca569fbcd0cfdc44ffc2e295312c2b80a 100644 (file)
@@ -48,6 +48,9 @@ struct intel_cdclk_state *
 intel_atomic_get_cdclk_state(struct intel_atomic_state *state);
 void intel_cdclk_update_hw_state(struct intel_display *display);
 void intel_cdclk_crtc_disable_noatomic(struct intel_crtc *crtc);
+int intel_cdclk_update_bw_min_cdclk(struct intel_atomic_state *state,
+                                   int old_min_cdclk, int new_min_cdclk,
+                                   bool *need_cdclk_calc);
 
 #define to_intel_cdclk_state(global_state) \
        container_of_const((global_state), struct intel_cdclk_state, base)