]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe: Fix a bug in pc_adjust_freq_bounds()
authorVinay Belgaumkar <vinay.belgaumkar@intel.com>
Wed, 5 Aug 2026 23:46:49 +0000 (16:46 -0700)
committerThomas Hellström <thomas.hellstrom@linux.intel.com>
Thu, 13 Aug 2026 12:56:34 +0000 (14:56 +0200)
In cases where min frequency was actually greater than BMG_MIN_FREQ,
we were not using the updated min frequency as there was a missing
call to pc_action_query_task_state() between the two settings of
min frequency. Since we know what min_freq was last set, use that
cached value while comparing to BMG_MIN_FREQ to fix this issue.

v2: pc->freq_ready is not set until after pc_adjust_freq_bounds(). Stay
with pc_action_query_task_state() instead.

v3: Update commit message (Stuart)

Fixes: bdde16c9ac5c ("drm/xe/bmg: Update Wa_14022085890")
Signed-off-by: Balasubramani Vivekanandan <balasubramani.vivekanandan@intel.com>
Signed-off-by: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
Reviewed-by: Stuart Summers <stuart.summers@intel.com>
Link: https://patch.msgid.link/20260805234649.2076384-1-vinay.belgaumkar@intel.com
(cherry picked from commit a2c2d2b13a9ea9494d2d76b46273833111749507)
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
drivers/gpu/drm/xe/xe_guc_pc.c

index 59f2fa79ad422934561b3f4d97d3b4634bb6303b..7cf8f485859886f75fae960aa0f34a5b96e3e113 100644 (file)
@@ -911,6 +911,7 @@ static bool pc_needs_min_freq_change(struct xe_guc_pc *pc)
 static int pc_adjust_freq_bounds(struct xe_guc_pc *pc)
 {
        int ret;
+       u32 min_freq;
 
        lockdep_assert_held(&pc->freq_lock);
 
@@ -933,8 +934,14 @@ static int pc_adjust_freq_bounds(struct xe_guc_pc *pc)
         * Same thing happens for Server platforms where min is listed as
         * RPMax
         */
-       if (pc_get_min_freq(pc) > pc->rp0_freq)
+       min_freq = pc_get_min_freq(pc);
+       if (min_freq > pc->rp0_freq) {
                ret = pc_set_min_freq(pc, pc->rp0_freq);
+               if (ret)
+                       goto out;
+
+               min_freq = pc->rp0_freq;
+       }
 
        /*
         * Setting GT RP min frequency to 1.2GHz by default for
@@ -947,8 +954,8 @@ static int pc_adjust_freq_bounds(struct xe_guc_pc *pc)
         * we aren't expecting high power output across board
         *
         */
-       if (pc_needs_min_freq_change(pc))
-               ret = pc_set_min_freq(pc, max(BMG_MIN_FREQ, pc_get_min_freq(pc)));
+       if (pc_needs_min_freq_change(pc) && min_freq < BMG_MIN_FREQ)
+               ret = pc_set_min_freq(pc, BMG_MIN_FREQ);
 
 out:
        return ret;