drm/i915/bw: Update bw calculation to account for 16 channels

Wa_16030862157:
Update Bandwidth Calculation to account for 16channel memory
config.

v2: Logical separation of changes (Suraj, Vinod)

WA: 16030862157, 16030875223
Bspec: 69131, 68859
Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Uma Shankar <uma.shankar@intel.com>
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Vinod Govindapillai <vinod.govindapillai@intel.com>
Link: https://patch.msgid.link/20260715143243.4141208-3-uma.shankar@intel.com
This commit is contained in:
Uma Shankar 2026-07-15 20:02:43 +05:30
parent 8b9bc7786a
commit 7a4c8d8830

View File

@ -14,6 +14,7 @@
#include "intel_display_regs.h"
#include "intel_display_types.h"
#include "intel_display_utils.h"
#include "intel_display_wa.h"
#include "intel_dram.h"
#include "intel_mchbar.h"
#include "intel_parent.h"
@ -272,7 +273,14 @@ static int icl_init_qgv_info(struct intel_display *display,
case INTEL_DRAM_LPDDR4:
case INTEL_DRAM_LPDDR5:
qi->t_bl = 16;
qi->max_numchannels = 8;
/*
* Wa_16030862157
* Xe3p supports a fully-populated 16-channel LPDDR
* config (4 memory controllers x 4 channels); earlier
* D14+ platforms top out at 8.
*/
qi->max_numchannels =
intel_display_wa(display, INTEL_DISPLAY_WA_16030862157) ? 16 : 8;
qi->channel_width = 16;
qi->deinterleave = 4;
break;
@ -666,10 +674,16 @@ static int tgl_get_bw_info(struct intel_display *display,
ipqdepth = min(ipqdepthpch, display_bw_params->displayrtids / num_channels);
/*
* Wa_16030862157
* clperchgroup = 4kpagespermempage * clperchperblock,
* clperchperblock = 8 / num_channels * interleave
* clperchperblock = max(8 / num_channels, 1) * interleave
*
* The 8 / num_channels truncating divide collapses to 0 for
* >8-channel configs (16-channel: 8 / 16 = 0); the max(..., 1) floor
* keeps clperchperblock >= 1 there while preserving the literal
* truncating divide for <=8-channel configs.
*/
clperchgroup = 4 * (8 / num_channels) * qi.deinterleave;
clperchgroup = 4 * max(8 / num_channels, 1) * qi.deinterleave;
display->bw.num_qgv_points = qi.num_qgv_points;
display->bw.num_psf_gv_points = qi.num_psf_points;