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