drm/i915: modify max_bw to return index to intel_bw_info
authorVinod Govindapillai <vinod.govindapillai@intel.com>
Tue, 6 Jun 2023 09:35:07 +0000 (12:35 +0300)
committerRadhakrishna Sripada <radhakrishna.sripada@intel.com>
Wed, 7 Jun 2023 18:24:39 +0000 (11:24 -0700)
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.govindapillai@intel.com>
Reviewed-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Signed-off-by: Radhakrishna Sripada <radhakrishna.sripada@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230606093509.221709-6-vinod.govindapillai@intel.com
drivers/gpu/drm/i915/display/intel_bw.c

index 56b3975..b1cbeda 100644 (file)
@@ -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