1 /*
2  * Copyright 2020 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * Authors: AMD
23  *
24  */
25 
26 #ifdef CONFIG_DRM_AMD_DC_DCN
27 #include "dc.h"
28 #include "dc_link.h"
29 #include "../display_mode_lib.h"
30 #include "display_mode_vba_30.h"
31 #include "../dml_inline_defs.h"
32 
33 
34 /*
35  * NOTE:
36  *   This file is gcc-parsable HW gospel, coming straight from HW engineers.
37  *
38  * It doesn't adhere to Linux kernel style and sometimes will do things in odd
39  * ways. Unless there is something clearly wrong with it the code should
40  * remain as-is as it provides us with a guarantee from HW that it is correct.
41  */
42 
43 
44 typedef struct {
45 	double DPPCLK;
46 	double DISPCLK;
47 	double PixelClock;
48 	double DCFCLKDeepSleep;
49 	unsigned int DPPPerPlane;
50 	bool ScalerEnabled;
51 	enum scan_direction_class SourceScan;
52 	unsigned int BlockWidth256BytesY;
53 	unsigned int BlockHeight256BytesY;
54 	unsigned int BlockWidth256BytesC;
55 	unsigned int BlockHeight256BytesC;
56 	unsigned int InterlaceEnable;
57 	unsigned int NumberOfCursors;
58 	unsigned int VBlank;
59 	unsigned int HTotal;
60 	unsigned int DCCEnable;
61 	bool ODMCombineEnabled;
62 } Pipe;
63 
64 #define BPP_INVALID 0
65 #define BPP_BLENDED_PIPE 0xffffffff
66 #define DCN30_MAX_DSC_IMAGE_WIDTH 5184
67 #define DCN30_MAX_FMT_420_BUFFER_WIDTH 4096
68 
69 static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib);
70 static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(
71 		struct display_mode_lib *mode_lib);
72 static unsigned int dscceComputeDelay(
73 		unsigned int bpc,
74 		double BPP,
75 		unsigned int sliceWidth,
76 		unsigned int numSlices,
77 		enum output_format_class pixelFormat,
78 		enum output_encoder_class Output);
79 static unsigned int dscComputeDelay(
80 		enum output_format_class pixelFormat,
81 		enum output_encoder_class Output);
82 // Super monster function with some 45 argument
83 static bool CalculatePrefetchSchedule(
84 		struct display_mode_lib *mode_lib,
85 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
86 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
87 		Pipe *myPipe,
88 		unsigned int DSCDelay,
89 		double DPPCLKDelaySubtotalPlusCNVCFormater,
90 		double DPPCLKDelaySCL,
91 		double DPPCLKDelaySCLLBOnly,
92 		double DPPCLKDelayCNVCCursor,
93 		double DISPCLKDelaySubtotal,
94 		unsigned int DPP_RECOUT_WIDTH,
95 		enum output_format_class OutputFormat,
96 		unsigned int MaxInterDCNTileRepeaters,
97 		unsigned int VStartup,
98 		unsigned int MaxVStartup,
99 		unsigned int GPUVMPageTableLevels,
100 		bool GPUVMEnable,
101 		bool HostVMEnable,
102 		unsigned int HostVMMaxNonCachedPageTableLevels,
103 		double HostVMMinPageSize,
104 		bool DynamicMetadataEnable,
105 		bool DynamicMetadataVMEnabled,
106 		int DynamicMetadataLinesBeforeActiveRequired,
107 		unsigned int DynamicMetadataTransmittedBytes,
108 		double UrgentLatency,
109 		double UrgentExtraLatency,
110 		double TCalc,
111 		unsigned int PDEAndMetaPTEBytesFrame,
112 		unsigned int MetaRowByte,
113 		unsigned int PixelPTEBytesPerRow,
114 		double PrefetchSourceLinesY,
115 		unsigned int SwathWidthY,
116 		int BytePerPixelY,
117 		double VInitPreFillY,
118 		unsigned int MaxNumSwathY,
119 		double PrefetchSourceLinesC,
120 		unsigned int SwathWidthC,
121 		int BytePerPixelC,
122 		double VInitPreFillC,
123 		unsigned int MaxNumSwathC,
124 		long swath_width_luma_ub,
125 		long swath_width_chroma_ub,
126 		unsigned int SwathHeightY,
127 		unsigned int SwathHeightC,
128 		double TWait,
129 		bool ProgressiveToInterlaceUnitInOPP,
130 		double *DSTXAfterScaler,
131 		double *DSTYAfterScaler,
132 		double *DestinationLinesForPrefetch,
133 		double *PrefetchBandwidth,
134 		double *DestinationLinesToRequestVMInVBlank,
135 		double *DestinationLinesToRequestRowInVBlank,
136 		double *VRatioPrefetchY,
137 		double *VRatioPrefetchC,
138 		double *RequiredPrefetchPixDataBWLuma,
139 		double *RequiredPrefetchPixDataBWChroma,
140 		bool *NotEnoughTimeForDynamicMetadata,
141 		double *Tno_bw,
142 		double *prefetch_vmrow_bw,
143 		double *Tdmdl_vm,
144 		double *Tdmdl,
145 		unsigned int *VUpdateOffsetPix,
146 		double *VUpdateWidthPix,
147 		double *VReadyOffsetPix);
148 static double RoundToDFSGranularityUp(double Clock, double VCOSpeed);
149 static double RoundToDFSGranularityDown(double Clock, double VCOSpeed);
150 static void CalculateDCCConfiguration(
151 		bool DCCEnabled,
152 		bool DCCProgrammingAssumesScanDirectionUnknown,
153 		enum source_format_class SourcePixelFormat,
154 		unsigned int ViewportWidthLuma,
155 		unsigned int ViewportWidthChroma,
156 		unsigned int ViewportHeightLuma,
157 		unsigned int ViewportHeightChroma,
158 		double DETBufferSize,
159 		unsigned int RequestHeight256ByteLuma,
160 		unsigned int RequestHeight256ByteChroma,
161 		enum dm_swizzle_mode TilingFormat,
162 		unsigned int BytePerPixelY,
163 		unsigned int BytePerPixelC,
164 		double BytePerPixelDETY,
165 		double BytePerPixelDETC,
166 		enum scan_direction_class ScanOrientation,
167 		unsigned int *MaxUncompressedBlockLuma,
168 		unsigned int *MaxUncompressedBlockChroma,
169 		unsigned int *MaxCompressedBlockLuma,
170 		unsigned int *MaxCompressedBlockChroma,
171 		unsigned int *IndependentBlockLuma,
172 		unsigned int *IndependentBlockChroma);
173 static double CalculatePrefetchSourceLines(
174 		struct display_mode_lib *mode_lib,
175 		double VRatio,
176 		double vtaps,
177 		bool Interlace,
178 		bool ProgressiveToInterlaceUnitInOPP,
179 		unsigned int SwathHeight,
180 		unsigned int ViewportYStart,
181 		double *VInitPreFill,
182 		unsigned int *MaxNumSwath);
183 static unsigned int CalculateVMAndRowBytes(
184 		struct display_mode_lib *mode_lib,
185 		bool DCCEnable,
186 		unsigned int BlockHeight256Bytes,
187 		unsigned int BlockWidth256Bytes,
188 		enum source_format_class SourcePixelFormat,
189 		unsigned int SurfaceTiling,
190 		unsigned int BytePerPixel,
191 		enum scan_direction_class ScanDirection,
192 		unsigned int SwathWidth,
193 		unsigned int ViewportHeight,
194 		bool GPUVMEnable,
195 		bool HostVMEnable,
196 		unsigned int HostVMMaxNonCachedPageTableLevels,
197 		unsigned int GPUVMMinPageSize,
198 		unsigned int HostVMMinPageSize,
199 		unsigned int PTEBufferSizeInRequests,
200 		unsigned int Pitch,
201 		unsigned int DCCMetaPitch,
202 		unsigned int *MacroTileWidth,
203 		unsigned int *MetaRowByte,
204 		unsigned int *PixelPTEBytesPerRow,
205 		bool *PTEBufferSizeNotExceeded,
206 		unsigned int *dpte_row_width_ub,
207 		unsigned int *dpte_row_height,
208 		unsigned int *MetaRequestWidth,
209 		unsigned int *MetaRequestHeight,
210 		unsigned int *meta_row_width,
211 		unsigned int *meta_row_height,
212 		unsigned int *vm_group_bytes,
213 		unsigned int *dpte_group_bytes,
214 		unsigned int *PixelPTEReqWidth,
215 		unsigned int *PixelPTEReqHeight,
216 		unsigned int *PTERequestSize,
217 		unsigned int *DPDE0BytesFrame,
218 		unsigned int *MetaPTEBytesFrame);
219 static double CalculateTWait(
220 		unsigned int PrefetchMode,
221 		double DRAMClockChangeLatency,
222 		double UrgentLatency,
223 		double SREnterPlusExitTime);
224 static void CalculateRowBandwidth(
225 		bool GPUVMEnable,
226 		enum source_format_class SourcePixelFormat,
227 		double VRatio,
228 		double VRatioChroma,
229 		bool DCCEnable,
230 		double LineTime,
231 		unsigned int MetaRowByteLuma,
232 		unsigned int MetaRowByteChroma,
233 		unsigned int meta_row_height_luma,
234 		unsigned int meta_row_height_chroma,
235 		unsigned int PixelPTEBytesPerRowLuma,
236 		unsigned int PixelPTEBytesPerRowChroma,
237 		unsigned int dpte_row_height_luma,
238 		unsigned int dpte_row_height_chroma,
239 		double *meta_row_bw,
240 		double *dpte_row_bw);
241 static void CalculateFlipSchedule(
242 		struct display_mode_lib *mode_lib,
243 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
244 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
245 		double UrgentExtraLatency,
246 		double UrgentLatency,
247 		unsigned int GPUVMMaxPageTableLevels,
248 		bool HostVMEnable,
249 		unsigned int HostVMMaxNonCachedPageTableLevels,
250 		bool GPUVMEnable,
251 		double HostVMMinPageSize,
252 		double PDEAndMetaPTEBytesPerFrame,
253 		double MetaRowBytes,
254 		double DPTEBytesPerRow,
255 		double BandwidthAvailableForImmediateFlip,
256 		unsigned int TotImmediateFlipBytes,
257 		enum source_format_class SourcePixelFormat,
258 		double LineTime,
259 		double VRatio,
260 		double VRatioChroma,
261 		double Tno_bw,
262 		bool DCCEnable,
263 		unsigned int dpte_row_height,
264 		unsigned int meta_row_height,
265 		unsigned int dpte_row_height_chroma,
266 		unsigned int meta_row_height_chroma,
267 		double *DestinationLinesToRequestVMInImmediateFlip,
268 		double *DestinationLinesToRequestRowInImmediateFlip,
269 		double *final_flip_bw,
270 		bool *ImmediateFlipSupportedForPipe);
271 static double CalculateWriteBackDelay(
272 		enum source_format_class WritebackPixelFormat,
273 		double WritebackHRatio,
274 		double WritebackVRatio,
275 		unsigned int WritebackVTaps,
276 		long WritebackDestinationWidth,
277 		long WritebackDestinationHeight,
278 		long WritebackSourceHeight,
279 		unsigned int HTotal);
280 static void CalculateDynamicMetadataParameters(
281 		int MaxInterDCNTileRepeaters,
282 		double DPPCLK,
283 		double DISPCLK,
284 		double DCFClkDeepSleep,
285 		double PixelClock,
286 		long HTotal,
287 		long VBlank,
288 		long DynamicMetadataTransmittedBytes,
289 		long DynamicMetadataLinesBeforeActiveRequired,
290 		int InterlaceEnable,
291 		bool ProgressiveToInterlaceUnitInOPP,
292 		double *Tsetup,
293 		double *Tdmbf,
294 		double *Tdmec,
295 		double *Tdmsks);
296 static void CalculateWatermarksAndDRAMSpeedChangeSupport(
297 		struct display_mode_lib *mode_lib,
298 		unsigned int PrefetchMode,
299 		unsigned int NumberOfActivePlanes,
300 		unsigned int MaxLineBufferLines,
301 		unsigned int LineBufferSize,
302 		unsigned int DPPOutputBufferPixels,
303 		unsigned int DETBufferSizeInKByte,
304 		unsigned int WritebackInterfaceBufferSize,
305 		double DCFCLK,
306 		double ReturnBW,
307 		bool GPUVMEnable,
308 		unsigned int dpte_group_bytes[],
309 		unsigned int MetaChunkSize,
310 		double UrgentLatency,
311 		double ExtraLatency,
312 		double WritebackLatency,
313 		double WritebackChunkSize,
314 		double SOCCLK,
315 		double DRAMClockChangeLatency,
316 		double SRExitTime,
317 		double SREnterPlusExitTime,
318 		double DCFCLKDeepSleep,
319 		unsigned int DPPPerPlane[],
320 		bool DCCEnable[],
321 		double DPPCLK[],
322 		unsigned int DETBufferSizeY[],
323 		unsigned int DETBufferSizeC[],
324 		unsigned int SwathHeightY[],
325 		unsigned int SwathHeightC[],
326 		unsigned int LBBitPerPixel[],
327 		double SwathWidthY[],
328 		double SwathWidthC[],
329 		double HRatio[],
330 		double HRatioChroma[],
331 		unsigned int vtaps[],
332 		unsigned int VTAPsChroma[],
333 		double VRatio[],
334 		double VRatioChroma[],
335 		unsigned int HTotal[],
336 		double PixelClock[],
337 		unsigned int BlendingAndTiming[],
338 		double BytePerPixelDETY[],
339 		double BytePerPixelDETC[],
340 		double DSTXAfterScaler[],
341 		double DSTYAfterScaler[],
342 		bool WritebackEnable[],
343 		enum source_format_class WritebackPixelFormat[],
344 		double WritebackDestinationWidth[],
345 		double WritebackDestinationHeight[],
346 		double WritebackSourceHeight[],
347 		enum clock_change_support *DRAMClockChangeSupport,
348 		double *UrgentWatermark,
349 		double *WritebackUrgentWatermark,
350 		double *DRAMClockChangeWatermark,
351 		double *WritebackDRAMClockChangeWatermark,
352 		double *StutterExitWatermark,
353 		double *StutterEnterPlusExitWatermark,
354 		double *MinActiveDRAMClockChangeLatencySupported);
355 static void CalculateDCFCLKDeepSleep(
356 		struct display_mode_lib *mode_lib,
357 		unsigned int NumberOfActivePlanes,
358 		int BytePerPixelY[],
359 		int BytePerPixelC[],
360 		double VRatio[],
361 		double VRatioChroma[],
362 		double SwathWidthY[],
363 		double SwathWidthC[],
364 		unsigned int DPPPerPlane[],
365 		double HRatio[],
366 		double HRatioChroma[],
367 		double PixelClock[],
368 		double PSCL_THROUGHPUT[],
369 		double PSCL_THROUGHPUT_CHROMA[],
370 		double DPPCLK[],
371 		double ReadBandwidthLuma[],
372 		double ReadBandwidthChroma[],
373 		int ReturnBusWidth,
374 		double *DCFCLKDeepSleep);
375 static void CalculateUrgentBurstFactor(
376 		long swath_width_luma_ub,
377 		long swath_width_chroma_ub,
378 		unsigned int DETBufferSizeInKByte,
379 		unsigned int SwathHeightY,
380 		unsigned int SwathHeightC,
381 		double LineTime,
382 		double UrgentLatency,
383 		double CursorBufferSize,
384 		unsigned int CursorWidth,
385 		unsigned int CursorBPP,
386 		double VRatio,
387 		double VRatioC,
388 		double BytePerPixelInDETY,
389 		double BytePerPixelInDETC,
390 		double DETBufferSizeY,
391 		double DETBufferSizeC,
392 		double *UrgentBurstFactorCursor,
393 		double *UrgentBurstFactorLuma,
394 		double *UrgentBurstFactorChroma,
395 		bool *NotEnoughUrgentLatencyHiding);
396 
397 static void UseMinimumDCFCLK(
398 		struct display_mode_lib *mode_lib,
399 		int MaxInterDCNTileRepeaters,
400 		int MaxPrefetchMode,
401 		double FinalDRAMClockChangeLatency,
402 		double SREnterPlusExitTime,
403 		int ReturnBusWidth,
404 		int RoundTripPingLatencyCycles,
405 		int ReorderingBytes,
406 		int PixelChunkSizeInKByte,
407 		int MetaChunkSize,
408 		bool GPUVMEnable,
409 		int GPUVMMaxPageTableLevels,
410 		bool HostVMEnable,
411 		int NumberOfActivePlanes,
412 		double HostVMMinPageSize,
413 		int HostVMMaxNonCachedPageTableLevels,
414 		bool DynamicMetadataVMEnabled,
415 		enum immediate_flip_requirement ImmediateFlipRequirement,
416 		bool ProgressiveToInterlaceUnitInOPP,
417 		double MaxAveragePercentOfIdealSDPPortBWDisplayCanUseInNormalSystemOperation,
418 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
419 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
420 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelDataOnly,
421 		int VTotal[],
422 		int VActive[],
423 		int DynamicMetadataTransmittedBytes[],
424 		int DynamicMetadataLinesBeforeActiveRequired[],
425 		bool Interlace[],
426 		double RequiredDPPCLK[][2][DC__NUM_DPP__MAX],
427 		double RequiredDISPCLK[][2],
428 		double UrgLatency[],
429 		unsigned int NoOfDPP[][2][DC__NUM_DPP__MAX],
430 		double ProjectedDCFCLKDeepSleep[][2],
431 		double MaximumVStartup[][2][DC__NUM_DPP__MAX],
432 		double TotalVActivePixelBandwidth[][2],
433 		double TotalVActiveCursorBandwidth[][2],
434 		double TotalMetaRowBandwidth[][2],
435 		double TotalDPTERowBandwidth[][2],
436 		unsigned int TotalNumberOfActiveDPP[][2],
437 		unsigned int TotalNumberOfDCCActiveDPP[][2],
438 		int dpte_group_bytes[],
439 		double PrefetchLinesY[][2][DC__NUM_DPP__MAX],
440 		double PrefetchLinesC[][2][DC__NUM_DPP__MAX],
441 		unsigned int swath_width_luma_ub_all_states[][2][DC__NUM_DPP__MAX],
442 		unsigned int swath_width_chroma_ub_all_states[][2][DC__NUM_DPP__MAX],
443 		int BytePerPixelY[],
444 		int BytePerPixelC[],
445 		int HTotal[],
446 		double PixelClock[],
447 		double PDEAndMetaPTEBytesPerFrame[][2][DC__NUM_DPP__MAX],
448 		double DPTEBytesPerRow[][2][DC__NUM_DPP__MAX],
449 		double MetaRowBytes[][2][DC__NUM_DPP__MAX],
450 		bool DynamicMetadataEnable[],
451 		double VActivePixelBandwidth[][2][DC__NUM_DPP__MAX],
452 		double VActiveCursorBandwidth[][2][DC__NUM_DPP__MAX],
453 		double ReadBandwidthLuma[],
454 		double ReadBandwidthChroma[],
455 		double DCFCLKPerState[],
456 		double DCFCLKState[][2]);
457 static void CalculatePixelDeliveryTimes(
458 		unsigned int NumberOfActivePlanes,
459 		double VRatio[],
460 		double VRatioChroma[],
461 		double VRatioPrefetchY[],
462 		double VRatioPrefetchC[],
463 		unsigned int swath_width_luma_ub[],
464 		unsigned int swath_width_chroma_ub[],
465 		unsigned int DPPPerPlane[],
466 		double HRatio[],
467 		double HRatioChroma[],
468 		double PixelClock[],
469 		double PSCL_THROUGHPUT[],
470 		double PSCL_THROUGHPUT_CHROMA[],
471 		double DPPCLK[],
472 		int BytePerPixelC[],
473 		enum scan_direction_class SourceScan[],
474 		unsigned int NumberOfCursors[],
475 		unsigned int CursorWidth[][2],
476 		unsigned int CursorBPP[][2],
477 		unsigned int BlockWidth256BytesY[],
478 		unsigned int BlockHeight256BytesY[],
479 		unsigned int BlockWidth256BytesC[],
480 		unsigned int BlockHeight256BytesC[],
481 		double DisplayPipeLineDeliveryTimeLuma[],
482 		double DisplayPipeLineDeliveryTimeChroma[],
483 		double DisplayPipeLineDeliveryTimeLumaPrefetch[],
484 		double DisplayPipeLineDeliveryTimeChromaPrefetch[],
485 		double DisplayPipeRequestDeliveryTimeLuma[],
486 		double DisplayPipeRequestDeliveryTimeChroma[],
487 		double DisplayPipeRequestDeliveryTimeLumaPrefetch[],
488 		double DisplayPipeRequestDeliveryTimeChromaPrefetch[],
489 		double CursorRequestDeliveryTime[],
490 		double CursorRequestDeliveryTimePrefetch[]);
491 
492 static void CalculateMetaAndPTETimes(
493 		int NumberOfActivePlanes,
494 		bool GPUVMEnable,
495 		int MetaChunkSize,
496 		int MinMetaChunkSizeBytes,
497 		int HTotal[],
498 		double VRatio[],
499 		double VRatioChroma[],
500 		double DestinationLinesToRequestRowInVBlank[],
501 		double DestinationLinesToRequestRowInImmediateFlip[],
502 		bool DCCEnable[],
503 		double PixelClock[],
504 		int BytePerPixelY[],
505 		int BytePerPixelC[],
506 		enum scan_direction_class SourceScan[],
507 		int dpte_row_height[],
508 		int dpte_row_height_chroma[],
509 		int meta_row_width[],
510 		int meta_row_width_chroma[],
511 		int meta_row_height[],
512 		int meta_row_height_chroma[],
513 		int meta_req_width[],
514 		int meta_req_width_chroma[],
515 		int meta_req_height[],
516 		int meta_req_height_chroma[],
517 		int dpte_group_bytes[],
518 		int PTERequestSizeY[],
519 		int PTERequestSizeC[],
520 		int PixelPTEReqWidthY[],
521 		int PixelPTEReqHeightY[],
522 		int PixelPTEReqWidthC[],
523 		int PixelPTEReqHeightC[],
524 		int dpte_row_width_luma_ub[],
525 		int dpte_row_width_chroma_ub[],
526 		double DST_Y_PER_PTE_ROW_NOM_L[],
527 		double DST_Y_PER_PTE_ROW_NOM_C[],
528 		double DST_Y_PER_META_ROW_NOM_L[],
529 		double DST_Y_PER_META_ROW_NOM_C[],
530 		double TimePerMetaChunkNominal[],
531 		double TimePerChromaMetaChunkNominal[],
532 		double TimePerMetaChunkVBlank[],
533 		double TimePerChromaMetaChunkVBlank[],
534 		double TimePerMetaChunkFlip[],
535 		double TimePerChromaMetaChunkFlip[],
536 		double time_per_pte_group_nom_luma[],
537 		double time_per_pte_group_vblank_luma[],
538 		double time_per_pte_group_flip_luma[],
539 		double time_per_pte_group_nom_chroma[],
540 		double time_per_pte_group_vblank_chroma[],
541 		double time_per_pte_group_flip_chroma[]);
542 
543 static void CalculateVMGroupAndRequestTimes(
544 		unsigned int NumberOfActivePlanes,
545 		bool GPUVMEnable,
546 		unsigned int GPUVMMaxPageTableLevels,
547 		unsigned int HTotal[],
548 		int BytePerPixelC[],
549 		double DestinationLinesToRequestVMInVBlank[],
550 		double DestinationLinesToRequestVMInImmediateFlip[],
551 		bool DCCEnable[],
552 		double PixelClock[],
553 		int dpte_row_width_luma_ub[],
554 		int dpte_row_width_chroma_ub[],
555 		int vm_group_bytes[],
556 		unsigned int dpde0_bytes_per_frame_ub_l[],
557 		unsigned int dpde0_bytes_per_frame_ub_c[],
558 		int meta_pte_bytes_per_frame_ub_l[],
559 		int meta_pte_bytes_per_frame_ub_c[],
560 		double TimePerVMGroupVBlank[],
561 		double TimePerVMGroupFlip[],
562 		double TimePerVMRequestVBlank[],
563 		double TimePerVMRequestFlip[]);
564 
565 static void CalculateStutterEfficiency(
566 		int NumberOfActivePlanes,
567 		long ROBBufferSizeInKByte,
568 		double TotalDataReadBandwidth,
569 		double DCFCLK,
570 		double ReturnBW,
571 		double SRExitTime,
572 		bool SynchronizedVBlank,
573 		int DPPPerPlane[],
574 		unsigned int DETBufferSizeY[],
575 		int BytePerPixelY[],
576 		double BytePerPixelDETY[],
577 		double SwathWidthY[],
578 		int SwathHeightY[],
579 		int SwathHeightC[],
580 		double DCCRateLuma[],
581 		double DCCRateChroma[],
582 		int HTotal[],
583 		int VTotal[],
584 		double PixelClock[],
585 		double VRatio[],
586 		enum scan_direction_class SourceScan[],
587 		int BlockHeight256BytesY[],
588 		int BlockWidth256BytesY[],
589 		int BlockHeight256BytesC[],
590 		int BlockWidth256BytesC[],
591 		int DCCYMaxUncompressedBlock[],
592 		int DCCCMaxUncompressedBlock[],
593 		int VActive[],
594 		bool DCCEnable[],
595 		bool WritebackEnable[],
596 		double ReadBandwidthPlaneLuma[],
597 		double ReadBandwidthPlaneChroma[],
598 		double meta_row_bw[],
599 		double dpte_row_bw[],
600 		double *StutterEfficiencyNotIncludingVBlank,
601 		double *StutterEfficiency,
602 		double *StutterPeriodOut);
603 
604 static void CalculateSwathAndDETConfiguration(
605 		bool ForceSingleDPP,
606 		int NumberOfActivePlanes,
607 		unsigned int DETBufferSizeInKByte,
608 		double MaximumSwathWidthLuma[],
609 		double MaximumSwathWidthChroma[],
610 		enum scan_direction_class SourceScan[],
611 		enum source_format_class SourcePixelFormat[],
612 		enum dm_swizzle_mode SurfaceTiling[],
613 		int ViewportWidth[],
614 		int ViewportHeight[],
615 		int SurfaceWidthY[],
616 		int SurfaceWidthC[],
617 		int SurfaceHeightY[],
618 		int SurfaceHeightC[],
619 		int Read256BytesBlockHeightY[],
620 		int Read256BytesBlockHeightC[],
621 		int Read256BytesBlockWidthY[],
622 		int Read256BytesBlockWidthC[],
623 		enum odm_combine_mode ODMCombineEnabled[],
624 		int BlendingAndTiming[],
625 		int BytePerPixY[],
626 		int BytePerPixC[],
627 		double BytePerPixDETY[],
628 		double BytePerPixDETC[],
629 		int HActive[],
630 		double HRatio[],
631 		double HRatioChroma[],
632 		int DPPPerPlane[],
633 		int swath_width_luma_ub[],
634 		int swath_width_chroma_ub[],
635 		double SwathWidth[],
636 		double SwathWidthChroma[],
637 		int SwathHeightY[],
638 		int SwathHeightC[],
639 		unsigned int DETBufferSizeY[],
640 		unsigned int DETBufferSizeC[],
641 		bool ViewportSizeSupportPerPlane[],
642 		bool *ViewportSizeSupport);
643 static void CalculateSwathWidth(
644 		bool ForceSingleDPP,
645 		int NumberOfActivePlanes,
646 		enum source_format_class SourcePixelFormat[],
647 		enum scan_direction_class SourceScan[],
648 		unsigned int ViewportWidth[],
649 		unsigned int ViewportHeight[],
650 		unsigned int SurfaceWidthY[],
651 		unsigned int SurfaceWidthC[],
652 		unsigned int SurfaceHeightY[],
653 		unsigned int SurfaceHeightC[],
654 		enum odm_combine_mode ODMCombineEnabled[],
655 		int BytePerPixY[],
656 		int BytePerPixC[],
657 		int Read256BytesBlockHeightY[],
658 		int Read256BytesBlockHeightC[],
659 		int Read256BytesBlockWidthY[],
660 		int Read256BytesBlockWidthC[],
661 		int BlendingAndTiming[],
662 		unsigned int HActive[],
663 		double HRatio[],
664 		int DPPPerPlane[],
665 		double SwathWidthSingleDPPY[],
666 		double SwathWidthSingleDPPC[],
667 		double SwathWidthY[],
668 		double SwathWidthC[],
669 		int MaximumSwathHeightY[],
670 		int MaximumSwathHeightC[],
671 		unsigned int swath_width_luma_ub[],
672 		unsigned int swath_width_chroma_ub[]);
673 static double CalculateExtraLatency(
674 		long RoundTripPingLatencyCycles,
675 		long ReorderingBytes,
676 		double DCFCLK,
677 		int TotalNumberOfActiveDPP,
678 		int PixelChunkSizeInKByte,
679 		int TotalNumberOfDCCActiveDPP,
680 		int MetaChunkSize,
681 		double ReturnBW,
682 		bool GPUVMEnable,
683 		bool HostVMEnable,
684 		int NumberOfActivePlanes,
685 		int NumberOfDPP[],
686 		int dpte_group_bytes[],
687 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
688 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
689 		double HostVMMinPageSize,
690 		int HostVMMaxNonCachedPageTableLevels);
691 static double CalculateExtraLatencyBytes(
692 		long ReorderingBytes,
693 		int TotalNumberOfActiveDPP,
694 		int PixelChunkSizeInKByte,
695 		int TotalNumberOfDCCActiveDPP,
696 		int MetaChunkSize,
697 		bool GPUVMEnable,
698 		bool HostVMEnable,
699 		int NumberOfActivePlanes,
700 		int NumberOfDPP[],
701 		int dpte_group_bytes[],
702 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
703 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
704 		double HostVMMinPageSize,
705 		int HostVMMaxNonCachedPageTableLevels);
706 static double CalculateUrgentLatency(
707 		double UrgentLatencyPixelDataOnly,
708 		double UrgentLatencyPixelMixedWithVMData,
709 		double UrgentLatencyVMDataOnly,
710 		bool DoUrgentLatencyAdjustment,
711 		double UrgentLatencyAdjustmentFabricClockComponent,
712 		double UrgentLatencyAdjustmentFabricClockReference,
713 		double FabricClockSingle);
714 
715 void dml30_recalculate(struct display_mode_lib *mode_lib)
716 {
717 	ModeSupportAndSystemConfiguration(mode_lib);
718 	PixelClockAdjustmentForProgressiveToInterlaceUnit(mode_lib);
719 	DisplayPipeConfiguration(mode_lib);
720 	DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(mode_lib);
721 }
722 
723 static unsigned int dscceComputeDelay(
724 		unsigned int bpc,
725 		double BPP,
726 		unsigned int sliceWidth,
727 		unsigned int numSlices,
728 		enum output_format_class pixelFormat,
729 		enum output_encoder_class Output)
730 {
731 	// valid bpc         = source bits per component in the set of {8, 10, 12}
732 	// valid bpp         = increments of 1/16 of a bit
733 	//                    min = 6/7/8 in N420/N422/444, respectively
734 	//                    max = such that compression is 1:1
735 	//valid sliceWidth  = number of pixels per slice line, must be less than or equal to 5184/numSlices (or 4096/numSlices in 420 mode)
736 	//valid numSlices   = number of slices in the horiziontal direction per DSC engine in the set of {1, 2, 3, 4}
737 	//valid pixelFormat = pixel/color format in the set of {:N444_RGB, :S422, :N422, :N420}
738 
739 	// fixed value
740 	unsigned int rcModelSize = 8192;
741 
742 	// N422/N420 operate at 2 pixels per clock
743 	unsigned int pixelsPerClock, lstall, D, initalXmitDelay, w, s, ix, wx, P, l0, a, ax, L,
744 			Delay, pixels;
745 
746 	if (pixelFormat == dm_420)
747 		pixelsPerClock = 2;
748 	// #all other modes operate at 1 pixel per clock
749 	else if (pixelFormat == dm_444)
750 		pixelsPerClock = 1;
751 	else if (pixelFormat == dm_n422)
752 		pixelsPerClock = 2;
753 	else
754 		pixelsPerClock = 1;
755 
756 	//initial transmit delay as per PPS
757 	initalXmitDelay = dml_round(rcModelSize / 2.0 / BPP / pixelsPerClock);
758 
759 	//compute ssm delay
760 	if (bpc == 8)
761 		D = 81;
762 	else if (bpc == 10)
763 		D = 89;
764 	else
765 		D = 113;
766 
767 	//divide by pixel per cycle to compute slice width as seen by DSC
768 	w = sliceWidth / pixelsPerClock;
769 
770 	//422 mode has an additional cycle of delay
771 	if (pixelFormat == dm_420 || pixelFormat == dm_444 || pixelFormat == dm_n422)
772 		s = 0;
773 	else
774 		s = 1;
775 
776 	//main calculation for the dscce
777 	ix = initalXmitDelay + 45;
778 	wx = (w + 2) / 3;
779 	P = 3 * wx - w;
780 	l0 = ix / w;
781 	a = ix + P * l0;
782 	ax = (a + 2) / 3 + D + 6 + 1;
783 	L = (ax + wx - 1) / wx;
784 	if ((ix % w) == 0 && P != 0)
785 		lstall = 1;
786 	else
787 		lstall = 0;
788 	Delay = L * wx * (numSlices - 1) + ax + s + lstall + 22;
789 
790 	//dsc processes 3 pixel containers per cycle and a container can contain 1 or 2 pixels
791 	pixels = Delay * 3 * pixelsPerClock;
792 	return pixels;
793 }
794 
795 static unsigned int dscComputeDelay(enum output_format_class pixelFormat, enum output_encoder_class Output)
796 {
797 	unsigned int Delay = 0;
798 
799 	if (pixelFormat == dm_420) {
800 		//   sfr
801 		Delay = Delay + 2;
802 		//   dsccif
803 		Delay = Delay + 0;
804 		//   dscc - input deserializer
805 		Delay = Delay + 3;
806 		//   dscc gets pixels every other cycle
807 		Delay = Delay + 2;
808 		//   dscc - input cdc fifo
809 		Delay = Delay + 12;
810 		//   dscc gets pixels every other cycle
811 		Delay = Delay + 13;
812 		//   dscc - cdc uncertainty
813 		Delay = Delay + 2;
814 		//   dscc - output cdc fifo
815 		Delay = Delay + 7;
816 		//   dscc gets pixels every other cycle
817 		Delay = Delay + 3;
818 		//   dscc - cdc uncertainty
819 		Delay = Delay + 2;
820 		//   dscc - output serializer
821 		Delay = Delay + 1;
822 		//   sft
823 		Delay = Delay + 1;
824 	} else if (pixelFormat == dm_n422) {
825 		//   sfr
826 		Delay = Delay + 2;
827 		//   dsccif
828 		Delay = Delay + 1;
829 		//   dscc - input deserializer
830 		Delay = Delay + 5;
831 		//  dscc - input cdc fifo
832 		Delay = Delay + 25;
833 		//   dscc - cdc uncertainty
834 		Delay = Delay + 2;
835 		//   dscc - output cdc fifo
836 		Delay = Delay + 10;
837 		//   dscc - cdc uncertainty
838 		Delay = Delay + 2;
839 		//   dscc - output serializer
840 		Delay = Delay + 1;
841 		//   sft
842 		Delay = Delay + 1;
843 	}
844 	else {
845 		//   sfr
846 		Delay = Delay + 2;
847 		//   dsccif
848 		Delay = Delay + 0;
849 		//   dscc - input deserializer
850 		Delay = Delay + 3;
851 		//   dscc - input cdc fifo
852 		Delay = Delay + 12;
853 		//   dscc - cdc uncertainty
854 		Delay = Delay + 2;
855 		//   dscc - output cdc fifo
856 		Delay = Delay + 7;
857 		//   dscc - output serializer
858 		Delay = Delay + 1;
859 		//   dscc - cdc uncertainty
860 		Delay = Delay + 2;
861 		//   sft
862 		Delay = Delay + 1;
863 	}
864 
865 	return Delay;
866 }
867 
868 static bool CalculatePrefetchSchedule(
869 		struct display_mode_lib *mode_lib,
870 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
871 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
872 		Pipe *myPipe,
873 		unsigned int DSCDelay,
874 		double DPPCLKDelaySubtotalPlusCNVCFormater,
875 		double DPPCLKDelaySCL,
876 		double DPPCLKDelaySCLLBOnly,
877 		double DPPCLKDelayCNVCCursor,
878 		double DISPCLKDelaySubtotal,
879 		unsigned int DPP_RECOUT_WIDTH,
880 		enum output_format_class OutputFormat,
881 		unsigned int MaxInterDCNTileRepeaters,
882 		unsigned int VStartup,
883 		unsigned int MaxVStartup,
884 		unsigned int GPUVMPageTableLevels,
885 		bool GPUVMEnable,
886 		bool HostVMEnable,
887 		unsigned int HostVMMaxNonCachedPageTableLevels,
888 		double HostVMMinPageSize,
889 		bool DynamicMetadataEnable,
890 		bool DynamicMetadataVMEnabled,
891 		int DynamicMetadataLinesBeforeActiveRequired,
892 		unsigned int DynamicMetadataTransmittedBytes,
893 		double UrgentLatency,
894 		double UrgentExtraLatency,
895 		double TCalc,
896 		unsigned int PDEAndMetaPTEBytesFrame,
897 		unsigned int MetaRowByte,
898 		unsigned int PixelPTEBytesPerRow,
899 		double PrefetchSourceLinesY,
900 		unsigned int SwathWidthY,
901 		int BytePerPixelY,
902 		double VInitPreFillY,
903 		unsigned int MaxNumSwathY,
904 		double PrefetchSourceLinesC,
905 		unsigned int SwathWidthC,
906 		int BytePerPixelC,
907 		double VInitPreFillC,
908 		unsigned int MaxNumSwathC,
909 		long swath_width_luma_ub,
910 		long swath_width_chroma_ub,
911 		unsigned int SwathHeightY,
912 		unsigned int SwathHeightC,
913 		double TWait,
914 		bool ProgressiveToInterlaceUnitInOPP,
915 		double *DSTXAfterScaler,
916 		double *DSTYAfterScaler,
917 		double *DestinationLinesForPrefetch,
918 		double *PrefetchBandwidth,
919 		double *DestinationLinesToRequestVMInVBlank,
920 		double *DestinationLinesToRequestRowInVBlank,
921 		double *VRatioPrefetchY,
922 		double *VRatioPrefetchC,
923 		double *RequiredPrefetchPixDataBWLuma,
924 		double *RequiredPrefetchPixDataBWChroma,
925 		bool *NotEnoughTimeForDynamicMetadata,
926 		double *Tno_bw,
927 		double *prefetch_vmrow_bw,
928 		double *Tdmdl_vm,
929 		double *Tdmdl,
930 		unsigned int *VUpdateOffsetPix,
931 		double *VUpdateWidthPix,
932 		double *VReadyOffsetPix)
933 {
934 	bool MyError = false;
935 	unsigned int DPPCycles = 0, DISPCLKCycles = 0;
936 	double DSTTotalPixelsAfterScaler = 0;
937 	double LineTime = 0, Tsetup = 0;
938 	double dst_y_prefetch_equ = 0;
939 	double Tsw_oto = 0;
940 	double prefetch_bw_oto = 0;
941 	double Tvm_oto = 0;
942 	double Tr0_oto = 0;
943 	double Tvm_oto_lines = 0;
944 	double Tr0_oto_lines = 0;
945 	double dst_y_prefetch_oto = 0;
946 	double TimeForFetchingMetaPTE = 0;
947 	double TimeForFetchingRowInVBlank = 0;
948 	double LinesToRequestPrefetchPixelData = 0;
949 	double HostVMInefficiencyFactor = 0;
950 	unsigned int HostVMDynamicLevelsTrips = 0;
951 	double trip_to_mem = 0;
952 	double Tvm_trips = 0;
953 	double Tr0_trips = 0;
954 	double Tvm_trips_rounded = 0;
955 	double Tr0_trips_rounded = 0;
956 	double Lsw_oto = 0;
957 	double Tpre_rounded = 0;
958 	double prefetch_bw_equ = 0;
959 	double Tvm_equ = 0;
960 	double Tr0_equ = 0;
961 	double Tdmbf = 0;
962 	double Tdmec = 0;
963 	double Tdmsks = 0;
964 
965 	if (GPUVMEnable == true && HostVMEnable == true) {
966 		HostVMInefficiencyFactor = PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData / PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly;
967 		HostVMDynamicLevelsTrips = HostVMMaxNonCachedPageTableLevels;
968 	} else {
969 		HostVMInefficiencyFactor = 1;
970 		HostVMDynamicLevelsTrips = 0;
971 	}
972 
973 	CalculateDynamicMetadataParameters(
974 			MaxInterDCNTileRepeaters,
975 			myPipe->DPPCLK,
976 			myPipe->DISPCLK,
977 			myPipe->DCFCLKDeepSleep,
978 			myPipe->PixelClock,
979 			myPipe->HTotal,
980 			myPipe->VBlank,
981 			DynamicMetadataTransmittedBytes,
982 			DynamicMetadataLinesBeforeActiveRequired,
983 			myPipe->InterlaceEnable,
984 			ProgressiveToInterlaceUnitInOPP,
985 			&Tsetup,
986 			&Tdmbf,
987 			&Tdmec,
988 			&Tdmsks);
989 
990 	LineTime = myPipe->HTotal / myPipe->PixelClock;
991 	trip_to_mem = UrgentLatency;
992 	Tvm_trips = UrgentExtraLatency + trip_to_mem * (GPUVMPageTableLevels * (HostVMDynamicLevelsTrips + 1) - 1);
993 
994 	if (DynamicMetadataVMEnabled == true && GPUVMEnable == true) {
995 		*Tdmdl = TWait + Tvm_trips + trip_to_mem;
996 	} else {
997 		*Tdmdl = TWait + UrgentExtraLatency;
998 	}
999 
1000 	if (DynamicMetadataEnable == true) {
1001 		if (VStartup * LineTime < Tsetup + *Tdmdl + Tdmbf + Tdmec + Tdmsks) {
1002 			*NotEnoughTimeForDynamicMetadata = true;
1003 		} else {
1004 			*NotEnoughTimeForDynamicMetadata = false;
1005 			dml_print("DML: Not Enough Time for Dynamic Meta!\n");
1006 			dml_print("DML: Tdmbf: %fus - time for dmd transfer from dchub to dio output buffer\n", Tdmbf);
1007 			dml_print("DML: Tdmec: %fus - time dio takes to transfer dmd\n", Tdmec);
1008 			dml_print("DML: Tdmsks: %fus - time before active dmd must complete transmission at dio\n", Tdmsks);
1009 			dml_print("DML: Tdmdl: %fus - time for fabric to become ready and fetch dmd \n", *Tdmdl);
1010 		}
1011 	} else {
1012 		*NotEnoughTimeForDynamicMetadata = false;
1013 	}
1014 
1015 	*Tdmdl_vm = (DynamicMetadataEnable == true && DynamicMetadataVMEnabled == true && GPUVMEnable == true ? TWait + Tvm_trips : 0);
1016 
1017 	if (myPipe->ScalerEnabled)
1018 		DPPCycles = DPPCLKDelaySubtotalPlusCNVCFormater + DPPCLKDelaySCL;
1019 	else
1020 		DPPCycles = DPPCLKDelaySubtotalPlusCNVCFormater + DPPCLKDelaySCLLBOnly;
1021 
1022 	DPPCycles = DPPCycles + myPipe->NumberOfCursors * DPPCLKDelayCNVCCursor;
1023 
1024 	DISPCLKCycles = DISPCLKDelaySubtotal;
1025 
1026 	if (myPipe->DPPCLK == 0.0 || myPipe->DISPCLK == 0.0)
1027 		return true;
1028 
1029 	*DSTXAfterScaler = DPPCycles * myPipe->PixelClock / myPipe->DPPCLK + DISPCLKCycles * myPipe->PixelClock / myPipe->DISPCLK
1030 			+ DSCDelay;
1031 
1032 	*DSTXAfterScaler = *DSTXAfterScaler + ((myPipe->ODMCombineEnabled)?18:0) + (myPipe->DPPPerPlane - 1) * DPP_RECOUT_WIDTH;
1033 
1034 	if (OutputFormat == dm_420 || (myPipe->InterlaceEnable && ProgressiveToInterlaceUnitInOPP))
1035 		*DSTYAfterScaler = 1;
1036 	else
1037 		*DSTYAfterScaler = 0;
1038 
1039 	DSTTotalPixelsAfterScaler = *DSTYAfterScaler * myPipe->HTotal + *DSTXAfterScaler;
1040 	*DSTYAfterScaler = dml_floor(DSTTotalPixelsAfterScaler / myPipe->HTotal, 1);
1041 	*DSTXAfterScaler = DSTTotalPixelsAfterScaler - ((double) (*DSTYAfterScaler * myPipe->HTotal));
1042 
1043 	MyError = false;
1044 
1045 
1046 	Tr0_trips = trip_to_mem * (HostVMDynamicLevelsTrips + 1);
1047 	Tvm_trips_rounded = dml_ceil(4.0 * Tvm_trips / LineTime, 1) / 4 * LineTime;
1048 	Tr0_trips_rounded = dml_ceil(4.0 * Tr0_trips / LineTime, 1) / 4 * LineTime;
1049 
1050 	if (GPUVMEnable) {
1051 		if (GPUVMPageTableLevels >= 3) {
1052 			*Tno_bw = UrgentExtraLatency + trip_to_mem * ((GPUVMPageTableLevels - 2) - 1);
1053 		} else
1054 			*Tno_bw = 0;
1055 	} else if (!myPipe->DCCEnable)
1056 		*Tno_bw = LineTime;
1057 	else
1058 		*Tno_bw = LineTime / 4;
1059 
1060 	dst_y_prefetch_equ = VStartup - (Tsetup + dml_max(TWait + TCalc, *Tdmdl)) / LineTime
1061 			- (*DSTYAfterScaler + *DSTXAfterScaler / myPipe->HTotal);
1062 
1063 	Lsw_oto = dml_max(PrefetchSourceLinesY, PrefetchSourceLinesC);
1064 	Tsw_oto = Lsw_oto * LineTime;
1065 
1066 	prefetch_bw_oto = (PrefetchSourceLinesY * swath_width_luma_ub * BytePerPixelY + PrefetchSourceLinesC * swath_width_chroma_ub * BytePerPixelC) / Tsw_oto;
1067 
1068 	if (GPUVMEnable == true) {
1069 		Tvm_oto = dml_max3(*Tno_bw + PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / prefetch_bw_oto,
1070 				Tvm_trips,
1071 				LineTime / 4.0);
1072 	} else
1073 		Tvm_oto = LineTime / 4.0;
1074 
1075 	if ((GPUVMEnable == true || myPipe->DCCEnable == true)) {
1076 		Tr0_oto = dml_max3(
1077 				(MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) / prefetch_bw_oto,
1078 				LineTime - Tvm_oto, LineTime / 4);
1079 	} else
1080 		Tr0_oto = (LineTime - Tvm_oto) / 2.0;
1081 
1082 	Tvm_oto_lines = dml_ceil(4.0 * Tvm_oto / LineTime, 1) / 4.0;
1083 	Tr0_oto_lines = dml_ceil(4.0 * Tr0_oto / LineTime, 1) / 4.0;
1084 	dst_y_prefetch_oto = Tvm_oto_lines + 2 * Tr0_oto_lines + Lsw_oto;
1085 
1086 	dst_y_prefetch_equ = dml_floor(4.0 * (dst_y_prefetch_equ + 0.125), 1) / 4.0;
1087 	Tpre_rounded = dst_y_prefetch_equ * LineTime;
1088 
1089 	dml_print("DML: dst_y_prefetch_oto: %f\n", dst_y_prefetch_oto);
1090 	dml_print("DML: dst_y_prefetch_equ: %f\n", dst_y_prefetch_equ);
1091 
1092 	dml_print("DML: LineTime: %f\n", LineTime);
1093 	dml_print("DML: VStartup: %d\n", VStartup);
1094 	dml_print("DML: Tvstartup: %fus - time between vstartup and first pixel of active\n", VStartup * LineTime);
1095 	dml_print("DML: Tsetup: %fus - time from vstartup to vready\n", Tsetup);
1096 	dml_print("DML: TCalc: %fus - time for calculations in dchub starting at vready\n", TCalc);
1097 	dml_print("DML: TWait: %fus - time for fabric to become ready max(pstate exit,cstate enter/exit, urgent latency) after TCalc\n", TWait);
1098 	dml_print("DML: Tdmbf: %fus - time for dmd transfer from dchub to dio output buffer\n", Tdmbf);
1099 	dml_print("DML: Tdmec: %fus - time dio takes to transfer dmd\n", Tdmec);
1100 	dml_print("DML: Tdmsks: %fus - time before active dmd must complete transmission at dio\n", Tdmsks);
1101 	dml_print("DML: Tdmdl_vm: %fus - time for vm stages of dmd \n", *Tdmdl_vm);
1102 	dml_print("DML: Tdmdl: %fus - time for fabric to become ready and fetch dmd \n", *Tdmdl);
1103 	dml_print("DML: dst_x_after_scl: %f pixels - number of pixel clocks pipeline and buffer delay after scaler \n", *DSTXAfterScaler);
1104 	dml_print("DML: dst_y_after_scl: %d lines - number of lines of pipeline and buffer delay after scaler \n", (int)*DSTYAfterScaler);
1105 
1106 	*PrefetchBandwidth = 0;
1107 	*DestinationLinesToRequestVMInVBlank = 0;
1108 	*DestinationLinesToRequestRowInVBlank = 0;
1109 	*VRatioPrefetchY = 0;
1110 	*VRatioPrefetchC = 0;
1111 	*RequiredPrefetchPixDataBWLuma = 0;
1112 	if (dst_y_prefetch_equ > 1) {
1113 		double PrefetchBandwidth1 = 0;
1114 		double PrefetchBandwidth2 = 0;
1115 		double PrefetchBandwidth3 = 0;
1116 		double PrefetchBandwidth4 = 0;
1117 
1118 		if (Tpre_rounded - *Tno_bw > 0)
1119 			PrefetchBandwidth1 = (PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor + 2 * MetaRowByte
1120 					+ 2 * PixelPTEBytesPerRow * HostVMInefficiencyFactor
1121 					+ PrefetchSourceLinesY * swath_width_luma_ub * BytePerPixelY
1122 					+ PrefetchSourceLinesC * swath_width_chroma_ub * BytePerPixelC)
1123 					/ (Tpre_rounded - *Tno_bw);
1124 		else
1125 			PrefetchBandwidth1 = 0;
1126 
1127 		if (VStartup == MaxVStartup && (PrefetchBandwidth1 > 4 * prefetch_bw_oto) && (Tpre_rounded - Tsw_oto / 4 - 0.75 * LineTime - *Tno_bw) > 0) {
1128 			PrefetchBandwidth1 = (PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor + 2 * MetaRowByte + 2 * PixelPTEBytesPerRow * HostVMInefficiencyFactor) / (Tpre_rounded - Tsw_oto / 4 - 0.75 * LineTime - *Tno_bw);
1129 		}
1130 
1131 		if (Tpre_rounded - *Tno_bw - 2 * Tr0_trips_rounded > 0)
1132 			PrefetchBandwidth2 = (PDEAndMetaPTEBytesFrame *
1133 					HostVMInefficiencyFactor + PrefetchSourceLinesY *
1134 					swath_width_luma_ub * BytePerPixelY +
1135 					PrefetchSourceLinesC * swath_width_chroma_ub *
1136 					BytePerPixelC) /
1137 					(Tpre_rounded - *Tno_bw - 2 * Tr0_trips_rounded);
1138 		else
1139 			PrefetchBandwidth2 = 0;
1140 
1141 		if (Tpre_rounded - Tvm_trips_rounded > 0)
1142 			PrefetchBandwidth3 = (2 * MetaRowByte + 2 * PixelPTEBytesPerRow *
1143 					HostVMInefficiencyFactor + PrefetchSourceLinesY *
1144 					swath_width_luma_ub * BytePerPixelY + PrefetchSourceLinesC *
1145 					swath_width_chroma_ub * BytePerPixelC) / (Tpre_rounded -
1146 					Tvm_trips_rounded);
1147 		else
1148 			PrefetchBandwidth3 = 0;
1149 
1150 		if (VStartup == MaxVStartup && (PrefetchBandwidth3 > 4 * prefetch_bw_oto) && Tpre_rounded - Tsw_oto / 4 - 0.75 * LineTime - Tvm_trips_rounded > 0) {
1151 			PrefetchBandwidth3 = (2 * MetaRowByte + 2 * PixelPTEBytesPerRow * HostVMInefficiencyFactor) / (Tpre_rounded - Tsw_oto / 4 - 0.75 * LineTime - Tvm_trips_rounded);
1152 		}
1153 
1154 		if (Tpre_rounded - Tvm_trips_rounded - 2 * Tr0_trips_rounded > 0)
1155 			PrefetchBandwidth4 = (PrefetchSourceLinesY * swath_width_luma_ub * BytePerPixelY + PrefetchSourceLinesC * swath_width_chroma_ub * BytePerPixelC)
1156 					/ (Tpre_rounded - Tvm_trips_rounded - 2 * Tr0_trips_rounded);
1157 		else
1158 			PrefetchBandwidth4 = 0;
1159 
1160 		{
1161 			bool Case1OK;
1162 			bool Case2OK;
1163 			bool Case3OK;
1164 
1165 			if (PrefetchBandwidth1 > 0) {
1166 				if (*Tno_bw + PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / PrefetchBandwidth1
1167 						>= Tvm_trips_rounded && (MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) / PrefetchBandwidth1 >= Tr0_trips_rounded) {
1168 					Case1OK = true;
1169 				} else {
1170 					Case1OK = false;
1171 				}
1172 			} else {
1173 				Case1OK = false;
1174 			}
1175 
1176 			if (PrefetchBandwidth2 > 0) {
1177 				if (*Tno_bw + PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / PrefetchBandwidth2
1178 						>= Tvm_trips_rounded && (MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) / PrefetchBandwidth2 < Tr0_trips_rounded) {
1179 					Case2OK = true;
1180 				} else {
1181 					Case2OK = false;
1182 				}
1183 			} else {
1184 				Case2OK = false;
1185 			}
1186 
1187 			if (PrefetchBandwidth3 > 0) {
1188 				if (*Tno_bw + PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / PrefetchBandwidth3
1189 						< Tvm_trips_rounded && (MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) / PrefetchBandwidth3 >= Tr0_trips_rounded) {
1190 					Case3OK = true;
1191 				} else {
1192 					Case3OK = false;
1193 				}
1194 			} else {
1195 				Case3OK = false;
1196 			}
1197 
1198 			if (Case1OK) {
1199 				prefetch_bw_equ = PrefetchBandwidth1;
1200 			} else if (Case2OK) {
1201 				prefetch_bw_equ = PrefetchBandwidth2;
1202 			} else if (Case3OK) {
1203 				prefetch_bw_equ = PrefetchBandwidth3;
1204 			} else {
1205 				prefetch_bw_equ = PrefetchBandwidth4;
1206 			}
1207 
1208 			dml_print("DML: prefetch_bw_equ: %f\n", prefetch_bw_equ);
1209 
1210 			if (prefetch_bw_equ > 0) {
1211 				if (GPUVMEnable) {
1212 					Tvm_equ = dml_max3(*Tno_bw + PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / prefetch_bw_equ, Tvm_trips, LineTime / 4);
1213 				} else {
1214 					Tvm_equ = LineTime / 4;
1215 				}
1216 
1217 				if ((GPUVMEnable || myPipe->DCCEnable)) {
1218 					Tr0_equ = dml_max4(
1219 							(MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) / prefetch_bw_equ,
1220 							Tr0_trips,
1221 							(LineTime - Tvm_equ) / 2,
1222 							LineTime / 4);
1223 				} else {
1224 					Tr0_equ = (LineTime - Tvm_equ) / 2;
1225 				}
1226 			} else {
1227 				Tvm_equ = 0;
1228 				Tr0_equ = 0;
1229 				dml_print("DML: prefetch_bw_equ equals 0! %s:%d\n", __FILE__, __LINE__);
1230 			}
1231 		}
1232 
1233 		if (dst_y_prefetch_oto < dst_y_prefetch_equ) {
1234 			*DestinationLinesForPrefetch = dst_y_prefetch_oto;
1235 			TimeForFetchingMetaPTE = Tvm_oto;
1236 			TimeForFetchingRowInVBlank = Tr0_oto;
1237 			*PrefetchBandwidth = prefetch_bw_oto;
1238 		} else {
1239 			*DestinationLinesForPrefetch = dst_y_prefetch_equ;
1240 			TimeForFetchingMetaPTE = Tvm_equ;
1241 			TimeForFetchingRowInVBlank = Tr0_equ;
1242 			*PrefetchBandwidth = prefetch_bw_equ;
1243 		}
1244 
1245 		*DestinationLinesToRequestVMInVBlank = dml_ceil(4.0 * TimeForFetchingMetaPTE / LineTime, 1.0) / 4.0;
1246 
1247 		*DestinationLinesToRequestRowInVBlank = dml_ceil(4.0 * TimeForFetchingRowInVBlank / LineTime, 1.0) / 4.0;
1248 
1249 
1250 		LinesToRequestPrefetchPixelData = *DestinationLinesForPrefetch - *DestinationLinesToRequestVMInVBlank
1251 				- 2 * *DestinationLinesToRequestRowInVBlank;
1252 
1253 		if (LinesToRequestPrefetchPixelData > 0 && prefetch_bw_equ > 0) {
1254 
1255 			*VRatioPrefetchY = (double) PrefetchSourceLinesY
1256 					/ LinesToRequestPrefetchPixelData;
1257 			*VRatioPrefetchY = dml_max(*VRatioPrefetchY, 1.0);
1258 			if ((SwathHeightY > 4) && (VInitPreFillY > 3)) {
1259 				if (LinesToRequestPrefetchPixelData > (VInitPreFillY - 3.0) / 2.0) {
1260 					*VRatioPrefetchY = dml_max((double) PrefetchSourceLinesY / LinesToRequestPrefetchPixelData,
1261 						(double) MaxNumSwathY * SwathHeightY / (LinesToRequestPrefetchPixelData - (VInitPreFillY - 3.0) / 2.0));
1262 					*VRatioPrefetchY = dml_max(*VRatioPrefetchY, 1.0);
1263 				} else {
1264 					MyError = true;
1265 					dml_print("DML: MyErr set %s:%d\n", __FILE__, __LINE__);
1266 					*VRatioPrefetchY = 0;
1267 				}
1268 			}
1269 
1270 			*VRatioPrefetchC = (double) PrefetchSourceLinesC / LinesToRequestPrefetchPixelData;
1271 			*VRatioPrefetchC = dml_max(*VRatioPrefetchC, 1.0);
1272 
1273 			if ((SwathHeightC > 4)) {
1274 				if (LinesToRequestPrefetchPixelData > (VInitPreFillC - 3.0) / 2.0) {
1275 					*VRatioPrefetchC = dml_max(*VRatioPrefetchC,
1276 						(double) MaxNumSwathC * SwathHeightC / (LinesToRequestPrefetchPixelData - (VInitPreFillC - 3.0) / 2.0));
1277 					*VRatioPrefetchC = dml_max(*VRatioPrefetchC, 1.0);
1278 				} else {
1279 					MyError = true;
1280 					dml_print("DML: MyErr set %s:%d\n", __FILE__, __LINE__);
1281 					*VRatioPrefetchC = 0;
1282 				}
1283 			}
1284 
1285 			*RequiredPrefetchPixDataBWLuma = (double) PrefetchSourceLinesY / LinesToRequestPrefetchPixelData * BytePerPixelY * swath_width_luma_ub / LineTime;
1286 			*RequiredPrefetchPixDataBWChroma = (double) PrefetchSourceLinesC / LinesToRequestPrefetchPixelData * BytePerPixelC * swath_width_chroma_ub / LineTime;
1287 		} else {
1288 			MyError = true;
1289 			dml_print("DML: MyErr set %s:%d\n", __FILE__, __LINE__);
1290 			dml_print("DML: LinesToRequestPrefetchPixelData: %f, should be > 0\n", LinesToRequestPrefetchPixelData);
1291 			*VRatioPrefetchY = 0;
1292 			*VRatioPrefetchC = 0;
1293 			*RequiredPrefetchPixDataBWLuma = 0;
1294 			*RequiredPrefetchPixDataBWChroma = 0;
1295 		}
1296 
1297 		dml_print("DML: Tpre: %fus - sum of tim to request meta pte, 2 x data pte + meta data, swaths\n", (double)LinesToRequestPrefetchPixelData * LineTime + 2.0*TimeForFetchingRowInVBlank + TimeForFetchingMetaPTE);
1298 		dml_print("DML:  Tvm: %fus - time to fetch page tables for meta surface\n", TimeForFetchingMetaPTE);
1299 		dml_print("DML:  Tr0: %fus - time to fetch first row of data pagetables and first row of meta data (done in parallel)\n", TimeForFetchingRowInVBlank);
1300 		dml_print("DML:  Tr1: %fus - time to fetch second row of data pagetables and second row of meta data (done in parallel)\n", TimeForFetchingRowInVBlank);
1301 		dml_print("DML:  Tsw: %fus = time to fetch enough pixel data and cursor data to feed the scalers init position and detile\n", (double)LinesToRequestPrefetchPixelData * LineTime);
1302 		dml_print("DML: To: %fus - time for propagation from scaler to optc\n", (*DSTYAfterScaler + ((*DSTXAfterScaler) / (double) myPipe->HTotal)) * LineTime);
1303 		dml_print("DML: Tvstartup - Tsetup - Tcalc - Twait - Tpre - To > 0\n");
1304 		dml_print("DML: Tslack(pre): %fus - time left over in schedule\n", VStartup * LineTime - TimeForFetchingMetaPTE - 2 * TimeForFetchingRowInVBlank - (*DSTYAfterScaler + ((*DSTXAfterScaler) / (double) myPipe->HTotal)) * LineTime - TWait - TCalc - Tsetup);
1305 		dml_print("DML: row_bytes = dpte_row_bytes (per_pipe) = PixelPTEBytesPerRow = : %d\n", PixelPTEBytesPerRow);
1306 
1307 	} else {
1308 		MyError = true;
1309 		dml_print("DML: MyErr set %s:%d\n", __FILE__, __LINE__);
1310 	}
1311 
1312 	{
1313 		double prefetch_vm_bw = 0;
1314 		double prefetch_row_bw = 0;
1315 
1316 		if (PDEAndMetaPTEBytesFrame == 0) {
1317 			prefetch_vm_bw = 0;
1318 		} else if (*DestinationLinesToRequestVMInVBlank > 0) {
1319 			prefetch_vm_bw = PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / (*DestinationLinesToRequestVMInVBlank * LineTime);
1320 		} else {
1321 			prefetch_vm_bw = 0;
1322 			MyError = true;
1323 			dml_print("DML: MyErr set %s:%d\n", __FILE__, __LINE__);
1324 		}
1325 		if (MetaRowByte + PixelPTEBytesPerRow == 0) {
1326 			prefetch_row_bw = 0;
1327 		} else if (*DestinationLinesToRequestRowInVBlank > 0) {
1328 			prefetch_row_bw = (MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) / (*DestinationLinesToRequestRowInVBlank * LineTime);
1329 		} else {
1330 			prefetch_row_bw = 0;
1331 			MyError = true;
1332 			dml_print("DML: MyErr set %s:%d\n", __FILE__, __LINE__);
1333 		}
1334 
1335 		*prefetch_vmrow_bw = dml_max(prefetch_vm_bw, prefetch_row_bw);
1336 	}
1337 
1338 	if (MyError) {
1339 		*PrefetchBandwidth = 0;
1340 		TimeForFetchingMetaPTE = 0;
1341 		TimeForFetchingRowInVBlank = 0;
1342 		*DestinationLinesToRequestVMInVBlank = 0;
1343 		*DestinationLinesToRequestRowInVBlank = 0;
1344 		*DestinationLinesForPrefetch = 0;
1345 		LinesToRequestPrefetchPixelData = 0;
1346 		*VRatioPrefetchY = 0;
1347 		*VRatioPrefetchC = 0;
1348 		*RequiredPrefetchPixDataBWLuma = 0;
1349 		*RequiredPrefetchPixDataBWChroma = 0;
1350 	}
1351 
1352 	return MyError;
1353 }
1354 
1355 static double RoundToDFSGranularityUp(double Clock, double VCOSpeed)
1356 {
1357 	return VCOSpeed * 4 / dml_floor(VCOSpeed * 4 / Clock, 1);
1358 }
1359 
1360 static double RoundToDFSGranularityDown(double Clock, double VCOSpeed)
1361 {
1362 	return VCOSpeed * 4 / dml_ceil(VCOSpeed * 4.0 / Clock, 1);
1363 }
1364 
1365 static void CalculateDCCConfiguration(
1366 		bool DCCEnabled,
1367 		bool DCCProgrammingAssumesScanDirectionUnknown,
1368 		enum source_format_class SourcePixelFormat,
1369 		unsigned int SurfaceWidthLuma,
1370 		unsigned int SurfaceWidthChroma,
1371 		unsigned int SurfaceHeightLuma,
1372 		unsigned int SurfaceHeightChroma,
1373 		double DETBufferSize,
1374 		unsigned int RequestHeight256ByteLuma,
1375 		unsigned int RequestHeight256ByteChroma,
1376 		enum dm_swizzle_mode TilingFormat,
1377 		unsigned int BytePerPixelY,
1378 		unsigned int BytePerPixelC,
1379 		double BytePerPixelDETY,
1380 		double BytePerPixelDETC,
1381 		enum scan_direction_class ScanOrientation,
1382 		unsigned int *MaxUncompressedBlockLuma,
1383 		unsigned int *MaxUncompressedBlockChroma,
1384 		unsigned int *MaxCompressedBlockLuma,
1385 		unsigned int *MaxCompressedBlockChroma,
1386 		unsigned int *IndependentBlockLuma,
1387 		unsigned int *IndependentBlockChroma)
1388 {
1389 	int yuv420 = 0;
1390 	int horz_div_l = 0;
1391 	int horz_div_c = 0;
1392 	int vert_div_l = 0;
1393 	int vert_div_c = 0;
1394 
1395 	int req128_horz_wc_l = 0;
1396 	int req128_horz_wc_c = 0;
1397 	int req128_vert_wc_l = 0;
1398 	int req128_vert_wc_c = 0;
1399 	int segment_order_horz_contiguous_luma = 0;
1400 	int segment_order_horz_contiguous_chroma = 0;
1401 	int segment_order_vert_contiguous_luma = 0;
1402 	int segment_order_vert_contiguous_chroma = 0;
1403 
1404 	long full_swath_bytes_horz_wc_l = 0;
1405 	long full_swath_bytes_horz_wc_c = 0;
1406 	long full_swath_bytes_vert_wc_l = 0;
1407 	long full_swath_bytes_vert_wc_c = 0;
1408 
1409 	long swath_buf_size = 0;
1410 	double detile_buf_vp_horz_limit = 0;
1411 	double detile_buf_vp_vert_limit = 0;
1412 
1413 	long MAS_vp_horz_limit = 0;
1414 	long MAS_vp_vert_limit = 0;
1415 	long max_vp_horz_width = 0;
1416 	long max_vp_vert_height = 0;
1417 	long eff_surf_width_l = 0;
1418 	long eff_surf_width_c = 0;
1419 	long eff_surf_height_l = 0;
1420 	long eff_surf_height_c = 0;
1421 
1422 	typedef enum {
1423 		REQ_256Bytes,
1424 		REQ_128BytesNonContiguous,
1425 		REQ_128BytesContiguous,
1426 		REQ_NA
1427 	} RequestType;
1428 
1429 	RequestType   RequestLuma;
1430 	RequestType   RequestChroma;
1431 
1432 	yuv420 = ((SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10 || SourcePixelFormat == dm_420_12) ? 1 : 0);
1433 	horz_div_l = 1;
1434 	horz_div_c = 1;
1435 	vert_div_l = 1;
1436 	vert_div_c = 1;
1437 
1438 	if (BytePerPixelY == 1)
1439 		vert_div_l = 0;
1440 	if (BytePerPixelC == 1)
1441 		vert_div_c = 0;
1442 	if (BytePerPixelY == 8
1443 			&& (TilingFormat == dm_sw_64kb_s || TilingFormat == dm_sw_64kb_s_t
1444 					|| TilingFormat == dm_sw_64kb_s_x))
1445 		horz_div_l = 0;
1446 	if (BytePerPixelC == 8
1447 			&& (TilingFormat == dm_sw_64kb_s || TilingFormat == dm_sw_64kb_s_t
1448 					|| TilingFormat == dm_sw_64kb_s_x))
1449 		horz_div_c = 0;
1450 
1451 	if (BytePerPixelC == 0) {
1452 		swath_buf_size = DETBufferSize / 2 - 2 * 256;
1453 		detile_buf_vp_horz_limit = (double) swath_buf_size
1454 				/ ((double) RequestHeight256ByteLuma * BytePerPixelY
1455 						/ (1 + horz_div_l));
1456 		detile_buf_vp_vert_limit = (double) swath_buf_size
1457 				/ (256.0 / RequestHeight256ByteLuma / (1 + vert_div_l));
1458 	} else {
1459 		swath_buf_size = DETBufferSize / 2 - 2 * 2 * 256;
1460 		detile_buf_vp_horz_limit = (double) swath_buf_size
1461 				/ ((double) RequestHeight256ByteLuma * BytePerPixelY
1462 						/ (1 + horz_div_l)
1463 						+ (double) RequestHeight256ByteChroma
1464 								* BytePerPixelC / (1 + horz_div_c)
1465 								/ (1 + yuv420));
1466 		detile_buf_vp_vert_limit = (double) swath_buf_size
1467 				/ (256.0 / RequestHeight256ByteLuma / (1 + vert_div_l)
1468 						+ 256.0 / RequestHeight256ByteChroma
1469 								/ (1 + vert_div_c) / (1 + yuv420));
1470 	}
1471 
1472 	if (SourcePixelFormat == dm_420_10) {
1473 		detile_buf_vp_horz_limit = 1.5 * detile_buf_vp_horz_limit;
1474 		detile_buf_vp_vert_limit = 1.5 * detile_buf_vp_vert_limit;
1475 	}
1476 
1477 	detile_buf_vp_horz_limit = dml_floor(detile_buf_vp_horz_limit - 1, 16);
1478 	detile_buf_vp_vert_limit = dml_floor(detile_buf_vp_vert_limit - 1, 16);
1479 
1480 	MAS_vp_horz_limit = 5760;
1481 	MAS_vp_vert_limit = (BytePerPixelC > 0 ? 2880 : 5760);
1482 	max_vp_horz_width = dml_min((double) MAS_vp_horz_limit, detile_buf_vp_horz_limit);
1483 	max_vp_vert_height = dml_min((double) MAS_vp_vert_limit, detile_buf_vp_vert_limit);
1484 	eff_surf_width_l =
1485 			(SurfaceWidthLuma > max_vp_horz_width ? max_vp_horz_width : SurfaceWidthLuma);
1486 	eff_surf_width_c = eff_surf_width_l / (1 + yuv420);
1487 	eff_surf_height_l = (
1488 			SurfaceHeightLuma > max_vp_vert_height ?
1489 					max_vp_vert_height : SurfaceHeightLuma);
1490 	eff_surf_height_c = eff_surf_height_l / (1 + yuv420);
1491 
1492 	full_swath_bytes_horz_wc_l = eff_surf_width_l * RequestHeight256ByteLuma * BytePerPixelY;
1493 	full_swath_bytes_vert_wc_l = eff_surf_height_l * 256 / RequestHeight256ByteLuma;
1494 	if (BytePerPixelC > 0) {
1495 		full_swath_bytes_horz_wc_c = eff_surf_width_c * RequestHeight256ByteChroma
1496 				* BytePerPixelC;
1497 		full_swath_bytes_vert_wc_c = eff_surf_height_c * 256 / RequestHeight256ByteChroma;
1498 	} else {
1499 		full_swath_bytes_horz_wc_c = 0;
1500 		full_swath_bytes_vert_wc_c = 0;
1501 	}
1502 
1503 	if (SourcePixelFormat == dm_420_10) {
1504 		full_swath_bytes_horz_wc_l = dml_ceil(full_swath_bytes_horz_wc_l * 2 / 3, 256);
1505 		full_swath_bytes_horz_wc_c = dml_ceil(full_swath_bytes_horz_wc_c * 2 / 3, 256);
1506 		full_swath_bytes_vert_wc_l = dml_ceil(full_swath_bytes_vert_wc_l * 2 / 3, 256);
1507 		full_swath_bytes_vert_wc_c = dml_ceil(full_swath_bytes_vert_wc_c * 2 / 3, 256);
1508 	}
1509 
1510 	if (2 * full_swath_bytes_horz_wc_l + 2 * full_swath_bytes_horz_wc_c <= DETBufferSize) {
1511 		req128_horz_wc_l = 0;
1512 		req128_horz_wc_c = 0;
1513 	} else if (full_swath_bytes_horz_wc_l < 1.5 * full_swath_bytes_horz_wc_c
1514 			&& 2 * full_swath_bytes_horz_wc_l + full_swath_bytes_horz_wc_c
1515 					<= DETBufferSize) {
1516 		req128_horz_wc_l = 0;
1517 		req128_horz_wc_c = 1;
1518 	} else if (full_swath_bytes_horz_wc_l >= 1.5 * full_swath_bytes_horz_wc_c
1519 			&& full_swath_bytes_horz_wc_l + 2 * full_swath_bytes_horz_wc_c
1520 					<= DETBufferSize) {
1521 		req128_horz_wc_l = 1;
1522 		req128_horz_wc_c = 0;
1523 	} else {
1524 		req128_horz_wc_l = 1;
1525 		req128_horz_wc_c = 1;
1526 	}
1527 
1528 	if (2 * full_swath_bytes_vert_wc_l + 2 * full_swath_bytes_vert_wc_c <= DETBufferSize) {
1529 		req128_vert_wc_l = 0;
1530 		req128_vert_wc_c = 0;
1531 	} else if (full_swath_bytes_vert_wc_l < 1.5 * full_swath_bytes_vert_wc_c
1532 			&& 2 * full_swath_bytes_vert_wc_l + full_swath_bytes_vert_wc_c
1533 					<= DETBufferSize) {
1534 		req128_vert_wc_l = 0;
1535 		req128_vert_wc_c = 1;
1536 	} else if (full_swath_bytes_vert_wc_l >= 1.5 * full_swath_bytes_vert_wc_c
1537 			&& full_swath_bytes_vert_wc_l + 2 * full_swath_bytes_vert_wc_c
1538 					<= DETBufferSize) {
1539 		req128_vert_wc_l = 1;
1540 		req128_vert_wc_c = 0;
1541 	} else {
1542 		req128_vert_wc_l = 1;
1543 		req128_vert_wc_c = 1;
1544 	}
1545 
1546 	if (BytePerPixelY == 2 || (BytePerPixelY == 4 && TilingFormat != dm_sw_64kb_r_x)) {
1547 		segment_order_horz_contiguous_luma = 0;
1548 	} else {
1549 		segment_order_horz_contiguous_luma = 1;
1550 	}
1551 	if ((BytePerPixelY == 8
1552 			&& (TilingFormat == dm_sw_64kb_d || TilingFormat == dm_sw_64kb_d_x
1553 					|| TilingFormat == dm_sw_64kb_d_t
1554 					|| TilingFormat == dm_sw_64kb_r_x))
1555 			|| (BytePerPixelY == 4 && TilingFormat == dm_sw_64kb_r_x)) {
1556 		segment_order_vert_contiguous_luma = 0;
1557 	} else {
1558 		segment_order_vert_contiguous_luma = 1;
1559 	}
1560 	if (BytePerPixelC == 2 || (BytePerPixelC == 4 && TilingFormat != dm_sw_64kb_r_x)) {
1561 		segment_order_horz_contiguous_chroma = 0;
1562 	} else {
1563 		segment_order_horz_contiguous_chroma = 1;
1564 	}
1565 	if ((BytePerPixelC == 8
1566 			&& (TilingFormat == dm_sw_64kb_d || TilingFormat == dm_sw_64kb_d_x
1567 					|| TilingFormat == dm_sw_64kb_d_t
1568 					|| TilingFormat == dm_sw_64kb_r_x))
1569 			|| (BytePerPixelC == 4 && TilingFormat == dm_sw_64kb_r_x)) {
1570 		segment_order_vert_contiguous_chroma = 0;
1571 	} else {
1572 		segment_order_vert_contiguous_chroma = 1;
1573 	}
1574 
1575 	if (DCCProgrammingAssumesScanDirectionUnknown == true) {
1576 		if (req128_horz_wc_l == 0 && req128_vert_wc_l == 0) {
1577 			RequestLuma = REQ_256Bytes;
1578 		} else if ((req128_horz_wc_l == 1 && segment_order_horz_contiguous_luma == 0)
1579 				|| (req128_vert_wc_l == 1 && segment_order_vert_contiguous_luma == 0)) {
1580 			RequestLuma = REQ_128BytesNonContiguous;
1581 		} else {
1582 			RequestLuma = REQ_128BytesContiguous;
1583 		}
1584 		if (req128_horz_wc_c == 0 && req128_vert_wc_c == 0) {
1585 			RequestChroma = REQ_256Bytes;
1586 		} else if ((req128_horz_wc_c == 1 && segment_order_horz_contiguous_chroma == 0)
1587 				|| (req128_vert_wc_c == 1
1588 						&& segment_order_vert_contiguous_chroma == 0)) {
1589 			RequestChroma = REQ_128BytesNonContiguous;
1590 		} else {
1591 			RequestChroma = REQ_128BytesContiguous;
1592 		}
1593 	} else if (ScanOrientation != dm_vert) {
1594 		if (req128_horz_wc_l == 0) {
1595 			RequestLuma = REQ_256Bytes;
1596 		} else if (segment_order_horz_contiguous_luma == 0) {
1597 			RequestLuma = REQ_128BytesNonContiguous;
1598 		} else {
1599 			RequestLuma = REQ_128BytesContiguous;
1600 		}
1601 		if (req128_horz_wc_c == 0) {
1602 			RequestChroma = REQ_256Bytes;
1603 		} else if (segment_order_horz_contiguous_chroma == 0) {
1604 			RequestChroma = REQ_128BytesNonContiguous;
1605 		} else {
1606 			RequestChroma = REQ_128BytesContiguous;
1607 		}
1608 	} else {
1609 		if (req128_vert_wc_l == 0) {
1610 			RequestLuma = REQ_256Bytes;
1611 		} else if (segment_order_vert_contiguous_luma == 0) {
1612 			RequestLuma = REQ_128BytesNonContiguous;
1613 		} else {
1614 			RequestLuma = REQ_128BytesContiguous;
1615 		}
1616 		if (req128_vert_wc_c == 0) {
1617 			RequestChroma = REQ_256Bytes;
1618 		} else if (segment_order_vert_contiguous_chroma == 0) {
1619 			RequestChroma = REQ_128BytesNonContiguous;
1620 		} else {
1621 			RequestChroma = REQ_128BytesContiguous;
1622 		}
1623 	}
1624 
1625 	if (RequestLuma == REQ_256Bytes) {
1626 		*MaxUncompressedBlockLuma = 256;
1627 		*MaxCompressedBlockLuma = 256;
1628 		*IndependentBlockLuma = 0;
1629 	} else if (RequestLuma == REQ_128BytesContiguous) {
1630 		*MaxUncompressedBlockLuma = 256;
1631 		*MaxCompressedBlockLuma = 128;
1632 		*IndependentBlockLuma = 128;
1633 	} else {
1634 		*MaxUncompressedBlockLuma = 256;
1635 		*MaxCompressedBlockLuma = 64;
1636 		*IndependentBlockLuma = 64;
1637 	}
1638 
1639 	if (RequestChroma == REQ_256Bytes) {
1640 		*MaxUncompressedBlockChroma = 256;
1641 		*MaxCompressedBlockChroma = 256;
1642 		*IndependentBlockChroma = 0;
1643 	} else if (RequestChroma == REQ_128BytesContiguous) {
1644 		*MaxUncompressedBlockChroma = 256;
1645 		*MaxCompressedBlockChroma = 128;
1646 		*IndependentBlockChroma = 128;
1647 	} else {
1648 		*MaxUncompressedBlockChroma = 256;
1649 		*MaxCompressedBlockChroma = 64;
1650 		*IndependentBlockChroma = 64;
1651 	}
1652 
1653 	if (DCCEnabled != true || BytePerPixelC == 0) {
1654 		*MaxUncompressedBlockChroma = 0;
1655 		*MaxCompressedBlockChroma = 0;
1656 		*IndependentBlockChroma = 0;
1657 	}
1658 
1659 	if (DCCEnabled != true) {
1660 		*MaxUncompressedBlockLuma = 0;
1661 		*MaxCompressedBlockLuma = 0;
1662 		*IndependentBlockLuma = 0;
1663 	}
1664 }
1665 
1666 
1667 static double CalculatePrefetchSourceLines(
1668 		struct display_mode_lib *mode_lib,
1669 		double VRatio,
1670 		double vtaps,
1671 		bool Interlace,
1672 		bool ProgressiveToInterlaceUnitInOPP,
1673 		unsigned int SwathHeight,
1674 		unsigned int ViewportYStart,
1675 		double *VInitPreFill,
1676 		unsigned int *MaxNumSwath)
1677 {
1678 	unsigned int MaxPartialSwath = 0;
1679 
1680 	if (ProgressiveToInterlaceUnitInOPP)
1681 		*VInitPreFill = dml_floor((VRatio + vtaps + 1) / 2.0, 1);
1682 	else
1683 		*VInitPreFill = dml_floor((VRatio + vtaps + 1 + Interlace * 0.5 * VRatio) / 2.0, 1);
1684 
1685 	if (!mode_lib->vba.IgnoreViewportPositioning) {
1686 
1687 		*MaxNumSwath = dml_ceil((*VInitPreFill - 1.0) / SwathHeight, 1) + 1.0;
1688 
1689 		if (*VInitPreFill > 1.0)
1690 			MaxPartialSwath = (unsigned int) (*VInitPreFill - 2) % SwathHeight;
1691 		else
1692 			MaxPartialSwath = (unsigned int) (*VInitPreFill + SwathHeight - 2)
1693 					% SwathHeight;
1694 		MaxPartialSwath = dml_max(1U, MaxPartialSwath);
1695 
1696 	} else {
1697 
1698 		if (ViewportYStart != 0)
1699 			dml_print(
1700 					"WARNING DML: using viewport y position of 0 even though actual viewport y position is non-zero in prefetch source lines calculation\n");
1701 
1702 		*MaxNumSwath = dml_ceil(*VInitPreFill / SwathHeight, 1);
1703 
1704 		if (*VInitPreFill > 1.0)
1705 			MaxPartialSwath = (unsigned int) (*VInitPreFill - 1) % SwathHeight;
1706 		else
1707 			MaxPartialSwath = (unsigned int) (*VInitPreFill + SwathHeight - 1)
1708 					% SwathHeight;
1709 	}
1710 
1711 	return *MaxNumSwath * SwathHeight + MaxPartialSwath;
1712 }
1713 
1714 static unsigned int CalculateVMAndRowBytes(
1715 		struct display_mode_lib *mode_lib,
1716 		bool DCCEnable,
1717 		unsigned int BlockHeight256Bytes,
1718 		unsigned int BlockWidth256Bytes,
1719 		enum source_format_class SourcePixelFormat,
1720 		unsigned int SurfaceTiling,
1721 		unsigned int BytePerPixel,
1722 		enum scan_direction_class ScanDirection,
1723 		unsigned int SwathWidth,
1724 		unsigned int ViewportHeight,
1725 		bool GPUVMEnable,
1726 		bool HostVMEnable,
1727 		unsigned int HostVMMaxNonCachedPageTableLevels,
1728 		unsigned int GPUVMMinPageSize,
1729 		unsigned int HostVMMinPageSize,
1730 		unsigned int PTEBufferSizeInRequests,
1731 		unsigned int Pitch,
1732 		unsigned int DCCMetaPitch,
1733 		unsigned int *MacroTileWidth,
1734 		unsigned int *MetaRowByte,
1735 		unsigned int *PixelPTEBytesPerRow,
1736 		bool *PTEBufferSizeNotExceeded,
1737 		unsigned int *dpte_row_width_ub,
1738 		unsigned int *dpte_row_height,
1739 		unsigned int *MetaRequestWidth,
1740 		unsigned int *MetaRequestHeight,
1741 		unsigned int *meta_row_width,
1742 		unsigned int *meta_row_height,
1743 		unsigned int *vm_group_bytes,
1744 		unsigned int *dpte_group_bytes,
1745 		unsigned int *PixelPTEReqWidth,
1746 		unsigned int *PixelPTEReqHeight,
1747 		unsigned int *PTERequestSize,
1748 		unsigned int *DPDE0BytesFrame,
1749 		unsigned int *MetaPTEBytesFrame)
1750 {
1751 	unsigned int MPDEBytesFrame = 0;
1752 	unsigned int DCCMetaSurfaceBytes = 0;
1753 	unsigned int MacroTileSizeBytes = 0;
1754 	unsigned int MacroTileHeight = 0;
1755 	unsigned int ExtraDPDEBytesFrame = 0;
1756 	unsigned int PDEAndMetaPTEBytesFrame = 0;
1757 	unsigned int PixelPTEReqHeightPTEs = 0;
1758 	unsigned int HostVMDynamicLevels = 0;
1759 
1760 	double FractionOfPTEReturnDrop;
1761 
1762 	if (GPUVMEnable == true && HostVMEnable == true) {
1763 		if (HostVMMinPageSize < 2048) {
1764 			HostVMDynamicLevels = HostVMMaxNonCachedPageTableLevels;
1765 		} else if (HostVMMinPageSize >= 2048 && HostVMMinPageSize < 1048576) {
1766 			HostVMDynamicLevels = dml_max(0, (int) HostVMMaxNonCachedPageTableLevels - 1);
1767 		} else {
1768 			HostVMDynamicLevels = dml_max(0, (int) HostVMMaxNonCachedPageTableLevels - 2);
1769 		}
1770 	}
1771 
1772 	*MetaRequestHeight = 8 * BlockHeight256Bytes;
1773 	*MetaRequestWidth = 8 * BlockWidth256Bytes;
1774 	if (ScanDirection != dm_vert) {
1775 		*meta_row_height = *MetaRequestHeight;
1776 		*meta_row_width = dml_ceil((double) SwathWidth - 1, *MetaRequestWidth)
1777 				+ *MetaRequestWidth;
1778 		*MetaRowByte = *meta_row_width * *MetaRequestHeight * BytePerPixel / 256.0;
1779 	} else {
1780 		*meta_row_height = *MetaRequestWidth;
1781 		*meta_row_width = dml_ceil((double) SwathWidth - 1, *MetaRequestHeight)
1782 				+ *MetaRequestHeight;
1783 		*MetaRowByte = *meta_row_width * *MetaRequestWidth * BytePerPixel / 256.0;
1784 	}
1785 	DCCMetaSurfaceBytes = DCCMetaPitch * (dml_ceil(ViewportHeight - 1, 64 * BlockHeight256Bytes)
1786 					+ 64 * BlockHeight256Bytes) * BytePerPixel / 256;
1787 	if (GPUVMEnable == true) {
1788 		*MetaPTEBytesFrame = (dml_ceil((double) (DCCMetaSurfaceBytes - 4.0 * 1024.0) / (8 * 4.0 * 1024), 1) + 1) * 64;
1789 		MPDEBytesFrame = 128 * (mode_lib->vba.GPUVMMaxPageTableLevels - 1);
1790 	} else {
1791 		*MetaPTEBytesFrame = 0;
1792 		MPDEBytesFrame = 0;
1793 	}
1794 
1795 	if (DCCEnable != true) {
1796 		*MetaPTEBytesFrame = 0;
1797 		MPDEBytesFrame = 0;
1798 		*MetaRowByte = 0;
1799 	}
1800 
1801 	if (SurfaceTiling == dm_sw_linear) {
1802 		MacroTileSizeBytes = 256;
1803 		MacroTileHeight = BlockHeight256Bytes;
1804 	} else {
1805 		MacroTileSizeBytes = 65536;
1806 		MacroTileHeight = 16 * BlockHeight256Bytes;
1807 	}
1808 	*MacroTileWidth = MacroTileSizeBytes / BytePerPixel / MacroTileHeight;
1809 
1810 	if (GPUVMEnable == true && mode_lib->vba.GPUVMMaxPageTableLevels > 1) {
1811 		if (ScanDirection != dm_vert) {
1812 			*DPDE0BytesFrame = 64 * (dml_ceil(((Pitch * (dml_ceil(ViewportHeight - 1, MacroTileHeight) + MacroTileHeight) * BytePerPixel) - MacroTileSizeBytes) / (8 * 2097152), 1) + 1);
1813 		} else {
1814 			*DPDE0BytesFrame = 64 * (dml_ceil(((Pitch * (dml_ceil((double) SwathWidth - 1, MacroTileHeight) + MacroTileHeight) * BytePerPixel) - MacroTileSizeBytes) / (8 * 2097152), 1) + 1);
1815 		}
1816 		ExtraDPDEBytesFrame = 128 * (mode_lib->vba.GPUVMMaxPageTableLevels - 2);
1817 	} else {
1818 		*DPDE0BytesFrame = 0;
1819 		ExtraDPDEBytesFrame = 0;
1820 	}
1821 
1822 	PDEAndMetaPTEBytesFrame = *MetaPTEBytesFrame + MPDEBytesFrame + *DPDE0BytesFrame
1823 			+ ExtraDPDEBytesFrame;
1824 
1825 	if (HostVMEnable == true) {
1826 		PDEAndMetaPTEBytesFrame = PDEAndMetaPTEBytesFrame * (1 + 8 * HostVMDynamicLevels);
1827 	}
1828 
1829 	if (SurfaceTiling == dm_sw_linear) {
1830 		PixelPTEReqHeightPTEs = 1;
1831 		*PixelPTEReqHeight = 1;
1832 		*PixelPTEReqWidth = 32768.0 / BytePerPixel;
1833 		*PTERequestSize = 64;
1834 		FractionOfPTEReturnDrop = 0;
1835 	} else if (MacroTileSizeBytes == 4096) {
1836 		PixelPTEReqHeightPTEs = 1;
1837 		*PixelPTEReqHeight = MacroTileHeight;
1838 		*PixelPTEReqWidth = 8 * *MacroTileWidth;
1839 		*PTERequestSize = 64;
1840 		if (ScanDirection != dm_vert)
1841 			FractionOfPTEReturnDrop = 0;
1842 		else
1843 			FractionOfPTEReturnDrop = 7 / 8;
1844 	} else if (GPUVMMinPageSize == 4 && MacroTileSizeBytes > 4096) {
1845 		PixelPTEReqHeightPTEs = 16;
1846 		*PixelPTEReqHeight = 16 * BlockHeight256Bytes;
1847 		*PixelPTEReqWidth = 16 * BlockWidth256Bytes;
1848 		*PTERequestSize = 128;
1849 		FractionOfPTEReturnDrop = 0;
1850 	} else {
1851 		PixelPTEReqHeightPTEs = 1;
1852 		*PixelPTEReqHeight = MacroTileHeight;
1853 		*PixelPTEReqWidth = 8 * *MacroTileWidth;
1854 		*PTERequestSize = 64;
1855 		FractionOfPTEReturnDrop = 0;
1856 	}
1857 
1858 	if (SurfaceTiling == dm_sw_linear) {
1859 		*dpte_row_height = dml_min(128, 1 << (unsigned int) dml_floor(dml_log2(PTEBufferSizeInRequests * *PixelPTEReqWidth / Pitch), 1));
1860 		*dpte_row_width_ub = (dml_ceil(((double) SwathWidth - 1) / *PixelPTEReqWidth, 1) + 1) * *PixelPTEReqWidth;
1861 		*PixelPTEBytesPerRow = *dpte_row_width_ub / *PixelPTEReqWidth * *PTERequestSize;
1862 	} else if (ScanDirection != dm_vert) {
1863 		*dpte_row_height = *PixelPTEReqHeight;
1864 		*dpte_row_width_ub = (dml_ceil((double) (SwathWidth - 1) / *PixelPTEReqWidth, 1) + 1) * *PixelPTEReqWidth;
1865 		*PixelPTEBytesPerRow = *dpte_row_width_ub / *PixelPTEReqWidth * *PTERequestSize;
1866 	} else {
1867 		*dpte_row_height = dml_min(*PixelPTEReqWidth, *MacroTileWidth);
1868 		*dpte_row_width_ub = (dml_ceil((double) (SwathWidth - 1) / *PixelPTEReqHeight, 1) + 1) * *PixelPTEReqHeight;
1869 		*PixelPTEBytesPerRow = *dpte_row_width_ub / *PixelPTEReqHeight * *PTERequestSize;
1870 	}
1871 	if (*PixelPTEBytesPerRow * (1 - FractionOfPTEReturnDrop)
1872 			<= 64 * PTEBufferSizeInRequests) {
1873 		*PTEBufferSizeNotExceeded = true;
1874 	} else {
1875 		*PTEBufferSizeNotExceeded = false;
1876 	}
1877 
1878 	if (GPUVMEnable != true) {
1879 		*PixelPTEBytesPerRow = 0;
1880 		*PTEBufferSizeNotExceeded = true;
1881 	}
1882 	dml_print("DML: vm_bytes = meta_pte_bytes_per_frame (per_pipe) = MetaPTEBytesFrame = : %i\n", *MetaPTEBytesFrame);
1883 
1884 	if (HostVMEnable == true) {
1885 		*PixelPTEBytesPerRow = *PixelPTEBytesPerRow * (1 + 8 * HostVMDynamicLevels);
1886 	}
1887 
1888 	if (HostVMEnable == true) {
1889 		*vm_group_bytes = 512;
1890 		*dpte_group_bytes = 512;
1891 	} else if (GPUVMEnable == true) {
1892 		*vm_group_bytes = 2048;
1893 		if (SurfaceTiling != dm_sw_linear && PixelPTEReqHeightPTEs == 1 && ScanDirection == dm_vert) {
1894 			*dpte_group_bytes = 512;
1895 		} else {
1896 			*dpte_group_bytes = 2048;
1897 		}
1898 	} else {
1899 		*vm_group_bytes = 0;
1900 		*dpte_group_bytes = 0;
1901 	}
1902 
1903 	return PDEAndMetaPTEBytesFrame;
1904 }
1905 
1906 static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(
1907 		struct display_mode_lib *mode_lib)
1908 {
1909 	struct vba_vars_st *v = &mode_lib->vba;
1910 	unsigned int j, k;
1911 	long ReorderBytes = 0;
1912 	unsigned int PrefetchMode = v->PrefetchModePerState[v->VoltageLevel][v->maxMpcComb];
1913 	double MaxTotalRDBandwidth = 0;
1914 	double MaxTotalRDBandwidthNoUrgentBurst = 0;
1915 	bool DestinationLineTimesForPrefetchLessThan2 = false;
1916 	bool VRatioPrefetchMoreThan4 = false;
1917 	double TWait;
1918 
1919 	v->WritebackDISPCLK = 0.0;
1920 	v->DISPCLKWithRamping = 0;
1921 	v->DISPCLKWithoutRamping = 0;
1922 	v->GlobalDPPCLK = 0.0;
1923 	/* DAL custom code: need to update ReturnBW in case min dcfclk is overriden */
1924 	v->IdealSDPPortBandwidthPerState[v->VoltageLevel][v->maxMpcComb] = dml_min3(
1925 			v->ReturnBusWidth * v->DCFCLK,
1926 			v->DRAMSpeedPerState[v->VoltageLevel] * v->NumberOfChannels * v->DRAMChannelWidth,
1927 			v->FabricClockPerState[v->VoltageLevel] * v->FabricDatapathToDCNDataReturn);
1928 	if (v->HostVMEnable != true) {
1929 		v->ReturnBW = v->IdealSDPPortBandwidthPerState[v->VoltageLevel][v->maxMpcComb] * v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelDataOnly / 100;
1930 	} else {
1931 		v->ReturnBW = v->IdealSDPPortBandwidthPerState[v->VoltageLevel][v->maxMpcComb] * v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData / 100;
1932 	}
1933 	/* End DAL custom code */
1934 
1935 	// DISPCLK and DPPCLK Calculation
1936 	//
1937 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
1938 		if (v->WritebackEnable[k]) {
1939 			v->WritebackDISPCLK = dml_max(v->WritebackDISPCLK,
1940 				dml30_CalculateWriteBackDISPCLK(
1941 						v->WritebackPixelFormat[k],
1942 						v->PixelClock[k],
1943 						v->WritebackHRatio[k],
1944 						v->WritebackVRatio[k],
1945 						v->WritebackHTaps[k],
1946 						v->WritebackVTaps[k],
1947 						v->WritebackSourceWidth[k],
1948 						v->WritebackDestinationWidth[k],
1949 						v->HTotal[k],
1950 						v->WritebackLineBufferSize));
1951 		}
1952 	}
1953 
1954 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
1955 		if (v->HRatio[k] > 1) {
1956 			v->PSCL_THROUGHPUT_LUMA[k] = dml_min(v->MaxDCHUBToPSCLThroughput,
1957 				v->MaxPSCLToLBThroughput * v->HRatio[k] / dml_ceil(v->htaps[k] / 6.0, 1));
1958 		} else {
1959 			v->PSCL_THROUGHPUT_LUMA[k] = dml_min(
1960 					v->MaxDCHUBToPSCLThroughput,
1961 					v->MaxPSCLToLBThroughput);
1962 		}
1963 
1964 		v->DPPCLKUsingSingleDPPLuma = v->PixelClock[k]
1965 			* dml_max(v->vtaps[k] / 6.0 * dml_min(1.0, v->HRatio[k]),
1966 				dml_max(v->HRatio[k] * v->VRatio[k] / v->PSCL_THROUGHPUT_LUMA[k], 1.0));
1967 
1968 		if ((v->htaps[k] > 6 || v->vtaps[k] > 6)
1969 				&& v->DPPCLKUsingSingleDPPLuma < 2 * v->PixelClock[k]) {
1970 			v->DPPCLKUsingSingleDPPLuma = 2 * v->PixelClock[k];
1971 		}
1972 
1973 		if ((v->SourcePixelFormat[k] != dm_420_8
1974 				&& v->SourcePixelFormat[k] != dm_420_10
1975 				&& v->SourcePixelFormat[k] != dm_420_12
1976 				&& v->SourcePixelFormat[k] != dm_rgbe_alpha)) {
1977 			v->PSCL_THROUGHPUT_CHROMA[k] = 0.0;
1978 			v->DPPCLKUsingSingleDPP[k] = v->DPPCLKUsingSingleDPPLuma;
1979 		} else {
1980 			if (v->HRatioChroma[k] > 1) {
1981 				v->PSCL_THROUGHPUT_CHROMA[k] = dml_min(v->MaxDCHUBToPSCLThroughput,
1982 					v->MaxPSCLToLBThroughput * v->HRatioChroma[k] / dml_ceil(v->HTAPsChroma[k] / 6.0, 1.0));
1983 			} else {
1984 				v->PSCL_THROUGHPUT_CHROMA[k] = dml_min(
1985 						v->MaxDCHUBToPSCLThroughput,
1986 						v->MaxPSCLToLBThroughput);
1987 			}
1988 			v->DPPCLKUsingSingleDPPChroma = v->PixelClock[k]
1989 				* dml_max3(v->VTAPsChroma[k] / 6.0 * dml_min(1.0, v->HRatioChroma[k]),
1990 					v->HRatioChroma[k] * v->VRatioChroma[k] / v->PSCL_THROUGHPUT_CHROMA[k], 1.0);
1991 
1992 			if ((v->HTAPsChroma[k] > 6 || v->VTAPsChroma[k] > 6)
1993 					&& v->DPPCLKUsingSingleDPPChroma
1994 							< 2 * v->PixelClock[k]) {
1995 				v->DPPCLKUsingSingleDPPChroma = 2
1996 						* v->PixelClock[k];
1997 			}
1998 
1999 			v->DPPCLKUsingSingleDPP[k] = dml_max(
2000 					v->DPPCLKUsingSingleDPPLuma,
2001 					v->DPPCLKUsingSingleDPPChroma);
2002 		}
2003 	}
2004 
2005 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2006 		if (v->BlendingAndTiming[k] != k)
2007 			continue;
2008 		if (v->ODMCombineEnabled[k] == dm_odm_combine_mode_4to1) {
2009 			v->DISPCLKWithRamping = dml_max(v->DISPCLKWithRamping,
2010 				v->PixelClock[k] / 4 * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100)
2011 					* (1 + v->DISPCLKRampingMargin / 100));
2012 			v->DISPCLKWithoutRamping = dml_max(v->DISPCLKWithoutRamping,
2013 				v->PixelClock[k] / 4 * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100));
2014 		} else if (v->ODMCombineEnabled[k] == dm_odm_combine_mode_2to1) {
2015 			v->DISPCLKWithRamping = dml_max(v->DISPCLKWithRamping,
2016 				v->PixelClock[k] / 2 * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100)
2017 					* (1 + v->DISPCLKRampingMargin / 100));
2018 			v->DISPCLKWithoutRamping = dml_max(v->DISPCLKWithoutRamping,
2019 				v->PixelClock[k] / 2 * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100));
2020 		} else {
2021 			v->DISPCLKWithRamping = dml_max(v->DISPCLKWithRamping,
2022 				v->PixelClock[k] * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100)
2023 									* (1 + v->DISPCLKRampingMargin / 100));
2024 			v->DISPCLKWithoutRamping = dml_max(v->DISPCLKWithoutRamping,
2025 				v->PixelClock[k] * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100));
2026 		}
2027 	}
2028 
2029 	v->DISPCLKWithRamping = dml_max(
2030 			v->DISPCLKWithRamping,
2031 			v->WritebackDISPCLK);
2032 	v->DISPCLKWithoutRamping = dml_max(
2033 			v->DISPCLKWithoutRamping,
2034 			v->WritebackDISPCLK);
2035 
2036 	ASSERT(v->DISPCLKDPPCLKVCOSpeed != 0);
2037 	v->DISPCLKWithRampingRoundedToDFSGranularity = RoundToDFSGranularityUp(
2038 			v->DISPCLKWithRamping,
2039 			v->DISPCLKDPPCLKVCOSpeed);
2040 	v->DISPCLKWithoutRampingRoundedToDFSGranularity = RoundToDFSGranularityUp(
2041 			v->DISPCLKWithoutRamping,
2042 			v->DISPCLKDPPCLKVCOSpeed);
2043 	v->MaxDispclkRoundedToDFSGranularity = RoundToDFSGranularityDown(
2044 			v->soc.clock_limits[mode_lib->soc.num_states - 1].dispclk_mhz,
2045 			v->DISPCLKDPPCLKVCOSpeed);
2046 	if (v->DISPCLKWithoutRampingRoundedToDFSGranularity
2047 			> v->MaxDispclkRoundedToDFSGranularity) {
2048 		v->DISPCLK_calculated =
2049 				v->DISPCLKWithoutRampingRoundedToDFSGranularity;
2050 	} else if (v->DISPCLKWithRampingRoundedToDFSGranularity
2051 			> v->MaxDispclkRoundedToDFSGranularity) {
2052 		v->DISPCLK_calculated = v->MaxDispclkRoundedToDFSGranularity;
2053 	} else {
2054 		v->DISPCLK_calculated =
2055 				v->DISPCLKWithRampingRoundedToDFSGranularity;
2056 	}
2057 	v->DISPCLK = v->DISPCLK_calculated;
2058 	DTRACE("   dispclk_mhz (calculated) = %f", v->DISPCLK_calculated);
2059 
2060 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2061 		v->DPPCLK_calculated[k] = v->DPPCLKUsingSingleDPP[k]
2062 				/ v->DPPPerPlane[k]
2063 				* (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100);
2064 		v->GlobalDPPCLK = dml_max(
2065 				v->GlobalDPPCLK,
2066 				v->DPPCLK_calculated[k]);
2067 	}
2068 	v->GlobalDPPCLK = RoundToDFSGranularityUp(
2069 			v->GlobalDPPCLK,
2070 			v->DISPCLKDPPCLKVCOSpeed);
2071 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2072 		v->DPPCLK_calculated[k] = v->GlobalDPPCLK / 255
2073 				* dml_ceil(
2074 						v->DPPCLK_calculated[k] * 255.0
2075 								/ v->GlobalDPPCLK,
2076 						1);
2077 		DTRACE("   dppclk_mhz[%i] (calculated) = %f", k, v->DPPCLK_calculated[k]);
2078 		v->DPPCLK[k] = v->DPPCLK_calculated[k];
2079 	}
2080 
2081 	// Urgent and B P-State/DRAM Clock Change Watermark
2082 	DTRACE("   dcfclk_mhz         = %f", v->DCFCLK);
2083 	DTRACE("   return_bus_bw      = %f", v->ReturnBW);
2084 
2085 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2086 		dml30_CalculateBytePerPixelAnd256BBlockSizes(
2087 				v->SourcePixelFormat[k],
2088 				v->SurfaceTiling[k],
2089 				&v->BytePerPixelY[k],
2090 				&v->BytePerPixelC[k],
2091 				&v->BytePerPixelDETY[k],
2092 				&v->BytePerPixelDETC[k],
2093 				&v->BlockHeight256BytesY[k],
2094 				&v->BlockHeight256BytesC[k],
2095 				&v->BlockWidth256BytesY[k],
2096 				&v->BlockWidth256BytesC[k]);
2097 	}
2098 
2099 	CalculateSwathWidth(
2100 			false,
2101 			v->NumberOfActivePlanes,
2102 			v->SourcePixelFormat,
2103 			v->SourceScan,
2104 			v->ViewportWidth,
2105 			v->ViewportHeight,
2106 			v->SurfaceWidthY,
2107 			v->SurfaceWidthC,
2108 			v->SurfaceHeightY,
2109 			v->SurfaceHeightC,
2110 			v->ODMCombineEnabled,
2111 			v->BytePerPixelY,
2112 			v->BytePerPixelC,
2113 			v->BlockHeight256BytesY,
2114 			v->BlockHeight256BytesC,
2115 			v->BlockWidth256BytesY,
2116 			v->BlockWidth256BytesC,
2117 			v->BlendingAndTiming,
2118 			v->HActive,
2119 			v->HRatio,
2120 			v->DPPPerPlane,
2121 			v->SwathWidthSingleDPPY,
2122 			v->SwathWidthSingleDPPC,
2123 			v->SwathWidthY,
2124 			v->SwathWidthC,
2125 			v->dummyinteger3,
2126 			v->dummyinteger4,
2127 			v->swath_width_luma_ub,
2128 			v->swath_width_chroma_ub);
2129 
2130 
2131 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2132 		v->ReadBandwidthPlaneLuma[k] = v->SwathWidthSingleDPPY[k] * v->BytePerPixelY[k] / (v->HTotal[k] / v->PixelClock[k]) * v->VRatio[k];
2133 		v->ReadBandwidthPlaneChroma[k] = v->SwathWidthSingleDPPC[k] * v->BytePerPixelC[k] / (v->HTotal[k] / v->PixelClock[k]) * v->VRatioChroma[k];
2134 		DTRACE("read_bw[%i] = %fBps", k, v->ReadBandwidthPlaneLuma[k] + v->ReadBandwidthPlaneChroma[k]);
2135 	}
2136 
2137 
2138 	// DCFCLK Deep Sleep
2139 	CalculateDCFCLKDeepSleep(
2140 			mode_lib,
2141 			v->NumberOfActivePlanes,
2142 			v->BytePerPixelY,
2143 			v->BytePerPixelC,
2144 			v->VRatio,
2145 			v->VRatioChroma,
2146 			v->SwathWidthY,
2147 			v->SwathWidthC,
2148 			v->DPPPerPlane,
2149 			v->HRatio,
2150 			v->HRatioChroma,
2151 			v->PixelClock,
2152 			v->PSCL_THROUGHPUT_LUMA,
2153 			v->PSCL_THROUGHPUT_CHROMA,
2154 			v->DPPCLK,
2155 			v->ReadBandwidthPlaneLuma,
2156 			v->ReadBandwidthPlaneChroma,
2157 			v->ReturnBusWidth,
2158 			&v->DCFCLKDeepSleep);
2159 
2160 	// DSCCLK
2161 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2162 		if ((v->BlendingAndTiming[k] != k) || !v->DSCEnabled[k]) {
2163 			v->DSCCLK_calculated[k] = 0.0;
2164 		} else {
2165 			if (v->OutputFormat[k] == dm_420)
2166 				v->DSCFormatFactor = 2;
2167 			else if (v->OutputFormat[k] == dm_444)
2168 				v->DSCFormatFactor = 1;
2169 			else if (v->OutputFormat[k] == dm_n422)
2170 				v->DSCFormatFactor = 2;
2171 			else
2172 				v->DSCFormatFactor = 1;
2173 			if (v->ODMCombineEnabled[k] == dm_odm_combine_mode_4to1)
2174 				v->DSCCLK_calculated[k] = v->PixelClockBackEnd[k] / 12
2175 					/ v->DSCFormatFactor / (1 - v->DISPCLKDPPCLKDSCCLKDownSpreading / 100);
2176 			else if (v->ODMCombineEnabled[k] == dm_odm_combine_mode_2to1)
2177 				v->DSCCLK_calculated[k] = v->PixelClockBackEnd[k] / 6
2178 					/ v->DSCFormatFactor / (1 - v->DISPCLKDPPCLKDSCCLKDownSpreading / 100);
2179 			else
2180 				v->DSCCLK_calculated[k] = v->PixelClockBackEnd[k] / 3
2181 					/ v->DSCFormatFactor / (1 - v->DISPCLKDPPCLKDSCCLKDownSpreading / 100);
2182 		}
2183 	}
2184 
2185 	// DSC Delay
2186 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2187 		double BPP = v->OutputBppPerState[k][v->VoltageLevel];
2188 
2189 		if (v->DSCEnabled[k] && BPP != 0) {
2190 			if (v->ODMCombineEnabled[k] == dm_odm_combine_mode_disabled) {
2191 				v->DSCDelay[k] = dscceComputeDelay(v->DSCInputBitPerComponent[k],
2192 						BPP,
2193 						dml_ceil((double) v->HActive[k] / v->NumberOfDSCSlices[k], 1),
2194 						v->NumberOfDSCSlices[k],
2195 						v->OutputFormat[k],
2196 						v->Output[k])
2197 					+ dscComputeDelay(v->OutputFormat[k], v->Output[k]);
2198 			} else if (v->ODMCombineEnabled[k] == dm_odm_combine_mode_2to1) {
2199 				v->DSCDelay[k] = 2 * dscceComputeDelay(v->DSCInputBitPerComponent[k],
2200 						BPP,
2201 						dml_ceil((double) v->HActive[k] / v->NumberOfDSCSlices[k], 1),
2202 						v->NumberOfDSCSlices[k] / 2.0,
2203 						v->OutputFormat[k],
2204 						v->Output[k])
2205 					+ dscComputeDelay(v->OutputFormat[k], v->Output[k]);
2206 			} else {
2207 				v->DSCDelay[k] = 4 * dscceComputeDelay(v->DSCInputBitPerComponent[k],
2208 						BPP,
2209 						dml_ceil((double) v->HActive[k] / v->NumberOfDSCSlices[k], 1),
2210 						v->NumberOfDSCSlices[k] / 4.0,
2211 						v->OutputFormat[k],
2212 						v->Output[k])
2213 					+ dscComputeDelay(v->OutputFormat[k], v->Output[k]);
2214 			}
2215 			v->DSCDelay[k] = v->DSCDelay[k] * v->PixelClock[k] / v->PixelClockBackEnd[k];
2216 		} else {
2217 			v->DSCDelay[k] = 0;
2218 		}
2219 	}
2220 
2221 	for (k = 0; k < v->NumberOfActivePlanes; ++k)
2222 		for (j = 0; j < v->NumberOfActivePlanes; ++j) // NumberOfPlanes
2223 			if (j != k && v->BlendingAndTiming[k] == j
2224 					&& v->DSCEnabled[j])
2225 				v->DSCDelay[k] = v->DSCDelay[j];
2226 
2227 	// Prefetch
2228 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2229 		unsigned int PDEAndMetaPTEBytesFrameY = 0;
2230 		unsigned int PixelPTEBytesPerRowY = 0;
2231 		unsigned int MetaRowByteY = 0;
2232 		unsigned int MetaRowByteC = 0;
2233 		unsigned int PDEAndMetaPTEBytesFrameC = 0;
2234 		unsigned int PixelPTEBytesPerRowC = 0;
2235 		bool         PTEBufferSizeNotExceededY = 0;
2236 		bool         PTEBufferSizeNotExceededC = 0;
2237 
2238 
2239 		if (v->SourcePixelFormat[k] == dm_420_8 || v->SourcePixelFormat[k] == dm_420_10 || v->SourcePixelFormat[k] == dm_420_12 || v->SourcePixelFormat[k] == dm_rgbe_alpha) {
2240 			if ((v->SourcePixelFormat[k] == dm_420_10 || v->SourcePixelFormat[k] == dm_420_12) && v->SourceScan[k] != dm_vert) {
2241 				v->PTEBufferSizeInRequestsForLuma = (v->PTEBufferSizeInRequestsLuma + v->PTEBufferSizeInRequestsChroma) / 2;
2242 				v->PTEBufferSizeInRequestsForChroma = v->PTEBufferSizeInRequestsForLuma;
2243 			} else {
2244 				v->PTEBufferSizeInRequestsForLuma = v->PTEBufferSizeInRequestsLuma;
2245 				v->PTEBufferSizeInRequestsForChroma = v->PTEBufferSizeInRequestsChroma;
2246 
2247 			}
2248 			PDEAndMetaPTEBytesFrameC = CalculateVMAndRowBytes(
2249 					mode_lib,
2250 					v->DCCEnable[k],
2251 					v->BlockHeight256BytesC[k],
2252 					v->BlockWidth256BytesC[k],
2253 					v->SourcePixelFormat[k],
2254 					v->SurfaceTiling[k],
2255 					v->BytePerPixelC[k],
2256 					v->SourceScan[k],
2257 					v->SwathWidthC[k],
2258 					v->ViewportHeightChroma[k],
2259 					v->GPUVMEnable,
2260 					v->HostVMEnable,
2261 					v->HostVMMaxNonCachedPageTableLevels,
2262 					v->GPUVMMinPageSize,
2263 					v->HostVMMinPageSize,
2264 					v->PTEBufferSizeInRequestsForChroma,
2265 					v->PitchC[k],
2266 					v->DCCMetaPitchC[k],
2267 					&v->MacroTileWidthC[k],
2268 					&MetaRowByteC,
2269 					&PixelPTEBytesPerRowC,
2270 					&PTEBufferSizeNotExceededC,
2271 					&v->dpte_row_width_chroma_ub[k],
2272 					&v->dpte_row_height_chroma[k],
2273 					&v->meta_req_width_chroma[k],
2274 					&v->meta_req_height_chroma[k],
2275 					&v->meta_row_width_chroma[k],
2276 					&v->meta_row_height_chroma[k],
2277 					&v->dummyinteger1,
2278 					&v->dummyinteger2,
2279 					&v->PixelPTEReqWidthC[k],
2280 					&v->PixelPTEReqHeightC[k],
2281 					&v->PTERequestSizeC[k],
2282 					&v->dpde0_bytes_per_frame_ub_c[k],
2283 					&v->meta_pte_bytes_per_frame_ub_c[k]);
2284 
2285 			v->PrefetchSourceLinesC[k] = CalculatePrefetchSourceLines(
2286 					mode_lib,
2287 					v->VRatioChroma[k],
2288 					v->VTAPsChroma[k],
2289 					v->Interlace[k],
2290 					v->ProgressiveToInterlaceUnitInOPP,
2291 					v->SwathHeightC[k],
2292 					v->ViewportYStartC[k],
2293 					&v->VInitPreFillC[k],
2294 					&v->MaxNumSwathC[k]);
2295 		} else {
2296 			v->PTEBufferSizeInRequestsForLuma = v->PTEBufferSizeInRequestsLuma + v->PTEBufferSizeInRequestsChroma;
2297 			v->PTEBufferSizeInRequestsForChroma = 0;
2298 			PixelPTEBytesPerRowC = 0;
2299 			PDEAndMetaPTEBytesFrameC = 0;
2300 			MetaRowByteC = 0;
2301 			v->MaxNumSwathC[k] = 0;
2302 			v->PrefetchSourceLinesC[k] = 0;
2303 		}
2304 
2305 		PDEAndMetaPTEBytesFrameY = CalculateVMAndRowBytes(
2306 				mode_lib,
2307 				v->DCCEnable[k],
2308 				v->BlockHeight256BytesY[k],
2309 				v->BlockWidth256BytesY[k],
2310 				v->SourcePixelFormat[k],
2311 				v->SurfaceTiling[k],
2312 				v->BytePerPixelY[k],
2313 				v->SourceScan[k],
2314 				v->SwathWidthY[k],
2315 				v->ViewportHeight[k],
2316 				v->GPUVMEnable,
2317 				v->HostVMEnable,
2318 				v->HostVMMaxNonCachedPageTableLevels,
2319 				v->GPUVMMinPageSize,
2320 				v->HostVMMinPageSize,
2321 				v->PTEBufferSizeInRequestsForLuma,
2322 				v->PitchY[k],
2323 				v->DCCMetaPitchY[k],
2324 				&v->MacroTileWidthY[k],
2325 				&MetaRowByteY,
2326 				&PixelPTEBytesPerRowY,
2327 				&PTEBufferSizeNotExceededY,
2328 				&v->dpte_row_width_luma_ub[k],
2329 				&v->dpte_row_height[k],
2330 				&v->meta_req_width[k],
2331 				&v->meta_req_height[k],
2332 				&v->meta_row_width[k],
2333 				&v->meta_row_height[k],
2334 				&v->vm_group_bytes[k],
2335 				&v->dpte_group_bytes[k],
2336 				&v->PixelPTEReqWidthY[k],
2337 				&v->PixelPTEReqHeightY[k],
2338 				&v->PTERequestSizeY[k],
2339 				&v->dpde0_bytes_per_frame_ub_l[k],
2340 				&v->meta_pte_bytes_per_frame_ub_l[k]);
2341 
2342 		v->PrefetchSourceLinesY[k] = CalculatePrefetchSourceLines(
2343 				mode_lib,
2344 				v->VRatio[k],
2345 				v->vtaps[k],
2346 				v->Interlace[k],
2347 				v->ProgressiveToInterlaceUnitInOPP,
2348 				v->SwathHeightY[k],
2349 				v->ViewportYStartY[k],
2350 				&v->VInitPreFillY[k],
2351 				&v->MaxNumSwathY[k]);
2352 		v->PixelPTEBytesPerRow[k] = PixelPTEBytesPerRowY + PixelPTEBytesPerRowC;
2353 		v->PDEAndMetaPTEBytesFrame[k] = PDEAndMetaPTEBytesFrameY
2354 				+ PDEAndMetaPTEBytesFrameC;
2355 		v->MetaRowByte[k] = MetaRowByteY + MetaRowByteC;
2356 
2357 		CalculateRowBandwidth(
2358 				v->GPUVMEnable,
2359 				v->SourcePixelFormat[k],
2360 				v->VRatio[k],
2361 				v->VRatioChroma[k],
2362 				v->DCCEnable[k],
2363 				v->HTotal[k] / v->PixelClock[k],
2364 				MetaRowByteY,
2365 				MetaRowByteC,
2366 				v->meta_row_height[k],
2367 				v->meta_row_height_chroma[k],
2368 				PixelPTEBytesPerRowY,
2369 				PixelPTEBytesPerRowC,
2370 				v->dpte_row_height[k],
2371 				v->dpte_row_height_chroma[k],
2372 				&v->meta_row_bw[k],
2373 				&v->dpte_row_bw[k]);
2374 	}
2375 
2376 	v->TotalDCCActiveDPP = 0;
2377 	v->TotalActiveDPP = 0;
2378 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2379 		v->TotalActiveDPP = v->TotalActiveDPP
2380 				+ v->DPPPerPlane[k];
2381 		if (v->DCCEnable[k])
2382 			v->TotalDCCActiveDPP = v->TotalDCCActiveDPP
2383 					+ v->DPPPerPlane[k];
2384 	}
2385 
2386 
2387 	ReorderBytes = v->NumberOfChannels * dml_max3(
2388 		v->UrgentOutOfOrderReturnPerChannelPixelDataOnly,
2389 		v->UrgentOutOfOrderReturnPerChannelPixelMixedWithVMData,
2390 		v->UrgentOutOfOrderReturnPerChannelVMDataOnly);
2391 
2392 	v->UrgentExtraLatency = CalculateExtraLatency(
2393 		v->RoundTripPingLatencyCycles,
2394 		ReorderBytes,
2395 		v->DCFCLK,
2396 		v->TotalActiveDPP,
2397 		v->PixelChunkSizeInKByte,
2398 		v->TotalDCCActiveDPP,
2399 		v->MetaChunkSize,
2400 		v->ReturnBW,
2401 		v->GPUVMEnable,
2402 		v->HostVMEnable,
2403 		v->NumberOfActivePlanes,
2404 		v->DPPPerPlane,
2405 		v->dpte_group_bytes,
2406 		v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
2407 		v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
2408 		v->HostVMMinPageSize,
2409 		v->HostVMMaxNonCachedPageTableLevels);
2410 
2411 	v->TCalc = 24.0 / v->DCFCLKDeepSleep;
2412 
2413 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2414 		if (v->BlendingAndTiming[k] == k) {
2415 			if (v->WritebackEnable[k] == true) {
2416 				v->WritebackDelay[v->VoltageLevel][k] = v->WritebackLatency +
2417 						CalculateWriteBackDelay(v->WritebackPixelFormat[k],
2418 									v->WritebackHRatio[k],
2419 									v->WritebackVRatio[k],
2420 									v->WritebackVTaps[k],
2421 									v->WritebackDestinationWidth[k],
2422 									v->WritebackDestinationHeight[k],
2423 									v->WritebackSourceHeight[k],
2424 									v->HTotal[k]) / v->DISPCLK;
2425 			} else
2426 				v->WritebackDelay[v->VoltageLevel][k] = 0;
2427 			for (j = 0; j < v->NumberOfActivePlanes; ++j) {
2428 				if (v->BlendingAndTiming[j] == k
2429 						&& v->WritebackEnable[j] == true) {
2430 					v->WritebackDelay[v->VoltageLevel][k] = dml_max(v->WritebackDelay[v->VoltageLevel][k],
2431 							v->WritebackLatency + CalculateWriteBackDelay(
2432 											v->WritebackPixelFormat[j],
2433 											v->WritebackHRatio[j],
2434 											v->WritebackVRatio[j],
2435 											v->WritebackVTaps[j],
2436 											v->WritebackDestinationWidth[j],
2437 											v->WritebackDestinationHeight[j],
2438 											v->WritebackSourceHeight[j],
2439 											v->HTotal[k]) / v->DISPCLK);
2440 				}
2441 			}
2442 		}
2443 	}
2444 
2445 	for (k = 0; k < v->NumberOfActivePlanes; ++k)
2446 		for (j = 0; j < v->NumberOfActivePlanes; ++j)
2447 			if (v->BlendingAndTiming[k] == j)
2448 				v->WritebackDelay[v->VoltageLevel][k] = v->WritebackDelay[v->VoltageLevel][j];
2449 
2450 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2451 		v->MaxVStartupLines[k] = v->VTotal[k] - v->VActive[k] - dml_max(1.0, dml_ceil((double) v->WritebackDelay[v->VoltageLevel][k] / (v->HTotal[k] / v->PixelClock[k]), 1));
2452 	}
2453 
2454 	v->MaximumMaxVStartupLines = 0;
2455 	for (k = 0; k < v->NumberOfActivePlanes; ++k)
2456 		v->MaximumMaxVStartupLines = dml_max(v->MaximumMaxVStartupLines, v->MaxVStartupLines[k]);
2457 
2458 	if (v->DRAMClockChangeLatencyOverride > 0.0) {
2459 		v->FinalDRAMClockChangeLatency = v->DRAMClockChangeLatencyOverride;
2460 	} else {
2461 		v->FinalDRAMClockChangeLatency = v->DRAMClockChangeLatency;
2462 	}
2463 	v->UrgentLatency = CalculateUrgentLatency(v->UrgentLatencyPixelDataOnly, v->UrgentLatencyPixelMixedWithVMData, v->UrgentLatencyVMDataOnly, v->DoUrgentLatencyAdjustment, v->UrgentLatencyAdjustmentFabricClockComponent, v->UrgentLatencyAdjustmentFabricClockReference, v->FabricClock);
2464 
2465 
2466 	v->FractionOfUrgentBandwidth = 0.0;
2467 	v->FractionOfUrgentBandwidthImmediateFlip = 0.0;
2468 
2469 	v->VStartupLines = 13;
2470 
2471 	do {
2472 		MaxTotalRDBandwidth = 0;
2473 		MaxTotalRDBandwidthNoUrgentBurst = 0;
2474 		DestinationLineTimesForPrefetchLessThan2 = false;
2475 		VRatioPrefetchMoreThan4 = false;
2476 		TWait = CalculateTWait(
2477 				PrefetchMode,
2478 				v->FinalDRAMClockChangeLatency,
2479 				v->UrgentLatency,
2480 				v->SREnterPlusExitTime);
2481 
2482 		for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2483 			Pipe myPipe = { 0 };
2484 
2485 			myPipe.DPPCLK = v->DPPCLK[k];
2486 			myPipe.DISPCLK = v->DISPCLK;
2487 			myPipe.PixelClock = v->PixelClock[k];
2488 			myPipe.DCFCLKDeepSleep = v->DCFCLKDeepSleep;
2489 			myPipe.DPPPerPlane = v->DPPPerPlane[k];
2490 			myPipe.ScalerEnabled = v->ScalerEnabled[k];
2491 			myPipe.SourceScan = v->SourceScan[k];
2492 			myPipe.BlockWidth256BytesY = v->BlockWidth256BytesY[k];
2493 			myPipe.BlockHeight256BytesY = v->BlockHeight256BytesY[k];
2494 			myPipe.BlockWidth256BytesC = v->BlockWidth256BytesC[k];
2495 			myPipe.BlockHeight256BytesC = v->BlockHeight256BytesC[k];
2496 			myPipe.InterlaceEnable = v->Interlace[k];
2497 			myPipe.NumberOfCursors = v->NumberOfCursors[k];
2498 			myPipe.VBlank = v->VTotal[k] - v->VActive[k];
2499 			myPipe.HTotal = v->HTotal[k];
2500 			myPipe.DCCEnable = v->DCCEnable[k];
2501 			myPipe.ODMCombineEnabled = !!v->ODMCombineEnabled[k];
2502 
2503 			v->ErrorResult[k] = CalculatePrefetchSchedule(
2504 					mode_lib,
2505 					v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
2506 					v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
2507 					&myPipe,
2508 					v->DSCDelay[k],
2509 					v->DPPCLKDelaySubtotal
2510 							+ v->DPPCLKDelayCNVCFormater,
2511 					v->DPPCLKDelaySCL,
2512 					v->DPPCLKDelaySCLLBOnly,
2513 					v->DPPCLKDelayCNVCCursor,
2514 					v->DISPCLKDelaySubtotal,
2515 					(unsigned int) (v->SwathWidthY[k] / v->HRatio[k]),
2516 					v->OutputFormat[k],
2517 					v->MaxInterDCNTileRepeaters,
2518 					dml_min(v->VStartupLines, v->MaxVStartupLines[k]),
2519 					v->MaxVStartupLines[k],
2520 					v->GPUVMMaxPageTableLevels,
2521 					v->GPUVMEnable,
2522 					v->HostVMEnable,
2523 					v->HostVMMaxNonCachedPageTableLevels,
2524 					v->HostVMMinPageSize,
2525 					v->DynamicMetadataEnable[k],
2526 					v->DynamicMetadataVMEnabled,
2527 					v->DynamicMetadataLinesBeforeActiveRequired[k],
2528 					v->DynamicMetadataTransmittedBytes[k],
2529 					v->UrgentLatency,
2530 					v->UrgentExtraLatency,
2531 					v->TCalc,
2532 					v->PDEAndMetaPTEBytesFrame[k],
2533 					v->MetaRowByte[k],
2534 					v->PixelPTEBytesPerRow[k],
2535 					v->PrefetchSourceLinesY[k],
2536 					v->SwathWidthY[k],
2537 					v->BytePerPixelY[k],
2538 					v->VInitPreFillY[k],
2539 					v->MaxNumSwathY[k],
2540 					v->PrefetchSourceLinesC[k],
2541 					v->SwathWidthC[k],
2542 					v->BytePerPixelC[k],
2543 					v->VInitPreFillC[k],
2544 					v->MaxNumSwathC[k],
2545 					v->swath_width_luma_ub[k],
2546 					v->swath_width_chroma_ub[k],
2547 					v->SwathHeightY[k],
2548 					v->SwathHeightC[k],
2549 					TWait,
2550 					v->ProgressiveToInterlaceUnitInOPP,
2551 					&v->DSTXAfterScaler[k],
2552 					&v->DSTYAfterScaler[k],
2553 					&v->DestinationLinesForPrefetch[k],
2554 					&v->PrefetchBandwidth[k],
2555 					&v->DestinationLinesToRequestVMInVBlank[k],
2556 					&v->DestinationLinesToRequestRowInVBlank[k],
2557 					&v->VRatioPrefetchY[k],
2558 					&v->VRatioPrefetchC[k],
2559 					&v->RequiredPrefetchPixDataBWLuma[k],
2560 					&v->RequiredPrefetchPixDataBWChroma[k],
2561 					&v->NotEnoughTimeForDynamicMetadata[k],
2562 					&v->Tno_bw[k],
2563 					&v->prefetch_vmrow_bw[k],
2564 					&v->Tdmdl_vm[k],
2565 					&v->Tdmdl[k],
2566 					&v->VUpdateOffsetPix[k],
2567 					&v->VUpdateWidthPix[k],
2568 					&v->VReadyOffsetPix[k]);
2569 			if (v->BlendingAndTiming[k] == k) {
2570 				double TotalRepeaterDelayTime = v->MaxInterDCNTileRepeaters * (2 / v->DPPCLK[k] + 3 / v->DISPCLK);
2571 				v->VUpdateWidthPix[k] = (14 / v->DCFCLKDeepSleep + 12 / v->DPPCLK[k] + TotalRepeaterDelayTime) * v->PixelClock[k];
2572 				v->VReadyOffsetPix[k] = dml_max(150.0 / v->DPPCLK[k], TotalRepeaterDelayTime + 20 / v->DCFCLKDeepSleep + 10 / v->DPPCLK[k]) * v->PixelClock[k];
2573 				v->VUpdateOffsetPix[k] = dml_ceil(v->HTotal[k] / 4.0, 1);
2574 				v->VStartup[k] = dml_min(v->VStartupLines, v->MaxVStartupLines[k]);
2575 			} else {
2576 				int x = v->BlendingAndTiming[k];
2577 				double TotalRepeaterDelayTime = v->MaxInterDCNTileRepeaters * (2 / v->DPPCLK[k] + 3 / v->DISPCLK);
2578 				v->VUpdateWidthPix[k] = (14 / v->DCFCLKDeepSleep + 12 / v->DPPCLK[k] + TotalRepeaterDelayTime) * v->PixelClock[x];
2579 				v->VReadyOffsetPix[k] = dml_max(150.0 / v->DPPCLK[k], TotalRepeaterDelayTime + 20 / v->DCFCLKDeepSleep + 10 / v->DPPCLK[k]) * v->PixelClock[x];
2580 				v->VUpdateOffsetPix[k] = dml_ceil(v->HTotal[x] / 4.0, 1);
2581 				if (!v->MaxVStartupLines[x])
2582 					v->MaxVStartupLines[x] = v->MaxVStartupLines[k];
2583 				v->VStartup[k] = dml_min(v->VStartupLines, v->MaxVStartupLines[x]);
2584 			}
2585 		}
2586 
2587 		v->NotEnoughUrgentLatencyHiding[0][0] = false;
2588 		v->NotEnoughUrgentLatencyHidingPre = false;
2589 
2590 		for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2591 			v->cursor_bw[k] = v->NumberOfCursors[k]
2592 					* v->CursorWidth[k][0] * v->CursorBPP[k][0]
2593 					/ 8.0
2594 					/ (v->HTotal[k] / v->PixelClock[k])
2595 					* v->VRatio[k];
2596 			v->cursor_bw_pre[k] = v->NumberOfCursors[k]
2597 					* v->CursorWidth[k][0] * v->CursorBPP[k][0]
2598 					/ 8.0
2599 					/ (v->HTotal[k] / v->PixelClock[k])
2600 					* v->VRatioPrefetchY[k];
2601 
2602 			CalculateUrgentBurstFactor(
2603 					v->swath_width_luma_ub[k],
2604 					v->swath_width_chroma_ub[k],
2605 					v->DETBufferSizeInKByte[0],
2606 					v->SwathHeightY[k],
2607 					v->SwathHeightC[k],
2608 					v->HTotal[k] / v->PixelClock[k],
2609 					v->UrgentLatency,
2610 					v->CursorBufferSize,
2611 					v->CursorWidth[k][0],
2612 					v->CursorBPP[k][0],
2613 					v->VRatio[k],
2614 					v->VRatioChroma[k],
2615 					v->BytePerPixelDETY[k],
2616 					v->BytePerPixelDETC[k],
2617 					v->DETBufferSizeY[k],
2618 					v->DETBufferSizeC[k],
2619 					&v->UrgentBurstFactorCursor[k],
2620 					&v->UrgentBurstFactorLuma[k],
2621 					&v->UrgentBurstFactorChroma[k],
2622 					&v->NoUrgentLatencyHiding[k]);
2623 
2624 			CalculateUrgentBurstFactor(
2625 					v->swath_width_luma_ub[k],
2626 					v->swath_width_chroma_ub[k],
2627 					v->DETBufferSizeInKByte[0],
2628 					v->SwathHeightY[k],
2629 					v->SwathHeightC[k],
2630 					v->HTotal[k] / v->PixelClock[k],
2631 					v->UrgentLatency,
2632 					v->CursorBufferSize,
2633 					v->CursorWidth[k][0],
2634 					v->CursorBPP[k][0],
2635 					v->VRatioPrefetchY[k],
2636 					v->VRatioPrefetchC[k],
2637 					v->BytePerPixelDETY[k],
2638 					v->BytePerPixelDETC[k],
2639 					v->DETBufferSizeY[k],
2640 					v->DETBufferSizeC[k],
2641 					&v->UrgentBurstFactorCursorPre[k],
2642 					&v->UrgentBurstFactorLumaPre[k],
2643 					&v->UrgentBurstFactorChromaPre[k],
2644 					&v->NoUrgentLatencyHidingPre[k]);
2645 
2646 			MaxTotalRDBandwidth = MaxTotalRDBandwidth +
2647 				dml_max3(v->DPPPerPlane[k] * v->prefetch_vmrow_bw[k],
2648 					v->ReadBandwidthPlaneLuma[k] *
2649 					v->UrgentBurstFactorLuma[k] +
2650 					v->ReadBandwidthPlaneChroma[k] *
2651 					v->UrgentBurstFactorChroma[k] +
2652 					v->cursor_bw[k] *
2653 					v->UrgentBurstFactorCursor[k] +
2654 					v->DPPPerPlane[k] * (v->meta_row_bw[k] + v->dpte_row_bw[k]),
2655 					v->DPPPerPlane[k] * (v->RequiredPrefetchPixDataBWLuma[k] * v->UrgentBurstFactorLumaPre[k] +
2656 						v->RequiredPrefetchPixDataBWChroma[k] * v->UrgentBurstFactorChromaPre[k]) + v->cursor_bw_pre[k] *
2657 					v->UrgentBurstFactorCursorPre[k]);
2658 
2659 			MaxTotalRDBandwidthNoUrgentBurst = MaxTotalRDBandwidthNoUrgentBurst +
2660 				dml_max3(v->DPPPerPlane[k] * v->prefetch_vmrow_bw[k],
2661 					v->ReadBandwidthPlaneLuma[k] +
2662 					v->ReadBandwidthPlaneChroma[k] +
2663 					v->cursor_bw[k] +
2664 					v->DPPPerPlane[k] * (v->meta_row_bw[k] + v->dpte_row_bw[k]),
2665 					v->DPPPerPlane[k] * (v->RequiredPrefetchPixDataBWLuma[k] + v->RequiredPrefetchPixDataBWChroma[k]) + v->cursor_bw_pre[k]);
2666 
2667 			if (v->DestinationLinesForPrefetch[k] < 2)
2668 				DestinationLineTimesForPrefetchLessThan2 = true;
2669 			if (v->VRatioPrefetchY[k] > 4 || v->VRatioPrefetchC[k] > 4)
2670 				VRatioPrefetchMoreThan4 = true;
2671 			if (v->NoUrgentLatencyHiding[k] == true)
2672 				v->NotEnoughUrgentLatencyHiding[0][0] = true;
2673 
2674 			if (v->NoUrgentLatencyHidingPre[k] == true)
2675 				v->NotEnoughUrgentLatencyHidingPre = true;
2676 		}
2677 		v->FractionOfUrgentBandwidth = MaxTotalRDBandwidthNoUrgentBurst / v->ReturnBW;
2678 
2679 
2680 		if (MaxTotalRDBandwidth <= v->ReturnBW && v->NotEnoughUrgentLatencyHiding[0][0] == 0
2681 				&& v->NotEnoughUrgentLatencyHidingPre == 0 && !VRatioPrefetchMoreThan4
2682 				&& !DestinationLineTimesForPrefetchLessThan2)
2683 			v->PrefetchModeSupported = true;
2684 		else {
2685 			v->PrefetchModeSupported = false;
2686 			dml_print("DML: CalculatePrefetchSchedule ***failed***. Bandwidth violation. Results are NOT valid\n");
2687 			dml_print("DML: MaxTotalRDBandwidth:%f AvailReturnBandwidth:%f\n", MaxTotalRDBandwidth, v->ReturnBW);
2688 			dml_print("DML: VRatioPrefetch %s more than 4\n", (VRatioPrefetchMoreThan4) ? "is" : "is not");
2689 			dml_print("DML: DestinationLines for Prefetch %s less than 2\n", (DestinationLineTimesForPrefetchLessThan2) ? "is" : "is not");
2690 		}
2691 
2692 		if (v->PrefetchModeSupported == true && v->ImmediateFlipSupport == true) {
2693 			v->BandwidthAvailableForImmediateFlip = v->ReturnBW;
2694 			for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2695 				v->BandwidthAvailableForImmediateFlip =
2696 						v->BandwidthAvailableForImmediateFlip
2697 								- dml_max(
2698 										v->ReadBandwidthPlaneLuma[k] * v->UrgentBurstFactorLuma[k]
2699 												+ v->ReadBandwidthPlaneChroma[k] * v->UrgentBurstFactorChroma[k]
2700 												+ v->cursor_bw[k] * v->UrgentBurstFactorCursor[k],
2701 										v->DPPPerPlane[k] * (v->RequiredPrefetchPixDataBWLuma[k] * v->UrgentBurstFactorLumaPre[k] +
2702 										v->RequiredPrefetchPixDataBWChroma[k] * v->UrgentBurstFactorChromaPre[k]) +
2703 										v->cursor_bw_pre[k] * v->UrgentBurstFactorCursorPre[k]);
2704 			}
2705 
2706 			v->TotImmediateFlipBytes = 0;
2707 			for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2708 				v->TotImmediateFlipBytes = v->TotImmediateFlipBytes + v->DPPPerPlane[k] * (v->PDEAndMetaPTEBytesFrame[k] + v->MetaRowByte[k] + v->PixelPTEBytesPerRow[k]);
2709 			}
2710 			for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2711 				CalculateFlipSchedule(
2712 						mode_lib,
2713 						v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
2714 						v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
2715 						v->UrgentExtraLatency,
2716 						v->UrgentLatency,
2717 						v->GPUVMMaxPageTableLevels,
2718 						v->HostVMEnable,
2719 						v->HostVMMaxNonCachedPageTableLevels,
2720 						v->GPUVMEnable,
2721 						v->HostVMMinPageSize,
2722 						v->PDEAndMetaPTEBytesFrame[k],
2723 						v->MetaRowByte[k],
2724 						v->PixelPTEBytesPerRow[k],
2725 						v->BandwidthAvailableForImmediateFlip,
2726 						v->TotImmediateFlipBytes,
2727 						v->SourcePixelFormat[k],
2728 						v->HTotal[k] / v->PixelClock[k],
2729 						v->VRatio[k],
2730 						v->VRatioChroma[k],
2731 						v->Tno_bw[k],
2732 						v->DCCEnable[k],
2733 						v->dpte_row_height[k],
2734 						v->meta_row_height[k],
2735 						v->dpte_row_height_chroma[k],
2736 						v->meta_row_height_chroma[k],
2737 						&v->DestinationLinesToRequestVMInImmediateFlip[k],
2738 						&v->DestinationLinesToRequestRowInImmediateFlip[k],
2739 						&v->final_flip_bw[k],
2740 						&v->ImmediateFlipSupportedForPipe[k]);
2741 			}
2742 			v->total_dcn_read_bw_with_flip = 0.0;
2743 			v->total_dcn_read_bw_with_flip_no_urgent_burst = 0.0;
2744 			for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2745 				v->total_dcn_read_bw_with_flip = v->total_dcn_read_bw_with_flip + dml_max3(
2746 					v->DPPPerPlane[k] * v->prefetch_vmrow_bw[k],
2747 					v->DPPPerPlane[k] * v->final_flip_bw[k] +
2748 					v->ReadBandwidthLuma[k] * v->UrgentBurstFactorLuma[k] +
2749 					v->ReadBandwidthChroma[k] * v->UrgentBurstFactorChroma[k] +
2750 					v->cursor_bw[k] * v->UrgentBurstFactorCursor[k],
2751 					v->DPPPerPlane[k] * (v->final_flip_bw[k] +
2752 					v->RequiredPrefetchPixDataBWLuma[k] * v->UrgentBurstFactorLumaPre[k] +
2753 					v->RequiredPrefetchPixDataBWChroma[k] * v->UrgentBurstFactorChromaPre[k]) +
2754 					v->cursor_bw_pre[k] * v->UrgentBurstFactorCursorPre[k]);
2755 				v->total_dcn_read_bw_with_flip_no_urgent_burst =
2756 					v->total_dcn_read_bw_with_flip_no_urgent_burst +
2757 						dml_max3(v->DPPPerPlane[k] * v->prefetch_vmrow_bw[k],
2758 							v->DPPPerPlane[k] * v->final_flip_bw[k] + v->ReadBandwidthPlaneLuma[k] + v->ReadBandwidthPlaneChroma[k] + v->cursor_bw[k],
2759 							v->DPPPerPlane[k] * (v->final_flip_bw[k] + v->RequiredPrefetchPixDataBWLuma[k] + v->RequiredPrefetchPixDataBWChroma[k]) + v->cursor_bw_pre[k]);
2760 
2761 			}
2762 			v->FractionOfUrgentBandwidthImmediateFlip = v->total_dcn_read_bw_with_flip_no_urgent_burst / v->ReturnBW;
2763 
2764 			v->ImmediateFlipSupported = true;
2765 			if (v->total_dcn_read_bw_with_flip > v->ReturnBW) {
2766 				v->ImmediateFlipSupported = false;
2767 				v->total_dcn_read_bw_with_flip = MaxTotalRDBandwidth;
2768 			}
2769 			for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2770 				if (v->ImmediateFlipSupportedForPipe[k] == false) {
2771 					v->ImmediateFlipSupported = false;
2772 				}
2773 			}
2774 		} else {
2775 			v->ImmediateFlipSupported = false;
2776 		}
2777 
2778 		for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2779 			if (v->ErrorResult[k] || v->NotEnoughTimeForDynamicMetadata[k]) {
2780 				v->PrefetchModeSupported = false;
2781 				dml_print("DML: CalculatePrefetchSchedule ***failed***. Prefetch schedule violation. Results are NOT valid\n");
2782 			}
2783 		}
2784 
2785 		v->VStartupLines = v->VStartupLines + 1;
2786 		v->PrefetchModeSupported = (v->PrefetchModeSupported == true && ((!v->ImmediateFlipSupport &&
2787 				!v->HostVMEnable && v->ImmediateFlipRequirement[0] != dm_immediate_flip_required) ||
2788 				v->ImmediateFlipSupported)) ? true : false;
2789 	} while (!v->PrefetchModeSupported && v->VStartupLines <= v->MaximumMaxVStartupLines);
2790 	ASSERT(v->PrefetchModeSupported);
2791 
2792 	//Watermarks and NB P-State/DRAM Clock Change Support
2793 	{
2794 		enum clock_change_support   DRAMClockChangeSupport = 0; // dummy
2795 		CalculateWatermarksAndDRAMSpeedChangeSupport(
2796 			mode_lib,
2797 			PrefetchMode,
2798 			v->NumberOfActivePlanes,
2799 			v->MaxLineBufferLines,
2800 			v->LineBufferSize,
2801 			v->DPPOutputBufferPixels,
2802 			v->DETBufferSizeInKByte[0],
2803 			v->WritebackInterfaceBufferSize,
2804 			v->DCFCLK,
2805 			v->ReturnBW,
2806 			v->GPUVMEnable,
2807 			v->dpte_group_bytes,
2808 			v->MetaChunkSize,
2809 			v->UrgentLatency,
2810 			v->UrgentExtraLatency,
2811 			v->WritebackLatency,
2812 			v->WritebackChunkSize,
2813 			v->SOCCLK,
2814 			v->FinalDRAMClockChangeLatency,
2815 			v->SRExitTime,
2816 			v->SREnterPlusExitTime,
2817 			v->DCFCLKDeepSleep,
2818 			v->DPPPerPlane,
2819 			v->DCCEnable,
2820 			v->DPPCLK,
2821 			v->DETBufferSizeY,
2822 			v->DETBufferSizeC,
2823 			v->SwathHeightY,
2824 			v->SwathHeightC,
2825 			v->LBBitPerPixel,
2826 			v->SwathWidthY,
2827 			v->SwathWidthC,
2828 			v->HRatio,
2829 			v->HRatioChroma,
2830 			v->vtaps,
2831 			v->VTAPsChroma,
2832 			v->VRatio,
2833 			v->VRatioChroma,
2834 			v->HTotal,
2835 			v->PixelClock,
2836 			v->BlendingAndTiming,
2837 			v->BytePerPixelDETY,
2838 			v->BytePerPixelDETC,
2839 			v->DSTXAfterScaler,
2840 			v->DSTYAfterScaler,
2841 			v->WritebackEnable,
2842 			v->WritebackPixelFormat,
2843 			v->WritebackDestinationWidth,
2844 			v->WritebackDestinationHeight,
2845 			v->WritebackSourceHeight,
2846 			&DRAMClockChangeSupport,
2847 			&v->UrgentWatermark,
2848 			&v->WritebackUrgentWatermark,
2849 			&v->DRAMClockChangeWatermark,
2850 			&v->WritebackDRAMClockChangeWatermark,
2851 			&v->StutterExitWatermark,
2852 			&v->StutterEnterPlusExitWatermark,
2853 			&v->MinActiveDRAMClockChangeLatencySupported);
2854 
2855 		for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2856 			if (v->WritebackEnable[k] == true) {
2857 				if (v->BlendingAndTiming[k] == k) {
2858 					v->ThisVStartup = v->VStartup[k];
2859 				} else {
2860 					for (j = 0; j < v->NumberOfActivePlanes; ++j) {
2861 						if (v->BlendingAndTiming[k] == j) {
2862 							v->ThisVStartup = v->VStartup[j];
2863 						}
2864 					}
2865 				}
2866 				v->WritebackAllowDRAMClockChangeEndPosition[k] = dml_max(0,
2867 					v->ThisVStartup * v->HTotal[k] / v->PixelClock[k] - v->WritebackDRAMClockChangeWatermark);
2868 			} else {
2869 				v->WritebackAllowDRAMClockChangeEndPosition[k] = 0;
2870 			}
2871 		}
2872 
2873 	}
2874 
2875 
2876 	//Display Pipeline Delivery Time in Prefetch, Groups
2877 	CalculatePixelDeliveryTimes(
2878 			v->NumberOfActivePlanes,
2879 			v->VRatio,
2880 			v->VRatioChroma,
2881 			v->VRatioPrefetchY,
2882 			v->VRatioPrefetchC,
2883 			v->swath_width_luma_ub,
2884 			v->swath_width_chroma_ub,
2885 			v->DPPPerPlane,
2886 			v->HRatio,
2887 			v->HRatioChroma,
2888 			v->PixelClock,
2889 			v->PSCL_THROUGHPUT_LUMA,
2890 			v->PSCL_THROUGHPUT_CHROMA,
2891 			v->DPPCLK,
2892 			v->BytePerPixelC,
2893 			v->SourceScan,
2894 			v->NumberOfCursors,
2895 			v->CursorWidth,
2896 			v->CursorBPP,
2897 			v->BlockWidth256BytesY,
2898 			v->BlockHeight256BytesY,
2899 			v->BlockWidth256BytesC,
2900 			v->BlockHeight256BytesC,
2901 			v->DisplayPipeLineDeliveryTimeLuma,
2902 			v->DisplayPipeLineDeliveryTimeChroma,
2903 			v->DisplayPipeLineDeliveryTimeLumaPrefetch,
2904 			v->DisplayPipeLineDeliveryTimeChromaPrefetch,
2905 			v->DisplayPipeRequestDeliveryTimeLuma,
2906 			v->DisplayPipeRequestDeliveryTimeChroma,
2907 			v->DisplayPipeRequestDeliveryTimeLumaPrefetch,
2908 			v->DisplayPipeRequestDeliveryTimeChromaPrefetch,
2909 			v->CursorRequestDeliveryTime,
2910 			v->CursorRequestDeliveryTimePrefetch);
2911 
2912 	CalculateMetaAndPTETimes(
2913 			v->NumberOfActivePlanes,
2914 			v->GPUVMEnable,
2915 			v->MetaChunkSize,
2916 			v->MinMetaChunkSizeBytes,
2917 			v->HTotal,
2918 			v->VRatio,
2919 			v->VRatioChroma,
2920 			v->DestinationLinesToRequestRowInVBlank,
2921 			v->DestinationLinesToRequestRowInImmediateFlip,
2922 			v->DCCEnable,
2923 			v->PixelClock,
2924 			v->BytePerPixelY,
2925 			v->BytePerPixelC,
2926 			v->SourceScan,
2927 			v->dpte_row_height,
2928 			v->dpte_row_height_chroma,
2929 			v->meta_row_width,
2930 			v->meta_row_width_chroma,
2931 			v->meta_row_height,
2932 			v->meta_row_height_chroma,
2933 			v->meta_req_width,
2934 			v->meta_req_width_chroma,
2935 			v->meta_req_height,
2936 			v->meta_req_height_chroma,
2937 			v->dpte_group_bytes,
2938 			v->PTERequestSizeY,
2939 			v->PTERequestSizeC,
2940 			v->PixelPTEReqWidthY,
2941 			v->PixelPTEReqHeightY,
2942 			v->PixelPTEReqWidthC,
2943 			v->PixelPTEReqHeightC,
2944 			v->dpte_row_width_luma_ub,
2945 			v->dpte_row_width_chroma_ub,
2946 			v->DST_Y_PER_PTE_ROW_NOM_L,
2947 			v->DST_Y_PER_PTE_ROW_NOM_C,
2948 			v->DST_Y_PER_META_ROW_NOM_L,
2949 			v->DST_Y_PER_META_ROW_NOM_C,
2950 			v->TimePerMetaChunkNominal,
2951 			v->TimePerChromaMetaChunkNominal,
2952 			v->TimePerMetaChunkVBlank,
2953 			v->TimePerChromaMetaChunkVBlank,
2954 			v->TimePerMetaChunkFlip,
2955 			v->TimePerChromaMetaChunkFlip,
2956 			v->time_per_pte_group_nom_luma,
2957 			v->time_per_pte_group_vblank_luma,
2958 			v->time_per_pte_group_flip_luma,
2959 			v->time_per_pte_group_nom_chroma,
2960 			v->time_per_pte_group_vblank_chroma,
2961 			v->time_per_pte_group_flip_chroma);
2962 
2963 	CalculateVMGroupAndRequestTimes(
2964 			v->NumberOfActivePlanes,
2965 			v->GPUVMEnable,
2966 			v->GPUVMMaxPageTableLevels,
2967 			v->HTotal,
2968 			v->BytePerPixelC,
2969 			v->DestinationLinesToRequestVMInVBlank,
2970 			v->DestinationLinesToRequestVMInImmediateFlip,
2971 			v->DCCEnable,
2972 			v->PixelClock,
2973 			v->dpte_row_width_luma_ub,
2974 			v->dpte_row_width_chroma_ub,
2975 			v->vm_group_bytes,
2976 			v->dpde0_bytes_per_frame_ub_l,
2977 			v->dpde0_bytes_per_frame_ub_c,
2978 			v->meta_pte_bytes_per_frame_ub_l,
2979 			v->meta_pte_bytes_per_frame_ub_c,
2980 			v->TimePerVMGroupVBlank,
2981 			v->TimePerVMGroupFlip,
2982 			v->TimePerVMRequestVBlank,
2983 			v->TimePerVMRequestFlip);
2984 
2985 
2986 	// Min TTUVBlank
2987 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
2988 		if (PrefetchMode == 0) {
2989 			v->AllowDRAMClockChangeDuringVBlank[k] = true;
2990 			v->AllowDRAMSelfRefreshDuringVBlank[k] = true;
2991 			v->MinTTUVBlank[k] = dml_max(
2992 					v->DRAMClockChangeWatermark,
2993 					dml_max(
2994 							v->StutterEnterPlusExitWatermark,
2995 							v->UrgentWatermark));
2996 		} else if (PrefetchMode == 1) {
2997 			v->AllowDRAMClockChangeDuringVBlank[k] = false;
2998 			v->AllowDRAMSelfRefreshDuringVBlank[k] = true;
2999 			v->MinTTUVBlank[k] = dml_max(
3000 					v->StutterEnterPlusExitWatermark,
3001 					v->UrgentWatermark);
3002 		} else {
3003 			v->AllowDRAMClockChangeDuringVBlank[k] = false;
3004 			v->AllowDRAMSelfRefreshDuringVBlank[k] = false;
3005 			v->MinTTUVBlank[k] = v->UrgentWatermark;
3006 		}
3007 		if (!v->DynamicMetadataEnable[k])
3008 			v->MinTTUVBlank[k] = v->TCalc
3009 					+ v->MinTTUVBlank[k];
3010 	}
3011 
3012 	// DCC Configuration
3013 	v->ActiveDPPs = 0;
3014 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
3015 		CalculateDCCConfiguration(v->DCCEnable[k], false, // We should always know the direction DCCProgrammingAssumesScanDirectionUnknown,
3016 				v->SourcePixelFormat[k],
3017 				v->SurfaceWidthY[k],
3018 				v->SurfaceWidthC[k],
3019 				v->SurfaceHeightY[k],
3020 				v->SurfaceHeightC[k],
3021 				v->DETBufferSizeInKByte[0] * 1024,
3022 				v->BlockHeight256BytesY[k],
3023 				v->BlockHeight256BytesC[k],
3024 				v->SurfaceTiling[k],
3025 				v->BytePerPixelY[k],
3026 				v->BytePerPixelC[k],
3027 				v->BytePerPixelDETY[k],
3028 				v->BytePerPixelDETC[k],
3029 				v->SourceScan[k],
3030 				&v->DCCYMaxUncompressedBlock[k],
3031 				&v->DCCCMaxUncompressedBlock[k],
3032 				&v->DCCYMaxCompressedBlock[k],
3033 				&v->DCCCMaxCompressedBlock[k],
3034 				&v->DCCYIndependentBlock[k],
3035 				&v->DCCCIndependentBlock[k]);
3036 	}
3037 
3038 	{
3039 		//Maximum Bandwidth Used
3040 		v->TotalDataReadBandwidth = 0;
3041 		for (k = 0; k < v->NumberOfActivePlanes; ++k) {
3042 			v->TotalDataReadBandwidth = v->TotalDataReadBandwidth
3043 					+ v->ReadBandwidthPlaneLuma[k]
3044 					+ v->ReadBandwidthPlaneChroma[k];
3045 		}
3046 	}
3047 
3048 	// VStartup Margin
3049 	v->VStartupMargin = 0;
3050 	v->FirstMainPlane = true;
3051 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
3052 		if (v->BlendingAndTiming[k] == k) {
3053 			double margin = (v->MaxVStartupLines[k] - v->VStartup[k]) * v->HTotal[k]
3054 					/ v->PixelClock[k];
3055 			if (v->FirstMainPlane == true) {
3056 				v->VStartupMargin = margin;
3057 				v->FirstMainPlane = false;
3058 			} else {
3059 				v->VStartupMargin = dml_min(v->VStartupMargin, margin);
3060 			}
3061 		}
3062 	}
3063 
3064 	// Stutter Efficiency
3065 	CalculateStutterEfficiency(
3066 			v->NumberOfActivePlanes,
3067 			v->ROBBufferSizeInKByte,
3068 			v->TotalDataReadBandwidth,
3069 			v->DCFCLK,
3070 			v->ReturnBW,
3071 			v->SRExitTime,
3072 			v->SynchronizedVBlank,
3073 			v->DPPPerPlane,
3074 			v->DETBufferSizeY,
3075 			v->BytePerPixelY,
3076 			v->BytePerPixelDETY,
3077 			v->SwathWidthY,
3078 			v->SwathHeightY,
3079 			v->SwathHeightC,
3080 			v->DCCRateLuma,
3081 			v->DCCRateChroma,
3082 			v->HTotal,
3083 			v->VTotal,
3084 			v->PixelClock,
3085 			v->VRatio,
3086 			v->SourceScan,
3087 			v->BlockHeight256BytesY,
3088 			v->BlockWidth256BytesY,
3089 			v->BlockHeight256BytesC,
3090 			v->BlockWidth256BytesC,
3091 			v->DCCYMaxUncompressedBlock,
3092 			v->DCCCMaxUncompressedBlock,
3093 			v->VActive,
3094 			v->DCCEnable,
3095 			v->WritebackEnable,
3096 			v->ReadBandwidthPlaneLuma,
3097 			v->ReadBandwidthPlaneChroma,
3098 			v->meta_row_bw,
3099 			v->dpte_row_bw,
3100 			&v->StutterEfficiencyNotIncludingVBlank,
3101 			&v->StutterEfficiency,
3102 			&v->StutterPeriod);
3103 }
3104 
3105 static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib)
3106 {
3107 	// Display Pipe Configuration
3108 	double BytePerPixDETY[DC__NUM_DPP__MAX] = { 0 };
3109 	double BytePerPixDETC[DC__NUM_DPP__MAX] = { 0 };
3110 	int BytePerPixY[DC__NUM_DPP__MAX] = { 0 };
3111 	int BytePerPixC[DC__NUM_DPP__MAX] = { 0 };
3112 	int Read256BytesBlockHeightY[DC__NUM_DPP__MAX] = { 0 };
3113 	int Read256BytesBlockHeightC[DC__NUM_DPP__MAX] = { 0 };
3114 	int Read256BytesBlockWidthY[DC__NUM_DPP__MAX] = { 0 };
3115 	int Read256BytesBlockWidthC[DC__NUM_DPP__MAX] = { 0 };
3116 	double dummy1[DC__NUM_DPP__MAX] = { 0 };
3117 	double dummy2[DC__NUM_DPP__MAX] = { 0 };
3118 	double dummy3[DC__NUM_DPP__MAX] = { 0 };
3119 	double dummy4[DC__NUM_DPP__MAX] = { 0 };
3120 	int dummy5[DC__NUM_DPP__MAX] = { 0 };
3121 	int dummy6[DC__NUM_DPP__MAX] = { 0 };
3122 	bool dummy7[DC__NUM_DPP__MAX] = { 0 };
3123 	bool dummysinglestring = 0;
3124 	unsigned int k;
3125 
3126 	for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
3127 
3128 		dml30_CalculateBytePerPixelAnd256BBlockSizes(
3129 				mode_lib->vba.SourcePixelFormat[k],
3130 				mode_lib->vba.SurfaceTiling[k],
3131 				&BytePerPixY[k],
3132 				&BytePerPixC[k],
3133 				&BytePerPixDETY[k],
3134 				&BytePerPixDETC[k],
3135 				&Read256BytesBlockHeightY[k],
3136 				&Read256BytesBlockHeightC[k],
3137 				&Read256BytesBlockWidthY[k],
3138 				&Read256BytesBlockWidthC[k]);
3139 	}
3140 	CalculateSwathAndDETConfiguration(
3141 			false,
3142 			mode_lib->vba.NumberOfActivePlanes,
3143 			mode_lib->vba.DETBufferSizeInKByte[0],
3144 			dummy1,
3145 			dummy2,
3146 			mode_lib->vba.SourceScan,
3147 			mode_lib->vba.SourcePixelFormat,
3148 			mode_lib->vba.SurfaceTiling,
3149 			mode_lib->vba.ViewportWidth,
3150 			mode_lib->vba.ViewportHeight,
3151 			mode_lib->vba.SurfaceWidthY,
3152 			mode_lib->vba.SurfaceWidthC,
3153 			mode_lib->vba.SurfaceHeightY,
3154 			mode_lib->vba.SurfaceHeightC,
3155 			Read256BytesBlockHeightY,
3156 			Read256BytesBlockHeightC,
3157 			Read256BytesBlockWidthY,
3158 			Read256BytesBlockWidthC,
3159 			mode_lib->vba.ODMCombineEnabled,
3160 			mode_lib->vba.BlendingAndTiming,
3161 			BytePerPixY,
3162 			BytePerPixC,
3163 			BytePerPixDETY,
3164 			BytePerPixDETC,
3165 			mode_lib->vba.HActive,
3166 			mode_lib->vba.HRatio,
3167 			mode_lib->vba.HRatioChroma,
3168 			mode_lib->vba.DPPPerPlane,
3169 			dummy5,
3170 			dummy6,
3171 			dummy3,
3172 			dummy4,
3173 			mode_lib->vba.SwathHeightY,
3174 			mode_lib->vba.SwathHeightC,
3175 			mode_lib->vba.DETBufferSizeY,
3176 			mode_lib->vba.DETBufferSizeC,
3177 			dummy7,
3178 			&dummysinglestring);
3179 }
3180 
3181 void dml30_CalculateBytePerPixelAnd256BBlockSizes(
3182 		enum source_format_class SourcePixelFormat,
3183 		enum dm_swizzle_mode SurfaceTiling,
3184 		unsigned int *BytePerPixelY,
3185 		unsigned int *BytePerPixelC,
3186 		double       *BytePerPixelDETY,
3187 		double       *BytePerPixelDETC,
3188 		unsigned int *BlockHeight256BytesY,
3189 		unsigned int *BlockHeight256BytesC,
3190 		unsigned int *BlockWidth256BytesY,
3191 		unsigned int *BlockWidth256BytesC)
3192 {
3193 	if (SourcePixelFormat == dm_444_64) {
3194 		*BytePerPixelDETY = 8;
3195 		*BytePerPixelDETC = 0;
3196 		*BytePerPixelY = 8;
3197 		*BytePerPixelC = 0;
3198 	} else if (SourcePixelFormat == dm_444_32 || SourcePixelFormat == dm_rgbe) {
3199 		*BytePerPixelDETY = 4;
3200 		*BytePerPixelDETC = 0;
3201 		*BytePerPixelY = 4;
3202 		*BytePerPixelC = 0;
3203 	} else if (SourcePixelFormat == dm_444_16) {
3204 		*BytePerPixelDETY = 2;
3205 		*BytePerPixelDETC = 0;
3206 		*BytePerPixelY = 2;
3207 		*BytePerPixelC = 0;
3208 	} else if (SourcePixelFormat == dm_444_8) {
3209 		*BytePerPixelDETY = 1;
3210 		*BytePerPixelDETC = 0;
3211 		*BytePerPixelY = 1;
3212 		*BytePerPixelC = 0;
3213 	} else if (SourcePixelFormat == dm_rgbe_alpha) {
3214 		*BytePerPixelDETY = 4;
3215 		*BytePerPixelDETC = 1;
3216 		*BytePerPixelY = 4;
3217 		*BytePerPixelC = 1;
3218 	} else if (SourcePixelFormat == dm_420_8) {
3219 		*BytePerPixelDETY = 1;
3220 		*BytePerPixelDETC = 2;
3221 		*BytePerPixelY = 1;
3222 		*BytePerPixelC = 2;
3223 	} else if (SourcePixelFormat == dm_420_12) {
3224 		*BytePerPixelDETY = 2;
3225 		*BytePerPixelDETC = 4;
3226 		*BytePerPixelY = 2;
3227 		*BytePerPixelC = 4;
3228 	} else {
3229 		*BytePerPixelDETY = 4.0 / 3;
3230 		*BytePerPixelDETC = 8.0 / 3;
3231 		*BytePerPixelY = 2;
3232 		*BytePerPixelC = 4;
3233 	}
3234 
3235 	if ((SourcePixelFormat == dm_444_64 || SourcePixelFormat == dm_444_32
3236 			|| SourcePixelFormat == dm_444_16 || SourcePixelFormat == dm_444_8
3237 			|| SourcePixelFormat == dm_mono_16 || SourcePixelFormat == dm_mono_8
3238 			|| SourcePixelFormat == dm_rgbe)) {
3239 		if (SurfaceTiling == dm_sw_linear) {
3240 			*BlockHeight256BytesY = 1;
3241 		} else if (SourcePixelFormat == dm_444_64) {
3242 			*BlockHeight256BytesY = 4;
3243 		} else if (SourcePixelFormat == dm_444_8) {
3244 			*BlockHeight256BytesY = 16;
3245 		} else {
3246 			*BlockHeight256BytesY = 8;
3247 		}
3248 		*BlockWidth256BytesY = 256U / *BytePerPixelY / *BlockHeight256BytesY;
3249 		*BlockHeight256BytesC = 0;
3250 		*BlockWidth256BytesC = 0;
3251 	} else {
3252 		if (SurfaceTiling == dm_sw_linear) {
3253 			*BlockHeight256BytesY = 1;
3254 			*BlockHeight256BytesC = 1;
3255 		} else if (SourcePixelFormat == dm_rgbe_alpha) {
3256 			*BlockHeight256BytesY = 8;
3257 			*BlockHeight256BytesC = 16;
3258 		} else if (SourcePixelFormat == dm_420_8) {
3259 			*BlockHeight256BytesY = 16;
3260 			*BlockHeight256BytesC = 8;
3261 		} else {
3262 			*BlockHeight256BytesY = 8;
3263 			*BlockHeight256BytesC = 8;
3264 		}
3265 		*BlockWidth256BytesY = 256U / *BytePerPixelY / *BlockHeight256BytesY;
3266 		*BlockWidth256BytesC = 256U / *BytePerPixelC / *BlockHeight256BytesC;
3267 	}
3268 }
3269 
3270 static double CalculateTWait(
3271 		unsigned int PrefetchMode,
3272 		double DRAMClockChangeLatency,
3273 		double UrgentLatency,
3274 		double SREnterPlusExitTime)
3275 {
3276 	if (PrefetchMode == 0) {
3277 		return dml_max(DRAMClockChangeLatency + UrgentLatency,
3278 				dml_max(SREnterPlusExitTime, UrgentLatency));
3279 	} else if (PrefetchMode == 1) {
3280 		return dml_max(SREnterPlusExitTime, UrgentLatency);
3281 	} else {
3282 		return UrgentLatency;
3283 	}
3284 }
3285 
3286 double dml30_CalculateWriteBackDISPCLK(
3287 		enum source_format_class WritebackPixelFormat,
3288 		double PixelClock,
3289 		double WritebackHRatio,
3290 		double WritebackVRatio,
3291 		unsigned int WritebackHTaps,
3292 		unsigned int WritebackVTaps,
3293 		long   WritebackSourceWidth,
3294 		long   WritebackDestinationWidth,
3295 		unsigned int HTotal,
3296 		unsigned int WritebackLineBufferSize)
3297 {
3298 	double DISPCLK_H = 0, DISPCLK_V = 0, DISPCLK_HB = 0;
3299 
3300 	DISPCLK_H = PixelClock * dml_ceil(WritebackHTaps / 8.0, 1) / WritebackHRatio;
3301 	DISPCLK_V = PixelClock * (WritebackVTaps * dml_ceil(WritebackDestinationWidth / 6.0, 1) + 8.0) / HTotal;
3302 	DISPCLK_HB = PixelClock * WritebackVTaps * (WritebackDestinationWidth * WritebackVTaps - WritebackLineBufferSize / 57.0) / 6.0 / WritebackSourceWidth;
3303 	return dml_max3(DISPCLK_H, DISPCLK_V, DISPCLK_HB);
3304 }
3305 
3306 static double CalculateWriteBackDelay(
3307 		enum source_format_class WritebackPixelFormat,
3308 		double WritebackHRatio,
3309 		double WritebackVRatio,
3310 		unsigned int WritebackVTaps,
3311 		long         WritebackDestinationWidth,
3312 		long         WritebackDestinationHeight,
3313 		long         WritebackSourceHeight,
3314 		unsigned int HTotal)
3315 {
3316 	double CalculateWriteBackDelay = 0;
3317 	double Line_length = 0;
3318 	double Output_lines_last_notclamped = 0;
3319 	double WritebackVInit = 0;
3320 
3321 	WritebackVInit = (WritebackVRatio + WritebackVTaps + 1) / 2;
3322 	Line_length = dml_max((double) WritebackDestinationWidth, dml_ceil(WritebackDestinationWidth / 6.0, 1) * WritebackVTaps);
3323 	Output_lines_last_notclamped = WritebackDestinationHeight - 1 - dml_ceil((WritebackSourceHeight - WritebackVInit) / WritebackVRatio, 1);
3324 	if (Output_lines_last_notclamped < 0) {
3325 		CalculateWriteBackDelay = 0;
3326 	} else {
3327 		CalculateWriteBackDelay = Output_lines_last_notclamped * Line_length + (HTotal - WritebackDestinationWidth) + 80;
3328 	}
3329 	return CalculateWriteBackDelay;
3330 }
3331 
3332 
3333 static void CalculateDynamicMetadataParameters(int MaxInterDCNTileRepeaters, double DPPCLK, double DISPCLK,
3334 		double DCFClkDeepSleep, double PixelClock, long HTotal, long VBlank, long DynamicMetadataTransmittedBytes,
3335 		long DynamicMetadataLinesBeforeActiveRequired, int InterlaceEnable, bool ProgressiveToInterlaceUnitInOPP,
3336 		double *Tsetup, double *Tdmbf, double *Tdmec, double *Tdmsks)
3337 {
3338 	double TotalRepeaterDelayTime = 0;
3339 	double VUpdateWidthPix = 0;
3340 	double VReadyOffsetPix = 0;
3341 	double VUpdateOffsetPix = 0;
3342 	TotalRepeaterDelayTime = MaxInterDCNTileRepeaters * (2 / DPPCLK + 3 / DISPCLK);
3343 	VUpdateWidthPix = (14 / DCFClkDeepSleep + 12 / DPPCLK + TotalRepeaterDelayTime) * PixelClock;
3344 	VReadyOffsetPix = dml_max(150.0 / DPPCLK, TotalRepeaterDelayTime + 20 / DCFClkDeepSleep + 10 / DPPCLK) * PixelClock;
3345 	VUpdateOffsetPix = dml_ceil(HTotal / 4.0, 1);
3346 	*Tsetup = (VUpdateOffsetPix + VUpdateWidthPix + VReadyOffsetPix) / PixelClock;
3347 	*Tdmbf = DynamicMetadataTransmittedBytes / 4.0 / DISPCLK;
3348 	*Tdmec = HTotal / PixelClock;
3349 	if (DynamicMetadataLinesBeforeActiveRequired == 0) {
3350 		*Tdmsks = VBlank * HTotal / PixelClock / 2.0;
3351 	} else {
3352 		*Tdmsks = DynamicMetadataLinesBeforeActiveRequired * HTotal / PixelClock;
3353 	}
3354 	if (InterlaceEnable == 1 && ProgressiveToInterlaceUnitInOPP == false) {
3355 		*Tdmsks = *Tdmsks / 2;
3356 	}
3357 }
3358 
3359 static void CalculateRowBandwidth(
3360 		bool GPUVMEnable,
3361 		enum source_format_class SourcePixelFormat,
3362 		double VRatio,
3363 		double VRatioChroma,
3364 		bool DCCEnable,
3365 		double LineTime,
3366 		unsigned int MetaRowByteLuma,
3367 		unsigned int MetaRowByteChroma,
3368 		unsigned int meta_row_height_luma,
3369 		unsigned int meta_row_height_chroma,
3370 		unsigned int PixelPTEBytesPerRowLuma,
3371 		unsigned int PixelPTEBytesPerRowChroma,
3372 		unsigned int dpte_row_height_luma,
3373 		unsigned int dpte_row_height_chroma,
3374 		double *meta_row_bw,
3375 		double *dpte_row_bw)
3376 {
3377 	if (DCCEnable != true) {
3378 		*meta_row_bw = 0;
3379 	} else if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10 || SourcePixelFormat == dm_420_12 || SourcePixelFormat == dm_rgbe_alpha) {
3380 		*meta_row_bw = VRatio * MetaRowByteLuma / (meta_row_height_luma * LineTime)
3381 				+ VRatioChroma * MetaRowByteChroma
3382 						/ (meta_row_height_chroma * LineTime);
3383 	} else {
3384 		*meta_row_bw = VRatio * MetaRowByteLuma / (meta_row_height_luma * LineTime);
3385 	}
3386 
3387 	if (GPUVMEnable != true) {
3388 		*dpte_row_bw = 0;
3389 	} else if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10 || SourcePixelFormat == dm_420_12 || SourcePixelFormat == dm_rgbe_alpha) {
3390 		*dpte_row_bw = VRatio * PixelPTEBytesPerRowLuma / (dpte_row_height_luma * LineTime)
3391 				+ VRatioChroma * PixelPTEBytesPerRowChroma
3392 						/ (dpte_row_height_chroma * LineTime);
3393 	} else {
3394 		*dpte_row_bw = VRatio * PixelPTEBytesPerRowLuma / (dpte_row_height_luma * LineTime);
3395 	}
3396 }
3397 
3398 static void CalculateFlipSchedule(
3399 		struct display_mode_lib *mode_lib,
3400 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
3401 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
3402 		double UrgentExtraLatency,
3403 		double UrgentLatency,
3404 		unsigned int GPUVMMaxPageTableLevels,
3405 		bool HostVMEnable,
3406 		unsigned int HostVMMaxNonCachedPageTableLevels,
3407 		bool GPUVMEnable,
3408 		double HostVMMinPageSize,
3409 		double PDEAndMetaPTEBytesPerFrame,
3410 		double MetaRowBytes,
3411 		double DPTEBytesPerRow,
3412 		double BandwidthAvailableForImmediateFlip,
3413 		unsigned int TotImmediateFlipBytes,
3414 		enum source_format_class SourcePixelFormat,
3415 		double LineTime,
3416 		double VRatio,
3417 		double VRatioChroma,
3418 		double Tno_bw,
3419 		bool DCCEnable,
3420 		unsigned int dpte_row_height,
3421 		unsigned int meta_row_height,
3422 		unsigned int dpte_row_height_chroma,
3423 		unsigned int meta_row_height_chroma,
3424 		double *DestinationLinesToRequestVMInImmediateFlip,
3425 		double *DestinationLinesToRequestRowInImmediateFlip,
3426 		double *final_flip_bw,
3427 		bool *ImmediateFlipSupportedForPipe)
3428 {
3429 	double min_row_time = 0.0;
3430 	unsigned int HostVMDynamicLevelsTrips = 0;
3431 	double TimeForFetchingMetaPTEImmediateFlip = 0;
3432 	double TimeForFetchingRowInVBlankImmediateFlip = 0;
3433 	double ImmediateFlipBW = 0;
3434 	double HostVMInefficiencyFactor = 0;
3435 
3436 	if (GPUVMEnable == true && HostVMEnable == true) {
3437 		HostVMInefficiencyFactor = PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData / PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly;
3438 		HostVMDynamicLevelsTrips = HostVMMaxNonCachedPageTableLevels;
3439 	} else {
3440 		HostVMInefficiencyFactor = 1;
3441 		HostVMDynamicLevelsTrips = 0;
3442 	}
3443 
3444 	if (GPUVMEnable == true || DCCEnable == true) {
3445 		ImmediateFlipBW = (PDEAndMetaPTEBytesPerFrame + MetaRowBytes + DPTEBytesPerRow) * BandwidthAvailableForImmediateFlip / TotImmediateFlipBytes;
3446 	}
3447 
3448 	if (GPUVMEnable == true) {
3449 		TimeForFetchingMetaPTEImmediateFlip = dml_max3(Tno_bw + PDEAndMetaPTEBytesPerFrame * HostVMInefficiencyFactor / ImmediateFlipBW,
3450 				UrgentExtraLatency + UrgentLatency * (GPUVMMaxPageTableLevels * (HostVMDynamicLevelsTrips + 1) - 1), LineTime / 4.0);
3451 	} else {
3452 		TimeForFetchingMetaPTEImmediateFlip = 0;
3453 	}
3454 
3455 	*DestinationLinesToRequestVMInImmediateFlip = dml_ceil(4.0 * (TimeForFetchingMetaPTEImmediateFlip / LineTime), 1) / 4.0;
3456 	if ((GPUVMEnable == true || DCCEnable == true)) {
3457 		TimeForFetchingRowInVBlankImmediateFlip = dml_max3((MetaRowBytes + DPTEBytesPerRow * HostVMInefficiencyFactor) / ImmediateFlipBW,
3458 				UrgentLatency * (HostVMDynamicLevelsTrips + 1), LineTime / 4);
3459 	} else {
3460 		TimeForFetchingRowInVBlankImmediateFlip = 0;
3461 	}
3462 
3463 	*DestinationLinesToRequestRowInImmediateFlip = dml_ceil(4.0 * (TimeForFetchingRowInVBlankImmediateFlip / LineTime), 1) / 4.0;
3464 
3465 	if (GPUVMEnable == true) {
3466 		*final_flip_bw = dml_max(PDEAndMetaPTEBytesPerFrame * HostVMInefficiencyFactor / (*DestinationLinesToRequestVMInImmediateFlip * LineTime),
3467 				(MetaRowBytes + DPTEBytesPerRow * HostVMInefficiencyFactor) / (*DestinationLinesToRequestRowInImmediateFlip * LineTime));
3468 	} else if ((GPUVMEnable == true || DCCEnable == true)) {
3469 		*final_flip_bw = (MetaRowBytes + DPTEBytesPerRow * HostVMInefficiencyFactor) / (*DestinationLinesToRequestRowInImmediateFlip * LineTime);
3470 	} else {
3471 		*final_flip_bw = 0;
3472 	}
3473 
3474 
3475 	if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10 || SourcePixelFormat == dm_rgbe_alpha) {
3476 		if (GPUVMEnable == true && DCCEnable != true) {
3477 			min_row_time = dml_min(dpte_row_height * LineTime / VRatio, dpte_row_height_chroma * LineTime / VRatioChroma);
3478 		} else if (GPUVMEnable != true && DCCEnable == true) {
3479 			min_row_time = dml_min(meta_row_height * LineTime / VRatio, meta_row_height_chroma * LineTime / VRatioChroma);
3480 		} else {
3481 			min_row_time = dml_min4(dpte_row_height * LineTime / VRatio, meta_row_height * LineTime / VRatio,
3482 					dpte_row_height_chroma * LineTime / VRatioChroma, meta_row_height_chroma * LineTime / VRatioChroma);
3483 		}
3484 	} else {
3485 		if (GPUVMEnable == true && DCCEnable != true) {
3486 			min_row_time = dpte_row_height * LineTime / VRatio;
3487 		} else if (GPUVMEnable != true && DCCEnable == true) {
3488 			min_row_time = meta_row_height * LineTime / VRatio;
3489 		} else {
3490 			min_row_time = dml_min(dpte_row_height * LineTime / VRatio, meta_row_height * LineTime / VRatio);
3491 		}
3492 	}
3493 
3494 	if (*DestinationLinesToRequestVMInImmediateFlip >= 32 || *DestinationLinesToRequestRowInImmediateFlip >= 16
3495 			|| TimeForFetchingMetaPTEImmediateFlip + 2 * TimeForFetchingRowInVBlankImmediateFlip > min_row_time) {
3496 		*ImmediateFlipSupportedForPipe = false;
3497 	} else {
3498 		*ImmediateFlipSupportedForPipe = true;
3499 	}
3500 }
3501 
3502 static double TruncToValidBPP(
3503 		double LinkBitRate,
3504 		int Lanes,
3505 		long HTotal,
3506 		long HActive,
3507 		double PixelClock,
3508 		double DesiredBPP,
3509 		bool DSCEnable,
3510 		enum output_encoder_class Output,
3511 		enum output_format_class Format,
3512 		unsigned int DSCInputBitPerComponent,
3513 		int DSCSlices,
3514 		int AudioRate,
3515 		int AudioLayout,
3516 		enum odm_combine_mode ODMCombine)
3517 {
3518 	double MaxLinkBPP = 0;
3519 	int MinDSCBPP = 0;
3520 	double MaxDSCBPP = 0;
3521 	int NonDSCBPP0 = 0;
3522 	int NonDSCBPP1 = 0;
3523 	int NonDSCBPP2 = 0;
3524 
3525 	if (Format == dm_420) {
3526 		NonDSCBPP0 = 12;
3527 		NonDSCBPP1 = 15;
3528 		NonDSCBPP2 = 18;
3529 		MinDSCBPP = 6;
3530 		MaxDSCBPP = 1.5 * DSCInputBitPerComponent - 1.0 / 16;
3531 	} else if (Format == dm_444) {
3532 		NonDSCBPP0 = 24;
3533 		NonDSCBPP1 = 30;
3534 		NonDSCBPP2 = 36;
3535 		MinDSCBPP = 8;
3536 		MaxDSCBPP = 3 * DSCInputBitPerComponent - 1.0 / 16;
3537 	} else {
3538 		NonDSCBPP0 = 16;
3539 		NonDSCBPP1 = 20;
3540 		NonDSCBPP2 = 24;
3541 
3542 		if (Format == dm_n422) {
3543 			MinDSCBPP = 7;
3544 			MaxDSCBPP = 2 * DSCInputBitPerComponent - 1.0 / 16.0;
3545 		}
3546 		else {
3547 			MinDSCBPP = 8;
3548 			MaxDSCBPP = 3 * DSCInputBitPerComponent - 1.0 / 16.0;
3549 		}
3550 	}
3551 
3552 	if (DSCEnable && Output == dm_dp) {
3553 		MaxLinkBPP = LinkBitRate / 10 * 8 * Lanes / PixelClock * (1 - 2.4 / 100);
3554 	} else {
3555 		MaxLinkBPP = LinkBitRate / 10 * 8 * Lanes / PixelClock;
3556 	}
3557 
3558 	if (ODMCombine == dm_odm_combine_mode_4to1 && MaxLinkBPP > 16) {
3559 		MaxLinkBPP = 16;
3560 	} else if (ODMCombine == dm_odm_combine_mode_2to1 && MaxLinkBPP > 32) {
3561 		MaxLinkBPP = 32;
3562 	}
3563 
3564 
3565 	if (DesiredBPP == 0) {
3566 		if (DSCEnable) {
3567 			if (MaxLinkBPP < MinDSCBPP) {
3568 				return BPP_INVALID;
3569 			} else if (MaxLinkBPP >= MaxDSCBPP) {
3570 				return MaxDSCBPP;
3571 			} else {
3572 				return dml_floor(16.0 * MaxLinkBPP, 1.0) / 16.0;
3573 			}
3574 		} else {
3575 			if (MaxLinkBPP >= NonDSCBPP2) {
3576 				return NonDSCBPP2;
3577 			} else if (MaxLinkBPP >= NonDSCBPP1) {
3578 				return NonDSCBPP1;
3579 			} else if (MaxLinkBPP >= NonDSCBPP0) {
3580 				return NonDSCBPP0;
3581 			} else {
3582 				return BPP_INVALID;
3583 			}
3584 		}
3585 	} else {
3586 		if (!((DSCEnable == false && (DesiredBPP == NonDSCBPP2 || DesiredBPP == NonDSCBPP1 || DesiredBPP == NonDSCBPP0 || DesiredBPP == 18)) ||
3587 				(DSCEnable && DesiredBPP >= MinDSCBPP && DesiredBPP <= MaxDSCBPP))) {
3588 			return BPP_INVALID;
3589 		} else {
3590 			return DesiredBPP;
3591 		}
3592 	}
3593 	return BPP_INVALID;
3594 }
3595 
3596 void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib)
3597 {
3598 	struct vba_vars_st *v = &mode_lib->vba;
3599 	int MinPrefetchMode, MaxPrefetchMode;
3600 	int i;
3601 	unsigned int j, k, m;
3602 	bool   EnoughWritebackUnits = true;
3603 	bool   WritebackModeSupport = true;
3604 	bool   ViewportExceedsSurface = false;
3605 	double MaxTotalVActiveRDBandwidth = 0;
3606 	long ReorderingBytes = 0;
3607 	bool NotUrgentLatencyHiding[DC__NUM_DPP__MAX] = { 0 };
3608 
3609 	/*MODE SUPPORT, VOLTAGE STATE AND SOC CONFIGURATION*/
3610 
3611 	CalculateMinAndMaxPrefetchMode(
3612 		mode_lib->vba.AllowDRAMSelfRefreshOrDRAMClockChangeInVblank,
3613 		&MinPrefetchMode, &MaxPrefetchMode);
3614 
3615 	/*Scale Ratio, taps Support Check*/
3616 
3617 	v->ScaleRatioAndTapsSupport = true;
3618 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
3619 		if (v->ScalerEnabled[k] == false
3620 				&& ((v->SourcePixelFormat[k] != dm_444_64
3621 						&& v->SourcePixelFormat[k] != dm_444_32
3622 						&& v->SourcePixelFormat[k] != dm_444_16
3623 						&& v->SourcePixelFormat[k] != dm_mono_16
3624 						&& v->SourcePixelFormat[k] != dm_mono_8
3625 						&& v->SourcePixelFormat[k] != dm_rgbe
3626 						&& v->SourcePixelFormat[k] != dm_rgbe_alpha)
3627 						|| v->HRatio[k] != 1.0
3628 						|| v->htaps[k] != 1.0
3629 						|| v->VRatio[k] != 1.0
3630 						|| v->vtaps[k] != 1.0)) {
3631 			v->ScaleRatioAndTapsSupport = false;
3632 		} else if (v->vtaps[k] < 1.0 || v->vtaps[k] > 8.0
3633 				|| v->htaps[k] < 1.0 || v->htaps[k] > 8.0
3634 				|| (v->htaps[k] > 1.0
3635 						&& (v->htaps[k] % 2) == 1)
3636 				|| v->HRatio[k] > v->MaxHSCLRatio
3637 				|| v->VRatio[k] > v->MaxVSCLRatio
3638 				|| v->HRatio[k] > v->htaps[k]
3639 				|| v->VRatio[k] > v->vtaps[k]
3640 				|| (v->SourcePixelFormat[k] != dm_444_64
3641 						&& v->SourcePixelFormat[k] != dm_444_32
3642 						&& v->SourcePixelFormat[k] != dm_444_16
3643 						&& v->SourcePixelFormat[k] != dm_mono_16
3644 						&& v->SourcePixelFormat[k] != dm_mono_8
3645 						&& v->SourcePixelFormat[k] != dm_rgbe
3646 						&& (v->VTAPsChroma[k] < 1
3647 							|| v->VTAPsChroma[k] > 8
3648 							|| v->HTAPsChroma[k] < 1
3649 							|| v->HTAPsChroma[k] > 8
3650 							|| (v->HTAPsChroma[k] > 1 && v->HTAPsChroma[k] % 2 == 1)
3651 							|| v->HRatioChroma[k] > v->MaxHSCLRatio
3652 							|| v->VRatioChroma[k] > v->MaxVSCLRatio
3653 							|| v->HRatioChroma[k] > v->HTAPsChroma[k]
3654 							|| v->VRatioChroma[k] > v->VTAPsChroma[k]))) {
3655 			v->ScaleRatioAndTapsSupport = false;
3656 		}
3657 	}
3658 	/*Source Format, Pixel Format and Scan Support Check*/
3659 
3660 	v->SourceFormatPixelAndScanSupport = true;
3661 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
3662 		if ((v->SurfaceTiling[k] == dm_sw_linear && (!(v->SourceScan[k] != dm_vert) || v->DCCEnable[k] == true))
3663 				|| ((v->SurfaceTiling[k] == dm_sw_64kb_d || v->SurfaceTiling[k] == dm_sw_64kb_d_t || v->SurfaceTiling[k] == dm_sw_64kb_d_x)
3664 						&& !(v->SourcePixelFormat[k] == dm_444_64))) {
3665 			v->SourceFormatPixelAndScanSupport = false;
3666 		}
3667 	}
3668 	/*Bandwidth Support Check*/
3669 
3670 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
3671 		dml30_CalculateBytePerPixelAnd256BBlockSizes(
3672 				v->SourcePixelFormat[k],
3673 				v->SurfaceTiling[k],
3674 				&v->BytePerPixelY[k],
3675 				&v->BytePerPixelC[k],
3676 				&v->BytePerPixelInDETY[k],
3677 				&v->BytePerPixelInDETC[k],
3678 				&v->Read256BlockHeightY[k],
3679 				&v->Read256BlockHeightC[k],
3680 				&v->Read256BlockWidthY[k],
3681 				&v->Read256BlockWidthC[k]);
3682 	}
3683 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
3684 		if (v->SourceScan[k] != dm_vert) {
3685 			v->SwathWidthYSingleDPP[k] = v->ViewportWidth[k];
3686 			v->SwathWidthCSingleDPP[k] = v->ViewportWidthChroma[k];
3687 		} else {
3688 			v->SwathWidthYSingleDPP[k] = v->ViewportHeight[k];
3689 			v->SwathWidthCSingleDPP[k] = v->ViewportHeightChroma[k];
3690 		}
3691 	}
3692 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
3693 		v->ReadBandwidthLuma[k] = v->SwathWidthYSingleDPP[k] * dml_ceil(v->BytePerPixelInDETY[k], 1.0) / (v->HTotal[k] / v->PixelClock[k]) * v->VRatio[k];
3694 		v->ReadBandwidthChroma[k] = v->SwathWidthYSingleDPP[k] / 2 * dml_ceil(v->BytePerPixelInDETC[k], 2.0) / (v->HTotal[k] / v->PixelClock[k]) * v->VRatio[k] / 2.0;
3695 	}
3696 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
3697 		if (v->WritebackEnable[k] == true
3698 				&& v->WritebackPixelFormat[k] == dm_444_64) {
3699 			v->WriteBandwidth[k] = v->WritebackDestinationWidth[k]
3700 					* v->WritebackDestinationHeight[k]
3701 					/ (v->WritebackSourceHeight[k]
3702 							* v->HTotal[k]
3703 							/ v->PixelClock[k]) * 8.0;
3704 		} else if (v->WritebackEnable[k] == true) {
3705 			v->WriteBandwidth[k] = v->WritebackDestinationWidth[k]
3706 					* v->WritebackDestinationHeight[k]
3707 					/ (v->WritebackSourceHeight[k]
3708 							* v->HTotal[k]
3709 							/ v->PixelClock[k]) * 4.0;
3710 		} else {
3711 			v->WriteBandwidth[k] = 0.0;
3712 		}
3713 	}
3714 
3715 	/*Writeback Latency support check*/
3716 
3717 	v->WritebackLatencySupport = true;
3718 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
3719 		if (v->WritebackEnable[k] == true) {
3720 			if (v->WritebackConfiguration == dm_whole_buffer_for_single_stream_no_interleave ||
3721 			    v->WritebackConfiguration == dm_whole_buffer_for_single_stream_interleave) {
3722 				if (v->WriteBandwidth[k]
3723 						> 2.0 * v->WritebackInterfaceBufferSize * 1024
3724 								/ v->WritebackLatency) {
3725 					v->WritebackLatencySupport = false;
3726 				}
3727 			} else {
3728 				if (v->WriteBandwidth[k]
3729 						> v->WritebackInterfaceBufferSize * 1024
3730 								/ v->WritebackLatency) {
3731 					v->WritebackLatencySupport = false;
3732 				}
3733 			}
3734 		}
3735 	}
3736 
3737 	/*Writeback Mode Support Check*/
3738 
3739 	v->TotalNumberOfActiveWriteback = 0;
3740 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
3741 		if (v->WritebackEnable[k] == true) {
3742 			v->TotalNumberOfActiveWriteback =
3743 					v->TotalNumberOfActiveWriteback + 1;
3744 		}
3745 	}
3746 
3747 	if (v->TotalNumberOfActiveWriteback > v->MaxNumWriteback) {
3748 		EnoughWritebackUnits = false;
3749 	}
3750 	if (!v->WritebackSupportInterleaveAndUsingWholeBufferForASingleStream
3751 			&& (v->WritebackConfiguration == dm_whole_buffer_for_single_stream_no_interleave
3752 					|| v->WritebackConfiguration == dm_whole_buffer_for_single_stream_interleave)) {
3753 
3754 		WritebackModeSupport = false;
3755 	}
3756 	if (v->WritebackConfiguration == dm_whole_buffer_for_single_stream_no_interleave && v->TotalNumberOfActiveWriteback > 1) {
3757 		WritebackModeSupport = false;
3758 	}
3759 
3760 	/*Writeback Scale Ratio and Taps Support Check*/
3761 
3762 	v->WritebackScaleRatioAndTapsSupport = true;
3763 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
3764 		if (v->WritebackEnable[k] == true) {
3765 			if (v->WritebackHRatio[k] > v->WritebackMaxHSCLRatio
3766 					|| v->WritebackVRatio[k]
3767 							> v->WritebackMaxVSCLRatio
3768 					|| v->WritebackHRatio[k]
3769 							< v->WritebackMinHSCLRatio
3770 					|| v->WritebackVRatio[k]
3771 							< v->WritebackMinVSCLRatio
3772 					|| v->WritebackHTaps[k]
3773 							> v->WritebackMaxHSCLTaps
3774 					|| v->WritebackVTaps[k]
3775 							> v->WritebackMaxVSCLTaps
3776 					|| v->WritebackHRatio[k]
3777 							> v->WritebackHTaps[k]
3778 					|| v->WritebackVRatio[k]
3779 							> v->WritebackVTaps[k]
3780 					|| (v->WritebackHTaps[k] > 2.0
3781 							&& ((v->WritebackHTaps[k] % 2)
3782 									== 1))) {
3783 				v->WritebackScaleRatioAndTapsSupport = false;
3784 			}
3785 			if (2.0 * v->WritebackDestinationWidth[k] * (v->WritebackVTaps[k] - 1) * 57 > v->WritebackLineBufferSize) {
3786 				v->WritebackScaleRatioAndTapsSupport = false;
3787 			}
3788 		}
3789 	}
3790 	/*Maximum DISPCLK/DPPCLK Support check*/
3791 
3792 	v->WritebackRequiredDISPCLK = 0.0;
3793 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
3794 		if (v->WritebackEnable[k] == true) {
3795 			v->WritebackRequiredDISPCLK = dml_max(v->WritebackRequiredDISPCLK,
3796 					dml30_CalculateWriteBackDISPCLK(
3797 							v->WritebackPixelFormat[k],
3798 							v->PixelClock[k],
3799 							v->WritebackHRatio[k],
3800 							v->WritebackVRatio[k],
3801 							v->WritebackHTaps[k],
3802 							v->WritebackVTaps[k],
3803 							v->WritebackSourceWidth[k],
3804 							v->WritebackDestinationWidth[k],
3805 							v->HTotal[k],
3806 							v->WritebackLineBufferSize));
3807 		}
3808 	}
3809 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
3810 		if (v->HRatio[k] > 1.0) {
3811 			v->PSCL_FACTOR[k] = dml_min(v->MaxDCHUBToPSCLThroughput, v->MaxPSCLToLBThroughput * v->HRatio[k] / dml_ceil(v->htaps[k] / 6.0, 1.0));
3812 		} else {
3813 			v->PSCL_FACTOR[k] = dml_min(v->MaxDCHUBToPSCLThroughput, v->MaxPSCLToLBThroughput);
3814 		}
3815 		if (v->BytePerPixelC[k] == 0.0) {
3816 			v->PSCL_FACTOR_CHROMA[k] = 0.0;
3817 			v->MinDPPCLKUsingSingleDPP[k] = v->PixelClock[k]
3818 					* dml_max3(v->vtaps[k] / 6.0 * dml_min(1.0, v->HRatio[k]), v->HRatio[k] * v->VRatio[k] / v->PSCL_FACTOR[k], 1.0);
3819 			if ((v->htaps[k] > 6.0 || v->vtaps[k] > 6.0) && v->MinDPPCLKUsingSingleDPP[k] < 2.0 * v->PixelClock[k]) {
3820 				v->MinDPPCLKUsingSingleDPP[k] = 2.0 * v->PixelClock[k];
3821 			}
3822 		} else {
3823 			if (v->HRatioChroma[k] > 1.0) {
3824 				v->PSCL_FACTOR_CHROMA[k] = dml_min(v->MaxDCHUBToPSCLThroughput,
3825 						v->MaxPSCLToLBThroughput * v->HRatioChroma[k] / dml_ceil(v->HTAPsChroma[k] / 6.0, 1.0));
3826 			} else {
3827 				v->PSCL_FACTOR_CHROMA[k] = dml_min(v->MaxDCHUBToPSCLThroughput, v->MaxPSCLToLBThroughput);
3828 			}
3829 			v->MinDPPCLKUsingSingleDPP[k] = v->PixelClock[k] * dml_max5(v->vtaps[k] / 6.0 * dml_min(1.0, v->HRatio[k]),
3830 							v->HRatio[k] * v->VRatio[k] / v->PSCL_FACTOR[k],
3831 							v->VTAPsChroma[k] / 6.0 * dml_min(1.0, v->HRatioChroma[k]),
3832 							v->HRatioChroma[k] * v->VRatioChroma[k] / v->PSCL_FACTOR_CHROMA[k],
3833 							1.0);
3834 			if ((v->htaps[k] > 6.0 || v->vtaps[k] > 6.0 || v->HTAPsChroma[k] > 6.0 || v->VTAPsChroma[k] > 6.0)
3835 					&& v->MinDPPCLKUsingSingleDPP[k] < 2.0 * v->PixelClock[k]) {
3836 				v->MinDPPCLKUsingSingleDPP[k] = 2.0 * v->PixelClock[k];
3837 			}
3838 		}
3839 	}
3840 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
3841 		int MaximumSwathWidthSupportLuma = 0;
3842 		int MaximumSwathWidthSupportChroma = 0;
3843 
3844 		if (v->SurfaceTiling[k] == dm_sw_linear) {
3845 			MaximumSwathWidthSupportLuma = 8192.0;
3846 		} else if (v->SourceScan[k] == dm_vert && v->BytePerPixelC[k] > 0) {
3847 			MaximumSwathWidthSupportLuma = 2880.0;
3848 		} else {
3849 			MaximumSwathWidthSupportLuma = 5760.0;
3850 		}
3851 
3852 		if (v->SourcePixelFormat[k] == dm_420_8 || v->SourcePixelFormat[k] == dm_420_10 || v->SourcePixelFormat[k] == dm_420_12) {
3853 			MaximumSwathWidthSupportChroma = MaximumSwathWidthSupportLuma / 2.0;
3854 		} else {
3855 			MaximumSwathWidthSupportChroma = MaximumSwathWidthSupportLuma;
3856 		}
3857 		v->MaximumSwathWidthInLineBufferLuma = v->LineBufferSize * dml_max(v->HRatio[k], 1.0) / v->LBBitPerPixel[k]
3858 				/ (v->vtaps[k] + dml_max(dml_ceil(v->VRatio[k], 1.0) - 2, 0.0));
3859 		if (v->BytePerPixelC[k] == 0.0) {
3860 			v->MaximumSwathWidthInLineBufferChroma = 0;
3861 		} else {
3862 			v->MaximumSwathWidthInLineBufferChroma = v->LineBufferSize * dml_max(v->HRatioChroma[k], 1.0) / v->LBBitPerPixel[k]
3863 					/ (v->VTAPsChroma[k] + dml_max(dml_ceil(v->VRatioChroma[k], 1.0) - 2, 0.0));
3864 		}
3865 		v->MaximumSwathWidthLuma[k] = dml_min(MaximumSwathWidthSupportLuma, v->MaximumSwathWidthInLineBufferLuma);
3866 		v->MaximumSwathWidthChroma[k] = dml_min(MaximumSwathWidthSupportChroma, v->MaximumSwathWidthInLineBufferChroma);
3867 	}
3868 
3869 	CalculateSwathAndDETConfiguration(
3870 			true,
3871 			v->NumberOfActivePlanes,
3872 			v->DETBufferSizeInKByte[0],
3873 			v->MaximumSwathWidthLuma,
3874 			v->MaximumSwathWidthChroma,
3875 			v->SourceScan,
3876 			v->SourcePixelFormat,
3877 			v->SurfaceTiling,
3878 			v->ViewportWidth,
3879 			v->ViewportHeight,
3880 			v->SurfaceWidthY,
3881 			v->SurfaceWidthC,
3882 			v->SurfaceHeightY,
3883 			v->SurfaceHeightC,
3884 			v->Read256BlockHeightY,
3885 			v->Read256BlockHeightC,
3886 			v->Read256BlockWidthY,
3887 			v->Read256BlockWidthC,
3888 			v->odm_combine_dummy,
3889 			v->BlendingAndTiming,
3890 			v->BytePerPixelY,
3891 			v->BytePerPixelC,
3892 			v->BytePerPixelInDETY,
3893 			v->BytePerPixelInDETC,
3894 			v->HActive,
3895 			v->HRatio,
3896 			v->HRatioChroma,
3897 			v->DPPPerPlane,
3898 			v->swath_width_luma_ub,
3899 			v->swath_width_chroma_ub,
3900 			v->SwathWidthY,
3901 			v->SwathWidthC,
3902 			v->SwathHeightY,
3903 			v->SwathHeightC,
3904 			v->DETBufferSizeY,
3905 			v->DETBufferSizeC,
3906 			v->SingleDPPViewportSizeSupportPerPlane,
3907 			&v->ViewportSizeSupport[0][0]);
3908 
3909 	for (i = 0; i < v->soc.num_states; i++) {
3910 		for (j = 0; j < 2; j++) {
3911 			v->MaxDispclkRoundedDownToDFSGranularity = RoundToDFSGranularityDown(v->MaxDispclk[i], v->DISPCLKDPPCLKVCOSpeed);
3912 			v->MaxDppclkRoundedDownToDFSGranularity = RoundToDFSGranularityDown(v->MaxDppclk[i], v->DISPCLKDPPCLKVCOSpeed);
3913 			v->RequiredDISPCLK[i][j] = 0.0;
3914 			v->DISPCLK_DPPCLK_Support[i][j] = true;
3915 			for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
3916 				v->PlaneRequiredDISPCLKWithoutODMCombine = v->PixelClock[k] * (1.0 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0)
3917 						* (1.0 + v->DISPCLKRampingMargin / 100.0);
3918 				if ((v->PlaneRequiredDISPCLKWithoutODMCombine >= v->MaxDispclk[i] && v->MaxDispclk[i] == v->MaxDispclk[mode_lib->soc.num_states - 1]
3919 						&& v->MaxDppclk[i] == v->MaxDppclk[mode_lib->soc.num_states - 1])) {
3920 					v->PlaneRequiredDISPCLKWithoutODMCombine = v->PixelClock[k] * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0);
3921 				}
3922 				v->PlaneRequiredDISPCLKWithODMCombine2To1 = v->PixelClock[k] / 2 * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0)
3923 						* (1 + v->DISPCLKRampingMargin / 100.0);
3924 				if ((v->PlaneRequiredDISPCLKWithODMCombine2To1 >= v->MaxDispclk[i] && v->MaxDispclk[i] == v->MaxDispclk[mode_lib->soc.num_states - 1]
3925 						&& v->MaxDppclk[i] == v->MaxDppclk[mode_lib->soc.num_states - 1])) {
3926 					v->PlaneRequiredDISPCLKWithODMCombine2To1 = v->PixelClock[k] / 2 * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0);
3927 				}
3928 				v->PlaneRequiredDISPCLKWithODMCombine4To1 = v->PixelClock[k] / 4 * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0)
3929 						* (1 + v->DISPCLKRampingMargin / 100.0);
3930 				if ((v->PlaneRequiredDISPCLKWithODMCombine4To1 >= v->MaxDispclk[i] && v->MaxDispclk[i] == v->MaxDispclk[mode_lib->soc.num_states - 1]
3931 						&& v->MaxDppclk[i] == v->MaxDppclk[mode_lib->soc.num_states - 1])) {
3932 					v->PlaneRequiredDISPCLKWithODMCombine4To1 = v->PixelClock[k] / 4 * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0);
3933 				}
3934 
3935 				if (v->ODMCombinePolicy == dm_odm_combine_policy_none) {
3936 					v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_disabled;
3937 					v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithoutODMCombine;
3938 				} else if (v->ODMCombinePolicy == dm_odm_combine_policy_2to1) {
3939 					v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_2to1;
3940 					v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithODMCombine2To1;
3941 				} else if (v->ODMCombinePolicy == dm_odm_combine_policy_4to1
3942 						|| v->PlaneRequiredDISPCLKWithODMCombine2To1 > v->MaxDispclkRoundedDownToDFSGranularity) {
3943 					v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_4to1;
3944 					v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithODMCombine4To1;
3945 				} else if (v->PlaneRequiredDISPCLKWithoutODMCombine > v->MaxDispclkRoundedDownToDFSGranularity) {
3946 					v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_2to1;
3947 					v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithODMCombine2To1;
3948 				} else {
3949 					v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_disabled;
3950 					v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithoutODMCombine;
3951 				}
3952 				if (v->DSCEnabled[k] && v->HActive[k] > DCN30_MAX_DSC_IMAGE_WIDTH
3953 						&& v->ODMCombineEnablePerState[i][k] != dm_odm_combine_mode_4to1) {
3954 					if (v->HActive[k] / 2 > DCN30_MAX_DSC_IMAGE_WIDTH) {
3955 						v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_4to1;
3956 						v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithODMCombine4To1;
3957 					} else {
3958 						v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_2to1;
3959 						v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithODMCombine2To1;
3960 					}
3961 				}
3962 				if (v->OutputFormat[k] == dm_420 && v->HActive[k] > DCN30_MAX_FMT_420_BUFFER_WIDTH
3963 						&& v->ODMCombineEnablePerState[i][k] != dm_odm_combine_mode_4to1) {
3964 					if (v->HActive[k] / 2 > DCN30_MAX_FMT_420_BUFFER_WIDTH) {
3965 						v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_4to1;
3966 						v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithODMCombine4To1;
3967 					} else {
3968 						v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_2to1;
3969 						v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithODMCombine2To1;
3970 					}
3971 				}
3972 				if (v->ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1) {
3973 					v->MPCCombine[i][j][k] = false;
3974 					v->NoOfDPP[i][j][k] = 4;
3975 					v->RequiredDPPCLK[i][j][k] = v->MinDPPCLKUsingSingleDPP[k] * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) / 4;
3976 				} else if (v->ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1) {
3977 					v->MPCCombine[i][j][k] = false;
3978 					v->NoOfDPP[i][j][k] = 2;
3979 					v->RequiredDPPCLK[i][j][k] = v->MinDPPCLKUsingSingleDPP[k] * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) / 2;
3980 				} else if ((v->WhenToDoMPCCombine == dm_mpc_never
3981 						|| (v->MinDPPCLKUsingSingleDPP[k] * (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) <= v->MaxDppclkRoundedDownToDFSGranularity
3982 								&& v->SingleDPPViewportSizeSupportPerPlane[k] == true))) {
3983 					v->MPCCombine[i][j][k] = false;
3984 					v->NoOfDPP[i][j][k] = 1;
3985 					v->RequiredDPPCLK[i][j][k] = v->MinDPPCLKUsingSingleDPP[k] * (1.0 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0);
3986 				} else {
3987 					v->MPCCombine[i][j][k] = true;
3988 					v->NoOfDPP[i][j][k] = 2;
3989 					v->RequiredDPPCLK[i][j][k] = v->MinDPPCLKUsingSingleDPP[k] * (1.0 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) / 2.0;
3990 				}
3991 				v->RequiredDISPCLK[i][j] = dml_max(v->RequiredDISPCLK[i][j], v->PlaneRequiredDISPCLK);
3992 				if ((v->MinDPPCLKUsingSingleDPP[k] / v->NoOfDPP[i][j][k] * (1.0 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0)
3993 						> v->MaxDppclkRoundedDownToDFSGranularity) || (v->PlaneRequiredDISPCLK > v->MaxDispclkRoundedDownToDFSGranularity)) {
3994 					v->DISPCLK_DPPCLK_Support[i][j] = false;
3995 				}
3996 			}
3997 			v->TotalNumberOfActiveDPP[i][j] = 0;
3998 			v->TotalNumberOfSingleDPPPlanes[i][j] = 0;
3999 			for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4000 				v->TotalNumberOfActiveDPP[i][j] = v->TotalNumberOfActiveDPP[i][j] + v->NoOfDPP[i][j][k];
4001 				if (v->NoOfDPP[i][j][k] == 1)
4002 					v->TotalNumberOfSingleDPPPlanes[i][j] = v->TotalNumberOfSingleDPPPlanes[i][j] + 1;
4003 			}
4004 			if (j == 1 && v->WhenToDoMPCCombine != dm_mpc_never) {
4005 				while (!(v->TotalNumberOfActiveDPP[i][j] >= v->MaxNumDPP || v->TotalNumberOfSingleDPPPlanes[i][j] == 0)) {
4006 					double BWOfNonSplitPlaneOfMaximumBandwidth = 0;
4007 					unsigned int NumberOfNonSplitPlaneOfMaximumBandwidth = 0;
4008 					BWOfNonSplitPlaneOfMaximumBandwidth = 0;
4009 					NumberOfNonSplitPlaneOfMaximumBandwidth = 0;
4010 					for (k = 0; k < v->NumberOfActivePlanes; ++k) {
4011 						if (v->ReadBandwidthLuma[k] + v->ReadBandwidthChroma[k] > BWOfNonSplitPlaneOfMaximumBandwidth
4012 								&& v->ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_disabled && v->MPCCombine[i][j][k] == false) {
4013 							BWOfNonSplitPlaneOfMaximumBandwidth = v->ReadBandwidthLuma[k] + v->ReadBandwidthChroma[k];
4014 							NumberOfNonSplitPlaneOfMaximumBandwidth = k;
4015 						}
4016 					}
4017 					v->MPCCombine[i][j][NumberOfNonSplitPlaneOfMaximumBandwidth] = true;
4018 					v->NoOfDPP[i][j][NumberOfNonSplitPlaneOfMaximumBandwidth] = 2;
4019 					v->RequiredDPPCLK[i][j][NumberOfNonSplitPlaneOfMaximumBandwidth] = v->MinDPPCLKUsingSingleDPP[NumberOfNonSplitPlaneOfMaximumBandwidth]
4020 							* (1 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100) / 2;
4021 					v->TotalNumberOfActiveDPP[i][j] = v->TotalNumberOfActiveDPP[i][j] + 1;
4022 					v->TotalNumberOfSingleDPPPlanes[i][j] = v->TotalNumberOfSingleDPPPlanes[i][j] - 1;
4023 				}
4024 			}
4025 			if (v->TotalNumberOfActiveDPP[i][j] > v->MaxNumDPP) {
4026 				v->RequiredDISPCLK[i][j] = 0.0;
4027 				v->DISPCLK_DPPCLK_Support[i][j] = true;
4028 				for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4029 					v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_disabled;
4030 					if (v->SingleDPPViewportSizeSupportPerPlane[k] == false && v->WhenToDoMPCCombine != dm_mpc_never) {
4031 						v->MPCCombine[i][j][k] = true;
4032 						v->NoOfDPP[i][j][k] = 2;
4033 						v->RequiredDPPCLK[i][j][k] = v->MinDPPCLKUsingSingleDPP[k] * (1.0 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) / 2.0;
4034 					} else {
4035 						v->MPCCombine[i][j][k] = false;
4036 						v->NoOfDPP[i][j][k] = 1;
4037 						v->RequiredDPPCLK[i][j][k] = v->MinDPPCLKUsingSingleDPP[k] * (1.0 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0);
4038 					}
4039 					if (!(v->MaxDispclk[i] == v->MaxDispclk[v->soc.num_states - 1] && v->MaxDppclk[i] == v->MaxDppclk[v->soc.num_states - 1])) {
4040 						v->PlaneRequiredDISPCLK = v->PixelClock[k] * (1.0 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0)
4041 								* (1.0 + v->DISPCLKRampingMargin / 100.0);
4042 					} else {
4043 						v->PlaneRequiredDISPCLK = v->PixelClock[k] * (1.0 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0);
4044 					}
4045 					v->RequiredDISPCLK[i][j] = dml_max(v->RequiredDISPCLK[i][j], v->PlaneRequiredDISPCLK);
4046 					if ((v->MinDPPCLKUsingSingleDPP[k] / v->NoOfDPP[i][j][k] * (1.0 + v->DISPCLKDPPCLKDSCCLKDownSpreading / 100.0)
4047 							> v->MaxDppclkRoundedDownToDFSGranularity) || (v->PlaneRequiredDISPCLK > v->MaxDispclkRoundedDownToDFSGranularity)) {
4048 						v->DISPCLK_DPPCLK_Support[i][j] = false;
4049 					}
4050 				}
4051 				v->TotalNumberOfActiveDPP[i][j] = 0.0;
4052 				for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4053 					v->TotalNumberOfActiveDPP[i][j] = v->TotalNumberOfActiveDPP[i][j] + v->NoOfDPP[i][j][k];
4054 				}
4055 			}
4056 			v->RequiredDISPCLK[i][j] = dml_max(v->RequiredDISPCLK[i][j], v->WritebackRequiredDISPCLK);
4057 			if (v->MaxDispclkRoundedDownToDFSGranularity < v->WritebackRequiredDISPCLK) {
4058 				v->DISPCLK_DPPCLK_Support[i][j] = false;
4059 			}
4060 		}
4061 	}
4062 
4063 	/*Total Available Pipes Support Check*/
4064 
4065 	for (i = 0; i < v->soc.num_states; i++) {
4066 		for (j = 0; j < 2; j++) {
4067 			if (v->TotalNumberOfActiveDPP[i][j] <= v->MaxNumDPP) {
4068 				v->TotalAvailablePipesSupport[i][j] = true;
4069 			} else {
4070 				v->TotalAvailablePipesSupport[i][j] = false;
4071 			}
4072 		}
4073 	}
4074 	/*Display IO and DSC Support Check*/
4075 
4076 	v->NonsupportedDSCInputBPC = false;
4077 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4078 		if (!(v->DSCInputBitPerComponent[k] == 12.0
4079 				|| v->DSCInputBitPerComponent[k] == 10.0
4080 				|| v->DSCInputBitPerComponent[k] == 8.0)) {
4081 			v->NonsupportedDSCInputBPC = true;
4082 		}
4083 	}
4084 
4085 	/*Number Of DSC Slices*/
4086 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
4087 		if (v->BlendingAndTiming[k] == k) {
4088 			if (v->PixelClockBackEnd[k] > 3200) {
4089 				v->NumberOfDSCSlices[k] = dml_ceil(v->PixelClockBackEnd[k] / 400.0, 4.0);
4090 			} else if (v->PixelClockBackEnd[k] > 1360) {
4091 				v->NumberOfDSCSlices[k] = 8;
4092 			} else if (v->PixelClockBackEnd[k] > 680) {
4093 				v->NumberOfDSCSlices[k] = 4;
4094 			} else if (v->PixelClockBackEnd[k] > 340) {
4095 				v->NumberOfDSCSlices[k] = 2;
4096 			} else {
4097 				v->NumberOfDSCSlices[k] = 1;
4098 			}
4099 		} else {
4100 			v->NumberOfDSCSlices[k] = 0;
4101 		}
4102 	}
4103 
4104 	for (i = 0; i < v->soc.num_states; i++) {
4105 		for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4106 			v->RequiresDSC[i][k] = false;
4107 			v->RequiresFEC[i][k] = false;
4108 			if (v->BlendingAndTiming[k] == k) {
4109 				if (v->Output[k] == dm_hdmi) {
4110 					v->RequiresDSC[i][k] = false;
4111 					v->RequiresFEC[i][k] = false;
4112 					v->OutputBppPerState[i][k] = TruncToValidBPP(
4113 							dml_min(600.0, v->PHYCLKPerState[i]) * 10,
4114 							3,
4115 							v->HTotal[k],
4116 							v->HActive[k],
4117 							v->PixelClockBackEnd[k],
4118 							v->ForcedOutputLinkBPP[k],
4119 							false,
4120 							v->Output[k],
4121 							v->OutputFormat[k],
4122 							v->DSCInputBitPerComponent[k],
4123 							v->NumberOfDSCSlices[k],
4124 							v->AudioSampleRate[k],
4125 							v->AudioSampleLayout[k],
4126 							v->ODMCombineEnablePerState[i][k]);
4127 				} else if (v->Output[k] == dm_dp || v->Output[k] == dm_edp) {
4128 					if (v->DSCEnable[k] == true) {
4129 						v->RequiresDSC[i][k] = true;
4130 						v->LinkDSCEnable = true;
4131 						if (v->Output[k] == dm_dp) {
4132 							v->RequiresFEC[i][k] = true;
4133 						} else {
4134 							v->RequiresFEC[i][k] = false;
4135 						}
4136 					} else {
4137 						v->RequiresDSC[i][k] = false;
4138 						v->LinkDSCEnable = false;
4139 						v->RequiresFEC[i][k] = false;
4140 					}
4141 
4142 					v->Outbpp = BPP_INVALID;
4143 					if (v->PHYCLKPerState[i] >= 270.0) {
4144 						v->Outbpp = TruncToValidBPP(
4145 								(1.0 - v->Downspreading / 100.0) * 2700,
4146 								v->OutputLinkDPLanes[k],
4147 								v->HTotal[k],
4148 								v->HActive[k],
4149 								v->PixelClockBackEnd[k],
4150 								v->ForcedOutputLinkBPP[k],
4151 								v->LinkDSCEnable,
4152 								v->Output[k],
4153 								v->OutputFormat[k],
4154 								v->DSCInputBitPerComponent[k],
4155 								v->NumberOfDSCSlices[k],
4156 								v->AudioSampleRate[k],
4157 								v->AudioSampleLayout[k],
4158 								v->ODMCombineEnablePerState[i][k]);
4159 						v->OutputBppPerState[i][k] = v->Outbpp;
4160 						// TODO: Need some other way to handle this nonsense
4161 						// v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR"
4162 					}
4163 					if (v->Outbpp == BPP_INVALID && v->PHYCLKPerState[i] >= 540.0) {
4164 						v->Outbpp = TruncToValidBPP(
4165 								(1.0 - v->Downspreading / 100.0) * 5400,
4166 								v->OutputLinkDPLanes[k],
4167 								v->HTotal[k],
4168 								v->HActive[k],
4169 								v->PixelClockBackEnd[k],
4170 								v->ForcedOutputLinkBPP[k],
4171 								v->LinkDSCEnable,
4172 								v->Output[k],
4173 								v->OutputFormat[k],
4174 								v->DSCInputBitPerComponent[k],
4175 								v->NumberOfDSCSlices[k],
4176 								v->AudioSampleRate[k],
4177 								v->AudioSampleLayout[k],
4178 								v->ODMCombineEnablePerState[i][k]);
4179 						v->OutputBppPerState[i][k] = v->Outbpp;
4180 						// TODO: Need some other way to handle this nonsense
4181 						// v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR2"
4182 					}
4183 					if (v->Outbpp == BPP_INVALID && v->PHYCLKPerState[i] >= 810.0) {
4184 						v->Outbpp = TruncToValidBPP(
4185 								(1.0 - v->Downspreading / 100.0) * 8100,
4186 								v->OutputLinkDPLanes[k],
4187 								v->HTotal[k],
4188 								v->HActive[k],
4189 								v->PixelClockBackEnd[k],
4190 								v->ForcedOutputLinkBPP[k],
4191 								v->LinkDSCEnable,
4192 								v->Output[k],
4193 								v->OutputFormat[k],
4194 								v->DSCInputBitPerComponent[k],
4195 								v->NumberOfDSCSlices[k],
4196 								v->AudioSampleRate[k],
4197 								v->AudioSampleLayout[k],
4198 								v->ODMCombineEnablePerState[i][k]);
4199 						if (v->Outbpp == BPP_INVALID && v->ForcedOutputLinkBPP[k] == 0) {
4200 							//if (v->Outbpp == BPP_INVALID && v->DSCEnabled[k] == dm_dsc_enable_only_if_necessary && v->ForcedOutputLinkBPP[k] == 0) {
4201 							v->RequiresDSC[i][k] = true;
4202 							v->LinkDSCEnable = true;
4203 							if (v->Output[k] == dm_dp) {
4204 								v->RequiresFEC[i][k] = true;
4205 							}
4206 							v->Outbpp = TruncToValidBPP(
4207 									(1.0 - v->Downspreading / 100.0) * 8100,
4208 									v->OutputLinkDPLanes[k],
4209 									v->HTotal[k],
4210 									v->HActive[k],
4211 									v->PixelClockBackEnd[k],
4212 									v->ForcedOutputLinkBPP[k],
4213 									v->LinkDSCEnable,
4214 									v->Output[k],
4215 									v->OutputFormat[k],
4216 									v->DSCInputBitPerComponent[k],
4217 									v->NumberOfDSCSlices[k],
4218 									v->AudioSampleRate[k],
4219 									v->AudioSampleLayout[k],
4220 									v->ODMCombineEnablePerState[i][k]);
4221 						}
4222 						v->OutputBppPerState[i][k] = v->Outbpp;
4223 						// TODO: Need some other way to handle this nonsense
4224 						// v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR3"
4225 					}
4226 				}
4227 			} else {
4228 				v->OutputBppPerState[i][k] = 0;
4229 			}
4230 		}
4231 	}
4232 	for (i = 0; i < v->soc.num_states; i++) {
4233 		v->DIOSupport[i] = true;
4234 		for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4235 			if (!v->skip_dio_check[k] && v->BlendingAndTiming[k] == k && (v->Output[k] == dm_dp || v->Output[k] == dm_edp || v->Output[k] == dm_hdmi)
4236 					&& (v->OutputBppPerState[i][k] == 0
4237 							|| (v->OutputFormat[k] == dm_420 && v->Interlace[k] == true && v->ProgressiveToInterlaceUnitInOPP == true))) {
4238 				v->DIOSupport[i] = false;
4239 			}
4240 		}
4241 	}
4242 
4243 	for (i = 0; i < v->soc.num_states; ++i) {
4244 		v->ODMCombine4To1SupportCheckOK[i] = true;
4245 		for (k = 0; k < v->NumberOfActivePlanes; ++k) {
4246 			if (v->BlendingAndTiming[k] == k && v->ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1
4247 					&& (v->ODMCombine4To1Supported == false || v->Output[k] == dm_dp || v->Output[k] == dm_edp || v->Output[k] == dm_hdmi)) {
4248 				v->ODMCombine4To1SupportCheckOK[i] = false;
4249 			}
4250 		}
4251 	}
4252 
4253 	/* Skip dscclk validation: as long as dispclk is supported, dscclk is also implicitly supported */
4254 
4255 	for (i = 0; i < v->soc.num_states; i++) {
4256 		v->NotEnoughDSCUnits[i] = false;
4257 		v->TotalDSCUnitsRequired = 0.0;
4258 		for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4259 			if (v->RequiresDSC[i][k] == true) {
4260 				if (v->ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1) {
4261 					v->TotalDSCUnitsRequired = v->TotalDSCUnitsRequired + 4.0;
4262 				} else if (v->ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1) {
4263 					v->TotalDSCUnitsRequired = v->TotalDSCUnitsRequired + 2.0;
4264 				} else {
4265 					v->TotalDSCUnitsRequired = v->TotalDSCUnitsRequired + 1.0;
4266 				}
4267 			}
4268 		}
4269 		if (v->TotalDSCUnitsRequired > v->NumberOfDSC) {
4270 			v->NotEnoughDSCUnits[i] = true;
4271 		}
4272 	}
4273 	/*DSC Delay per state*/
4274 
4275 	for (i = 0; i < v->soc.num_states; i++) {
4276 		for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4277 			if (v->OutputBppPerState[i][k] == BPP_INVALID) {
4278 				v->BPP = 0.0;
4279 			} else {
4280 				v->BPP = v->OutputBppPerState[i][k];
4281 			}
4282 			if (v->RequiresDSC[i][k] == true && v->BPP != 0.0) {
4283 				if (v->ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_disabled) {
4284 					v->DSCDelayPerState[i][k] = dscceComputeDelay(
4285 							v->DSCInputBitPerComponent[k],
4286 							v->BPP,
4287 							dml_ceil(1.0 * v->HActive[k] / v->NumberOfDSCSlices[k], 1.0),
4288 							v->NumberOfDSCSlices[k],
4289 							v->OutputFormat[k],
4290 							v->Output[k]) + dscComputeDelay(v->OutputFormat[k], v->Output[k]);
4291 				} else if (v->ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1) {
4292 					v->DSCDelayPerState[i][k] = 2.0
4293 							* dscceComputeDelay(
4294 									v->DSCInputBitPerComponent[k],
4295 									v->BPP,
4296 									dml_ceil(1.0 * v->HActive[k] / v->NumberOfDSCSlices[k], 1.0),
4297 									v->NumberOfDSCSlices[k] / 2,
4298 									v->OutputFormat[k],
4299 									v->Output[k]) + dscComputeDelay(v->OutputFormat[k], v->Output[k]);
4300 				} else {
4301 					v->DSCDelayPerState[i][k] = 4.0
4302 							* (dscceComputeDelay(
4303 									v->DSCInputBitPerComponent[k],
4304 									v->BPP,
4305 									dml_ceil(1.0 * v->HActive[k] / v->NumberOfDSCSlices[k], 1.0),
4306 									v->NumberOfDSCSlices[k] / 4,
4307 									v->OutputFormat[k],
4308 									v->Output[k]) + dscComputeDelay(v->OutputFormat[k], v->Output[k]));
4309 				}
4310 				v->DSCDelayPerState[i][k] = v->DSCDelayPerState[i][k] * v->PixelClock[k] / v->PixelClockBackEnd[k];
4311 			} else {
4312 				v->DSCDelayPerState[i][k] = 0.0;
4313 			}
4314 		}
4315 		for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4316 			for (m = 0; m <= v->NumberOfActivePlanes - 1; m++) {
4317 				if (v->BlendingAndTiming[k] == m && v->RequiresDSC[i][m] == true) {
4318 					v->DSCDelayPerState[i][k] = v->DSCDelayPerState[i][m];
4319 				}
4320 			}
4321 		}
4322 	}
4323 
4324 	//Calculate Swath, DET Configuration, DCFCLKDeepSleep
4325 	//
4326 	for (i = 0; i < mode_lib->soc.num_states; ++i) {
4327 		for (j = 0; j <= 1; ++j) {
4328 			for (k = 0; k < v->NumberOfActivePlanes; ++k) {
4329 				v->RequiredDPPCLKThisState[k] = v->RequiredDPPCLK[i][j][k];
4330 				v->NoOfDPPThisState[k] = v->NoOfDPP[i][j][k];
4331 				v->ODMCombineEnableThisState[k] = v->ODMCombineEnablePerState[i][k];
4332 			}
4333 
4334 			CalculateSwathAndDETConfiguration(
4335 					false,
4336 					v->NumberOfActivePlanes,
4337 					v->DETBufferSizeInKByte[0],
4338 					v->MaximumSwathWidthLuma,
4339 					v->MaximumSwathWidthChroma,
4340 					v->SourceScan,
4341 					v->SourcePixelFormat,
4342 					v->SurfaceTiling,
4343 					v->ViewportWidth,
4344 					v->ViewportHeight,
4345 					v->SurfaceWidthY,
4346 					v->SurfaceWidthC,
4347 					v->SurfaceHeightY,
4348 					v->SurfaceHeightC,
4349 					v->Read256BlockHeightY,
4350 					v->Read256BlockHeightC,
4351 					v->Read256BlockWidthY,
4352 					v->Read256BlockWidthC,
4353 					v->ODMCombineEnableThisState,
4354 					v->BlendingAndTiming,
4355 					v->BytePerPixelY,
4356 					v->BytePerPixelC,
4357 					v->BytePerPixelInDETY,
4358 					v->BytePerPixelInDETC,
4359 					v->HActive,
4360 					v->HRatio,
4361 					v->HRatioChroma,
4362 					v->NoOfDPPThisState,
4363 					v->swath_width_luma_ub_this_state,
4364 					v->swath_width_chroma_ub_this_state,
4365 					v->SwathWidthYThisState,
4366 					v->SwathWidthCThisState,
4367 					v->SwathHeightYThisState,
4368 					v->SwathHeightCThisState,
4369 					v->DETBufferSizeYThisState,
4370 					v->DETBufferSizeCThisState,
4371 					v->dummystring,
4372 					&v->ViewportSizeSupport[i][j]);
4373 
4374 			for (k = 0; k < v->NumberOfActivePlanes; ++k) {
4375 				v->swath_width_luma_ub_all_states[i][j][k] = v->swath_width_luma_ub_this_state[k];
4376 				v->swath_width_chroma_ub_all_states[i][j][k] = v->swath_width_chroma_ub_this_state[k];
4377 				v->SwathWidthYAllStates[i][j][k] = v->SwathWidthYThisState[k];
4378 				v->SwathWidthCAllStates[i][j][k] = v->SwathWidthCThisState[k];
4379 				v->SwathHeightYAllStates[i][j][k] = v->SwathHeightYThisState[k];
4380 				v->SwathHeightCAllStates[i][j][k] = v->SwathHeightCThisState[k];
4381 				v->DETBufferSizeYAllStates[i][j][k] = v->DETBufferSizeYThisState[k];
4382 				v->DETBufferSizeCAllStates[i][j][k] = v->DETBufferSizeCThisState[k];
4383 			}
4384 
4385 		}
4386 	}
4387 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
4388 		v->cursor_bw[k] = v->NumberOfCursors[k] * v->CursorWidth[k][0] * v->CursorBPP[k][0] / 8.0 / (v->HTotal[k] / v->PixelClock[k]) * v->VRatio[k];
4389 	}
4390 
4391 	for (i = 0; i < v->soc.num_states; i++) {
4392 		for (j = 0; j < 2; j++) {
4393 			for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4394 				v->swath_width_luma_ub_this_state[k] = v->swath_width_luma_ub_all_states[i][j][k];
4395 				v->swath_width_chroma_ub_this_state[k] = v->swath_width_chroma_ub_all_states[i][j][k];
4396 				v->SwathWidthYThisState[k] = v->SwathWidthYAllStates[i][j][k];
4397 				v->SwathWidthCThisState[k] = v->SwathWidthCAllStates[i][j][k];
4398 				v->SwathHeightYThisState[k] = v->SwathHeightYAllStates[i][j][k];
4399 				v->SwathHeightCThisState[k] = v->SwathHeightCAllStates[i][j][k];
4400 				v->DETBufferSizeYThisState[k] = v->DETBufferSizeYAllStates[i][j][k];
4401 				v->DETBufferSizeCThisState[k] = v->DETBufferSizeCAllStates[i][j][k];
4402 			}
4403 
4404 			v->TotalNumberOfDCCActiveDPP[i][j] = 0;
4405 			for (k = 0; k < v->NumberOfActivePlanes; ++k) {
4406 				if (v->DCCEnable[k] == true) {
4407 					v->TotalNumberOfDCCActiveDPP[i][j] = v->TotalNumberOfDCCActiveDPP[i][j] + v->NoOfDPP[i][j][k];
4408 				}
4409 			}
4410 
4411 			for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4412 				if (v->SourcePixelFormat[k] == dm_420_8 || v->SourcePixelFormat[k] == dm_420_10 || v->SourcePixelFormat[k] == dm_420_12
4413 						|| v->SourcePixelFormat[k] == dm_rgbe_alpha) {
4414 
4415 					if ((v->SourcePixelFormat[k] == dm_420_10 || v->SourcePixelFormat[k] == dm_420_12) && v->SourceScan[k] != dm_vert) {
4416 						v->PTEBufferSizeInRequestsForLuma = (v->PTEBufferSizeInRequestsLuma + v->PTEBufferSizeInRequestsChroma) / 2;
4417 						v->PTEBufferSizeInRequestsForChroma = v->PTEBufferSizeInRequestsForLuma;
4418 					} else {
4419 						v->PTEBufferSizeInRequestsForLuma = v->PTEBufferSizeInRequestsLuma;
4420 						v->PTEBufferSizeInRequestsForChroma = v->PTEBufferSizeInRequestsChroma;
4421 					}
4422 
4423 					v->PDEAndMetaPTEBytesPerFrameC = CalculateVMAndRowBytes(
4424 							mode_lib,
4425 							v->DCCEnable[k],
4426 							v->Read256BlockHeightC[k],
4427 							v->Read256BlockWidthY[k],
4428 							v->SourcePixelFormat[k],
4429 							v->SurfaceTiling[k],
4430 							v->BytePerPixelC[k],
4431 							v->SourceScan[k],
4432 							v->SwathWidthCThisState[k],
4433 							v->ViewportHeightChroma[k],
4434 							v->GPUVMEnable,
4435 							v->HostVMEnable,
4436 							v->HostVMMaxNonCachedPageTableLevels,
4437 							v->GPUVMMinPageSize,
4438 							v->HostVMMinPageSize,
4439 							v->PTEBufferSizeInRequestsForChroma,
4440 							v->PitchC[k],
4441 							0.0,
4442 							&v->MacroTileWidthC[k],
4443 							&v->MetaRowBytesC,
4444 							&v->DPTEBytesPerRowC,
4445 							&v->PTEBufferSizeNotExceededC[i][j][k],
4446 							&v->dummyinteger7,
4447 							&v->dpte_row_height_chroma[k],
4448 							&v->dummyinteger28,
4449 							&v->dummyinteger26,
4450 							&v->dummyinteger23,
4451 							&v->meta_row_height_chroma[k],
4452 							&v->dummyinteger8,
4453 							&v->dummyinteger9,
4454 							&v->dummyinteger19,
4455 							&v->dummyinteger20,
4456 							&v->dummyinteger17,
4457 							&v->dummyinteger10,
4458 							&v->dummyinteger11);
4459 
4460 					v->PrefetchLinesC[i][j][k] = CalculatePrefetchSourceLines(
4461 							mode_lib,
4462 							v->VRatioChroma[k],
4463 							v->VTAPsChroma[k],
4464 							v->Interlace[k],
4465 							v->ProgressiveToInterlaceUnitInOPP,
4466 							v->SwathHeightCThisState[k],
4467 							v->ViewportYStartC[k],
4468 							&v->PrefillC[k],
4469 							&v->MaxNumSwC[k]);
4470 				} else {
4471 					v->PTEBufferSizeInRequestsForLuma = v->PTEBufferSizeInRequestsLuma + v->PTEBufferSizeInRequestsChroma;
4472 					v->PTEBufferSizeInRequestsForChroma = 0;
4473 					v->PDEAndMetaPTEBytesPerFrameC = 0.0;
4474 					v->MetaRowBytesC = 0.0;
4475 					v->DPTEBytesPerRowC = 0.0;
4476 					v->PrefetchLinesC[i][j][k] = 0.0;
4477 					v->PTEBufferSizeNotExceededC[i][j][k] = true;
4478 				}
4479 				v->PDEAndMetaPTEBytesPerFrameY = CalculateVMAndRowBytes(
4480 						mode_lib,
4481 						v->DCCEnable[k],
4482 						v->Read256BlockHeightY[k],
4483 						v->Read256BlockWidthY[k],
4484 						v->SourcePixelFormat[k],
4485 						v->SurfaceTiling[k],
4486 						v->BytePerPixelY[k],
4487 						v->SourceScan[k],
4488 						v->SwathWidthYThisState[k],
4489 						v->ViewportHeight[k],
4490 						v->GPUVMEnable,
4491 						v->HostVMEnable,
4492 						v->HostVMMaxNonCachedPageTableLevels,
4493 						v->GPUVMMinPageSize,
4494 						v->HostVMMinPageSize,
4495 						v->PTEBufferSizeInRequestsForLuma,
4496 						v->PitchY[k],
4497 						v->DCCMetaPitchY[k],
4498 						&v->MacroTileWidthY[k],
4499 						&v->MetaRowBytesY,
4500 						&v->DPTEBytesPerRowY,
4501 						&v->PTEBufferSizeNotExceededY[i][j][k],
4502 						v->dummyinteger4,
4503 						&v->dpte_row_height[k],
4504 						&v->dummyinteger29,
4505 						&v->dummyinteger27,
4506 						&v->dummyinteger24,
4507 						&v->meta_row_height[k],
4508 						&v->dummyinteger25,
4509 						&v->dpte_group_bytes[k],
4510 						&v->dummyinteger21,
4511 						&v->dummyinteger22,
4512 						&v->dummyinteger18,
4513 						&v->dummyinteger5,
4514 						&v->dummyinteger6);
4515 				v->PrefetchLinesY[i][j][k] = CalculatePrefetchSourceLines(
4516 						mode_lib,
4517 						v->VRatio[k],
4518 						v->vtaps[k],
4519 						v->Interlace[k],
4520 						v->ProgressiveToInterlaceUnitInOPP,
4521 						v->SwathHeightYThisState[k],
4522 						v->ViewportYStartY[k],
4523 						&v->PrefillY[k],
4524 						&v->MaxNumSwY[k]);
4525 				v->PDEAndMetaPTEBytesPerFrame[i][j][k] = v->PDEAndMetaPTEBytesPerFrameY + v->PDEAndMetaPTEBytesPerFrameC;
4526 				v->MetaRowBytes[i][j][k] = v->MetaRowBytesY + v->MetaRowBytesC;
4527 				v->DPTEBytesPerRow[i][j][k] = v->DPTEBytesPerRowY + v->DPTEBytesPerRowC;
4528 
4529 				CalculateRowBandwidth(
4530 						v->GPUVMEnable,
4531 						v->SourcePixelFormat[k],
4532 						v->VRatio[k],
4533 						v->VRatioChroma[k],
4534 						v->DCCEnable[k],
4535 						v->HTotal[k] / v->PixelClock[k],
4536 						v->MetaRowBytesY,
4537 						v->MetaRowBytesC,
4538 						v->meta_row_height[k],
4539 						v->meta_row_height_chroma[k],
4540 						v->DPTEBytesPerRowY,
4541 						v->DPTEBytesPerRowC,
4542 						v->dpte_row_height[k],
4543 						v->dpte_row_height_chroma[k],
4544 						&v->meta_row_bandwidth[i][j][k],
4545 						&v->dpte_row_bandwidth[i][j][k]);
4546 			}
4547 			v->UrgLatency[i] = CalculateUrgentLatency(
4548 					v->UrgentLatencyPixelDataOnly,
4549 					v->UrgentLatencyPixelMixedWithVMData,
4550 					v->UrgentLatencyVMDataOnly,
4551 					v->DoUrgentLatencyAdjustment,
4552 					v->UrgentLatencyAdjustmentFabricClockComponent,
4553 					v->UrgentLatencyAdjustmentFabricClockReference,
4554 					v->FabricClockPerState[i]);
4555 
4556 			for (k = 0; k < v->NumberOfActivePlanes; ++k) {
4557 				CalculateUrgentBurstFactor(
4558 						v->swath_width_luma_ub_this_state[k],
4559 						v->swath_width_chroma_ub_this_state[k],
4560 						v->DETBufferSizeInKByte[0],
4561 						v->SwathHeightYThisState[k],
4562 						v->SwathHeightCThisState[k],
4563 						v->HTotal[k] / v->PixelClock[k],
4564 						v->UrgLatency[i],
4565 						v->CursorBufferSize,
4566 						v->CursorWidth[k][0],
4567 						v->CursorBPP[k][0],
4568 						v->VRatio[k],
4569 						v->VRatioChroma[k],
4570 						v->BytePerPixelInDETY[k],
4571 						v->BytePerPixelInDETC[k],
4572 						v->DETBufferSizeYThisState[k],
4573 						v->DETBufferSizeCThisState[k],
4574 						&v->UrgentBurstFactorCursor[k],
4575 						&v->UrgentBurstFactorLuma[k],
4576 						&v->UrgentBurstFactorChroma[k],
4577 						&NotUrgentLatencyHiding[k]);
4578 			}
4579 
4580 			v->NotUrgentLatencyHiding[i][j] = false;
4581 			for (k = 0; k < v->NumberOfActivePlanes; ++k) {
4582 				if (NotUrgentLatencyHiding[k]) {
4583 					v->NotUrgentLatencyHiding[i][j] = true;
4584 				}
4585 			}
4586 
4587 			for (k = 0; k < v->NumberOfActivePlanes; ++k) {
4588 				v->VActivePixelBandwidth[i][j][k] = v->ReadBandwidthLuma[k] * v->UrgentBurstFactorLuma[k]
4589 						+ v->ReadBandwidthChroma[k] * v->UrgentBurstFactorChroma[k];
4590 				v->VActiveCursorBandwidth[i][j][k] = v->cursor_bw[k] * v->UrgentBurstFactorCursor[k];
4591 			}
4592 
4593 			v->TotalVActivePixelBandwidth[i][j] = 0;
4594 			v->TotalVActiveCursorBandwidth[i][j] = 0;
4595 			v->TotalMetaRowBandwidth[i][j] = 0;
4596 			v->TotalDPTERowBandwidth[i][j] = 0;
4597 			for (k = 0; k < v->NumberOfActivePlanes; ++k) {
4598 				v->TotalVActivePixelBandwidth[i][j] = v->TotalVActivePixelBandwidth[i][j] + v->VActivePixelBandwidth[i][j][k];
4599 				v->TotalVActiveCursorBandwidth[i][j] = v->TotalVActiveCursorBandwidth[i][j] + v->VActiveCursorBandwidth[i][j][k];
4600 				v->TotalMetaRowBandwidth[i][j] = v->TotalMetaRowBandwidth[i][j] + v->NoOfDPP[i][j][k] * v->meta_row_bandwidth[i][j][k];
4601 				v->TotalDPTERowBandwidth[i][j] = v->TotalDPTERowBandwidth[i][j] + v->NoOfDPP[i][j][k] * v->dpte_row_bandwidth[i][j][k];
4602 			}
4603 
4604 			CalculateDCFCLKDeepSleep(
4605 					mode_lib,
4606 					v->NumberOfActivePlanes,
4607 					v->BytePerPixelY,
4608 					v->BytePerPixelC,
4609 					v->VRatio,
4610 					v->VRatioChroma,
4611 					v->SwathWidthYThisState,
4612 					v->SwathWidthCThisState,
4613 					v->NoOfDPPThisState,
4614 					v->HRatio,
4615 					v->HRatioChroma,
4616 					v->PixelClock,
4617 					v->PSCL_FACTOR,
4618 					v->PSCL_FACTOR_CHROMA,
4619 					v->RequiredDPPCLKThisState,
4620 					v->ReadBandwidthLuma,
4621 					v->ReadBandwidthChroma,
4622 					v->ReturnBusWidth,
4623 					&v->ProjectedDCFCLKDeepSleep[i][j]);
4624 		}
4625 	}
4626 
4627 	//Calculate Return BW
4628 
4629 	for (i = 0; i < mode_lib->soc.num_states; ++i) {
4630 		for (j = 0; j <= 1; ++j) {
4631 			for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4632 				if (v->BlendingAndTiming[k] == k) {
4633 					if (v->WritebackEnable[k] == true) {
4634 						v->WritebackDelayTime[k] = v->WritebackLatency
4635 								+ CalculateWriteBackDelay(
4636 										v->WritebackPixelFormat[k],
4637 										v->WritebackHRatio[k],
4638 										v->WritebackVRatio[k],
4639 										v->WritebackVTaps[k],
4640 										v->WritebackDestinationWidth[k],
4641 										v->WritebackDestinationHeight[k],
4642 										v->WritebackSourceHeight[k],
4643 										v->HTotal[k]) / v->RequiredDISPCLK[i][j];
4644 					} else {
4645 						v->WritebackDelayTime[k] = 0.0;
4646 					}
4647 					for (m = 0; m <= v->NumberOfActivePlanes - 1; m++) {
4648 						if (v->BlendingAndTiming[m] == k && v->WritebackEnable[m] == true) {
4649 							v->WritebackDelayTime[k] = dml_max(
4650 									v->WritebackDelayTime[k],
4651 									v->WritebackLatency
4652 											+ CalculateWriteBackDelay(
4653 													v->WritebackPixelFormat[m],
4654 													v->WritebackHRatio[m],
4655 													v->WritebackVRatio[m],
4656 													v->WritebackVTaps[m],
4657 													v->WritebackDestinationWidth[m],
4658 													v->WritebackDestinationHeight[m],
4659 													v->WritebackSourceHeight[m],
4660 													v->HTotal[m]) / v->RequiredDISPCLK[i][j]);
4661 						}
4662 					}
4663 				}
4664 			}
4665 			for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4666 				for (m = 0; m <= v->NumberOfActivePlanes - 1; m++) {
4667 					if (v->BlendingAndTiming[k] == m) {
4668 						v->WritebackDelayTime[k] = v->WritebackDelayTime[m];
4669 					}
4670 				}
4671 			}
4672 			v->MaxMaxVStartup[i][j] = 0;
4673 			for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4674 				v->MaximumVStartup[i][j][k] = v->VTotal[k] - v->VActive[k]
4675 						- dml_max(1.0, dml_ceil(1.0 * v->WritebackDelayTime[k] / (v->HTotal[k] / v->PixelClock[k]), 1.0));
4676 				v->MaxMaxVStartup[i][j] = dml_max(v->MaxMaxVStartup[i][j], v->MaximumVStartup[i][j][k]);
4677 			}
4678 		}
4679 	}
4680 
4681 	ReorderingBytes = v->NumberOfChannels
4682 			* dml_max3(
4683 					v->UrgentOutOfOrderReturnPerChannelPixelDataOnly,
4684 					v->UrgentOutOfOrderReturnPerChannelPixelMixedWithVMData,
4685 					v->UrgentOutOfOrderReturnPerChannelVMDataOnly);
4686 	v->FinalDRAMClockChangeLatency = (v->DRAMClockChangeLatencyOverride > 0 ? v->DRAMClockChangeLatencyOverride : v->DRAMClockChangeLatency);
4687 
4688 	for (i = 0; i < mode_lib->soc.num_states; ++i) {
4689 		for (j = 0; j <= 1; ++j) {
4690 			v->DCFCLKState[i][j] = v->DCFCLKPerState[i];
4691 		}
4692 	}
4693 
4694 	if (v->UseMinimumRequiredDCFCLK == true) {
4695 		UseMinimumDCFCLK(
4696 				mode_lib,
4697 				v->MaxInterDCNTileRepeaters,
4698 				MaxPrefetchMode,
4699 				v->FinalDRAMClockChangeLatency,
4700 				v->SREnterPlusExitTime,
4701 				v->ReturnBusWidth,
4702 				v->RoundTripPingLatencyCycles,
4703 				ReorderingBytes,
4704 				v->PixelChunkSizeInKByte,
4705 				v->MetaChunkSize,
4706 				v->GPUVMEnable,
4707 				v->GPUVMMaxPageTableLevels,
4708 				v->HostVMEnable,
4709 				v->NumberOfActivePlanes,
4710 				v->HostVMMinPageSize,
4711 				v->HostVMMaxNonCachedPageTableLevels,
4712 				v->DynamicMetadataVMEnabled,
4713 				v->ImmediateFlipRequirement[0],
4714 				v->ProgressiveToInterlaceUnitInOPP,
4715 				v->MaxAveragePercentOfIdealSDPPortBWDisplayCanUseInNormalSystemOperation,
4716 				v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
4717 				v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
4718 				v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelDataOnly,
4719 				v->VTotal,
4720 				v->VActive,
4721 				v->DynamicMetadataTransmittedBytes,
4722 				v->DynamicMetadataLinesBeforeActiveRequired,
4723 				v->Interlace,
4724 				v->RequiredDPPCLK,
4725 				v->RequiredDISPCLK,
4726 				v->UrgLatency,
4727 				v->NoOfDPP,
4728 				v->ProjectedDCFCLKDeepSleep,
4729 				v->MaximumVStartup,
4730 				v->TotalVActivePixelBandwidth,
4731 				v->TotalVActiveCursorBandwidth,
4732 				v->TotalMetaRowBandwidth,
4733 				v->TotalDPTERowBandwidth,
4734 				v->TotalNumberOfActiveDPP,
4735 				v->TotalNumberOfDCCActiveDPP,
4736 				v->dpte_group_bytes,
4737 				v->PrefetchLinesY,
4738 				v->PrefetchLinesC,
4739 				v->swath_width_luma_ub_all_states,
4740 				v->swath_width_chroma_ub_all_states,
4741 				v->BytePerPixelY,
4742 				v->BytePerPixelC,
4743 				v->HTotal,
4744 				v->PixelClock,
4745 				v->PDEAndMetaPTEBytesPerFrame,
4746 				v->DPTEBytesPerRow,
4747 				v->MetaRowBytes,
4748 				v->DynamicMetadataEnable,
4749 				v->VActivePixelBandwidth,
4750 				v->VActiveCursorBandwidth,
4751 				v->ReadBandwidthLuma,
4752 				v->ReadBandwidthChroma,
4753 				v->DCFCLKPerState,
4754 				v->DCFCLKState);
4755 
4756 		if (v->ClampMinDCFCLK) {
4757 			/* Clamp calculated values to actual minimum */
4758 			for (i = 0; i < mode_lib->soc.num_states; ++i) {
4759 				for (j = 0; j <= 1; ++j) {
4760 					if (v->DCFCLKState[i][j] < mode_lib->soc.min_dcfclk) {
4761 						v->DCFCLKState[i][j] = mode_lib->soc.min_dcfclk;
4762 					}
4763 				}
4764 			}
4765 		}
4766 	}
4767 
4768 	for (i = 0; i < mode_lib->soc.num_states; ++i) {
4769 		for (j = 0; j <= 1; ++j) {
4770 			v->IdealSDPPortBandwidthPerState[i][j] = dml_min3(
4771 					v->ReturnBusWidth * v->DCFCLKState[i][j],
4772 					v->DRAMSpeedPerState[i] * v->NumberOfChannels * v->DRAMChannelWidth,
4773 					v->FabricClockPerState[i] * v->FabricDatapathToDCNDataReturn);
4774 			if (v->HostVMEnable != true) {
4775 				v->ReturnBWPerState[i][j] = v->IdealSDPPortBandwidthPerState[i][j] * v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelDataOnly
4776 						/ 100;
4777 			} else {
4778 				v->ReturnBWPerState[i][j] = v->IdealSDPPortBandwidthPerState[i][j]
4779 						* v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData / 100;
4780 			}
4781 		}
4782 	}
4783 
4784 	//Re-ordering Buffer Support Check
4785 
4786 	for (i = 0; i < mode_lib->soc.num_states; ++i) {
4787 		for (j = 0; j <= 1; ++j) {
4788 			if ((v->ROBBufferSizeInKByte - v->PixelChunkSizeInKByte) * 1024 / v->ReturnBWPerState[i][j]
4789 					> (v->RoundTripPingLatencyCycles + 32) / v->DCFCLKState[i][j] + ReorderingBytes / v->ReturnBWPerState[i][j]) {
4790 				v->ROBSupport[i][j] = true;
4791 			} else {
4792 				v->ROBSupport[i][j] = false;
4793 			}
4794 		}
4795 	}
4796 
4797 	//Vertical Active BW support check
4798 
4799 	MaxTotalVActiveRDBandwidth = 0;
4800 	for (k = 0; k < v->NumberOfActivePlanes; ++k) {
4801 		MaxTotalVActiveRDBandwidth = MaxTotalVActiveRDBandwidth + v->ReadBandwidthLuma[k] + v->ReadBandwidthChroma[k];
4802 	}
4803 
4804 	for (i = 0; i < mode_lib->soc.num_states; ++i) {
4805 		for (j = 0; j <= 1; ++j) {
4806 			v->MaxTotalVerticalActiveAvailableBandwidth[i][j] = dml_min(
4807 					v->IdealSDPPortBandwidthPerState[i][j] * v->MaxAveragePercentOfIdealSDPPortBWDisplayCanUseInNormalSystemOperation / 100,
4808 					v->DRAMSpeedPerState[i] * v->NumberOfChannels * v->DRAMChannelWidth * v->MaxAveragePercentOfIdealDRAMBWDisplayCanUseInNormalSystemOperation
4809 							/ 100);
4810 			if (MaxTotalVActiveRDBandwidth <= v->MaxTotalVerticalActiveAvailableBandwidth[i][j]) {
4811 				v->TotalVerticalActiveBandwidthSupport[i][j] = true;
4812 			} else {
4813 				v->TotalVerticalActiveBandwidthSupport[i][j] = false;
4814 			}
4815 		}
4816 	}
4817 
4818 	//Prefetch Check
4819 
4820 	for (i = 0; i < mode_lib->soc.num_states; ++i) {
4821 		for (j = 0; j <= 1; ++j) {
4822 			int NextPrefetchModeState = MinPrefetchMode;
4823 
4824 			v->TimeCalc = 24 / v->ProjectedDCFCLKDeepSleep[i][j];
4825 
4826 			v->BandwidthWithoutPrefetchSupported[i][j] = true;
4827 			if (v->TotalVActivePixelBandwidth[i][j] + v->TotalVActiveCursorBandwidth[i][j] + v->TotalMetaRowBandwidth[i][j] + v->TotalDPTERowBandwidth[i][j]
4828 					> v->ReturnBWPerState[i][j] || v->NotUrgentLatencyHiding[i][j]) {
4829 				v->BandwidthWithoutPrefetchSupported[i][j] = false;
4830 			}
4831 
4832 			for (k = 0; k < v->NumberOfActivePlanes; ++k) {
4833 				v->NoOfDPPThisState[k] = v->NoOfDPP[i][j][k];
4834 				v->swath_width_luma_ub_this_state[k] = v->swath_width_luma_ub_all_states[i][j][k];
4835 				v->swath_width_chroma_ub_this_state[k] = v->swath_width_chroma_ub_all_states[i][j][k];
4836 				v->SwathWidthYThisState[k] = v->SwathWidthYAllStates[i][j][k];
4837 				v->SwathWidthCThisState[k] = v->SwathWidthCAllStates[i][j][k];
4838 				v->SwathHeightYThisState[k] = v->SwathHeightYAllStates[i][j][k];
4839 				v->SwathHeightCThisState[k] = v->SwathHeightCAllStates[i][j][k];
4840 				v->DETBufferSizeYThisState[k] = v->DETBufferSizeYAllStates[i][j][k];
4841 				v->DETBufferSizeCThisState[k] = v->DETBufferSizeCAllStates[i][j][k];
4842 				v->ODMCombineEnabled[k] = v->ODMCombineEnablePerState[i][k];
4843 			}
4844 
4845 			v->ExtraLatency = CalculateExtraLatency(
4846 					v->RoundTripPingLatencyCycles,
4847 					ReorderingBytes,
4848 					v->DCFCLKState[i][j],
4849 					v->TotalNumberOfActiveDPP[i][j],
4850 					v->PixelChunkSizeInKByte,
4851 					v->TotalNumberOfDCCActiveDPP[i][j],
4852 					v->MetaChunkSize,
4853 					v->ReturnBWPerState[i][j],
4854 					v->GPUVMEnable,
4855 					v->HostVMEnable,
4856 					v->NumberOfActivePlanes,
4857 					v->NoOfDPPThisState,
4858 					v->dpte_group_bytes,
4859 					v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
4860 					v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
4861 					v->HostVMMinPageSize,
4862 					v->HostVMMaxNonCachedPageTableLevels);
4863 
4864 			v->NextMaxVStartup = v->MaxMaxVStartup[i][j];
4865 			do {
4866 				v->PrefetchModePerState[i][j] = NextPrefetchModeState;
4867 				v->MaxVStartup = v->NextMaxVStartup;
4868 
4869 				v->TWait = CalculateTWait(v->PrefetchModePerState[i][j], v->FinalDRAMClockChangeLatency, v->UrgLatency[i], v->SREnterPlusExitTime);
4870 
4871 				for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4872 					Pipe myPipe = { 0 };
4873 
4874 					myPipe.DPPCLK = v->RequiredDPPCLK[i][j][k];
4875 					myPipe.DISPCLK = v->RequiredDISPCLK[i][j];
4876 					myPipe.PixelClock = v->PixelClock[k];
4877 					myPipe.DCFCLKDeepSleep = v->ProjectedDCFCLKDeepSleep[i][j];
4878 					myPipe.DPPPerPlane = v->NoOfDPP[i][j][k];
4879 					myPipe.ScalerEnabled = v->ScalerEnabled[k];
4880 					myPipe.SourceScan = v->SourceScan[k];
4881 					myPipe.BlockWidth256BytesY = v->Read256BlockWidthY[k];
4882 					myPipe.BlockHeight256BytesY = v->Read256BlockHeightY[k];
4883 					myPipe.BlockWidth256BytesC = v->Read256BlockWidthC[k];
4884 					myPipe.BlockHeight256BytesC = v->Read256BlockHeightC[k];
4885 					myPipe.InterlaceEnable = v->Interlace[k];
4886 					myPipe.NumberOfCursors = v->NumberOfCursors[k];
4887 					myPipe.VBlank = v->VTotal[k] - v->VActive[k];
4888 					myPipe.HTotal = v->HTotal[k];
4889 					myPipe.DCCEnable = v->DCCEnable[k];
4890 					myPipe.ODMCombineEnabled = !!v->ODMCombineEnabled[k];
4891 
4892 					v->NoTimeForPrefetch[i][j][k] = CalculatePrefetchSchedule(
4893 							mode_lib,
4894 							v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
4895 							v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
4896 							&myPipe,
4897 							v->DSCDelayPerState[i][k],
4898 							v->DPPCLKDelaySubtotal + v->DPPCLKDelayCNVCFormater,
4899 							v->DPPCLKDelaySCL,
4900 							v->DPPCLKDelaySCLLBOnly,
4901 							v->DPPCLKDelayCNVCCursor,
4902 							v->DISPCLKDelaySubtotal,
4903 							v->SwathWidthYThisState[k] / v->HRatio[k],
4904 							v->OutputFormat[k],
4905 							v->MaxInterDCNTileRepeaters,
4906 							dml_min(v->MaxVStartup, v->MaximumVStartup[i][j][k]),
4907 							v->MaximumVStartup[i][j][k],
4908 							v->GPUVMMaxPageTableLevels,
4909 							v->GPUVMEnable,
4910 							v->HostVMEnable,
4911 							v->HostVMMaxNonCachedPageTableLevels,
4912 							v->HostVMMinPageSize,
4913 							v->DynamicMetadataEnable[k],
4914 							v->DynamicMetadataVMEnabled,
4915 							v->DynamicMetadataLinesBeforeActiveRequired[k],
4916 							v->DynamicMetadataTransmittedBytes[k],
4917 							v->UrgLatency[i],
4918 							v->ExtraLatency,
4919 							v->TimeCalc,
4920 							v->PDEAndMetaPTEBytesPerFrame[i][j][k],
4921 							v->MetaRowBytes[i][j][k],
4922 							v->DPTEBytesPerRow[i][j][k],
4923 							v->PrefetchLinesY[i][j][k],
4924 							v->SwathWidthYThisState[k],
4925 							v->BytePerPixelY[k],
4926 							v->PrefillY[k],
4927 							v->MaxNumSwY[k],
4928 							v->PrefetchLinesC[i][j][k],
4929 							v->SwathWidthCThisState[k],
4930 							v->BytePerPixelC[k],
4931 							v->PrefillC[k],
4932 							v->MaxNumSwC[k],
4933 							v->swath_width_luma_ub_this_state[k],
4934 							v->swath_width_chroma_ub_this_state[k],
4935 							v->SwathHeightYThisState[k],
4936 							v->SwathHeightCThisState[k],
4937 							v->TWait,
4938 							v->ProgressiveToInterlaceUnitInOPP,
4939 							&v->DSTXAfterScaler[k],
4940 							&v->DSTYAfterScaler[k],
4941 							&v->LineTimesForPrefetch[k],
4942 							&v->PrefetchBW[k],
4943 							&v->LinesForMetaPTE[k],
4944 							&v->LinesForMetaAndDPTERow[k],
4945 							&v->VRatioPreY[i][j][k],
4946 							&v->VRatioPreC[i][j][k],
4947 							&v->RequiredPrefetchPixelDataBWLuma[i][j][k],
4948 							&v->RequiredPrefetchPixelDataBWChroma[i][j][k],
4949 							&v->NoTimeForDynamicMetadata[i][j][k],
4950 							&v->Tno_bw[k],
4951 							&v->prefetch_vmrow_bw[k],
4952 							&v->Tdmdl_vm[k],
4953 							&v->Tdmdl[k],
4954 							&v->VUpdateOffsetPix[k],
4955 							&v->VUpdateWidthPix[k],
4956 							&v->VReadyOffsetPix[k]);
4957 				}
4958 
4959 				for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4960 					CalculateUrgentBurstFactor(
4961 							v->swath_width_luma_ub_this_state[k],
4962 							v->swath_width_chroma_ub_this_state[k],
4963 							v->DETBufferSizeInKByte[0],
4964 							v->SwathHeightYThisState[k],
4965 							v->SwathHeightCThisState[k],
4966 							v->HTotal[k] / v->PixelClock[k],
4967 							v->UrgentLatency,
4968 							v->CursorBufferSize,
4969 							v->CursorWidth[k][0],
4970 							v->CursorBPP[k][0],
4971 							v->VRatioPreY[i][j][k],
4972 							v->VRatioPreC[i][j][k],
4973 							v->BytePerPixelInDETY[k],
4974 							v->BytePerPixelInDETC[k],
4975 							v->DETBufferSizeYThisState[k],
4976 							v->DETBufferSizeCThisState[k],
4977 							&v->UrgentBurstFactorCursorPre[k],
4978 							&v->UrgentBurstFactorLumaPre[k],
4979 							&v->UrgentBurstFactorChroma[k],
4980 							&v->NoUrgentLatencyHidingPre[k]);
4981 				}
4982 
4983 				v->MaximumReadBandwidthWithPrefetch = 0.0;
4984 				for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
4985 					v->cursor_bw_pre[k] = v->NumberOfCursors[k] * v->CursorWidth[k][0] * v->CursorBPP[k][0] / 8.0 / (v->HTotal[k] / v->PixelClock[k])
4986 							* v->VRatioPreY[i][j][k];
4987 
4988 					v->MaximumReadBandwidthWithPrefetch = v->MaximumReadBandwidthWithPrefetch
4989 							+ dml_max4(
4990 									v->VActivePixelBandwidth[i][j][k],
4991 									v->VActiveCursorBandwidth[i][j][k]
4992 											+ v->NoOfDPP[i][j][k] * (v->meta_row_bandwidth[i][j][k] + v->dpte_row_bandwidth[i][j][k]),
4993 									v->NoOfDPP[i][j][k] * v->prefetch_vmrow_bw[k],
4994 									v->NoOfDPP[i][j][k]
4995 											* (v->RequiredPrefetchPixelDataBWLuma[i][j][k] * v->UrgentBurstFactorLumaPre[k]
4996 													+ v->RequiredPrefetchPixelDataBWChroma[i][j][k]
4997 															* v->UrgentBurstFactorChromaPre[k])
4998 											+ v->cursor_bw_pre[k] * v->UrgentBurstFactorCursorPre[k]);
4999 				}
5000 
5001 				v->NotEnoughUrgentLatencyHidingPre = false;
5002 				for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
5003 					if (v->NoUrgentLatencyHidingPre[k] == true) {
5004 						v->NotEnoughUrgentLatencyHidingPre = true;
5005 					}
5006 				}
5007 
5008 				v->PrefetchSupported[i][j] = true;
5009 				if (v->BandwidthWithoutPrefetchSupported[i][j] == false || v->MaximumReadBandwidthWithPrefetch > v->ReturnBWPerState[i][j]
5010 						|| v->NotEnoughUrgentLatencyHidingPre == 1) {
5011 					v->PrefetchSupported[i][j] = false;
5012 				}
5013 				for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
5014 					if (v->LineTimesForPrefetch[k] < 2.0 || v->LinesForMetaPTE[k] >= 32.0 || v->LinesForMetaAndDPTERow[k] >= 16.0
5015 							|| v->NoTimeForPrefetch[i][j][k] == true) {
5016 						v->PrefetchSupported[i][j] = false;
5017 					}
5018 				}
5019 
5020 				v->DynamicMetadataSupported[i][j] = true;
5021 				for (k = 0; k < v->NumberOfActivePlanes; ++k) {
5022 					if (v->NoTimeForDynamicMetadata[i][j][k] == true) {
5023 						v->DynamicMetadataSupported[i][j] = false;
5024 					}
5025 				}
5026 
5027 				v->VRatioInPrefetchSupported[i][j] = true;
5028 				for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
5029 					if (v->VRatioPreY[i][j][k] > 4.0 || v->VRatioPreC[i][j][k] > 4.0 || v->NoTimeForPrefetch[i][j][k] == true) {
5030 						v->VRatioInPrefetchSupported[i][j] = false;
5031 					}
5032 				}
5033 				v->AnyLinesForVMOrRowTooLarge = false;
5034 				for (k = 0; k < v->NumberOfActivePlanes; ++k) {
5035 					if (v->LinesForMetaAndDPTERow[k] >= 16 || v->LinesForMetaPTE[k] >= 32) {
5036 						v->AnyLinesForVMOrRowTooLarge = true;
5037 					}
5038 				}
5039 
5040 				if (v->PrefetchSupported[i][j] == true && v->VRatioInPrefetchSupported[i][j] == true) {
5041 					v->BandwidthAvailableForImmediateFlip = v->ReturnBWPerState[i][j];
5042 					for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
5043 						v->BandwidthAvailableForImmediateFlip = v->BandwidthAvailableForImmediateFlip
5044 								- dml_max(
5045 										v->VActivePixelBandwidth[i][j][k] + v->VActiveCursorBandwidth[i][j][k],
5046 										v->NoOfDPP[i][j][k]
5047 												* (v->RequiredPrefetchPixelDataBWLuma[i][j][k] * v->UrgentBurstFactorLumaPre[k]
5048 														+ v->RequiredPrefetchPixelDataBWChroma[i][j][k]
5049 																* v->UrgentBurstFactorChromaPre[k])
5050 												+ v->cursor_bw_pre[k] * v->UrgentBurstFactorCursorPre[k]);
5051 					}
5052 					v->TotImmediateFlipBytes = 0.0;
5053 					for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
5054 						v->TotImmediateFlipBytes = v->TotImmediateFlipBytes + v->NoOfDPP[i][j][k] * v->PDEAndMetaPTEBytesPerFrame[i][j][k]
5055 								+ v->MetaRowBytes[i][j][k] + v->DPTEBytesPerRow[i][j][k];
5056 					}
5057 
5058 					for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
5059 						CalculateFlipSchedule(
5060 								mode_lib,
5061 								v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
5062 								v->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
5063 								v->ExtraLatency,
5064 								v->UrgLatency[i],
5065 								v->GPUVMMaxPageTableLevels,
5066 								v->HostVMEnable,
5067 								v->HostVMMaxNonCachedPageTableLevels,
5068 								v->GPUVMEnable,
5069 								v->HostVMMinPageSize,
5070 								v->PDEAndMetaPTEBytesPerFrame[i][j][k],
5071 								v->MetaRowBytes[i][j][k],
5072 								v->DPTEBytesPerRow[i][j][k],
5073 								v->BandwidthAvailableForImmediateFlip,
5074 								v->TotImmediateFlipBytes,
5075 								v->SourcePixelFormat[k],
5076 								v->HTotal[k] / v->PixelClock[k],
5077 								v->VRatio[k],
5078 								v->VRatioChroma[k],
5079 								v->Tno_bw[k],
5080 								v->DCCEnable[k],
5081 								v->dpte_row_height[k],
5082 								v->meta_row_height[k],
5083 								v->dpte_row_height_chroma[k],
5084 								v->meta_row_height_chroma[k],
5085 								&v->DestinationLinesToRequestVMInImmediateFlip[k],
5086 								&v->DestinationLinesToRequestRowInImmediateFlip[k],
5087 								&v->final_flip_bw[k],
5088 								&v->ImmediateFlipSupportedForPipe[k]);
5089 					}
5090 					v->total_dcn_read_bw_with_flip = 0.0;
5091 					for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
5092 						v->total_dcn_read_bw_with_flip = v->total_dcn_read_bw_with_flip
5093 								+ dml_max3(
5094 										v->NoOfDPP[i][j][k] * v->prefetch_vmrow_bw[k],
5095 										v->NoOfDPP[i][j][k] * v->final_flip_bw[k] + v->VActivePixelBandwidth[i][j][k]
5096 												+ v->VActiveCursorBandwidth[i][j][k],
5097 										v->NoOfDPP[i][j][k]
5098 												* (v->final_flip_bw[k]
5099 														+ v->RequiredPrefetchPixelDataBWLuma[i][j][k]
5100 																* v->UrgentBurstFactorLumaPre[k]
5101 														+ v->RequiredPrefetchPixelDataBWChroma[i][j][k]
5102 																* v->UrgentBurstFactorChromaPre[k])
5103 												+ v->cursor_bw_pre[k] * v->UrgentBurstFactorCursorPre[k]);
5104 					}
5105 					v->ImmediateFlipSupportedForState[i][j] = true;
5106 					if (v->total_dcn_read_bw_with_flip > v->ReturnBWPerState[i][j]) {
5107 						v->ImmediateFlipSupportedForState[i][j] = false;
5108 					}
5109 					for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
5110 						if (v->ImmediateFlipSupportedForPipe[k] == false) {
5111 							v->ImmediateFlipSupportedForState[i][j] = false;
5112 						}
5113 					}
5114 				} else {
5115 					v->ImmediateFlipSupportedForState[i][j] = false;
5116 				}
5117 				if (v->MaxVStartup <= 13 || v->AnyLinesForVMOrRowTooLarge == false) {
5118 					v->NextMaxVStartup = v->MaxMaxVStartup[i][j];
5119 					NextPrefetchModeState = NextPrefetchModeState + 1;
5120 				} else {
5121 					v->NextMaxVStartup = v->NextMaxVStartup - 1;
5122 				}
5123 			} while (!((v->PrefetchSupported[i][j] == true && v->DynamicMetadataSupported[i][j] == true && v->VRatioInPrefetchSupported[i][j] == true
5124 					&& ((v->HostVMEnable == false && v->ImmediateFlipRequirement[0] != dm_immediate_flip_required)
5125 							|| v->ImmediateFlipSupportedForState[i][j] == true))
5126 					|| (v->NextMaxVStartup == v->MaxMaxVStartup[i][j] && NextPrefetchModeState > MaxPrefetchMode)));
5127 
5128 			CalculateWatermarksAndDRAMSpeedChangeSupport(
5129 					mode_lib,
5130 					v->PrefetchModePerState[i][j],
5131 					v->NumberOfActivePlanes,
5132 					v->MaxLineBufferLines,
5133 					v->LineBufferSize,
5134 					v->DPPOutputBufferPixels,
5135 					v->DETBufferSizeInKByte[0],
5136 					v->WritebackInterfaceBufferSize,
5137 					v->DCFCLKState[i][j],
5138 					v->ReturnBWPerState[i][j],
5139 					v->GPUVMEnable,
5140 					v->dpte_group_bytes,
5141 					v->MetaChunkSize,
5142 					v->UrgLatency[i],
5143 					v->ExtraLatency,
5144 					v->WritebackLatency,
5145 					v->WritebackChunkSize,
5146 					v->SOCCLKPerState[i],
5147 					v->FinalDRAMClockChangeLatency,
5148 					v->SRExitTime,
5149 					v->SREnterPlusExitTime,
5150 					v->ProjectedDCFCLKDeepSleep[i][j],
5151 					v->NoOfDPPThisState,
5152 					v->DCCEnable,
5153 					v->RequiredDPPCLKThisState,
5154 					v->DETBufferSizeYThisState,
5155 					v->DETBufferSizeCThisState,
5156 					v->SwathHeightYThisState,
5157 					v->SwathHeightCThisState,
5158 					v->LBBitPerPixel,
5159 					v->SwathWidthYThisState,
5160 					v->SwathWidthCThisState,
5161 					v->HRatio,
5162 					v->HRatioChroma,
5163 					v->vtaps,
5164 					v->VTAPsChroma,
5165 					v->VRatio,
5166 					v->VRatioChroma,
5167 					v->HTotal,
5168 					v->PixelClock,
5169 					v->BlendingAndTiming,
5170 					v->BytePerPixelInDETY,
5171 					v->BytePerPixelInDETC,
5172 					v->DSTXAfterScaler,
5173 					v->DSTYAfterScaler,
5174 					v->WritebackEnable,
5175 					v->WritebackPixelFormat,
5176 					v->WritebackDestinationWidth,
5177 					v->WritebackDestinationHeight,
5178 					v->WritebackSourceHeight,
5179 					&v->DRAMClockChangeSupport[i][j],
5180 					&v->UrgentWatermark,
5181 					&v->WritebackUrgentWatermark,
5182 					&v->DRAMClockChangeWatermark,
5183 					&v->WritebackDRAMClockChangeWatermark,
5184 					&v->StutterExitWatermark,
5185 					&v->StutterEnterPlusExitWatermark,
5186 					&v->MinActiveDRAMClockChangeLatencySupported);
5187 		}
5188 	}
5189 
5190 	/*PTE Buffer Size Check*/
5191 
5192 	for (i = 0; i < v->soc.num_states; i++) {
5193 		for (j = 0; j < 2; j++) {
5194 			v->PTEBufferSizeNotExceeded[i][j] = true;
5195 			for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
5196 				if (v->PTEBufferSizeNotExceededY[i][j][k] == false || v->PTEBufferSizeNotExceededC[i][j][k] == false) {
5197 					v->PTEBufferSizeNotExceeded[i][j] = false;
5198 				}
5199 			}
5200 		}
5201 	}
5202 	/*Cursor Support Check*/
5203 
5204 	v->CursorSupport = true;
5205 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
5206 		if (v->CursorWidth[k][0] > 0.0) {
5207 			if (v->CursorBPP[k][0] == 64 && v->Cursor64BppSupport == false) {
5208 				v->CursorSupport = false;
5209 			}
5210 		}
5211 	}
5212 	/*Valid Pitch Check*/
5213 
5214 	v->PitchSupport = true;
5215 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
5216 		v->AlignedYPitch[k] = dml_ceil(dml_max(v->PitchY[k], v->SurfaceWidthY[k]), v->MacroTileWidthY[k]);
5217 		if (v->DCCEnable[k] == true) {
5218 			v->AlignedDCCMetaPitchY[k] = dml_ceil(dml_max(v->DCCMetaPitchY[k], v->SurfaceWidthY[k]), 64.0 * v->Read256BlockWidthY[k]);
5219 		} else {
5220 			v->AlignedDCCMetaPitchY[k] = v->DCCMetaPitchY[k];
5221 		}
5222 		if (v->SourcePixelFormat[k] != dm_444_64 && v->SourcePixelFormat[k] != dm_444_32 && v->SourcePixelFormat[k] != dm_444_16 && v->SourcePixelFormat[k] != dm_mono_16
5223 				&& v->SourcePixelFormat[k] != dm_rgbe && v->SourcePixelFormat[k] != dm_mono_8) {
5224 			v->AlignedCPitch[k] = dml_ceil(dml_max(v->PitchC[k], v->SurfaceWidthC[k]), v->MacroTileWidthC[k]);
5225 			if (v->DCCEnable[k] == true) {
5226 				v->AlignedDCCMetaPitchC[k] = dml_ceil(dml_max(v->DCCMetaPitchC[k], v->SurfaceWidthC[k]), 64.0 * v->Read256BlockWidthC[k]);
5227 			} else {
5228 				v->AlignedDCCMetaPitchC[k] = v->DCCMetaPitchC[k];
5229 			}
5230 		} else {
5231 			v->AlignedCPitch[k] = v->PitchC[k];
5232 			v->AlignedDCCMetaPitchC[k] = v->DCCMetaPitchC[k];
5233 		}
5234 		if (v->AlignedYPitch[k] > v->PitchY[k] || v->AlignedCPitch[k] > v->PitchC[k] || v->AlignedDCCMetaPitchY[k] > v->DCCMetaPitchY[k]
5235 				|| v->AlignedDCCMetaPitchC[k] > v->DCCMetaPitchC[k]) {
5236 			v->PitchSupport = false;
5237 		}
5238 	}
5239 
5240 	for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
5241 		if (v->ViewportWidth[k] > v->SurfaceWidthY[k] || v->ViewportHeight[k] > v->SurfaceHeightY[k])
5242 			ViewportExceedsSurface = true;
5243 
5244 		if (v->SourcePixelFormat[k] != dm_444_64 && v->SourcePixelFormat[k] != dm_444_32 && v->SourcePixelFormat[k] != dm_444_16
5245 				&& v->SourcePixelFormat[k] != dm_444_8 && v->SourcePixelFormat[k] != dm_rgbe) {
5246 			if (v->ViewportWidthChroma[k] > v->SurfaceWidthC[k] || v->ViewportHeightChroma[k] > v->SurfaceHeightC[k]) {
5247 				ViewportExceedsSurface = true;
5248 			}
5249 		}
5250 	}
5251 	/*Mode Support, Voltage State and SOC Configuration*/
5252 
5253 	for (i = v->soc.num_states - 1; i >= 0; i--) {
5254 		for (j = 0; j < 2; j++) {
5255 			if (v->ScaleRatioAndTapsSupport == 1 && v->SourceFormatPixelAndScanSupport == 1 && v->ViewportSizeSupport[i][j] == 1
5256 					&& v->DIOSupport[i] == 1 && v->ODMCombine4To1SupportCheckOK[i] == 1
5257 					&& v->NotEnoughDSCUnits[i] == 0
5258 					&& v->DTBCLKRequiredMoreThanSupported[i] == 0
5259 					&& v->ROBSupport[i][j] == 1 && v->DISPCLK_DPPCLK_Support[i][j] == 1 && v->TotalAvailablePipesSupport[i][j] == 1
5260 					&& EnoughWritebackUnits == 1 && WritebackModeSupport == 1
5261 					&& v->WritebackLatencySupport == 1 && v->WritebackScaleRatioAndTapsSupport == 1 && v->CursorSupport == 1 && v->PitchSupport == 1
5262 					&& ViewportExceedsSurface == 0 && v->PrefetchSupported[i][j] == 1 && v->DynamicMetadataSupported[i][j] == 1
5263 					&& v->TotalVerticalActiveBandwidthSupport[i][j] == 1 && v->VRatioInPrefetchSupported[i][j] == 1
5264 					&& v->PTEBufferSizeNotExceeded[i][j] == 1 && v->NonsupportedDSCInputBPC == 0
5265 					&& ((v->HostVMEnable == 0 && v->ImmediateFlipRequirement[0] != dm_immediate_flip_required)
5266 							|| v->ImmediateFlipSupportedForState[i][j] == true)) {
5267 				v->ModeSupport[i][j] = true;
5268 			} else {
5269 				v->ModeSupport[i][j] = false;
5270 			}
5271 		}
5272 	}
5273 	{
5274 		unsigned int MaximumMPCCombine = 0;
5275 		for (i = v->soc.num_states; i >= 0; i--) {
5276 			if (i == v->soc.num_states || v->ModeSupport[i][0] == true || v->ModeSupport[i][1] == true) {
5277 				v->VoltageLevel = i;
5278 				v->ModeIsSupported = v->ModeSupport[i][0] == true || v->ModeSupport[i][1] == true;
5279 				if (v->ModeSupport[i][1] == true) {
5280 					MaximumMPCCombine = 1;
5281 				} else {
5282 					MaximumMPCCombine = 0;
5283 				}
5284 			}
5285 		}
5286 		v->ImmediateFlipSupport = v->ImmediateFlipSupportedForState[v->VoltageLevel][MaximumMPCCombine];
5287 		for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
5288 			v->MPCCombineEnable[k] = v->MPCCombine[v->VoltageLevel][MaximumMPCCombine][k];
5289 			v->DPPPerPlane[k] = v->NoOfDPP[v->VoltageLevel][MaximumMPCCombine][k];
5290 		}
5291 		v->DCFCLK = v->DCFCLKState[v->VoltageLevel][MaximumMPCCombine];
5292 		v->DRAMSpeed = v->DRAMSpeedPerState[v->VoltageLevel];
5293 		v->FabricClock = v->FabricClockPerState[v->VoltageLevel];
5294 		v->SOCCLK = v->SOCCLKPerState[v->VoltageLevel];
5295 		v->ReturnBW = v->ReturnBWPerState[v->VoltageLevel][MaximumMPCCombine];
5296 		v->maxMpcComb = MaximumMPCCombine;
5297 	}
5298 }
5299 
5300 static void CalculateWatermarksAndDRAMSpeedChangeSupport(
5301 		struct display_mode_lib *mode_lib,
5302 		unsigned int PrefetchMode,
5303 		unsigned int NumberOfActivePlanes,
5304 		unsigned int MaxLineBufferLines,
5305 		unsigned int LineBufferSize,
5306 		unsigned int DPPOutputBufferPixels,
5307 		unsigned int DETBufferSizeInKByte,
5308 		unsigned int WritebackInterfaceBufferSize,
5309 		double DCFCLK,
5310 		double ReturnBW,
5311 		bool GPUVMEnable,
5312 		unsigned int dpte_group_bytes[],
5313 		unsigned int MetaChunkSize,
5314 		double UrgentLatency,
5315 		double ExtraLatency,
5316 		double WritebackLatency,
5317 		double WritebackChunkSize,
5318 		double SOCCLK,
5319 		double DRAMClockChangeLatency,
5320 		double SRExitTime,
5321 		double SREnterPlusExitTime,
5322 		double DCFCLKDeepSleep,
5323 		unsigned int DPPPerPlane[],
5324 		bool DCCEnable[],
5325 		double DPPCLK[],
5326 		unsigned int DETBufferSizeY[],
5327 		unsigned int DETBufferSizeC[],
5328 		unsigned int SwathHeightY[],
5329 		unsigned int SwathHeightC[],
5330 		unsigned int LBBitPerPixel[],
5331 		double SwathWidthY[],
5332 		double SwathWidthC[],
5333 		double HRatio[],
5334 		double HRatioChroma[],
5335 		unsigned int vtaps[],
5336 		unsigned int VTAPsChroma[],
5337 		double VRatio[],
5338 		double VRatioChroma[],
5339 		unsigned int HTotal[],
5340 		double PixelClock[],
5341 		unsigned int BlendingAndTiming[],
5342 		double BytePerPixelDETY[],
5343 		double BytePerPixelDETC[],
5344 		double DSTXAfterScaler[],
5345 		double DSTYAfterScaler[],
5346 		bool WritebackEnable[],
5347 		enum source_format_class WritebackPixelFormat[],
5348 		double WritebackDestinationWidth[],
5349 		double WritebackDestinationHeight[],
5350 		double WritebackSourceHeight[],
5351 		enum clock_change_support *DRAMClockChangeSupport,
5352 		double *UrgentWatermark,
5353 		double *WritebackUrgentWatermark,
5354 		double *DRAMClockChangeWatermark,
5355 		double *WritebackDRAMClockChangeWatermark,
5356 		double *StutterExitWatermark,
5357 		double *StutterEnterPlusExitWatermark,
5358 		double *MinActiveDRAMClockChangeLatencySupported)
5359 {
5360 	double EffectiveLBLatencyHidingY = 0;
5361 	double EffectiveLBLatencyHidingC = 0;
5362 	double LinesInDETY[DC__NUM_DPP__MAX] = { 0 };
5363 	double LinesInDETC = 0;
5364 	unsigned int LinesInDETYRoundedDownToSwath[DC__NUM_DPP__MAX] = { 0 };
5365 	unsigned int LinesInDETCRoundedDownToSwath = 0;
5366 	double FullDETBufferingTimeY[DC__NUM_DPP__MAX] = { 0 };
5367 	double FullDETBufferingTimeC = 0;
5368 	double ActiveDRAMClockChangeLatencyMarginY = 0;
5369 	double ActiveDRAMClockChangeLatencyMarginC = 0;
5370 	double WritebackDRAMClockChangeLatencyMargin = 0;
5371 	double PlaneWithMinActiveDRAMClockChangeMargin = 0;
5372 	double SecondMinActiveDRAMClockChangeMarginOneDisplayInVBLank = 0;
5373 	double FullDETBufferingTimeYStutterCriticalPlane = 0;
5374 	double TimeToFinishSwathTransferStutterCriticalPlane = 0;
5375 	double WritebackDRAMClockChangeLatencyHiding = 0;
5376 	unsigned int k, j;
5377 
5378 	mode_lib->vba.TotalActiveDPP = 0;
5379 	mode_lib->vba.TotalDCCActiveDPP = 0;
5380 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5381 		mode_lib->vba.TotalActiveDPP = mode_lib->vba.TotalActiveDPP + DPPPerPlane[k];
5382 		if (DCCEnable[k] == true) {
5383 			mode_lib->vba.TotalDCCActiveDPP = mode_lib->vba.TotalDCCActiveDPP + DPPPerPlane[k];
5384 		}
5385 	}
5386 
5387 	*UrgentWatermark = UrgentLatency + ExtraLatency;
5388 
5389 	*DRAMClockChangeWatermark = DRAMClockChangeLatency + *UrgentWatermark;
5390 
5391 	mode_lib->vba.TotalActiveWriteback = 0;
5392 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5393 		if (WritebackEnable[k] == true) {
5394 			mode_lib->vba.TotalActiveWriteback = mode_lib->vba.TotalActiveWriteback + 1;
5395 		}
5396 	}
5397 
5398 	if (mode_lib->vba.TotalActiveWriteback <= 1) {
5399 		*WritebackUrgentWatermark = WritebackLatency;
5400 	} else {
5401 		*WritebackUrgentWatermark = WritebackLatency + WritebackChunkSize * 1024.0 / 32.0 / SOCCLK;
5402 	}
5403 
5404 	if (mode_lib->vba.TotalActiveWriteback <= 1) {
5405 		*WritebackDRAMClockChangeWatermark = DRAMClockChangeLatency + WritebackLatency;
5406 	} else {
5407 		*WritebackDRAMClockChangeWatermark = DRAMClockChangeLatency + WritebackLatency + WritebackChunkSize * 1024.0 / 32.0 / SOCCLK;
5408 	}
5409 
5410 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5411 
5412 		mode_lib->vba.LBLatencyHidingSourceLinesY = dml_min((double) MaxLineBufferLines, dml_floor(LineBufferSize / LBBitPerPixel[k] / (SwathWidthY[k] / dml_max(HRatio[k], 1.0)), 1)) - (vtaps[k] - 1);
5413 
5414 		mode_lib->vba.LBLatencyHidingSourceLinesC = dml_min((double) MaxLineBufferLines, dml_floor(LineBufferSize / LBBitPerPixel[k] / (SwathWidthC[k] / dml_max(HRatioChroma[k], 1.0)), 1)) - (VTAPsChroma[k] - 1);
5415 
5416 		EffectiveLBLatencyHidingY = mode_lib->vba.LBLatencyHidingSourceLinesY / VRatio[k] * (HTotal[k] / PixelClock[k]);
5417 
5418 		EffectiveLBLatencyHidingC = mode_lib->vba.LBLatencyHidingSourceLinesC / VRatioChroma[k] * (HTotal[k] / PixelClock[k]);
5419 
5420 		LinesInDETY[k] = (double) DETBufferSizeY[k] / BytePerPixelDETY[k] / SwathWidthY[k];
5421 		LinesInDETYRoundedDownToSwath[k] = dml_floor(LinesInDETY[k], SwathHeightY[k]);
5422 		FullDETBufferingTimeY[k] = LinesInDETYRoundedDownToSwath[k] * (HTotal[k] / PixelClock[k]) / VRatio[k];
5423 		if (BytePerPixelDETC[k] > 0) {
5424 			LinesInDETC = mode_lib->vba.DETBufferSizeC[k] / BytePerPixelDETC[k] / SwathWidthC[k];
5425 			LinesInDETCRoundedDownToSwath = dml_floor(LinesInDETC, SwathHeightC[k]);
5426 			FullDETBufferingTimeC = LinesInDETCRoundedDownToSwath * (HTotal[k] / PixelClock[k]) / VRatioChroma[k];
5427 		} else {
5428 			LinesInDETC = 0;
5429 			FullDETBufferingTimeC = 999999;
5430 		}
5431 
5432 		ActiveDRAMClockChangeLatencyMarginY = EffectiveLBLatencyHidingY + FullDETBufferingTimeY[k] - *UrgentWatermark - (HTotal[k] / PixelClock[k]) * (DSTXAfterScaler[k] / HTotal[k] + DSTYAfterScaler[k]) - *DRAMClockChangeWatermark;
5433 
5434 		if (NumberOfActivePlanes > 1) {
5435 			ActiveDRAMClockChangeLatencyMarginY = ActiveDRAMClockChangeLatencyMarginY - (1 - 1.0 / NumberOfActivePlanes) * SwathHeightY[k] * HTotal[k] / PixelClock[k] / VRatio[k];
5436 		}
5437 
5438 		if (BytePerPixelDETC[k] > 0) {
5439 			ActiveDRAMClockChangeLatencyMarginC = EffectiveLBLatencyHidingC + FullDETBufferingTimeC - *UrgentWatermark - (HTotal[k] / PixelClock[k]) * (DSTXAfterScaler[k] / HTotal[k] + DSTYAfterScaler[k]) - *DRAMClockChangeWatermark;
5440 
5441 			if (NumberOfActivePlanes > 1) {
5442 				ActiveDRAMClockChangeLatencyMarginC = ActiveDRAMClockChangeLatencyMarginC - (1 - 1.0 / NumberOfActivePlanes) * SwathHeightC[k] * HTotal[k] / PixelClock[k] / VRatioChroma[k];
5443 			}
5444 			mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] = dml_min(ActiveDRAMClockChangeLatencyMarginY, ActiveDRAMClockChangeLatencyMarginC);
5445 		} else {
5446 			mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] = ActiveDRAMClockChangeLatencyMarginY;
5447 		}
5448 
5449 		if (WritebackEnable[k] == true) {
5450 
5451 			WritebackDRAMClockChangeLatencyHiding = WritebackInterfaceBufferSize * 1024 / (WritebackDestinationWidth[k] * WritebackDestinationHeight[k] / (WritebackSourceHeight[k] * HTotal[k] / PixelClock[k]) * 4);
5452 			if (WritebackPixelFormat[k] == dm_444_64) {
5453 				WritebackDRAMClockChangeLatencyHiding = WritebackDRAMClockChangeLatencyHiding / 2;
5454 			}
5455 			if (mode_lib->vba.WritebackConfiguration == dm_whole_buffer_for_single_stream_interleave) {
5456 				WritebackDRAMClockChangeLatencyHiding = WritebackDRAMClockChangeLatencyHiding * 2;
5457 			}
5458 			WritebackDRAMClockChangeLatencyMargin = WritebackDRAMClockChangeLatencyHiding - mode_lib->vba.WritebackDRAMClockChangeWatermark;
5459 			mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] = dml_min(mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k], WritebackDRAMClockChangeLatencyMargin);
5460 		}
5461 	}
5462 
5463 	mode_lib->vba.MinActiveDRAMClockChangeMargin = 999999;
5464 	PlaneWithMinActiveDRAMClockChangeMargin = 0;
5465 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5466 		if (mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] < mode_lib->vba.MinActiveDRAMClockChangeMargin) {
5467 			mode_lib->vba.MinActiveDRAMClockChangeMargin = mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k];
5468 			if (BlendingAndTiming[k] == k) {
5469 				PlaneWithMinActiveDRAMClockChangeMargin = k;
5470 			} else {
5471 				for (j = 0; j < NumberOfActivePlanes; ++j) {
5472 					if (BlendingAndTiming[k] == j) {
5473 						PlaneWithMinActiveDRAMClockChangeMargin = j;
5474 					}
5475 				}
5476 			}
5477 		}
5478 	}
5479 
5480 	*MinActiveDRAMClockChangeLatencySupported = mode_lib->vba.MinActiveDRAMClockChangeMargin + DRAMClockChangeLatency;
5481 
5482 	SecondMinActiveDRAMClockChangeMarginOneDisplayInVBLank = 999999;
5483 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5484 		if (!((k == PlaneWithMinActiveDRAMClockChangeMargin) && (BlendingAndTiming[k] == k)) && !(BlendingAndTiming[k] == PlaneWithMinActiveDRAMClockChangeMargin) && mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] < SecondMinActiveDRAMClockChangeMarginOneDisplayInVBLank) {
5485 			SecondMinActiveDRAMClockChangeMarginOneDisplayInVBLank = mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k];
5486 		}
5487 	}
5488 
5489 	mode_lib->vba.TotalNumberOfActiveOTG = 0;
5490 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5491 		if (BlendingAndTiming[k] == k) {
5492 			mode_lib->vba.TotalNumberOfActiveOTG = mode_lib->vba.TotalNumberOfActiveOTG + 1;
5493 		}
5494 	}
5495 
5496 	if (mode_lib->vba.MinActiveDRAMClockChangeMargin > 0) {
5497 		*DRAMClockChangeSupport = dm_dram_clock_change_vactive;
5498 	} else if (((mode_lib->vba.SynchronizedVBlank == true || mode_lib->vba.TotalNumberOfActiveOTG == 1 || SecondMinActiveDRAMClockChangeMarginOneDisplayInVBLank > 0) && PrefetchMode == 0)) {
5499 		*DRAMClockChangeSupport = dm_dram_clock_change_vblank;
5500 	} else {
5501 		*DRAMClockChangeSupport = dm_dram_clock_change_unsupported;
5502 	}
5503 
5504 	FullDETBufferingTimeYStutterCriticalPlane = FullDETBufferingTimeY[0];
5505 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5506 		if (FullDETBufferingTimeY[k] <= FullDETBufferingTimeYStutterCriticalPlane) {
5507 			FullDETBufferingTimeYStutterCriticalPlane = FullDETBufferingTimeY[k];
5508 			TimeToFinishSwathTransferStutterCriticalPlane = (SwathHeightY[k] - (LinesInDETY[k] - LinesInDETYRoundedDownToSwath[k])) * (HTotal[k] / PixelClock[k]) / VRatio[k];
5509 		}
5510 	}
5511 
5512 	*StutterExitWatermark = SRExitTime +  ExtraLatency + 10 / DCFCLKDeepSleep;
5513 	*StutterEnterPlusExitWatermark = dml_max(SREnterPlusExitTime + ExtraLatency + 10 / DCFCLKDeepSleep, TimeToFinishSwathTransferStutterCriticalPlane);
5514 
5515 }
5516 
5517 static void CalculateDCFCLKDeepSleep(
5518 		struct display_mode_lib *mode_lib,
5519 		unsigned int NumberOfActivePlanes,
5520 		int BytePerPixelY[],
5521 		int BytePerPixelC[],
5522 		double VRatio[],
5523 		double VRatioChroma[],
5524 		double SwathWidthY[],
5525 		double SwathWidthC[],
5526 		unsigned int DPPPerPlane[],
5527 		double HRatio[],
5528 		double HRatioChroma[],
5529 		double PixelClock[],
5530 		double PSCL_THROUGHPUT[],
5531 		double PSCL_THROUGHPUT_CHROMA[],
5532 		double DPPCLK[],
5533 		double ReadBandwidthLuma[],
5534 		double ReadBandwidthChroma[],
5535 		int ReturnBusWidth,
5536 		double *DCFCLKDeepSleep)
5537 {
5538 	double DisplayPipeLineDeliveryTimeLuma = 0;
5539 	double DisplayPipeLineDeliveryTimeChroma = 0;
5540 	unsigned int k;
5541 	double ReadBandwidth = 0.0;
5542 
5543 	//double   DCFCLKDeepSleepPerPlane[DC__NUM_DPP__MAX];
5544 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5545 
5546 		if (VRatio[k] <= 1) {
5547 			DisplayPipeLineDeliveryTimeLuma = SwathWidthY[k] * DPPPerPlane[k] / HRatio[k] / PixelClock[k];
5548 		} else {
5549 			DisplayPipeLineDeliveryTimeLuma = SwathWidthY[k] / PSCL_THROUGHPUT[k] / DPPCLK[k];
5550 		}
5551 		if (BytePerPixelC[k] == 0) {
5552 			DisplayPipeLineDeliveryTimeChroma = 0;
5553 		} else {
5554 			if (VRatioChroma[k] <= 1) {
5555 				DisplayPipeLineDeliveryTimeChroma = SwathWidthC[k] * DPPPerPlane[k] / HRatioChroma[k] / PixelClock[k];
5556 			} else {
5557 				DisplayPipeLineDeliveryTimeChroma = SwathWidthC[k] / PSCL_THROUGHPUT_CHROMA[k] / DPPCLK[k];
5558 			}
5559 		}
5560 
5561 		if (BytePerPixelC[k] > 0) {
5562 			mode_lib->vba.DCFCLKDeepSleepPerPlane[k] = dml_max(1.1 * SwathWidthY[k] * BytePerPixelY[k] / 32.0 / DisplayPipeLineDeliveryTimeLuma, 1.1 * SwathWidthC[k] * BytePerPixelC[k] / 32.0 / DisplayPipeLineDeliveryTimeChroma);
5563 		} else {
5564 			mode_lib->vba.DCFCLKDeepSleepPerPlane[k] = 1.1 * SwathWidthY[k] * BytePerPixelY[k] / 64.0 / DisplayPipeLineDeliveryTimeLuma;
5565 		}
5566 		mode_lib->vba.DCFCLKDeepSleepPerPlane[k] = dml_max(mode_lib->vba.DCFCLKDeepSleepPerPlane[k], PixelClock[k] / 16);
5567 
5568 	}
5569 
5570 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5571 		ReadBandwidth = ReadBandwidth + ReadBandwidthLuma[k] + ReadBandwidthChroma[k];
5572 	}
5573 
5574 	*DCFCLKDeepSleep = dml_max(8.0, ReadBandwidth / ReturnBusWidth);
5575 
5576 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5577 		*DCFCLKDeepSleep = dml_max(*DCFCLKDeepSleep, mode_lib->vba.DCFCLKDeepSleepPerPlane[k]);
5578 	}
5579 }
5580 
5581 static void CalculateUrgentBurstFactor(
5582 		long swath_width_luma_ub,
5583 		long swath_width_chroma_ub,
5584 		unsigned int DETBufferSizeInKByte,
5585 		unsigned int SwathHeightY,
5586 		unsigned int SwathHeightC,
5587 		double LineTime,
5588 		double UrgentLatency,
5589 		double CursorBufferSize,
5590 		unsigned int CursorWidth,
5591 		unsigned int CursorBPP,
5592 		double VRatio,
5593 		double VRatioC,
5594 		double BytePerPixelInDETY,
5595 		double BytePerPixelInDETC,
5596 		double DETBufferSizeY,
5597 		double DETBufferSizeC,
5598 		double *UrgentBurstFactorCursor,
5599 		double *UrgentBurstFactorLuma,
5600 		double *UrgentBurstFactorChroma,
5601 		bool *NotEnoughUrgentLatencyHiding)
5602 {
5603 	double LinesInDETLuma = 0;
5604 	double LinesInDETChroma = 0;
5605 	unsigned int LinesInCursorBuffer = 0;
5606 	double CursorBufferSizeInTime = 0;
5607 	double DETBufferSizeInTimeLuma = 0;
5608 	double DETBufferSizeInTimeChroma = 0;
5609 
5610 	*NotEnoughUrgentLatencyHiding = 0;
5611 
5612 	if (CursorWidth > 0) {
5613 		LinesInCursorBuffer = 1 << (unsigned int) dml_floor(dml_log2(CursorBufferSize * 1024.0 / (CursorWidth * CursorBPP / 8.0)), 1.0);
5614 		if (VRatio > 0) {
5615 			CursorBufferSizeInTime = LinesInCursorBuffer * LineTime / VRatio;
5616 			if (CursorBufferSizeInTime - UrgentLatency <= 0) {
5617 				*NotEnoughUrgentLatencyHiding = 1;
5618 				*UrgentBurstFactorCursor = 0;
5619 			} else {
5620 				*UrgentBurstFactorCursor = CursorBufferSizeInTime / (CursorBufferSizeInTime - UrgentLatency);
5621 			}
5622 		} else {
5623 			*UrgentBurstFactorCursor = 1;
5624 		}
5625 	}
5626 
5627 	LinesInDETLuma = DETBufferSizeY / BytePerPixelInDETY / swath_width_luma_ub;
5628 	if (VRatio > 0) {
5629 		DETBufferSizeInTimeLuma = dml_floor(LinesInDETLuma, SwathHeightY) * LineTime / VRatio;
5630 		if (DETBufferSizeInTimeLuma - UrgentLatency <= 0) {
5631 			*NotEnoughUrgentLatencyHiding = 1;
5632 			*UrgentBurstFactorLuma = 0;
5633 		} else {
5634 			*UrgentBurstFactorLuma = DETBufferSizeInTimeLuma / (DETBufferSizeInTimeLuma - UrgentLatency);
5635 		}
5636 	} else {
5637 		*UrgentBurstFactorLuma = 1;
5638 	}
5639 
5640 	if (BytePerPixelInDETC > 0) {
5641 		LinesInDETChroma = DETBufferSizeC / BytePerPixelInDETC / swath_width_chroma_ub;
5642 		if (VRatio > 0) {
5643 			DETBufferSizeInTimeChroma = dml_floor(LinesInDETChroma, SwathHeightC) * LineTime / VRatio;
5644 			if (DETBufferSizeInTimeChroma - UrgentLatency <= 0) {
5645 				*NotEnoughUrgentLatencyHiding = 1;
5646 				*UrgentBurstFactorChroma = 0;
5647 			} else {
5648 				*UrgentBurstFactorChroma = DETBufferSizeInTimeChroma / (DETBufferSizeInTimeChroma - UrgentLatency);
5649 			}
5650 		} else {
5651 			*UrgentBurstFactorChroma = 1;
5652 		}
5653 	}
5654 }
5655 
5656 static void CalculatePixelDeliveryTimes(
5657 		unsigned int NumberOfActivePlanes,
5658 		double VRatio[],
5659 		double VRatioChroma[],
5660 		double VRatioPrefetchY[],
5661 		double VRatioPrefetchC[],
5662 		unsigned int swath_width_luma_ub[],
5663 		unsigned int swath_width_chroma_ub[],
5664 		unsigned int DPPPerPlane[],
5665 		double HRatio[],
5666 		double HRatioChroma[],
5667 		double PixelClock[],
5668 		double PSCL_THROUGHPUT[],
5669 		double PSCL_THROUGHPUT_CHROMA[],
5670 		double DPPCLK[],
5671 		int BytePerPixelC[],
5672 		enum scan_direction_class SourceScan[],
5673 		unsigned int NumberOfCursors[],
5674 		unsigned int CursorWidth[][2],
5675 		unsigned int CursorBPP[][2],
5676 		unsigned int BlockWidth256BytesY[],
5677 		unsigned int BlockHeight256BytesY[],
5678 		unsigned int BlockWidth256BytesC[],
5679 		unsigned int BlockHeight256BytesC[],
5680 		double DisplayPipeLineDeliveryTimeLuma[],
5681 		double DisplayPipeLineDeliveryTimeChroma[],
5682 		double DisplayPipeLineDeliveryTimeLumaPrefetch[],
5683 		double DisplayPipeLineDeliveryTimeChromaPrefetch[],
5684 		double DisplayPipeRequestDeliveryTimeLuma[],
5685 		double DisplayPipeRequestDeliveryTimeChroma[],
5686 		double DisplayPipeRequestDeliveryTimeLumaPrefetch[],
5687 		double DisplayPipeRequestDeliveryTimeChromaPrefetch[],
5688 		double CursorRequestDeliveryTime[],
5689 		double CursorRequestDeliveryTimePrefetch[])
5690 {
5691 	double req_per_swath_ub = 0;
5692 	unsigned int k;
5693 
5694 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5695 		if (VRatio[k] <= 1) {
5696 			DisplayPipeLineDeliveryTimeLuma[k] = swath_width_luma_ub[k] * DPPPerPlane[k] / HRatio[k] / PixelClock[k];
5697 		} else {
5698 			DisplayPipeLineDeliveryTimeLuma[k] = swath_width_luma_ub[k] / PSCL_THROUGHPUT[k] / DPPCLK[k];
5699 		}
5700 
5701 		if (BytePerPixelC[k] == 0) {
5702 			DisplayPipeLineDeliveryTimeChroma[k] = 0;
5703 		} else {
5704 			if (VRatioChroma[k] <= 1) {
5705 				DisplayPipeLineDeliveryTimeChroma[k] = swath_width_chroma_ub[k] * DPPPerPlane[k] / HRatioChroma[k] / PixelClock[k];
5706 			} else {
5707 				DisplayPipeLineDeliveryTimeChroma[k] = swath_width_chroma_ub[k] / PSCL_THROUGHPUT_CHROMA[k] / DPPCLK[k];
5708 			}
5709 		}
5710 
5711 		if (VRatioPrefetchY[k] <= 1) {
5712 			DisplayPipeLineDeliveryTimeLumaPrefetch[k] = swath_width_luma_ub[k] * DPPPerPlane[k] / HRatio[k] / PixelClock[k];
5713 		} else {
5714 			DisplayPipeLineDeliveryTimeLumaPrefetch[k] = swath_width_luma_ub[k] / PSCL_THROUGHPUT[k] / DPPCLK[k];
5715 		}
5716 
5717 		if (BytePerPixelC[k] == 0) {
5718 			DisplayPipeLineDeliveryTimeChromaPrefetch[k] = 0;
5719 		} else {
5720 			if (VRatioPrefetchC[k] <= 1) {
5721 				DisplayPipeLineDeliveryTimeChromaPrefetch[k] = swath_width_chroma_ub[k] * DPPPerPlane[k] / HRatioChroma[k] / PixelClock[k];
5722 			} else {
5723 				DisplayPipeLineDeliveryTimeChromaPrefetch[k] = swath_width_chroma_ub[k] / PSCL_THROUGHPUT_CHROMA[k] / DPPCLK[k];
5724 			}
5725 		}
5726 	}
5727 
5728 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5729 		if (SourceScan[k] != dm_vert) {
5730 			req_per_swath_ub = swath_width_luma_ub[k] / BlockWidth256BytesY[k];
5731 		} else {
5732 			req_per_swath_ub = swath_width_luma_ub[k] / BlockHeight256BytesY[k];
5733 		}
5734 		DisplayPipeRequestDeliveryTimeLuma[k] = DisplayPipeLineDeliveryTimeLuma[k] / req_per_swath_ub;
5735 		DisplayPipeRequestDeliveryTimeLumaPrefetch[k] = DisplayPipeLineDeliveryTimeLumaPrefetch[k] / req_per_swath_ub;
5736 		if (BytePerPixelC[k] == 0) {
5737 			DisplayPipeRequestDeliveryTimeChroma[k] = 0;
5738 			DisplayPipeRequestDeliveryTimeChromaPrefetch[k] = 0;
5739 		} else {
5740 			if (SourceScan[k] != dm_vert) {
5741 				req_per_swath_ub = swath_width_chroma_ub[k] / BlockWidth256BytesC[k];
5742 			} else {
5743 				req_per_swath_ub = swath_width_chroma_ub[k] / BlockHeight256BytesC[k];
5744 			}
5745 			DisplayPipeRequestDeliveryTimeChroma[k] = DisplayPipeLineDeliveryTimeChroma[k] / req_per_swath_ub;
5746 			DisplayPipeRequestDeliveryTimeChromaPrefetch[k] = DisplayPipeLineDeliveryTimeChromaPrefetch[k] / req_per_swath_ub;
5747 		}
5748 	}
5749 
5750 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5751 		int cursor_req_per_width = 0;
5752 		cursor_req_per_width = dml_ceil(CursorWidth[k][0] * CursorBPP[k][0] / 256 / 8, 1);
5753 		if (NumberOfCursors[k] > 0) {
5754 			if (VRatio[k] <= 1) {
5755 				CursorRequestDeliveryTime[k] = CursorWidth[k][0] / HRatio[k] / PixelClock[k] / cursor_req_per_width;
5756 			} else {
5757 				CursorRequestDeliveryTime[k] = CursorWidth[k][0] / PSCL_THROUGHPUT[k] / DPPCLK[k] / cursor_req_per_width;
5758 			}
5759 			if (VRatioPrefetchY[k] <= 1) {
5760 				CursorRequestDeliveryTimePrefetch[k] = CursorWidth[k][0] / HRatio[k] / PixelClock[k] / cursor_req_per_width;
5761 			} else {
5762 				CursorRequestDeliveryTimePrefetch[k] = CursorWidth[k][0] / PSCL_THROUGHPUT[k] / DPPCLK[k] / cursor_req_per_width;
5763 			}
5764 		} else {
5765 			CursorRequestDeliveryTime[k] = 0;
5766 			CursorRequestDeliveryTimePrefetch[k] = 0;
5767 		}
5768 	}
5769 }
5770 
5771 static void CalculateMetaAndPTETimes(
5772 		int NumberOfActivePlanes,
5773 		bool GPUVMEnable,
5774 		int MetaChunkSize,
5775 		int MinMetaChunkSizeBytes,
5776 		int HTotal[],
5777 		double VRatio[],
5778 		double VRatioChroma[],
5779 		double DestinationLinesToRequestRowInVBlank[],
5780 		double DestinationLinesToRequestRowInImmediateFlip[],
5781 		bool DCCEnable[],
5782 		double PixelClock[],
5783 		int BytePerPixelY[],
5784 		int BytePerPixelC[],
5785 		enum scan_direction_class SourceScan[],
5786 		int dpte_row_height[],
5787 		int dpte_row_height_chroma[],
5788 		int meta_row_width[],
5789 		int meta_row_width_chroma[],
5790 		int meta_row_height[],
5791 		int meta_row_height_chroma[],
5792 		int meta_req_width[],
5793 		int meta_req_width_chroma[],
5794 		int meta_req_height[],
5795 		int meta_req_height_chroma[],
5796 		int dpte_group_bytes[],
5797 		int PTERequestSizeY[],
5798 		int PTERequestSizeC[],
5799 		int PixelPTEReqWidthY[],
5800 		int PixelPTEReqHeightY[],
5801 		int PixelPTEReqWidthC[],
5802 		int PixelPTEReqHeightC[],
5803 		int dpte_row_width_luma_ub[],
5804 		int dpte_row_width_chroma_ub[],
5805 		double DST_Y_PER_PTE_ROW_NOM_L[],
5806 		double DST_Y_PER_PTE_ROW_NOM_C[],
5807 		double DST_Y_PER_META_ROW_NOM_L[],
5808 		double DST_Y_PER_META_ROW_NOM_C[],
5809 		double TimePerMetaChunkNominal[],
5810 		double TimePerChromaMetaChunkNominal[],
5811 		double TimePerMetaChunkVBlank[],
5812 		double TimePerChromaMetaChunkVBlank[],
5813 		double TimePerMetaChunkFlip[],
5814 		double TimePerChromaMetaChunkFlip[],
5815 		double time_per_pte_group_nom_luma[],
5816 		double time_per_pte_group_vblank_luma[],
5817 		double time_per_pte_group_flip_luma[],
5818 		double time_per_pte_group_nom_chroma[],
5819 		double time_per_pte_group_vblank_chroma[],
5820 		double time_per_pte_group_flip_chroma[])
5821 {
5822 	unsigned int meta_chunk_width = 0;
5823 	unsigned int min_meta_chunk_width = 0;
5824 	unsigned int meta_chunk_per_row_int = 0;
5825 	unsigned int meta_row_remainder = 0;
5826 	unsigned int meta_chunk_threshold = 0;
5827 	unsigned int meta_chunks_per_row_ub = 0;
5828 	unsigned int meta_chunk_width_chroma = 0;
5829 	unsigned int min_meta_chunk_width_chroma = 0;
5830 	unsigned int meta_chunk_per_row_int_chroma = 0;
5831 	unsigned int meta_row_remainder_chroma = 0;
5832 	unsigned int meta_chunk_threshold_chroma = 0;
5833 	unsigned int meta_chunks_per_row_ub_chroma = 0;
5834 	unsigned int dpte_group_width_luma = 0;
5835 	unsigned int dpte_groups_per_row_luma_ub = 0;
5836 	unsigned int dpte_group_width_chroma = 0;
5837 	unsigned int dpte_groups_per_row_chroma_ub = 0;
5838 	unsigned int k;
5839 
5840 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5841 		DST_Y_PER_PTE_ROW_NOM_L[k] = dpte_row_height[k] / VRatio[k];
5842 		if (BytePerPixelC[k] == 0) {
5843 			DST_Y_PER_PTE_ROW_NOM_C[k] = 0;
5844 		} else {
5845 			DST_Y_PER_PTE_ROW_NOM_C[k] = dpte_row_height_chroma[k] / VRatioChroma[k];
5846 		}
5847 		DST_Y_PER_META_ROW_NOM_L[k] = meta_row_height[k] / VRatio[k];
5848 		if (BytePerPixelC[k] == 0) {
5849 			DST_Y_PER_META_ROW_NOM_C[k] = 0;
5850 		} else {
5851 			DST_Y_PER_META_ROW_NOM_C[k] = meta_row_height_chroma[k] / VRatioChroma[k];
5852 		}
5853 	}
5854 
5855 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5856 		if (DCCEnable[k] == true) {
5857 			meta_chunk_width = MetaChunkSize * 1024 * 256 / BytePerPixelY[k] / meta_row_height[k];
5858 			min_meta_chunk_width = MinMetaChunkSizeBytes * 256 / BytePerPixelY[k] / meta_row_height[k];
5859 			meta_chunk_per_row_int = meta_row_width[k] / meta_chunk_width;
5860 			meta_row_remainder = meta_row_width[k] % meta_chunk_width;
5861 			if (SourceScan[k] != dm_vert) {
5862 				meta_chunk_threshold = 2 * min_meta_chunk_width - meta_req_width[k];
5863 			} else {
5864 				meta_chunk_threshold = 2 * min_meta_chunk_width - meta_req_height[k];
5865 			}
5866 			if (meta_row_remainder <= meta_chunk_threshold) {
5867 				meta_chunks_per_row_ub = meta_chunk_per_row_int + 1;
5868 			} else {
5869 				meta_chunks_per_row_ub = meta_chunk_per_row_int + 2;
5870 			}
5871 			TimePerMetaChunkNominal[k] = meta_row_height[k] / VRatio[k] * HTotal[k] / PixelClock[k] / meta_chunks_per_row_ub;
5872 			TimePerMetaChunkVBlank[k] = DestinationLinesToRequestRowInVBlank[k] * HTotal[k] / PixelClock[k] / meta_chunks_per_row_ub;
5873 			TimePerMetaChunkFlip[k] = DestinationLinesToRequestRowInImmediateFlip[k] * HTotal[k] / PixelClock[k] / meta_chunks_per_row_ub;
5874 			if (BytePerPixelC[k] == 0) {
5875 				TimePerChromaMetaChunkNominal[k] = 0;
5876 				TimePerChromaMetaChunkVBlank[k] = 0;
5877 				TimePerChromaMetaChunkFlip[k] = 0;
5878 			} else {
5879 				meta_chunk_width_chroma = MetaChunkSize * 1024 * 256 / BytePerPixelC[k] / meta_row_height_chroma[k];
5880 				min_meta_chunk_width_chroma = MinMetaChunkSizeBytes * 256 / BytePerPixelC[k] / meta_row_height_chroma[k];
5881 				meta_chunk_per_row_int_chroma = (double) meta_row_width_chroma[k] / meta_chunk_width_chroma;
5882 				meta_row_remainder_chroma = meta_row_width_chroma[k] % meta_chunk_width_chroma;
5883 				if (SourceScan[k] != dm_vert) {
5884 					meta_chunk_threshold_chroma = 2 * min_meta_chunk_width_chroma - meta_req_width_chroma[k];
5885 				} else {
5886 					meta_chunk_threshold_chroma = 2 * min_meta_chunk_width_chroma - meta_req_height_chroma[k];
5887 				}
5888 				if (meta_row_remainder_chroma <= meta_chunk_threshold_chroma) {
5889 					meta_chunks_per_row_ub_chroma = meta_chunk_per_row_int_chroma + 1;
5890 				} else {
5891 					meta_chunks_per_row_ub_chroma = meta_chunk_per_row_int_chroma + 2;
5892 				}
5893 				TimePerChromaMetaChunkNominal[k] = meta_row_height_chroma[k] / VRatioChroma[k] * HTotal[k] / PixelClock[k] / meta_chunks_per_row_ub_chroma;
5894 				TimePerChromaMetaChunkVBlank[k] = DestinationLinesToRequestRowInVBlank[k] * HTotal[k] / PixelClock[k] / meta_chunks_per_row_ub_chroma;
5895 				TimePerChromaMetaChunkFlip[k] = DestinationLinesToRequestRowInImmediateFlip[k] * HTotal[k] / PixelClock[k] / meta_chunks_per_row_ub_chroma;
5896 			}
5897 		} else {
5898 			TimePerMetaChunkNominal[k] = 0;
5899 			TimePerMetaChunkVBlank[k] = 0;
5900 			TimePerMetaChunkFlip[k] = 0;
5901 			TimePerChromaMetaChunkNominal[k] = 0;
5902 			TimePerChromaMetaChunkVBlank[k] = 0;
5903 			TimePerChromaMetaChunkFlip[k] = 0;
5904 		}
5905 	}
5906 
5907 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5908 		if (GPUVMEnable == true) {
5909 			if (SourceScan[k] != dm_vert) {
5910 				dpte_group_width_luma = dpte_group_bytes[k] / PTERequestSizeY[k] * PixelPTEReqWidthY[k];
5911 			} else {
5912 				dpte_group_width_luma = dpte_group_bytes[k] / PTERequestSizeY[k] * PixelPTEReqHeightY[k];
5913 			}
5914 			dpte_groups_per_row_luma_ub = dml_ceil(1.0 * dpte_row_width_luma_ub[k] / dpte_group_width_luma, 1);
5915 			time_per_pte_group_nom_luma[k] = DST_Y_PER_PTE_ROW_NOM_L[k] * HTotal[k] / PixelClock[k] / dpte_groups_per_row_luma_ub;
5916 			time_per_pte_group_vblank_luma[k] = DestinationLinesToRequestRowInVBlank[k] * HTotal[k] / PixelClock[k] / dpte_groups_per_row_luma_ub;
5917 			time_per_pte_group_flip_luma[k] = DestinationLinesToRequestRowInImmediateFlip[k] * HTotal[k] / PixelClock[k] / dpte_groups_per_row_luma_ub;
5918 			if (BytePerPixelC[k] == 0) {
5919 				time_per_pte_group_nom_chroma[k] = 0;
5920 				time_per_pte_group_vblank_chroma[k] = 0;
5921 				time_per_pte_group_flip_chroma[k] = 0;
5922 			} else {
5923 				if (SourceScan[k] != dm_vert) {
5924 					dpte_group_width_chroma = dpte_group_bytes[k] / PTERequestSizeC[k] * PixelPTEReqWidthC[k];
5925 				} else {
5926 					dpte_group_width_chroma = dpte_group_bytes[k] / PTERequestSizeC[k] * PixelPTEReqHeightC[k];
5927 				}
5928 				dpte_groups_per_row_chroma_ub = dml_ceil(1.0 * dpte_row_width_chroma_ub[k] / dpte_group_width_chroma, 1);
5929 				time_per_pte_group_nom_chroma[k] = DST_Y_PER_PTE_ROW_NOM_C[k] * HTotal[k] / PixelClock[k] / dpte_groups_per_row_chroma_ub;
5930 				time_per_pte_group_vblank_chroma[k] = DestinationLinesToRequestRowInVBlank[k] * HTotal[k] / PixelClock[k] / dpte_groups_per_row_chroma_ub;
5931 				time_per_pte_group_flip_chroma[k] = DestinationLinesToRequestRowInImmediateFlip[k] * HTotal[k] / PixelClock[k] / dpte_groups_per_row_chroma_ub;
5932 			}
5933 		} else {
5934 			time_per_pte_group_nom_luma[k] = 0;
5935 			time_per_pte_group_vblank_luma[k] = 0;
5936 			time_per_pte_group_flip_luma[k] = 0;
5937 			time_per_pte_group_nom_chroma[k] = 0;
5938 			time_per_pte_group_vblank_chroma[k] = 0;
5939 			time_per_pte_group_flip_chroma[k] = 0;
5940 		}
5941 	}
5942 }
5943 
5944 static void CalculateVMGroupAndRequestTimes(
5945 		unsigned int NumberOfActivePlanes,
5946 		bool GPUVMEnable,
5947 		unsigned int GPUVMMaxPageTableLevels,
5948 		unsigned int HTotal[],
5949 		int BytePerPixelC[],
5950 		double DestinationLinesToRequestVMInVBlank[],
5951 		double DestinationLinesToRequestVMInImmediateFlip[],
5952 		bool DCCEnable[],
5953 		double PixelClock[],
5954 		int dpte_row_width_luma_ub[],
5955 		int dpte_row_width_chroma_ub[],
5956 		int vm_group_bytes[],
5957 		unsigned int dpde0_bytes_per_frame_ub_l[],
5958 		unsigned int dpde0_bytes_per_frame_ub_c[],
5959 		int meta_pte_bytes_per_frame_ub_l[],
5960 		int meta_pte_bytes_per_frame_ub_c[],
5961 		double TimePerVMGroupVBlank[],
5962 		double TimePerVMGroupFlip[],
5963 		double TimePerVMRequestVBlank[],
5964 		double TimePerVMRequestFlip[])
5965 {
5966 	int num_group_per_lower_vm_stage = 0;
5967 	int num_req_per_lower_vm_stage = 0;
5968 	unsigned int k;
5969 
5970 	for (k = 0; k < NumberOfActivePlanes; ++k) {
5971 		if (GPUVMEnable == true && (DCCEnable[k] == true || GPUVMMaxPageTableLevels > 1)) {
5972 			if (DCCEnable[k] == false) {
5973 				if (BytePerPixelC[k] > 0) {
5974 					num_group_per_lower_vm_stage = dml_ceil((double) (dpde0_bytes_per_frame_ub_l[k])
5975 						/ (double) (vm_group_bytes[k]), 1) + dml_ceil((double) (dpde0_bytes_per_frame_ub_c[k])
5976 									/ (double) (vm_group_bytes[k]), 1);
5977 				} else {
5978 					num_group_per_lower_vm_stage = dml_ceil((double) (dpde0_bytes_per_frame_ub_l[k])
5979 							/ (double) (vm_group_bytes[k]), 1);
5980 				}
5981 			} else {
5982 				if (GPUVMMaxPageTableLevels == 1) {
5983 					if (BytePerPixelC[k] > 0) {
5984 						num_group_per_lower_vm_stage = dml_ceil((double) (meta_pte_bytes_per_frame_ub_l[k])
5985 							/ (double) (vm_group_bytes[k]), 1) + dml_ceil((double) (meta_pte_bytes_per_frame_ub_c[k])
5986 									/ (double) (vm_group_bytes[k]), 1);
5987 					} else {
5988 						num_group_per_lower_vm_stage = dml_ceil((double) (meta_pte_bytes_per_frame_ub_l[k])
5989 							/ (double) (vm_group_bytes[k]), 1);
5990 					}
5991 				} else {
5992 					if (BytePerPixelC[k] > 0) {
5993 						num_group_per_lower_vm_stage = 2 + dml_ceil((double) (dpde0_bytes_per_frame_ub_l[k]) / (double) (vm_group_bytes[k]), 1)
5994 								+ dml_ceil((double) (dpde0_bytes_per_frame_ub_c[k]) / (double) (vm_group_bytes[k]), 1)
5995 								+ dml_ceil((double) (meta_pte_bytes_per_frame_ub_l[k]) / (double) (vm_group_bytes[k]), 1)
5996 								+ dml_ceil((double) (meta_pte_bytes_per_frame_ub_c[k]) / (double) (vm_group_bytes[k]), 1);
5997 					} else {
5998 						num_group_per_lower_vm_stage = 1 + dml_ceil((double) (dpde0_bytes_per_frame_ub_l[k]) / (double) (vm_group_bytes[k]), 1)
5999 								+ dml_ceil((double) (meta_pte_bytes_per_frame_ub_l[k]) / (double) (vm_group_bytes[k]), 1);
6000 					}
6001 				}
6002 			}
6003 
6004 			if (DCCEnable[k] == false) {
6005 				if (BytePerPixelC[k] > 0) {
6006 					num_req_per_lower_vm_stage = dpde0_bytes_per_frame_ub_l[k] / 64 + dpde0_bytes_per_frame_ub_c[k] / 64;
6007 				} else {
6008 					num_req_per_lower_vm_stage = dpde0_bytes_per_frame_ub_l[k] / 64;
6009 				}
6010 			} else {
6011 				if (GPUVMMaxPageTableLevels == 1) {
6012 					if (BytePerPixelC[k] > 0) {
6013 						num_req_per_lower_vm_stage = meta_pte_bytes_per_frame_ub_l[k] / 64
6014 								+ meta_pte_bytes_per_frame_ub_c[k] / 64;
6015 					} else {
6016 						num_req_per_lower_vm_stage = meta_pte_bytes_per_frame_ub_l[k] / 64;
6017 					}
6018 				} else {
6019 					if (BytePerPixelC[k] > 0) {
6020 						num_req_per_lower_vm_stage = dpde0_bytes_per_frame_ub_l[k] / 64
6021 							+ dpde0_bytes_per_frame_ub_c[k] / 64 + meta_pte_bytes_per_frame_ub_l[k]
6022 									/ 64 + meta_pte_bytes_per_frame_ub_c[k] / 64;
6023 					} else {
6024 						num_req_per_lower_vm_stage = dpde0_bytes_per_frame_ub_l[k] / 64
6025 								+ meta_pte_bytes_per_frame_ub_l[k] / 64;
6026 					}
6027 				}
6028 			}
6029 
6030 			TimePerVMGroupVBlank[k] = DestinationLinesToRequestVMInVBlank[k] * HTotal[k] / PixelClock[k]
6031 					/ num_group_per_lower_vm_stage;
6032 			TimePerVMGroupFlip[k] = DestinationLinesToRequestVMInImmediateFlip[k] * HTotal[k] / PixelClock[k]
6033 					/ num_group_per_lower_vm_stage;
6034 			TimePerVMRequestVBlank[k] = DestinationLinesToRequestVMInVBlank[k] * HTotal[k] / PixelClock[k]
6035 					/ num_req_per_lower_vm_stage;
6036 			TimePerVMRequestFlip[k] = DestinationLinesToRequestVMInImmediateFlip[k] * HTotal[k] / PixelClock[k]
6037 					/ num_req_per_lower_vm_stage;
6038 
6039 			if (GPUVMMaxPageTableLevels > 2) {
6040 				TimePerVMGroupVBlank[k] = TimePerVMGroupVBlank[k] / 2;
6041 				TimePerVMGroupFlip[k] = TimePerVMGroupFlip[k] / 2;
6042 				TimePerVMRequestVBlank[k] = TimePerVMRequestVBlank[k] / 2;
6043 				TimePerVMRequestFlip[k] = TimePerVMRequestFlip[k] / 2;
6044 			}
6045 
6046 		} else {
6047 			TimePerVMGroupVBlank[k] = 0;
6048 			TimePerVMGroupFlip[k] = 0;
6049 			TimePerVMRequestVBlank[k] = 0;
6050 			TimePerVMRequestFlip[k] = 0;
6051 		}
6052 	}
6053 }
6054 
6055 static void CalculateStutterEfficiency(
6056 		int NumberOfActivePlanes,
6057 		long ROBBufferSizeInKByte,
6058 		double TotalDataReadBandwidth,
6059 		double DCFCLK,
6060 		double ReturnBW,
6061 		double SRExitTime,
6062 		bool SynchronizedVBlank,
6063 		int DPPPerPlane[],
6064 		unsigned int DETBufferSizeY[],
6065 		int BytePerPixelY[],
6066 		double BytePerPixelDETY[],
6067 		double SwathWidthY[],
6068 		int SwathHeightY[],
6069 		int SwathHeightC[],
6070 		double DCCRateLuma[],
6071 		double DCCRateChroma[],
6072 		int HTotal[],
6073 		int VTotal[],
6074 		double PixelClock[],
6075 		double VRatio[],
6076 		enum scan_direction_class SourceScan[],
6077 		int BlockHeight256BytesY[],
6078 		int BlockWidth256BytesY[],
6079 		int BlockHeight256BytesC[],
6080 		int BlockWidth256BytesC[],
6081 		int DCCYMaxUncompressedBlock[],
6082 		int DCCCMaxUncompressedBlock[],
6083 		int VActive[],
6084 		bool DCCEnable[],
6085 		bool WritebackEnable[],
6086 		double ReadBandwidthPlaneLuma[],
6087 		double ReadBandwidthPlaneChroma[],
6088 		double meta_row_bw[],
6089 		double dpte_row_bw[],
6090 		double *StutterEfficiencyNotIncludingVBlank,
6091 		double *StutterEfficiency,
6092 		double *StutterPeriodOut)
6093 {
6094 	double FullDETBufferingTimeY[DC__NUM_DPP__MAX] = { 0 };
6095 	double FrameTimeForMinFullDETBufferingTime = 0;
6096 	double StutterPeriod = 0;
6097 	double AverageReadBandwidth = 0;
6098 	double TotalRowReadBandwidth = 0;
6099 	double AverageDCCCompressionRate = 0;
6100 	double PartOfBurstThatFitsInROB = 0;
6101 	double StutterBurstTime = 0;
6102 	int TotalActiveWriteback = 0;
6103 	double VBlankTime = 0;
6104 	double SmallestVBlank = 0;
6105 	int BytePerPixelYCriticalPlane = 0;
6106 	double SwathWidthYCriticalPlane = 0;
6107 	double LinesInDETY[DC__NUM_DPP__MAX] = { 0 };
6108 	double LinesInDETYRoundedDownToSwath[DC__NUM_DPP__MAX] = { 0 };
6109 	double LinesToFinishSwathTransferStutterCriticalPlane = 0;
6110 	double MaximumEffectiveCompressionLuma = 0;
6111 	double    MaximumEffectiveCompressionChroma = 0;
6112 	unsigned int k;
6113 
6114 	for (k = 0; k < NumberOfActivePlanes; ++k) {
6115 		LinesInDETY[k] = DETBufferSizeY[k] / BytePerPixelDETY[k] / SwathWidthY[k];
6116 		LinesInDETYRoundedDownToSwath[k] = dml_floor(LinesInDETY[k], SwathHeightY[k]);
6117 		FullDETBufferingTimeY[k] = LinesInDETYRoundedDownToSwath[k] * (HTotal[k] / PixelClock[k]) / VRatio[k];
6118 	}
6119 
6120 	StutterPeriod = FullDETBufferingTimeY[0];
6121 	FrameTimeForMinFullDETBufferingTime = VTotal[0] * HTotal[0] / PixelClock[0];
6122 	BytePerPixelYCriticalPlane = BytePerPixelY[0];
6123 	SwathWidthYCriticalPlane = SwathWidthY[0];
6124 	LinesToFinishSwathTransferStutterCriticalPlane = SwathHeightY[0]
6125 			- (LinesInDETY[0] - LinesInDETYRoundedDownToSwath[0]);
6126 
6127 	for (k = 0; k < NumberOfActivePlanes; ++k) {
6128 		if (FullDETBufferingTimeY[k] < StutterPeriod) {
6129 			StutterPeriod = FullDETBufferingTimeY[k];
6130 			FrameTimeForMinFullDETBufferingTime = VTotal[k] * HTotal[k] / PixelClock[k];
6131 			BytePerPixelYCriticalPlane = BytePerPixelY[k];
6132 			SwathWidthYCriticalPlane = SwathWidthY[k];
6133 			LinesToFinishSwathTransferStutterCriticalPlane = SwathHeightY[k]
6134 					- (LinesInDETY[k] - LinesInDETYRoundedDownToSwath[k]);
6135 		}
6136 	}
6137 
6138 	AverageReadBandwidth = 0;
6139 	TotalRowReadBandwidth = 0;
6140 	for (k = 0; k < NumberOfActivePlanes; ++k) {
6141 		if (DCCEnable[k] == true) {
6142 			if ((SourceScan[k] == dm_vert && BlockWidth256BytesY[k] > SwathHeightY[k])
6143 					|| (SourceScan[k] != dm_vert
6144 							&& BlockHeight256BytesY[k] > SwathHeightY[k])
6145 					|| DCCYMaxUncompressedBlock[k] < 256) {
6146 				MaximumEffectiveCompressionLuma = 2;
6147 			} else {
6148 				MaximumEffectiveCompressionLuma = 4;
6149 			}
6150 			AverageReadBandwidth = AverageReadBandwidth + ReadBandwidthPlaneLuma[k] / dml_min(DCCRateLuma[k], MaximumEffectiveCompressionLuma);
6151 
6152 			if (ReadBandwidthPlaneChroma[k] > 0) {
6153 				if ((SourceScan[k] == dm_vert && BlockWidth256BytesC[k] > SwathHeightC[k])
6154 						|| (SourceScan[k] != dm_vert && BlockHeight256BytesC[k] > SwathHeightC[k])
6155 						|| DCCCMaxUncompressedBlock[k] < 256) {
6156 					MaximumEffectiveCompressionChroma = 2;
6157 				} else {
6158 					MaximumEffectiveCompressionChroma = 4;
6159 				}
6160 				AverageReadBandwidth = AverageReadBandwidth + ReadBandwidthPlaneChroma[k] / dml_min(DCCRateChroma[k], MaximumEffectiveCompressionChroma);
6161 			}
6162 		} else {
6163 			AverageReadBandwidth = AverageReadBandwidth + ReadBandwidthPlaneLuma[k] + ReadBandwidthPlaneChroma[k];
6164 		}
6165 		TotalRowReadBandwidth = TotalRowReadBandwidth + DPPPerPlane[k] * (meta_row_bw[k] + dpte_row_bw[k]);
6166 	}
6167 
6168 	AverageDCCCompressionRate = TotalDataReadBandwidth / AverageReadBandwidth;
6169 	PartOfBurstThatFitsInROB = dml_min(StutterPeriod * TotalDataReadBandwidth, ROBBufferSizeInKByte * 1024 * AverageDCCCompressionRate);
6170 	StutterBurstTime = PartOfBurstThatFitsInROB / AverageDCCCompressionRate / ReturnBW + (StutterPeriod * TotalDataReadBandwidth
6171 			- PartOfBurstThatFitsInROB) / (DCFCLK * 64) + StutterPeriod * TotalRowReadBandwidth / ReturnBW;
6172 	StutterBurstTime = dml_max(StutterBurstTime, LinesToFinishSwathTransferStutterCriticalPlane * BytePerPixelYCriticalPlane * SwathWidthYCriticalPlane / ReturnBW);
6173 
6174 	TotalActiveWriteback = 0;
6175 	for (k = 0; k < NumberOfActivePlanes; ++k) {
6176 		if (WritebackEnable[k] == true) {
6177 			TotalActiveWriteback = TotalActiveWriteback + 1;
6178 		}
6179 	}
6180 
6181 	if (TotalActiveWriteback == 0) {
6182 		*StutterEfficiencyNotIncludingVBlank = (1
6183 				- (SRExitTime + StutterBurstTime) / StutterPeriod) * 100;
6184 	} else {
6185 		*StutterEfficiencyNotIncludingVBlank = 0;
6186 	}
6187 
6188 	if (SynchronizedVBlank == true || NumberOfActivePlanes == 1) {
6189 		SmallestVBlank = (VTotal[0] - VActive[0]) * HTotal[0] / PixelClock[0];
6190 	} else {
6191 		SmallestVBlank = 0;
6192 	}
6193 	for (k = 0; k < NumberOfActivePlanes; ++k) {
6194 		if (SynchronizedVBlank == true || NumberOfActivePlanes == 1) {
6195 			VBlankTime = (VTotal[k] - VActive[k]) * HTotal[k] / PixelClock[k];
6196 		} else {
6197 			VBlankTime = 0;
6198 		}
6199 		SmallestVBlank = dml_min(SmallestVBlank, VBlankTime);
6200 	}
6201 
6202 	*StutterEfficiency =  (*StutterEfficiencyNotIncludingVBlank / 100.0 * (FrameTimeForMinFullDETBufferingTime - SmallestVBlank) + SmallestVBlank) / FrameTimeForMinFullDETBufferingTime * 100;
6203 
6204 	if (StutterPeriodOut)
6205 		*StutterPeriodOut = StutterPeriod;
6206 }
6207 
6208 static void CalculateSwathAndDETConfiguration(
6209 		bool ForceSingleDPP,
6210 		int NumberOfActivePlanes,
6211 		unsigned int DETBufferSizeInKByte,
6212 		double MaximumSwathWidthLuma[],
6213 		double MaximumSwathWidthChroma[],
6214 		enum scan_direction_class SourceScan[],
6215 		enum source_format_class SourcePixelFormat[],
6216 		enum dm_swizzle_mode SurfaceTiling[],
6217 		int ViewportWidth[],
6218 		int ViewportHeight[],
6219 		int SurfaceWidthY[],
6220 		int SurfaceWidthC[],
6221 		int SurfaceHeightY[],
6222 		int SurfaceHeightC[],
6223 		int Read256BytesBlockHeightY[],
6224 		int Read256BytesBlockHeightC[],
6225 		int Read256BytesBlockWidthY[],
6226 		int Read256BytesBlockWidthC[],
6227 		enum odm_combine_mode ODMCombineEnabled[],
6228 		int BlendingAndTiming[],
6229 		int BytePerPixY[],
6230 		int BytePerPixC[],
6231 		double BytePerPixDETY[],
6232 		double BytePerPixDETC[],
6233 		int HActive[],
6234 		double HRatio[],
6235 		double HRatioChroma[],
6236 		int DPPPerPlane[],
6237 		int swath_width_luma_ub[],
6238 		int swath_width_chroma_ub[],
6239 		double SwathWidth[],
6240 		double SwathWidthChroma[],
6241 		int SwathHeightY[],
6242 		int SwathHeightC[],
6243 		unsigned int DETBufferSizeY[],
6244 		unsigned int DETBufferSizeC[],
6245 		bool ViewportSizeSupportPerPlane[],
6246 		bool *ViewportSizeSupport)
6247 {
6248 	int MaximumSwathHeightY[DC__NUM_DPP__MAX] = { 0 };
6249 	int MaximumSwathHeightC[DC__NUM_DPP__MAX] = { 0 };
6250 	int MinimumSwathHeightY = 0;
6251 	int MinimumSwathHeightC = 0;
6252 	long RoundedUpMaxSwathSizeBytesY = 0;
6253 	long RoundedUpMaxSwathSizeBytesC = 0;
6254 	long RoundedUpMinSwathSizeBytesY = 0;
6255 	long RoundedUpMinSwathSizeBytesC = 0;
6256 	long RoundedUpSwathSizeBytesY = 0;
6257 	long RoundedUpSwathSizeBytesC = 0;
6258 	double SwathWidthSingleDPP[DC__NUM_DPP__MAX] = { 0 };
6259 	double SwathWidthSingleDPPChroma[DC__NUM_DPP__MAX] = { 0 };
6260 	int k;
6261 
6262 	CalculateSwathWidth(
6263 			ForceSingleDPP,
6264 			NumberOfActivePlanes,
6265 			SourcePixelFormat,
6266 			SourceScan,
6267 			ViewportWidth,
6268 			ViewportHeight,
6269 			SurfaceWidthY,
6270 			SurfaceWidthC,
6271 			SurfaceHeightY,
6272 			SurfaceHeightC,
6273 			ODMCombineEnabled,
6274 			BytePerPixY,
6275 			BytePerPixC,
6276 			Read256BytesBlockHeightY,
6277 			Read256BytesBlockHeightC,
6278 			Read256BytesBlockWidthY,
6279 			Read256BytesBlockWidthC,
6280 			BlendingAndTiming,
6281 			HActive,
6282 			HRatio,
6283 			DPPPerPlane,
6284 			SwathWidthSingleDPP,
6285 			SwathWidthSingleDPPChroma,
6286 			SwathWidth,
6287 			SwathWidthChroma,
6288 			MaximumSwathHeightY,
6289 			MaximumSwathHeightC,
6290 			swath_width_luma_ub,
6291 			swath_width_chroma_ub);
6292 
6293 	*ViewportSizeSupport = true;
6294 	for (k = 0; k < NumberOfActivePlanes; ++k) {
6295 		if ((SourcePixelFormat[k] == dm_444_64 || SourcePixelFormat[k] == dm_444_32
6296 				|| SourcePixelFormat[k] == dm_444_16
6297 				|| SourcePixelFormat[k] == dm_mono_16
6298 				|| SourcePixelFormat[k] == dm_mono_8
6299 				|| SourcePixelFormat[k] == dm_rgbe)) {
6300 			if (SurfaceTiling[k] == dm_sw_linear
6301 				|| (SourcePixelFormat[k] == dm_444_64
6302 					&& (SurfaceTiling[k] == dm_sw_64kb_s || SurfaceTiling[k] == dm_sw_64kb_s_t || SurfaceTiling[k] == dm_sw_64kb_s_x)
6303 					&& SourceScan[k] != dm_vert)) {
6304 				MinimumSwathHeightY = MaximumSwathHeightY[k];
6305 			} else if (SourcePixelFormat[k] == dm_444_8 && SourceScan[k] == dm_vert) {
6306 				MinimumSwathHeightY = MaximumSwathHeightY[k];
6307 			} else {
6308 				MinimumSwathHeightY = MaximumSwathHeightY[k] / 2;
6309 			}
6310 			MinimumSwathHeightC = MaximumSwathHeightC[k];
6311 		} else {
6312 			if (SurfaceTiling[k] == dm_sw_linear) {
6313 				MinimumSwathHeightY = MaximumSwathHeightY[k];
6314 				MinimumSwathHeightC = MaximumSwathHeightC[k];
6315 			} else if (SourcePixelFormat[k] == dm_rgbe_alpha
6316 					&& SourceScan[k] == dm_vert) {
6317 				MinimumSwathHeightY = MaximumSwathHeightY[k] / 2;
6318 				MinimumSwathHeightC = MaximumSwathHeightC[k];
6319 			} else if (SourcePixelFormat[k] == dm_rgbe_alpha) {
6320 				MinimumSwathHeightY = MaximumSwathHeightY[k] / 2;
6321 				MinimumSwathHeightC = MaximumSwathHeightC[k] / 2;
6322 			} else if (SourcePixelFormat[k] == dm_420_8 && SourceScan[k] == dm_vert) {
6323 				MinimumSwathHeightY = MaximumSwathHeightY[k];
6324 				MinimumSwathHeightC = MaximumSwathHeightC[k] / 2;
6325 			} else {
6326 				MinimumSwathHeightC = MaximumSwathHeightC[k] / 2;
6327 				MinimumSwathHeightY = MaximumSwathHeightY[k] / 2;
6328 			}
6329 		}
6330 
6331 		RoundedUpMaxSwathSizeBytesY = swath_width_luma_ub[k] * BytePerPixDETY[k]
6332 				* MaximumSwathHeightY[k];
6333 		RoundedUpMinSwathSizeBytesY = swath_width_luma_ub[k] * BytePerPixDETY[k]
6334 				* MinimumSwathHeightY;
6335 		if (SourcePixelFormat[k] == dm_420_10) {
6336 			RoundedUpMaxSwathSizeBytesY = dml_ceil((double) RoundedUpMaxSwathSizeBytesY, 256);
6337 			RoundedUpMinSwathSizeBytesY = dml_ceil((double) RoundedUpMinSwathSizeBytesY, 256);
6338 		}
6339 		RoundedUpMaxSwathSizeBytesC = swath_width_chroma_ub[k] * BytePerPixDETC[k]
6340 				* MaximumSwathHeightC[k];
6341 		RoundedUpMinSwathSizeBytesC = swath_width_chroma_ub[k] * BytePerPixDETC[k]
6342 				* MinimumSwathHeightC;
6343 		if (SourcePixelFormat[k] == dm_420_10) {
6344 			RoundedUpMaxSwathSizeBytesC = dml_ceil(RoundedUpMaxSwathSizeBytesC, 256);
6345 			RoundedUpMinSwathSizeBytesC = dml_ceil(RoundedUpMinSwathSizeBytesC, 256);
6346 		}
6347 
6348 		if (RoundedUpMaxSwathSizeBytesY + RoundedUpMaxSwathSizeBytesC
6349 				<= DETBufferSizeInKByte * 1024 / 2) {
6350 			SwathHeightY[k] = MaximumSwathHeightY[k];
6351 			SwathHeightC[k] = MaximumSwathHeightC[k];
6352 			RoundedUpSwathSizeBytesY = RoundedUpMaxSwathSizeBytesY;
6353 			RoundedUpSwathSizeBytesC = RoundedUpMaxSwathSizeBytesC;
6354 		} else if (RoundedUpMaxSwathSizeBytesY >= 1.5 * RoundedUpMaxSwathSizeBytesC
6355 				&& RoundedUpMinSwathSizeBytesY + RoundedUpMaxSwathSizeBytesC
6356 						<= DETBufferSizeInKByte * 1024 / 2) {
6357 			SwathHeightY[k] = MinimumSwathHeightY;
6358 			SwathHeightC[k] = MaximumSwathHeightC[k];
6359 			RoundedUpSwathSizeBytesY = RoundedUpMinSwathSizeBytesY;
6360 			RoundedUpSwathSizeBytesC = RoundedUpMaxSwathSizeBytesC;
6361 		} else if (RoundedUpMaxSwathSizeBytesY < 1.5 * RoundedUpMaxSwathSizeBytesC
6362 				&& RoundedUpMaxSwathSizeBytesY + RoundedUpMinSwathSizeBytesC
6363 						<= DETBufferSizeInKByte * 1024 / 2) {
6364 			SwathHeightY[k] = MaximumSwathHeightY[k];
6365 			SwathHeightC[k] = MinimumSwathHeightC;
6366 			RoundedUpSwathSizeBytesY = RoundedUpMaxSwathSizeBytesY;
6367 			RoundedUpSwathSizeBytesC = RoundedUpMinSwathSizeBytesC;
6368 		} else {
6369 			SwathHeightY[k] = MinimumSwathHeightY;
6370 			SwathHeightC[k] = MinimumSwathHeightC;
6371 			RoundedUpSwathSizeBytesY = RoundedUpMinSwathSizeBytesY;
6372 			RoundedUpSwathSizeBytesC = RoundedUpMinSwathSizeBytesC;
6373 		}
6374 
6375 		if (SwathHeightC[k] == 0) {
6376 			DETBufferSizeY[k] = DETBufferSizeInKByte * 1024;
6377 			DETBufferSizeC[k] = 0;
6378 		} else if (RoundedUpSwathSizeBytesY <= 1.5 * RoundedUpSwathSizeBytesC) {
6379 			DETBufferSizeY[k] = DETBufferSizeInKByte * 1024 / 2;
6380 			DETBufferSizeC[k] = DETBufferSizeInKByte * 1024 / 2;
6381 		} else {
6382 			DETBufferSizeY[k] = DETBufferSizeInKByte * 1024 * 2 / 3;
6383 			DETBufferSizeC[k] = DETBufferSizeInKByte * 1024 / 3;
6384 		}
6385 
6386 		if (RoundedUpMinSwathSizeBytesY + RoundedUpMinSwathSizeBytesC
6387 				> DETBufferSizeInKByte * 1024 / 2
6388 				|| SwathWidth[k] > MaximumSwathWidthLuma[k]
6389 				|| (SwathHeightC[k] > 0
6390 						&& SwathWidthChroma[k] > MaximumSwathWidthChroma[k])) {
6391 			*ViewportSizeSupport = false;
6392 			ViewportSizeSupportPerPlane[k] = false;
6393 		} else {
6394 			ViewportSizeSupportPerPlane[k] = true;
6395 		}
6396 	}
6397 }
6398 
6399 static void CalculateSwathWidth(
6400 		bool ForceSingleDPP,
6401 		int NumberOfActivePlanes,
6402 		enum source_format_class SourcePixelFormat[],
6403 		enum scan_direction_class SourceScan[],
6404 		unsigned int ViewportWidth[],
6405 		unsigned int ViewportHeight[],
6406 		unsigned int SurfaceWidthY[],
6407 		unsigned int SurfaceWidthC[],
6408 		unsigned int SurfaceHeightY[],
6409 		unsigned int SurfaceHeightC[],
6410 		enum odm_combine_mode ODMCombineEnabled[],
6411 		int BytePerPixY[],
6412 		int BytePerPixC[],
6413 		int Read256BytesBlockHeightY[],
6414 		int Read256BytesBlockHeightC[],
6415 		int Read256BytesBlockWidthY[],
6416 		int Read256BytesBlockWidthC[],
6417 		int BlendingAndTiming[],
6418 		unsigned int HActive[],
6419 		double HRatio[],
6420 		int DPPPerPlane[],
6421 		double SwathWidthSingleDPPY[],
6422 		double SwathWidthSingleDPPC[],
6423 		double SwathWidthY[],
6424 		double SwathWidthC[],
6425 		int MaximumSwathHeightY[],
6426 		int MaximumSwathHeightC[],
6427 		unsigned int swath_width_luma_ub[],
6428 		unsigned int swath_width_chroma_ub[])
6429 {
6430 	unsigned int k, j;
6431 	long surface_width_ub_l;
6432 	long surface_height_ub_l;
6433 	long surface_width_ub_c;
6434 	long surface_height_ub_c;
6435 
6436 	for (k = 0; k < NumberOfActivePlanes; ++k) {
6437 		enum odm_combine_mode MainPlaneODMCombine = 0;
6438 		surface_width_ub_l = dml_ceil(SurfaceWidthY[k], Read256BytesBlockWidthY[k]);
6439 		surface_height_ub_l = dml_ceil(SurfaceHeightY[k], Read256BytesBlockHeightY[k]);
6440 		surface_width_ub_c = dml_ceil(SurfaceWidthC[k], Read256BytesBlockWidthC[k]);
6441 		surface_height_ub_c = dml_ceil(SurfaceHeightC[k], Read256BytesBlockHeightC[k]);
6442 
6443 		if (SourceScan[k] != dm_vert) {
6444 			SwathWidthSingleDPPY[k] = ViewportWidth[k];
6445 		} else {
6446 			SwathWidthSingleDPPY[k] = ViewportHeight[k];
6447 		}
6448 
6449 		MainPlaneODMCombine = ODMCombineEnabled[k];
6450 		for (j = 0; j < NumberOfActivePlanes; ++j) {
6451 			if (BlendingAndTiming[k] == j) {
6452 				MainPlaneODMCombine = ODMCombineEnabled[j];
6453 			}
6454 		}
6455 
6456 		if (MainPlaneODMCombine == dm_odm_combine_mode_4to1) {
6457 			SwathWidthY[k] = dml_min(SwathWidthSingleDPPY[k], dml_round(HActive[k] / 4.0 * HRatio[k]));
6458 		} else if (MainPlaneODMCombine == dm_odm_combine_mode_2to1) {
6459 			SwathWidthY[k] = dml_min(SwathWidthSingleDPPY[k], dml_round(HActive[k] / 2.0 * HRatio[k]));
6460 		} else if (DPPPerPlane[k] == 2) {
6461 			SwathWidthY[k] = SwathWidthSingleDPPY[k] / 2;
6462 		} else {
6463 			SwathWidthY[k] = SwathWidthSingleDPPY[k];
6464 		}
6465 
6466 		if (SourcePixelFormat[k] == dm_420_8 || SourcePixelFormat[k] == dm_420_10 || SourcePixelFormat[k] == dm_420_12) {
6467 			SwathWidthC[k] = SwathWidthY[k] / 2;
6468 			SwathWidthSingleDPPC[k] = SwathWidthSingleDPPY[k] / 2;
6469 		} else {
6470 			SwathWidthC[k] = SwathWidthY[k];
6471 			SwathWidthSingleDPPC[k] = SwathWidthSingleDPPY[k];
6472 		}
6473 
6474 		if (ForceSingleDPP == true) {
6475 			SwathWidthY[k] = SwathWidthSingleDPPY[k];
6476 			SwathWidthC[k] = SwathWidthSingleDPPC[k];
6477 		}
6478 
6479 		surface_width_ub_l  = dml_ceil(SurfaceWidthY[k], Read256BytesBlockWidthY[k]);
6480 		surface_height_ub_l = dml_ceil(SurfaceHeightY[k], Read256BytesBlockHeightY[k]);
6481 		surface_width_ub_c  = dml_ceil(SurfaceWidthC[k], Read256BytesBlockWidthC[k]);
6482 		surface_height_ub_c = dml_ceil(SurfaceHeightC[k], Read256BytesBlockHeightC[k]);
6483 
6484 		if (SourceScan[k] != dm_vert) {
6485 			MaximumSwathHeightY[k] = Read256BytesBlockHeightY[k];
6486 			MaximumSwathHeightC[k] = Read256BytesBlockHeightC[k];
6487 			swath_width_luma_ub[k] = dml_min(surface_width_ub_l, (long) dml_ceil(SwathWidthY[k] - 1,
6488 					Read256BytesBlockWidthY[k]) + Read256BytesBlockWidthY[k]);
6489 			if (BytePerPixC[k] > 0) {
6490 				swath_width_chroma_ub[k] = dml_min(surface_width_ub_c, (long) dml_ceil(SwathWidthC[k] - 1,
6491 						Read256BytesBlockWidthC[k]) + Read256BytesBlockWidthC[k]);
6492 			} else {
6493 				swath_width_chroma_ub[k] = 0;
6494 			}
6495 		} else {
6496 			MaximumSwathHeightY[k] = Read256BytesBlockWidthY[k];
6497 			MaximumSwathHeightC[k] = Read256BytesBlockWidthC[k];
6498 			swath_width_luma_ub[k] = dml_min(surface_height_ub_l, (long) dml_ceil(SwathWidthY[k] - 1,
6499 					Read256BytesBlockHeightY[k]) + Read256BytesBlockHeightY[k]);
6500 			if (BytePerPixC[k] > 0) {
6501 				swath_width_chroma_ub[k] = dml_min(surface_height_ub_c, (long) dml_ceil(SwathWidthC[k] - 1,
6502 						Read256BytesBlockHeightC[k]) + Read256BytesBlockHeightC[k]);
6503 			} else {
6504 				swath_width_chroma_ub[k] = 0;
6505 			}
6506 		}
6507 	}
6508 }
6509 
6510 static double CalculateExtraLatency(
6511 		long RoundTripPingLatencyCycles,
6512 		long ReorderingBytes,
6513 		double DCFCLK,
6514 		int TotalNumberOfActiveDPP,
6515 		int PixelChunkSizeInKByte,
6516 		int TotalNumberOfDCCActiveDPP,
6517 		int MetaChunkSize,
6518 		double ReturnBW,
6519 		bool GPUVMEnable,
6520 		bool HostVMEnable,
6521 		int NumberOfActivePlanes,
6522 		int NumberOfDPP[],
6523 		int dpte_group_bytes[],
6524 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
6525 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
6526 		double HostVMMinPageSize,
6527 		int HostVMMaxNonCachedPageTableLevels)
6528 {
6529 	double ExtraLatencyBytes = 0;
6530 	ExtraLatencyBytes = CalculateExtraLatencyBytes(
6531 					ReorderingBytes,
6532 					TotalNumberOfActiveDPP,
6533 					PixelChunkSizeInKByte,
6534 					TotalNumberOfDCCActiveDPP,
6535 					MetaChunkSize,
6536 					GPUVMEnable,
6537 					HostVMEnable,
6538 					NumberOfActivePlanes,
6539 					NumberOfDPP,
6540 					dpte_group_bytes,
6541 					PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
6542 					PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
6543 					HostVMMinPageSize,
6544 					HostVMMaxNonCachedPageTableLevels);
6545 
6546 	return (RoundTripPingLatencyCycles + 32) / DCFCLK + ExtraLatencyBytes / ReturnBW;
6547 }
6548 
6549 static double CalculateExtraLatencyBytes(
6550 		long ReorderingBytes,
6551 		int TotalNumberOfActiveDPP,
6552 		int PixelChunkSizeInKByte,
6553 		int TotalNumberOfDCCActiveDPP,
6554 		int MetaChunkSize,
6555 		bool GPUVMEnable,
6556 		bool HostVMEnable,
6557 		int NumberOfActivePlanes,
6558 		int NumberOfDPP[],
6559 		int dpte_group_bytes[],
6560 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
6561 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
6562 		double HostVMMinPageSize,
6563 		int HostVMMaxNonCachedPageTableLevels)
6564 {
6565 	double ret = 0;
6566 	double HostVMInefficiencyFactor = 0;
6567 	int HostVMDynamicLevels = 0;
6568 	unsigned int k;
6569 
6570 	if (GPUVMEnable == true && HostVMEnable == true) {
6571 		HostVMInefficiencyFactor = PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData / PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly;
6572 		if (HostVMMinPageSize < 2048) {
6573 			HostVMDynamicLevels = HostVMMaxNonCachedPageTableLevels;
6574 		} else if (HostVMMinPageSize >= 2048 && HostVMMinPageSize < 1048576) {
6575 			HostVMDynamicLevels = dml_max(0, (int) HostVMMaxNonCachedPageTableLevels - 1);
6576 		} else {
6577 			HostVMDynamicLevels = dml_max(0, (int) HostVMMaxNonCachedPageTableLevels - 2);
6578 		}
6579 	} else {
6580 		HostVMInefficiencyFactor = 1;
6581 		HostVMDynamicLevels = 0;
6582 	}
6583 
6584 	ret = ReorderingBytes + (TotalNumberOfActiveDPP * PixelChunkSizeInKByte + TotalNumberOfDCCActiveDPP * MetaChunkSize) * 1024.0;
6585 
6586 	if (GPUVMEnable == true) {
6587 		for (k = 0; k < NumberOfActivePlanes; ++k) {
6588 			ret = ret + NumberOfDPP[k] * dpte_group_bytes[k] * (1 + 8 * HostVMDynamicLevels) * HostVMInefficiencyFactor;
6589 		}
6590 	}
6591 	return ret;
6592 }
6593 
6594 
6595 static double CalculateUrgentLatency(
6596 		double UrgentLatencyPixelDataOnly,
6597 		double UrgentLatencyPixelMixedWithVMData,
6598 		double UrgentLatencyVMDataOnly,
6599 		bool DoUrgentLatencyAdjustment,
6600 		double UrgentLatencyAdjustmentFabricClockComponent,
6601 		double UrgentLatencyAdjustmentFabricClockReference,
6602 		double FabricClock)
6603 {
6604 	double ret;
6605 
6606 	ret = dml_max3(UrgentLatencyPixelDataOnly, UrgentLatencyPixelMixedWithVMData, UrgentLatencyVMDataOnly);
6607 	if (DoUrgentLatencyAdjustment == true) {
6608 		ret = ret + UrgentLatencyAdjustmentFabricClockComponent * (UrgentLatencyAdjustmentFabricClockReference / FabricClock - 1);
6609 	}
6610 	return ret;
6611 }
6612 
6613 
6614 static void UseMinimumDCFCLK(
6615 		struct display_mode_lib *mode_lib,
6616 		int MaxInterDCNTileRepeaters,
6617 		int MaxPrefetchMode,
6618 		double FinalDRAMClockChangeLatency,
6619 		double SREnterPlusExitTime,
6620 		int ReturnBusWidth,
6621 		int RoundTripPingLatencyCycles,
6622 		int ReorderingBytes,
6623 		int PixelChunkSizeInKByte,
6624 		int MetaChunkSize,
6625 		bool GPUVMEnable,
6626 		int GPUVMMaxPageTableLevels,
6627 		bool HostVMEnable,
6628 		int NumberOfActivePlanes,
6629 		double HostVMMinPageSize,
6630 		int HostVMMaxNonCachedPageTableLevels,
6631 		bool DynamicMetadataVMEnabled,
6632 		enum immediate_flip_requirement ImmediateFlipRequirement,
6633 		bool ProgressiveToInterlaceUnitInOPP,
6634 		double MaxAveragePercentOfIdealSDPPortBWDisplayCanUseInNormalSystemOperation,
6635 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
6636 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
6637 		double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelDataOnly,
6638 		int VTotal[],
6639 		int VActive[],
6640 		int DynamicMetadataTransmittedBytes[],
6641 		int DynamicMetadataLinesBeforeActiveRequired[],
6642 		bool Interlace[],
6643 		double RequiredDPPCLK[][2][DC__NUM_DPP__MAX],
6644 		double RequiredDISPCLK[][2],
6645 		double UrgLatency[],
6646 		unsigned int NoOfDPP[][2][DC__NUM_DPP__MAX],
6647 		double ProjectedDCFCLKDeepSleep[][2],
6648 		double MaximumVStartup[][2][DC__NUM_DPP__MAX],
6649 		double TotalVActivePixelBandwidth[][2],
6650 		double TotalVActiveCursorBandwidth[][2],
6651 		double TotalMetaRowBandwidth[][2],
6652 		double TotalDPTERowBandwidth[][2],
6653 		unsigned int TotalNumberOfActiveDPP[][2],
6654 		unsigned int TotalNumberOfDCCActiveDPP[][2],
6655 		int dpte_group_bytes[],
6656 		double PrefetchLinesY[][2][DC__NUM_DPP__MAX],
6657 		double PrefetchLinesC[][2][DC__NUM_DPP__MAX],
6658 		unsigned int swath_width_luma_ub_all_states[][2][DC__NUM_DPP__MAX],
6659 		unsigned int swath_width_chroma_ub_all_states[][2][DC__NUM_DPP__MAX],
6660 		int BytePerPixelY[],
6661 		int BytePerPixelC[],
6662 		int HTotal[],
6663 		double PixelClock[],
6664 		double PDEAndMetaPTEBytesPerFrame[][2][DC__NUM_DPP__MAX],
6665 		double DPTEBytesPerRow[][2][DC__NUM_DPP__MAX],
6666 		double MetaRowBytes[][2][DC__NUM_DPP__MAX],
6667 		bool DynamicMetadataEnable[],
6668 		double VActivePixelBandwidth[][2][DC__NUM_DPP__MAX],
6669 		double VActiveCursorBandwidth[][2][DC__NUM_DPP__MAX],
6670 		double ReadBandwidthLuma[],
6671 		double ReadBandwidthChroma[],
6672 		double DCFCLKPerState[],
6673 		double DCFCLKState[][2])
6674 {
6675 	double   NormalEfficiency = 0;
6676 	double   PTEEfficiency = 0;
6677 	double   TotalMaxPrefetchFlipDPTERowBandwidth[DC__VOLTAGE_STATES][2] = { { 0 } };
6678 	unsigned int i, j, k;
6679 
6680 	NormalEfficiency =  (HostVMEnable == true ? PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData
6681 			: PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelDataOnly) / 100.0;
6682 	PTEEfficiency =  (HostVMEnable == true ? PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly
6683 			/ PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData : 1.0);
6684 	for (i = 0; i < mode_lib->soc.num_states; ++i) {
6685 		for (j = 0; j <= 1; ++j) {
6686 			double PixelDCFCLKCyclesRequiredInPrefetch[DC__NUM_DPP__MAX] = { 0 };
6687 			double PrefetchPixelLinesTime[DC__NUM_DPP__MAX] = { 0 };
6688 			double DCFCLKRequiredForPeakBandwidthPerPlane[DC__NUM_DPP__MAX] = { 0 };
6689 			double DynamicMetadataVMExtraLatency[DC__NUM_DPP__MAX] = { 0 };
6690 			double MinimumTWait = 0;
6691 			double NonDPTEBandwidth = 0;
6692 			double DPTEBandwidth = 0;
6693 			double DCFCLKRequiredForAverageBandwidth = 0;
6694 			double ExtraLatencyBytes = 0;
6695 			double ExtraLatencyCycles = 0;
6696 			double DCFCLKRequiredForPeakBandwidth = 0;
6697 			int NoOfDPPState[DC__NUM_DPP__MAX] = { 0 };
6698 			double MinimumTvmPlus2Tr0 = 0;
6699 
6700 			TotalMaxPrefetchFlipDPTERowBandwidth[i][j] = 0;
6701 			for (k = 0; k < NumberOfActivePlanes; ++k) {
6702 				TotalMaxPrefetchFlipDPTERowBandwidth[i][j] = TotalMaxPrefetchFlipDPTERowBandwidth[i][j]
6703 					+ NoOfDPP[i][j][k] * DPTEBytesPerRow[i][j][k] / (15.75 * HTotal[k] / PixelClock[k]);
6704 			}
6705 
6706 			for (k = 0; k <= NumberOfActivePlanes - 1; ++k) {
6707 				NoOfDPPState[k] = NoOfDPP[i][j][k];
6708 			}
6709 
6710 			MinimumTWait = CalculateTWait(MaxPrefetchMode, FinalDRAMClockChangeLatency, UrgLatency[i], SREnterPlusExitTime);
6711 			NonDPTEBandwidth = TotalVActivePixelBandwidth[i][j] + TotalVActiveCursorBandwidth[i][j] + TotalMetaRowBandwidth[i][j];
6712 			DPTEBandwidth =  (HostVMEnable == true || ImmediateFlipRequirement == dm_immediate_flip_required) ?
6713 					TotalMaxPrefetchFlipDPTERowBandwidth[i][j] : TotalDPTERowBandwidth[i][j];
6714 			DCFCLKRequiredForAverageBandwidth = dml_max3(ProjectedDCFCLKDeepSleep[i][j],
6715 					(NonDPTEBandwidth + TotalDPTERowBandwidth[i][j]) / ReturnBusWidth / (MaxAveragePercentOfIdealSDPPortBWDisplayCanUseInNormalSystemOperation / 100),
6716 					(NonDPTEBandwidth + DPTEBandwidth / PTEEfficiency) / NormalEfficiency / ReturnBusWidth);
6717 
6718 			ExtraLatencyBytes = CalculateExtraLatencyBytes(ReorderingBytes, TotalNumberOfActiveDPP[i][j], PixelChunkSizeInKByte, TotalNumberOfDCCActiveDPP[i][j],
6719 					MetaChunkSize, GPUVMEnable, HostVMEnable, NumberOfActivePlanes, NoOfDPPState, dpte_group_bytes,
6720 					PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData, PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
6721 					HostVMMinPageSize, HostVMMaxNonCachedPageTableLevels);
6722 			ExtraLatencyCycles = RoundTripPingLatencyCycles + 32 + ExtraLatencyBytes / NormalEfficiency / ReturnBusWidth;
6723 			for (k = 0; k < NumberOfActivePlanes; ++k) {
6724 				double DCFCLKCyclesRequiredInPrefetch = { 0 };
6725 				double ExpectedPrefetchBWAcceleration = { 0 };
6726 				double PrefetchTime = { 0 };
6727 
6728 				PixelDCFCLKCyclesRequiredInPrefetch[k] = (PrefetchLinesY[i][j][k] * swath_width_luma_ub_all_states[i][j][k] * BytePerPixelY[k]
6729 					+ PrefetchLinesC[i][j][k] * swath_width_chroma_ub_all_states[i][j][k] * BytePerPixelC[k]) / NormalEfficiency / ReturnBusWidth;
6730 				DCFCLKCyclesRequiredInPrefetch = 2 * ExtraLatencyCycles / NoOfDPPState[k] + PDEAndMetaPTEBytesPerFrame[i][j][k] / PTEEfficiency
6731 					/ NormalEfficiency / ReturnBusWidth *  (GPUVMMaxPageTableLevels > 2 ? 1 : 0) + 2 * DPTEBytesPerRow[i][j][k] / PTEEfficiency
6732 					/ NormalEfficiency / ReturnBusWidth + 2 * MetaRowBytes[i][j][k] / NormalEfficiency / ReturnBusWidth + PixelDCFCLKCyclesRequiredInPrefetch[k];
6733 				PrefetchPixelLinesTime[k] = dml_max(PrefetchLinesY[i][j][k], PrefetchLinesC[i][j][k]) * HTotal[k] / PixelClock[k];
6734 				ExpectedPrefetchBWAcceleration = (VActivePixelBandwidth[i][j][k] + VActiveCursorBandwidth[i][j][k]) / (ReadBandwidthLuma[k] + ReadBandwidthChroma[k]);
6735 				DynamicMetadataVMExtraLatency[k] = (GPUVMEnable == true && DynamicMetadataEnable[k] == true && DynamicMetadataVMEnabled == true) ?
6736 						UrgLatency[i] * GPUVMMaxPageTableLevels *  (HostVMEnable == true ? HostVMMaxNonCachedPageTableLevels + 1 : 1) : 0;
6737 				PrefetchTime = (MaximumVStartup[i][j][k] - 1) * HTotal[k] / PixelClock[k] - MinimumTWait - UrgLatency[i] * ((GPUVMMaxPageTableLevels <= 2 ? GPUVMMaxPageTableLevels
6738 						: GPUVMMaxPageTableLevels - 2) * (HostVMEnable == true ? HostVMMaxNonCachedPageTableLevels + 1 : 1) - 1) - DynamicMetadataVMExtraLatency[k];
6739 
6740 				if (PrefetchTime > 0) {
6741 					double ExpectedVRatioPrefetch = { 0 };
6742 					ExpectedVRatioPrefetch = PrefetchPixelLinesTime[k] / (PrefetchTime * PixelDCFCLKCyclesRequiredInPrefetch[k] / DCFCLKCyclesRequiredInPrefetch);
6743 					DCFCLKRequiredForPeakBandwidthPerPlane[k] = NoOfDPPState[k] * PixelDCFCLKCyclesRequiredInPrefetch[k] / PrefetchPixelLinesTime[k]
6744 						* dml_max(1.0, ExpectedVRatioPrefetch) * dml_max(1.0, ExpectedVRatioPrefetch / 4) * ExpectedPrefetchBWAcceleration;
6745 					if (HostVMEnable == true || ImmediateFlipRequirement == dm_immediate_flip_required) {
6746 						DCFCLKRequiredForPeakBandwidthPerPlane[k] = DCFCLKRequiredForPeakBandwidthPerPlane[k]
6747 							+ NoOfDPPState[k] * DPTEBandwidth / PTEEfficiency / NormalEfficiency / ReturnBusWidth;
6748 					}
6749 				} else {
6750 					DCFCLKRequiredForPeakBandwidthPerPlane[k] = DCFCLKPerState[i];
6751 				}
6752 				if (DynamicMetadataEnable[k] == true) {
6753 					double TsetupPipe = { 0 };
6754 					double TdmbfPipe = { 0 };
6755 					double TdmsksPipe = { 0 };
6756 					double TdmecPipe = { 0 };
6757 					double AllowedTimeForUrgentExtraLatency = { 0 };
6758 
6759 					CalculateDynamicMetadataParameters(
6760 							MaxInterDCNTileRepeaters,
6761 							RequiredDPPCLK[i][j][k],
6762 							RequiredDISPCLK[i][j],
6763 							ProjectedDCFCLKDeepSleep[i][j],
6764 							PixelClock[k],
6765 							HTotal[k],
6766 							VTotal[k] - VActive[k],
6767 							DynamicMetadataTransmittedBytes[k],
6768 							DynamicMetadataLinesBeforeActiveRequired[k],
6769 							Interlace[k],
6770 							ProgressiveToInterlaceUnitInOPP,
6771 							&TsetupPipe,
6772 							&TdmbfPipe,
6773 							&TdmecPipe,
6774 							&TdmsksPipe);
6775 					AllowedTimeForUrgentExtraLatency = MaximumVStartup[i][j][k] * HTotal[k] / PixelClock[k] - MinimumTWait - TsetupPipe
6776 							- TdmbfPipe - TdmecPipe - TdmsksPipe - DynamicMetadataVMExtraLatency[k];
6777 					if (AllowedTimeForUrgentExtraLatency > 0) {
6778 						DCFCLKRequiredForPeakBandwidthPerPlane[k] = dml_max(DCFCLKRequiredForPeakBandwidthPerPlane[k],
6779 								ExtraLatencyCycles / AllowedTimeForUrgentExtraLatency);
6780 					} else {
6781 						DCFCLKRequiredForPeakBandwidthPerPlane[k] = DCFCLKPerState[i];
6782 					}
6783 				}
6784 			}
6785 			DCFCLKRequiredForPeakBandwidth = 0;
6786 			for (k = 0; k <= NumberOfActivePlanes - 1; ++k) {
6787 				DCFCLKRequiredForPeakBandwidth = DCFCLKRequiredForPeakBandwidth + DCFCLKRequiredForPeakBandwidthPerPlane[k];
6788 			}
6789 			MinimumTvmPlus2Tr0 = UrgLatency[i] * (GPUVMEnable == true ? (HostVMEnable == true ?
6790 					(GPUVMMaxPageTableLevels + 2) * (HostVMMaxNonCachedPageTableLevels + 1) - 1 : GPUVMMaxPageTableLevels + 1) : 0);
6791 			for (k = 0; k < NumberOfActivePlanes; ++k) {
6792 				double MaximumTvmPlus2Tr0PlusTsw = { 0 };
6793 				MaximumTvmPlus2Tr0PlusTsw = (MaximumVStartup[i][j][k] - 2) * HTotal[k] / PixelClock[k] - MinimumTWait - DynamicMetadataVMExtraLatency[k];
6794 				if (MaximumTvmPlus2Tr0PlusTsw <= MinimumTvmPlus2Tr0 + PrefetchPixelLinesTime[k] / 4) {
6795 					DCFCLKRequiredForPeakBandwidth = DCFCLKPerState[i];
6796 				} else {
6797 					DCFCLKRequiredForPeakBandwidth = dml_max3(DCFCLKRequiredForPeakBandwidth, 2 * ExtraLatencyCycles
6798 							/ (MaximumTvmPlus2Tr0PlusTsw - MinimumTvmPlus2Tr0 - PrefetchPixelLinesTime[k] / 4),
6799 						(2 * ExtraLatencyCycles + PixelDCFCLKCyclesRequiredInPrefetch[k]) / (MaximumTvmPlus2Tr0PlusTsw - MinimumTvmPlus2Tr0));
6800 				}
6801 			}
6802 			DCFCLKState[i][j] = dml_min(DCFCLKPerState[i], 1.05 * (1 + mode_lib->vba.PercentMarginOverMinimumRequiredDCFCLK / 100)
6803 					* dml_max(DCFCLKRequiredForAverageBandwidth, DCFCLKRequiredForPeakBandwidth));
6804 		}
6805 	}
6806 }
6807 
6808 #endif /* CONFIG_DRM_AMD_DC_DCN */
6809