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:
parent
7ef6b2d4b7
commit
b141fa036c
@ -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__);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user