return bi->psf_bw[psf_gv_point];
 }
 
+static unsigned int icl_qgv_bw(struct drm_i915_private *i915,
+                              int num_active_planes, int qgv_point)
+{
+       unsigned int idx;
+
+       if (DISPLAY_VER(i915) >= 12)
+               idx = tgl_max_bw_index(i915, num_active_planes, qgv_point);
+       else
+               idx = icl_max_bw_index(i915, num_active_planes, qgv_point);
+
+       if (idx >= ARRAY_SIZE(i915->display.bw.max))
+               return 0;
+
+       return i915->display.bw.max[idx].deratedbw[qgv_point];
+}
+
 void intel_bw_init_hw(struct drm_i915_private *dev_priv)
 {
        if (!HAS_DISPLAY(dev_priv))
        return to_intel_bw_state(bw_state);
 }
 
+static unsigned int icl_max_bw_qgv_point_mask(struct drm_i915_private *i915,
+                                             int num_active_planes)
+{
+       unsigned int num_qgv_points = i915->display.bw.max[0].num_qgv_points;
+       unsigned int max_bw_point = 0;
+       unsigned int max_bw = 0;
+       int i;
+
+       for (i = 0; i < num_qgv_points; i++) {
+               unsigned int max_data_rate =
+                       icl_qgv_bw(i915, num_active_planes, i);
+
+               /*
+                * We need to know which qgv point gives us
+                * maximum bandwidth in order to disable SAGV
+                * if we find that we exceed SAGV block time
+                * with watermarks. By that moment we already
+                * have those, as it is calculated earlier in
+                * intel_atomic_check,
+                */
+               if (max_data_rate > max_bw) {
+                       max_bw_point = BIT(i);
+                       max_bw = max_data_rate;
+               }
+       }
+
+       return max_bw_point;
+}
+
 static int mtl_find_qgv_points(struct drm_i915_private *i915,
                               unsigned int data_rate,
                               unsigned int num_active_planes,
                               const struct intel_bw_state *old_bw_state,
                               struct intel_bw_state *new_bw_state)
 {
-       unsigned int max_bw_point = 0;
-       unsigned int max_bw = 0;
        unsigned int num_psf_gv_points = i915->display.bw.max[0].num_psf_gv_points;
        unsigned int num_qgv_points = i915->display.bw.max[0].num_qgv_points;
        u16 psf_points = 0;
                return ret;
 
        for (i = 0; i < num_qgv_points; i++) {
-               unsigned int idx;
-               unsigned int max_data_rate;
-
-               if (DISPLAY_VER(i915) >= 12)
-                       idx = tgl_max_bw_index(i915, num_active_planes, i);
-               else
-                       idx = icl_max_bw_index(i915, num_active_planes, i);
-
-               if (idx >= ARRAY_SIZE(i915->display.bw.max))
-                       continue;
-
-               max_data_rate = i915->display.bw.max[idx].deratedbw[i];
-
-               /*
-                * We need to know which qgv point gives us
-                * maximum bandwidth in order to disable SAGV
-                * if we find that we exceed SAGV block time
-                * with watermarks. By that moment we already
-                * have those, as it is calculated earlier in
-                * intel_atomic_check,
-                */
-               if (max_data_rate > max_bw) {
-                       max_bw_point = i;
-                       max_bw = max_data_rate;
-               }
+               unsigned int max_data_rate = icl_qgv_bw(i915,
+                                                       num_active_planes, i);
                if (max_data_rate >= data_rate)
                        qgv_points |= BIT(i);
 
         * cause.
         */
        if (!intel_can_enable_sagv(i915, new_bw_state)) {
-               qgv_points = BIT(max_bw_point);
-               drm_dbg_kms(&i915->drm, "No SAGV, using single QGV point %d\n",
-                           max_bw_point);
+               qgv_points = icl_max_bw_qgv_point_mask(i915, num_active_planes);
+               drm_dbg_kms(&i915->drm, "No SAGV, using single QGV point mask 0x%x\n",
+                           qgv_points);
        }
 
        /*