In MTL onwards, pcode locks the GV point based on the peak BW
of a QGV point. So store the peak BW of all the QGV points.

v2: use DIV_ROUND_CLOSEST() for the peakBW calculation

Bspec: 64636

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           | 8 ++++++--
 drivers/gpu/drm/i915/display/intel_display_core.h | 2 ++
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_bw.c 
b/drivers/gpu/drm/i915/display/intel_bw.c
index 61b3babf2d83..b792d307e9d5 100644
--- a/drivers/gpu/drm/i915/display/intel_bw.c
+++ b/drivers/gpu/drm/i915/display/intel_bw.c
@@ -534,10 +534,14 @@ static int tgl_get_bw_info(struct drm_i915_private 
*dev_priv, const struct intel
 
                        bi->deratedbw[j] = min(maxdebw,
                                               bw * (100 - sa->derating) / 100);
+                       bi->peakbw[j] = DIV_ROUND_CLOSEST(sp->dclk *
+                                                         num_channels *
+                                                         qi.channel_width, 8);
 
                        drm_dbg_kms(&dev_priv->drm,
-                                   "BW%d / QGV %d: num_planes=%d 
deratedbw=%u\n",
-                                   i, j, bi->num_planes, bi->deratedbw[j]);
+                                   "BW%d / QGV %d: num_planes=%d deratedbw=%u 
peakbw: %u\n",
+                                   i, j, bi->num_planes, bi->deratedbw[j],
+                                   bi->peakbw[j]);
                }
 
                for (j = 0; j < qi.num_psf_points; j++) {
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h 
b/drivers/gpu/drm/i915/display/intel_display_core.h
index e36f88a39b86..9f66d734edf6 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -314,6 +314,8 @@ struct intel_display {
                        unsigned int deratedbw[I915_NUM_QGV_POINTS];
                        /* for each PSF GV point */
                        unsigned int psf_bw[I915_NUM_PSF_GV_POINTS];
+                       /* Peak BW for each QGV point */
+                       unsigned int peakbw[I915_NUM_QGV_POINTS];
                        u8 num_qgv_points;
                        u8 num_psf_gv_points;
                        u8 num_planes;
-- 
2.34.1

Reply via email to