MTL uses the peak BW of a QGV point to lock the required QGV
point instead of the QGV index. Instead of passing the deratedbw
of the selected bw_info, return the index to the selected
bw_info so that either deratedbw or peakbw can be used based on
the platform.

v2: use idx to store index returned by max_bw_index functions

v3: return UINT_MAX in icl_max_bw_index in case no match found

v3: check idx >= ARRAY_SIZE

Signed-off-by: Vinod Govindapillai <vinod.govindapil...@intel.com>
Reviewed-by: Stanislav Lisovskiy <stanislav.lisovs...@intel.com>
---
 drivers/gpu/drm/i915/display/intel_bw.c | 27 ++++++++++++++++---------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_bw.c 
b/drivers/gpu/drm/i915/display/intel_bw.c
index 56b3975f3ccb..b1cbeda0b2e3 100644
--- a/drivers/gpu/drm/i915/display/intel_bw.c
+++ b/drivers/gpu/drm/i915/display/intel_bw.c
@@ -593,8 +593,8 @@ static void dg2_get_bw_info(struct drm_i915_private *i915)
        i915->display.sagv.status = I915_SAGV_NOT_CONTROLLED;
 }
 
-static unsigned int icl_max_bw(struct drm_i915_private *dev_priv,
-                              int num_planes, int qgv_point)
+static unsigned int icl_max_bw_index(struct drm_i915_private *dev_priv,
+                                    int num_planes, int qgv_point)
 {
        int i;
 
@@ -615,14 +615,14 @@ static unsigned int icl_max_bw(struct drm_i915_private 
*dev_priv,
                        return UINT_MAX;
 
                if (num_planes >= bi->num_planes)
-                       return bi->deratedbw[qgv_point];
+                       return i;
        }
 
-       return 0;
+       return UINT_MAX;
 }
 
-static unsigned int tgl_max_bw(struct drm_i915_private *dev_priv,
-                              int num_planes, int qgv_point)
+static unsigned int tgl_max_bw_index(struct drm_i915_private *dev_priv,
+                                    int num_planes, int qgv_point)
 {
        int i;
 
@@ -643,10 +643,10 @@ static unsigned int tgl_max_bw(struct drm_i915_private 
*dev_priv,
                        return UINT_MAX;
 
                if (num_planes <= bi->num_planes)
-                       return bi->deratedbw[qgv_point];
+                       return i;
        }
 
-       return dev_priv->display.bw.max[0].deratedbw[qgv_point];
+       return 0;
 }
 
 static unsigned int adl_psf_bw(struct drm_i915_private *dev_priv,
@@ -823,12 +823,19 @@ static int icl_find_qgv_points(struct drm_i915_private 
*i915,
                return ret;
 
        for (i = 0; i < num_qgv_points; i++) {
+               unsigned int idx;
                unsigned int max_data_rate;
 
                if (DISPLAY_VER(i915) > 11)
-                       max_data_rate = tgl_max_bw(i915, num_active_planes, i);
+                       idx = tgl_max_bw_index(i915, num_active_planes, i);
                else
-                       max_data_rate = icl_max_bw(i915, num_active_planes, i);
+                       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
-- 
2.34.1

Reply via email to