drm/amd/display: Reduce stack size by splitting function

When compiling with allmodconfig, gcc highlights the following error:

drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/display_mode_core.c: In function 'dml_core_mode_support':
drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/display_mode_core.c:8229:1: error: the frame size of 2736 bytes is larger than 2048 bytes [-Werror=frame-larger-than=]
 8229 | } // dml_core_mode_support
      | ^
cc1: all warnings being treated as errors

This commit mitigates part of this problem by extracting the prefetch
code to its own function. After applying this commit, the stack size
reduces from 2736 to 2464, however, the stack size issue becomes part of
the new function.

Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Roman Li <roman.li@amd.com>
Cc: Chaitanya Dhere <chaitanya.dhere@amd.com>
Fixes: 7966f319c66d ("drm/amd/display: Introduce DML2")
Tested-by: Stephen Rothwell <sfr@canb.auug.org.au>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Rodrigo Siqueira 2023-10-16 08:19:17 -06:00 committed by Alex Deucher
parent 7ef6b2d4b7
commit b141fa036c

View File

@ -6208,16 +6208,500 @@ static dml_uint_t CalculateMaxVStartup(
return max_vstartup_lines;
}
static void dml_prefetch_check(struct display_mode_lib_st *mode_lib)
{
struct dml_core_mode_support_locals_st *s = &mode_lib->scratch.dml_core_mode_support_locals;
struct CalculatePrefetchSchedule_params_st *CalculatePrefetchSchedule_params = &mode_lib->scratch.CalculatePrefetchSchedule_params;
struct CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport_params_st *CalculateWatermarks_params = &mode_lib->scratch.CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport_params;
struct DmlPipe *myPipe;
dml_uint_t j, k;
for (j = 0; j < 2; ++j) {
mode_lib->ms.TimeCalc = 24 / mode_lib->ms.ProjectedDCFCLKDeepSleep[j];
for (k = 0; k < mode_lib->ms.num_active_planes; ++k) {
mode_lib->ms.NoOfDPPThisState[k] = mode_lib->ms.NoOfDPP[j][k];
mode_lib->ms.swath_width_luma_ub_this_state[k] = mode_lib->ms.swath_width_luma_ub_all_states[j][k];
mode_lib->ms.swath_width_chroma_ub_this_state[k] = mode_lib->ms.swath_width_chroma_ub_all_states[j][k];
mode_lib->ms.SwathWidthYThisState[k] = mode_lib->ms.SwathWidthYAllStates[j][k];
mode_lib->ms.SwathWidthCThisState[k] = mode_lib->ms.SwathWidthCAllStates[j][k];
mode_lib->ms.SwathHeightYThisState[k] = mode_lib->ms.SwathHeightYAllStates[j][k];
mode_lib->ms.SwathHeightCThisState[k] = mode_lib->ms.SwathHeightCAllStates[j][k];
mode_lib->ms.UnboundedRequestEnabledThisState = mode_lib->ms.UnboundedRequestEnabledAllStates[j];
mode_lib->ms.CompressedBufferSizeInkByteThisState = mode_lib->ms.CompressedBufferSizeInkByteAllStates[j];
mode_lib->ms.DETBufferSizeInKByteThisState[k] = mode_lib->ms.DETBufferSizeInKByteAllStates[j][k];
mode_lib->ms.DETBufferSizeYThisState[k] = mode_lib->ms.DETBufferSizeYAllStates[j][k];
mode_lib->ms.DETBufferSizeCThisState[k] = mode_lib->ms.DETBufferSizeCAllStates[j][k];
}
mode_lib->ms.support.VActiveBandwithSupport[j] = CalculateVActiveBandwithSupport(
mode_lib->ms.num_active_planes,
mode_lib->ms.ReturnBWPerState[j],
mode_lib->ms.NotUrgentLatencyHiding,
mode_lib->ms.ReadBandwidthLuma,
mode_lib->ms.ReadBandwidthChroma,
mode_lib->ms.cursor_bw,
mode_lib->ms.meta_row_bandwidth_this_state,
mode_lib->ms.dpte_row_bandwidth_this_state,
mode_lib->ms.NoOfDPPThisState,
mode_lib->ms.UrgentBurstFactorLuma,
mode_lib->ms.UrgentBurstFactorChroma,
mode_lib->ms.UrgentBurstFactorCursor);
s->VMDataOnlyReturnBWPerState = dml_get_return_bw_mbps_vm_only(
&mode_lib->ms.soc,
mode_lib->ms.state.use_ideal_dram_bw_strobe,
mode_lib->ms.cache_display_cfg.plane.HostVMEnable,
mode_lib->ms.DCFCLKState[j],
mode_lib->ms.state.fabricclk_mhz,
mode_lib->ms.state.dram_speed_mts);
s->HostVMInefficiencyFactor = 1;
if (mode_lib->ms.cache_display_cfg.plane.GPUVMEnable && mode_lib->ms.cache_display_cfg.plane.HostVMEnable)
s->HostVMInefficiencyFactor = mode_lib->ms.ReturnBWPerState[j] / s->VMDataOnlyReturnBWPerState;
mode_lib->ms.ExtraLatency = CalculateExtraLatency(
mode_lib->ms.soc.round_trip_ping_latency_dcfclk_cycles,
s->ReorderingBytes,
mode_lib->ms.DCFCLKState[j],
mode_lib->ms.TotalNumberOfActiveDPP[j],
mode_lib->ms.ip.pixel_chunk_size_kbytes,
mode_lib->ms.TotalNumberOfDCCActiveDPP[j],
mode_lib->ms.ip.meta_chunk_size_kbytes,
mode_lib->ms.ReturnBWPerState[j],
mode_lib->ms.cache_display_cfg.plane.GPUVMEnable,
mode_lib->ms.cache_display_cfg.plane.HostVMEnable,
mode_lib->ms.num_active_planes,
mode_lib->ms.NoOfDPPThisState,
mode_lib->ms.dpte_group_bytes,
s->HostVMInefficiencyFactor,
mode_lib->ms.soc.hostvm_min_page_size_kbytes,
mode_lib->ms.cache_display_cfg.plane.HostVMMaxPageTableLevels);
s->NextMaxVStartup = s->MaxVStartupAllPlanes[j];
s->MaxVStartup = 0;
s->AllPrefetchModeTested = true;
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
CalculatePrefetchMode(mode_lib->ms.policy.AllowForPStateChangeOrStutterInVBlank[k], &s->MinPrefetchMode[k], &s->MaxPrefetchMode[k]);
s->NextPrefetchMode[k] = s->MinPrefetchMode[k];
}
do {
s->MaxVStartup = s->NextMaxVStartup;
s->AllPrefetchModeTested = true;
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
mode_lib->ms.PrefetchMode[k] = s->NextPrefetchMode[k];
mode_lib->ms.TWait = CalculateTWait(
mode_lib->ms.PrefetchMode[k],
mode_lib->ms.cache_display_cfg.plane.UseMALLForPStateChange[k],
mode_lib->ms.policy.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
mode_lib->ms.cache_display_cfg.timing.DRRDisplay[k],
mode_lib->ms.state.dram_clock_change_latency_us,
mode_lib->ms.state.fclk_change_latency_us,
mode_lib->ms.UrgLatency,
mode_lib->ms.state.sr_enter_plus_exit_time_us);
myPipe = &s->myPipe;
myPipe->Dppclk = mode_lib->ms.RequiredDPPCLKPerSurface[j][k];
myPipe->Dispclk = mode_lib->ms.RequiredDISPCLK[j];
myPipe->PixelClock = mode_lib->ms.cache_display_cfg.timing.PixelClock[k];
myPipe->DCFClkDeepSleep = mode_lib->ms.ProjectedDCFCLKDeepSleep[j];
myPipe->DPPPerSurface = mode_lib->ms.NoOfDPP[j][k];
myPipe->ScalerEnabled = mode_lib->ms.cache_display_cfg.plane.ScalerEnabled[k];
myPipe->SourceScan = mode_lib->ms.cache_display_cfg.plane.SourceScan[k];
myPipe->BlockWidth256BytesY = mode_lib->ms.Read256BlockWidthY[k];
myPipe->BlockHeight256BytesY = mode_lib->ms.Read256BlockHeightY[k];
myPipe->BlockWidth256BytesC = mode_lib->ms.Read256BlockWidthC[k];
myPipe->BlockHeight256BytesC = mode_lib->ms.Read256BlockHeightC[k];
myPipe->InterlaceEnable = mode_lib->ms.cache_display_cfg.timing.Interlace[k];
myPipe->NumberOfCursors = mode_lib->ms.cache_display_cfg.plane.NumberOfCursors[k];
myPipe->VBlank = mode_lib->ms.cache_display_cfg.timing.VTotal[k] - mode_lib->ms.cache_display_cfg.timing.VActive[k];
myPipe->HTotal = mode_lib->ms.cache_display_cfg.timing.HTotal[k];
myPipe->HActive = mode_lib->ms.cache_display_cfg.timing.HActive[k];
myPipe->DCCEnable = mode_lib->ms.cache_display_cfg.surface.DCCEnable[k];
myPipe->ODMMode = mode_lib->ms.ODMModePerState[k];
myPipe->SourcePixelFormat = mode_lib->ms.cache_display_cfg.surface.SourcePixelFormat[k];
myPipe->BytePerPixelY = mode_lib->ms.BytePerPixelY[k];
myPipe->BytePerPixelC = mode_lib->ms.BytePerPixelC[k];
myPipe->ProgressiveToInterlaceUnitInOPP = mode_lib->ms.ip.ptoi_supported;
#ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: Calling CalculatePrefetchSchedule for j=%u, k=%u\n", __func__, j, k);
dml_print("DML::%s: MaximumVStartup = %u\n", __func__, s->MaximumVStartup[j][k]);
dml_print("DML::%s: MaxVStartup = %u\n", __func__, s->MaxVStartup);
dml_print("DML::%s: NextPrefetchMode = %u\n", __func__, s->NextPrefetchMode[k]);
dml_print("DML::%s: AllowForPStateChangeOrStutterInVBlank = %u\n", __func__, mode_lib->ms.policy.AllowForPStateChangeOrStutterInVBlank[k]);
dml_print("DML::%s: PrefetchMode = %u\n", __func__, mode_lib->ms.PrefetchMode[k]);
#endif
CalculatePrefetchSchedule_params->EnhancedPrefetchScheduleAccelerationFinal = mode_lib->ms.policy.EnhancedPrefetchScheduleAccelerationFinal;
CalculatePrefetchSchedule_params->HostVMInefficiencyFactor = s->HostVMInefficiencyFactor;
CalculatePrefetchSchedule_params->myPipe = myPipe;
CalculatePrefetchSchedule_params->DSCDelay = mode_lib->ms.DSCDelayPerState[k];
CalculatePrefetchSchedule_params->DPPCLKDelaySubtotalPlusCNVCFormater = mode_lib->ms.ip.dppclk_delay_subtotal + mode_lib->ms.ip.dppclk_delay_cnvc_formatter;
CalculatePrefetchSchedule_params->DPPCLKDelaySCL = mode_lib->ms.ip.dppclk_delay_scl;
CalculatePrefetchSchedule_params->DPPCLKDelaySCLLBOnly = mode_lib->ms.ip.dppclk_delay_scl_lb_only;
CalculatePrefetchSchedule_params->DPPCLKDelayCNVCCursor = mode_lib->ms.ip.dppclk_delay_cnvc_cursor;
CalculatePrefetchSchedule_params->DISPCLKDelaySubtotal = mode_lib->ms.ip.dispclk_delay_subtotal;
CalculatePrefetchSchedule_params->DPP_RECOUT_WIDTH = (dml_uint_t)(mode_lib->ms.SwathWidthYThisState[k] / mode_lib->ms.cache_display_cfg.plane.HRatio[k]);
CalculatePrefetchSchedule_params->OutputFormat = mode_lib->ms.cache_display_cfg.output.OutputFormat[k];
CalculatePrefetchSchedule_params->MaxInterDCNTileRepeaters = mode_lib->ms.ip.max_inter_dcn_tile_repeaters;
CalculatePrefetchSchedule_params->VStartup = (dml_uint_t)(dml_min(s->MaxVStartup, s->MaximumVStartup[j][k]));
CalculatePrefetchSchedule_params->MaxVStartup = s->MaximumVStartup[j][k];
CalculatePrefetchSchedule_params->GPUVMPageTableLevels = mode_lib->ms.cache_display_cfg.plane.GPUVMMaxPageTableLevels;
CalculatePrefetchSchedule_params->GPUVMEnable = mode_lib->ms.cache_display_cfg.plane.GPUVMEnable;
CalculatePrefetchSchedule_params->HostVMEnable = mode_lib->ms.cache_display_cfg.plane.HostVMEnable;
CalculatePrefetchSchedule_params->HostVMMaxNonCachedPageTableLevels = mode_lib->ms.cache_display_cfg.plane.HostVMMaxPageTableLevels;
CalculatePrefetchSchedule_params->HostVMMinPageSize = mode_lib->ms.soc.hostvm_min_page_size_kbytes;
CalculatePrefetchSchedule_params->DynamicMetadataEnable = mode_lib->ms.cache_display_cfg.plane.DynamicMetadataEnable[k];
CalculatePrefetchSchedule_params->DynamicMetadataVMEnabled = mode_lib->ms.ip.dynamic_metadata_vm_enabled;
CalculatePrefetchSchedule_params->DynamicMetadataLinesBeforeActiveRequired = mode_lib->ms.cache_display_cfg.plane.DynamicMetadataLinesBeforeActiveRequired[k];
CalculatePrefetchSchedule_params->DynamicMetadataTransmittedBytes = mode_lib->ms.cache_display_cfg.plane.DynamicMetadataTransmittedBytes[k];
CalculatePrefetchSchedule_params->UrgentLatency = mode_lib->ms.UrgLatency;
CalculatePrefetchSchedule_params->UrgentExtraLatency = mode_lib->ms.ExtraLatency;
CalculatePrefetchSchedule_params->TCalc = mode_lib->ms.TimeCalc;
CalculatePrefetchSchedule_params->PDEAndMetaPTEBytesFrame = mode_lib->ms.PDEAndMetaPTEBytesPerFrame[j][k];
CalculatePrefetchSchedule_params->MetaRowByte = mode_lib->ms.MetaRowBytes[j][k];
CalculatePrefetchSchedule_params->PixelPTEBytesPerRow = mode_lib->ms.DPTEBytesPerRow[j][k];
CalculatePrefetchSchedule_params->PrefetchSourceLinesY = mode_lib->ms.PrefetchLinesY[j][k];
CalculatePrefetchSchedule_params->VInitPreFillY = mode_lib->ms.PrefillY[k];
CalculatePrefetchSchedule_params->MaxNumSwathY = mode_lib->ms.MaxNumSwY[k];
CalculatePrefetchSchedule_params->PrefetchSourceLinesC = mode_lib->ms.PrefetchLinesC[j][k];
CalculatePrefetchSchedule_params->VInitPreFillC = mode_lib->ms.PrefillC[k];
CalculatePrefetchSchedule_params->MaxNumSwathC = mode_lib->ms.MaxNumSwC[k];
CalculatePrefetchSchedule_params->swath_width_luma_ub = mode_lib->ms.swath_width_luma_ub_this_state[k];
CalculatePrefetchSchedule_params->swath_width_chroma_ub = mode_lib->ms.swath_width_chroma_ub_this_state[k];
CalculatePrefetchSchedule_params->SwathHeightY = mode_lib->ms.SwathHeightYThisState[k];
CalculatePrefetchSchedule_params->SwathHeightC = mode_lib->ms.SwathHeightCThisState[k];
CalculatePrefetchSchedule_params->TWait = mode_lib->ms.TWait;
CalculatePrefetchSchedule_params->DSTXAfterScaler = &s->DSTXAfterScaler[k];
CalculatePrefetchSchedule_params->DSTYAfterScaler = &s->DSTYAfterScaler[k];
CalculatePrefetchSchedule_params->DestinationLinesForPrefetch = &mode_lib->ms.LineTimesForPrefetch[k];
CalculatePrefetchSchedule_params->DestinationLinesToRequestVMInVBlank = &mode_lib->ms.LinesForMetaPTE[k];
CalculatePrefetchSchedule_params->DestinationLinesToRequestRowInVBlank = &mode_lib->ms.LinesForMetaAndDPTERow[k];
CalculatePrefetchSchedule_params->VRatioPrefetchY = &mode_lib->ms.VRatioPreY[j][k];
CalculatePrefetchSchedule_params->VRatioPrefetchC = &mode_lib->ms.VRatioPreC[j][k];
CalculatePrefetchSchedule_params->RequiredPrefetchPixDataBWLuma = &mode_lib->ms.RequiredPrefetchPixelDataBWLuma[k];
CalculatePrefetchSchedule_params->RequiredPrefetchPixDataBWChroma = &mode_lib->ms.RequiredPrefetchPixelDataBWChroma[k];
CalculatePrefetchSchedule_params->NotEnoughTimeForDynamicMetadata = &mode_lib->ms.support.NoTimeForDynamicMetadata[j][k];
CalculatePrefetchSchedule_params->Tno_bw = &mode_lib->ms.Tno_bw[k];
CalculatePrefetchSchedule_params->prefetch_vmrow_bw = &mode_lib->ms.prefetch_vmrow_bw[k];
CalculatePrefetchSchedule_params->Tdmdl_vm = &s->dummy_single[0];
CalculatePrefetchSchedule_params->Tdmdl = &s->dummy_single[1];
CalculatePrefetchSchedule_params->TSetup = &s->dummy_single[2];
CalculatePrefetchSchedule_params->VUpdateOffsetPix = &s->dummy_integer[0];
CalculatePrefetchSchedule_params->VUpdateWidthPix = &s->dummy_integer[1];
CalculatePrefetchSchedule_params->VReadyOffsetPix = &s->dummy_integer[2];
mode_lib->ms.support.NoTimeForPrefetch[j][k] =
CalculatePrefetchSchedule(&mode_lib->scratch,
CalculatePrefetchSchedule_params);
}
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
CalculateUrgentBurstFactor(
mode_lib->ms.cache_display_cfg.plane.UseMALLForPStateChange[k],
mode_lib->ms.swath_width_luma_ub_this_state[k],
mode_lib->ms.swath_width_chroma_ub_this_state[k],
mode_lib->ms.SwathHeightYThisState[k],
mode_lib->ms.SwathHeightCThisState[k],
mode_lib->ms.cache_display_cfg.timing.HTotal[k] / mode_lib->ms.cache_display_cfg.timing.PixelClock[k],
mode_lib->ms.UrgLatency,
mode_lib->ms.ip.cursor_buffer_size,
mode_lib->ms.cache_display_cfg.plane.CursorWidth[k],
mode_lib->ms.cache_display_cfg.plane.CursorBPP[k],
mode_lib->ms.VRatioPreY[j][k],
mode_lib->ms.VRatioPreC[j][k],
mode_lib->ms.BytePerPixelInDETY[k],
mode_lib->ms.BytePerPixelInDETC[k],
mode_lib->ms.DETBufferSizeYThisState[k],
mode_lib->ms.DETBufferSizeCThisState[k],
/* Output */
&mode_lib->ms.UrgentBurstFactorCursorPre[k],
&mode_lib->ms.UrgentBurstFactorLumaPre[k],
&mode_lib->ms.UrgentBurstFactorChroma[k],
&mode_lib->ms.NotUrgentLatencyHidingPre[k]);
mode_lib->ms.cursor_bw_pre[k] = mode_lib->ms.cache_display_cfg.plane.NumberOfCursors[k] * mode_lib->ms.cache_display_cfg.plane.CursorWidth[k] *
mode_lib->ms.cache_display_cfg.plane.CursorBPP[k] / 8.0 / (mode_lib->ms.cache_display_cfg.timing.HTotal[k] /
mode_lib->ms.cache_display_cfg.timing.PixelClock[k]) * mode_lib->ms.VRatioPreY[j][k];
}
{
CalculatePrefetchBandwithSupport(
mode_lib->ms.num_active_planes,
mode_lib->ms.ReturnBWPerState[j],
mode_lib->ms.cache_display_cfg.plane.UseMALLForPStateChange,
mode_lib->ms.NotUrgentLatencyHidingPre,
mode_lib->ms.ReadBandwidthLuma,
mode_lib->ms.ReadBandwidthChroma,
mode_lib->ms.RequiredPrefetchPixelDataBWLuma,
mode_lib->ms.RequiredPrefetchPixelDataBWChroma,
mode_lib->ms.cursor_bw,
mode_lib->ms.meta_row_bandwidth_this_state,
mode_lib->ms.dpte_row_bandwidth_this_state,
mode_lib->ms.cursor_bw_pre,
mode_lib->ms.prefetch_vmrow_bw,
mode_lib->ms.NoOfDPPThisState,
mode_lib->ms.UrgentBurstFactorLuma,
mode_lib->ms.UrgentBurstFactorChroma,
mode_lib->ms.UrgentBurstFactorCursor,
mode_lib->ms.UrgentBurstFactorLumaPre,
mode_lib->ms.UrgentBurstFactorChromaPre,
mode_lib->ms.UrgentBurstFactorCursorPre,
/* output */
&s->dummy_single[0], // dml_float_t *PrefetchBandwidth
&s->dummy_single[1], // dml_float_t *PrefetchBandwidthNotIncludingMALLPrefetch
&mode_lib->mp.FractionOfUrgentBandwidth, // dml_float_t *FractionOfUrgentBandwidth
&mode_lib->ms.support.PrefetchSupported[j]);
}
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
if (mode_lib->ms.LineTimesForPrefetch[k] < 2.0
|| mode_lib->ms.LinesForMetaPTE[k] >= 32.0
|| mode_lib->ms.LinesForMetaAndDPTERow[k] >= 16.0
|| mode_lib->ms.support.NoTimeForPrefetch[j][k] == true) {
mode_lib->ms.support.PrefetchSupported[j] = false;
}
}
mode_lib->ms.support.DynamicMetadataSupported[j] = true;
for (k = 0; k < mode_lib->ms.num_active_planes; ++k) {
if (mode_lib->ms.support.NoTimeForDynamicMetadata[j][k] == true) {
mode_lib->ms.support.DynamicMetadataSupported[j] = false;
}
}
mode_lib->ms.support.VRatioInPrefetchSupported[j] = true;
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
if (mode_lib->ms.support.NoTimeForPrefetch[j][k] == true ||
mode_lib->ms.VRatioPreY[j][k] > __DML_MAX_VRATIO_PRE_ENHANCE_PREFETCH_ACC__ ||
mode_lib->ms.VRatioPreC[j][k] > __DML_MAX_VRATIO_PRE_ENHANCE_PREFETCH_ACC__ ||
((s->MaxVStartup < s->MaximumVStartup[j][k] || mode_lib->ms.policy.EnhancedPrefetchScheduleAccelerationFinal == 0) &&
(mode_lib->ms.VRatioPreY[j][k] > __DML_MAX_VRATIO_PRE__ || mode_lib->ms.VRatioPreC[j][k] > __DML_MAX_VRATIO_PRE__))) {
mode_lib->ms.support.VRatioInPrefetchSupported[j] = false;
}
}
s->AnyLinesForVMOrRowTooLarge = false;
for (k = 0; k < mode_lib->ms.num_active_planes; ++k) {
if (mode_lib->ms.LinesForMetaAndDPTERow[k] >= 16 || mode_lib->ms.LinesForMetaPTE[k] >= 32) {
s->AnyLinesForVMOrRowTooLarge = true;
}
}
if (mode_lib->ms.support.PrefetchSupported[j] == true && mode_lib->ms.support.VRatioInPrefetchSupported[j] == true) {
mode_lib->ms.BandwidthAvailableForImmediateFlip = CalculateBandwidthAvailableForImmediateFlip(
mode_lib->ms.num_active_planes,
mode_lib->ms.ReturnBWPerState[j],
mode_lib->ms.ReadBandwidthLuma,
mode_lib->ms.ReadBandwidthChroma,
mode_lib->ms.RequiredPrefetchPixelDataBWLuma,
mode_lib->ms.RequiredPrefetchPixelDataBWChroma,
mode_lib->ms.cursor_bw,
mode_lib->ms.cursor_bw_pre,
mode_lib->ms.NoOfDPPThisState,
mode_lib->ms.UrgentBurstFactorLuma,
mode_lib->ms.UrgentBurstFactorChroma,
mode_lib->ms.UrgentBurstFactorCursor,
mode_lib->ms.UrgentBurstFactorLumaPre,
mode_lib->ms.UrgentBurstFactorChromaPre,
mode_lib->ms.UrgentBurstFactorCursorPre);
mode_lib->ms.TotImmediateFlipBytes = 0;
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
if (!(mode_lib->ms.policy.ImmediateFlipRequirement[k] == dml_immediate_flip_not_required)) {
mode_lib->ms.TotImmediateFlipBytes = mode_lib->ms.TotImmediateFlipBytes + mode_lib->ms.NoOfDPP[j][k] * mode_lib->ms.PDEAndMetaPTEBytesPerFrame[j][k] + mode_lib->ms.MetaRowBytes[j][k];
if (mode_lib->ms.use_one_row_for_frame_flip[j][k]) {
mode_lib->ms.TotImmediateFlipBytes = mode_lib->ms.TotImmediateFlipBytes + mode_lib->ms.NoOfDPP[j][k] * (2 * mode_lib->ms.DPTEBytesPerRow[j][k]);
} else {
mode_lib->ms.TotImmediateFlipBytes = mode_lib->ms.TotImmediateFlipBytes + mode_lib->ms.NoOfDPP[j][k] * mode_lib->ms.DPTEBytesPerRow[j][k];
}
}
}
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
CalculateFlipSchedule(
s->HostVMInefficiencyFactor,
mode_lib->ms.ExtraLatency,
mode_lib->ms.UrgLatency,
mode_lib->ms.cache_display_cfg.plane.GPUVMMaxPageTableLevels,
mode_lib->ms.cache_display_cfg.plane.HostVMEnable,
mode_lib->ms.cache_display_cfg.plane.HostVMMaxPageTableLevels,
mode_lib->ms.cache_display_cfg.plane.GPUVMEnable,
mode_lib->ms.soc.hostvm_min_page_size_kbytes,
mode_lib->ms.PDEAndMetaPTEBytesPerFrame[j][k],
mode_lib->ms.MetaRowBytes[j][k],
mode_lib->ms.DPTEBytesPerRow[j][k],
mode_lib->ms.BandwidthAvailableForImmediateFlip,
mode_lib->ms.TotImmediateFlipBytes,
mode_lib->ms.cache_display_cfg.surface.SourcePixelFormat[k],
(mode_lib->ms.cache_display_cfg.timing.HTotal[k] / mode_lib->ms.cache_display_cfg.timing.PixelClock[k]),
mode_lib->ms.cache_display_cfg.plane.VRatio[k],
mode_lib->ms.cache_display_cfg.plane.VRatioChroma[k],
mode_lib->ms.Tno_bw[k],
mode_lib->ms.cache_display_cfg.surface.DCCEnable[k],
mode_lib->ms.dpte_row_height[k],
mode_lib->ms.meta_row_height[k],
mode_lib->ms.dpte_row_height_chroma[k],
mode_lib->ms.meta_row_height_chroma[k],
mode_lib->ms.use_one_row_for_frame_flip[j][k], // 24
/* Output */
&mode_lib->ms.DestinationLinesToRequestVMInImmediateFlip[k],
&mode_lib->ms.DestinationLinesToRequestRowInImmediateFlip[k],
&mode_lib->ms.final_flip_bw[k],
&mode_lib->ms.ImmediateFlipSupportedForPipe[k]);
}
{
CalculateImmediateFlipBandwithSupport(mode_lib->ms.num_active_planes,
mode_lib->ms.ReturnBWPerState[j],
mode_lib->ms.cache_display_cfg.plane.UseMALLForPStateChange,
mode_lib->ms.policy.ImmediateFlipRequirement,
mode_lib->ms.final_flip_bw,
mode_lib->ms.ReadBandwidthLuma,
mode_lib->ms.ReadBandwidthChroma,
mode_lib->ms.RequiredPrefetchPixelDataBWLuma,
mode_lib->ms.RequiredPrefetchPixelDataBWChroma,
mode_lib->ms.cursor_bw,
mode_lib->ms.meta_row_bandwidth_this_state,
mode_lib->ms.dpte_row_bandwidth_this_state,
mode_lib->ms.cursor_bw_pre,
mode_lib->ms.prefetch_vmrow_bw,
mode_lib->ms.NoOfDPP[j], // VBA_ERROR DPPPerSurface is not assigned at this point, should use NoOfDpp here
mode_lib->ms.UrgentBurstFactorLuma,
mode_lib->ms.UrgentBurstFactorChroma,
mode_lib->ms.UrgentBurstFactorCursor,
mode_lib->ms.UrgentBurstFactorLumaPre,
mode_lib->ms.UrgentBurstFactorChromaPre,
mode_lib->ms.UrgentBurstFactorCursorPre,
/* output */
&s->dummy_single[0], // dml_float_t *TotalBandwidth
&s->dummy_single[1], // dml_float_t *TotalBandwidthNotIncludingMALLPrefetch
&s->dummy_single[2], // dml_float_t *FractionOfUrgentBandwidth
&mode_lib->ms.support.ImmediateFlipSupportedForState[j]); // dml_bool_t *ImmediateFlipBandwidthSupport
}
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
if (!(mode_lib->ms.policy.ImmediateFlipRequirement[k] == dml_immediate_flip_not_required) && (mode_lib->ms.ImmediateFlipSupportedForPipe[k] == false))
mode_lib->ms.support.ImmediateFlipSupportedForState[j] = false;
}
} else { // if prefetch not support, assume iflip not supported
mode_lib->ms.support.ImmediateFlipSupportedForState[j] = false;
}
if (s->MaxVStartup <= __DML_VBA_MIN_VSTARTUP__ || s->AnyLinesForVMOrRowTooLarge == false) {
s->NextMaxVStartup = s->MaxVStartupAllPlanes[j];
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
s->NextPrefetchMode[k] = s->NextPrefetchMode[k] + 1;
if (s->NextPrefetchMode[k] <= s->MaxPrefetchMode[k])
s->AllPrefetchModeTested = false;
}
} else {
s->NextMaxVStartup = s->NextMaxVStartup - 1;
}
} while (!((mode_lib->ms.support.PrefetchSupported[j] == true && mode_lib->ms.support.DynamicMetadataSupported[j] == true &&
mode_lib->ms.support.VRatioInPrefetchSupported[j] == true &&
// consider flip support is okay if when there is no hostvm and the user does't require a iflip OR the flip bw is ok
// If there is hostvm, DCN needs to support iflip for invalidation
((s->ImmediateFlipRequiredFinal) || mode_lib->ms.support.ImmediateFlipSupportedForState[j] == true)) ||
(s->NextMaxVStartup == s->MaxVStartupAllPlanes[j] && s->AllPrefetchModeTested)));
for (k = 0; k < mode_lib->ms.num_active_planes; ++k) {
mode_lib->ms.use_one_row_for_frame_this_state[k] = mode_lib->ms.use_one_row_for_frame[j][k];
}
s->mSOCParameters.UrgentLatency = mode_lib->ms.UrgLatency;
s->mSOCParameters.ExtraLatency = mode_lib->ms.ExtraLatency;
s->mSOCParameters.WritebackLatency = mode_lib->ms.state.writeback_latency_us;
s->mSOCParameters.DRAMClockChangeLatency = mode_lib->ms.state.dram_clock_change_latency_us;
s->mSOCParameters.FCLKChangeLatency = mode_lib->ms.state.fclk_change_latency_us;
s->mSOCParameters.SRExitTime = mode_lib->ms.state.sr_exit_time_us;
s->mSOCParameters.SREnterPlusExitTime = mode_lib->ms.state.sr_enter_plus_exit_time_us;
s->mSOCParameters.SRExitZ8Time = mode_lib->ms.state.sr_exit_z8_time_us;
s->mSOCParameters.SREnterPlusExitZ8Time = mode_lib->ms.state.sr_enter_plus_exit_z8_time_us;
s->mSOCParameters.USRRetrainingLatency = mode_lib->ms.state.usr_retraining_latency_us;
s->mSOCParameters.SMNLatency = mode_lib->ms.soc.smn_latency_us;
CalculateWatermarks_params->USRRetrainingRequiredFinal = mode_lib->ms.policy.USRRetrainingRequiredFinal;
CalculateWatermarks_params->UseMALLForPStateChange = mode_lib->ms.cache_display_cfg.plane.UseMALLForPStateChange;
CalculateWatermarks_params->PrefetchMode = mode_lib->ms.PrefetchMode;
CalculateWatermarks_params->NumberOfActiveSurfaces = mode_lib->ms.num_active_planes;
CalculateWatermarks_params->MaxLineBufferLines = mode_lib->ms.ip.max_line_buffer_lines;
CalculateWatermarks_params->LineBufferSize = mode_lib->ms.ip.line_buffer_size_bits;
CalculateWatermarks_params->WritebackInterfaceBufferSize = mode_lib->ms.ip.writeback_interface_buffer_size_kbytes;
CalculateWatermarks_params->DCFCLK = mode_lib->ms.DCFCLKState[j];
CalculateWatermarks_params->ReturnBW = mode_lib->ms.ReturnBWPerState[j];
CalculateWatermarks_params->SynchronizeTimingsFinal = mode_lib->ms.policy.SynchronizeTimingsFinal;
CalculateWatermarks_params->SynchronizeDRRDisplaysForUCLKPStateChangeFinal = mode_lib->ms.policy.SynchronizeDRRDisplaysForUCLKPStateChangeFinal;
CalculateWatermarks_params->DRRDisplay = mode_lib->ms.cache_display_cfg.timing.DRRDisplay;
CalculateWatermarks_params->dpte_group_bytes = mode_lib->ms.dpte_group_bytes;
CalculateWatermarks_params->meta_row_height = mode_lib->ms.meta_row_height;
CalculateWatermarks_params->meta_row_height_chroma = mode_lib->ms.meta_row_height_chroma;
CalculateWatermarks_params->mmSOCParameters = s->mSOCParameters;
CalculateWatermarks_params->WritebackChunkSize = mode_lib->ms.ip.writeback_chunk_size_kbytes;
CalculateWatermarks_params->SOCCLK = mode_lib->ms.state.socclk_mhz;
CalculateWatermarks_params->DCFClkDeepSleep = mode_lib->ms.ProjectedDCFCLKDeepSleep[j];
CalculateWatermarks_params->DETBufferSizeY = mode_lib->ms.DETBufferSizeYThisState;
CalculateWatermarks_params->DETBufferSizeC = mode_lib->ms.DETBufferSizeCThisState;
CalculateWatermarks_params->SwathHeightY = mode_lib->ms.SwathHeightYThisState;
CalculateWatermarks_params->SwathHeightC = mode_lib->ms.SwathHeightCThisState;
CalculateWatermarks_params->LBBitPerPixel = mode_lib->ms.cache_display_cfg.plane.LBBitPerPixel;
CalculateWatermarks_params->SwathWidthY = mode_lib->ms.SwathWidthYThisState;
CalculateWatermarks_params->SwathWidthC = mode_lib->ms.SwathWidthCThisState;
CalculateWatermarks_params->HRatio = mode_lib->ms.cache_display_cfg.plane.HRatio;
CalculateWatermarks_params->HRatioChroma = mode_lib->ms.cache_display_cfg.plane.HRatioChroma;
CalculateWatermarks_params->VTaps = mode_lib->ms.cache_display_cfg.plane.VTaps;
CalculateWatermarks_params->VTapsChroma = mode_lib->ms.cache_display_cfg.plane.VTapsChroma;
CalculateWatermarks_params->VRatio = mode_lib->ms.cache_display_cfg.plane.VRatio;
CalculateWatermarks_params->VRatioChroma = mode_lib->ms.cache_display_cfg.plane.VRatioChroma;
CalculateWatermarks_params->HTotal = mode_lib->ms.cache_display_cfg.timing.HTotal;
CalculateWatermarks_params->VTotal = mode_lib->ms.cache_display_cfg.timing.VTotal;
CalculateWatermarks_params->VActive = mode_lib->ms.cache_display_cfg.timing.VActive;
CalculateWatermarks_params->PixelClock = mode_lib->ms.cache_display_cfg.timing.PixelClock;
CalculateWatermarks_params->BlendingAndTiming = mode_lib->ms.cache_display_cfg.plane.BlendingAndTiming;
CalculateWatermarks_params->DPPPerSurface = mode_lib->ms.NoOfDPPThisState;
CalculateWatermarks_params->BytePerPixelDETY = mode_lib->ms.BytePerPixelInDETY;
CalculateWatermarks_params->BytePerPixelDETC = mode_lib->ms.BytePerPixelInDETC;
CalculateWatermarks_params->DSTXAfterScaler = s->DSTXAfterScaler;
CalculateWatermarks_params->DSTYAfterScaler = s->DSTYAfterScaler;
CalculateWatermarks_params->WritebackEnable = mode_lib->ms.cache_display_cfg.writeback.WritebackEnable;
CalculateWatermarks_params->WritebackPixelFormat = mode_lib->ms.cache_display_cfg.writeback.WritebackPixelFormat;
CalculateWatermarks_params->WritebackDestinationWidth = mode_lib->ms.cache_display_cfg.writeback.WritebackDestinationWidth;
CalculateWatermarks_params->WritebackDestinationHeight = mode_lib->ms.cache_display_cfg.writeback.WritebackDestinationHeight;
CalculateWatermarks_params->WritebackSourceHeight = mode_lib->ms.cache_display_cfg.writeback.WritebackSourceHeight;
CalculateWatermarks_params->UnboundedRequestEnabled = mode_lib->ms.UnboundedRequestEnabledThisState;
CalculateWatermarks_params->CompressedBufferSizeInkByte = mode_lib->ms.CompressedBufferSizeInkByteThisState;
// Output
CalculateWatermarks_params->Watermark = &s->dummy_watermark; // Watermarks *Watermark
CalculateWatermarks_params->DRAMClockChangeSupport = &mode_lib->ms.support.DRAMClockChangeSupport[j];
CalculateWatermarks_params->MaxActiveDRAMClockChangeLatencySupported = &s->dummy_single_array[0]; // dml_float_t *MaxActiveDRAMClockChangeLatencySupported[]
CalculateWatermarks_params->SubViewportLinesNeededInMALL = &mode_lib->ms.SubViewportLinesNeededInMALL[j]; // dml_uint_t SubViewportLinesNeededInMALL[]
CalculateWatermarks_params->FCLKChangeSupport = &mode_lib->ms.support.FCLKChangeSupport[j];
CalculateWatermarks_params->MaxActiveFCLKChangeLatencySupported = &s->dummy_single[0]; // dml_float_t *MaxActiveFCLKChangeLatencySupported
CalculateWatermarks_params->USRRetrainingSupport = &mode_lib->ms.support.USRRetrainingSupport[j];
CalculateWatermarks_params->ActiveDRAMClockChangeLatencyMargin = mode_lib->ms.support.ActiveDRAMClockChangeLatencyMargin;
CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport(&mode_lib->scratch,
CalculateWatermarks_params);
} // for j
}
/// @brief The Mode Support function.
dml_bool_t dml_core_mode_support(struct display_mode_lib_st *mode_lib)
{
struct dml_core_mode_support_locals_st *s = &mode_lib->scratch.dml_core_mode_support_locals;
struct CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport_params_st *CalculateWatermarks_params = &mode_lib->scratch.CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport_params;
struct CalculateVMRowAndSwath_params_st *CalculateVMRowAndSwath_params = &mode_lib->scratch.CalculateVMRowAndSwath_params;
struct UseMinimumDCFCLK_params_st *UseMinimumDCFCLK_params = &mode_lib->scratch.UseMinimumDCFCLK_params;
struct CalculateSwathAndDETConfiguration_params_st *CalculateSwathAndDETConfiguration_params = &mode_lib->scratch.CalculateSwathAndDETConfiguration_params;
struct CalculatePrefetchSchedule_params_st *CalculatePrefetchSchedule_params = &mode_lib->scratch.CalculatePrefetchSchedule_params;
struct DmlPipe *myPipe;
struct CalculateVMRowAndSwath_params_st *CalculateVMRowAndSwath_params = &mode_lib->scratch.CalculateVMRowAndSwath_params;
dml_uint_t j, k, m;
@ -7546,484 +8030,8 @@ dml_bool_t dml_core_mode_support(struct display_mode_lib_st *mode_lib)
}
/* Prefetch Check */
dml_prefetch_check(mode_lib);
for (j = 0; j < 2; ++j) {
mode_lib->ms.TimeCalc = 24 / mode_lib->ms.ProjectedDCFCLKDeepSleep[j];
for (k = 0; k < mode_lib->ms.num_active_planes; ++k) {
mode_lib->ms.NoOfDPPThisState[k] = mode_lib->ms.NoOfDPP[j][k];
mode_lib->ms.swath_width_luma_ub_this_state[k] = mode_lib->ms.swath_width_luma_ub_all_states[j][k];
mode_lib->ms.swath_width_chroma_ub_this_state[k] = mode_lib->ms.swath_width_chroma_ub_all_states[j][k];
mode_lib->ms.SwathWidthYThisState[k] = mode_lib->ms.SwathWidthYAllStates[j][k];
mode_lib->ms.SwathWidthCThisState[k] = mode_lib->ms.SwathWidthCAllStates[j][k];
mode_lib->ms.SwathHeightYThisState[k] = mode_lib->ms.SwathHeightYAllStates[j][k];
mode_lib->ms.SwathHeightCThisState[k] = mode_lib->ms.SwathHeightCAllStates[j][k];
mode_lib->ms.UnboundedRequestEnabledThisState = mode_lib->ms.UnboundedRequestEnabledAllStates[j];
mode_lib->ms.CompressedBufferSizeInkByteThisState = mode_lib->ms.CompressedBufferSizeInkByteAllStates[j];
mode_lib->ms.DETBufferSizeInKByteThisState[k] = mode_lib->ms.DETBufferSizeInKByteAllStates[j][k];
mode_lib->ms.DETBufferSizeYThisState[k] = mode_lib->ms.DETBufferSizeYAllStates[j][k];
mode_lib->ms.DETBufferSizeCThisState[k] = mode_lib->ms.DETBufferSizeCAllStates[j][k];
}
mode_lib->ms.support.VActiveBandwithSupport[j] = CalculateVActiveBandwithSupport(
mode_lib->ms.num_active_planes,
mode_lib->ms.ReturnBWPerState[j],
mode_lib->ms.NotUrgentLatencyHiding,
mode_lib->ms.ReadBandwidthLuma,
mode_lib->ms.ReadBandwidthChroma,
mode_lib->ms.cursor_bw,
mode_lib->ms.meta_row_bandwidth_this_state,
mode_lib->ms.dpte_row_bandwidth_this_state,
mode_lib->ms.NoOfDPPThisState,
mode_lib->ms.UrgentBurstFactorLuma,
mode_lib->ms.UrgentBurstFactorChroma,
mode_lib->ms.UrgentBurstFactorCursor);
s->VMDataOnlyReturnBWPerState = dml_get_return_bw_mbps_vm_only(
&mode_lib->ms.soc,
mode_lib->ms.state.use_ideal_dram_bw_strobe,
mode_lib->ms.cache_display_cfg.plane.HostVMEnable,
mode_lib->ms.DCFCLKState[j],
mode_lib->ms.state.fabricclk_mhz,
mode_lib->ms.state.dram_speed_mts);
s->HostVMInefficiencyFactor = 1;
if (mode_lib->ms.cache_display_cfg.plane.GPUVMEnable && mode_lib->ms.cache_display_cfg.plane.HostVMEnable)
s->HostVMInefficiencyFactor = mode_lib->ms.ReturnBWPerState[j] / s->VMDataOnlyReturnBWPerState;
mode_lib->ms.ExtraLatency = CalculateExtraLatency(
mode_lib->ms.soc.round_trip_ping_latency_dcfclk_cycles,
s->ReorderingBytes,
mode_lib->ms.DCFCLKState[j],
mode_lib->ms.TotalNumberOfActiveDPP[j],
mode_lib->ms.ip.pixel_chunk_size_kbytes,
mode_lib->ms.TotalNumberOfDCCActiveDPP[j],
mode_lib->ms.ip.meta_chunk_size_kbytes,
mode_lib->ms.ReturnBWPerState[j],
mode_lib->ms.cache_display_cfg.plane.GPUVMEnable,
mode_lib->ms.cache_display_cfg.plane.HostVMEnable,
mode_lib->ms.num_active_planes,
mode_lib->ms.NoOfDPPThisState,
mode_lib->ms.dpte_group_bytes,
s->HostVMInefficiencyFactor,
mode_lib->ms.soc.hostvm_min_page_size_kbytes,
mode_lib->ms.cache_display_cfg.plane.HostVMMaxPageTableLevels);
s->NextMaxVStartup = s->MaxVStartupAllPlanes[j];
s->MaxVStartup = 0;
s->AllPrefetchModeTested = true;
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
CalculatePrefetchMode(mode_lib->ms.policy.AllowForPStateChangeOrStutterInVBlank[k], &s->MinPrefetchMode[k], &s->MaxPrefetchMode[k]);
s->NextPrefetchMode[k] = s->MinPrefetchMode[k];
}
do {
s->MaxVStartup = s->NextMaxVStartup;
s->AllPrefetchModeTested = true;
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
mode_lib->ms.PrefetchMode[k] = s->NextPrefetchMode[k];
mode_lib->ms.TWait = CalculateTWait(
mode_lib->ms.PrefetchMode[k],
mode_lib->ms.cache_display_cfg.plane.UseMALLForPStateChange[k],
mode_lib->ms.policy.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
mode_lib->ms.cache_display_cfg.timing.DRRDisplay[k],
mode_lib->ms.state.dram_clock_change_latency_us,
mode_lib->ms.state.fclk_change_latency_us,
mode_lib->ms.UrgLatency,
mode_lib->ms.state.sr_enter_plus_exit_time_us);
myPipe = &s->myPipe;
myPipe->Dppclk = mode_lib->ms.RequiredDPPCLKPerSurface[j][k];
myPipe->Dispclk = mode_lib->ms.RequiredDISPCLK[j];
myPipe->PixelClock = mode_lib->ms.cache_display_cfg.timing.PixelClock[k];
myPipe->DCFClkDeepSleep = mode_lib->ms.ProjectedDCFCLKDeepSleep[j];
myPipe->DPPPerSurface = mode_lib->ms.NoOfDPP[j][k];
myPipe->ScalerEnabled = mode_lib->ms.cache_display_cfg.plane.ScalerEnabled[k];
myPipe->SourceScan = mode_lib->ms.cache_display_cfg.plane.SourceScan[k];
myPipe->BlockWidth256BytesY = mode_lib->ms.Read256BlockWidthY[k];
myPipe->BlockHeight256BytesY = mode_lib->ms.Read256BlockHeightY[k];
myPipe->BlockWidth256BytesC = mode_lib->ms.Read256BlockWidthC[k];
myPipe->BlockHeight256BytesC = mode_lib->ms.Read256BlockHeightC[k];
myPipe->InterlaceEnable = mode_lib->ms.cache_display_cfg.timing.Interlace[k];
myPipe->NumberOfCursors = mode_lib->ms.cache_display_cfg.plane.NumberOfCursors[k];
myPipe->VBlank = mode_lib->ms.cache_display_cfg.timing.VTotal[k] - mode_lib->ms.cache_display_cfg.timing.VActive[k];
myPipe->HTotal = mode_lib->ms.cache_display_cfg.timing.HTotal[k];
myPipe->HActive = mode_lib->ms.cache_display_cfg.timing.HActive[k];
myPipe->DCCEnable = mode_lib->ms.cache_display_cfg.surface.DCCEnable[k];
myPipe->ODMMode = mode_lib->ms.ODMModePerState[k];
myPipe->SourcePixelFormat = mode_lib->ms.cache_display_cfg.surface.SourcePixelFormat[k];
myPipe->BytePerPixelY = mode_lib->ms.BytePerPixelY[k];
myPipe->BytePerPixelC = mode_lib->ms.BytePerPixelC[k];
myPipe->ProgressiveToInterlaceUnitInOPP = mode_lib->ms.ip.ptoi_supported;
#ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: Calling CalculatePrefetchSchedule for j=%u, k=%u\n", __func__, j, k);
dml_print("DML::%s: MaximumVStartup = %u\n", __func__, s->MaximumVStartup[j][k]);
dml_print("DML::%s: MaxVStartup = %u\n", __func__, s->MaxVStartup);
dml_print("DML::%s: NextPrefetchMode = %u\n", __func__, s->NextPrefetchMode[k]);
dml_print("DML::%s: AllowForPStateChangeOrStutterInVBlank = %u\n", __func__, mode_lib->ms.policy.AllowForPStateChangeOrStutterInVBlank[k]);
dml_print("DML::%s: PrefetchMode = %u\n", __func__, mode_lib->ms.PrefetchMode[k]);
#endif
CalculatePrefetchSchedule_params->EnhancedPrefetchScheduleAccelerationFinal = mode_lib->ms.policy.EnhancedPrefetchScheduleAccelerationFinal;
CalculatePrefetchSchedule_params->HostVMInefficiencyFactor = s->HostVMInefficiencyFactor;
CalculatePrefetchSchedule_params->myPipe = myPipe;
CalculatePrefetchSchedule_params->DSCDelay = mode_lib->ms.DSCDelayPerState[k];
CalculatePrefetchSchedule_params->DPPCLKDelaySubtotalPlusCNVCFormater = mode_lib->ms.ip.dppclk_delay_subtotal + mode_lib->ms.ip.dppclk_delay_cnvc_formatter;
CalculatePrefetchSchedule_params->DPPCLKDelaySCL = mode_lib->ms.ip.dppclk_delay_scl;
CalculatePrefetchSchedule_params->DPPCLKDelaySCLLBOnly = mode_lib->ms.ip.dppclk_delay_scl_lb_only;
CalculatePrefetchSchedule_params->DPPCLKDelayCNVCCursor = mode_lib->ms.ip.dppclk_delay_cnvc_cursor;
CalculatePrefetchSchedule_params->DISPCLKDelaySubtotal = mode_lib->ms.ip.dispclk_delay_subtotal;
CalculatePrefetchSchedule_params->DPP_RECOUT_WIDTH = (dml_uint_t)(mode_lib->ms.SwathWidthYThisState[k] / mode_lib->ms.cache_display_cfg.plane.HRatio[k]);
CalculatePrefetchSchedule_params->OutputFormat = mode_lib->ms.cache_display_cfg.output.OutputFormat[k];
CalculatePrefetchSchedule_params->MaxInterDCNTileRepeaters = mode_lib->ms.ip.max_inter_dcn_tile_repeaters;
CalculatePrefetchSchedule_params->VStartup = (dml_uint_t)(dml_min(s->MaxVStartup, s->MaximumVStartup[j][k]));
CalculatePrefetchSchedule_params->MaxVStartup = s->MaximumVStartup[j][k];
CalculatePrefetchSchedule_params->GPUVMPageTableLevels = mode_lib->ms.cache_display_cfg.plane.GPUVMMaxPageTableLevels;
CalculatePrefetchSchedule_params->GPUVMEnable = mode_lib->ms.cache_display_cfg.plane.GPUVMEnable;
CalculatePrefetchSchedule_params->HostVMEnable = mode_lib->ms.cache_display_cfg.plane.HostVMEnable;
CalculatePrefetchSchedule_params->HostVMMaxNonCachedPageTableLevels = mode_lib->ms.cache_display_cfg.plane.HostVMMaxPageTableLevels;
CalculatePrefetchSchedule_params->HostVMMinPageSize = mode_lib->ms.soc.hostvm_min_page_size_kbytes;
CalculatePrefetchSchedule_params->DynamicMetadataEnable = mode_lib->ms.cache_display_cfg.plane.DynamicMetadataEnable[k];
CalculatePrefetchSchedule_params->DynamicMetadataVMEnabled = mode_lib->ms.ip.dynamic_metadata_vm_enabled;
CalculatePrefetchSchedule_params->DynamicMetadataLinesBeforeActiveRequired = mode_lib->ms.cache_display_cfg.plane.DynamicMetadataLinesBeforeActiveRequired[k];
CalculatePrefetchSchedule_params->DynamicMetadataTransmittedBytes = mode_lib->ms.cache_display_cfg.plane.DynamicMetadataTransmittedBytes[k];
CalculatePrefetchSchedule_params->UrgentLatency = mode_lib->ms.UrgLatency;
CalculatePrefetchSchedule_params->UrgentExtraLatency = mode_lib->ms.ExtraLatency;
CalculatePrefetchSchedule_params->TCalc = mode_lib->ms.TimeCalc;
CalculatePrefetchSchedule_params->PDEAndMetaPTEBytesFrame = mode_lib->ms.PDEAndMetaPTEBytesPerFrame[j][k];
CalculatePrefetchSchedule_params->MetaRowByte = mode_lib->ms.MetaRowBytes[j][k];
CalculatePrefetchSchedule_params->PixelPTEBytesPerRow = mode_lib->ms.DPTEBytesPerRow[j][k];
CalculatePrefetchSchedule_params->PrefetchSourceLinesY = mode_lib->ms.PrefetchLinesY[j][k];
CalculatePrefetchSchedule_params->VInitPreFillY = mode_lib->ms.PrefillY[k];
CalculatePrefetchSchedule_params->MaxNumSwathY = mode_lib->ms.MaxNumSwY[k];
CalculatePrefetchSchedule_params->PrefetchSourceLinesC = mode_lib->ms.PrefetchLinesC[j][k];
CalculatePrefetchSchedule_params->VInitPreFillC = mode_lib->ms.PrefillC[k];
CalculatePrefetchSchedule_params->MaxNumSwathC = mode_lib->ms.MaxNumSwC[k];
CalculatePrefetchSchedule_params->swath_width_luma_ub = mode_lib->ms.swath_width_luma_ub_this_state[k];
CalculatePrefetchSchedule_params->swath_width_chroma_ub = mode_lib->ms.swath_width_chroma_ub_this_state[k];
CalculatePrefetchSchedule_params->SwathHeightY = mode_lib->ms.SwathHeightYThisState[k];
CalculatePrefetchSchedule_params->SwathHeightC = mode_lib->ms.SwathHeightCThisState[k];
CalculatePrefetchSchedule_params->TWait = mode_lib->ms.TWait;
CalculatePrefetchSchedule_params->DSTXAfterScaler = &s->DSTXAfterScaler[k];
CalculatePrefetchSchedule_params->DSTYAfterScaler = &s->DSTYAfterScaler[k];
CalculatePrefetchSchedule_params->DestinationLinesForPrefetch = &mode_lib->ms.LineTimesForPrefetch[k];
CalculatePrefetchSchedule_params->DestinationLinesToRequestVMInVBlank = &mode_lib->ms.LinesForMetaPTE[k];
CalculatePrefetchSchedule_params->DestinationLinesToRequestRowInVBlank = &mode_lib->ms.LinesForMetaAndDPTERow[k];
CalculatePrefetchSchedule_params->VRatioPrefetchY = &mode_lib->ms.VRatioPreY[j][k];
CalculatePrefetchSchedule_params->VRatioPrefetchC = &mode_lib->ms.VRatioPreC[j][k];
CalculatePrefetchSchedule_params->RequiredPrefetchPixDataBWLuma = &mode_lib->ms.RequiredPrefetchPixelDataBWLuma[k];
CalculatePrefetchSchedule_params->RequiredPrefetchPixDataBWChroma = &mode_lib->ms.RequiredPrefetchPixelDataBWChroma[k];
CalculatePrefetchSchedule_params->NotEnoughTimeForDynamicMetadata = &mode_lib->ms.support.NoTimeForDynamicMetadata[j][k];
CalculatePrefetchSchedule_params->Tno_bw = &mode_lib->ms.Tno_bw[k];
CalculatePrefetchSchedule_params->prefetch_vmrow_bw = &mode_lib->ms.prefetch_vmrow_bw[k];
CalculatePrefetchSchedule_params->Tdmdl_vm = &s->dummy_single[0];
CalculatePrefetchSchedule_params->Tdmdl = &s->dummy_single[1];
CalculatePrefetchSchedule_params->TSetup = &s->dummy_single[2];
CalculatePrefetchSchedule_params->VUpdateOffsetPix = &s->dummy_integer[0];
CalculatePrefetchSchedule_params->VUpdateWidthPix = &s->dummy_integer[1];
CalculatePrefetchSchedule_params->VReadyOffsetPix = &s->dummy_integer[2];
mode_lib->ms.support.NoTimeForPrefetch[j][k] =
CalculatePrefetchSchedule(&mode_lib->scratch,
CalculatePrefetchSchedule_params);
}
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
CalculateUrgentBurstFactor(
mode_lib->ms.cache_display_cfg.plane.UseMALLForPStateChange[k],
mode_lib->ms.swath_width_luma_ub_this_state[k],
mode_lib->ms.swath_width_chroma_ub_this_state[k],
mode_lib->ms.SwathHeightYThisState[k],
mode_lib->ms.SwathHeightCThisState[k],
mode_lib->ms.cache_display_cfg.timing.HTotal[k] / mode_lib->ms.cache_display_cfg.timing.PixelClock[k],
mode_lib->ms.UrgLatency,
mode_lib->ms.ip.cursor_buffer_size,
mode_lib->ms.cache_display_cfg.plane.CursorWidth[k],
mode_lib->ms.cache_display_cfg.plane.CursorBPP[k],
mode_lib->ms.VRatioPreY[j][k],
mode_lib->ms.VRatioPreC[j][k],
mode_lib->ms.BytePerPixelInDETY[k],
mode_lib->ms.BytePerPixelInDETC[k],
mode_lib->ms.DETBufferSizeYThisState[k],
mode_lib->ms.DETBufferSizeCThisState[k],
/* Output */
&mode_lib->ms.UrgentBurstFactorCursorPre[k],
&mode_lib->ms.UrgentBurstFactorLumaPre[k],
&mode_lib->ms.UrgentBurstFactorChroma[k],
&mode_lib->ms.NotUrgentLatencyHidingPre[k]);
mode_lib->ms.cursor_bw_pre[k] = mode_lib->ms.cache_display_cfg.plane.NumberOfCursors[k] * mode_lib->ms.cache_display_cfg.plane.CursorWidth[k] *
mode_lib->ms.cache_display_cfg.plane.CursorBPP[k] / 8.0 / (mode_lib->ms.cache_display_cfg.timing.HTotal[k] /
mode_lib->ms.cache_display_cfg.timing.PixelClock[k]) * mode_lib->ms.VRatioPreY[j][k];
}
{
CalculatePrefetchBandwithSupport(
mode_lib->ms.num_active_planes,
mode_lib->ms.ReturnBWPerState[j],
mode_lib->ms.cache_display_cfg.plane.UseMALLForPStateChange,
mode_lib->ms.NotUrgentLatencyHidingPre,
mode_lib->ms.ReadBandwidthLuma,
mode_lib->ms.ReadBandwidthChroma,
mode_lib->ms.RequiredPrefetchPixelDataBWLuma,
mode_lib->ms.RequiredPrefetchPixelDataBWChroma,
mode_lib->ms.cursor_bw,
mode_lib->ms.meta_row_bandwidth_this_state,
mode_lib->ms.dpte_row_bandwidth_this_state,
mode_lib->ms.cursor_bw_pre,
mode_lib->ms.prefetch_vmrow_bw,
mode_lib->ms.NoOfDPPThisState,
mode_lib->ms.UrgentBurstFactorLuma,
mode_lib->ms.UrgentBurstFactorChroma,
mode_lib->ms.UrgentBurstFactorCursor,
mode_lib->ms.UrgentBurstFactorLumaPre,
mode_lib->ms.UrgentBurstFactorChromaPre,
mode_lib->ms.UrgentBurstFactorCursorPre,
/* output */
&s->dummy_single[0], // dml_float_t *PrefetchBandwidth
&s->dummy_single[1], // dml_float_t *PrefetchBandwidthNotIncludingMALLPrefetch
&mode_lib->mp.FractionOfUrgentBandwidth, // dml_float_t *FractionOfUrgentBandwidth
&mode_lib->ms.support.PrefetchSupported[j]);
}
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
if (mode_lib->ms.LineTimesForPrefetch[k] < 2.0
|| mode_lib->ms.LinesForMetaPTE[k] >= 32.0
|| mode_lib->ms.LinesForMetaAndDPTERow[k] >= 16.0
|| mode_lib->ms.support.NoTimeForPrefetch[j][k] == true) {
mode_lib->ms.support.PrefetchSupported[j] = false;
}
}
mode_lib->ms.support.DynamicMetadataSupported[j] = true;
for (k = 0; k < mode_lib->ms.num_active_planes; ++k) {
if (mode_lib->ms.support.NoTimeForDynamicMetadata[j][k] == true) {
mode_lib->ms.support.DynamicMetadataSupported[j] = false;
}
}
mode_lib->ms.support.VRatioInPrefetchSupported[j] = true;
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
if (mode_lib->ms.support.NoTimeForPrefetch[j][k] == true ||
mode_lib->ms.VRatioPreY[j][k] > __DML_MAX_VRATIO_PRE_ENHANCE_PREFETCH_ACC__ ||
mode_lib->ms.VRatioPreC[j][k] > __DML_MAX_VRATIO_PRE_ENHANCE_PREFETCH_ACC__ ||
((s->MaxVStartup < s->MaximumVStartup[j][k] || mode_lib->ms.policy.EnhancedPrefetchScheduleAccelerationFinal == 0) &&
(mode_lib->ms.VRatioPreY[j][k] > __DML_MAX_VRATIO_PRE__ || mode_lib->ms.VRatioPreC[j][k] > __DML_MAX_VRATIO_PRE__))) {
mode_lib->ms.support.VRatioInPrefetchSupported[j] = false;
}
}
s->AnyLinesForVMOrRowTooLarge = false;
for (k = 0; k < mode_lib->ms.num_active_planes; ++k) {
if (mode_lib->ms.LinesForMetaAndDPTERow[k] >= 16 || mode_lib->ms.LinesForMetaPTE[k] >= 32) {
s->AnyLinesForVMOrRowTooLarge = true;
}
}
if (mode_lib->ms.support.PrefetchSupported[j] == true && mode_lib->ms.support.VRatioInPrefetchSupported[j] == true) {
mode_lib->ms.BandwidthAvailableForImmediateFlip = CalculateBandwidthAvailableForImmediateFlip(
mode_lib->ms.num_active_planes,
mode_lib->ms.ReturnBWPerState[j],
mode_lib->ms.ReadBandwidthLuma,
mode_lib->ms.ReadBandwidthChroma,
mode_lib->ms.RequiredPrefetchPixelDataBWLuma,
mode_lib->ms.RequiredPrefetchPixelDataBWChroma,
mode_lib->ms.cursor_bw,
mode_lib->ms.cursor_bw_pre,
mode_lib->ms.NoOfDPPThisState,
mode_lib->ms.UrgentBurstFactorLuma,
mode_lib->ms.UrgentBurstFactorChroma,
mode_lib->ms.UrgentBurstFactorCursor,
mode_lib->ms.UrgentBurstFactorLumaPre,
mode_lib->ms.UrgentBurstFactorChromaPre,
mode_lib->ms.UrgentBurstFactorCursorPre);
mode_lib->ms.TotImmediateFlipBytes = 0;
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
if (!(mode_lib->ms.policy.ImmediateFlipRequirement[k] == dml_immediate_flip_not_required)) {
mode_lib->ms.TotImmediateFlipBytes = mode_lib->ms.TotImmediateFlipBytes + mode_lib->ms.NoOfDPP[j][k] * mode_lib->ms.PDEAndMetaPTEBytesPerFrame[j][k] + mode_lib->ms.MetaRowBytes[j][k];
if (mode_lib->ms.use_one_row_for_frame_flip[j][k]) {
mode_lib->ms.TotImmediateFlipBytes = mode_lib->ms.TotImmediateFlipBytes + mode_lib->ms.NoOfDPP[j][k] * (2 * mode_lib->ms.DPTEBytesPerRow[j][k]);
} else {
mode_lib->ms.TotImmediateFlipBytes = mode_lib->ms.TotImmediateFlipBytes + mode_lib->ms.NoOfDPP[j][k] * mode_lib->ms.DPTEBytesPerRow[j][k];
}
}
}
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
CalculateFlipSchedule(
s->HostVMInefficiencyFactor,
mode_lib->ms.ExtraLatency,
mode_lib->ms.UrgLatency,
mode_lib->ms.cache_display_cfg.plane.GPUVMMaxPageTableLevels,
mode_lib->ms.cache_display_cfg.plane.HostVMEnable,
mode_lib->ms.cache_display_cfg.plane.HostVMMaxPageTableLevels,
mode_lib->ms.cache_display_cfg.plane.GPUVMEnable,
mode_lib->ms.soc.hostvm_min_page_size_kbytes,
mode_lib->ms.PDEAndMetaPTEBytesPerFrame[j][k],
mode_lib->ms.MetaRowBytes[j][k],
mode_lib->ms.DPTEBytesPerRow[j][k],
mode_lib->ms.BandwidthAvailableForImmediateFlip,
mode_lib->ms.TotImmediateFlipBytes,
mode_lib->ms.cache_display_cfg.surface.SourcePixelFormat[k],
(mode_lib->ms.cache_display_cfg.timing.HTotal[k] / mode_lib->ms.cache_display_cfg.timing.PixelClock[k]),
mode_lib->ms.cache_display_cfg.plane.VRatio[k],
mode_lib->ms.cache_display_cfg.plane.VRatioChroma[k],
mode_lib->ms.Tno_bw[k],
mode_lib->ms.cache_display_cfg.surface.DCCEnable[k],
mode_lib->ms.dpte_row_height[k],
mode_lib->ms.meta_row_height[k],
mode_lib->ms.dpte_row_height_chroma[k],
mode_lib->ms.meta_row_height_chroma[k],
mode_lib->ms.use_one_row_for_frame_flip[j][k], // 24
/* Output */
&mode_lib->ms.DestinationLinesToRequestVMInImmediateFlip[k],
&mode_lib->ms.DestinationLinesToRequestRowInImmediateFlip[k],
&mode_lib->ms.final_flip_bw[k],
&mode_lib->ms.ImmediateFlipSupportedForPipe[k]);
}
{
CalculateImmediateFlipBandwithSupport(mode_lib->ms.num_active_planes,
mode_lib->ms.ReturnBWPerState[j],
mode_lib->ms.cache_display_cfg.plane.UseMALLForPStateChange,
mode_lib->ms.policy.ImmediateFlipRequirement,
mode_lib->ms.final_flip_bw,
mode_lib->ms.ReadBandwidthLuma,
mode_lib->ms.ReadBandwidthChroma,
mode_lib->ms.RequiredPrefetchPixelDataBWLuma,
mode_lib->ms.RequiredPrefetchPixelDataBWChroma,
mode_lib->ms.cursor_bw,
mode_lib->ms.meta_row_bandwidth_this_state,
mode_lib->ms.dpte_row_bandwidth_this_state,
mode_lib->ms.cursor_bw_pre,
mode_lib->ms.prefetch_vmrow_bw,
mode_lib->ms.NoOfDPP[j], // VBA_ERROR DPPPerSurface is not assigned at this point, should use NoOfDpp here
mode_lib->ms.UrgentBurstFactorLuma,
mode_lib->ms.UrgentBurstFactorChroma,
mode_lib->ms.UrgentBurstFactorCursor,
mode_lib->ms.UrgentBurstFactorLumaPre,
mode_lib->ms.UrgentBurstFactorChromaPre,
mode_lib->ms.UrgentBurstFactorCursorPre,
/* output */
&s->dummy_single[0], // dml_float_t *TotalBandwidth
&s->dummy_single[1], // dml_float_t *TotalBandwidthNotIncludingMALLPrefetch
&s->dummy_single[2], // dml_float_t *FractionOfUrgentBandwidth
&mode_lib->ms.support.ImmediateFlipSupportedForState[j]); // dml_bool_t *ImmediateFlipBandwidthSupport
}
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
if (!(mode_lib->ms.policy.ImmediateFlipRequirement[k] == dml_immediate_flip_not_required) && (mode_lib->ms.ImmediateFlipSupportedForPipe[k] == false))
mode_lib->ms.support.ImmediateFlipSupportedForState[j] = false;
}
} else { // if prefetch not support, assume iflip not supported
mode_lib->ms.support.ImmediateFlipSupportedForState[j] = false;
}
if (s->MaxVStartup <= __DML_VBA_MIN_VSTARTUP__ || s->AnyLinesForVMOrRowTooLarge == false) {
s->NextMaxVStartup = s->MaxVStartupAllPlanes[j];
for (k = 0; k <= mode_lib->ms.num_active_planes - 1; k++) {
s->NextPrefetchMode[k] = s->NextPrefetchMode[k] + 1;
if (s->NextPrefetchMode[k] <= s->MaxPrefetchMode[k])
s->AllPrefetchModeTested = false;
}
} else {
s->NextMaxVStartup = s->NextMaxVStartup - 1;
}
} while (!((mode_lib->ms.support.PrefetchSupported[j] == true && mode_lib->ms.support.DynamicMetadataSupported[j] == true &&
mode_lib->ms.support.VRatioInPrefetchSupported[j] == true &&
// consider flip support is okay if when there is no hostvm and the user does't require a iflip OR the flip bw is ok
// If there is hostvm, DCN needs to support iflip for invalidation
((s->ImmediateFlipRequiredFinal) || mode_lib->ms.support.ImmediateFlipSupportedForState[j] == true)) ||
(s->NextMaxVStartup == s->MaxVStartupAllPlanes[j] && s->AllPrefetchModeTested)));
for (k = 0; k < mode_lib->ms.num_active_planes; ++k) {
mode_lib->ms.use_one_row_for_frame_this_state[k] = mode_lib->ms.use_one_row_for_frame[j][k];
}
s->mSOCParameters.UrgentLatency = mode_lib->ms.UrgLatency;
s->mSOCParameters.ExtraLatency = mode_lib->ms.ExtraLatency;
s->mSOCParameters.WritebackLatency = mode_lib->ms.state.writeback_latency_us;
s->mSOCParameters.DRAMClockChangeLatency = mode_lib->ms.state.dram_clock_change_latency_us;
s->mSOCParameters.FCLKChangeLatency = mode_lib->ms.state.fclk_change_latency_us;
s->mSOCParameters.SRExitTime = mode_lib->ms.state.sr_exit_time_us;
s->mSOCParameters.SREnterPlusExitTime = mode_lib->ms.state.sr_enter_plus_exit_time_us;
s->mSOCParameters.SRExitZ8Time = mode_lib->ms.state.sr_exit_z8_time_us;
s->mSOCParameters.SREnterPlusExitZ8Time = mode_lib->ms.state.sr_enter_plus_exit_z8_time_us;
s->mSOCParameters.USRRetrainingLatency = mode_lib->ms.state.usr_retraining_latency_us;
s->mSOCParameters.SMNLatency = mode_lib->ms.soc.smn_latency_us;
CalculateWatermarks_params->USRRetrainingRequiredFinal = mode_lib->ms.policy.USRRetrainingRequiredFinal;
CalculateWatermarks_params->UseMALLForPStateChange = mode_lib->ms.cache_display_cfg.plane.UseMALLForPStateChange;
CalculateWatermarks_params->PrefetchMode = mode_lib->ms.PrefetchMode;
CalculateWatermarks_params->NumberOfActiveSurfaces = mode_lib->ms.num_active_planes;
CalculateWatermarks_params->MaxLineBufferLines = mode_lib->ms.ip.max_line_buffer_lines;
CalculateWatermarks_params->LineBufferSize = mode_lib->ms.ip.line_buffer_size_bits;
CalculateWatermarks_params->WritebackInterfaceBufferSize = mode_lib->ms.ip.writeback_interface_buffer_size_kbytes;
CalculateWatermarks_params->DCFCLK = mode_lib->ms.DCFCLKState[j];
CalculateWatermarks_params->ReturnBW = mode_lib->ms.ReturnBWPerState[j];
CalculateWatermarks_params->SynchronizeTimingsFinal = mode_lib->ms.policy.SynchronizeTimingsFinal;
CalculateWatermarks_params->SynchronizeDRRDisplaysForUCLKPStateChangeFinal = mode_lib->ms.policy.SynchronizeDRRDisplaysForUCLKPStateChangeFinal;
CalculateWatermarks_params->DRRDisplay = mode_lib->ms.cache_display_cfg.timing.DRRDisplay;
CalculateWatermarks_params->dpte_group_bytes = mode_lib->ms.dpte_group_bytes;
CalculateWatermarks_params->meta_row_height = mode_lib->ms.meta_row_height;
CalculateWatermarks_params->meta_row_height_chroma = mode_lib->ms.meta_row_height_chroma;
CalculateWatermarks_params->mmSOCParameters = s->mSOCParameters;
CalculateWatermarks_params->WritebackChunkSize = mode_lib->ms.ip.writeback_chunk_size_kbytes;
CalculateWatermarks_params->SOCCLK = mode_lib->ms.state.socclk_mhz;
CalculateWatermarks_params->DCFClkDeepSleep = mode_lib->ms.ProjectedDCFCLKDeepSleep[j];
CalculateWatermarks_params->DETBufferSizeY = mode_lib->ms.DETBufferSizeYThisState;
CalculateWatermarks_params->DETBufferSizeC = mode_lib->ms.DETBufferSizeCThisState;
CalculateWatermarks_params->SwathHeightY = mode_lib->ms.SwathHeightYThisState;
CalculateWatermarks_params->SwathHeightC = mode_lib->ms.SwathHeightCThisState;
CalculateWatermarks_params->LBBitPerPixel = mode_lib->ms.cache_display_cfg.plane.LBBitPerPixel;
CalculateWatermarks_params->SwathWidthY = mode_lib->ms.SwathWidthYThisState;
CalculateWatermarks_params->SwathWidthC = mode_lib->ms.SwathWidthCThisState;
CalculateWatermarks_params->HRatio = mode_lib->ms.cache_display_cfg.plane.HRatio;
CalculateWatermarks_params->HRatioChroma = mode_lib->ms.cache_display_cfg.plane.HRatioChroma;
CalculateWatermarks_params->VTaps = mode_lib->ms.cache_display_cfg.plane.VTaps;
CalculateWatermarks_params->VTapsChroma = mode_lib->ms.cache_display_cfg.plane.VTapsChroma;
CalculateWatermarks_params->VRatio = mode_lib->ms.cache_display_cfg.plane.VRatio;
CalculateWatermarks_params->VRatioChroma = mode_lib->ms.cache_display_cfg.plane.VRatioChroma;
CalculateWatermarks_params->HTotal = mode_lib->ms.cache_display_cfg.timing.HTotal;
CalculateWatermarks_params->VTotal = mode_lib->ms.cache_display_cfg.timing.VTotal;
CalculateWatermarks_params->VActive = mode_lib->ms.cache_display_cfg.timing.VActive;
CalculateWatermarks_params->PixelClock = mode_lib->ms.cache_display_cfg.timing.PixelClock;
CalculateWatermarks_params->BlendingAndTiming = mode_lib->ms.cache_display_cfg.plane.BlendingAndTiming;
CalculateWatermarks_params->DPPPerSurface = mode_lib->ms.NoOfDPPThisState;
CalculateWatermarks_params->BytePerPixelDETY = mode_lib->ms.BytePerPixelInDETY;
CalculateWatermarks_params->BytePerPixelDETC = mode_lib->ms.BytePerPixelInDETC;
CalculateWatermarks_params->DSTXAfterScaler = s->DSTXAfterScaler;
CalculateWatermarks_params->DSTYAfterScaler = s->DSTYAfterScaler;
CalculateWatermarks_params->WritebackEnable = mode_lib->ms.cache_display_cfg.writeback.WritebackEnable;
CalculateWatermarks_params->WritebackPixelFormat = mode_lib->ms.cache_display_cfg.writeback.WritebackPixelFormat;
CalculateWatermarks_params->WritebackDestinationWidth = mode_lib->ms.cache_display_cfg.writeback.WritebackDestinationWidth;
CalculateWatermarks_params->WritebackDestinationHeight = mode_lib->ms.cache_display_cfg.writeback.WritebackDestinationHeight;
CalculateWatermarks_params->WritebackSourceHeight = mode_lib->ms.cache_display_cfg.writeback.WritebackSourceHeight;
CalculateWatermarks_params->UnboundedRequestEnabled = mode_lib->ms.UnboundedRequestEnabledThisState;
CalculateWatermarks_params->CompressedBufferSizeInkByte = mode_lib->ms.CompressedBufferSizeInkByteThisState;
// Output
CalculateWatermarks_params->Watermark = &s->dummy_watermark; // Watermarks *Watermark
CalculateWatermarks_params->DRAMClockChangeSupport = &mode_lib->ms.support.DRAMClockChangeSupport[j];
CalculateWatermarks_params->MaxActiveDRAMClockChangeLatencySupported = &s->dummy_single_array[0]; // dml_float_t *MaxActiveDRAMClockChangeLatencySupported[]
CalculateWatermarks_params->SubViewportLinesNeededInMALL = &mode_lib->ms.SubViewportLinesNeededInMALL[j]; // dml_uint_t SubViewportLinesNeededInMALL[]
CalculateWatermarks_params->FCLKChangeSupport = &mode_lib->ms.support.FCLKChangeSupport[j];
CalculateWatermarks_params->MaxActiveFCLKChangeLatencySupported = &s->dummy_single[0]; // dml_float_t *MaxActiveFCLKChangeLatencySupported
CalculateWatermarks_params->USRRetrainingSupport = &mode_lib->ms.support.USRRetrainingSupport[j];
CalculateWatermarks_params->ActiveDRAMClockChangeLatencyMargin = mode_lib->ms.support.ActiveDRAMClockChangeLatencyMargin;
CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport(&mode_lib->scratch,
CalculateWatermarks_params);
} // for j
// End of Prefetch Check
dml_print("DML::%s: Done prefetch calculation\n", __func__);