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