2 * Copyright 2018 Advanced Micro Devices, Inc.
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:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
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.
26 #include "../display_mode_lib.h"
27 #include "display_mode_vba_20v2.h"
28 #include "../dml_inline_defs.h"
32 * This file is gcc-parseable HW gospel, coming straight from HW engineers.
34 * It doesn't adhere to Linux kernel style and sometimes will do things in odd
35 * ways. Unless there is something clearly wrong with it the code should
36 * remain as-is as it provides us with a guarantee from HW that it is correct.
40 #define BPP_BLENDED_PIPE 0xffffffff
41 #define DCN20_MAX_DSC_IMAGE_WIDTH 5184
43 static double adjust_ReturnBW(
44 struct display_mode_lib *mode_lib,
46 bool DCCEnabledAnyPlane,
47 double ReturnBandwidthToDCN);
48 static unsigned int dscceComputeDelay(
51 unsigned int sliceWidth,
52 unsigned int numSlices,
53 enum output_format_class pixelFormat);
54 static unsigned int dscComputeDelay(enum output_format_class pixelFormat);
55 static bool CalculateDelayAfterScaler(
56 struct display_mode_lib *mode_lib,
58 double ReadBandwidthPlaneLuma,
59 double ReadBandwidthPlaneChroma,
60 double TotalDataReadBandwidth,
61 double DisplayPipeLineDeliveryTimeLuma,
62 double DisplayPipeLineDeliveryTimeChroma,
66 unsigned int DSCDelay,
67 unsigned int DPPPerPlane,
69 unsigned int NumberOfCursors,
70 double DPPCLKDelaySubtotal,
71 double DPPCLKDelaySCL,
72 double DPPCLKDelaySCLLBOnly,
73 double DPPCLKDelayCNVCFormater,
74 double DPPCLKDelayCNVCCursor,
75 double DISPCLKDelaySubtotal,
76 unsigned int ScalerRecoutWidth,
77 enum output_format_class OutputFormat,
79 unsigned int SwathWidthSingleDPPY,
80 double BytePerPixelDETY,
81 double BytePerPixelDETC,
82 unsigned int SwathHeightY,
83 unsigned int SwathHeightC,
85 bool ProgressiveToInterlaceUnitInOPP,
86 double *DSTXAfterScaler,
87 double *DSTYAfterScaler
89 // Super monster function with some 45 argument
90 static bool CalculatePrefetchSchedule(
91 struct display_mode_lib *mode_lib,
95 double DCFCLKDeepSleep,
96 unsigned int DPPPerPlane,
97 unsigned int NumberOfCursors,
100 unsigned int MaxInterDCNTileRepeaters,
101 unsigned int VStartup,
102 unsigned int PageTableLevels,
104 bool DynamicMetadataEnable,
105 unsigned int DynamicMetadataLinesBeforeActiveRequired,
106 unsigned int DynamicMetadataTransmittedBytes,
108 double UrgentLatencyPixelDataOnly,
109 double UrgentExtraLatency,
111 unsigned int PDEAndMetaPTEBytesFrame,
112 unsigned int MetaRowByte,
113 unsigned int PixelPTEBytesPerRow,
114 double PrefetchSourceLinesY,
115 unsigned int SwathWidthY,
116 double BytePerPixelDETY,
117 double VInitPreFillY,
118 unsigned int MaxNumSwathY,
119 double PrefetchSourceLinesC,
120 double BytePerPixelDETC,
121 double VInitPreFillC,
122 unsigned int MaxNumSwathC,
123 unsigned int SwathHeightY,
124 unsigned int SwathHeightC,
127 double XFCRemoteSurfaceFlipDelay,
128 bool InterlaceEnable,
129 bool ProgressiveToInterlaceUnitInOPP,
130 double DSTXAfterScaler,
131 double DSTYAfterScaler,
132 double *DestinationLinesForPrefetch,
133 double *PrefetchBandwidth,
134 double *DestinationLinesToRequestVMInVBlank,
135 double *DestinationLinesToRequestRowInVBlank,
136 double *VRatioPrefetchY,
137 double *VRatioPrefetchC,
138 double *RequiredPrefetchPixDataBW,
140 unsigned int *VUpdateOffsetPix,
141 double *VUpdateWidthPix,
142 double *VReadyOffsetPix);
143 static double RoundToDFSGranularityUp(double Clock, double VCOSpeed);
144 static double RoundToDFSGranularityDown(double Clock, double VCOSpeed);
145 static double CalculatePrefetchSourceLines(
146 struct display_mode_lib *mode_lib,
150 bool ProgressiveToInterlaceUnitInOPP,
151 unsigned int SwathHeight,
152 unsigned int ViewportYStart,
153 double *VInitPreFill,
154 unsigned int *MaxNumSwath);
155 static unsigned int CalculateVMAndRowBytes(
156 struct display_mode_lib *mode_lib,
158 unsigned int BlockHeight256Bytes,
159 unsigned int BlockWidth256Bytes,
160 enum source_format_class SourcePixelFormat,
161 unsigned int SurfaceTiling,
162 unsigned int BytePerPixel,
163 enum scan_direction_class ScanDirection,
164 unsigned int ViewportWidth,
165 unsigned int ViewportHeight,
166 unsigned int SwathWidthY,
168 unsigned int VMMPageSize,
169 unsigned int PTEBufferSizeInRequestsLuma,
170 unsigned int PDEProcessingBufIn64KBReqs,
172 unsigned int DCCMetaPitch,
173 unsigned int *MacroTileWidth,
174 unsigned int *MetaRowByte,
175 unsigned int *PixelPTEBytesPerRow,
176 bool *PTEBufferSizeNotExceeded,
177 unsigned int *dpte_row_height,
178 unsigned int *meta_row_height);
179 static double CalculateTWait(
180 unsigned int PrefetchMode,
181 double DRAMClockChangeLatency,
182 double UrgentLatencyPixelDataOnly,
183 double SREnterPlusExitTime);
184 static double CalculateRemoteSurfaceFlipDelay(
185 struct display_mode_lib *mode_lib,
190 double XFCTSlvVupdateOffset,
191 double XFCTSlvVupdateWidth,
192 double XFCTSlvVreadyOffset,
193 double XFCXBUFLatencyTolerance,
194 double XFCFillBWOverhead,
195 double XFCSlvChunkSize,
196 double XFCBusTransportTime,
199 double *SrcActiveDrainRate,
202 static void CalculateActiveRowBandwidth(
204 enum source_format_class SourcePixelFormat,
208 unsigned int MetaRowByteLuma,
209 unsigned int MetaRowByteChroma,
210 unsigned int meta_row_height_luma,
211 unsigned int meta_row_height_chroma,
212 unsigned int PixelPTEBytesPerRowLuma,
213 unsigned int PixelPTEBytesPerRowChroma,
214 unsigned int dpte_row_height_luma,
215 unsigned int dpte_row_height_chroma,
218 double *qual_row_bw);
219 static void CalculateFlipSchedule(
220 struct display_mode_lib *mode_lib,
221 double UrgentExtraLatency,
222 double UrgentLatencyPixelDataOnly,
223 unsigned int GPUVMMaxPageTableLevels,
225 double BandwidthAvailableForImmediateFlip,
226 unsigned int TotImmediateFlipBytes,
227 enum source_format_class SourcePixelFormat,
228 unsigned int ImmediateFlipBytes,
232 double PDEAndMetaPTEBytesFrame,
233 unsigned int MetaRowByte,
234 unsigned int PixelPTEBytesPerRow,
236 unsigned int dpte_row_height,
237 unsigned int meta_row_height,
239 double *DestinationLinesToRequestVMInImmediateFlip,
240 double *DestinationLinesToRequestRowInImmediateFlip,
241 double *final_flip_bw,
242 bool *ImmediateFlipSupportedForPipe);
243 static double CalculateWriteBackDelay(
244 enum source_format_class WritebackPixelFormat,
245 double WritebackHRatio,
246 double WritebackVRatio,
247 unsigned int WritebackLumaHTaps,
248 unsigned int WritebackLumaVTaps,
249 unsigned int WritebackChromaHTaps,
250 unsigned int WritebackChromaVTaps,
251 unsigned int WritebackDestinationWidth);
253 static void dml20v2_DisplayPipeConfiguration(struct display_mode_lib *mode_lib);
254 static void dml20v2_DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(
255 struct display_mode_lib *mode_lib);
257 void dml20v2_recalculate(struct display_mode_lib *mode_lib)
259 ModeSupportAndSystemConfiguration(mode_lib);
260 mode_lib->vba.FabricAndDRAMBandwidth = dml_min(
261 mode_lib->vba.DRAMSpeed * mode_lib->vba.NumberOfChannels * mode_lib->vba.DRAMChannelWidth,
262 mode_lib->vba.FabricClock * mode_lib->vba.FabricDatapathToDCNDataReturn) / 1000.0;
263 PixelClockAdjustmentForProgressiveToInterlaceUnit(mode_lib);
264 dml20v2_DisplayPipeConfiguration(mode_lib);
265 dml20v2_DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(mode_lib);
268 static double adjust_ReturnBW(
269 struct display_mode_lib *mode_lib,
271 bool DCCEnabledAnyPlane,
272 double ReturnBandwidthToDCN)
274 double CriticalCompression;
276 if (DCCEnabledAnyPlane
277 && ReturnBandwidthToDCN
278 > mode_lib->vba.DCFCLK * mode_lib->vba.ReturnBusWidth / 4.0)
282 ReturnBandwidthToDCN * 4
284 - mode_lib->vba.UrgentLatencyPixelDataOnly
285 / ((mode_lib->vba.ROBBufferSizeInKByte
286 - mode_lib->vba.PixelChunkSizeInKByte)
288 / ReturnBandwidthToDCN
289 - mode_lib->vba.DCFCLK
290 * mode_lib->vba.ReturnBusWidth
292 + mode_lib->vba.UrgentLatencyPixelDataOnly));
294 CriticalCompression = 2.0 * mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLK
295 * mode_lib->vba.UrgentLatencyPixelDataOnly
296 / (ReturnBandwidthToDCN * mode_lib->vba.UrgentLatencyPixelDataOnly
297 + (mode_lib->vba.ROBBufferSizeInKByte
298 - mode_lib->vba.PixelChunkSizeInKByte)
301 if (DCCEnabledAnyPlane && CriticalCompression > 1.0 && CriticalCompression < 4.0)
305 4.0 * ReturnBandwidthToDCN
306 * (mode_lib->vba.ROBBufferSizeInKByte
307 - mode_lib->vba.PixelChunkSizeInKByte)
309 * mode_lib->vba.ReturnBusWidth
310 * mode_lib->vba.DCFCLK
311 * mode_lib->vba.UrgentLatencyPixelDataOnly
313 (ReturnBandwidthToDCN
314 * mode_lib->vba.UrgentLatencyPixelDataOnly
315 + (mode_lib->vba.ROBBufferSizeInKByte
316 - mode_lib->vba.PixelChunkSizeInKByte)
323 static unsigned int dscceComputeDelay(
326 unsigned int sliceWidth,
327 unsigned int numSlices,
328 enum output_format_class pixelFormat)
330 // valid bpc = source bits per component in the set of {8, 10, 12}
331 // valid bpp = increments of 1/16 of a bit
332 // min = 6/7/8 in N420/N422/444, respectively
333 // max = such that compression is 1:1
334 //valid sliceWidth = number of pixels per slice line, must be less than or equal to 5184/numSlices (or 4096/numSlices in 420 mode)
335 //valid numSlices = number of slices in the horiziontal direction per DSC engine in the set of {1, 2, 3, 4}
336 //valid pixelFormat = pixel/color format in the set of {:N444_RGB, :S422, :N422, :N420}
339 unsigned int rcModelSize = 8192;
341 // N422/N420 operate at 2 pixels per clock
342 unsigned int pixelsPerClock, lstall, D, initalXmitDelay, w, s, ix, wx, p, l0, a, ax, l,
345 if (pixelFormat == dm_n422 || pixelFormat == dm_420)
347 // #all other modes operate at 1 pixel per clock
351 //initial transmit delay as per PPS
352 initalXmitDelay = dml_round(rcModelSize / 2.0 / bpp / pixelsPerClock);
362 //divide by pixel per cycle to compute slice width as seen by DSC
363 w = sliceWidth / pixelsPerClock;
365 //422 mode has an additional cycle of delay
366 if (pixelFormat == dm_s422)
371 //main calculation for the dscce
372 ix = initalXmitDelay + 45;
377 ax = (a + 2) / 3 + D + 6 + 1;
378 l = (ax + wx - 1) / wx;
379 if ((ix % w) == 0 && p != 0)
383 Delay = l * wx * (numSlices - 1) + ax + s + lstall + 22;
385 //dsc processes 3 pixel containers per cycle and a container can contain 1 or 2 pixels
386 pixels = Delay * 3 * pixelsPerClock;
390 static unsigned int dscComputeDelay(enum output_format_class pixelFormat)
392 unsigned int Delay = 0;
394 if (pixelFormat == dm_420) {
399 // dscc - input deserializer
401 // dscc gets pixels every other cycle
403 // dscc - input cdc fifo
405 // dscc gets pixels every other cycle
407 // dscc - cdc uncertainty
409 // dscc - output cdc fifo
411 // dscc gets pixels every other cycle
413 // dscc - cdc uncertainty
415 // dscc - output serializer
419 } else if (pixelFormat == dm_n422) {
424 // dscc - input deserializer
426 // dscc - input cdc fifo
428 // dscc - cdc uncertainty
430 // dscc - output cdc fifo
432 // dscc - cdc uncertainty
434 // dscc - output serializer
443 // dscc - input deserializer
445 // dscc - input cdc fifo
447 // dscc - cdc uncertainty
449 // dscc - output cdc fifo
451 // dscc - output serializer
453 // dscc - cdc uncertainty
462 static bool CalculateDelayAfterScaler(
463 struct display_mode_lib *mode_lib,
465 double ReadBandwidthPlaneLuma,
466 double ReadBandwidthPlaneChroma,
467 double TotalDataReadBandwidth,
468 double DisplayPipeLineDeliveryTimeLuma,
469 double DisplayPipeLineDeliveryTimeChroma,
473 unsigned int DSCDelay,
474 unsigned int DPPPerPlane,
476 unsigned int NumberOfCursors,
477 double DPPCLKDelaySubtotal,
478 double DPPCLKDelaySCL,
479 double DPPCLKDelaySCLLBOnly,
480 double DPPCLKDelayCNVCFormater,
481 double DPPCLKDelayCNVCCursor,
482 double DISPCLKDelaySubtotal,
483 unsigned int ScalerRecoutWidth,
484 enum output_format_class OutputFormat,
486 unsigned int SwathWidthSingleDPPY,
487 double BytePerPixelDETY,
488 double BytePerPixelDETC,
489 unsigned int SwathHeightY,
490 unsigned int SwathHeightC,
492 bool ProgressiveToInterlaceUnitInOPP,
493 double *DSTXAfterScaler,
494 double *DSTYAfterScaler
497 unsigned int DPPCycles, DISPCLKCycles;
498 double DataFabricLineDeliveryTimeLuma;
499 double DataFabricLineDeliveryTimeChroma;
500 double DSTTotalPixelsAfterScaler;
502 DataFabricLineDeliveryTimeLuma = SwathWidthSingleDPPY * SwathHeightY * dml_ceil(BytePerPixelDETY, 1) / (mode_lib->vba.ReturnBW * ReadBandwidthPlaneLuma / TotalDataReadBandwidth);
503 mode_lib->vba.LastPixelOfLineExtraWatermark = dml_max(mode_lib->vba.LastPixelOfLineExtraWatermark, DataFabricLineDeliveryTimeLuma - DisplayPipeLineDeliveryTimeLuma);
505 if (BytePerPixelDETC != 0) {
506 DataFabricLineDeliveryTimeChroma = SwathWidthSingleDPPY / 2 * SwathHeightC * dml_ceil(BytePerPixelDETC, 2) / (mode_lib->vba.ReturnBW * ReadBandwidthPlaneChroma / TotalDataReadBandwidth);
507 mode_lib->vba.LastPixelOfLineExtraWatermark = dml_max(mode_lib->vba.LastPixelOfLineExtraWatermark, DataFabricLineDeliveryTimeChroma - DisplayPipeLineDeliveryTimeChroma);
511 DPPCycles = DPPCLKDelaySubtotal + DPPCLKDelaySCL;
513 DPPCycles = DPPCLKDelaySubtotal + DPPCLKDelaySCLLBOnly;
515 DPPCycles = DPPCycles + DPPCLKDelayCNVCFormater + NumberOfCursors * DPPCLKDelayCNVCCursor;
517 DISPCLKCycles = DISPCLKDelaySubtotal;
519 if (DPPCLK == 0.0 || DISPCLK == 0.0)
522 *DSTXAfterScaler = DPPCycles * PixelClock / DPPCLK + DISPCLKCycles * PixelClock / DISPCLK
526 *DSTXAfterScaler = *DSTXAfterScaler + ScalerRecoutWidth;
528 if (OutputFormat == dm_420 || (Interlace && ProgressiveToInterlaceUnitInOPP))
529 *DSTYAfterScaler = 1;
531 *DSTYAfterScaler = 0;
533 DSTTotalPixelsAfterScaler = ((double) (*DSTYAfterScaler * HTotal)) + *DSTXAfterScaler;
534 *DSTYAfterScaler = dml_floor(DSTTotalPixelsAfterScaler / HTotal, 1);
535 *DSTXAfterScaler = DSTTotalPixelsAfterScaler - ((double) (*DSTYAfterScaler * HTotal));
540 static bool CalculatePrefetchSchedule(
541 struct display_mode_lib *mode_lib,
545 double DCFCLKDeepSleep,
546 unsigned int DPPPerPlane,
547 unsigned int NumberOfCursors,
550 unsigned int MaxInterDCNTileRepeaters,
551 unsigned int VStartup,
552 unsigned int PageTableLevels,
554 bool DynamicMetadataEnable,
555 unsigned int DynamicMetadataLinesBeforeActiveRequired,
556 unsigned int DynamicMetadataTransmittedBytes,
558 double UrgentLatencyPixelDataOnly,
559 double UrgentExtraLatency,
561 unsigned int PDEAndMetaPTEBytesFrame,
562 unsigned int MetaRowByte,
563 unsigned int PixelPTEBytesPerRow,
564 double PrefetchSourceLinesY,
565 unsigned int SwathWidthY,
566 double BytePerPixelDETY,
567 double VInitPreFillY,
568 unsigned int MaxNumSwathY,
569 double PrefetchSourceLinesC,
570 double BytePerPixelDETC,
571 double VInitPreFillC,
572 unsigned int MaxNumSwathC,
573 unsigned int SwathHeightY,
574 unsigned int SwathHeightC,
577 double XFCRemoteSurfaceFlipDelay,
578 bool InterlaceEnable,
579 bool ProgressiveToInterlaceUnitInOPP,
580 double DSTXAfterScaler,
581 double DSTYAfterScaler,
582 double *DestinationLinesForPrefetch,
583 double *PrefetchBandwidth,
584 double *DestinationLinesToRequestVMInVBlank,
585 double *DestinationLinesToRequestRowInVBlank,
586 double *VRatioPrefetchY,
587 double *VRatioPrefetchC,
588 double *RequiredPrefetchPixDataBW,
590 unsigned int *VUpdateOffsetPix,
591 double *VUpdateWidthPix,
592 double *VReadyOffsetPix)
594 bool MyError = false;
595 double TotalRepeaterDelayTime;
596 double Tdm, LineTime, Tsetup;
597 double dst_y_prefetch_equ;
599 double prefetch_bw_oto;
603 double dst_y_prefetch_oto;
604 double TimeForFetchingMetaPTE = 0;
605 double TimeForFetchingRowInVBlank = 0;
606 double LinesToRequestPrefetchPixelData = 0;
608 *VUpdateOffsetPix = dml_ceil(HTotal / 4.0, 1);
609 TotalRepeaterDelayTime = MaxInterDCNTileRepeaters * (2.0 / DPPCLK + 3.0 / DISPCLK);
610 *VUpdateWidthPix = (14.0 / DCFCLKDeepSleep + 12.0 / DPPCLK + TotalRepeaterDelayTime)
613 *VReadyOffsetPix = dml_max(
615 TotalRepeaterDelayTime + 20.0 / DCFCLKDeepSleep + 10.0 / DPPCLK)
618 Tsetup = (double) (*VUpdateOffsetPix + *VUpdateWidthPix + *VReadyOffsetPix) / PixelClock;
620 LineTime = (double) HTotal / PixelClock;
622 if (DynamicMetadataEnable) {
623 double Tdmbf, Tdmec, Tdmsks;
625 Tdm = dml_max(0.0, UrgentExtraLatency - TCalc);
626 Tdmbf = DynamicMetadataTransmittedBytes / 4.0 / DISPCLK;
628 if (DynamicMetadataLinesBeforeActiveRequired == 0)
629 Tdmsks = VBlank * LineTime / 2.0;
631 Tdmsks = DynamicMetadataLinesBeforeActiveRequired * LineTime;
632 if (InterlaceEnable && !ProgressiveToInterlaceUnitInOPP)
634 if (VStartup * LineTime
635 < Tsetup + TWait + UrgentExtraLatency + Tdmbf + Tdmec + Tdmsks) {
642 if (PageTableLevels == 4)
643 *Tno_bw = UrgentExtraLatency + UrgentLatencyPixelDataOnly;
644 else if (PageTableLevels == 3)
645 *Tno_bw = UrgentExtraLatency;
648 } else if (DCCEnable)
651 *Tno_bw = LineTime / 4;
653 dst_y_prefetch_equ = VStartup - dml_max(TCalc + TWait, XFCRemoteSurfaceFlipDelay) / LineTime
654 - (Tsetup + Tdm) / LineTime
655 - (DSTYAfterScaler + DSTXAfterScaler / HTotal);
657 Tsw_oto = dml_max(PrefetchSourceLinesY, PrefetchSourceLinesC) * LineTime;
659 prefetch_bw_oto = (MetaRowByte + PixelPTEBytesPerRow
660 + PrefetchSourceLinesY * SwathWidthY * dml_ceil(BytePerPixelDETY, 1)
661 + PrefetchSourceLinesC * SwathWidthY / 2 * dml_ceil(BytePerPixelDETC, 2))
664 if (GPUVMEnable == true) {
667 *Tno_bw + PDEAndMetaPTEBytesFrame / prefetch_bw_oto,
670 + UrgentLatencyPixelDataOnly
675 Tvm_oto = LineTime / 4.0;
677 if ((GPUVMEnable == true || DCCEnable == true)) {
679 (MetaRowByte + PixelPTEBytesPerRow) / prefetch_bw_oto,
680 dml_max(UrgentLatencyPixelDataOnly, dml_max(LineTime - Tvm_oto, LineTime / 4)));
682 Tr0_oto = LineTime - Tvm_oto;
684 Tpre_oto = Tvm_oto + Tr0_oto + Tsw_oto;
686 dst_y_prefetch_oto = Tpre_oto / LineTime;
688 if (dst_y_prefetch_oto < dst_y_prefetch_equ)
689 *DestinationLinesForPrefetch = dst_y_prefetch_oto;
691 *DestinationLinesForPrefetch = dst_y_prefetch_equ;
693 *DestinationLinesForPrefetch = dml_floor(4.0 * (*DestinationLinesForPrefetch + 0.125), 1)
696 dml_print("DML: VStartup: %d\n", VStartup);
697 dml_print("DML: TCalc: %f\n", TCalc);
698 dml_print("DML: TWait: %f\n", TWait);
699 dml_print("DML: XFCRemoteSurfaceFlipDelay: %f\n", XFCRemoteSurfaceFlipDelay);
700 dml_print("DML: LineTime: %f\n", LineTime);
701 dml_print("DML: Tsetup: %f\n", Tsetup);
702 dml_print("DML: Tdm: %f\n", Tdm);
703 dml_print("DML: DSTYAfterScaler: %f\n", DSTYAfterScaler);
704 dml_print("DML: DSTXAfterScaler: %f\n", DSTXAfterScaler);
705 dml_print("DML: HTotal: %d\n", HTotal);
707 *PrefetchBandwidth = 0;
708 *DestinationLinesToRequestVMInVBlank = 0;
709 *DestinationLinesToRequestRowInVBlank = 0;
710 *VRatioPrefetchY = 0;
711 *VRatioPrefetchC = 0;
712 *RequiredPrefetchPixDataBW = 0;
713 if (*DestinationLinesForPrefetch > 1) {
714 *PrefetchBandwidth = (PDEAndMetaPTEBytesFrame + 2 * MetaRowByte
715 + 2 * PixelPTEBytesPerRow
716 + PrefetchSourceLinesY * SwathWidthY * dml_ceil(BytePerPixelDETY, 1)
717 + PrefetchSourceLinesC * SwathWidthY / 2
718 * dml_ceil(BytePerPixelDETC, 2))
719 / (*DestinationLinesForPrefetch * LineTime - *Tno_bw);
721 TimeForFetchingMetaPTE =
724 + (double) PDEAndMetaPTEBytesFrame
725 / *PrefetchBandwidth,
728 + UrgentLatencyPixelDataOnly
733 if (NumberOfCursors > 0 || XFCEnabled)
734 TimeForFetchingMetaPTE = LineTime / 4;
736 TimeForFetchingMetaPTE = 0.0;
739 if ((GPUVMEnable == true || DCCEnable == true)) {
740 TimeForFetchingRowInVBlank =
742 (MetaRowByte + PixelPTEBytesPerRow)
743 / *PrefetchBandwidth,
745 UrgentLatencyPixelDataOnly,
748 - TimeForFetchingMetaPTE,
752 if (NumberOfCursors > 0 || XFCEnabled)
753 TimeForFetchingRowInVBlank = LineTime - TimeForFetchingMetaPTE;
755 TimeForFetchingRowInVBlank = 0.0;
758 *DestinationLinesToRequestVMInVBlank = dml_floor(
759 4.0 * (TimeForFetchingMetaPTE / LineTime + 0.125),
762 *DestinationLinesToRequestRowInVBlank = dml_floor(
763 4.0 * (TimeForFetchingRowInVBlank / LineTime + 0.125),
766 LinesToRequestPrefetchPixelData =
767 *DestinationLinesForPrefetch
768 - ((NumberOfCursors > 0 || GPUVMEnable
770 (*DestinationLinesToRequestVMInVBlank
771 + *DestinationLinesToRequestRowInVBlank) :
774 if (LinesToRequestPrefetchPixelData > 0) {
776 *VRatioPrefetchY = (double) PrefetchSourceLinesY
777 / LinesToRequestPrefetchPixelData;
778 *VRatioPrefetchY = dml_max(*VRatioPrefetchY, 1.0);
779 if ((SwathHeightY > 4) && (VInitPreFillY > 3)) {
780 if (LinesToRequestPrefetchPixelData > (VInitPreFillY - 3.0) / 2.0) {
783 (double) PrefetchSourceLinesY
784 / LinesToRequestPrefetchPixelData,
785 (double) MaxNumSwathY
787 / (LinesToRequestPrefetchPixelData
791 *VRatioPrefetchY = dml_max(*VRatioPrefetchY, 1.0);
794 *VRatioPrefetchY = 0;
798 *VRatioPrefetchC = (double) PrefetchSourceLinesC
799 / LinesToRequestPrefetchPixelData;
800 *VRatioPrefetchC = dml_max(*VRatioPrefetchC, 1.0);
802 if ((SwathHeightC > 4)) {
803 if (LinesToRequestPrefetchPixelData > (VInitPreFillC - 3.0) / 2.0) {
807 (double) MaxNumSwathC
809 / (LinesToRequestPrefetchPixelData
813 *VRatioPrefetchC = dml_max(*VRatioPrefetchC, 1.0);
816 *VRatioPrefetchC = 0;
820 *RequiredPrefetchPixDataBW =
822 * ((double) PrefetchSourceLinesY
823 / LinesToRequestPrefetchPixelData
827 + (double) PrefetchSourceLinesC
828 / LinesToRequestPrefetchPixelData
833 * SwathWidthY / LineTime;
836 *VRatioPrefetchY = 0;
837 *VRatioPrefetchC = 0;
838 *RequiredPrefetchPixDataBW = 0;
846 *PrefetchBandwidth = 0;
847 TimeForFetchingMetaPTE = 0;
848 TimeForFetchingRowInVBlank = 0;
849 *DestinationLinesToRequestVMInVBlank = 0;
850 *DestinationLinesToRequestRowInVBlank = 0;
851 *DestinationLinesForPrefetch = 0;
852 LinesToRequestPrefetchPixelData = 0;
853 *VRatioPrefetchY = 0;
854 *VRatioPrefetchC = 0;
855 *RequiredPrefetchPixDataBW = 0;
861 static double RoundToDFSGranularityUp(double Clock, double VCOSpeed)
863 return VCOSpeed * 4 / dml_floor(VCOSpeed * 4 / Clock, 1);
866 static double RoundToDFSGranularityDown(double Clock, double VCOSpeed)
868 return VCOSpeed * 4 / dml_ceil(VCOSpeed * 4 / Clock, 1);
871 static double CalculatePrefetchSourceLines(
872 struct display_mode_lib *mode_lib,
876 bool ProgressiveToInterlaceUnitInOPP,
877 unsigned int SwathHeight,
878 unsigned int ViewportYStart,
879 double *VInitPreFill,
880 unsigned int *MaxNumSwath)
882 unsigned int MaxPartialSwath;
884 if (ProgressiveToInterlaceUnitInOPP)
885 *VInitPreFill = dml_floor((VRatio + vtaps + 1) / 2.0, 1);
887 *VInitPreFill = dml_floor((VRatio + vtaps + 1 + Interlace * 0.5 * VRatio) / 2.0, 1);
889 if (!mode_lib->vba.IgnoreViewportPositioning) {
891 *MaxNumSwath = dml_ceil((*VInitPreFill - 1.0) / SwathHeight, 1) + 1.0;
893 if (*VInitPreFill > 1.0)
894 MaxPartialSwath = (unsigned int) (*VInitPreFill - 2) % SwathHeight;
896 MaxPartialSwath = (unsigned int) (*VInitPreFill + SwathHeight - 2)
898 MaxPartialSwath = dml_max(1U, MaxPartialSwath);
902 if (ViewportYStart != 0)
904 "WARNING DML: using viewport y position of 0 even though actual viewport y position is non-zero in prefetch source lines calculation\n");
906 *MaxNumSwath = dml_ceil(*VInitPreFill / SwathHeight, 1);
908 if (*VInitPreFill > 1.0)
909 MaxPartialSwath = (unsigned int) (*VInitPreFill - 1) % SwathHeight;
911 MaxPartialSwath = (unsigned int) (*VInitPreFill + SwathHeight - 1)
915 return *MaxNumSwath * SwathHeight + MaxPartialSwath;
918 static unsigned int CalculateVMAndRowBytes(
919 struct display_mode_lib *mode_lib,
921 unsigned int BlockHeight256Bytes,
922 unsigned int BlockWidth256Bytes,
923 enum source_format_class SourcePixelFormat,
924 unsigned int SurfaceTiling,
925 unsigned int BytePerPixel,
926 enum scan_direction_class ScanDirection,
927 unsigned int ViewportWidth,
928 unsigned int ViewportHeight,
929 unsigned int SwathWidth,
931 unsigned int VMMPageSize,
932 unsigned int PTEBufferSizeInRequestsLuma,
933 unsigned int PDEProcessingBufIn64KBReqs,
935 unsigned int DCCMetaPitch,
936 unsigned int *MacroTileWidth,
937 unsigned int *MetaRowByte,
938 unsigned int *PixelPTEBytesPerRow,
939 bool *PTEBufferSizeNotExceeded,
940 unsigned int *dpte_row_height,
941 unsigned int *meta_row_height)
943 unsigned int MetaRequestHeight;
944 unsigned int MetaRequestWidth;
945 unsigned int MetaSurfWidth;
946 unsigned int MetaSurfHeight;
947 unsigned int MPDEBytesFrame;
948 unsigned int MetaPTEBytesFrame;
949 unsigned int DCCMetaSurfaceBytes;
951 unsigned int MacroTileSizeBytes;
952 unsigned int MacroTileHeight;
953 unsigned int DPDE0BytesFrame;
954 unsigned int ExtraDPDEBytesFrame;
955 unsigned int PDEAndMetaPTEBytesFrame;
957 if (DCCEnable == true) {
958 MetaRequestHeight = 8 * BlockHeight256Bytes;
959 MetaRequestWidth = 8 * BlockWidth256Bytes;
960 if (ScanDirection == dm_horz) {
961 *meta_row_height = MetaRequestHeight;
962 MetaSurfWidth = dml_ceil((double) SwathWidth - 1, MetaRequestWidth)
964 *MetaRowByte = MetaSurfWidth * MetaRequestHeight * BytePerPixel / 256.0;
966 *meta_row_height = MetaRequestWidth;
967 MetaSurfHeight = dml_ceil((double) SwathWidth - 1, MetaRequestHeight)
969 *MetaRowByte = MetaSurfHeight * MetaRequestWidth * BytePerPixel / 256.0;
971 if (ScanDirection == dm_horz) {
972 DCCMetaSurfaceBytes = DCCMetaPitch
973 * (dml_ceil(ViewportHeight - 1, 64 * BlockHeight256Bytes)
974 + 64 * BlockHeight256Bytes) * BytePerPixel
977 DCCMetaSurfaceBytes = DCCMetaPitch
979 (double) ViewportHeight - 1,
980 64 * BlockHeight256Bytes)
981 + 64 * BlockHeight256Bytes) * BytePerPixel
984 if (GPUVMEnable == true) {
985 MetaPTEBytesFrame = (dml_ceil(
986 (double) (DCCMetaSurfaceBytes - VMMPageSize)
989 MPDEBytesFrame = 128 * (mode_lib->vba.GPUVMMaxPageTableLevels - 1);
991 MetaPTEBytesFrame = 0;
995 MetaPTEBytesFrame = 0;
1000 if (SurfaceTiling == dm_sw_linear || SurfaceTiling == dm_sw_gfx7_2d_thin_gl || SurfaceTiling == dm_sw_gfx7_2d_thin_lvp) {
1001 MacroTileSizeBytes = 256;
1002 MacroTileHeight = BlockHeight256Bytes;
1003 } else if (SurfaceTiling == dm_sw_4kb_s || SurfaceTiling == dm_sw_4kb_s_x
1004 || SurfaceTiling == dm_sw_4kb_d || SurfaceTiling == dm_sw_4kb_d_x) {
1005 MacroTileSizeBytes = 4096;
1006 MacroTileHeight = 4 * BlockHeight256Bytes;
1007 } else if (SurfaceTiling == dm_sw_64kb_s || SurfaceTiling == dm_sw_64kb_s_t
1008 || SurfaceTiling == dm_sw_64kb_s_x || SurfaceTiling == dm_sw_64kb_d
1009 || SurfaceTiling == dm_sw_64kb_d_t || SurfaceTiling == dm_sw_64kb_d_x
1010 || SurfaceTiling == dm_sw_64kb_r_x) {
1011 MacroTileSizeBytes = 65536;
1012 MacroTileHeight = 16 * BlockHeight256Bytes;
1014 MacroTileSizeBytes = 262144;
1015 MacroTileHeight = 32 * BlockHeight256Bytes;
1017 *MacroTileWidth = MacroTileSizeBytes / BytePerPixel / MacroTileHeight;
1019 if (GPUVMEnable == true && mode_lib->vba.GPUVMMaxPageTableLevels > 1) {
1020 if (ScanDirection == dm_horz) {
1031 - MacroTileSizeBytes)
1046 - MacroTileSizeBytes)
1051 ExtraDPDEBytesFrame = 128 * (mode_lib->vba.GPUVMMaxPageTableLevels - 2);
1053 DPDE0BytesFrame = 0;
1054 ExtraDPDEBytesFrame = 0;
1057 PDEAndMetaPTEBytesFrame = MetaPTEBytesFrame + MPDEBytesFrame + DPDE0BytesFrame
1058 + ExtraDPDEBytesFrame;
1060 if (GPUVMEnable == true) {
1061 unsigned int PTERequestSize;
1062 unsigned int PixelPTEReqHeight;
1063 unsigned int PixelPTEReqWidth;
1064 double FractionOfPTEReturnDrop;
1065 unsigned int EffectivePDEProcessingBufIn64KBReqs;
1067 if (SurfaceTiling == dm_sw_linear) {
1068 PixelPTEReqHeight = 1;
1069 PixelPTEReqWidth = 8.0 * VMMPageSize / BytePerPixel;
1070 PTERequestSize = 64;
1071 FractionOfPTEReturnDrop = 0;
1072 } else if (MacroTileSizeBytes == 4096) {
1073 PixelPTEReqHeight = MacroTileHeight;
1074 PixelPTEReqWidth = 8 * *MacroTileWidth;
1075 PTERequestSize = 64;
1076 if (ScanDirection == dm_horz)
1077 FractionOfPTEReturnDrop = 0;
1079 FractionOfPTEReturnDrop = 7 / 8;
1080 } else if (VMMPageSize == 4096 && MacroTileSizeBytes > 4096) {
1081 PixelPTEReqHeight = 16 * BlockHeight256Bytes;
1082 PixelPTEReqWidth = 16 * BlockWidth256Bytes;
1083 PTERequestSize = 128;
1084 FractionOfPTEReturnDrop = 0;
1086 PixelPTEReqHeight = MacroTileHeight;
1087 PixelPTEReqWidth = 8 * *MacroTileWidth;
1088 PTERequestSize = 64;
1089 FractionOfPTEReturnDrop = 0;
1092 if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10)
1093 EffectivePDEProcessingBufIn64KBReqs = PDEProcessingBufIn64KBReqs / 2;
1095 EffectivePDEProcessingBufIn64KBReqs = PDEProcessingBufIn64KBReqs;
1097 if (SurfaceTiling == dm_sw_linear) {
1102 << (unsigned int) dml_floor(
1105 (double) PTEBufferSizeInRequestsLuma
1107 EffectivePDEProcessingBufIn64KBReqs
1112 *PixelPTEBytesPerRow = PTERequestSize
1114 (double) (Pitch * *dpte_row_height - 1)
1117 } else if (ScanDirection == dm_horz) {
1118 *dpte_row_height = PixelPTEReqHeight;
1119 *PixelPTEBytesPerRow = PTERequestSize
1120 * (dml_ceil(((double) SwathWidth - 1) / PixelPTEReqWidth, 1)
1123 *dpte_row_height = dml_min(PixelPTEReqWidth, *MacroTileWidth);
1124 *PixelPTEBytesPerRow = PTERequestSize
1126 ((double) SwathWidth - 1)
1127 / PixelPTEReqHeight,
1130 if (*PixelPTEBytesPerRow * (1 - FractionOfPTEReturnDrop)
1131 <= 64 * PTEBufferSizeInRequestsLuma) {
1132 *PTEBufferSizeNotExceeded = true;
1134 *PTEBufferSizeNotExceeded = false;
1137 *PixelPTEBytesPerRow = 0;
1138 *PTEBufferSizeNotExceeded = true;
1141 return PDEAndMetaPTEBytesFrame;
1144 static void dml20v2_DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(
1145 struct display_mode_lib *mode_lib)
1149 mode_lib->vba.WritebackDISPCLK = 0.0;
1150 mode_lib->vba.DISPCLKWithRamping = 0;
1151 mode_lib->vba.DISPCLKWithoutRamping = 0;
1152 mode_lib->vba.GlobalDPPCLK = 0.0;
1154 // dml_ml->vba.DISPCLK and dml_ml->vba.DPPCLK Calculation
1156 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1157 if (mode_lib->vba.WritebackEnable[k]) {
1158 mode_lib->vba.WritebackDISPCLK =
1160 mode_lib->vba.WritebackDISPCLK,
1161 CalculateWriteBackDISPCLK(
1162 mode_lib->vba.WritebackPixelFormat[k],
1163 mode_lib->vba.PixelClock[k],
1164 mode_lib->vba.WritebackHRatio[k],
1165 mode_lib->vba.WritebackVRatio[k],
1166 mode_lib->vba.WritebackLumaHTaps[k],
1167 mode_lib->vba.WritebackLumaVTaps[k],
1168 mode_lib->vba.WritebackChromaHTaps[k],
1169 mode_lib->vba.WritebackChromaVTaps[k],
1170 mode_lib->vba.WritebackDestinationWidth[k],
1171 mode_lib->vba.HTotal[k],
1172 mode_lib->vba.WritebackChromaLineBufferWidth));
1176 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1177 if (mode_lib->vba.HRatio[k] > 1) {
1178 mode_lib->vba.PSCL_THROUGHPUT_LUMA[k] = dml_min(
1179 mode_lib->vba.MaxDCHUBToPSCLThroughput,
1180 mode_lib->vba.MaxPSCLToLBThroughput
1181 * mode_lib->vba.HRatio[k]
1183 mode_lib->vba.htaps[k]
1187 mode_lib->vba.PSCL_THROUGHPUT_LUMA[k] = dml_min(
1188 mode_lib->vba.MaxDCHUBToPSCLThroughput,
1189 mode_lib->vba.MaxPSCLToLBThroughput);
1192 mode_lib->vba.DPPCLKUsingSingleDPPLuma =
1193 mode_lib->vba.PixelClock[k]
1195 mode_lib->vba.vtaps[k] / 6.0
1198 mode_lib->vba.HRatio[k]),
1200 mode_lib->vba.HRatio[k]
1201 * mode_lib->vba.VRatio[k]
1202 / mode_lib->vba.PSCL_THROUGHPUT_LUMA[k],
1205 if ((mode_lib->vba.htaps[k] > 6 || mode_lib->vba.vtaps[k] > 6)
1206 && mode_lib->vba.DPPCLKUsingSingleDPPLuma
1207 < 2 * mode_lib->vba.PixelClock[k]) {
1208 mode_lib->vba.DPPCLKUsingSingleDPPLuma = 2 * mode_lib->vba.PixelClock[k];
1211 if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8
1212 && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) {
1213 mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k] = 0.0;
1214 mode_lib->vba.DPPCLKUsingSingleDPP[k] =
1215 mode_lib->vba.DPPCLKUsingSingleDPPLuma;
1217 if (mode_lib->vba.HRatio[k] > 1) {
1218 mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k] =
1220 mode_lib->vba.MaxDCHUBToPSCLThroughput,
1221 mode_lib->vba.MaxPSCLToLBThroughput
1222 * mode_lib->vba.HRatio[k]
1225 mode_lib->vba.HTAPsChroma[k]
1229 mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k] = dml_min(
1230 mode_lib->vba.MaxDCHUBToPSCLThroughput,
1231 mode_lib->vba.MaxPSCLToLBThroughput);
1233 mode_lib->vba.DPPCLKUsingSingleDPPChroma =
1234 mode_lib->vba.PixelClock[k]
1236 mode_lib->vba.VTAPsChroma[k]
1240 mode_lib->vba.HRatio[k]
1243 mode_lib->vba.HRatio[k]
1244 * mode_lib->vba.VRatio[k]
1246 / mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k],
1249 if ((mode_lib->vba.HTAPsChroma[k] > 6 || mode_lib->vba.VTAPsChroma[k] > 6)
1250 && mode_lib->vba.DPPCLKUsingSingleDPPChroma
1251 < 2 * mode_lib->vba.PixelClock[k]) {
1252 mode_lib->vba.DPPCLKUsingSingleDPPChroma = 2
1253 * mode_lib->vba.PixelClock[k];
1256 mode_lib->vba.DPPCLKUsingSingleDPP[k] = dml_max(
1257 mode_lib->vba.DPPCLKUsingSingleDPPLuma,
1258 mode_lib->vba.DPPCLKUsingSingleDPPChroma);
1262 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1263 if (mode_lib->vba.BlendingAndTiming[k] != k)
1265 if (mode_lib->vba.ODMCombineEnabled[k]) {
1266 mode_lib->vba.DISPCLKWithRamping =
1268 mode_lib->vba.DISPCLKWithRamping,
1269 mode_lib->vba.PixelClock[k] / 2
1271 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
1274 + mode_lib->vba.DISPCLKRampingMargin
1276 mode_lib->vba.DISPCLKWithoutRamping =
1278 mode_lib->vba.DISPCLKWithoutRamping,
1279 mode_lib->vba.PixelClock[k] / 2
1281 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
1283 } else if (!mode_lib->vba.ODMCombineEnabled[k]) {
1284 mode_lib->vba.DISPCLKWithRamping =
1286 mode_lib->vba.DISPCLKWithRamping,
1287 mode_lib->vba.PixelClock[k]
1289 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
1292 + mode_lib->vba.DISPCLKRampingMargin
1294 mode_lib->vba.DISPCLKWithoutRamping =
1296 mode_lib->vba.DISPCLKWithoutRamping,
1297 mode_lib->vba.PixelClock[k]
1299 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
1304 mode_lib->vba.DISPCLKWithRamping = dml_max(
1305 mode_lib->vba.DISPCLKWithRamping,
1306 mode_lib->vba.WritebackDISPCLK);
1307 mode_lib->vba.DISPCLKWithoutRamping = dml_max(
1308 mode_lib->vba.DISPCLKWithoutRamping,
1309 mode_lib->vba.WritebackDISPCLK);
1311 ASSERT(mode_lib->vba.DISPCLKDPPCLKVCOSpeed != 0);
1312 mode_lib->vba.DISPCLKWithRampingRoundedToDFSGranularity = RoundToDFSGranularityUp(
1313 mode_lib->vba.DISPCLKWithRamping,
1314 mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
1315 mode_lib->vba.DISPCLKWithoutRampingRoundedToDFSGranularity = RoundToDFSGranularityUp(
1316 mode_lib->vba.DISPCLKWithoutRamping,
1317 mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
1318 mode_lib->vba.MaxDispclkRoundedToDFSGranularity = RoundToDFSGranularityDown(
1319 mode_lib->vba.soc.clock_limits[mode_lib->vba.soc.num_states].dispclk_mhz,
1320 mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
1321 if (mode_lib->vba.DISPCLKWithoutRampingRoundedToDFSGranularity
1322 > mode_lib->vba.MaxDispclkRoundedToDFSGranularity) {
1323 mode_lib->vba.DISPCLK_calculated =
1324 mode_lib->vba.DISPCLKWithoutRampingRoundedToDFSGranularity;
1325 } else if (mode_lib->vba.DISPCLKWithRampingRoundedToDFSGranularity
1326 > mode_lib->vba.MaxDispclkRoundedToDFSGranularity) {
1327 mode_lib->vba.DISPCLK_calculated = mode_lib->vba.MaxDispclkRoundedToDFSGranularity;
1329 mode_lib->vba.DISPCLK_calculated =
1330 mode_lib->vba.DISPCLKWithRampingRoundedToDFSGranularity;
1332 DTRACE(" dispclk_mhz (calculated) = %f", mode_lib->vba.DISPCLK_calculated);
1334 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1335 if (mode_lib->vba.DPPPerPlane[k] == 0) {
1336 mode_lib->vba.DPPCLK_calculated[k] = 0;
1338 mode_lib->vba.DPPCLK_calculated[k] = mode_lib->vba.DPPCLKUsingSingleDPP[k]
1339 / mode_lib->vba.DPPPerPlane[k]
1340 * (1 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100);
1342 mode_lib->vba.GlobalDPPCLK = dml_max(
1343 mode_lib->vba.GlobalDPPCLK,
1344 mode_lib->vba.DPPCLK_calculated[k]);
1346 mode_lib->vba.GlobalDPPCLK = RoundToDFSGranularityUp(
1347 mode_lib->vba.GlobalDPPCLK,
1348 mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
1349 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1350 mode_lib->vba.DPPCLK_calculated[k] = mode_lib->vba.GlobalDPPCLK / 255
1352 mode_lib->vba.DPPCLK_calculated[k] * 255
1353 / mode_lib->vba.GlobalDPPCLK,
1355 DTRACE(" dppclk_mhz[%i] (calculated) = %f", k, mode_lib->vba.DPPCLK_calculated[k]);
1359 mode_lib->vba.DCCEnabledAnyPlane = false;
1360 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k)
1361 if (mode_lib->vba.DCCEnable[k])
1362 mode_lib->vba.DCCEnabledAnyPlane = true;
1364 mode_lib->vba.ReturnBandwidthToDCN = dml_min(
1365 mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLK,
1366 mode_lib->vba.FabricAndDRAMBandwidth * 1000)
1367 * mode_lib->vba.PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelDataOnly / 100;
1369 mode_lib->vba.ReturnBW = mode_lib->vba.ReturnBandwidthToDCN;
1370 mode_lib->vba.ReturnBW = adjust_ReturnBW(
1372 mode_lib->vba.ReturnBW,
1373 mode_lib->vba.DCCEnabledAnyPlane,
1374 mode_lib->vba.ReturnBandwidthToDCN);
1376 // Let's do this calculation again??
1377 mode_lib->vba.ReturnBandwidthToDCN = dml_min(
1378 mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLK,
1379 mode_lib->vba.FabricAndDRAMBandwidth * 1000);
1380 mode_lib->vba.ReturnBW = adjust_ReturnBW(
1382 mode_lib->vba.ReturnBW,
1383 mode_lib->vba.DCCEnabledAnyPlane,
1384 mode_lib->vba.ReturnBandwidthToDCN);
1386 DTRACE(" dcfclk_mhz = %f", mode_lib->vba.DCFCLK);
1387 DTRACE(" return_bw_to_dcn = %f", mode_lib->vba.ReturnBandwidthToDCN);
1388 DTRACE(" return_bus_bw = %f", mode_lib->vba.ReturnBW);
1390 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1391 bool MainPlaneDoesODMCombine = false;
1393 if (mode_lib->vba.SourceScan[k] == dm_horz)
1394 mode_lib->vba.SwathWidthSingleDPPY[k] = mode_lib->vba.ViewportWidth[k];
1396 mode_lib->vba.SwathWidthSingleDPPY[k] = mode_lib->vba.ViewportHeight[k];
1398 if (mode_lib->vba.ODMCombineEnabled[k] == true)
1399 MainPlaneDoesODMCombine = true;
1400 for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j)
1401 if (mode_lib->vba.BlendingAndTiming[k] == j
1402 && mode_lib->vba.ODMCombineEnabled[j] == true)
1403 MainPlaneDoesODMCombine = true;
1405 if (MainPlaneDoesODMCombine == true)
1406 mode_lib->vba.SwathWidthY[k] = dml_min(
1407 (double) mode_lib->vba.SwathWidthSingleDPPY[k],
1409 mode_lib->vba.HActive[k] / 2.0
1410 * mode_lib->vba.HRatio[k]));
1412 if (mode_lib->vba.DPPPerPlane[k] == 0) {
1413 mode_lib->vba.SwathWidthY[k] = 0;
1415 mode_lib->vba.SwathWidthY[k] = mode_lib->vba.SwathWidthSingleDPPY[k]
1416 / mode_lib->vba.DPPPerPlane[k];
1421 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1422 if (mode_lib->vba.SourcePixelFormat[k] == dm_444_64) {
1423 mode_lib->vba.BytePerPixelDETY[k] = 8;
1424 mode_lib->vba.BytePerPixelDETC[k] = 0;
1425 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_32) {
1426 mode_lib->vba.BytePerPixelDETY[k] = 4;
1427 mode_lib->vba.BytePerPixelDETC[k] = 0;
1428 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_16) {
1429 mode_lib->vba.BytePerPixelDETY[k] = 2;
1430 mode_lib->vba.BytePerPixelDETC[k] = 0;
1431 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_8) {
1432 mode_lib->vba.BytePerPixelDETY[k] = 1;
1433 mode_lib->vba.BytePerPixelDETC[k] = 0;
1434 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8) {
1435 mode_lib->vba.BytePerPixelDETY[k] = 1;
1436 mode_lib->vba.BytePerPixelDETC[k] = 2;
1437 } else { // dm_420_10
1438 mode_lib->vba.BytePerPixelDETY[k] = 4.0 / 3.0;
1439 mode_lib->vba.BytePerPixelDETC[k] = 8.0 / 3.0;
1443 mode_lib->vba.TotalDataReadBandwidth = 0.0;
1444 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1445 mode_lib->vba.ReadBandwidthPlaneLuma[k] = mode_lib->vba.SwathWidthSingleDPPY[k]
1446 * dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1)
1447 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
1448 * mode_lib->vba.VRatio[k];
1449 mode_lib->vba.ReadBandwidthPlaneChroma[k] = mode_lib->vba.SwathWidthSingleDPPY[k]
1450 / 2 * dml_ceil(mode_lib->vba.BytePerPixelDETC[k], 2)
1451 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
1452 * mode_lib->vba.VRatio[k] / 2;
1454 " read_bw[%i] = %fBps",
1456 mode_lib->vba.ReadBandwidthPlaneLuma[k]
1457 + mode_lib->vba.ReadBandwidthPlaneChroma[k]);
1458 mode_lib->vba.TotalDataReadBandwidth += mode_lib->vba.ReadBandwidthPlaneLuma[k]
1459 + mode_lib->vba.ReadBandwidthPlaneChroma[k];
1462 mode_lib->vba.TotalDCCActiveDPP = 0;
1463 mode_lib->vba.TotalActiveDPP = 0;
1464 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1465 mode_lib->vba.TotalActiveDPP = mode_lib->vba.TotalActiveDPP
1466 + mode_lib->vba.DPPPerPlane[k];
1467 if (mode_lib->vba.DCCEnable[k])
1468 mode_lib->vba.TotalDCCActiveDPP = mode_lib->vba.TotalDCCActiveDPP
1469 + mode_lib->vba.DPPPerPlane[k];
1472 mode_lib->vba.UrgentRoundTripAndOutOfOrderLatency =
1473 (mode_lib->vba.RoundTripPingLatencyCycles + 32) / mode_lib->vba.DCFCLK
1474 + mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelDataOnly
1475 * mode_lib->vba.NumberOfChannels
1476 / mode_lib->vba.ReturnBW;
1478 mode_lib->vba.LastPixelOfLineExtraWatermark = 0;
1479 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1480 if (mode_lib->vba.VRatio[k] <= 1.0)
1481 mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k] =
1482 (double) mode_lib->vba.SwathWidthY[k]
1483 * mode_lib->vba.DPPPerPlane[k]
1484 / mode_lib->vba.HRatio[k]
1485 / mode_lib->vba.PixelClock[k];
1487 mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k] =
1488 (double) mode_lib->vba.SwathWidthY[k]
1489 / mode_lib->vba.PSCL_THROUGHPUT_LUMA[k]
1490 / mode_lib->vba.DPPCLK[k];
1492 if (mode_lib->vba.BytePerPixelDETC[k] == 0)
1493 mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k] = 0.0;
1494 else if (mode_lib->vba.VRatio[k] / 2.0 <= 1.0)
1495 mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k] =
1496 mode_lib->vba.SwathWidthY[k] / 2.0
1497 * mode_lib->vba.DPPPerPlane[k]
1498 / (mode_lib->vba.HRatio[k] / 2.0)
1499 / mode_lib->vba.PixelClock[k];
1501 mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k] =
1502 mode_lib->vba.SwathWidthY[k] / 2.0
1503 / mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k]
1504 / mode_lib->vba.DPPCLK[k];
1507 mode_lib->vba.UrgentExtraLatency = mode_lib->vba.UrgentRoundTripAndOutOfOrderLatency
1508 + (mode_lib->vba.TotalActiveDPP * mode_lib->vba.PixelChunkSizeInKByte
1509 + mode_lib->vba.TotalDCCActiveDPP
1510 * mode_lib->vba.MetaChunkSize) * 1024.0
1511 / mode_lib->vba.ReturnBW;
1513 if (mode_lib->vba.GPUVMEnable)
1514 mode_lib->vba.UrgentExtraLatency += mode_lib->vba.TotalActiveDPP
1515 * mode_lib->vba.PTEGroupSize / mode_lib->vba.ReturnBW;
1517 mode_lib->vba.UrgentWatermark = mode_lib->vba.UrgentLatencyPixelDataOnly
1518 + mode_lib->vba.LastPixelOfLineExtraWatermark
1519 + mode_lib->vba.UrgentExtraLatency;
1521 DTRACE(" urgent_extra_latency = %fus", mode_lib->vba.UrgentExtraLatency);
1522 DTRACE(" wm_urgent = %fus", mode_lib->vba.UrgentWatermark);
1524 mode_lib->vba.UrgentLatency = mode_lib->vba.UrgentLatencyPixelDataOnly;
1526 mode_lib->vba.TotalActiveWriteback = 0;
1527 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1528 if (mode_lib->vba.WritebackEnable[k])
1529 mode_lib->vba.TotalActiveWriteback = mode_lib->vba.TotalActiveWriteback + mode_lib->vba.ActiveWritebacksPerPlane[k];
1532 if (mode_lib->vba.TotalActiveWriteback <= 1)
1533 mode_lib->vba.WritebackUrgentWatermark = mode_lib->vba.WritebackLatency;
1535 mode_lib->vba.WritebackUrgentWatermark = mode_lib->vba.WritebackLatency
1536 + mode_lib->vba.WritebackChunkSize * 1024.0 / 32
1537 / mode_lib->vba.SOCCLK;
1539 DTRACE(" wm_wb_urgent = %fus", mode_lib->vba.WritebackUrgentWatermark);
1541 // NB P-State/DRAM Clock Change Watermark
1542 mode_lib->vba.DRAMClockChangeWatermark = mode_lib->vba.DRAMClockChangeLatency
1543 + mode_lib->vba.UrgentWatermark;
1545 DTRACE(" wm_pstate_change = %fus", mode_lib->vba.DRAMClockChangeWatermark);
1547 DTRACE(" calculating wb pstate watermark");
1548 DTRACE(" total wb outputs %d", mode_lib->vba.TotalActiveWriteback);
1549 DTRACE(" socclk frequency %f Mhz", mode_lib->vba.SOCCLK);
1551 if (mode_lib->vba.TotalActiveWriteback <= 1)
1552 mode_lib->vba.WritebackDRAMClockChangeWatermark =
1553 mode_lib->vba.DRAMClockChangeLatency
1554 + mode_lib->vba.WritebackLatency;
1556 mode_lib->vba.WritebackDRAMClockChangeWatermark =
1557 mode_lib->vba.DRAMClockChangeLatency
1558 + mode_lib->vba.WritebackLatency
1559 + mode_lib->vba.WritebackChunkSize * 1024.0 / 32
1560 / mode_lib->vba.SOCCLK;
1562 DTRACE(" wm_wb_pstate %fus", mode_lib->vba.WritebackDRAMClockChangeWatermark);
1564 // Stutter Efficiency
1565 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1566 mode_lib->vba.LinesInDETY[k] = mode_lib->vba.DETBufferSizeY[k]
1567 / mode_lib->vba.BytePerPixelDETY[k] / mode_lib->vba.SwathWidthY[k];
1568 mode_lib->vba.LinesInDETYRoundedDownToSwath[k] = dml_floor(
1569 mode_lib->vba.LinesInDETY[k],
1570 mode_lib->vba.SwathHeightY[k]);
1571 mode_lib->vba.FullDETBufferingTimeY[k] =
1572 mode_lib->vba.LinesInDETYRoundedDownToSwath[k]
1573 * (mode_lib->vba.HTotal[k]
1574 / mode_lib->vba.PixelClock[k])
1575 / mode_lib->vba.VRatio[k];
1576 if (mode_lib->vba.BytePerPixelDETC[k] > 0) {
1577 mode_lib->vba.LinesInDETC[k] = mode_lib->vba.DETBufferSizeC[k]
1578 / mode_lib->vba.BytePerPixelDETC[k]
1579 / (mode_lib->vba.SwathWidthY[k] / 2);
1580 mode_lib->vba.LinesInDETCRoundedDownToSwath[k] = dml_floor(
1581 mode_lib->vba.LinesInDETC[k],
1582 mode_lib->vba.SwathHeightC[k]);
1583 mode_lib->vba.FullDETBufferingTimeC[k] =
1584 mode_lib->vba.LinesInDETCRoundedDownToSwath[k]
1585 * (mode_lib->vba.HTotal[k]
1586 / mode_lib->vba.PixelClock[k])
1587 / (mode_lib->vba.VRatio[k] / 2);
1589 mode_lib->vba.LinesInDETC[k] = 0;
1590 mode_lib->vba.LinesInDETCRoundedDownToSwath[k] = 0;
1591 mode_lib->vba.FullDETBufferingTimeC[k] = 999999;
1595 mode_lib->vba.MinFullDETBufferingTime = 999999.0;
1596 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1597 if (mode_lib->vba.FullDETBufferingTimeY[k]
1598 < mode_lib->vba.MinFullDETBufferingTime) {
1599 mode_lib->vba.MinFullDETBufferingTime =
1600 mode_lib->vba.FullDETBufferingTimeY[k];
1601 mode_lib->vba.FrameTimeForMinFullDETBufferingTime =
1602 (double) mode_lib->vba.VTotal[k] * mode_lib->vba.HTotal[k]
1603 / mode_lib->vba.PixelClock[k];
1605 if (mode_lib->vba.FullDETBufferingTimeC[k]
1606 < mode_lib->vba.MinFullDETBufferingTime) {
1607 mode_lib->vba.MinFullDETBufferingTime =
1608 mode_lib->vba.FullDETBufferingTimeC[k];
1609 mode_lib->vba.FrameTimeForMinFullDETBufferingTime =
1610 (double) mode_lib->vba.VTotal[k] * mode_lib->vba.HTotal[k]
1611 / mode_lib->vba.PixelClock[k];
1615 mode_lib->vba.AverageReadBandwidthGBytePerSecond = 0.0;
1616 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1617 if (mode_lib->vba.DCCEnable[k]) {
1618 mode_lib->vba.AverageReadBandwidthGBytePerSecond =
1619 mode_lib->vba.AverageReadBandwidthGBytePerSecond
1620 + mode_lib->vba.ReadBandwidthPlaneLuma[k]
1621 / mode_lib->vba.DCCRate[k]
1623 + mode_lib->vba.ReadBandwidthPlaneChroma[k]
1624 / mode_lib->vba.DCCRate[k]
1627 mode_lib->vba.AverageReadBandwidthGBytePerSecond =
1628 mode_lib->vba.AverageReadBandwidthGBytePerSecond
1629 + mode_lib->vba.ReadBandwidthPlaneLuma[k]
1631 + mode_lib->vba.ReadBandwidthPlaneChroma[k]
1634 if (mode_lib->vba.DCCEnable[k]) {
1635 mode_lib->vba.AverageReadBandwidthGBytePerSecond =
1636 mode_lib->vba.AverageReadBandwidthGBytePerSecond
1637 + mode_lib->vba.ReadBandwidthPlaneLuma[k]
1639 + mode_lib->vba.ReadBandwidthPlaneChroma[k]
1642 if (mode_lib->vba.GPUVMEnable) {
1643 mode_lib->vba.AverageReadBandwidthGBytePerSecond =
1644 mode_lib->vba.AverageReadBandwidthGBytePerSecond
1645 + mode_lib->vba.ReadBandwidthPlaneLuma[k]
1647 + mode_lib->vba.ReadBandwidthPlaneChroma[k]
1652 mode_lib->vba.PartOfBurstThatFitsInROB =
1654 mode_lib->vba.MinFullDETBufferingTime
1655 * mode_lib->vba.TotalDataReadBandwidth,
1656 mode_lib->vba.ROBBufferSizeInKByte * 1024
1657 * mode_lib->vba.TotalDataReadBandwidth
1658 / (mode_lib->vba.AverageReadBandwidthGBytePerSecond
1660 mode_lib->vba.StutterBurstTime = mode_lib->vba.PartOfBurstThatFitsInROB
1661 * (mode_lib->vba.AverageReadBandwidthGBytePerSecond * 1000)
1662 / mode_lib->vba.TotalDataReadBandwidth / mode_lib->vba.ReturnBW
1663 + (mode_lib->vba.MinFullDETBufferingTime
1664 * mode_lib->vba.TotalDataReadBandwidth
1665 - mode_lib->vba.PartOfBurstThatFitsInROB)
1666 / (mode_lib->vba.DCFCLK * 64);
1667 if (mode_lib->vba.TotalActiveWriteback == 0) {
1668 mode_lib->vba.StutterEfficiencyNotIncludingVBlank = (1
1669 - (mode_lib->vba.SRExitTime + mode_lib->vba.StutterBurstTime)
1670 / mode_lib->vba.MinFullDETBufferingTime) * 100;
1672 mode_lib->vba.StutterEfficiencyNotIncludingVBlank = 0;
1675 mode_lib->vba.SmallestVBlank = 999999;
1676 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1677 if (mode_lib->vba.SynchronizedVBlank || mode_lib->vba.NumberOfActivePlanes == 1) {
1678 mode_lib->vba.VBlankTime = (double) (mode_lib->vba.VTotal[k]
1679 - mode_lib->vba.VActive[k]) * mode_lib->vba.HTotal[k]
1680 / mode_lib->vba.PixelClock[k];
1682 mode_lib->vba.VBlankTime = 0;
1684 mode_lib->vba.SmallestVBlank = dml_min(
1685 mode_lib->vba.SmallestVBlank,
1686 mode_lib->vba.VBlankTime);
1689 mode_lib->vba.StutterEfficiency = (mode_lib->vba.StutterEfficiencyNotIncludingVBlank / 100
1690 * (mode_lib->vba.FrameTimeForMinFullDETBufferingTime
1691 - mode_lib->vba.SmallestVBlank)
1692 + mode_lib->vba.SmallestVBlank)
1693 / mode_lib->vba.FrameTimeForMinFullDETBufferingTime * 100;
1695 // dml_ml->vba.DCFCLK Deep Sleep
1696 mode_lib->vba.DCFCLKDeepSleep = 8.0;
1698 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; k++) {
1699 if (mode_lib->vba.BytePerPixelDETC[k] > 0) {
1700 mode_lib->vba.DCFCLKDeepSleepPerPlane[k] =
1702 1.1 * mode_lib->vba.SwathWidthY[k]
1704 mode_lib->vba.BytePerPixelDETY[k],
1706 / mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k],
1707 1.1 * mode_lib->vba.SwathWidthY[k] / 2.0
1709 mode_lib->vba.BytePerPixelDETC[k],
1711 / mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k]);
1713 mode_lib->vba.DCFCLKDeepSleepPerPlane[k] = 1.1 * mode_lib->vba.SwathWidthY[k]
1714 * dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1) / 64.0
1715 / mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k];
1716 mode_lib->vba.DCFCLKDeepSleepPerPlane[k] = dml_max(
1717 mode_lib->vba.DCFCLKDeepSleepPerPlane[k],
1718 mode_lib->vba.PixelClock[k] / 16.0);
1719 mode_lib->vba.DCFCLKDeepSleep = dml_max(
1720 mode_lib->vba.DCFCLKDeepSleep,
1721 mode_lib->vba.DCFCLKDeepSleepPerPlane[k]);
1724 " dcfclk_deepsleep_per_plane[%i] = %fMHz",
1726 mode_lib->vba.DCFCLKDeepSleepPerPlane[k]);
1729 DTRACE(" dcfclk_deepsleep_mhz = %fMHz", mode_lib->vba.DCFCLKDeepSleep);
1731 // Stutter Watermark
1732 mode_lib->vba.StutterExitWatermark = mode_lib->vba.SRExitTime
1733 + mode_lib->vba.LastPixelOfLineExtraWatermark
1734 + mode_lib->vba.UrgentExtraLatency + 10 / mode_lib->vba.DCFCLKDeepSleep;
1735 mode_lib->vba.StutterEnterPlusExitWatermark = mode_lib->vba.SREnterPlusExitTime
1736 + mode_lib->vba.LastPixelOfLineExtraWatermark
1737 + mode_lib->vba.UrgentExtraLatency;
1739 DTRACE(" wm_cstate_exit = %fus", mode_lib->vba.StutterExitWatermark);
1740 DTRACE(" wm_cstate_enter_exit = %fus", mode_lib->vba.StutterEnterPlusExitWatermark);
1742 // Urgent Latency Supported
1743 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1744 mode_lib->vba.EffectiveDETPlusLBLinesLuma =
1746 mode_lib->vba.LinesInDETY[k]
1748 mode_lib->vba.LinesInDETY[k]
1749 * mode_lib->vba.DPPCLK[k]
1750 * mode_lib->vba.BytePerPixelDETY[k]
1751 * mode_lib->vba.PSCL_THROUGHPUT_LUMA[k]
1752 / (mode_lib->vba.ReturnBW
1753 / mode_lib->vba.DPPPerPlane[k]),
1754 (double) mode_lib->vba.EffectiveLBLatencyHidingSourceLinesLuma),
1755 mode_lib->vba.SwathHeightY[k]);
1757 mode_lib->vba.UrgentLatencySupportUsLuma = mode_lib->vba.EffectiveDETPlusLBLinesLuma
1758 * (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
1759 / mode_lib->vba.VRatio[k]
1760 - mode_lib->vba.EffectiveDETPlusLBLinesLuma
1761 * mode_lib->vba.SwathWidthY[k]
1762 * mode_lib->vba.BytePerPixelDETY[k]
1763 / (mode_lib->vba.ReturnBW
1764 / mode_lib->vba.DPPPerPlane[k]);
1766 if (mode_lib->vba.BytePerPixelDETC[k] > 0) {
1767 mode_lib->vba.EffectiveDETPlusLBLinesChroma =
1769 mode_lib->vba.LinesInDETC[k]
1771 mode_lib->vba.LinesInDETC[k]
1772 * mode_lib->vba.DPPCLK[k]
1773 * mode_lib->vba.BytePerPixelDETC[k]
1774 * mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k]
1775 / (mode_lib->vba.ReturnBW
1776 / mode_lib->vba.DPPPerPlane[k]),
1777 (double) mode_lib->vba.EffectiveLBLatencyHidingSourceLinesChroma),
1778 mode_lib->vba.SwathHeightC[k]);
1779 mode_lib->vba.UrgentLatencySupportUsChroma =
1780 mode_lib->vba.EffectiveDETPlusLBLinesChroma
1781 * (mode_lib->vba.HTotal[k]
1782 / mode_lib->vba.PixelClock[k])
1783 / (mode_lib->vba.VRatio[k] / 2)
1784 - mode_lib->vba.EffectiveDETPlusLBLinesChroma
1785 * (mode_lib->vba.SwathWidthY[k]
1787 * mode_lib->vba.BytePerPixelDETC[k]
1788 / (mode_lib->vba.ReturnBW
1789 / mode_lib->vba.DPPPerPlane[k]);
1790 mode_lib->vba.UrgentLatencySupportUs[k] = dml_min(
1791 mode_lib->vba.UrgentLatencySupportUsLuma,
1792 mode_lib->vba.UrgentLatencySupportUsChroma);
1794 mode_lib->vba.UrgentLatencySupportUs[k] =
1795 mode_lib->vba.UrgentLatencySupportUsLuma;
1799 mode_lib->vba.MinUrgentLatencySupportUs = 999999;
1800 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1801 mode_lib->vba.MinUrgentLatencySupportUs = dml_min(
1802 mode_lib->vba.MinUrgentLatencySupportUs,
1803 mode_lib->vba.UrgentLatencySupportUs[k]);
1806 // Non-Urgent Latency Tolerance
1807 mode_lib->vba.NonUrgentLatencyTolerance = mode_lib->vba.MinUrgentLatencySupportUs
1808 - mode_lib->vba.UrgentWatermark;
1811 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1812 if ((mode_lib->vba.BlendingAndTiming[k] != k) || !mode_lib->vba.DSCEnabled[k]) {
1813 mode_lib->vba.DSCCLK_calculated[k] = 0.0;
1815 if (mode_lib->vba.OutputFormat[k] == dm_420
1816 || mode_lib->vba.OutputFormat[k] == dm_n422)
1817 mode_lib->vba.DSCFormatFactor = 2;
1819 mode_lib->vba.DSCFormatFactor = 1;
1820 if (mode_lib->vba.ODMCombineEnabled[k])
1821 mode_lib->vba.DSCCLK_calculated[k] =
1822 mode_lib->vba.PixelClockBackEnd[k] / 6
1823 / mode_lib->vba.DSCFormatFactor
1825 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
1828 mode_lib->vba.DSCCLK_calculated[k] =
1829 mode_lib->vba.PixelClockBackEnd[k] / 3
1830 / mode_lib->vba.DSCFormatFactor
1832 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
1839 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1840 double bpp = mode_lib->vba.OutputBpp[k];
1841 unsigned int slices = mode_lib->vba.NumberOfDSCSlices[k];
1843 if (mode_lib->vba.DSCEnabled[k] && bpp != 0) {
1844 if (!mode_lib->vba.ODMCombineEnabled[k]) {
1845 mode_lib->vba.DSCDelay[k] =
1847 mode_lib->vba.DSCInputBitPerComponent[k],
1850 (double) mode_lib->vba.HActive[k]
1851 / mode_lib->vba.NumberOfDSCSlices[k],
1854 mode_lib->vba.OutputFormat[k])
1856 mode_lib->vba.OutputFormat[k]);
1858 mode_lib->vba.DSCDelay[k] =
1860 * (dscceComputeDelay(
1861 mode_lib->vba.DSCInputBitPerComponent[k],
1864 (double) mode_lib->vba.HActive[k]
1865 / mode_lib->vba.NumberOfDSCSlices[k],
1868 mode_lib->vba.OutputFormat[k])
1870 mode_lib->vba.OutputFormat[k]));
1872 mode_lib->vba.DSCDelay[k] = mode_lib->vba.DSCDelay[k]
1873 * mode_lib->vba.PixelClock[k]
1874 / mode_lib->vba.PixelClockBackEnd[k];
1876 mode_lib->vba.DSCDelay[k] = 0;
1880 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k)
1881 for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) // NumberOfPlanes
1882 if (j != k && mode_lib->vba.BlendingAndTiming[k] == j
1883 && mode_lib->vba.DSCEnabled[j])
1884 mode_lib->vba.DSCDelay[k] = mode_lib->vba.DSCDelay[j];
1887 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
1888 unsigned int PDEAndMetaPTEBytesFrameY;
1889 unsigned int PixelPTEBytesPerRowY;
1890 unsigned int MetaRowByteY;
1891 unsigned int MetaRowByteC;
1892 unsigned int PDEAndMetaPTEBytesFrameC;
1893 unsigned int PixelPTEBytesPerRowC;
1895 Calculate256BBlockSizes(
1896 mode_lib->vba.SourcePixelFormat[k],
1897 mode_lib->vba.SurfaceTiling[k],
1898 dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1),
1899 dml_ceil(mode_lib->vba.BytePerPixelDETC[k], 2),
1900 &mode_lib->vba.BlockHeight256BytesY[k],
1901 &mode_lib->vba.BlockHeight256BytesC[k],
1902 &mode_lib->vba.BlockWidth256BytesY[k],
1903 &mode_lib->vba.BlockWidth256BytesC[k]);
1904 PDEAndMetaPTEBytesFrameY = CalculateVMAndRowBytes(
1906 mode_lib->vba.DCCEnable[k],
1907 mode_lib->vba.BlockHeight256BytesY[k],
1908 mode_lib->vba.BlockWidth256BytesY[k],
1909 mode_lib->vba.SourcePixelFormat[k],
1910 mode_lib->vba.SurfaceTiling[k],
1911 dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1),
1912 mode_lib->vba.SourceScan[k],
1913 mode_lib->vba.ViewportWidth[k],
1914 mode_lib->vba.ViewportHeight[k],
1915 mode_lib->vba.SwathWidthY[k],
1916 mode_lib->vba.GPUVMEnable,
1917 mode_lib->vba.VMMPageSize,
1918 mode_lib->vba.PTEBufferSizeInRequestsLuma,
1919 mode_lib->vba.PDEProcessingBufIn64KBReqs,
1920 mode_lib->vba.PitchY[k],
1921 mode_lib->vba.DCCMetaPitchY[k],
1922 &mode_lib->vba.MacroTileWidthY[k],
1924 &PixelPTEBytesPerRowY,
1925 &mode_lib->vba.PTEBufferSizeNotExceeded[mode_lib->vba.VoltageLevel][0],
1926 &mode_lib->vba.dpte_row_height[k],
1927 &mode_lib->vba.meta_row_height[k]);
1928 mode_lib->vba.PrefetchSourceLinesY[k] = CalculatePrefetchSourceLines(
1930 mode_lib->vba.VRatio[k],
1931 mode_lib->vba.vtaps[k],
1932 mode_lib->vba.Interlace[k],
1933 mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
1934 mode_lib->vba.SwathHeightY[k],
1935 mode_lib->vba.ViewportYStartY[k],
1936 &mode_lib->vba.VInitPreFillY[k],
1937 &mode_lib->vba.MaxNumSwathY[k]);
1939 if ((mode_lib->vba.SourcePixelFormat[k] != dm_444_64
1940 && mode_lib->vba.SourcePixelFormat[k] != dm_444_32
1941 && mode_lib->vba.SourcePixelFormat[k] != dm_444_16
1942 && mode_lib->vba.SourcePixelFormat[k] != dm_444_8)) {
1943 PDEAndMetaPTEBytesFrameC =
1944 CalculateVMAndRowBytes(
1946 mode_lib->vba.DCCEnable[k],
1947 mode_lib->vba.BlockHeight256BytesC[k],
1948 mode_lib->vba.BlockWidth256BytesC[k],
1949 mode_lib->vba.SourcePixelFormat[k],
1950 mode_lib->vba.SurfaceTiling[k],
1952 mode_lib->vba.BytePerPixelDETC[k],
1954 mode_lib->vba.SourceScan[k],
1955 mode_lib->vba.ViewportWidth[k] / 2,
1956 mode_lib->vba.ViewportHeight[k] / 2,
1957 mode_lib->vba.SwathWidthY[k] / 2,
1958 mode_lib->vba.GPUVMEnable,
1959 mode_lib->vba.VMMPageSize,
1960 mode_lib->vba.PTEBufferSizeInRequestsLuma,
1961 mode_lib->vba.PDEProcessingBufIn64KBReqs,
1962 mode_lib->vba.PitchC[k],
1964 &mode_lib->vba.MacroTileWidthC[k],
1966 &PixelPTEBytesPerRowC,
1967 &mode_lib->vba.PTEBufferSizeNotExceeded[mode_lib->vba.VoltageLevel][0],
1968 &mode_lib->vba.dpte_row_height_chroma[k],
1969 &mode_lib->vba.meta_row_height_chroma[k]);
1970 mode_lib->vba.PrefetchSourceLinesC[k] = CalculatePrefetchSourceLines(
1972 mode_lib->vba.VRatio[k] / 2,
1973 mode_lib->vba.VTAPsChroma[k],
1974 mode_lib->vba.Interlace[k],
1975 mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
1976 mode_lib->vba.SwathHeightC[k],
1977 mode_lib->vba.ViewportYStartC[k],
1978 &mode_lib->vba.VInitPreFillC[k],
1979 &mode_lib->vba.MaxNumSwathC[k]);
1981 PixelPTEBytesPerRowC = 0;
1982 PDEAndMetaPTEBytesFrameC = 0;
1984 mode_lib->vba.MaxNumSwathC[k] = 0;
1985 mode_lib->vba.PrefetchSourceLinesC[k] = 0;
1988 mode_lib->vba.PixelPTEBytesPerRow[k] = PixelPTEBytesPerRowY + PixelPTEBytesPerRowC;
1989 mode_lib->vba.PDEAndMetaPTEBytesFrame[k] = PDEAndMetaPTEBytesFrameY
1990 + PDEAndMetaPTEBytesFrameC;
1991 mode_lib->vba.MetaRowByte[k] = MetaRowByteY + MetaRowByteC;
1993 CalculateActiveRowBandwidth(
1994 mode_lib->vba.GPUVMEnable,
1995 mode_lib->vba.SourcePixelFormat[k],
1996 mode_lib->vba.VRatio[k],
1997 mode_lib->vba.DCCEnable[k],
1998 mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
2001 mode_lib->vba.meta_row_height[k],
2002 mode_lib->vba.meta_row_height_chroma[k],
2003 PixelPTEBytesPerRowY,
2004 PixelPTEBytesPerRowC,
2005 mode_lib->vba.dpte_row_height[k],
2006 mode_lib->vba.dpte_row_height_chroma[k],
2007 &mode_lib->vba.meta_row_bw[k],
2008 &mode_lib->vba.dpte_row_bw[k],
2009 &mode_lib->vba.qual_row_bw[k]);
2012 mode_lib->vba.TCalc = 24.0 / mode_lib->vba.DCFCLKDeepSleep;
2014 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2015 if (mode_lib->vba.BlendingAndTiming[k] == k) {
2016 if (mode_lib->vba.WritebackEnable[k] == true) {
2017 mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k] =
2018 mode_lib->vba.WritebackLatency
2019 + CalculateWriteBackDelay(
2020 mode_lib->vba.WritebackPixelFormat[k],
2021 mode_lib->vba.WritebackHRatio[k],
2022 mode_lib->vba.WritebackVRatio[k],
2023 mode_lib->vba.WritebackLumaHTaps[k],
2024 mode_lib->vba.WritebackLumaVTaps[k],
2025 mode_lib->vba.WritebackChromaHTaps[k],
2026 mode_lib->vba.WritebackChromaVTaps[k],
2027 mode_lib->vba.WritebackDestinationWidth[k])
2028 / mode_lib->vba.DISPCLK;
2030 mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k] = 0;
2031 for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) {
2032 if (mode_lib->vba.BlendingAndTiming[j] == k
2033 && mode_lib->vba.WritebackEnable[j] == true) {
2034 mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k] =
2036 mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k],
2037 mode_lib->vba.WritebackLatency
2038 + CalculateWriteBackDelay(
2039 mode_lib->vba.WritebackPixelFormat[j],
2040 mode_lib->vba.WritebackHRatio[j],
2041 mode_lib->vba.WritebackVRatio[j],
2042 mode_lib->vba.WritebackLumaHTaps[j],
2043 mode_lib->vba.WritebackLumaVTaps[j],
2044 mode_lib->vba.WritebackChromaHTaps[j],
2045 mode_lib->vba.WritebackChromaVTaps[j],
2046 mode_lib->vba.WritebackDestinationWidth[j])
2047 / mode_lib->vba.DISPCLK);
2053 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k)
2054 for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j)
2055 if (mode_lib->vba.BlendingAndTiming[k] == j)
2056 mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k] =
2057 mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][j];
2059 mode_lib->vba.VStartupLines = 13;
2060 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2061 mode_lib->vba.MaxVStartupLines[k] =
2062 mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]
2066 mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k]
2067 / (mode_lib->vba.HTotal[k]
2068 / mode_lib->vba.PixelClock[k]),
2072 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k)
2073 mode_lib->vba.MaximumMaxVStartupLines = dml_max(
2074 mode_lib->vba.MaximumMaxVStartupLines,
2075 mode_lib->vba.MaxVStartupLines[k]);
2077 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2078 mode_lib->vba.cursor_bw[k] = 0.0;
2079 for (j = 0; j < mode_lib->vba.NumberOfCursors[k]; ++j)
2080 mode_lib->vba.cursor_bw[k] += mode_lib->vba.CursorWidth[k][j]
2081 * mode_lib->vba.CursorBPP[k][j] / 8.0
2082 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
2083 * mode_lib->vba.VRatio[k];
2087 double MaxTotalRDBandwidth = 0;
2088 bool DestinationLineTimesForPrefetchLessThan2 = false;
2089 bool VRatioPrefetchMoreThan4 = false;
2090 bool prefetch_vm_bw_valid = true;
2091 bool prefetch_row_bw_valid = true;
2092 double TWait = CalculateTWait(
2093 mode_lib->vba.PrefetchMode[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb],
2094 mode_lib->vba.DRAMClockChangeLatency,
2095 mode_lib->vba.UrgentLatencyPixelDataOnly,
2096 mode_lib->vba.SREnterPlusExitTime);
2098 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2099 if (mode_lib->vba.XFCEnabled[k] == true) {
2100 mode_lib->vba.XFCRemoteSurfaceFlipDelay =
2101 CalculateRemoteSurfaceFlipDelay(
2103 mode_lib->vba.VRatio[k],
2104 mode_lib->vba.SwathWidthY[k],
2106 mode_lib->vba.BytePerPixelDETY[k],
2108 mode_lib->vba.HTotal[k]
2109 / mode_lib->vba.PixelClock[k],
2110 mode_lib->vba.XFCTSlvVupdateOffset,
2111 mode_lib->vba.XFCTSlvVupdateWidth,
2112 mode_lib->vba.XFCTSlvVreadyOffset,
2113 mode_lib->vba.XFCXBUFLatencyTolerance,
2114 mode_lib->vba.XFCFillBWOverhead,
2115 mode_lib->vba.XFCSlvChunkSize,
2116 mode_lib->vba.XFCBusTransportTime,
2117 mode_lib->vba.TCalc,
2119 &mode_lib->vba.SrcActiveDrainRate,
2120 &mode_lib->vba.TInitXFill,
2121 &mode_lib->vba.TslvChk);
2123 mode_lib->vba.XFCRemoteSurfaceFlipDelay = 0;
2126 CalculateDelayAfterScaler(mode_lib, mode_lib->vba.ReturnBW, mode_lib->vba.ReadBandwidthPlaneLuma[k], mode_lib->vba.ReadBandwidthPlaneChroma[k], mode_lib->vba.TotalDataReadBandwidth,
2127 mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k], mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k],
2128 mode_lib->vba.DPPCLK[k], mode_lib->vba.DISPCLK, mode_lib->vba.PixelClock[k], mode_lib->vba.DSCDelay[k], mode_lib->vba.DPPPerPlane[k], mode_lib->vba.ScalerEnabled[k], mode_lib->vba.NumberOfCursors[k],
2129 mode_lib->vba.DPPCLKDelaySubtotal, mode_lib->vba.DPPCLKDelaySCL, mode_lib->vba.DPPCLKDelaySCLLBOnly, mode_lib->vba.DPPCLKDelayCNVCFormater, mode_lib->vba.DPPCLKDelayCNVCCursor, mode_lib->vba.DISPCLKDelaySubtotal,
2130 mode_lib->vba.SwathWidthY[k] / mode_lib->vba.HRatio[k], mode_lib->vba.OutputFormat[k], mode_lib->vba.HTotal[k],
2131 mode_lib->vba.SwathWidthSingleDPPY[k], mode_lib->vba.BytePerPixelDETY[k], mode_lib->vba.BytePerPixelDETC[k], mode_lib->vba.SwathHeightY[k], mode_lib->vba.SwathHeightC[k], mode_lib->vba.Interlace[k],
2132 mode_lib->vba.ProgressiveToInterlaceUnitInOPP, &mode_lib->vba.DSTXAfterScaler[k], &mode_lib->vba.DSTYAfterScaler[k]);
2134 mode_lib->vba.ErrorResult[k] =
2135 CalculatePrefetchSchedule(
2137 mode_lib->vba.DPPCLK[k],
2138 mode_lib->vba.DISPCLK,
2139 mode_lib->vba.PixelClock[k],
2140 mode_lib->vba.DCFCLKDeepSleep,
2141 mode_lib->vba.DPPPerPlane[k],
2142 mode_lib->vba.NumberOfCursors[k],
2143 mode_lib->vba.VTotal[k]
2144 - mode_lib->vba.VActive[k],
2145 mode_lib->vba.HTotal[k],
2146 mode_lib->vba.MaxInterDCNTileRepeaters,
2148 mode_lib->vba.VStartupLines,
2149 mode_lib->vba.MaxVStartupLines[k]),
2150 mode_lib->vba.GPUVMMaxPageTableLevels,
2151 mode_lib->vba.GPUVMEnable,
2152 mode_lib->vba.DynamicMetadataEnable[k],
2153 mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired[k],
2154 mode_lib->vba.DynamicMetadataTransmittedBytes[k],
2155 mode_lib->vba.DCCEnable[k],
2156 mode_lib->vba.UrgentLatencyPixelDataOnly,
2157 mode_lib->vba.UrgentExtraLatency,
2158 mode_lib->vba.TCalc,
2159 mode_lib->vba.PDEAndMetaPTEBytesFrame[k],
2160 mode_lib->vba.MetaRowByte[k],
2161 mode_lib->vba.PixelPTEBytesPerRow[k],
2162 mode_lib->vba.PrefetchSourceLinesY[k],
2163 mode_lib->vba.SwathWidthY[k],
2164 mode_lib->vba.BytePerPixelDETY[k],
2165 mode_lib->vba.VInitPreFillY[k],
2166 mode_lib->vba.MaxNumSwathY[k],
2167 mode_lib->vba.PrefetchSourceLinesC[k],
2168 mode_lib->vba.BytePerPixelDETC[k],
2169 mode_lib->vba.VInitPreFillC[k],
2170 mode_lib->vba.MaxNumSwathC[k],
2171 mode_lib->vba.SwathHeightY[k],
2172 mode_lib->vba.SwathHeightC[k],
2174 mode_lib->vba.XFCEnabled[k],
2175 mode_lib->vba.XFCRemoteSurfaceFlipDelay,
2176 mode_lib->vba.Interlace[k],
2177 mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
2178 mode_lib->vba.DSTXAfterScaler[k],
2179 mode_lib->vba.DSTYAfterScaler[k],
2180 &mode_lib->vba.DestinationLinesForPrefetch[k],
2181 &mode_lib->vba.PrefetchBandwidth[k],
2182 &mode_lib->vba.DestinationLinesToRequestVMInVBlank[k],
2183 &mode_lib->vba.DestinationLinesToRequestRowInVBlank[k],
2184 &mode_lib->vba.VRatioPrefetchY[k],
2185 &mode_lib->vba.VRatioPrefetchC[k],
2186 &mode_lib->vba.RequiredPrefetchPixDataBWLuma[k],
2187 &mode_lib->vba.Tno_bw[k],
2188 &mode_lib->vba.VUpdateOffsetPix[k],
2189 &mode_lib->vba.VUpdateWidthPix[k],
2190 &mode_lib->vba.VReadyOffsetPix[k]);
2192 if (mode_lib->vba.BlendingAndTiming[k] == k) {
2193 mode_lib->vba.VStartup[k] = dml_min(
2194 mode_lib->vba.VStartupLines,
2195 mode_lib->vba.MaxVStartupLines[k]);
2196 if (mode_lib->vba.VStartupRequiredWhenNotEnoughTimeForDynamicMetadata
2198 mode_lib->vba.VStartup[k] =
2199 mode_lib->vba.VStartupRequiredWhenNotEnoughTimeForDynamicMetadata;
2202 mode_lib->vba.VStartup[k] =
2204 mode_lib->vba.VStartupLines,
2205 mode_lib->vba.MaxVStartupLines[mode_lib->vba.BlendingAndTiming[k]]);
2209 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2211 if (mode_lib->vba.PDEAndMetaPTEBytesFrame[k] == 0)
2212 mode_lib->vba.prefetch_vm_bw[k] = 0;
2213 else if (mode_lib->vba.DestinationLinesToRequestVMInVBlank[k] > 0) {
2214 mode_lib->vba.prefetch_vm_bw[k] =
2215 (double) mode_lib->vba.PDEAndMetaPTEBytesFrame[k]
2216 / (mode_lib->vba.DestinationLinesToRequestVMInVBlank[k]
2217 * mode_lib->vba.HTotal[k]
2218 / mode_lib->vba.PixelClock[k]);
2220 mode_lib->vba.prefetch_vm_bw[k] = 0;
2221 prefetch_vm_bw_valid = false;
2223 if (mode_lib->vba.MetaRowByte[k] + mode_lib->vba.PixelPTEBytesPerRow[k]
2225 mode_lib->vba.prefetch_row_bw[k] = 0;
2226 else if (mode_lib->vba.DestinationLinesToRequestRowInVBlank[k] > 0) {
2227 mode_lib->vba.prefetch_row_bw[k] =
2228 (double) (mode_lib->vba.MetaRowByte[k]
2229 + mode_lib->vba.PixelPTEBytesPerRow[k])
2230 / (mode_lib->vba.DestinationLinesToRequestRowInVBlank[k]
2231 * mode_lib->vba.HTotal[k]
2232 / mode_lib->vba.PixelClock[k]);
2234 mode_lib->vba.prefetch_row_bw[k] = 0;
2235 prefetch_row_bw_valid = false;
2238 MaxTotalRDBandwidth =
2239 MaxTotalRDBandwidth + mode_lib->vba.cursor_bw[k]
2241 mode_lib->vba.prefetch_vm_bw[k],
2243 mode_lib->vba.prefetch_row_bw[k],
2245 mode_lib->vba.ReadBandwidthPlaneLuma[k]
2246 + mode_lib->vba.ReadBandwidthPlaneChroma[k],
2247 mode_lib->vba.RequiredPrefetchPixDataBWLuma[k])
2248 + mode_lib->vba.meta_row_bw[k]
2249 + mode_lib->vba.dpte_row_bw[k]));
2251 if (mode_lib->vba.DestinationLinesForPrefetch[k] < 2)
2252 DestinationLineTimesForPrefetchLessThan2 = true;
2253 if (mode_lib->vba.VRatioPrefetchY[k] > 4
2254 || mode_lib->vba.VRatioPrefetchC[k] > 4)
2255 VRatioPrefetchMoreThan4 = true;
2258 if (MaxTotalRDBandwidth <= mode_lib->vba.ReturnBW && prefetch_vm_bw_valid
2259 && prefetch_row_bw_valid && !VRatioPrefetchMoreThan4
2260 && !DestinationLineTimesForPrefetchLessThan2)
2261 mode_lib->vba.PrefetchModeSupported = true;
2263 mode_lib->vba.PrefetchModeSupported = false;
2265 "DML: CalculatePrefetchSchedule ***failed***. Bandwidth violation. Results are NOT valid\n");
2268 if (mode_lib->vba.PrefetchModeSupported == true) {
2269 double final_flip_bw[DC__NUM_DPP__MAX];
2270 unsigned int ImmediateFlipBytes[DC__NUM_DPP__MAX];
2271 double total_dcn_read_bw_with_flip = 0;
2273 mode_lib->vba.BandwidthAvailableForImmediateFlip = mode_lib->vba.ReturnBW;
2274 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2275 mode_lib->vba.BandwidthAvailableForImmediateFlip =
2276 mode_lib->vba.BandwidthAvailableForImmediateFlip
2277 - mode_lib->vba.cursor_bw[k]
2279 mode_lib->vba.ReadBandwidthPlaneLuma[k]
2280 + mode_lib->vba.ReadBandwidthPlaneChroma[k]
2281 + mode_lib->vba.qual_row_bw[k],
2282 mode_lib->vba.PrefetchBandwidth[k]);
2285 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2286 ImmediateFlipBytes[k] = 0;
2287 if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8
2288 && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) {
2289 ImmediateFlipBytes[k] =
2290 mode_lib->vba.PDEAndMetaPTEBytesFrame[k]
2291 + mode_lib->vba.MetaRowByte[k]
2292 + mode_lib->vba.PixelPTEBytesPerRow[k];
2295 mode_lib->vba.TotImmediateFlipBytes = 0;
2296 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2297 if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8
2298 && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) {
2299 mode_lib->vba.TotImmediateFlipBytes =
2300 mode_lib->vba.TotImmediateFlipBytes
2301 + ImmediateFlipBytes[k];
2304 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2305 CalculateFlipSchedule(
2307 mode_lib->vba.UrgentExtraLatency,
2308 mode_lib->vba.UrgentLatencyPixelDataOnly,
2309 mode_lib->vba.GPUVMMaxPageTableLevels,
2310 mode_lib->vba.GPUVMEnable,
2311 mode_lib->vba.BandwidthAvailableForImmediateFlip,
2312 mode_lib->vba.TotImmediateFlipBytes,
2313 mode_lib->vba.SourcePixelFormat[k],
2314 ImmediateFlipBytes[k],
2315 mode_lib->vba.HTotal[k]
2316 / mode_lib->vba.PixelClock[k],
2317 mode_lib->vba.VRatio[k],
2318 mode_lib->vba.Tno_bw[k],
2319 mode_lib->vba.PDEAndMetaPTEBytesFrame[k],
2320 mode_lib->vba.MetaRowByte[k],
2321 mode_lib->vba.PixelPTEBytesPerRow[k],
2322 mode_lib->vba.DCCEnable[k],
2323 mode_lib->vba.dpte_row_height[k],
2324 mode_lib->vba.meta_row_height[k],
2325 mode_lib->vba.qual_row_bw[k],
2326 &mode_lib->vba.DestinationLinesToRequestVMInImmediateFlip[k],
2327 &mode_lib->vba.DestinationLinesToRequestRowInImmediateFlip[k],
2329 &mode_lib->vba.ImmediateFlipSupportedForPipe[k]);
2331 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2332 total_dcn_read_bw_with_flip =
2333 total_dcn_read_bw_with_flip
2334 + mode_lib->vba.cursor_bw[k]
2336 mode_lib->vba.prefetch_vm_bw[k],
2338 mode_lib->vba.prefetch_row_bw[k],
2341 mode_lib->vba.ReadBandwidthPlaneLuma[k]
2342 + mode_lib->vba.ReadBandwidthPlaneChroma[k],
2343 mode_lib->vba.RequiredPrefetchPixDataBWLuma[k])));
2345 mode_lib->vba.ImmediateFlipSupported = true;
2346 if (total_dcn_read_bw_with_flip > mode_lib->vba.ReturnBW) {
2347 mode_lib->vba.ImmediateFlipSupported = false;
2349 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2350 if (mode_lib->vba.ImmediateFlipSupportedForPipe[k] == false) {
2351 mode_lib->vba.ImmediateFlipSupported = false;
2355 mode_lib->vba.ImmediateFlipSupported = false;
2358 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2359 if (mode_lib->vba.ErrorResult[k]) {
2360 mode_lib->vba.PrefetchModeSupported = false;
2362 "DML: CalculatePrefetchSchedule ***failed***. Prefetch schedule violation. Results are NOT valid\n");
2366 mode_lib->vba.VStartupLines = mode_lib->vba.VStartupLines + 1;
2367 } while (!((mode_lib->vba.PrefetchModeSupported
2368 && (!mode_lib->vba.ImmediateFlipSupport
2369 || mode_lib->vba.ImmediateFlipSupported))
2370 || mode_lib->vba.MaximumMaxVStartupLines < mode_lib->vba.VStartupLines));
2372 //Display Pipeline Delivery Time in Prefetch
2373 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2374 if (mode_lib->vba.VRatioPrefetchY[k] <= 1) {
2375 mode_lib->vba.DisplayPipeLineDeliveryTimeLumaPrefetch[k] =
2376 mode_lib->vba.SwathWidthY[k] * mode_lib->vba.DPPPerPlane[k]
2377 / mode_lib->vba.HRatio[k]
2378 / mode_lib->vba.PixelClock[k];
2380 mode_lib->vba.DisplayPipeLineDeliveryTimeLumaPrefetch[k] =
2381 mode_lib->vba.SwathWidthY[k]
2382 / mode_lib->vba.PSCL_THROUGHPUT_LUMA[k]
2383 / mode_lib->vba.DPPCLK[k];
2385 if (mode_lib->vba.BytePerPixelDETC[k] == 0) {
2386 mode_lib->vba.DisplayPipeLineDeliveryTimeChromaPrefetch[k] = 0;
2388 if (mode_lib->vba.VRatioPrefetchC[k] <= 1) {
2389 mode_lib->vba.DisplayPipeLineDeliveryTimeChromaPrefetch[k] =
2390 mode_lib->vba.SwathWidthY[k]
2391 * mode_lib->vba.DPPPerPlane[k]
2392 / mode_lib->vba.HRatio[k]
2393 / mode_lib->vba.PixelClock[k];
2395 mode_lib->vba.DisplayPipeLineDeliveryTimeChromaPrefetch[k] =
2396 mode_lib->vba.SwathWidthY[k]
2397 / mode_lib->vba.PSCL_THROUGHPUT_LUMA[k]
2398 / mode_lib->vba.DPPCLK[k];
2404 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2405 if (mode_lib->vba.PrefetchMode[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] == 0) {
2406 mode_lib->vba.AllowDRAMClockChangeDuringVBlank[k] = true;
2407 mode_lib->vba.AllowDRAMSelfRefreshDuringVBlank[k] = true;
2408 mode_lib->vba.MinTTUVBlank[k] = dml_max(
2409 mode_lib->vba.DRAMClockChangeWatermark,
2411 mode_lib->vba.StutterEnterPlusExitWatermark,
2412 mode_lib->vba.UrgentWatermark));
2413 } else if (mode_lib->vba.PrefetchMode[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] == 1) {
2414 mode_lib->vba.AllowDRAMClockChangeDuringVBlank[k] = false;
2415 mode_lib->vba.AllowDRAMSelfRefreshDuringVBlank[k] = true;
2416 mode_lib->vba.MinTTUVBlank[k] = dml_max(
2417 mode_lib->vba.StutterEnterPlusExitWatermark,
2418 mode_lib->vba.UrgentWatermark);
2420 mode_lib->vba.AllowDRAMClockChangeDuringVBlank[k] = false;
2421 mode_lib->vba.AllowDRAMSelfRefreshDuringVBlank[k] = false;
2422 mode_lib->vba.MinTTUVBlank[k] = mode_lib->vba.UrgentWatermark;
2424 if (!mode_lib->vba.DynamicMetadataEnable[k])
2425 mode_lib->vba.MinTTUVBlank[k] = mode_lib->vba.TCalc
2426 + mode_lib->vba.MinTTUVBlank[k];
2429 // DCC Configuration
2430 mode_lib->vba.ActiveDPPs = 0;
2431 // NB P-State/DRAM Clock Change Support
2432 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2433 mode_lib->vba.ActiveDPPs = mode_lib->vba.ActiveDPPs + mode_lib->vba.DPPPerPlane[k];
2436 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2437 double EffectiveLBLatencyHidingY;
2438 double EffectiveLBLatencyHidingC;
2439 double DPPOutputBufferLinesY;
2440 double DPPOutputBufferLinesC;
2441 double DPPOPPBufferingY;
2442 double MaxDETBufferingTimeY;
2443 double ActiveDRAMClockChangeLatencyMarginY;
2445 mode_lib->vba.LBLatencyHidingSourceLinesY =
2447 mode_lib->vba.MaxLineBufferLines,
2448 (unsigned int) dml_floor(
2449 (double) mode_lib->vba.LineBufferSize
2450 / mode_lib->vba.LBBitPerPixel[k]
2451 / (mode_lib->vba.SwathWidthY[k]
2453 mode_lib->vba.HRatio[k],
2455 1)) - (mode_lib->vba.vtaps[k] - 1);
2457 mode_lib->vba.LBLatencyHidingSourceLinesC =
2459 mode_lib->vba.MaxLineBufferLines,
2460 (unsigned int) dml_floor(
2461 (double) mode_lib->vba.LineBufferSize
2462 / mode_lib->vba.LBBitPerPixel[k]
2463 / (mode_lib->vba.SwathWidthY[k]
2466 mode_lib->vba.HRatio[k]
2470 - (mode_lib->vba.VTAPsChroma[k] - 1);
2472 EffectiveLBLatencyHidingY = mode_lib->vba.LBLatencyHidingSourceLinesY
2473 / mode_lib->vba.VRatio[k]
2474 * (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]);
2476 EffectiveLBLatencyHidingC = mode_lib->vba.LBLatencyHidingSourceLinesC
2477 / (mode_lib->vba.VRatio[k] / 2)
2478 * (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]);
2480 if (mode_lib->vba.SwathWidthY[k] > 2 * mode_lib->vba.DPPOutputBufferPixels) {
2481 DPPOutputBufferLinesY = mode_lib->vba.DPPOutputBufferPixels
2482 / mode_lib->vba.SwathWidthY[k];
2483 } else if (mode_lib->vba.SwathWidthY[k] > mode_lib->vba.DPPOutputBufferPixels) {
2484 DPPOutputBufferLinesY = 0.5;
2486 DPPOutputBufferLinesY = 1;
2489 if (mode_lib->vba.SwathWidthY[k] / 2 > 2 * mode_lib->vba.DPPOutputBufferPixels) {
2490 DPPOutputBufferLinesC = mode_lib->vba.DPPOutputBufferPixels
2491 / (mode_lib->vba.SwathWidthY[k] / 2);
2492 } else if (mode_lib->vba.SwathWidthY[k] / 2 > mode_lib->vba.DPPOutputBufferPixels) {
2493 DPPOutputBufferLinesC = 0.5;
2495 DPPOutputBufferLinesC = 1;
2498 DPPOPPBufferingY = (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
2499 * (DPPOutputBufferLinesY + mode_lib->vba.OPPOutputBufferLines);
2500 MaxDETBufferingTimeY = mode_lib->vba.FullDETBufferingTimeY[k]
2501 + (mode_lib->vba.LinesInDETY[k]
2502 - mode_lib->vba.LinesInDETYRoundedDownToSwath[k])
2503 / mode_lib->vba.SwathHeightY[k]
2504 * (mode_lib->vba.HTotal[k]
2505 / mode_lib->vba.PixelClock[k]);
2507 ActiveDRAMClockChangeLatencyMarginY = DPPOPPBufferingY + EffectiveLBLatencyHidingY
2508 + MaxDETBufferingTimeY - mode_lib->vba.DRAMClockChangeWatermark;
2510 if (mode_lib->vba.ActiveDPPs > 1) {
2511 ActiveDRAMClockChangeLatencyMarginY =
2512 ActiveDRAMClockChangeLatencyMarginY
2513 - (1 - 1 / (mode_lib->vba.ActiveDPPs - 1))
2514 * mode_lib->vba.SwathHeightY[k]
2515 * (mode_lib->vba.HTotal[k]
2516 / mode_lib->vba.PixelClock[k]);
2519 if (mode_lib->vba.BytePerPixelDETC[k] > 0) {
2520 double DPPOPPBufferingC = (mode_lib->vba.HTotal[k]
2521 / mode_lib->vba.PixelClock[k])
2522 * (DPPOutputBufferLinesC
2523 + mode_lib->vba.OPPOutputBufferLines);
2524 double MaxDETBufferingTimeC =
2525 mode_lib->vba.FullDETBufferingTimeC[k]
2526 + (mode_lib->vba.LinesInDETC[k]
2527 - mode_lib->vba.LinesInDETCRoundedDownToSwath[k])
2528 / mode_lib->vba.SwathHeightC[k]
2529 * (mode_lib->vba.HTotal[k]
2530 / mode_lib->vba.PixelClock[k]);
2531 double ActiveDRAMClockChangeLatencyMarginC = DPPOPPBufferingC
2532 + EffectiveLBLatencyHidingC + MaxDETBufferingTimeC
2533 - mode_lib->vba.DRAMClockChangeWatermark;
2535 if (mode_lib->vba.ActiveDPPs > 1) {
2536 ActiveDRAMClockChangeLatencyMarginC =
2537 ActiveDRAMClockChangeLatencyMarginC
2540 / (mode_lib->vba.ActiveDPPs
2542 * mode_lib->vba.SwathHeightC[k]
2543 * (mode_lib->vba.HTotal[k]
2544 / mode_lib->vba.PixelClock[k]);
2546 mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] = dml_min(
2547 ActiveDRAMClockChangeLatencyMarginY,
2548 ActiveDRAMClockChangeLatencyMarginC);
2550 mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] =
2551 ActiveDRAMClockChangeLatencyMarginY;
2554 if (mode_lib->vba.WritebackEnable[k]) {
2555 double WritebackDRAMClockChangeLatencyMargin;
2557 if (mode_lib->vba.WritebackPixelFormat[k] == dm_444_32) {
2558 WritebackDRAMClockChangeLatencyMargin =
2559 (double) (mode_lib->vba.WritebackInterfaceLumaBufferSize
2560 + mode_lib->vba.WritebackInterfaceChromaBufferSize)
2561 / (mode_lib->vba.WritebackDestinationWidth[k]
2562 * mode_lib->vba.WritebackDestinationHeight[k]
2563 / (mode_lib->vba.WritebackSourceHeight[k]
2564 * mode_lib->vba.HTotal[k]
2565 / mode_lib->vba.PixelClock[k])
2567 - mode_lib->vba.WritebackDRAMClockChangeWatermark;
2568 } else if (mode_lib->vba.WritebackPixelFormat[k] == dm_420_10) {
2569 WritebackDRAMClockChangeLatencyMargin =
2571 (double) mode_lib->vba.WritebackInterfaceLumaBufferSize
2574 * mode_lib->vba.WritebackInterfaceChromaBufferSize
2576 / (mode_lib->vba.WritebackDestinationWidth[k]
2577 * mode_lib->vba.WritebackDestinationHeight[k]
2578 / (mode_lib->vba.WritebackSourceHeight[k]
2579 * mode_lib->vba.HTotal[k]
2580 / mode_lib->vba.PixelClock[k]))
2581 - mode_lib->vba.WritebackDRAMClockChangeWatermark;
2583 WritebackDRAMClockChangeLatencyMargin =
2585 (double) mode_lib->vba.WritebackInterfaceLumaBufferSize,
2587 * mode_lib->vba.WritebackInterfaceChromaBufferSize)
2588 / (mode_lib->vba.WritebackDestinationWidth[k]
2589 * mode_lib->vba.WritebackDestinationHeight[k]
2590 / (mode_lib->vba.WritebackSourceHeight[k]
2591 * mode_lib->vba.HTotal[k]
2592 / mode_lib->vba.PixelClock[k]))
2593 - mode_lib->vba.WritebackDRAMClockChangeWatermark;
2595 mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] = dml_min(
2596 mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k],
2597 WritebackDRAMClockChangeLatencyMargin);
2601 mode_lib->vba.MinActiveDRAMClockChangeMargin = 999999;
2602 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2603 if (mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k]
2604 < mode_lib->vba.MinActiveDRAMClockChangeMargin) {
2605 mode_lib->vba.MinActiveDRAMClockChangeMargin =
2606 mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k];
2610 mode_lib->vba.MinActiveDRAMClockChangeLatencySupported =
2611 mode_lib->vba.MinActiveDRAMClockChangeMargin
2612 + mode_lib->vba.DRAMClockChangeLatency;
2614 if (mode_lib->vba.DRAMClockChangeSupportsVActive &&
2615 mode_lib->vba.MinActiveDRAMClockChangeMargin > 50) {
2616 mode_lib->vba.DRAMClockChangeWatermark += 25;
2617 mode_lib->vba.DRAMClockChangeSupport[0][0] = dm_dram_clock_change_vactive;
2618 } else if (mode_lib->vba.DummyPStateCheck &&
2619 mode_lib->vba.MinActiveDRAMClockChangeMargin > 0) {
2620 mode_lib->vba.DRAMClockChangeSupport[0][0] = dm_dram_clock_change_vactive;
2622 if (mode_lib->vba.SynchronizedVBlank || mode_lib->vba.NumberOfActivePlanes == 1) {
2623 mode_lib->vba.DRAMClockChangeSupport[0][0] = dm_dram_clock_change_vblank;
2624 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2625 if (!mode_lib->vba.AllowDRAMClockChangeDuringVBlank[k]) {
2626 mode_lib->vba.DRAMClockChangeSupport[0][0] =
2627 dm_dram_clock_change_unsupported;
2631 mode_lib->vba.DRAMClockChangeSupport[0][0] = dm_dram_clock_change_unsupported;
2634 for (k = 0; k <= mode_lib->vba.soc.num_states; k++)
2635 for (j = 0; j < 2; j++)
2636 mode_lib->vba.DRAMClockChangeSupport[k][j] = mode_lib->vba.DRAMClockChangeSupport[0][0];
2639 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2640 if (mode_lib->vba.XFCEnabled[k] == true) {
2643 mode_lib->vba.XFCSlaveVUpdateOffset[k] = mode_lib->vba.XFCTSlvVupdateOffset;
2644 mode_lib->vba.XFCSlaveVupdateWidth[k] = mode_lib->vba.XFCTSlvVupdateWidth;
2645 mode_lib->vba.XFCSlaveVReadyOffset[k] = mode_lib->vba.XFCTSlvVreadyOffset;
2646 TWait = CalculateTWait(
2647 mode_lib->vba.PrefetchMode[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb],
2648 mode_lib->vba.DRAMClockChangeLatency,
2649 mode_lib->vba.UrgentLatencyPixelDataOnly,
2650 mode_lib->vba.SREnterPlusExitTime);
2651 mode_lib->vba.XFCRemoteSurfaceFlipDelay = CalculateRemoteSurfaceFlipDelay(
2653 mode_lib->vba.VRatio[k],
2654 mode_lib->vba.SwathWidthY[k],
2655 dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1),
2656 mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
2657 mode_lib->vba.XFCTSlvVupdateOffset,
2658 mode_lib->vba.XFCTSlvVupdateWidth,
2659 mode_lib->vba.XFCTSlvVreadyOffset,
2660 mode_lib->vba.XFCXBUFLatencyTolerance,
2661 mode_lib->vba.XFCFillBWOverhead,
2662 mode_lib->vba.XFCSlvChunkSize,
2663 mode_lib->vba.XFCBusTransportTime,
2664 mode_lib->vba.TCalc,
2666 &mode_lib->vba.SrcActiveDrainRate,
2667 &mode_lib->vba.TInitXFill,
2668 &mode_lib->vba.TslvChk);
2669 mode_lib->vba.XFCRemoteSurfaceFlipLatency[k] =
2671 mode_lib->vba.XFCRemoteSurfaceFlipDelay
2672 / (mode_lib->vba.HTotal[k]
2673 / mode_lib->vba.PixelClock[k]),
2675 mode_lib->vba.XFCTransferDelay[k] =
2677 mode_lib->vba.XFCBusTransportTime
2678 / (mode_lib->vba.HTotal[k]
2679 / mode_lib->vba.PixelClock[k]),
2681 mode_lib->vba.XFCPrechargeDelay[k] =
2683 (mode_lib->vba.XFCBusTransportTime
2684 + mode_lib->vba.TInitXFill
2685 + mode_lib->vba.TslvChk)
2686 / (mode_lib->vba.HTotal[k]
2687 / mode_lib->vba.PixelClock[k]),
2689 mode_lib->vba.InitFillLevel = mode_lib->vba.XFCXBUFLatencyTolerance
2690 * mode_lib->vba.SrcActiveDrainRate;
2691 mode_lib->vba.FinalFillMargin =
2692 (mode_lib->vba.DestinationLinesToRequestVMInVBlank[k]
2693 + mode_lib->vba.DestinationLinesToRequestRowInVBlank[k])
2694 * mode_lib->vba.HTotal[k]
2695 / mode_lib->vba.PixelClock[k]
2696 * mode_lib->vba.SrcActiveDrainRate
2697 + mode_lib->vba.XFCFillConstant;
2698 mode_lib->vba.FinalFillLevel = mode_lib->vba.XFCRemoteSurfaceFlipDelay
2699 * mode_lib->vba.SrcActiveDrainRate
2700 + mode_lib->vba.FinalFillMargin;
2701 mode_lib->vba.RemainingFillLevel = dml_max(
2703 mode_lib->vba.FinalFillLevel - mode_lib->vba.InitFillLevel);
2704 mode_lib->vba.TFinalxFill = mode_lib->vba.RemainingFillLevel
2705 / (mode_lib->vba.SrcActiveDrainRate
2706 * mode_lib->vba.XFCFillBWOverhead / 100);
2707 mode_lib->vba.XFCPrefetchMargin[k] =
2708 mode_lib->vba.XFCRemoteSurfaceFlipDelay
2709 + mode_lib->vba.TFinalxFill
2710 + (mode_lib->vba.DestinationLinesToRequestVMInVBlank[k]
2711 + mode_lib->vba.DestinationLinesToRequestRowInVBlank[k])
2712 * mode_lib->vba.HTotal[k]
2713 / mode_lib->vba.PixelClock[k];
2715 mode_lib->vba.XFCSlaveVUpdateOffset[k] = 0;
2716 mode_lib->vba.XFCSlaveVupdateWidth[k] = 0;
2717 mode_lib->vba.XFCSlaveVReadyOffset[k] = 0;
2718 mode_lib->vba.XFCRemoteSurfaceFlipLatency[k] = 0;
2719 mode_lib->vba.XFCPrechargeDelay[k] = 0;
2720 mode_lib->vba.XFCTransferDelay[k] = 0;
2721 mode_lib->vba.XFCPrefetchMargin[k] = 0;
2725 unsigned int VStartupMargin = 0;
2726 bool FirstMainPlane = true;
2728 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2729 if (mode_lib->vba.BlendingAndTiming[k] == k) {
2730 unsigned int Margin = (mode_lib->vba.MaxVStartupLines[k] - mode_lib->vba.VStartup[k])
2731 * mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k];
2733 if (FirstMainPlane) {
2734 VStartupMargin = Margin;
2735 FirstMainPlane = false;
2737 VStartupMargin = dml_min(VStartupMargin, Margin);
2740 if (mode_lib->vba.UseMaximumVStartup) {
2741 if (mode_lib->vba.VTotal_Max[k] == mode_lib->vba.VTotal[k]) {
2742 //only use max vstart if it is not drr or lateflip.
2743 mode_lib->vba.VStartup[k] = mode_lib->vba.MaxVStartupLines[mode_lib->vba.BlendingAndTiming[k]];
2750 static void dml20v2_DisplayPipeConfiguration(struct display_mode_lib *mode_lib)
2752 double BytePerPixDETY;
2753 double BytePerPixDETC;
2754 double Read256BytesBlockHeightY;
2755 double Read256BytesBlockHeightC;
2756 double Read256BytesBlockWidthY;
2757 double Read256BytesBlockWidthC;
2758 double MaximumSwathHeightY;
2759 double MaximumSwathHeightC;
2760 double MinimumSwathHeightY;
2761 double MinimumSwathHeightC;
2763 double SwathWidthGranularityY;
2764 double SwathWidthGranularityC;
2765 double RoundedUpMaxSwathSizeBytesY;
2766 double RoundedUpMaxSwathSizeBytesC;
2769 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
2770 bool MainPlaneDoesODMCombine = false;
2772 if (mode_lib->vba.SourcePixelFormat[k] == dm_444_64) {
2775 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_32) {
2778 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_16) {
2781 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_8) {
2784 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8) {
2788 BytePerPixDETY = 4.0 / 3.0;
2789 BytePerPixDETC = 8.0 / 3.0;
2792 if ((mode_lib->vba.SourcePixelFormat[k] == dm_444_64
2793 || mode_lib->vba.SourcePixelFormat[k] == dm_444_32
2794 || mode_lib->vba.SourcePixelFormat[k] == dm_444_16
2795 || mode_lib->vba.SourcePixelFormat[k] == dm_444_8)) {
2796 if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) {
2797 Read256BytesBlockHeightY = 1;
2798 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_64) {
2799 Read256BytesBlockHeightY = 4;
2800 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_32
2801 || mode_lib->vba.SourcePixelFormat[k] == dm_444_16) {
2802 Read256BytesBlockHeightY = 8;
2804 Read256BytesBlockHeightY = 16;
2806 Read256BytesBlockWidthY = 256 / dml_ceil(BytePerPixDETY, 1)
2807 / Read256BytesBlockHeightY;
2808 Read256BytesBlockHeightC = 0;
2809 Read256BytesBlockWidthC = 0;
2811 if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) {
2812 Read256BytesBlockHeightY = 1;
2813 Read256BytesBlockHeightC = 1;
2814 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8) {
2815 Read256BytesBlockHeightY = 16;
2816 Read256BytesBlockHeightC = 8;
2818 Read256BytesBlockHeightY = 8;
2819 Read256BytesBlockHeightC = 8;
2821 Read256BytesBlockWidthY = 256 / dml_ceil(BytePerPixDETY, 1)
2822 / Read256BytesBlockHeightY;
2823 Read256BytesBlockWidthC = 256 / dml_ceil(BytePerPixDETC, 2)
2824 / Read256BytesBlockHeightC;
2827 if (mode_lib->vba.SourceScan[k] == dm_horz) {
2828 MaximumSwathHeightY = Read256BytesBlockHeightY;
2829 MaximumSwathHeightC = Read256BytesBlockHeightC;
2831 MaximumSwathHeightY = Read256BytesBlockWidthY;
2832 MaximumSwathHeightC = Read256BytesBlockWidthC;
2835 if ((mode_lib->vba.SourcePixelFormat[k] == dm_444_64
2836 || mode_lib->vba.SourcePixelFormat[k] == dm_444_32
2837 || mode_lib->vba.SourcePixelFormat[k] == dm_444_16
2838 || mode_lib->vba.SourcePixelFormat[k] == dm_444_8)) {
2839 if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear
2840 || (mode_lib->vba.SourcePixelFormat[k] == dm_444_64
2841 && (mode_lib->vba.SurfaceTiling[k]
2843 || mode_lib->vba.SurfaceTiling[k]
2845 || mode_lib->vba.SurfaceTiling[k]
2847 || mode_lib->vba.SurfaceTiling[k]
2849 || mode_lib->vba.SurfaceTiling[k]
2851 || mode_lib->vba.SurfaceTiling[k]
2853 || mode_lib->vba.SurfaceTiling[k]
2855 && mode_lib->vba.SourceScan[k] == dm_horz)) {
2856 MinimumSwathHeightY = MaximumSwathHeightY;
2857 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_8
2858 && mode_lib->vba.SourceScan[k] != dm_horz) {
2859 MinimumSwathHeightY = MaximumSwathHeightY;
2861 MinimumSwathHeightY = MaximumSwathHeightY / 2.0;
2863 MinimumSwathHeightC = MaximumSwathHeightC;
2865 if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) {
2866 MinimumSwathHeightY = MaximumSwathHeightY;
2867 MinimumSwathHeightC = MaximumSwathHeightC;
2868 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8
2869 && mode_lib->vba.SourceScan[k] == dm_horz) {
2870 MinimumSwathHeightY = MaximumSwathHeightY / 2.0;
2871 MinimumSwathHeightC = MaximumSwathHeightC;
2872 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10
2873 && mode_lib->vba.SourceScan[k] == dm_horz) {
2874 MinimumSwathHeightC = MaximumSwathHeightC / 2.0;
2875 MinimumSwathHeightY = MaximumSwathHeightY;
2877 MinimumSwathHeightY = MaximumSwathHeightY;
2878 MinimumSwathHeightC = MaximumSwathHeightC;
2882 if (mode_lib->vba.SourceScan[k] == dm_horz) {
2883 SwathWidth = mode_lib->vba.ViewportWidth[k];
2885 SwathWidth = mode_lib->vba.ViewportHeight[k];
2888 if (mode_lib->vba.ODMCombineEnabled[k] == true) {
2889 MainPlaneDoesODMCombine = true;
2891 for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) {
2892 if (mode_lib->vba.BlendingAndTiming[k] == j
2893 && mode_lib->vba.ODMCombineEnabled[j] == true) {
2894 MainPlaneDoesODMCombine = true;
2898 if (MainPlaneDoesODMCombine == true) {
2899 SwathWidth = dml_min(
2901 mode_lib->vba.HActive[k] / 2.0 * mode_lib->vba.HRatio[k]);
2903 if (mode_lib->vba.DPPPerPlane[k] == 0)
2906 SwathWidth = SwathWidth / mode_lib->vba.DPPPerPlane[k];
2909 SwathWidthGranularityY = 256 / dml_ceil(BytePerPixDETY, 1) / MaximumSwathHeightY;
2910 RoundedUpMaxSwathSizeBytesY = (dml_ceil(
2911 (double) (SwathWidth - 1),
2912 SwathWidthGranularityY) + SwathWidthGranularityY) * BytePerPixDETY
2913 * MaximumSwathHeightY;
2914 if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10) {
2915 RoundedUpMaxSwathSizeBytesY = dml_ceil(RoundedUpMaxSwathSizeBytesY, 256)
2918 if (MaximumSwathHeightC > 0) {
2919 SwathWidthGranularityC = 256.0 / dml_ceil(BytePerPixDETC, 2)
2920 / MaximumSwathHeightC;
2921 RoundedUpMaxSwathSizeBytesC = (dml_ceil(
2922 (double) (SwathWidth / 2.0 - 1),
2923 SwathWidthGranularityC) + SwathWidthGranularityC)
2924 * BytePerPixDETC * MaximumSwathHeightC;
2925 if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10) {
2926 RoundedUpMaxSwathSizeBytesC = dml_ceil(
2927 RoundedUpMaxSwathSizeBytesC,
2931 RoundedUpMaxSwathSizeBytesC = 0.0;
2933 if (RoundedUpMaxSwathSizeBytesY + RoundedUpMaxSwathSizeBytesC
2934 <= mode_lib->vba.DETBufferSizeInKByte * 1024.0 / 2.0) {
2935 mode_lib->vba.SwathHeightY[k] = MaximumSwathHeightY;
2936 mode_lib->vba.SwathHeightC[k] = MaximumSwathHeightC;
2938 mode_lib->vba.SwathHeightY[k] = MinimumSwathHeightY;
2939 mode_lib->vba.SwathHeightC[k] = MinimumSwathHeightC;
2942 if (mode_lib->vba.SwathHeightC[k] == 0) {
2943 mode_lib->vba.DETBufferSizeY[k] = mode_lib->vba.DETBufferSizeInKByte * 1024;
2944 mode_lib->vba.DETBufferSizeC[k] = 0;
2945 } else if (mode_lib->vba.SwathHeightY[k] <= mode_lib->vba.SwathHeightC[k]) {
2946 mode_lib->vba.DETBufferSizeY[k] = mode_lib->vba.DETBufferSizeInKByte
2948 mode_lib->vba.DETBufferSizeC[k] = mode_lib->vba.DETBufferSizeInKByte
2951 mode_lib->vba.DETBufferSizeY[k] = mode_lib->vba.DETBufferSizeInKByte
2953 mode_lib->vba.DETBufferSizeC[k] = mode_lib->vba.DETBufferSizeInKByte
2959 static double CalculateTWait(
2960 unsigned int PrefetchMode,
2961 double DRAMClockChangeLatency,
2962 double UrgentLatencyPixelDataOnly,
2963 double SREnterPlusExitTime)
2965 if (PrefetchMode == 0) {
2967 DRAMClockChangeLatency + UrgentLatencyPixelDataOnly,
2968 dml_max(SREnterPlusExitTime, UrgentLatencyPixelDataOnly));
2969 } else if (PrefetchMode == 1) {
2970 return dml_max(SREnterPlusExitTime, UrgentLatencyPixelDataOnly);
2972 return UrgentLatencyPixelDataOnly;
2976 static double CalculateRemoteSurfaceFlipDelay(
2977 struct display_mode_lib *mode_lib,
2982 double XFCTSlvVupdateOffset,
2983 double XFCTSlvVupdateWidth,
2984 double XFCTSlvVreadyOffset,
2985 double XFCXBUFLatencyTolerance,
2986 double XFCFillBWOverhead,
2987 double XFCSlvChunkSize,
2988 double XFCBusTransportTime,
2991 double *SrcActiveDrainRate,
2995 double TSlvSetup, AvgfillRate, result;
2997 *SrcActiveDrainRate = VRatio * SwathWidth * Bpp / LineTime;
2998 TSlvSetup = XFCTSlvVupdateOffset + XFCTSlvVupdateWidth + XFCTSlvVreadyOffset;
2999 *TInitXFill = XFCXBUFLatencyTolerance / (1 + XFCFillBWOverhead / 100);
3000 AvgfillRate = *SrcActiveDrainRate * (1 + XFCFillBWOverhead / 100);
3001 *TslvChk = XFCSlvChunkSize / AvgfillRate;
3003 "DML::CalculateRemoteSurfaceFlipDelay: SrcActiveDrainRate: %f\n",
3004 *SrcActiveDrainRate);
3005 dml_print("DML::CalculateRemoteSurfaceFlipDelay: TSlvSetup: %f\n", TSlvSetup);
3006 dml_print("DML::CalculateRemoteSurfaceFlipDelay: TInitXFill: %f\n", *TInitXFill);
3007 dml_print("DML::CalculateRemoteSurfaceFlipDelay: AvgfillRate: %f\n", AvgfillRate);
3008 dml_print("DML::CalculateRemoteSurfaceFlipDelay: TslvChk: %f\n", *TslvChk);
3009 result = 2 * XFCBusTransportTime + TSlvSetup + TCalc + TWait + *TslvChk + *TInitXFill; // TODO: This doesn't seem to match programming guide
3010 dml_print("DML::CalculateRemoteSurfaceFlipDelay: RemoteSurfaceFlipDelay: %f\n", result);
3014 static double CalculateWriteBackDelay(
3015 enum source_format_class WritebackPixelFormat,
3016 double WritebackHRatio,
3017 double WritebackVRatio,
3018 unsigned int WritebackLumaHTaps,
3019 unsigned int WritebackLumaVTaps,
3020 unsigned int WritebackChromaHTaps,
3021 unsigned int WritebackChromaVTaps,
3022 unsigned int WritebackDestinationWidth)
3024 double CalculateWriteBackDelay =
3026 dml_ceil(WritebackLumaHTaps / 4.0, 1) / WritebackHRatio,
3027 WritebackLumaVTaps * dml_ceil(1.0 / WritebackVRatio, 1)
3029 WritebackDestinationWidth
3032 + dml_ceil(1.0 / WritebackVRatio, 1)
3038 if (WritebackPixelFormat != dm_444_32) {
3039 CalculateWriteBackDelay =
3041 CalculateWriteBackDelay,
3044 WritebackChromaHTaps
3049 WritebackChromaVTaps
3056 WritebackDestinationWidth
3066 WritebackChromaVTaps
3071 return CalculateWriteBackDelay;
3074 static void CalculateActiveRowBandwidth(
3076 enum source_format_class SourcePixelFormat,
3080 unsigned int MetaRowByteLuma,
3081 unsigned int MetaRowByteChroma,
3082 unsigned int meta_row_height_luma,
3083 unsigned int meta_row_height_chroma,
3084 unsigned int PixelPTEBytesPerRowLuma,
3085 unsigned int PixelPTEBytesPerRowChroma,
3086 unsigned int dpte_row_height_luma,
3087 unsigned int dpte_row_height_chroma,
3088 double *meta_row_bw,
3089 double *dpte_row_bw,
3090 double *qual_row_bw)
3092 if (DCCEnable != true) {
3094 } else if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10) {
3095 *meta_row_bw = VRatio * MetaRowByteLuma / (meta_row_height_luma * LineTime)
3096 + VRatio / 2 * MetaRowByteChroma
3097 / (meta_row_height_chroma * LineTime);
3099 *meta_row_bw = VRatio * MetaRowByteLuma / (meta_row_height_luma * LineTime);
3102 if (GPUVMEnable != true) {
3104 } else if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10) {
3105 *dpte_row_bw = VRatio * PixelPTEBytesPerRowLuma / (dpte_row_height_luma * LineTime)
3106 + VRatio / 2 * PixelPTEBytesPerRowChroma
3107 / (dpte_row_height_chroma * LineTime);
3109 *dpte_row_bw = VRatio * PixelPTEBytesPerRowLuma / (dpte_row_height_luma * LineTime);
3112 if ((SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10)) {
3113 *qual_row_bw = *meta_row_bw + *dpte_row_bw;
3119 static void CalculateFlipSchedule(
3120 struct display_mode_lib *mode_lib,
3121 double UrgentExtraLatency,
3122 double UrgentLatencyPixelDataOnly,
3123 unsigned int GPUVMMaxPageTableLevels,
3125 double BandwidthAvailableForImmediateFlip,
3126 unsigned int TotImmediateFlipBytes,
3127 enum source_format_class SourcePixelFormat,
3128 unsigned int ImmediateFlipBytes,
3132 double PDEAndMetaPTEBytesFrame,
3133 unsigned int MetaRowByte,
3134 unsigned int PixelPTEBytesPerRow,
3136 unsigned int dpte_row_height,
3137 unsigned int meta_row_height,
3139 double *DestinationLinesToRequestVMInImmediateFlip,
3140 double *DestinationLinesToRequestRowInImmediateFlip,
3141 double *final_flip_bw,
3142 bool *ImmediateFlipSupportedForPipe)
3144 double min_row_time = 0.0;
3146 if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10) {
3147 *DestinationLinesToRequestVMInImmediateFlip = 0.0;
3148 *DestinationLinesToRequestRowInImmediateFlip = 0.0;
3149 *final_flip_bw = qual_row_bw;
3150 *ImmediateFlipSupportedForPipe = true;
3152 double TimeForFetchingMetaPTEImmediateFlip;
3153 double TimeForFetchingRowInVBlankImmediateFlip;
3155 if (GPUVMEnable == true) {
3156 mode_lib->vba.ImmediateFlipBW[0] = BandwidthAvailableForImmediateFlip
3157 * ImmediateFlipBytes / TotImmediateFlipBytes;
3158 TimeForFetchingMetaPTEImmediateFlip =
3161 + PDEAndMetaPTEBytesFrame
3162 / mode_lib->vba.ImmediateFlipBW[0],
3165 + UrgentLatencyPixelDataOnly
3166 * (GPUVMMaxPageTableLevels
3170 TimeForFetchingMetaPTEImmediateFlip = 0;
3173 *DestinationLinesToRequestVMInImmediateFlip = dml_floor(
3174 4.0 * (TimeForFetchingMetaPTEImmediateFlip / LineTime + 0.125),
3177 if ((GPUVMEnable == true || DCCEnable == true)) {
3178 mode_lib->vba.ImmediateFlipBW[0] = BandwidthAvailableForImmediateFlip
3179 * ImmediateFlipBytes / TotImmediateFlipBytes;
3180 TimeForFetchingRowInVBlankImmediateFlip = dml_max(
3181 (MetaRowByte + PixelPTEBytesPerRow)
3182 / mode_lib->vba.ImmediateFlipBW[0],
3183 dml_max(UrgentLatencyPixelDataOnly, LineTime / 4.0));
3185 TimeForFetchingRowInVBlankImmediateFlip = 0;
3188 *DestinationLinesToRequestRowInImmediateFlip = dml_floor(
3189 4.0 * (TimeForFetchingRowInVBlankImmediateFlip / LineTime + 0.125),
3192 if (GPUVMEnable == true) {
3195 PDEAndMetaPTEBytesFrame
3196 / (*DestinationLinesToRequestVMInImmediateFlip
3198 (MetaRowByte + PixelPTEBytesPerRow)
3199 / (TimeForFetchingRowInVBlankImmediateFlip
3201 } else if (MetaRowByte + PixelPTEBytesPerRow > 0) {
3202 *final_flip_bw = (MetaRowByte + PixelPTEBytesPerRow)
3203 / (TimeForFetchingRowInVBlankImmediateFlip * LineTime);
3208 if (GPUVMEnable && !DCCEnable)
3209 min_row_time = dpte_row_height * LineTime / VRatio;
3210 else if (!GPUVMEnable && DCCEnable)
3211 min_row_time = meta_row_height * LineTime / VRatio;
3213 min_row_time = dml_min(dpte_row_height, meta_row_height) * LineTime
3216 if (*DestinationLinesToRequestVMInImmediateFlip >= 8
3217 || *DestinationLinesToRequestRowInImmediateFlip >= 16
3218 || TimeForFetchingMetaPTEImmediateFlip
3219 + 2 * TimeForFetchingRowInVBlankImmediateFlip
3221 *ImmediateFlipSupportedForPipe = false;
3223 *ImmediateFlipSupportedForPipe = true;
3227 static unsigned int TruncToValidBPP(
3230 enum output_encoder_class Output,
3231 enum output_format_class Format,
3232 unsigned int DSCInputBitPerComponent)
3234 if (Output == dm_hdmi) {
3235 if (Format == dm_420) {
3236 if (DecimalBPP >= 18)
3238 else if (DecimalBPP >= 15)
3240 else if (DecimalBPP >= 12)
3244 } else if (Format == dm_444) {
3245 if (DecimalBPP >= 36)
3247 else if (DecimalBPP >= 30)
3249 else if (DecimalBPP >= 24)
3251 else if (DecimalBPP >= 18)
3256 if (DecimalBPP / 1.5 >= 24)
3258 else if (DecimalBPP / 1.5 >= 20)
3260 else if (DecimalBPP / 1.5 >= 16)
3267 if (Format == dm_420) {
3270 else if (DecimalBPP >= 1.5 * DSCInputBitPerComponent - 1 / 16)
3271 return 1.5 * DSCInputBitPerComponent - 1 / 16;
3273 return dml_floor(16 * DecimalBPP, 1) / 16;
3274 } else if (Format == dm_n422) {
3277 else if (DecimalBPP >= 2 * DSCInputBitPerComponent - 1 / 16)
3278 return 2 * DSCInputBitPerComponent - 1 / 16;
3280 return dml_floor(16 * DecimalBPP, 1) / 16;
3284 else if (DecimalBPP >= 3 * DSCInputBitPerComponent - 1 / 16)
3285 return 3 * DSCInputBitPerComponent - 1 / 16;
3287 return dml_floor(16 * DecimalBPP, 1) / 16;
3289 } else if (Format == dm_420) {
3290 if (DecimalBPP >= 18)
3292 else if (DecimalBPP >= 15)
3294 else if (DecimalBPP >= 12)
3298 } else if (Format == dm_s422 || Format == dm_n422) {
3299 if (DecimalBPP >= 24)
3301 else if (DecimalBPP >= 20)
3303 else if (DecimalBPP >= 16)
3308 if (DecimalBPP >= 36)
3310 else if (DecimalBPP >= 30)
3312 else if (DecimalBPP >= 24)
3314 else if (DecimalBPP >= 18)
3322 void dml20v2_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib)
3324 struct vba_vars_st *locals = &mode_lib->vba;
3327 unsigned int j, k, m;
3329 /*MODE SUPPORT, VOLTAGE STATE AND SOC CONFIGURATION*/
3331 /*Scale Ratio, taps Support Check*/
3333 mode_lib->vba.ScaleRatioAndTapsSupport = true;
3334 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3335 if (mode_lib->vba.ScalerEnabled[k] == false
3336 && ((mode_lib->vba.SourcePixelFormat[k] != dm_444_64
3337 && mode_lib->vba.SourcePixelFormat[k] != dm_444_32
3338 && mode_lib->vba.SourcePixelFormat[k] != dm_444_16
3339 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_16
3340 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_8)
3341 || mode_lib->vba.HRatio[k] != 1.0
3342 || mode_lib->vba.htaps[k] != 1.0
3343 || mode_lib->vba.VRatio[k] != 1.0
3344 || mode_lib->vba.vtaps[k] != 1.0)) {
3345 mode_lib->vba.ScaleRatioAndTapsSupport = false;
3346 } else if (mode_lib->vba.vtaps[k] < 1.0 || mode_lib->vba.vtaps[k] > 8.0
3347 || mode_lib->vba.htaps[k] < 1.0 || mode_lib->vba.htaps[k] > 8.0
3348 || (mode_lib->vba.htaps[k] > 1.0
3349 && (mode_lib->vba.htaps[k] % 2) == 1)
3350 || mode_lib->vba.HRatio[k] > mode_lib->vba.MaxHSCLRatio
3351 || mode_lib->vba.VRatio[k] > mode_lib->vba.MaxVSCLRatio
3352 || mode_lib->vba.HRatio[k] > mode_lib->vba.htaps[k]
3353 || mode_lib->vba.VRatio[k] > mode_lib->vba.vtaps[k]
3354 || (mode_lib->vba.SourcePixelFormat[k] != dm_444_64
3355 && mode_lib->vba.SourcePixelFormat[k] != dm_444_32
3356 && mode_lib->vba.SourcePixelFormat[k] != dm_444_16
3357 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_16
3358 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_8
3359 && (mode_lib->vba.HRatio[k] / 2.0
3360 > mode_lib->vba.HTAPsChroma[k]
3361 || mode_lib->vba.VRatio[k] / 2.0
3362 > mode_lib->vba.VTAPsChroma[k]))) {
3363 mode_lib->vba.ScaleRatioAndTapsSupport = false;
3366 /*Source Format, Pixel Format and Scan Support Check*/
3368 mode_lib->vba.SourceFormatPixelAndScanSupport = true;
3369 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3370 if ((mode_lib->vba.SurfaceTiling[k] == dm_sw_linear
3371 && mode_lib->vba.SourceScan[k] != dm_horz)
3372 || ((mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_d
3373 || mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_d_x
3374 || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d
3375 || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d_t
3376 || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d_x
3377 || mode_lib->vba.SurfaceTiling[k] == dm_sw_var_d
3378 || mode_lib->vba.SurfaceTiling[k] == dm_sw_var_d_x)
3379 && mode_lib->vba.SourcePixelFormat[k] != dm_444_64)
3380 || (mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_r_x
3381 && (mode_lib->vba.SourcePixelFormat[k] == dm_mono_8
3382 || mode_lib->vba.SourcePixelFormat[k]
3384 || mode_lib->vba.SourcePixelFormat[k]
3386 || (((mode_lib->vba.SurfaceTiling[k] == dm_sw_gfx7_2d_thin_gl
3387 || mode_lib->vba.SurfaceTiling[k]
3388 == dm_sw_gfx7_2d_thin_lvp)
3389 && !((mode_lib->vba.SourcePixelFormat[k]
3391 || mode_lib->vba.SourcePixelFormat[k]
3393 && mode_lib->vba.SourceScan[k]
3395 && mode_lib->vba.SupportGFX7CompatibleTilingIn32bppAnd64bpp
3397 && mode_lib->vba.DCCEnable[k]
3399 || (mode_lib->vba.DCCEnable[k] == true
3400 && (mode_lib->vba.SurfaceTiling[k]
3402 || mode_lib->vba.SourcePixelFormat[k]
3404 || mode_lib->vba.SourcePixelFormat[k]
3406 mode_lib->vba.SourceFormatPixelAndScanSupport = false;
3409 /*Bandwidth Support Check*/
3411 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3412 if (mode_lib->vba.SourcePixelFormat[k] == dm_444_64) {
3413 locals->BytePerPixelInDETY[k] = 8.0;
3414 locals->BytePerPixelInDETC[k] = 0.0;
3415 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_32) {
3416 locals->BytePerPixelInDETY[k] = 4.0;
3417 locals->BytePerPixelInDETC[k] = 0.0;
3418 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_16
3419 || mode_lib->vba.SourcePixelFormat[k] == dm_mono_16) {
3420 locals->BytePerPixelInDETY[k] = 2.0;
3421 locals->BytePerPixelInDETC[k] = 0.0;
3422 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_mono_8) {
3423 locals->BytePerPixelInDETY[k] = 1.0;
3424 locals->BytePerPixelInDETC[k] = 0.0;
3425 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8) {
3426 locals->BytePerPixelInDETY[k] = 1.0;
3427 locals->BytePerPixelInDETC[k] = 2.0;
3429 locals->BytePerPixelInDETY[k] = 4.0 / 3;
3430 locals->BytePerPixelInDETC[k] = 8.0 / 3;
3432 if (mode_lib->vba.SourceScan[k] == dm_horz) {
3433 locals->SwathWidthYSingleDPP[k] = mode_lib->vba.ViewportWidth[k];
3435 locals->SwathWidthYSingleDPP[k] = mode_lib->vba.ViewportHeight[k];
3438 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3439 locals->ReadBandwidthLuma[k] = locals->SwathWidthYSingleDPP[k] * dml_ceil(locals->BytePerPixelInDETY[k], 1.0)
3440 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k];
3441 locals->ReadBandwidthChroma[k] = locals->SwathWidthYSingleDPP[k] / 2 * dml_ceil(locals->BytePerPixelInDETC[k], 2.0)
3442 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k] / 2.0;
3443 locals->ReadBandwidth[k] = locals->ReadBandwidthLuma[k] + locals->ReadBandwidthChroma[k];
3445 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3446 if (mode_lib->vba.WritebackEnable[k] == true
3447 && mode_lib->vba.WritebackPixelFormat[k] == dm_444_32) {
3448 locals->WriteBandwidth[k] = mode_lib->vba.WritebackDestinationWidth[k]
3449 * mode_lib->vba.WritebackDestinationHeight[k]
3450 / (mode_lib->vba.WritebackSourceHeight[k]
3451 * mode_lib->vba.HTotal[k]
3452 / mode_lib->vba.PixelClock[k]) * 4.0;
3453 } else if (mode_lib->vba.WritebackEnable[k] == true
3454 && mode_lib->vba.WritebackPixelFormat[k] == dm_420_10) {
3455 locals->WriteBandwidth[k] = mode_lib->vba.WritebackDestinationWidth[k]
3456 * mode_lib->vba.WritebackDestinationHeight[k]
3457 / (mode_lib->vba.WritebackSourceHeight[k]
3458 * mode_lib->vba.HTotal[k]
3459 / mode_lib->vba.PixelClock[k]) * 3.0;
3460 } else if (mode_lib->vba.WritebackEnable[k] == true) {
3461 locals->WriteBandwidth[k] = mode_lib->vba.WritebackDestinationWidth[k]
3462 * mode_lib->vba.WritebackDestinationHeight[k]
3463 / (mode_lib->vba.WritebackSourceHeight[k]
3464 * mode_lib->vba.HTotal[k]
3465 / mode_lib->vba.PixelClock[k]) * 1.5;
3467 locals->WriteBandwidth[k] = 0.0;
3470 mode_lib->vba.DCCEnabledInAnyPlane = false;
3471 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3472 if (mode_lib->vba.DCCEnable[k] == true) {
3473 mode_lib->vba.DCCEnabledInAnyPlane = true;
3476 for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
3477 locals->FabricAndDRAMBandwidthPerState[i] = dml_min(
3478 mode_lib->vba.DRAMSpeedPerState[i] * mode_lib->vba.NumberOfChannels
3479 * mode_lib->vba.DRAMChannelWidth,
3480 mode_lib->vba.FabricClockPerState[i]
3481 * mode_lib->vba.FabricDatapathToDCNDataReturn) / 1000;
3482 locals->ReturnBWToDCNPerState = dml_min(locals->ReturnBusWidth * locals->DCFCLKPerState[i],
3483 locals->FabricAndDRAMBandwidthPerState[i] * 1000)
3484 * locals->PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelDataOnly / 100;
3486 locals->ReturnBWPerState[i] = locals->ReturnBWToDCNPerState;
3488 if (locals->DCCEnabledInAnyPlane == true && locals->ReturnBWToDCNPerState > locals->DCFCLKPerState[i] * locals->ReturnBusWidth / 4) {
3489 locals->ReturnBWPerState[i] = dml_min(locals->ReturnBWPerState[i],
3490 locals->ReturnBWToDCNPerState * 4 * (1 - locals->UrgentLatency /
3491 ((locals->ROBBufferSizeInKByte - locals->PixelChunkSizeInKByte) * 1024
3492 / (locals->ReturnBWToDCNPerState - locals->DCFCLKPerState[i]
3493 * locals->ReturnBusWidth / 4) + locals->UrgentLatency)));
3495 locals->CriticalPoint = 2 * locals->ReturnBusWidth * locals->DCFCLKPerState[i] *
3496 locals->UrgentLatency / (locals->ReturnBWToDCNPerState * locals->UrgentLatency
3497 + (locals->ROBBufferSizeInKByte - locals->PixelChunkSizeInKByte) * 1024);
3499 if (locals->DCCEnabledInAnyPlane && locals->CriticalPoint > 1 && locals->CriticalPoint < 4) {
3500 locals->ReturnBWPerState[i] = dml_min(locals->ReturnBWPerState[i],
3501 4 * locals->ReturnBWToDCNPerState *
3502 (locals->ROBBufferSizeInKByte - locals->PixelChunkSizeInKByte) * 1024
3503 * locals->ReturnBusWidth * locals->DCFCLKPerState[i] * locals->UrgentLatency /
3504 dml_pow((locals->ReturnBWToDCNPerState * locals->UrgentLatency
3505 + (locals->ROBBufferSizeInKByte - locals->PixelChunkSizeInKByte) * 1024), 2));
3508 locals->ReturnBWToDCNPerState = dml_min(locals->ReturnBusWidth *
3509 locals->DCFCLKPerState[i], locals->FabricAndDRAMBandwidthPerState[i] * 1000);
3511 if (locals->DCCEnabledInAnyPlane == true && locals->ReturnBWToDCNPerState > locals->DCFCLKPerState[i] * locals->ReturnBusWidth / 4) {
3512 locals->ReturnBWPerState[i] = dml_min(locals->ReturnBWPerState[i],
3513 locals->ReturnBWToDCNPerState * 4 * (1 - locals->UrgentLatency /
3514 ((locals->ROBBufferSizeInKByte - locals->PixelChunkSizeInKByte) * 1024
3515 / (locals->ReturnBWToDCNPerState - locals->DCFCLKPerState[i]
3516 * locals->ReturnBusWidth / 4) + locals->UrgentLatency)));
3518 locals->CriticalPoint = 2 * locals->ReturnBusWidth * locals->DCFCLKPerState[i] *
3519 locals->UrgentLatency / (locals->ReturnBWToDCNPerState * locals->UrgentLatency
3520 + (locals->ROBBufferSizeInKByte - locals->PixelChunkSizeInKByte) * 1024);
3522 if (locals->DCCEnabledInAnyPlane && locals->CriticalPoint > 1 && locals->CriticalPoint < 4) {
3523 locals->ReturnBWPerState[i] = dml_min(locals->ReturnBWPerState[i],
3524 4 * locals->ReturnBWToDCNPerState *
3525 (locals->ROBBufferSizeInKByte - locals->PixelChunkSizeInKByte) * 1024
3526 * locals->ReturnBusWidth * locals->DCFCLKPerState[i] * locals->UrgentLatency /
3527 dml_pow((locals->ReturnBWToDCNPerState * locals->UrgentLatency
3528 + (locals->ROBBufferSizeInKByte - locals->PixelChunkSizeInKByte) * 1024), 2));
3531 /*Writeback Latency support check*/
3533 mode_lib->vba.WritebackLatencySupport = true;
3534 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3535 if (mode_lib->vba.WritebackEnable[k] == true) {
3536 if (mode_lib->vba.WritebackPixelFormat[k] == dm_444_32) {
3537 if (locals->WriteBandwidth[k]
3538 > (mode_lib->vba.WritebackInterfaceLumaBufferSize
3539 + mode_lib->vba.WritebackInterfaceChromaBufferSize)
3540 / mode_lib->vba.WritebackLatency) {
3541 mode_lib->vba.WritebackLatencySupport = false;
3544 if (locals->WriteBandwidth[k]
3547 mode_lib->vba.WritebackInterfaceLumaBufferSize,
3549 * mode_lib->vba.WritebackInterfaceChromaBufferSize)
3550 / mode_lib->vba.WritebackLatency) {
3551 mode_lib->vba.WritebackLatencySupport = false;
3556 /*Re-ordering Buffer Support Check*/
3558 for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
3559 locals->UrgentRoundTripAndOutOfOrderLatencyPerState[i] =
3560 (mode_lib->vba.RoundTripPingLatencyCycles + 32.0) / mode_lib->vba.DCFCLKPerState[i]
3561 + locals->UrgentOutOfOrderReturnPerChannel * mode_lib->vba.NumberOfChannels / locals->ReturnBWPerState[i];
3562 if ((mode_lib->vba.ROBBufferSizeInKByte - mode_lib->vba.PixelChunkSizeInKByte) * 1024.0 / locals->ReturnBWPerState[i]
3563 > locals->UrgentRoundTripAndOutOfOrderLatencyPerState[i]) {
3564 locals->ROBSupport[i] = true;
3566 locals->ROBSupport[i] = false;
3569 /*Writeback Mode Support Check*/
3571 mode_lib->vba.TotalNumberOfActiveWriteback = 0;
3572 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3573 if (mode_lib->vba.WritebackEnable[k] == true) {
3574 if (mode_lib->vba.ActiveWritebacksPerPlane[k] == 0)
3575 mode_lib->vba.ActiveWritebacksPerPlane[k] = 1;
3576 mode_lib->vba.TotalNumberOfActiveWriteback =
3577 mode_lib->vba.TotalNumberOfActiveWriteback
3578 + mode_lib->vba.ActiveWritebacksPerPlane[k];
3581 mode_lib->vba.WritebackModeSupport = true;
3582 if (mode_lib->vba.TotalNumberOfActiveWriteback > mode_lib->vba.MaxNumWriteback) {
3583 mode_lib->vba.WritebackModeSupport = false;
3585 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3586 if (mode_lib->vba.WritebackEnable[k] == true
3587 && mode_lib->vba.Writeback10bpc420Supported != true
3588 && mode_lib->vba.WritebackPixelFormat[k] == dm_420_10) {
3589 mode_lib->vba.WritebackModeSupport = false;
3592 /*Writeback Scale Ratio and Taps Support Check*/
3594 mode_lib->vba.WritebackScaleRatioAndTapsSupport = true;
3595 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3596 if (mode_lib->vba.WritebackEnable[k] == true) {
3597 if (mode_lib->vba.WritebackLumaAndChromaScalingSupported == false
3598 && (mode_lib->vba.WritebackHRatio[k] != 1.0
3599 || mode_lib->vba.WritebackVRatio[k] != 1.0)) {
3600 mode_lib->vba.WritebackScaleRatioAndTapsSupport = false;
3602 if (mode_lib->vba.WritebackHRatio[k] > mode_lib->vba.WritebackMaxHSCLRatio
3603 || mode_lib->vba.WritebackVRatio[k]
3604 > mode_lib->vba.WritebackMaxVSCLRatio
3605 || mode_lib->vba.WritebackHRatio[k]
3606 < mode_lib->vba.WritebackMinHSCLRatio
3607 || mode_lib->vba.WritebackVRatio[k]
3608 < mode_lib->vba.WritebackMinVSCLRatio
3609 || mode_lib->vba.WritebackLumaHTaps[k]
3610 > mode_lib->vba.WritebackMaxHSCLTaps
3611 || mode_lib->vba.WritebackLumaVTaps[k]
3612 > mode_lib->vba.WritebackMaxVSCLTaps
3613 || mode_lib->vba.WritebackHRatio[k]
3614 > mode_lib->vba.WritebackLumaHTaps[k]
3615 || mode_lib->vba.WritebackVRatio[k]
3616 > mode_lib->vba.WritebackLumaVTaps[k]
3617 || (mode_lib->vba.WritebackLumaHTaps[k] > 2.0
3618 && ((mode_lib->vba.WritebackLumaHTaps[k] % 2)
3620 || (mode_lib->vba.WritebackPixelFormat[k] != dm_444_32
3621 && (mode_lib->vba.WritebackChromaHTaps[k]
3622 > mode_lib->vba.WritebackMaxHSCLTaps
3623 || mode_lib->vba.WritebackChromaVTaps[k]
3624 > mode_lib->vba.WritebackMaxVSCLTaps
3626 * mode_lib->vba.WritebackHRatio[k]
3627 > mode_lib->vba.WritebackChromaHTaps[k]
3629 * mode_lib->vba.WritebackVRatio[k]
3630 > mode_lib->vba.WritebackChromaVTaps[k]
3631 || (mode_lib->vba.WritebackChromaHTaps[k] > 2.0
3632 && ((mode_lib->vba.WritebackChromaHTaps[k] % 2) == 1))))) {
3633 mode_lib->vba.WritebackScaleRatioAndTapsSupport = false;
3635 if (mode_lib->vba.WritebackVRatio[k] < 1.0) {
3636 mode_lib->vba.WritebackLumaVExtra =
3637 dml_max(1.0 - 2.0 / dml_ceil(1.0 / mode_lib->vba.WritebackVRatio[k], 1.0), 0.0);
3639 mode_lib->vba.WritebackLumaVExtra = -1;
3641 if ((mode_lib->vba.WritebackPixelFormat[k] == dm_444_32
3642 && mode_lib->vba.WritebackLumaVTaps[k]
3643 > (mode_lib->vba.WritebackLineBufferLumaBufferSize
3644 + mode_lib->vba.WritebackLineBufferChromaBufferSize)
3646 / mode_lib->vba.WritebackDestinationWidth[k]
3647 - mode_lib->vba.WritebackLumaVExtra)
3648 || (mode_lib->vba.WritebackPixelFormat[k] == dm_420_8
3649 && mode_lib->vba.WritebackLumaVTaps[k]
3650 > mode_lib->vba.WritebackLineBufferLumaBufferSize
3651 * 8.0 / 10.0 / mode_lib->vba.WritebackDestinationWidth[k]
3652 - mode_lib->vba.WritebackLumaVExtra)
3653 || (mode_lib->vba.WritebackPixelFormat[k] == dm_420_10
3654 && mode_lib->vba.WritebackLumaVTaps[k]
3655 > mode_lib->vba.WritebackLineBufferLumaBufferSize
3657 / mode_lib->vba.WritebackDestinationWidth[k]
3658 - mode_lib->vba.WritebackLumaVExtra)) {
3659 mode_lib->vba.WritebackScaleRatioAndTapsSupport = false;
3661 if (2.0 * mode_lib->vba.WritebackVRatio[k] < 1) {
3662 mode_lib->vba.WritebackChromaVExtra = 0.0;
3664 mode_lib->vba.WritebackChromaVExtra = -1;
3666 if ((mode_lib->vba.WritebackPixelFormat[k] == dm_420_8
3667 && mode_lib->vba.WritebackChromaVTaps[k]
3668 > mode_lib->vba.WritebackLineBufferChromaBufferSize
3669 * 8.0 / 10.0 / mode_lib->vba.WritebackDestinationWidth[k]
3670 - mode_lib->vba.WritebackChromaVExtra)
3671 || (mode_lib->vba.WritebackPixelFormat[k] == dm_420_10
3672 && mode_lib->vba.WritebackChromaVTaps[k]
3673 > mode_lib->vba.WritebackLineBufferChromaBufferSize
3675 / mode_lib->vba.WritebackDestinationWidth[k]
3676 - mode_lib->vba.WritebackChromaVExtra)) {
3677 mode_lib->vba.WritebackScaleRatioAndTapsSupport = false;
3681 /*Maximum DISPCLK/DPPCLK Support check*/
3683 mode_lib->vba.WritebackRequiredDISPCLK = 0.0;
3684 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3685 if (mode_lib->vba.WritebackEnable[k] == true) {
3686 mode_lib->vba.WritebackRequiredDISPCLK =
3688 mode_lib->vba.WritebackRequiredDISPCLK,
3689 CalculateWriteBackDISPCLK(
3690 mode_lib->vba.WritebackPixelFormat[k],
3691 mode_lib->vba.PixelClock[k],
3692 mode_lib->vba.WritebackHRatio[k],
3693 mode_lib->vba.WritebackVRatio[k],
3694 mode_lib->vba.WritebackLumaHTaps[k],
3695 mode_lib->vba.WritebackLumaVTaps[k],
3696 mode_lib->vba.WritebackChromaHTaps[k],
3697 mode_lib->vba.WritebackChromaVTaps[k],
3698 mode_lib->vba.WritebackDestinationWidth[k],
3699 mode_lib->vba.HTotal[k],
3700 mode_lib->vba.WritebackChromaLineBufferWidth));
3703 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3704 if (mode_lib->vba.HRatio[k] > 1.0) {
3705 locals->PSCL_FACTOR[k] = dml_min(
3706 mode_lib->vba.MaxDCHUBToPSCLThroughput,
3707 mode_lib->vba.MaxPSCLToLBThroughput
3708 * mode_lib->vba.HRatio[k]
3710 mode_lib->vba.htaps[k]
3714 locals->PSCL_FACTOR[k] = dml_min(
3715 mode_lib->vba.MaxDCHUBToPSCLThroughput,
3716 mode_lib->vba.MaxPSCLToLBThroughput);
3718 if (locals->BytePerPixelInDETC[k] == 0.0) {
3719 locals->PSCL_FACTOR_CHROMA[k] = 0.0;
3720 locals->MinDPPCLKUsingSingleDPP[k] =
3721 mode_lib->vba.PixelClock[k]
3723 mode_lib->vba.vtaps[k] / 6.0
3726 mode_lib->vba.HRatio[k]),
3727 mode_lib->vba.HRatio[k]
3728 * mode_lib->vba.VRatio[k]
3729 / locals->PSCL_FACTOR[k],
3731 if ((mode_lib->vba.htaps[k] > 6.0 || mode_lib->vba.vtaps[k] > 6.0)
3732 && locals->MinDPPCLKUsingSingleDPP[k]
3733 < 2.0 * mode_lib->vba.PixelClock[k]) {
3734 locals->MinDPPCLKUsingSingleDPP[k] = 2.0
3735 * mode_lib->vba.PixelClock[k];
3738 if (mode_lib->vba.HRatio[k] / 2.0 > 1.0) {
3739 locals->PSCL_FACTOR_CHROMA[k] =
3741 mode_lib->vba.MaxDCHUBToPSCLThroughput,
3742 mode_lib->vba.MaxPSCLToLBThroughput
3743 * mode_lib->vba.HRatio[k]
3746 mode_lib->vba.HTAPsChroma[k]
3750 locals->PSCL_FACTOR_CHROMA[k] = dml_min(
3751 mode_lib->vba.MaxDCHUBToPSCLThroughput,
3752 mode_lib->vba.MaxPSCLToLBThroughput);
3754 locals->MinDPPCLKUsingSingleDPP[k] =
3755 mode_lib->vba.PixelClock[k]
3757 mode_lib->vba.vtaps[k] / 6.0
3760 mode_lib->vba.HRatio[k]),
3761 mode_lib->vba.HRatio[k]
3762 * mode_lib->vba.VRatio[k]
3763 / locals->PSCL_FACTOR[k],
3764 mode_lib->vba.VTAPsChroma[k]
3768 mode_lib->vba.HRatio[k]
3770 mode_lib->vba.HRatio[k]
3771 * mode_lib->vba.VRatio[k]
3773 / locals->PSCL_FACTOR_CHROMA[k],
3775 if ((mode_lib->vba.htaps[k] > 6.0 || mode_lib->vba.vtaps[k] > 6.0
3776 || mode_lib->vba.HTAPsChroma[k] > 6.0
3777 || mode_lib->vba.VTAPsChroma[k] > 6.0)
3778 && locals->MinDPPCLKUsingSingleDPP[k]
3779 < 2.0 * mode_lib->vba.PixelClock[k]) {
3780 locals->MinDPPCLKUsingSingleDPP[k] = 2.0
3781 * mode_lib->vba.PixelClock[k];
3785 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3786 Calculate256BBlockSizes(
3787 mode_lib->vba.SourcePixelFormat[k],
3788 mode_lib->vba.SurfaceTiling[k],
3789 dml_ceil(locals->BytePerPixelInDETY[k], 1.0),
3790 dml_ceil(locals->BytePerPixelInDETC[k], 2.0),
3791 &locals->Read256BlockHeightY[k],
3792 &locals->Read256BlockHeightC[k],
3793 &locals->Read256BlockWidthY[k],
3794 &locals->Read256BlockWidthC[k]);
3795 if (mode_lib->vba.SourceScan[k] == dm_horz) {
3796 locals->MaxSwathHeightY[k] = locals->Read256BlockHeightY[k];
3797 locals->MaxSwathHeightC[k] = locals->Read256BlockHeightC[k];
3799 locals->MaxSwathHeightY[k] = locals->Read256BlockWidthY[k];
3800 locals->MaxSwathHeightC[k] = locals->Read256BlockWidthC[k];
3802 if ((mode_lib->vba.SourcePixelFormat[k] == dm_444_64
3803 || mode_lib->vba.SourcePixelFormat[k] == dm_444_32
3804 || mode_lib->vba.SourcePixelFormat[k] == dm_444_16
3805 || mode_lib->vba.SourcePixelFormat[k] == dm_mono_16
3806 || mode_lib->vba.SourcePixelFormat[k] == dm_mono_8)) {
3807 if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear
3808 || (mode_lib->vba.SourcePixelFormat[k] == dm_444_64
3809 && (mode_lib->vba.SurfaceTiling[k]
3811 || mode_lib->vba.SurfaceTiling[k]
3813 || mode_lib->vba.SurfaceTiling[k]
3815 || mode_lib->vba.SurfaceTiling[k]
3817 || mode_lib->vba.SurfaceTiling[k]
3819 || mode_lib->vba.SurfaceTiling[k]
3821 || mode_lib->vba.SurfaceTiling[k]
3823 && mode_lib->vba.SourceScan[k] == dm_horz)) {
3824 locals->MinSwathHeightY[k] = locals->MaxSwathHeightY[k];
3826 locals->MinSwathHeightY[k] = locals->MaxSwathHeightY[k]
3829 locals->MinSwathHeightC[k] = locals->MaxSwathHeightC[k];
3831 if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) {
3832 locals->MinSwathHeightY[k] = locals->MaxSwathHeightY[k];
3833 locals->MinSwathHeightC[k] = locals->MaxSwathHeightC[k];
3834 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8
3835 && mode_lib->vba.SourceScan[k] == dm_horz) {
3836 locals->MinSwathHeightY[k] = locals->MaxSwathHeightY[k]
3838 locals->MinSwathHeightC[k] = locals->MaxSwathHeightC[k];
3839 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10
3840 && mode_lib->vba.SourceScan[k] == dm_horz) {
3841 locals->MinSwathHeightC[k] = locals->MaxSwathHeightC[k]
3843 locals->MinSwathHeightY[k] = locals->MaxSwathHeightY[k];
3845 locals->MinSwathHeightY[k] = locals->MaxSwathHeightY[k];
3846 locals->MinSwathHeightC[k] = locals->MaxSwathHeightC[k];
3849 if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) {
3850 mode_lib->vba.MaximumSwathWidthSupport = 8192.0;
3852 mode_lib->vba.MaximumSwathWidthSupport = 5120.0;
3854 mode_lib->vba.MaximumSwathWidthInDETBuffer =
3856 mode_lib->vba.MaximumSwathWidthSupport,
3857 mode_lib->vba.DETBufferSizeInKByte * 1024.0 / 2.0
3858 / (locals->BytePerPixelInDETY[k]
3859 * locals->MinSwathHeightY[k]
3860 + locals->BytePerPixelInDETC[k]
3862 * locals->MinSwathHeightC[k]));
3863 if (locals->BytePerPixelInDETC[k] == 0.0) {
3864 mode_lib->vba.MaximumSwathWidthInLineBuffer =
3865 mode_lib->vba.LineBufferSize
3866 * dml_max(mode_lib->vba.HRatio[k], 1.0)
3867 / mode_lib->vba.LBBitPerPixel[k]
3868 / (mode_lib->vba.vtaps[k]
3871 mode_lib->vba.VRatio[k],
3876 mode_lib->vba.MaximumSwathWidthInLineBuffer =
3878 mode_lib->vba.LineBufferSize
3880 mode_lib->vba.HRatio[k],
3882 / mode_lib->vba.LBBitPerPixel[k]
3883 / (mode_lib->vba.vtaps[k]
3886 mode_lib->vba.VRatio[k],
3890 2.0 * mode_lib->vba.LineBufferSize
3892 mode_lib->vba.HRatio[k]
3895 / mode_lib->vba.LBBitPerPixel[k]
3896 / (mode_lib->vba.VTAPsChroma[k]
3899 mode_lib->vba.VRatio[k]
3905 locals->MaximumSwathWidth[k] = dml_min(
3906 mode_lib->vba.MaximumSwathWidthInDETBuffer,
3907 mode_lib->vba.MaximumSwathWidthInLineBuffer);
3909 for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
3910 double MaxMaxDispclkRoundedDown = RoundToDFSGranularityDown(
3911 mode_lib->vba.MaxDispclk[mode_lib->vba.soc.num_states],
3912 mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
3914 for (j = 0; j < 2; j++) {
3915 mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity = RoundToDFSGranularityDown(
3916 mode_lib->vba.MaxDispclk[i],
3917 mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
3918 mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity = RoundToDFSGranularityDown(
3919 mode_lib->vba.MaxDppclk[i],
3920 mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
3921 locals->RequiredDISPCLK[i][j] = 0.0;
3922 locals->DISPCLK_DPPCLK_Support[i][j] = true;
3923 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3924 mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine =
3925 mode_lib->vba.PixelClock[k] * (1.0 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0)
3926 * (1.0 + mode_lib->vba.DISPCLKRampingMargin / 100.0);
3927 if (mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine >= mode_lib->vba.MaxDispclk[i]
3928 && i == mode_lib->vba.soc.num_states)
3929 mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine = mode_lib->vba.PixelClock[k]
3930 * (1 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0);
3932 mode_lib->vba.PlaneRequiredDISPCLKWithODMCombine = mode_lib->vba.PixelClock[k] / 2
3933 * (1 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) * (1 + mode_lib->vba.DISPCLKRampingMargin / 100.0);
3934 if (mode_lib->vba.PlaneRequiredDISPCLKWithODMCombine >= mode_lib->vba.MaxDispclk[i]
3935 && i == mode_lib->vba.soc.num_states)
3936 mode_lib->vba.PlaneRequiredDISPCLKWithODMCombine = mode_lib->vba.PixelClock[k] / 2
3937 * (1 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0);
3938 if (mode_lib->vba.ODMCapability == false ||
3939 (locals->PlaneRequiredDISPCLKWithoutODMCombine <= MaxMaxDispclkRoundedDown
3940 && (!locals->DSCEnabled[k] || locals->HActive[k] <= DCN20_MAX_DSC_IMAGE_WIDTH))) {
3941 locals->ODMCombineEnablePerState[i][k] = false;
3942 mode_lib->vba.PlaneRequiredDISPCLK = mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine;
3944 locals->ODMCombineEnablePerState[i][k] = true;
3945 mode_lib->vba.PlaneRequiredDISPCLK = mode_lib->vba.PlaneRequiredDISPCLKWithODMCombine;
3947 if (locals->MinDPPCLKUsingSingleDPP[k] * (1.0 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) <= mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity
3948 && locals->SwathWidthYSingleDPP[k] <= locals->MaximumSwathWidth[k]
3949 && locals->ODMCombineEnablePerState[i][k] == false) {
3950 locals->NoOfDPP[i][j][k] = 1;
3951 locals->RequiredDPPCLK[i][j][k] =
3952 locals->MinDPPCLKUsingSingleDPP[k] * (1.0 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0);
3954 locals->NoOfDPP[i][j][k] = 2;
3955 locals->RequiredDPPCLK[i][j][k] =
3956 locals->MinDPPCLKUsingSingleDPP[k] * (1.0 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) / 2.0;
3958 locals->RequiredDISPCLK[i][j] = dml_max(
3959 locals->RequiredDISPCLK[i][j],
3960 mode_lib->vba.PlaneRequiredDISPCLK);
3961 if ((locals->MinDPPCLKUsingSingleDPP[k] / locals->NoOfDPP[i][j][k] * (1.0 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0)
3962 > mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity)
3963 || (mode_lib->vba.PlaneRequiredDISPCLK > mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity)) {
3964 locals->DISPCLK_DPPCLK_Support[i][j] = false;
3967 locals->TotalNumberOfActiveDPP[i][j] = 0.0;
3968 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++)
3969 locals->TotalNumberOfActiveDPP[i][j] = locals->TotalNumberOfActiveDPP[i][j] + locals->NoOfDPP[i][j][k];
3971 while (locals->TotalNumberOfActiveDPP[i][j] < mode_lib->vba.MaxNumDPP
3972 && locals->TotalNumberOfActiveDPP[i][j] < 2 * mode_lib->vba.NumberOfActivePlanes) {
3973 double BWOfNonSplitPlaneOfMaximumBandwidth;
3974 unsigned int NumberOfNonSplitPlaneOfMaximumBandwidth;
3976 BWOfNonSplitPlaneOfMaximumBandwidth = 0;
3977 NumberOfNonSplitPlaneOfMaximumBandwidth = 0;
3978 for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
3979 if (locals->ReadBandwidth[k] > BWOfNonSplitPlaneOfMaximumBandwidth && locals->NoOfDPP[i][j][k] == 1) {
3980 BWOfNonSplitPlaneOfMaximumBandwidth = locals->ReadBandwidth[k];
3981 NumberOfNonSplitPlaneOfMaximumBandwidth = k;
3984 locals->NoOfDPP[i][j][NumberOfNonSplitPlaneOfMaximumBandwidth] = 2;
3985 locals->RequiredDPPCLK[i][j][NumberOfNonSplitPlaneOfMaximumBandwidth] =
3986 locals->MinDPPCLKUsingSingleDPP[NumberOfNonSplitPlaneOfMaximumBandwidth]
3987 * (1 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100) / 2;
3988 locals->TotalNumberOfActiveDPP[i][j] = locals->TotalNumberOfActiveDPP[i][j] + 1;
3991 if (locals->TotalNumberOfActiveDPP[i][j] > mode_lib->vba.MaxNumDPP) {
3992 locals->RequiredDISPCLK[i][j] = 0.0;
3993 locals->DISPCLK_DPPCLK_Support[i][j] = true;
3994 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
3995 locals->ODMCombineEnablePerState[i][k] = false;
3996 if (locals->SwathWidthYSingleDPP[k] <= locals->MaximumSwathWidth[k]) {
3997 locals->NoOfDPP[i][j][k] = 1;
3998 locals->RequiredDPPCLK[i][j][k] = locals->MinDPPCLKUsingSingleDPP[k]
3999 * (1.0 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0);
4001 locals->NoOfDPP[i][j][k] = 2;
4002 locals->RequiredDPPCLK[i][j][k] = locals->MinDPPCLKUsingSingleDPP[k]
4003 * (1.0 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) / 2.0;
4005 if (i != mode_lib->vba.soc.num_states) {
4006 mode_lib->vba.PlaneRequiredDISPCLK =
4007 mode_lib->vba.PixelClock[k]
4008 * (1.0 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0)
4009 * (1.0 + mode_lib->vba.DISPCLKRampingMargin / 100.0);
4011 mode_lib->vba.PlaneRequiredDISPCLK = mode_lib->vba.PixelClock[k]
4012 * (1.0 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0);
4014 locals->RequiredDISPCLK[i][j] = dml_max(
4015 locals->RequiredDISPCLK[i][j],
4016 mode_lib->vba.PlaneRequiredDISPCLK);
4017 if (locals->MinDPPCLKUsingSingleDPP[k] / locals->NoOfDPP[i][j][k] * (1.0 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0)
4018 > mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity
4019 || mode_lib->vba.PlaneRequiredDISPCLK > mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity)
4020 locals->DISPCLK_DPPCLK_Support[i][j] = false;
4022 locals->TotalNumberOfActiveDPP[i][j] = 0.0;
4023 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++)
4024 locals->TotalNumberOfActiveDPP[i][j] = locals->TotalNumberOfActiveDPP[i][j] + locals->NoOfDPP[i][j][k];
4026 locals->RequiredDISPCLK[i][j] = dml_max(
4027 locals->RequiredDISPCLK[i][j],
4028 mode_lib->vba.WritebackRequiredDISPCLK);
4029 if (mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity
4030 < mode_lib->vba.WritebackRequiredDISPCLK) {
4031 locals->DISPCLK_DPPCLK_Support[i][j] = false;
4035 /*Viewport Size Check*/
4037 for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
4038 locals->ViewportSizeSupport[i] = true;
4039 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4040 if (locals->ODMCombineEnablePerState[i][k] == true) {
4041 if (dml_min(locals->SwathWidthYSingleDPP[k], dml_round(mode_lib->vba.HActive[k] / 2.0 * mode_lib->vba.HRatio[k]))
4042 > locals->MaximumSwathWidth[k]) {
4043 locals->ViewportSizeSupport[i] = false;
4046 if (locals->SwathWidthYSingleDPP[k] / 2.0 > locals->MaximumSwathWidth[k]) {
4047 locals->ViewportSizeSupport[i] = false;
4052 /*Total Available Pipes Support Check*/
4054 for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
4055 for (j = 0; j < 2; j++) {
4056 if (locals->TotalNumberOfActiveDPP[i][j] <= mode_lib->vba.MaxNumDPP)
4057 locals->TotalAvailablePipesSupport[i][j] = true;
4059 locals->TotalAvailablePipesSupport[i][j] = false;
4062 /*Total Available OTG Support Check*/
4064 mode_lib->vba.TotalNumberOfActiveOTG = 0.0;
4065 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4066 if (mode_lib->vba.BlendingAndTiming[k] == k) {
4067 mode_lib->vba.TotalNumberOfActiveOTG = mode_lib->vba.TotalNumberOfActiveOTG
4071 if (mode_lib->vba.TotalNumberOfActiveOTG <= mode_lib->vba.MaxNumOTG) {
4072 mode_lib->vba.NumberOfOTGSupport = true;
4074 mode_lib->vba.NumberOfOTGSupport = false;
4076 /*Display IO and DSC Support Check*/
4078 mode_lib->vba.NonsupportedDSCInputBPC = false;
4079 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4080 if (!(mode_lib->vba.DSCInputBitPerComponent[k] == 12.0
4081 || mode_lib->vba.DSCInputBitPerComponent[k] == 10.0
4082 || mode_lib->vba.DSCInputBitPerComponent[k] == 8.0)) {
4083 mode_lib->vba.NonsupportedDSCInputBPC = true;
4086 for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
4087 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4088 locals->RequiresDSC[i][k] = 0;
4089 locals->RequiresFEC[i][k] = 0;
4090 if (mode_lib->vba.BlendingAndTiming[k] == k) {
4091 if (mode_lib->vba.Output[k] == dm_hdmi) {
4092 locals->RequiresDSC[i][k] = 0;
4093 locals->RequiresFEC[i][k] = 0;
4094 locals->OutputBppPerState[i][k] = TruncToValidBPP(
4095 dml_min(600.0, mode_lib->vba.PHYCLKPerState[i]) / mode_lib->vba.PixelClockBackEnd[k] * 24,
4097 mode_lib->vba.Output[k],
4098 mode_lib->vba.OutputFormat[k],
4099 mode_lib->vba.DSCInputBitPerComponent[k]);
4100 } else if (mode_lib->vba.Output[k] == dm_dp
4101 || mode_lib->vba.Output[k] == dm_edp) {
4102 if (mode_lib->vba.Output[k] == dm_edp) {
4103 mode_lib->vba.EffectiveFECOverhead = 0.0;
4105 mode_lib->vba.EffectiveFECOverhead =
4106 mode_lib->vba.FECOverhead;
4108 if (mode_lib->vba.PHYCLKPerState[i] >= 270.0) {
4109 mode_lib->vba.Outbpp = TruncToValidBPP(
4110 (1.0 - mode_lib->vba.Downspreading / 100.0) * 270.0
4111 * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
4113 mode_lib->vba.Output[k],
4114 mode_lib->vba.OutputFormat[k],
4115 mode_lib->vba.DSCInputBitPerComponent[k]);
4116 mode_lib->vba.OutbppDSC = TruncToValidBPP(
4117 (1.0 - mode_lib->vba.Downspreading / 100.0) * (1.0 - mode_lib->vba.EffectiveFECOverhead / 100.0) * 270.0
4118 * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
4120 mode_lib->vba.Output[k],
4121 mode_lib->vba.OutputFormat[k],
4122 mode_lib->vba.DSCInputBitPerComponent[k]);
4123 if (mode_lib->vba.DSCEnabled[k] == true) {
4124 locals->RequiresDSC[i][k] = true;
4125 if (mode_lib->vba.Output[k] == dm_dp) {
4126 locals->RequiresFEC[i][k] = true;
4128 locals->RequiresFEC[i][k] = false;
4130 mode_lib->vba.Outbpp = mode_lib->vba.OutbppDSC;
4132 locals->RequiresDSC[i][k] = false;
4133 locals->RequiresFEC[i][k] = false;
4135 locals->OutputBppPerState[i][k] = mode_lib->vba.Outbpp;
4137 if (mode_lib->vba.Outbpp == BPP_INVALID && mode_lib->vba.PHYCLKPerState[i] >= 540.0) {
4138 mode_lib->vba.Outbpp = TruncToValidBPP(
4139 (1.0 - mode_lib->vba.Downspreading / 100.0) * 540.0
4140 * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
4142 mode_lib->vba.Output[k],
4143 mode_lib->vba.OutputFormat[k],
4144 mode_lib->vba.DSCInputBitPerComponent[k]);
4145 mode_lib->vba.OutbppDSC = TruncToValidBPP(
4146 (1.0 - mode_lib->vba.Downspreading / 100.0) * (1.0 - mode_lib->vba.EffectiveFECOverhead / 100.0) * 540.0
4147 * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
4149 mode_lib->vba.Output[k],
4150 mode_lib->vba.OutputFormat[k],
4151 mode_lib->vba.DSCInputBitPerComponent[k]);
4152 if (mode_lib->vba.DSCEnabled[k] == true) {
4153 locals->RequiresDSC[i][k] = true;
4154 if (mode_lib->vba.Output[k] == dm_dp) {
4155 locals->RequiresFEC[i][k] = true;
4157 locals->RequiresFEC[i][k] = false;
4159 mode_lib->vba.Outbpp = mode_lib->vba.OutbppDSC;
4161 locals->RequiresDSC[i][k] = false;
4162 locals->RequiresFEC[i][k] = false;
4164 locals->OutputBppPerState[i][k] = mode_lib->vba.Outbpp;
4166 if (mode_lib->vba.Outbpp == BPP_INVALID
4167 && mode_lib->vba.PHYCLKPerState[i]
4169 mode_lib->vba.Outbpp = TruncToValidBPP(
4170 (1.0 - mode_lib->vba.Downspreading / 100.0) * 810.0
4171 * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
4173 mode_lib->vba.Output[k],
4174 mode_lib->vba.OutputFormat[k],
4175 mode_lib->vba.DSCInputBitPerComponent[k]);
4176 mode_lib->vba.OutbppDSC = TruncToValidBPP(
4177 (1.0 - mode_lib->vba.Downspreading / 100.0) * (1.0 - mode_lib->vba.EffectiveFECOverhead / 100.0) * 810.0
4178 * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
4180 mode_lib->vba.Output[k],
4181 mode_lib->vba.OutputFormat[k],
4182 mode_lib->vba.DSCInputBitPerComponent[k]);
4183 if (mode_lib->vba.DSCEnabled[k] == true || mode_lib->vba.Outbpp == BPP_INVALID) {
4184 locals->RequiresDSC[i][k] = true;
4185 if (mode_lib->vba.Output[k] == dm_dp) {
4186 locals->RequiresFEC[i][k] = true;
4188 locals->RequiresFEC[i][k] = false;
4190 mode_lib->vba.Outbpp = mode_lib->vba.OutbppDSC;
4192 locals->RequiresDSC[i][k] = false;
4193 locals->RequiresFEC[i][k] = false;
4195 locals->OutputBppPerState[i][k] =
4196 mode_lib->vba.Outbpp;
4200 locals->OutputBppPerState[i][k] = BPP_BLENDED_PIPE;
4204 for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
4205 locals->DIOSupport[i] = true;
4206 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4207 if (locals->OutputBppPerState[i][k] == BPP_INVALID
4208 || (mode_lib->vba.OutputFormat[k] == dm_420
4209 && mode_lib->vba.Interlace[k] == true
4210 && mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true)) {
4211 locals->DIOSupport[i] = false;
4215 for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
4216 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4217 locals->DSCCLKRequiredMoreThanSupported[i] = false;
4218 if (mode_lib->vba.BlendingAndTiming[k] == k) {
4219 if ((mode_lib->vba.Output[k] == dm_dp
4220 || mode_lib->vba.Output[k] == dm_edp)) {
4221 if (mode_lib->vba.OutputFormat[k] == dm_420
4222 || mode_lib->vba.OutputFormat[k]
4224 mode_lib->vba.DSCFormatFactor = 2;
4226 mode_lib->vba.DSCFormatFactor = 1;
4228 if (locals->RequiresDSC[i][k] == true) {
4229 if (locals->ODMCombineEnablePerState[i][k]
4231 if (mode_lib->vba.PixelClockBackEnd[k] / 6.0 / mode_lib->vba.DSCFormatFactor
4232 > (1.0 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) * mode_lib->vba.MaxDSCCLK[i]) {
4233 locals->DSCCLKRequiredMoreThanSupported[i] =
4237 if (mode_lib->vba.PixelClockBackEnd[k] / 3.0 / mode_lib->vba.DSCFormatFactor
4238 > (1.0 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) * mode_lib->vba.MaxDSCCLK[i]) {
4239 locals->DSCCLKRequiredMoreThanSupported[i] =
4248 for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
4249 locals->NotEnoughDSCUnits[i] = false;
4250 mode_lib->vba.TotalDSCUnitsRequired = 0.0;
4251 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4252 if (locals->RequiresDSC[i][k] == true) {
4253 if (locals->ODMCombineEnablePerState[i][k] == true) {
4254 mode_lib->vba.TotalDSCUnitsRequired =
4255 mode_lib->vba.TotalDSCUnitsRequired + 2.0;
4257 mode_lib->vba.TotalDSCUnitsRequired =
4258 mode_lib->vba.TotalDSCUnitsRequired + 1.0;
4262 if (mode_lib->vba.TotalDSCUnitsRequired > mode_lib->vba.NumberOfDSC) {
4263 locals->NotEnoughDSCUnits[i] = true;
4266 /*DSC Delay per state*/
4268 for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
4269 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4270 if (mode_lib->vba.BlendingAndTiming[k] != k) {
4271 mode_lib->vba.slices = 0;
4272 } else if (locals->RequiresDSC[i][k] == 0
4273 || locals->RequiresDSC[i][k] == false) {
4274 mode_lib->vba.slices = 0;
4275 } else if (mode_lib->vba.PixelClockBackEnd[k] > 3200.0) {
4276 mode_lib->vba.slices = dml_ceil(
4277 mode_lib->vba.PixelClockBackEnd[k] / 400.0,
4279 } else if (mode_lib->vba.PixelClockBackEnd[k] > 1360.0) {
4280 mode_lib->vba.slices = 8.0;
4281 } else if (mode_lib->vba.PixelClockBackEnd[k] > 680.0) {
4282 mode_lib->vba.slices = 4.0;
4283 } else if (mode_lib->vba.PixelClockBackEnd[k] > 340.0) {
4284 mode_lib->vba.slices = 2.0;
4286 mode_lib->vba.slices = 1.0;
4288 if (locals->OutputBppPerState[i][k] == BPP_BLENDED_PIPE
4289 || locals->OutputBppPerState[i][k] == BPP_INVALID) {
4290 mode_lib->vba.bpp = 0.0;
4292 mode_lib->vba.bpp = locals->OutputBppPerState[i][k];
4294 if (locals->RequiresDSC[i][k] == true && mode_lib->vba.bpp != 0.0) {
4295 if (locals->ODMCombineEnablePerState[i][k] == false) {
4296 locals->DSCDelayPerState[i][k] =
4298 mode_lib->vba.DSCInputBitPerComponent[k],
4301 mode_lib->vba.HActive[k]
4302 / mode_lib->vba.slices,
4304 mode_lib->vba.slices,
4305 mode_lib->vba.OutputFormat[k])
4307 mode_lib->vba.OutputFormat[k]);
4309 locals->DSCDelayPerState[i][k] =
4310 2.0 * (dscceComputeDelay(
4311 mode_lib->vba.DSCInputBitPerComponent[k],
4313 dml_ceil(mode_lib->vba.HActive[k] / mode_lib->vba.slices, 1.0),
4314 mode_lib->vba.slices / 2,
4315 mode_lib->vba.OutputFormat[k])
4316 + dscComputeDelay(mode_lib->vba.OutputFormat[k]));
4318 locals->DSCDelayPerState[i][k] =
4319 locals->DSCDelayPerState[i][k] * mode_lib->vba.PixelClock[k] / mode_lib->vba.PixelClockBackEnd[k];
4321 locals->DSCDelayPerState[i][k] = 0.0;
4324 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4325 for (m = 0; m <= mode_lib->vba.NumberOfActivePlanes - 1; m++) {
4326 for (j = 0; j <= mode_lib->vba.NumberOfActivePlanes - 1; j++) {
4327 if (mode_lib->vba.BlendingAndTiming[k] == m && locals->RequiresDSC[i][m] == true)
4328 locals->DSCDelayPerState[i][k] = locals->DSCDelayPerState[i][m];
4335 for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
4336 for (j = 0; j < 2; j++) {
4337 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4338 if (locals->ODMCombineEnablePerState[i][k] == true)
4339 locals->SwathWidthYPerState[i][j][k] = dml_min(locals->SwathWidthYSingleDPP[k], dml_round(locals->HActive[k] / 2 * locals->HRatio[k]));
4341 locals->SwathWidthYPerState[i][j][k] = locals->SwathWidthYSingleDPP[k] / locals->NoOfDPP[i][j][k];
4342 locals->SwathWidthGranularityY = 256 / dml_ceil(locals->BytePerPixelInDETY[k], 1) / locals->MaxSwathHeightY[k];
4343 locals->RoundedUpMaxSwathSizeBytesY = (dml_ceil(locals->SwathWidthYPerState[i][j][k] - 1, locals->SwathWidthGranularityY)
4344 + locals->SwathWidthGranularityY) * locals->BytePerPixelInDETY[k] * locals->MaxSwathHeightY[k];
4345 if (locals->SourcePixelFormat[k] == dm_420_10) {
4346 locals->RoundedUpMaxSwathSizeBytesY = dml_ceil(locals->RoundedUpMaxSwathSizeBytesY, 256) + 256;
4348 if (locals->MaxSwathHeightC[k] > 0) {
4349 locals->SwathWidthGranularityC = 256 / dml_ceil(locals->BytePerPixelInDETC[k], 2) / locals->MaxSwathHeightC[k];
4351 locals->RoundedUpMaxSwathSizeBytesC = (dml_ceil(locals->SwathWidthYPerState[i][j][k] / 2 - 1, locals->SwathWidthGranularityC)
4352 + locals->SwathWidthGranularityC) * locals->BytePerPixelInDETC[k] * locals->MaxSwathHeightC[k];
4354 if (locals->SourcePixelFormat[k] == dm_420_10) {
4355 locals->RoundedUpMaxSwathSizeBytesC = dml_ceil(locals->RoundedUpMaxSwathSizeBytesC, 256) + 256;
4357 locals->RoundedUpMaxSwathSizeBytesC = 0;
4360 if (locals->RoundedUpMaxSwathSizeBytesY + locals->RoundedUpMaxSwathSizeBytesC <= locals->DETBufferSizeInKByte * 1024 / 2) {
4361 locals->SwathHeightYPerState[i][j][k] = locals->MaxSwathHeightY[k];
4362 locals->SwathHeightCPerState[i][j][k] = locals->MaxSwathHeightC[k];
4364 locals->SwathHeightYPerState[i][j][k] = locals->MinSwathHeightY[k];
4365 locals->SwathHeightCPerState[i][j][k] = locals->MinSwathHeightC[k];
4368 if (locals->BytePerPixelInDETC[k] == 0) {
4369 locals->LinesInDETLuma = locals->DETBufferSizeInKByte * 1024 / locals->BytePerPixelInDETY[k] / locals->SwathWidthYPerState[i][j][k];
4370 locals->LinesInDETChroma = 0;
4371 } else if (locals->SwathHeightYPerState[i][j][k] <= locals->SwathHeightCPerState[i][j][k]) {
4372 locals->LinesInDETLuma = locals->DETBufferSizeInKByte * 1024 / 2 / locals->BytePerPixelInDETY[k] /
4373 locals->SwathWidthYPerState[i][j][k];
4374 locals->LinesInDETChroma = locals->DETBufferSizeInKByte * 1024 / 2 / locals->BytePerPixelInDETC[k] / (locals->SwathWidthYPerState[i][j][k] / 2);
4376 locals->LinesInDETLuma = locals->DETBufferSizeInKByte * 1024 * 2 / 3 / locals->BytePerPixelInDETY[k] / locals->SwathWidthYPerState[i][j][k];
4377 locals->LinesInDETChroma = locals->DETBufferSizeInKByte * 1024 / 3 / locals->BytePerPixelInDETY[k] / (locals->SwathWidthYPerState[i][j][k] / 2);
4380 locals->EffectiveLBLatencyHidingSourceLinesLuma = dml_min(locals->MaxLineBufferLines,
4381 dml_floor(locals->LineBufferSize / locals->LBBitPerPixel[k] / (locals->SwathWidthYPerState[i][j][k]
4382 / dml_max(locals->HRatio[k], 1)), 1)) - (locals->vtaps[k] - 1);
4384 locals->EffectiveLBLatencyHidingSourceLinesChroma = dml_min(locals->MaxLineBufferLines,
4385 dml_floor(locals->LineBufferSize / locals->LBBitPerPixel[k]
4386 / (locals->SwathWidthYPerState[i][j][k] / 2
4387 / dml_max(locals->HRatio[k] / 2, 1)), 1)) - (locals->VTAPsChroma[k] - 1);
4389 locals->EffectiveDETLBLinesLuma = dml_floor(locals->LinesInDETLuma + dml_min(
4390 locals->LinesInDETLuma * locals->RequiredDISPCLK[i][j] * locals->BytePerPixelInDETY[k] *
4391 locals->PSCL_FACTOR[k] / locals->ReturnBWPerState[i],
4392 locals->EffectiveLBLatencyHidingSourceLinesLuma),
4393 locals->SwathHeightYPerState[i][j][k]);
4395 locals->EffectiveDETLBLinesChroma = dml_floor(locals->LinesInDETChroma + dml_min(
4396 locals->LinesInDETChroma * locals->RequiredDISPCLK[i][j] * locals->BytePerPixelInDETC[k] *
4397 locals->PSCL_FACTOR_CHROMA[k] / locals->ReturnBWPerState[i],
4398 locals->EffectiveLBLatencyHidingSourceLinesChroma),
4399 locals->SwathHeightCPerState[i][j][k]);
4401 if (locals->BytePerPixelInDETC[k] == 0) {
4402 locals->UrgentLatencySupportUsPerState[i][j][k] = locals->EffectiveDETLBLinesLuma * (locals->HTotal[k] / locals->PixelClock[k])
4403 / locals->VRatio[k] - locals->EffectiveDETLBLinesLuma * locals->SwathWidthYPerState[i][j][k] *
4404 dml_ceil(locals->BytePerPixelInDETY[k], 1) / (locals->ReturnBWPerState[i] / locals->NoOfDPP[i][j][k]);
4406 locals->UrgentLatencySupportUsPerState[i][j][k] = dml_min(
4407 locals->EffectiveDETLBLinesLuma * (locals->HTotal[k] / locals->PixelClock[k])
4408 / locals->VRatio[k] - locals->EffectiveDETLBLinesLuma * locals->SwathWidthYPerState[i][j][k] *
4409 dml_ceil(locals->BytePerPixelInDETY[k], 1) / (locals->ReturnBWPerState[i] / locals->NoOfDPP[i][j][k]),
4410 locals->EffectiveDETLBLinesChroma * (locals->HTotal[k] / locals->PixelClock[k]) / (locals->VRatio[k] / 2) -
4411 locals->EffectiveDETLBLinesChroma * locals->SwathWidthYPerState[i][j][k] / 2 *
4412 dml_ceil(locals->BytePerPixelInDETC[k], 2) / (locals->ReturnBWPerState[i] / locals->NoOfDPP[i][j][k]));
4418 for (i = 0; i <= locals->soc.num_states; i++) {
4419 for (j = 0; j < 2; j++) {
4420 locals->UrgentLatencySupport[i][j] = true;
4421 for (k = 0; k < locals->NumberOfActivePlanes; k++) {
4422 if (locals->UrgentLatencySupportUsPerState[i][j][k] < locals->UrgentLatency)
4423 locals->UrgentLatencySupport[i][j] = false;
4430 for (i = 0; i <= locals->soc.num_states; i++) {
4431 for (j = 0; j < 2; j++) {
4432 locals->TotalNumberOfDCCActiveDPP[i][j] = 0;
4433 for (k = 0; k < locals->NumberOfActivePlanes; k++) {
4434 if (locals->DCCEnable[k] == true) {
4435 locals->TotalNumberOfDCCActiveDPP[i][j] =
4436 locals->TotalNumberOfDCCActiveDPP[i][j] + locals->NoOfDPP[i][j][k];
4442 CalculateMinAndMaxPrefetchMode(locals->AllowDRAMSelfRefreshOrDRAMClockChangeInVblank, &locals->MinPrefetchMode, &locals->MaxPrefetchMode);
4444 locals->MaxTotalVActiveRDBandwidth = 0;
4445 for (k = 0; k < locals->NumberOfActivePlanes; k++) {
4446 locals->MaxTotalVActiveRDBandwidth = locals->MaxTotalVActiveRDBandwidth + locals->ReadBandwidth[k];
4449 for (i = 0; i <= locals->soc.num_states; i++) {
4450 for (j = 0; j < 2; j++) {
4451 for (k = 0; k < locals->NumberOfActivePlanes; k++) {
4452 locals->NoOfDPPThisState[k] = locals->NoOfDPP[i][j][k];
4453 locals->RequiredDPPCLKThisState[k] = locals->RequiredDPPCLK[i][j][k];
4454 locals->SwathHeightYThisState[k] = locals->SwathHeightYPerState[i][j][k];
4455 locals->SwathHeightCThisState[k] = locals->SwathHeightCPerState[i][j][k];
4456 locals->SwathWidthYThisState[k] = locals->SwathWidthYPerState[i][j][k];
4457 mode_lib->vba.ProjectedDCFCLKDeepSleep = dml_max(
4458 mode_lib->vba.ProjectedDCFCLKDeepSleep,
4459 mode_lib->vba.PixelClock[k] / 16.0);
4460 if (mode_lib->vba.BytePerPixelInDETC[k] == 0.0) {
4461 if (mode_lib->vba.VRatio[k] <= 1.0) {
4462 mode_lib->vba.ProjectedDCFCLKDeepSleep =
4464 mode_lib->vba.ProjectedDCFCLKDeepSleep,
4467 mode_lib->vba.BytePerPixelInDETY[k],
4470 * mode_lib->vba.HRatio[k]
4471 * mode_lib->vba.PixelClock[k]
4472 / mode_lib->vba.NoOfDPP[i][j][k]);
4474 mode_lib->vba.ProjectedDCFCLKDeepSleep =
4476 mode_lib->vba.ProjectedDCFCLKDeepSleep,
4479 mode_lib->vba.BytePerPixelInDETY[k],
4482 * mode_lib->vba.PSCL_FACTOR[k]
4483 * mode_lib->vba.RequiredDPPCLK[i][j][k]);
4486 if (mode_lib->vba.VRatio[k] <= 1.0) {
4487 mode_lib->vba.ProjectedDCFCLKDeepSleep =
4489 mode_lib->vba.ProjectedDCFCLKDeepSleep,
4492 mode_lib->vba.BytePerPixelInDETY[k],
4495 * mode_lib->vba.HRatio[k]
4496 * mode_lib->vba.PixelClock[k]
4497 / mode_lib->vba.NoOfDPP[i][j][k]);
4499 mode_lib->vba.ProjectedDCFCLKDeepSleep =
4501 mode_lib->vba.ProjectedDCFCLKDeepSleep,
4504 mode_lib->vba.BytePerPixelInDETY[k],
4507 * mode_lib->vba.PSCL_FACTOR[k]
4508 * mode_lib->vba.RequiredDPPCLK[i][j][k]);
4510 if (mode_lib->vba.VRatio[k] / 2.0 <= 1.0) {
4511 mode_lib->vba.ProjectedDCFCLKDeepSleep =
4513 mode_lib->vba.ProjectedDCFCLKDeepSleep,
4516 mode_lib->vba.BytePerPixelInDETC[k],
4519 * mode_lib->vba.HRatio[k]
4521 * mode_lib->vba.PixelClock[k]
4522 / mode_lib->vba.NoOfDPP[i][j][k]);
4524 mode_lib->vba.ProjectedDCFCLKDeepSleep =
4526 mode_lib->vba.ProjectedDCFCLKDeepSleep,
4529 mode_lib->vba.BytePerPixelInDETC[k],
4532 * mode_lib->vba.PSCL_FACTOR_CHROMA[k]
4533 * mode_lib->vba.RequiredDPPCLK[i][j][k]);
4537 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4538 mode_lib->vba.PDEAndMetaPTEBytesPerFrameY = CalculateVMAndRowBytes(
4540 mode_lib->vba.DCCEnable[k],
4541 mode_lib->vba.Read256BlockHeightY[k],
4542 mode_lib->vba.Read256BlockWidthY[k],
4543 mode_lib->vba.SourcePixelFormat[k],
4544 mode_lib->vba.SurfaceTiling[k],
4545 dml_ceil(mode_lib->vba.BytePerPixelInDETY[k], 1.0),
4546 mode_lib->vba.SourceScan[k],
4547 mode_lib->vba.ViewportWidth[k],
4548 mode_lib->vba.ViewportHeight[k],
4549 mode_lib->vba.SwathWidthYPerState[i][j][k],
4550 mode_lib->vba.GPUVMEnable,
4551 mode_lib->vba.VMMPageSize,
4552 mode_lib->vba.PTEBufferSizeInRequestsLuma,
4553 mode_lib->vba.PDEProcessingBufIn64KBReqs,
4554 mode_lib->vba.PitchY[k],
4555 mode_lib->vba.DCCMetaPitchY[k],
4556 &mode_lib->vba.MacroTileWidthY[k],
4557 &mode_lib->vba.MetaRowBytesY,
4558 &mode_lib->vba.DPTEBytesPerRowY,
4559 &mode_lib->vba.PTEBufferSizeNotExceededY[i][j][k],
4560 &mode_lib->vba.dpte_row_height[k],
4561 &mode_lib->vba.meta_row_height[k]);
4562 mode_lib->vba.PrefetchLinesY[k] = CalculatePrefetchSourceLines(
4564 mode_lib->vba.VRatio[k],
4565 mode_lib->vba.vtaps[k],
4566 mode_lib->vba.Interlace[k],
4567 mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
4568 mode_lib->vba.SwathHeightYPerState[i][j][k],
4569 mode_lib->vba.ViewportYStartY[k],
4570 &mode_lib->vba.PrefillY[k],
4571 &mode_lib->vba.MaxNumSwY[k]);
4572 if ((mode_lib->vba.SourcePixelFormat[k] != dm_444_64
4573 && mode_lib->vba.SourcePixelFormat[k] != dm_444_32
4574 && mode_lib->vba.SourcePixelFormat[k] != dm_444_16
4575 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_16
4576 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_8)) {
4577 mode_lib->vba.PDEAndMetaPTEBytesPerFrameC = CalculateVMAndRowBytes(
4579 mode_lib->vba.DCCEnable[k],
4580 mode_lib->vba.Read256BlockHeightY[k],
4581 mode_lib->vba.Read256BlockWidthY[k],
4582 mode_lib->vba.SourcePixelFormat[k],
4583 mode_lib->vba.SurfaceTiling[k],
4584 dml_ceil(mode_lib->vba.BytePerPixelInDETC[k], 2.0),
4585 mode_lib->vba.SourceScan[k],
4586 mode_lib->vba.ViewportWidth[k] / 2.0,
4587 mode_lib->vba.ViewportHeight[k] / 2.0,
4588 mode_lib->vba.SwathWidthYPerState[i][j][k] / 2.0,
4589 mode_lib->vba.GPUVMEnable,
4590 mode_lib->vba.VMMPageSize,
4591 mode_lib->vba.PTEBufferSizeInRequestsLuma,
4592 mode_lib->vba.PDEProcessingBufIn64KBReqs,
4593 mode_lib->vba.PitchC[k],
4595 &mode_lib->vba.MacroTileWidthC[k],
4596 &mode_lib->vba.MetaRowBytesC,
4597 &mode_lib->vba.DPTEBytesPerRowC,
4598 &mode_lib->vba.PTEBufferSizeNotExceededC[i][j][k],
4599 &mode_lib->vba.dpte_row_height_chroma[k],
4600 &mode_lib->vba.meta_row_height_chroma[k]);
4601 mode_lib->vba.PrefetchLinesC[k] = CalculatePrefetchSourceLines(
4603 mode_lib->vba.VRatio[k] / 2.0,
4604 mode_lib->vba.VTAPsChroma[k],
4605 mode_lib->vba.Interlace[k],
4606 mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
4607 mode_lib->vba.SwathHeightCPerState[i][j][k],
4608 mode_lib->vba.ViewportYStartC[k],
4609 &mode_lib->vba.PrefillC[k],
4610 &mode_lib->vba.MaxNumSwC[k]);
4612 mode_lib->vba.PDEAndMetaPTEBytesPerFrameC = 0.0;
4613 mode_lib->vba.MetaRowBytesC = 0.0;
4614 mode_lib->vba.DPTEBytesPerRowC = 0.0;
4615 locals->PrefetchLinesC[k] = 0.0;
4616 locals->PTEBufferSizeNotExceededC[i][j][k] = true;
4617 locals->PTEBufferSizeInRequestsForLuma = mode_lib->vba.PTEBufferSizeInRequestsLuma + mode_lib->vba.PTEBufferSizeInRequestsChroma;
4619 locals->PDEAndMetaPTEBytesPerFrame[k] =
4620 mode_lib->vba.PDEAndMetaPTEBytesPerFrameY + mode_lib->vba.PDEAndMetaPTEBytesPerFrameC;
4621 locals->MetaRowBytes[k] = mode_lib->vba.MetaRowBytesY + mode_lib->vba.MetaRowBytesC;
4622 locals->DPTEBytesPerRow[k] = mode_lib->vba.DPTEBytesPerRowY + mode_lib->vba.DPTEBytesPerRowC;
4624 CalculateActiveRowBandwidth(
4625 mode_lib->vba.GPUVMEnable,
4626 mode_lib->vba.SourcePixelFormat[k],
4627 mode_lib->vba.VRatio[k],
4628 mode_lib->vba.DCCEnable[k],
4629 mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
4630 mode_lib->vba.MetaRowBytesY,
4631 mode_lib->vba.MetaRowBytesC,
4632 mode_lib->vba.meta_row_height[k],
4633 mode_lib->vba.meta_row_height_chroma[k],
4634 mode_lib->vba.DPTEBytesPerRowY,
4635 mode_lib->vba.DPTEBytesPerRowC,
4636 mode_lib->vba.dpte_row_height[k],
4637 mode_lib->vba.dpte_row_height_chroma[k],
4638 &mode_lib->vba.meta_row_bw[k],
4639 &mode_lib->vba.dpte_row_bw[k],
4640 &mode_lib->vba.qual_row_bw[k]);
4642 mode_lib->vba.ExtraLatency =
4643 mode_lib->vba.UrgentRoundTripAndOutOfOrderLatencyPerState[i]
4644 + (mode_lib->vba.TotalNumberOfActiveDPP[i][j]
4645 * mode_lib->vba.PixelChunkSizeInKByte
4646 + mode_lib->vba.TotalNumberOfDCCActiveDPP[i][j]
4647 * mode_lib->vba.MetaChunkSize)
4649 / mode_lib->vba.ReturnBWPerState[i];
4650 if (mode_lib->vba.GPUVMEnable == true) {
4651 mode_lib->vba.ExtraLatency = mode_lib->vba.ExtraLatency
4652 + mode_lib->vba.TotalNumberOfActiveDPP[i][j]
4653 * mode_lib->vba.PTEGroupSize
4654 / mode_lib->vba.ReturnBWPerState[i];
4656 mode_lib->vba.TimeCalc = 24.0 / mode_lib->vba.ProjectedDCFCLKDeepSleep;
4658 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4659 if (mode_lib->vba.BlendingAndTiming[k] == k) {
4660 if (mode_lib->vba.WritebackEnable[k] == true) {
4661 locals->WritebackDelay[i][k] = mode_lib->vba.WritebackLatency
4662 + CalculateWriteBackDelay(
4663 mode_lib->vba.WritebackPixelFormat[k],
4664 mode_lib->vba.WritebackHRatio[k],
4665 mode_lib->vba.WritebackVRatio[k],
4666 mode_lib->vba.WritebackLumaHTaps[k],
4667 mode_lib->vba.WritebackLumaVTaps[k],
4668 mode_lib->vba.WritebackChromaHTaps[k],
4669 mode_lib->vba.WritebackChromaVTaps[k],
4670 mode_lib->vba.WritebackDestinationWidth[k]) / locals->RequiredDISPCLK[i][j];
4672 locals->WritebackDelay[i][k] = 0.0;
4674 for (m = 0; m <= mode_lib->vba.NumberOfActivePlanes - 1; m++) {
4675 if (mode_lib->vba.BlendingAndTiming[m] == k
4676 && mode_lib->vba.WritebackEnable[m]
4678 locals->WritebackDelay[i][k] = dml_max(locals->WritebackDelay[i][k],
4679 mode_lib->vba.WritebackLatency + CalculateWriteBackDelay(
4680 mode_lib->vba.WritebackPixelFormat[m],
4681 mode_lib->vba.WritebackHRatio[m],
4682 mode_lib->vba.WritebackVRatio[m],
4683 mode_lib->vba.WritebackLumaHTaps[m],
4684 mode_lib->vba.WritebackLumaVTaps[m],
4685 mode_lib->vba.WritebackChromaHTaps[m],
4686 mode_lib->vba.WritebackChromaVTaps[m],
4687 mode_lib->vba.WritebackDestinationWidth[m]) / locals->RequiredDISPCLK[i][j]);
4692 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4693 for (m = 0; m <= mode_lib->vba.NumberOfActivePlanes - 1; m++) {
4694 if (mode_lib->vba.BlendingAndTiming[k] == m) {
4695 locals->WritebackDelay[i][k] = locals->WritebackDelay[i][m];
4699 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4700 for (m = 0; m < locals->NumberOfCursors[k]; m++)
4701 locals->cursor_bw[k] = locals->NumberOfCursors[k] * locals->CursorWidth[k][m] * locals->CursorBPP[k][m]
4702 / 8 / (locals->HTotal[k] / locals->PixelClock[k]) * locals->VRatio[k];
4705 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4706 locals->MaximumVStartup[k] = mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]
4707 - dml_max(1.0, dml_ceil(locals->WritebackDelay[i][k] / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]), 1.0));
4710 mode_lib->vba.NextPrefetchMode = mode_lib->vba.MinPrefetchMode;
4712 mode_lib->vba.PrefetchMode[i][j] = mode_lib->vba.NextPrefetchMode;
4713 mode_lib->vba.NextPrefetchMode = mode_lib->vba.NextPrefetchMode + 1;
4715 mode_lib->vba.TWait = CalculateTWait(
4716 mode_lib->vba.PrefetchMode[i][j],
4717 mode_lib->vba.DRAMClockChangeLatency,
4718 mode_lib->vba.UrgentLatency,
4719 mode_lib->vba.SREnterPlusExitTime);
4720 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4722 if (mode_lib->vba.XFCEnabled[k] == true) {
4723 mode_lib->vba.XFCRemoteSurfaceFlipDelay =
4724 CalculateRemoteSurfaceFlipDelay(
4726 mode_lib->vba.VRatio[k],
4727 locals->SwathWidthYPerState[i][j][k],
4728 dml_ceil(locals->BytePerPixelInDETY[k], 1.0),
4729 mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
4730 mode_lib->vba.XFCTSlvVupdateOffset,
4731 mode_lib->vba.XFCTSlvVupdateWidth,
4732 mode_lib->vba.XFCTSlvVreadyOffset,
4733 mode_lib->vba.XFCXBUFLatencyTolerance,
4734 mode_lib->vba.XFCFillBWOverhead,
4735 mode_lib->vba.XFCSlvChunkSize,
4736 mode_lib->vba.XFCBusTransportTime,
4737 mode_lib->vba.TimeCalc,
4738 mode_lib->vba.TWait,
4739 &mode_lib->vba.SrcActiveDrainRate,
4740 &mode_lib->vba.TInitXFill,
4741 &mode_lib->vba.TslvChk);
4743 mode_lib->vba.XFCRemoteSurfaceFlipDelay = 0.0;
4746 CalculateDelayAfterScaler(mode_lib, mode_lib->vba.ReturnBWPerState[i], mode_lib->vba.ReadBandwidthLuma[k], mode_lib->vba.ReadBandwidthChroma[k], mode_lib->vba.MaxTotalVActiveRDBandwidth,
4747 mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k], mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k],
4748 mode_lib->vba.RequiredDPPCLK[i][j][k], mode_lib->vba.RequiredDISPCLK[i][j], mode_lib->vba.PixelClock[k], mode_lib->vba.DSCDelayPerState[i][k], mode_lib->vba.NoOfDPP[i][j][k], mode_lib->vba.ScalerEnabled[k], mode_lib->vba.NumberOfCursors[k],
4749 mode_lib->vba.DPPCLKDelaySubtotal, mode_lib->vba.DPPCLKDelaySCL, mode_lib->vba.DPPCLKDelaySCLLBOnly, mode_lib->vba.DPPCLKDelayCNVCFormater, mode_lib->vba.DPPCLKDelayCNVCCursor, mode_lib->vba.DISPCLKDelaySubtotal,
4750 mode_lib->vba.SwathWidthYPerState[i][j][k] / mode_lib->vba.HRatio[k], mode_lib->vba.OutputFormat[k], mode_lib->vba.HTotal[k],
4751 mode_lib->vba.SwathWidthYSingleDPP[k], mode_lib->vba.BytePerPixelInDETY[k], mode_lib->vba.BytePerPixelInDETC[k], mode_lib->vba.SwathHeightYThisState[k], mode_lib->vba.SwathHeightCThisState[k], mode_lib->vba.Interlace[k], mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
4752 &mode_lib->vba.DSTXAfterScaler[k], &mode_lib->vba.DSTYAfterScaler[k]);
4754 mode_lib->vba.IsErrorResult[i][j][k] =
4755 CalculatePrefetchSchedule(
4757 mode_lib->vba.RequiredDPPCLK[i][j][k],
4758 mode_lib->vba.RequiredDISPCLK[i][j],
4759 mode_lib->vba.PixelClock[k],
4760 mode_lib->vba.ProjectedDCFCLKDeepSleep,
4761 mode_lib->vba.NoOfDPP[i][j][k],
4762 mode_lib->vba.NumberOfCursors[k],
4763 mode_lib->vba.VTotal[k]
4764 - mode_lib->vba.VActive[k],
4765 mode_lib->vba.HTotal[k],
4766 mode_lib->vba.MaxInterDCNTileRepeaters,
4767 mode_lib->vba.MaximumVStartup[k],
4768 mode_lib->vba.GPUVMMaxPageTableLevels,
4769 mode_lib->vba.GPUVMEnable,
4770 mode_lib->vba.DynamicMetadataEnable[k],
4771 mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired[k],
4772 mode_lib->vba.DynamicMetadataTransmittedBytes[k],
4773 mode_lib->vba.DCCEnable[k],
4774 mode_lib->vba.UrgentLatencyPixelDataOnly,
4775 mode_lib->vba.ExtraLatency,
4776 mode_lib->vba.TimeCalc,
4777 mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k],
4778 mode_lib->vba.MetaRowBytes[k],
4779 mode_lib->vba.DPTEBytesPerRow[k],
4780 mode_lib->vba.PrefetchLinesY[k],
4781 mode_lib->vba.SwathWidthYPerState[i][j][k],
4782 mode_lib->vba.BytePerPixelInDETY[k],
4783 mode_lib->vba.PrefillY[k],
4784 mode_lib->vba.MaxNumSwY[k],
4785 mode_lib->vba.PrefetchLinesC[k],
4786 mode_lib->vba.BytePerPixelInDETC[k],
4787 mode_lib->vba.PrefillC[k],
4788 mode_lib->vba.MaxNumSwC[k],
4789 mode_lib->vba.SwathHeightYPerState[i][j][k],
4790 mode_lib->vba.SwathHeightCPerState[i][j][k],
4791 mode_lib->vba.TWait,
4792 mode_lib->vba.XFCEnabled[k],
4793 mode_lib->vba.XFCRemoteSurfaceFlipDelay,
4794 mode_lib->vba.Interlace[k],
4795 mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
4796 mode_lib->vba.DSTXAfterScaler[k],
4797 mode_lib->vba.DSTYAfterScaler[k],
4798 &mode_lib->vba.LineTimesForPrefetch[k],
4799 &mode_lib->vba.PrefetchBW[k],
4800 &mode_lib->vba.LinesForMetaPTE[k],
4801 &mode_lib->vba.LinesForMetaAndDPTERow[k],
4802 &mode_lib->vba.VRatioPreY[i][j][k],
4803 &mode_lib->vba.VRatioPreC[i][j][k],
4804 &mode_lib->vba.RequiredPrefetchPixelDataBWLuma[i][j][k],
4805 &mode_lib->vba.Tno_bw[k],
4806 &mode_lib->vba.VUpdateOffsetPix[k],
4807 &mode_lib->vba.VUpdateWidthPix[k],
4808 &mode_lib->vba.VReadyOffsetPix[k]);
4810 mode_lib->vba.MaximumReadBandwidthWithoutPrefetch = 0.0;
4811 mode_lib->vba.MaximumReadBandwidthWithPrefetch = 0.0;
4812 locals->prefetch_vm_bw_valid = true;
4813 locals->prefetch_row_bw_valid = true;
4814 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4815 if (locals->PDEAndMetaPTEBytesPerFrame[k] == 0)
4816 locals->prefetch_vm_bw[k] = 0;
4817 else if (locals->LinesForMetaPTE[k] > 0)
4818 locals->prefetch_vm_bw[k] = locals->PDEAndMetaPTEBytesPerFrame[k]
4819 / (locals->LinesForMetaPTE[k] * locals->HTotal[k] / locals->PixelClock[k]);
4821 locals->prefetch_vm_bw[k] = 0;
4822 locals->prefetch_vm_bw_valid = false;
4824 if (locals->MetaRowBytes[k] + locals->DPTEBytesPerRow[k] == 0)
4825 locals->prefetch_row_bw[k] = 0;
4826 else if (locals->LinesForMetaAndDPTERow[k] > 0)
4827 locals->prefetch_row_bw[k] = (locals->MetaRowBytes[k] + locals->DPTEBytesPerRow[k])
4828 / (locals->LinesForMetaAndDPTERow[k] * locals->HTotal[k] / locals->PixelClock[k]);
4830 locals->prefetch_row_bw[k] = 0;
4831 locals->prefetch_row_bw_valid = false;
4834 mode_lib->vba.MaximumReadBandwidthWithoutPrefetch = mode_lib->vba.MaximumReadBandwidthWithPrefetch
4835 + mode_lib->vba.cursor_bw[k] + mode_lib->vba.ReadBandwidth[k] + mode_lib->vba.meta_row_bw[k] + mode_lib->vba.dpte_row_bw[k];
4836 mode_lib->vba.MaximumReadBandwidthWithPrefetch =
4837 mode_lib->vba.MaximumReadBandwidthWithPrefetch
4838 + mode_lib->vba.cursor_bw[k]
4840 mode_lib->vba.prefetch_vm_bw[k],
4841 mode_lib->vba.prefetch_row_bw[k],
4842 dml_max(mode_lib->vba.ReadBandwidth[k],
4843 mode_lib->vba.RequiredPrefetchPixelDataBWLuma[i][j][k])
4844 + mode_lib->vba.meta_row_bw[k] + mode_lib->vba.dpte_row_bw[k]);
4846 locals->BandwidthWithoutPrefetchSupported[i] = true;
4847 if (mode_lib->vba.MaximumReadBandwidthWithoutPrefetch > locals->ReturnBWPerState[i]) {
4848 locals->BandwidthWithoutPrefetchSupported[i] = false;
4851 locals->PrefetchSupported[i][j] = true;
4852 if (mode_lib->vba.MaximumReadBandwidthWithPrefetch > locals->ReturnBWPerState[i]) {
4853 locals->PrefetchSupported[i][j] = false;
4855 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4856 if (locals->LineTimesForPrefetch[k] < 2.0
4857 || locals->LinesForMetaPTE[k] >= 8.0
4858 || locals->LinesForMetaAndDPTERow[k] >= 16.0
4859 || mode_lib->vba.IsErrorResult[i][j][k] == true) {
4860 locals->PrefetchSupported[i][j] = false;
4863 locals->VRatioInPrefetchSupported[i][j] = true;
4864 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4865 if (locals->VRatioPreY[i][j][k] > 4.0
4866 || locals->VRatioPreC[i][j][k] > 4.0
4867 || mode_lib->vba.IsErrorResult[i][j][k] == true) {
4868 locals->VRatioInPrefetchSupported[i][j] = false;
4871 } while ((locals->PrefetchSupported[i][j] != true || locals->VRatioInPrefetchSupported[i][j] != true)
4872 && mode_lib->vba.NextPrefetchMode < mode_lib->vba.MaxPrefetchMode);
4874 if (mode_lib->vba.PrefetchSupported[i][j] == true
4875 && mode_lib->vba.VRatioInPrefetchSupported[i][j] == true) {
4876 mode_lib->vba.BandwidthAvailableForImmediateFlip =
4877 mode_lib->vba.ReturnBWPerState[i];
4878 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4879 mode_lib->vba.BandwidthAvailableForImmediateFlip =
4880 mode_lib->vba.BandwidthAvailableForImmediateFlip
4881 - mode_lib->vba.cursor_bw[k]
4883 mode_lib->vba.ReadBandwidth[k] + mode_lib->vba.qual_row_bw[k],
4884 mode_lib->vba.PrefetchBW[k]);
4886 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4887 mode_lib->vba.ImmediateFlipBytes[k] = 0.0;
4888 if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8
4889 && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) {
4890 mode_lib->vba.ImmediateFlipBytes[k] =
4891 mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k]
4892 + mode_lib->vba.MetaRowBytes[k]
4893 + mode_lib->vba.DPTEBytesPerRow[k];
4896 mode_lib->vba.TotImmediateFlipBytes = 0.0;
4897 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4898 if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8
4899 && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) {
4900 mode_lib->vba.TotImmediateFlipBytes =
4901 mode_lib->vba.TotImmediateFlipBytes
4902 + mode_lib->vba.ImmediateFlipBytes[k];
4906 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4907 CalculateFlipSchedule(
4909 mode_lib->vba.ExtraLatency,
4910 mode_lib->vba.UrgentLatencyPixelDataOnly,
4911 mode_lib->vba.GPUVMMaxPageTableLevels,
4912 mode_lib->vba.GPUVMEnable,
4913 mode_lib->vba.BandwidthAvailableForImmediateFlip,
4914 mode_lib->vba.TotImmediateFlipBytes,
4915 mode_lib->vba.SourcePixelFormat[k],
4916 mode_lib->vba.ImmediateFlipBytes[k],
4917 mode_lib->vba.HTotal[k]
4918 / mode_lib->vba.PixelClock[k],
4919 mode_lib->vba.VRatio[k],
4920 mode_lib->vba.Tno_bw[k],
4921 mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k],
4922 mode_lib->vba.MetaRowBytes[k],
4923 mode_lib->vba.DPTEBytesPerRow[k],
4924 mode_lib->vba.DCCEnable[k],
4925 mode_lib->vba.dpte_row_height[k],
4926 mode_lib->vba.meta_row_height[k],
4927 mode_lib->vba.qual_row_bw[k],
4928 &mode_lib->vba.DestinationLinesToRequestVMInImmediateFlip[k],
4929 &mode_lib->vba.DestinationLinesToRequestRowInImmediateFlip[k],
4930 &mode_lib->vba.final_flip_bw[k],
4931 &mode_lib->vba.ImmediateFlipSupportedForPipe[k]);
4933 mode_lib->vba.total_dcn_read_bw_with_flip = 0.0;
4934 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4935 mode_lib->vba.total_dcn_read_bw_with_flip =
4936 mode_lib->vba.total_dcn_read_bw_with_flip
4937 + mode_lib->vba.cursor_bw[k]
4939 mode_lib->vba.prefetch_vm_bw[k],
4940 mode_lib->vba.prefetch_row_bw[k],
4941 mode_lib->vba.final_flip_bw[k]
4943 mode_lib->vba.ReadBandwidth[k],
4944 mode_lib->vba.RequiredPrefetchPixelDataBWLuma[i][j][k]));
4946 mode_lib->vba.ImmediateFlipSupportedForState[i][j] = true;
4947 if (mode_lib->vba.total_dcn_read_bw_with_flip
4948 > mode_lib->vba.ReturnBWPerState[i]) {
4949 mode_lib->vba.ImmediateFlipSupportedForState[i][j] = false;
4951 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4952 if (mode_lib->vba.ImmediateFlipSupportedForPipe[k] == false) {
4953 mode_lib->vba.ImmediateFlipSupportedForState[i][j] = false;
4957 mode_lib->vba.ImmediateFlipSupportedForState[i][j] = false;
4962 /*Vertical Active BW support*/
4963 for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
4964 mode_lib->vba.MaxTotalVerticalActiveAvailableBandwidth[i] = dml_min(mode_lib->vba.ReturnBusWidth *
4965 mode_lib->vba.DCFCLKPerState[i], mode_lib->vba.FabricAndDRAMBandwidthPerState[i] * 1000) *
4966 mode_lib->vba.MaxAveragePercentOfIdealDRAMBWDisplayCanUseInNormalSystemOperation / 100;
4967 if (mode_lib->vba.MaxTotalVActiveRDBandwidth <= mode_lib->vba.MaxTotalVerticalActiveAvailableBandwidth[i])
4968 mode_lib->vba.TotalVerticalActiveBandwidthSupport[i] = true;
4970 mode_lib->vba.TotalVerticalActiveBandwidthSupport[i] = false;
4973 /*PTE Buffer Size Check*/
4975 for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
4976 for (j = 0; j < 2; j++) {
4977 locals->PTEBufferSizeNotExceeded[i][j] = true;
4978 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4979 if (locals->PTEBufferSizeNotExceededY[i][j][k] == false
4980 || locals->PTEBufferSizeNotExceededC[i][j][k] == false) {
4981 locals->PTEBufferSizeNotExceeded[i][j] = false;
4986 /*Cursor Support Check*/
4987 mode_lib->vba.CursorSupport = true;
4988 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
4989 for (j = 0; j < 2; j++) {
4990 if (mode_lib->vba.CursorWidth[k][j] > 0.0) {
4993 mode_lib->vba.CursorBufferSize
4994 - mode_lib->vba.CursorChunkSize,
4995 mode_lib->vba.CursorChunkSize) * 1024.0
4996 / (mode_lib->vba.CursorWidth[k][j]
4997 * mode_lib->vba.CursorBPP[k][j]
5000 * (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
5001 / mode_lib->vba.VRatio[k] < mode_lib->vba.UrgentLatencyPixelDataOnly
5002 || (mode_lib->vba.CursorBPP[k][j] == 64.0
5003 && mode_lib->vba.Cursor64BppSupport == false)) {
5004 mode_lib->vba.CursorSupport = false;
5009 /*Valid Pitch Check*/
5011 mode_lib->vba.PitchSupport = true;
5012 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
5013 locals->AlignedYPitch[k] = dml_ceil(
5014 dml_max(mode_lib->vba.PitchY[k], mode_lib->vba.ViewportWidth[k]),
5015 locals->MacroTileWidthY[k]);
5016 if (locals->AlignedYPitch[k] > mode_lib->vba.PitchY[k]) {
5017 mode_lib->vba.PitchSupport = false;
5019 if (mode_lib->vba.DCCEnable[k] == true) {
5020 locals->AlignedDCCMetaPitch[k] = dml_ceil(
5022 mode_lib->vba.DCCMetaPitchY[k],
5023 mode_lib->vba.ViewportWidth[k]),
5024 64.0 * locals->Read256BlockWidthY[k]);
5026 locals->AlignedDCCMetaPitch[k] = mode_lib->vba.DCCMetaPitchY[k];
5028 if (locals->AlignedDCCMetaPitch[k] > mode_lib->vba.DCCMetaPitchY[k]) {
5029 mode_lib->vba.PitchSupport = false;
5031 if (mode_lib->vba.SourcePixelFormat[k] != dm_444_64
5032 && mode_lib->vba.SourcePixelFormat[k] != dm_444_32
5033 && mode_lib->vba.SourcePixelFormat[k] != dm_444_16
5034 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_16
5035 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_8) {
5036 locals->AlignedCPitch[k] = dml_ceil(
5038 mode_lib->vba.PitchC[k],
5039 mode_lib->vba.ViewportWidth[k] / 2.0),
5040 locals->MacroTileWidthC[k]);
5042 locals->AlignedCPitch[k] = mode_lib->vba.PitchC[k];
5044 if (locals->AlignedCPitch[k] > mode_lib->vba.PitchC[k]) {
5045 mode_lib->vba.PitchSupport = false;
5048 /*Mode Support, Voltage State and SOC Configuration*/
5050 for (i = mode_lib->vba.soc.num_states; i >= 0; i--) {
5051 for (j = 0; j < 2; j++) {
5052 enum dm_validation_status status = DML_VALIDATION_OK;
5054 if (mode_lib->vba.ScaleRatioAndTapsSupport != true) {
5055 status = DML_FAIL_SCALE_RATIO_TAP;
5056 } else if (mode_lib->vba.SourceFormatPixelAndScanSupport != true) {
5057 status = DML_FAIL_SOURCE_PIXEL_FORMAT;
5058 } else if (locals->ViewportSizeSupport[i] != true) {
5059 status = DML_FAIL_VIEWPORT_SIZE;
5060 } else if (locals->DIOSupport[i] != true) {
5061 status = DML_FAIL_DIO_SUPPORT;
5062 } else if (locals->NotEnoughDSCUnits[i] != false) {
5063 status = DML_FAIL_NOT_ENOUGH_DSC;
5064 } else if (locals->DSCCLKRequiredMoreThanSupported[i] != false) {
5065 status = DML_FAIL_DSC_CLK_REQUIRED;
5066 } else if (locals->UrgentLatencySupport[i][j] != true) {
5067 status = DML_FAIL_URGENT_LATENCY;
5068 } else if (locals->ROBSupport[i] != true) {
5069 status = DML_FAIL_REORDERING_BUFFER;
5070 } else if (locals->DISPCLK_DPPCLK_Support[i][j] != true) {
5071 status = DML_FAIL_DISPCLK_DPPCLK;
5072 } else if (locals->TotalAvailablePipesSupport[i][j] != true) {
5073 status = DML_FAIL_TOTAL_AVAILABLE_PIPES;
5074 } else if (mode_lib->vba.NumberOfOTGSupport != true) {
5075 status = DML_FAIL_NUM_OTG;
5076 } else if (mode_lib->vba.WritebackModeSupport != true) {
5077 status = DML_FAIL_WRITEBACK_MODE;
5078 } else if (mode_lib->vba.WritebackLatencySupport != true) {
5079 status = DML_FAIL_WRITEBACK_LATENCY;
5080 } else if (mode_lib->vba.WritebackScaleRatioAndTapsSupport != true) {
5081 status = DML_FAIL_WRITEBACK_SCALE_RATIO_TAP;
5082 } else if (mode_lib->vba.CursorSupport != true) {
5083 status = DML_FAIL_CURSOR_SUPPORT;
5084 } else if (mode_lib->vba.PitchSupport != true) {
5085 status = DML_FAIL_PITCH_SUPPORT;
5086 } else if (locals->PrefetchSupported[i][j] != true) {
5087 status = DML_FAIL_PREFETCH_SUPPORT;
5088 } else if (locals->TotalVerticalActiveBandwidthSupport[i] != true) {
5089 status = DML_FAIL_TOTAL_V_ACTIVE_BW;
5090 } else if (locals->VRatioInPrefetchSupported[i][j] != true) {
5091 status = DML_FAIL_V_RATIO_PREFETCH;
5092 } else if (locals->PTEBufferSizeNotExceeded[i][j] != true) {
5093 status = DML_FAIL_PTE_BUFFER_SIZE;
5094 } else if (mode_lib->vba.NonsupportedDSCInputBPC != false) {
5095 status = DML_FAIL_DSC_INPUT_BPC;
5098 if (status == DML_VALIDATION_OK) {
5099 locals->ModeSupport[i][j] = true;
5101 locals->ModeSupport[i][j] = false;
5103 locals->ValidationStatus[i] = status;
5107 unsigned int MaximumMPCCombine = 0;
5108 mode_lib->vba.VoltageLevel = mode_lib->vba.soc.num_states + 1;
5109 for (i = mode_lib->vba.VoltageOverrideLevel; i <= mode_lib->vba.soc.num_states; i++) {
5110 if (locals->ModeSupport[i][0] == true || locals->ModeSupport[i][1] == true) {
5111 mode_lib->vba.VoltageLevel = i;
5112 if (locals->ModeSupport[i][1] == true && (locals->ModeSupport[i][0] == false
5113 || mode_lib->vba.WhenToDoMPCCombine == dm_mpc_always_when_possible)) {
5114 MaximumMPCCombine = 1;
5116 MaximumMPCCombine = 0;
5121 mode_lib->vba.ImmediateFlipSupport =
5122 locals->ImmediateFlipSupportedForState[mode_lib->vba.VoltageLevel][MaximumMPCCombine];
5123 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
5124 mode_lib->vba.DPPPerPlane[k] = locals->NoOfDPP[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
5125 locals->DPPCLK[k] = locals->RequiredDPPCLK[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
5127 mode_lib->vba.DISPCLK = locals->RequiredDISPCLK[mode_lib->vba.VoltageLevel][MaximumMPCCombine];
5128 mode_lib->vba.maxMpcComb = MaximumMPCCombine;
5130 mode_lib->vba.DCFCLK = mode_lib->vba.DCFCLKPerState[mode_lib->vba.VoltageLevel];
5131 mode_lib->vba.DRAMSpeed = mode_lib->vba.DRAMSpeedPerState[mode_lib->vba.VoltageLevel];
5132 mode_lib->vba.FabricClock = mode_lib->vba.FabricClockPerState[mode_lib->vba.VoltageLevel];
5133 mode_lib->vba.SOCCLK = mode_lib->vba.SOCCLKPerState[mode_lib->vba.VoltageLevel];
5134 mode_lib->vba.ReturnBW = locals->ReturnBWPerState[mode_lib->vba.VoltageLevel];
5135 mode_lib->vba.FabricAndDRAMBandwidth = locals->FabricAndDRAMBandwidthPerState[mode_lib->vba.VoltageLevel];
5136 for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
5137 if (mode_lib->vba.BlendingAndTiming[k] == k) {
5138 mode_lib->vba.ODMCombineEnabled[k] =
5139 locals->ODMCombineEnablePerState[mode_lib->vba.VoltageLevel][k];
5141 mode_lib->vba.ODMCombineEnabled[k] = 0;
5143 mode_lib->vba.DSCEnabled[k] =
5144 locals->RequiresDSC[mode_lib->vba.VoltageLevel][k];
5145 mode_lib->vba.OutputBpp[k] =
5146 locals->OutputBppPerState[mode_lib->vba.VoltageLevel][k];