1 /*
2  * Copyright 2022 Advanced Micro Devices, Inc. All rights reserved.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * Authors: AMD
23  *
24  */
25 
26 #include "dc.h"
27 #include "dc_link.h"
28 #include "../display_mode_lib.h"
29 #include "display_mode_vba_32.h"
30 #include "../dml_inline_defs.h"
31 #include "display_mode_vba_util_32.h"
32 
33 void dml32_recalculate(struct display_mode_lib *mode_lib);
34 static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(
35 		struct display_mode_lib *mode_lib);
36 void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib);
37 
38 void dml32_recalculate(struct display_mode_lib *mode_lib)
39 {
40 	ModeSupportAndSystemConfiguration(mode_lib);
41 
42 	dml32_CalculateMaxDETAndMinCompressedBufferSize(mode_lib->vba.ConfigReturnBufferSizeInKByte,
43 			mode_lib->vba.ROBBufferSizeInKByte,
44 			DC__NUM_DPP,
45 			false, //mode_lib->vba.override_setting.nomDETInKByteOverrideEnable,
46 			0, //mode_lib->vba.override_setting.nomDETInKByteOverrideValue,
47 
48 			/* Output */
49 			&mode_lib->vba.MaxTotalDETInKByte, &mode_lib->vba.nomDETInKByte,
50 			&mode_lib->vba.MinCompressedBufferSizeInKByte);
51 
52 	PixelClockAdjustmentForProgressiveToInterlaceUnit(mode_lib);
53 #ifdef __DML_VBA_DEBUG__
54 	dml_print("DML::%s: Calling DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation\n", __func__);
55 #endif
56 	DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(mode_lib);
57 }
58 
59 static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(
60 		struct display_mode_lib *mode_lib)
61 {
62 	struct vba_vars_st *v = &mode_lib->vba;
63 	unsigned int j, k;
64 	bool ImmediateFlipRequirementFinal;
65 	int iteration;
66 	double MaxTotalRDBandwidth;
67 	unsigned int NextPrefetchMode;
68 	double MaxTotalRDBandwidthNoUrgentBurst = 0.0;
69 	bool DestinationLineTimesForPrefetchLessThan2 = false;
70 	bool VRatioPrefetchMoreThanMax = false;
71 	double TWait;
72 	double TotalWRBandwidth = 0;
73 	double WRBandwidth = 0;
74 
75 #ifdef __DML_VBA_DEBUG__
76 	dml_print("DML::%s: --- START ---\n", __func__);
77 	dml_print("DML::%s: mode_lib->vba.PrefetchMode = %d\n", __func__, mode_lib->vba.PrefetchMode);
78 	dml_print("DML::%s: mode_lib->vba.ImmediateFlipSupport = %d\n", __func__, mode_lib->vba.ImmediateFlipSupport);
79 	dml_print("DML::%s: mode_lib->vba.VoltageLevel = %d\n", __func__, mode_lib->vba.VoltageLevel);
80 #endif
81 
82 	v->WritebackDISPCLK = 0.0;
83 	v->GlobalDPPCLK = 0.0;
84 
85 	// DISPCLK and DPPCLK Calculation
86 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
87 		if (mode_lib->vba.WritebackEnable[k]) {
88 			v->WritebackDISPCLK = dml_max(v->WritebackDISPCLK,
89 					dml32_CalculateWriteBackDISPCLK(
90 							mode_lib->vba.WritebackPixelFormat[k],
91 							mode_lib->vba.PixelClock[k], mode_lib->vba.WritebackHRatio[k],
92 							mode_lib->vba.WritebackVRatio[k],
93 							mode_lib->vba.WritebackHTaps[k],
94 							mode_lib->vba.WritebackVTaps[k],
95 							mode_lib->vba.WritebackSourceWidth[k],
96 							mode_lib->vba.WritebackDestinationWidth[k],
97 							mode_lib->vba.HTotal[k], mode_lib->vba.WritebackLineBufferSize,
98 							mode_lib->vba.DISPCLKDPPCLKVCOSpeed));
99 		}
100 	}
101 
102 	v->DISPCLK_calculated = v->WritebackDISPCLK;
103 
104 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
105 		if (mode_lib->vba.BlendingAndTiming[k] == k) {
106 			v->DISPCLK_calculated = dml_max(v->DISPCLK_calculated,
107 					dml32_CalculateRequiredDispclk(
108 							mode_lib->vba.ODMCombineEnabled[k],
109 							mode_lib->vba.PixelClock[k],
110 							mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading,
111 							mode_lib->vba.DISPCLKRampingMargin,
112 							mode_lib->vba.DISPCLKDPPCLKVCOSpeed,
113 							mode_lib->vba.MaxDppclk[v->soc.num_states - 1]));
114 		}
115 	}
116 
117 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
118 		dml32_CalculateSinglePipeDPPCLKAndSCLThroughput(mode_lib->vba.HRatio[k],
119 				mode_lib->vba.HRatioChroma[k],
120 				mode_lib->vba.VRatio[k],
121 				mode_lib->vba.VRatioChroma[k],
122 				mode_lib->vba.MaxDCHUBToPSCLThroughput,
123 				mode_lib->vba.MaxPSCLToLBThroughput,
124 				mode_lib->vba.PixelClock[k],
125 				mode_lib->vba.SourcePixelFormat[k],
126 				mode_lib->vba.htaps[k],
127 				mode_lib->vba.HTAPsChroma[k],
128 				mode_lib->vba.vtaps[k],
129 				mode_lib->vba.VTAPsChroma[k],
130 
131 				/* Output */
132 				&v->PSCL_THROUGHPUT_LUMA[k], &v->PSCL_THROUGHPUT_CHROMA[k],
133 				&v->DPPCLKUsingSingleDPP[k]);
134 	}
135 
136 	dml32_CalculateDPPCLK(mode_lib->vba.NumberOfActiveSurfaces, mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading,
137 			mode_lib->vba.DISPCLKDPPCLKVCOSpeed, v->DPPCLKUsingSingleDPP, mode_lib->vba.DPPPerPlane,
138 			/* Output */
139 			&v->GlobalDPPCLK, v->DPPCLK);
140 
141 	for (k = 0; k < v->NumberOfActiveSurfaces; ++k) {
142 		v->DPPCLK_calculated[k] = v->DPPCLK[k];
143 	}
144 
145 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
146 		dml32_CalculateBytePerPixelAndBlockSizes(
147 				mode_lib->vba.SourcePixelFormat[k],
148 				mode_lib->vba.SurfaceTiling[k],
149 
150 				/* Output */
151 				&v->BytePerPixelY[k],
152 				&v->BytePerPixelC[k],
153 				&v->BytePerPixelDETY[k],
154 				&v->BytePerPixelDETC[k],
155 				&v->BlockHeight256BytesY[k],
156 				&v->BlockHeight256BytesC[k],
157 				&v->BlockWidth256BytesY[k],
158 				&v->BlockWidth256BytesC[k],
159 				&v->BlockHeightY[k],
160 				&v->BlockHeightC[k],
161 				&v->BlockWidthY[k],
162 				&v->BlockWidthC[k]);
163 	}
164 
165 #ifdef __DML_VBA_DEBUG__
166 	dml_print("DML::%s: %d\n", __func__, __LINE__);
167 #endif
168 	dml32_CalculateSwathWidth(
169 			false,  // ForceSingleDPP
170 			mode_lib->vba.NumberOfActiveSurfaces,
171 			mode_lib->vba.SourcePixelFormat,
172 			mode_lib->vba.SourceRotation,
173 			mode_lib->vba.ViewportStationary,
174 			mode_lib->vba.ViewportWidth,
175 			mode_lib->vba.ViewportHeight,
176 			mode_lib->vba.ViewportXStartY,
177 			mode_lib->vba.ViewportYStartY,
178 			mode_lib->vba.ViewportXStartC,
179 			mode_lib->vba.ViewportYStartC,
180 			mode_lib->vba.SurfaceWidthY,
181 			mode_lib->vba.SurfaceWidthC,
182 			mode_lib->vba.SurfaceHeightY,
183 			mode_lib->vba.SurfaceHeightC,
184 			mode_lib->vba.ODMCombineEnabled,
185 			v->BytePerPixelY,
186 			v->BytePerPixelC,
187 			v->BlockHeight256BytesY,
188 			v->BlockHeight256BytesC,
189 			v->BlockWidth256BytesY,
190 			v->BlockWidth256BytesC,
191 			mode_lib->vba.BlendingAndTiming,
192 			mode_lib->vba.HActive,
193 			mode_lib->vba.HRatio,
194 			mode_lib->vba.DPPPerPlane,
195 
196 			/* Output */
197 			v->SwathWidthSingleDPPY, v->SwathWidthSingleDPPC, v->SwathWidthY, v->SwathWidthC,
198 			v->dummy_vars
199 				.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
200 				.dummy_integer_array[0], // Integer             MaximumSwathHeightY[]
201 			v->dummy_vars
202 				.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
203 				.dummy_integer_array[1], // Integer             MaximumSwathHeightC[]
204 			v->swath_width_luma_ub, v->swath_width_chroma_ub);
205 
206 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
207 		v->ReadBandwidthSurfaceLuma[k] = v->SwathWidthSingleDPPY[k] * v->BytePerPixelY[k]
208 				/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k];
209 		v->ReadBandwidthSurfaceChroma[k] = v->SwathWidthSingleDPPC[k] * v->BytePerPixelC[k]
210 				/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
211 				* mode_lib->vba.VRatioChroma[k];
212 #ifdef __DML_VBA_DEBUG__
213 		dml_print("DML::%s: ReadBandwidthSurfaceLuma[%i] = %fBps\n",
214 				__func__, k, v->ReadBandwidthSurfaceLuma[k]);
215 		dml_print("DML::%s: ReadBandwidthSurfaceChroma[%i] = %fBps\n",
216 				__func__, k, v->ReadBandwidthSurfaceChroma[k]);
217 #endif
218 	}
219 
220 	{
221 		// VBA_DELTA
222 		// Calculate DET size, swath height
223 		dml32_CalculateSwathAndDETConfiguration(
224 				&v->dummy_vars.dml32_CalculateSwathAndDETConfiguration,
225 				mode_lib->vba.DETSizeOverride,
226 				mode_lib->vba.UsesMALLForPStateChange,
227 				mode_lib->vba.ConfigReturnBufferSizeInKByte,
228 				mode_lib->vba.MaxTotalDETInKByte,
229 				mode_lib->vba.MinCompressedBufferSizeInKByte,
230 				false, /* ForceSingleDPP */
231 				mode_lib->vba.NumberOfActiveSurfaces,
232 				mode_lib->vba.nomDETInKByte,
233 				mode_lib->vba.UseUnboundedRequesting,
234 				mode_lib->vba.DisableUnboundRequestIfCompBufReservedSpaceNeedAdjustment,
235 				mode_lib->vba.ip.pixel_chunk_size_kbytes,
236 				mode_lib->vba.ip.rob_buffer_size_kbytes,
237 				mode_lib->vba.CompressedBufferSegmentSizeInkByteFinal,
238 				v->dummy_vars
239 					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
240 					.dummy_output_encoder_array, /* output_encoder_class Output[] */
241 				v->ReadBandwidthSurfaceLuma,
242 				v->ReadBandwidthSurfaceChroma,
243 				v->dummy_vars
244 					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
245 					.dummy_single_array[0], /* Single MaximumSwathWidthLuma[] */
246 				v->dummy_vars
247 					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
248 					.dummy_single_array[1], /* Single MaximumSwathWidthChroma[] */
249 				mode_lib->vba.SourceRotation,
250 				mode_lib->vba.ViewportStationary,
251 				mode_lib->vba.SourcePixelFormat,
252 				mode_lib->vba.SurfaceTiling,
253 				mode_lib->vba.ViewportWidth,
254 				mode_lib->vba.ViewportHeight,
255 				mode_lib->vba.ViewportXStartY,
256 				mode_lib->vba.ViewportYStartY,
257 				mode_lib->vba.ViewportXStartC,
258 				mode_lib->vba.ViewportYStartC,
259 				mode_lib->vba.SurfaceWidthY,
260 				mode_lib->vba.SurfaceWidthC,
261 				mode_lib->vba.SurfaceHeightY,
262 				mode_lib->vba.SurfaceHeightC,
263 				v->BlockHeight256BytesY,
264 				v->BlockHeight256BytesC,
265 				v->BlockWidth256BytesY,
266 				v->BlockWidth256BytesC,
267 				mode_lib->vba.ODMCombineEnabled,
268 				mode_lib->vba.BlendingAndTiming,
269 				v->BytePerPixelY,
270 				v->BytePerPixelC,
271 				v->BytePerPixelDETY,
272 				v->BytePerPixelDETC,
273 				mode_lib->vba.HActive,
274 				mode_lib->vba.HRatio,
275 				mode_lib->vba.HRatioChroma,
276 				mode_lib->vba.DPPPerPlane,
277 
278 				/* Output */
279 				v->dummy_vars
280 					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
281 					.dummy_long_array[0], /* Long swath_width_luma_ub[] */
282 				v->dummy_vars
283 					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
284 					.dummy_long_array[1], /* Long swath_width_chroma_ub[] */
285 				v->dummy_vars
286 					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
287 					.dummy_double_array[0], /* Long SwathWidth[] */
288 				v->dummy_vars
289 					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
290 					.dummy_double_array[1], /* Long SwathWidthChroma[] */
291 				mode_lib->vba.SwathHeightY,
292 				mode_lib->vba.SwathHeightC,
293 				mode_lib->vba.DETBufferSizeInKByte,
294 				mode_lib->vba.DETBufferSizeY,
295 				mode_lib->vba.DETBufferSizeC,
296 				&v->UnboundedRequestEnabled,
297 				&v->CompressedBufferSizeInkByte,
298 				&v->CompBufReservedSpaceKBytes,
299 				&v->dummy_vars
300 					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
301 					.dummy_boolean,       /* bool *CompBufReservedSpaceNeedAjustment */
302 				v->dummy_vars
303 					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
304 					.dummy_boolean_array, /* bool ViewportSizeSupportPerSurface[] */
305 				&v->dummy_vars
306 					 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
307 					 .dummy_boolean); /* bool *ViewportSizeSupport */
308 	}
309 
310 	v->CompBufReservedSpaceZs     = v->CompBufReservedSpaceKBytes * 1024.0 / 256.0;
311 	v->CompBufReservedSpace64B    = v->CompBufReservedSpaceKBytes * 1024.0 / 64.0;
312 
313 	// DCFCLK Deep Sleep
314 	dml32_CalculateDCFCLKDeepSleep(
315 			mode_lib->vba.NumberOfActiveSurfaces,
316 			v->BytePerPixelY,
317 			v->BytePerPixelC,
318 			mode_lib->vba.VRatio,
319 			mode_lib->vba.VRatioChroma,
320 			v->SwathWidthY,
321 			v->SwathWidthC,
322 			mode_lib->vba.DPPPerPlane,
323 			mode_lib->vba.HRatio,
324 			mode_lib->vba.HRatioChroma,
325 			mode_lib->vba.PixelClock,
326 			v->PSCL_THROUGHPUT_LUMA,
327 			v->PSCL_THROUGHPUT_CHROMA,
328 			mode_lib->vba.DPPCLK,
329 			v->ReadBandwidthSurfaceLuma,
330 			v->ReadBandwidthSurfaceChroma,
331 			mode_lib->vba.ReturnBusWidth,
332 
333 			/* Output */
334 			&v->DCFCLKDeepSleep);
335 
336 	// DSCCLK
337 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
338 		if ((mode_lib->vba.BlendingAndTiming[k] != k) || !mode_lib->vba.DSCEnabled[k]) {
339 			v->DSCCLK_calculated[k] = 0.0;
340 		} else {
341 			if (mode_lib->vba.OutputFormat[k] == dm_420)
342 				mode_lib->vba.DSCFormatFactor = 2;
343 			else if (mode_lib->vba.OutputFormat[k] == dm_444)
344 				mode_lib->vba.DSCFormatFactor = 1;
345 			else if (mode_lib->vba.OutputFormat[k] == dm_n422)
346 				mode_lib->vba.DSCFormatFactor = 2;
347 			else
348 				mode_lib->vba.DSCFormatFactor = 1;
349 			if (mode_lib->vba.ODMCombineEnabled[k] == dm_odm_combine_mode_4to1)
350 				v->DSCCLK_calculated[k] = mode_lib->vba.PixelClockBackEnd[k] / 12
351 						/ mode_lib->vba.DSCFormatFactor
352 						/ (1 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100);
353 			else if (mode_lib->vba.ODMCombineEnabled[k] == dm_odm_combine_mode_2to1)
354 				v->DSCCLK_calculated[k] = mode_lib->vba.PixelClockBackEnd[k] / 6
355 						/ mode_lib->vba.DSCFormatFactor
356 						/ (1 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100);
357 			else
358 				v->DSCCLK_calculated[k] = mode_lib->vba.PixelClockBackEnd[k] / 3
359 						/ mode_lib->vba.DSCFormatFactor
360 						/ (1 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100);
361 		}
362 	}
363 
364 	// DSC Delay
365 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
366 		v->DSCDelay[k] = dml32_DSCDelayRequirement(mode_lib->vba.DSCEnabled[k],
367 				mode_lib->vba.ODMCombineEnabled[k], mode_lib->vba.DSCInputBitPerComponent[k],
368 				mode_lib->vba.OutputBpp[k], mode_lib->vba.HActive[k], mode_lib->vba.HTotal[k],
369 				mode_lib->vba.NumberOfDSCSlices[k], mode_lib->vba.OutputFormat[k],
370 				mode_lib->vba.Output[k], mode_lib->vba.PixelClock[k],
371 				mode_lib->vba.PixelClockBackEnd[k]);
372 	}
373 
374 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
375 		for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) // NumberOfSurfaces
376 			if (j != k && mode_lib->vba.BlendingAndTiming[k] == j && mode_lib->vba.DSCEnabled[j])
377 				v->DSCDelay[k] = v->DSCDelay[j];
378 
379 	//Immediate Flip
380 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
381 		v->ImmediateFlipSupportedSurface[k] = mode_lib->vba.ImmediateFlipSupport
382 				&& (mode_lib->vba.ImmediateFlipRequirement[k] != dm_immediate_flip_not_required);
383 	}
384 
385 	// Prefetch
386 	dml32_CalculateSurfaceSizeInMall(
387 				mode_lib->vba.NumberOfActiveSurfaces,
388 				mode_lib->vba.MALLAllocatedForDCNFinal,
389 				mode_lib->vba.UseMALLForStaticScreen,
390 				mode_lib->vba.DCCEnable,
391 				mode_lib->vba.ViewportStationary,
392 				mode_lib->vba.ViewportXStartY,
393 				mode_lib->vba.ViewportYStartY,
394 				mode_lib->vba.ViewportXStartC,
395 				mode_lib->vba.ViewportYStartC,
396 				mode_lib->vba.ViewportWidth,
397 				mode_lib->vba.ViewportHeight,
398 				v->BytePerPixelY,
399 				mode_lib->vba.ViewportWidthChroma,
400 				mode_lib->vba.ViewportHeightChroma,
401 				v->BytePerPixelC,
402 				mode_lib->vba.SurfaceWidthY,
403 				mode_lib->vba.SurfaceWidthC,
404 				mode_lib->vba.SurfaceHeightY,
405 				mode_lib->vba.SurfaceHeightC,
406 				v->BlockWidth256BytesY,
407 				v->BlockWidth256BytesC,
408 				v->BlockHeight256BytesY,
409 				v->BlockHeight256BytesC,
410 				v->BlockWidthY,
411 				v->BlockWidthC,
412 				v->BlockHeightY,
413 				v->BlockHeightC,
414 
415 				/* Output */
416 				v->SurfaceSizeInMALL,
417 				&v->dummy_vars.
418 				DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
419 				.dummy_boolean2); /* Boolean *ExceededMALLSize */
420 
421 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
422 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].PixelClock = mode_lib->vba.PixelClock[k];
423 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].DPPPerSurface = mode_lib->vba.DPPPerPlane[k];
424 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SourceRotation = mode_lib->vba.SourceRotation[k];
425 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportHeight = mode_lib->vba.ViewportHeight[k];
426 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportHeightChroma = mode_lib->vba.ViewportHeightChroma[k];
427 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockWidth256BytesY = v->BlockWidth256BytesY[k];
428 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockHeight256BytesY = v->BlockHeight256BytesY[k];
429 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockWidth256BytesC = v->BlockWidth256BytesC[k];
430 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockHeight256BytesC = v->BlockHeight256BytesC[k];
431 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockWidthY = v->BlockWidthY[k];
432 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockHeightY = v->BlockHeightY[k];
433 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockWidthC = v->BlockWidthC[k];
434 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockHeightC = v->BlockHeightC[k];
435 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].InterlaceEnable = mode_lib->vba.Interlace[k];
436 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].HTotal = mode_lib->vba.HTotal[k];
437 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].DCCEnable = mode_lib->vba.DCCEnable[k];
438 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SourcePixelFormat = mode_lib->vba.SourcePixelFormat[k];
439 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SurfaceTiling = mode_lib->vba.SurfaceTiling[k];
440 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BytePerPixelY = v->BytePerPixelY[k];
441 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BytePerPixelC = v->BytePerPixelC[k];
442 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ProgressiveToInterlaceUnitInOPP = mode_lib->vba.ProgressiveToInterlaceUnitInOPP;
443 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].VRatio = mode_lib->vba.VRatio[k];
444 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].VRatioChroma = mode_lib->vba.VRatioChroma[k];
445 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].VTaps = mode_lib->vba.vtaps[k];
446 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].VTapsChroma = mode_lib->vba.VTAPsChroma[k];
447 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].PitchY = mode_lib->vba.PitchY[k];
448 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].DCCMetaPitchY = mode_lib->vba.DCCMetaPitchY[k];
449 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].PitchC = mode_lib->vba.PitchC[k];
450 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].DCCMetaPitchC = mode_lib->vba.DCCMetaPitchC[k];
451 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportStationary = mode_lib->vba.ViewportStationary[k];
452 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportXStart = mode_lib->vba.ViewportXStartY[k];
453 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportYStart = mode_lib->vba.ViewportYStartY[k];
454 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportXStartC = mode_lib->vba.ViewportXStartC[k];
455 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportYStartC = mode_lib->vba.ViewportYStartC[k];
456 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].FORCE_ONE_ROW_FOR_FRAME = mode_lib->vba.ForceOneRowForFrame[k];
457 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SwathHeightY = mode_lib->vba.SwathHeightY[k];
458 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SwathHeightC = mode_lib->vba.SwathHeightC[k];
459 	}
460 
461 	{
462 
463 		dml32_CalculateVMRowAndSwath(
464 				&v->dummy_vars.dml32_CalculateVMRowAndSwath,
465 				mode_lib->vba.NumberOfActiveSurfaces,
466 				v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters,
467 				v->SurfaceSizeInMALL,
468 				mode_lib->vba.PTEBufferSizeInRequestsLuma,
469 				mode_lib->vba.PTEBufferSizeInRequestsChroma,
470 				mode_lib->vba.DCCMetaBufferSizeBytes,
471 				mode_lib->vba.UseMALLForStaticScreen,
472 				mode_lib->vba.UsesMALLForPStateChange,
473 				mode_lib->vba.MALLAllocatedForDCNFinal,
474 				v->SwathWidthY,
475 				v->SwathWidthC,
476 				mode_lib->vba.GPUVMEnable,
477 				mode_lib->vba.HostVMEnable,
478 				mode_lib->vba.HostVMMaxNonCachedPageTableLevels,
479 				mode_lib->vba.GPUVMMaxPageTableLevels,
480 				mode_lib->vba.GPUVMMinPageSizeKBytes,
481 				mode_lib->vba.HostVMMinPageSize,
482 
483 				/* Output */
484 				v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean_array2[0],  // Boolean PTEBufferSizeNotExceeded[]
485 				v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean_array2[1],  // Boolean DCCMetaBufferSizeNotExceeded[]
486 				v->dpte_row_width_luma_ub,
487 				v->dpte_row_width_chroma_ub,
488 				v->dpte_row_height,
489 				v->dpte_row_height_chroma,
490 				v->dpte_row_height_linear,
491 				v->dpte_row_height_linear_chroma,
492 				v->meta_req_width,
493 				v->meta_req_width_chroma,
494 				v->meta_req_height,
495 				v->meta_req_height_chroma,
496 				v->meta_row_width,
497 				v->meta_row_width_chroma,
498 				v->meta_row_height,
499 				v->meta_row_height_chroma,
500 				v->vm_group_bytes,
501 				v->dpte_group_bytes,
502 				v->PixelPTEReqWidthY,
503 				v->PixelPTEReqHeightY,
504 				v->PTERequestSizeY,
505 				v->PixelPTEReqWidthC,
506 				v->PixelPTEReqHeightC,
507 				v->PTERequestSizeC,
508 				v->dpde0_bytes_per_frame_ub_l,
509 				v->meta_pte_bytes_per_frame_ub_l,
510 				v->dpde0_bytes_per_frame_ub_c,
511 				v->meta_pte_bytes_per_frame_ub_c,
512 				v->PrefetchSourceLinesY,
513 				v->PrefetchSourceLinesC,
514 				v->VInitPreFillY, v->VInitPreFillC,
515 				v->MaxNumSwathY,
516 				v->MaxNumSwathC,
517 				v->meta_row_bw,
518 				v->dpte_row_bw,
519 				v->PixelPTEBytesPerRow,
520 				v->PDEAndMetaPTEBytesFrame,
521 				v->MetaRowByte,
522 				v->Use_One_Row_For_Frame,
523 				v->Use_One_Row_For_Frame_Flip,
524 				v->UsesMALLForStaticScreen,
525 				v->PTE_BUFFER_MODE,
526 				v->BIGK_FRAGMENT_SIZE);
527 	}
528 
529 
530 	v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.ReorderBytes = mode_lib->vba.NumberOfChannels
531 			* dml_max3(mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelDataOnly,
532 					mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelMixedWithVMData,
533 					mode_lib->vba.UrgentOutOfOrderReturnPerChannelVMDataOnly);
534 
535 	v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.VMDataOnlyReturnBW = dml32_get_return_bw_mbps_vm_only(
536 			&mode_lib->vba.soc,
537 			mode_lib->vba.VoltageLevel,
538 			mode_lib->vba.DCFCLK,
539 			mode_lib->vba.FabricClock,
540 			mode_lib->vba.DRAMSpeed);
541 
542 #ifdef __DML_VBA_DEBUG__
543 	dml_print("DML::%s: mode_lib->vba.ReturnBusWidth = %f\n", __func__, mode_lib->vba.ReturnBusWidth);
544 	dml_print("DML::%s: mode_lib->vba.DCFCLK = %f\n", __func__, mode_lib->vba.DCFCLK);
545 	dml_print("DML::%s: mode_lib->vba.FabricClock = %f\n", __func__, mode_lib->vba.FabricClock);
546 	dml_print("DML::%s: mode_lib->vba.FabricDatapathToDCNDataReturn = %f\n", __func__,
547 			mode_lib->vba.FabricDatapathToDCNDataReturn);
548 	dml_print("DML::%s: mode_lib->vba.PercentOfIdealSDPPortBWReceivedAfterUrgLatency = %f\n",
549 			__func__, mode_lib->vba.PercentOfIdealSDPPortBWReceivedAfterUrgLatency);
550 	dml_print("DML::%s: mode_lib->vba.DRAMSpeed = %f\n", __func__, mode_lib->vba.DRAMSpeed);
551 	dml_print("DML::%s: mode_lib->vba.NumberOfChannels = %f\n", __func__, mode_lib->vba.NumberOfChannels);
552 	dml_print("DML::%s: mode_lib->vba.DRAMChannelWidth = %f\n", __func__, mode_lib->vba.DRAMChannelWidth);
553 	dml_print("DML::%s: mode_lib->vba.PercentOfIdealDRAMBWReceivedAfterUrgLatencyVMDataOnly = %f\n",
554 			__func__, mode_lib->vba.PercentOfIdealDRAMBWReceivedAfterUrgLatencyVMDataOnly);
555 	dml_print("DML::%s: VMDataOnlyReturnBW = %f\n", __func__, VMDataOnlyReturnBW);
556 	dml_print("DML::%s: ReturnBW = %f\n", __func__, mode_lib->vba.ReturnBW);
557 #endif
558 
559 	v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor = 1.0;
560 
561 	if (mode_lib->vba.GPUVMEnable && mode_lib->vba.HostVMEnable)
562 		v->dummy_vars
563 			.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
564 			.HostVMInefficiencyFactor =
565 			mode_lib->vba.ReturnBW / v->dummy_vars
566 				.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
567 				.VMDataOnlyReturnBW;
568 
569 	mode_lib->vba.TotalDCCActiveDPP = 0;
570 	mode_lib->vba.TotalActiveDPP = 0;
571 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
572 		mode_lib->vba.TotalActiveDPP = mode_lib->vba.TotalActiveDPP + mode_lib->vba.DPPPerPlane[k];
573 		if (mode_lib->vba.DCCEnable[k])
574 			mode_lib->vba.TotalDCCActiveDPP = mode_lib->vba.TotalDCCActiveDPP
575 					+ mode_lib->vba.DPPPerPlane[k];
576 	}
577 
578 	v->UrgentExtraLatency = dml32_CalculateExtraLatency(
579 			mode_lib->vba.RoundTripPingLatencyCycles,
580 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.ReorderBytes,
581 			mode_lib->vba.DCFCLK,
582 			mode_lib->vba.TotalActiveDPP,
583 			mode_lib->vba.PixelChunkSizeInKByte,
584 			mode_lib->vba.TotalDCCActiveDPP,
585 			mode_lib->vba.MetaChunkSize,
586 			mode_lib->vba.ReturnBW,
587 			mode_lib->vba.GPUVMEnable,
588 			mode_lib->vba.HostVMEnable,
589 			mode_lib->vba.NumberOfActiveSurfaces,
590 			mode_lib->vba.DPPPerPlane,
591 			v->dpte_group_bytes,
592 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor,
593 			mode_lib->vba.HostVMMinPageSize,
594 			mode_lib->vba.HostVMMaxNonCachedPageTableLevels);
595 
596 	mode_lib->vba.TCalc = 24.0 / v->DCFCLKDeepSleep;
597 
598 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
599 		if (mode_lib->vba.BlendingAndTiming[k] == k) {
600 			if (mode_lib->vba.WritebackEnable[k] == true) {
601 				v->WritebackDelay[mode_lib->vba.VoltageLevel][k] = mode_lib->vba.WritebackLatency
602 						+ dml32_CalculateWriteBackDelay(
603 								mode_lib->vba.WritebackPixelFormat[k],
604 								mode_lib->vba.WritebackHRatio[k],
605 								mode_lib->vba.WritebackVRatio[k],
606 								mode_lib->vba.WritebackVTaps[k],
607 								mode_lib->vba.WritebackDestinationWidth[k],
608 								mode_lib->vba.WritebackDestinationHeight[k],
609 								mode_lib->vba.WritebackSourceHeight[k],
610 								mode_lib->vba.HTotal[k]) / mode_lib->vba.DISPCLK;
611 			} else
612 				v->WritebackDelay[mode_lib->vba.VoltageLevel][k] = 0;
613 			for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) {
614 				if (mode_lib->vba.BlendingAndTiming[j] == k &&
615 					mode_lib->vba.WritebackEnable[j] == true) {
616 					v->WritebackDelay[mode_lib->vba.VoltageLevel][k] =
617 						dml_max(v->WritebackDelay[mode_lib->vba.VoltageLevel][k],
618 						mode_lib->vba.WritebackLatency +
619 						dml32_CalculateWriteBackDelay(
620 								mode_lib->vba.WritebackPixelFormat[j],
621 								mode_lib->vba.WritebackHRatio[j],
622 								mode_lib->vba.WritebackVRatio[j],
623 								mode_lib->vba.WritebackVTaps[j],
624 								mode_lib->vba.WritebackDestinationWidth[j],
625 								mode_lib->vba.WritebackDestinationHeight[j],
626 								mode_lib->vba.WritebackSourceHeight[j],
627 								mode_lib->vba.HTotal[k]) / mode_lib->vba.DISPCLK);
628 				}
629 			}
630 		}
631 	}
632 
633 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
634 		for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j)
635 			if (mode_lib->vba.BlendingAndTiming[k] == j)
636 				v->WritebackDelay[mode_lib->vba.VoltageLevel][k] =
637 						v->WritebackDelay[mode_lib->vba.VoltageLevel][j];
638 
639 	v->UrgentLatency = dml32_CalculateUrgentLatency(mode_lib->vba.UrgentLatencyPixelDataOnly,
640 			mode_lib->vba.UrgentLatencyPixelMixedWithVMData,
641 			mode_lib->vba.UrgentLatencyVMDataOnly,
642 			mode_lib->vba.DoUrgentLatencyAdjustment,
643 			mode_lib->vba.UrgentLatencyAdjustmentFabricClockComponent,
644 			mode_lib->vba.UrgentLatencyAdjustmentFabricClockReference,
645 			mode_lib->vba.FabricClock);
646 
647 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
648 		dml32_CalculateUrgentBurstFactor(mode_lib->vba.UsesMALLForPStateChange[k],
649 				v->swath_width_luma_ub[k],
650 				v->swath_width_chroma_ub[k],
651 				mode_lib->vba.SwathHeightY[k],
652 				mode_lib->vba.SwathHeightC[k],
653 				mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
654 				v->UrgentLatency,
655 				mode_lib->vba.CursorBufferSize,
656 				mode_lib->vba.CursorWidth[k][0],
657 				mode_lib->vba.CursorBPP[k][0],
658 				mode_lib->vba.VRatio[k],
659 				mode_lib->vba.VRatioChroma[k],
660 				v->BytePerPixelDETY[k],
661 				v->BytePerPixelDETC[k],
662 				mode_lib->vba.DETBufferSizeY[k],
663 				mode_lib->vba.DETBufferSizeC[k],
664 
665 				/* output */
666 				&v->UrgBurstFactorCursor[k],
667 				&v->UrgBurstFactorLuma[k],
668 				&v->UrgBurstFactorChroma[k],
669 				&v->NoUrgentLatencyHiding[k]);
670 
671 		v->cursor_bw[k] = mode_lib->vba.NumberOfCursors[k] * mode_lib->vba.CursorWidth[k][0] * mode_lib->vba.CursorBPP[k][0] / 8 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k];
672 	}
673 
674 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
675 		v->MaxVStartupLines[k] = ((mode_lib->vba.Interlace[k] &&
676 				!mode_lib->vba.ProgressiveToInterlaceUnitInOPP) ?
677 				dml_floor((mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]) / 2.0, 1.0) :
678 				mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]) - dml_max(1.0,
679 				dml_ceil((double) v->WritebackDelay[mode_lib->vba.VoltageLevel][k]
680 				/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]), 1));
681 
682 	// Clamp to max OTG vstartup register limit
683 	if (v->MaxVStartupLines[k] > 1023)
684 		v->MaxVStartupLines[k] = 1023;
685 
686 #ifdef __DML_VBA_DEBUG__
687 		dml_print("DML::%s: k=%d MaxVStartupLines = %d\n", __func__, k, v->MaxVStartupLines[k]);
688 		dml_print("DML::%s: k=%d VoltageLevel = %d\n", __func__, k, mode_lib->vba.VoltageLevel);
689 		dml_print("DML::%s: k=%d WritebackDelay = %f\n", __func__,
690 				k, v->WritebackDelay[mode_lib->vba.VoltageLevel][k]);
691 #endif
692 	}
693 
694 	v->MaximumMaxVStartupLines = 0;
695 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
696 		v->MaximumMaxVStartupLines = dml_max(v->MaximumMaxVStartupLines, v->MaxVStartupLines[k]);
697 
698 	ImmediateFlipRequirementFinal = false;
699 
700 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
701 		ImmediateFlipRequirementFinal = ImmediateFlipRequirementFinal
702 				|| (mode_lib->vba.ImmediateFlipRequirement[k] == dm_immediate_flip_required);
703 	}
704 #ifdef __DML_VBA_DEBUG__
705 	dml_print("DML::%s: ImmediateFlipRequirementFinal = %d\n", __func__, ImmediateFlipRequirementFinal);
706 #endif
707 	// ModeProgramming will not repeat the schedule calculation using different prefetch mode,
708 	//it is just calcualated once with given prefetch mode
709 	dml32_CalculateMinAndMaxPrefetchMode(
710 			mode_lib->vba.AllowForPStateChangeOrStutterInVBlankFinal,
711 			&mode_lib->vba.MinPrefetchMode,
712 			&mode_lib->vba.MaxPrefetchMode);
713 
714 	v->VStartupLines = __DML_VBA_MIN_VSTARTUP__;
715 
716 	iteration = 0;
717 	MaxTotalRDBandwidth = 0;
718 	NextPrefetchMode = mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb];
719 
720 	do {
721 		MaxTotalRDBandwidth = 0;
722 #ifdef __DML_VBA_DEBUG__
723 		dml_print("DML::%s: Start loop: VStartup = %d\n", __func__, mode_lib->vba.VStartupLines);
724 #endif
725 		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
726 			/* NOTE PerfetchMode variable is invalid in DAL as per the input received.
727 			 * Hence the direction is to use PrefetchModePerState.
728 			 */
729 			TWait = dml32_CalculateTWait(
730 				mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb],
731 				mode_lib->vba.UsesMALLForPStateChange[k],
732 				mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
733 				mode_lib->vba.DRRDisplay[k],
734 				mode_lib->vba.DRAMClockChangeLatency,
735 				mode_lib->vba.FCLKChangeLatency, v->UrgentLatency,
736 				mode_lib->vba.SREnterPlusExitTime);
737 
738 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.Dppclk = mode_lib->vba.DPPCLK[k];
739 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.Dispclk = mode_lib->vba.DISPCLK;
740 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.PixelClock = mode_lib->vba.PixelClock[k];
741 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.DCFClkDeepSleep = v->DCFCLKDeepSleep;
742 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.DPPPerSurface = mode_lib->vba.DPPPerPlane[k];
743 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.ScalerEnabled = mode_lib->vba.ScalerEnabled[k];
744 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.SourceRotation = mode_lib->vba.SourceRotation[k];
745 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BlockWidth256BytesY = v->BlockWidth256BytesY[k];
746 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BlockHeight256BytesY = v->BlockHeight256BytesY[k];
747 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BlockWidth256BytesC = v->BlockWidth256BytesC[k];
748 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BlockHeight256BytesC = v->BlockHeight256BytesC[k];
749 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.InterlaceEnable = mode_lib->vba.Interlace[k];
750 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.NumberOfCursors = mode_lib->vba.NumberOfCursors[k];
751 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.VBlank = mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k];
752 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.HTotal = mode_lib->vba.HTotal[k];
753 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.HActive = mode_lib->vba.HActive[k];
754 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.DCCEnable = mode_lib->vba.DCCEnable[k];
755 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.ODMMode = mode_lib->vba.ODMCombineEnabled[k];
756 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.SourcePixelFormat = mode_lib->vba.SourcePixelFormat[k];
757 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BytePerPixelY = v->BytePerPixelY[k];
758 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BytePerPixelC = v->BytePerPixelC[k];
759 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.ProgressiveToInterlaceUnitInOPP = mode_lib->vba.ProgressiveToInterlaceUnitInOPP;
760 			v->ErrorResult[k] = dml32_CalculatePrefetchSchedule(
761 					&v->dummy_vars.dml32_CalculatePrefetchSchedule,
762 					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor,
763 					&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe, v->DSCDelay[k],
764 					mode_lib->vba.DPPCLKDelaySubtotal + mode_lib->vba.DPPCLKDelayCNVCFormater,
765 					mode_lib->vba.DPPCLKDelaySCL,
766 					mode_lib->vba.DPPCLKDelaySCLLBOnly,
767 					mode_lib->vba.DPPCLKDelayCNVCCursor,
768 					mode_lib->vba.DISPCLKDelaySubtotal,
769 					(unsigned int) (v->SwathWidthY[k] / mode_lib->vba.HRatio[k]),
770 					mode_lib->vba.OutputFormat[k],
771 					mode_lib->vba.MaxInterDCNTileRepeaters,
772 					dml_min(v->VStartupLines, v->MaxVStartupLines[k]),
773 					v->MaxVStartupLines[k],
774 					mode_lib->vba.GPUVMMaxPageTableLevels,
775 					mode_lib->vba.GPUVMEnable,
776 					mode_lib->vba.HostVMEnable,
777 					mode_lib->vba.HostVMMaxNonCachedPageTableLevels,
778 					mode_lib->vba.HostVMMinPageSize,
779 					mode_lib->vba.DynamicMetadataEnable[k],
780 					mode_lib->vba.DynamicMetadataVMEnabled,
781 					mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired[k],
782 					mode_lib->vba.DynamicMetadataTransmittedBytes[k],
783 					v->UrgentLatency,
784 					v->UrgentExtraLatency,
785 					mode_lib->vba.TCalc,
786 					v->PDEAndMetaPTEBytesFrame[k],
787 					v->MetaRowByte[k],
788 					v->PixelPTEBytesPerRow[k],
789 					v->PrefetchSourceLinesY[k],
790 					v->SwathWidthY[k],
791 					v->VInitPreFillY[k],
792 					v->MaxNumSwathY[k],
793 					v->PrefetchSourceLinesC[k],
794 					v->SwathWidthC[k],
795 					v->VInitPreFillC[k],
796 					v->MaxNumSwathC[k],
797 					v->swath_width_luma_ub[k],
798 					v->swath_width_chroma_ub[k],
799 					mode_lib->vba.SwathHeightY[k],
800 					mode_lib->vba.SwathHeightC[k],
801 					TWait,
802 					/* Output */
803 					&v->DSTXAfterScaler[k],
804 					&v->DSTYAfterScaler[k],
805 					&v->DestinationLinesForPrefetch[k],
806 					&v->PrefetchBandwidth[k],
807 					&v->DestinationLinesToRequestVMInVBlank[k],
808 					&v->DestinationLinesToRequestRowInVBlank[k],
809 					&v->VRatioPrefetchY[k],
810 					&v->VRatioPrefetchC[k],
811 					&v->RequiredPrefetchPixDataBWLuma[k],
812 					&v->RequiredPrefetchPixDataBWChroma[k],
813 					&v->NotEnoughTimeForDynamicMetadata[k],
814 					&v->Tno_bw[k], &v->prefetch_vmrow_bw[k],
815 					&v->Tdmdl_vm[k],
816 					&v->Tdmdl[k],
817 					&v->TSetup[k],
818 					&v->VUpdateOffsetPix[k],
819 					&v->VUpdateWidthPix[k],
820 					&v->VReadyOffsetPix[k]);
821 
822 #ifdef __DML_VBA_DEBUG__
823 			dml_print("DML::%s: k=%0d Prefetch calculation errResult=%0d\n",
824 					__func__, k, mode_lib->vba.ErrorResult[k]);
825 #endif
826 			v->VStartup[k] = dml_min(v->VStartupLines, v->MaxVStartupLines[k]);
827 		}
828 
829 		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
830 			dml32_CalculateUrgentBurstFactor(mode_lib->vba.UsesMALLForPStateChange[k],
831 					v->swath_width_luma_ub[k],
832 					v->swath_width_chroma_ub[k],
833 					mode_lib->vba.SwathHeightY[k],
834 					mode_lib->vba.SwathHeightC[k],
835 					mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
836 					v->UrgentLatency,
837 					mode_lib->vba.CursorBufferSize,
838 					mode_lib->vba.CursorWidth[k][0],
839 					mode_lib->vba.CursorBPP[k][0],
840 					v->VRatioPrefetchY[k],
841 					v->VRatioPrefetchC[k],
842 					v->BytePerPixelDETY[k],
843 					v->BytePerPixelDETC[k],
844 					mode_lib->vba.DETBufferSizeY[k],
845 					mode_lib->vba.DETBufferSizeC[k],
846 					/* Output */
847 					&v->UrgBurstFactorCursorPre[k],
848 					&v->UrgBurstFactorLumaPre[k],
849 					&v->UrgBurstFactorChromaPre[k],
850 					&v->NoUrgentLatencyHidingPre[k]);
851 
852 			v->cursor_bw_pre[k] = mode_lib->vba.NumberOfCursors[k] * mode_lib->vba.CursorWidth[k][0] * mode_lib->vba.CursorBPP[k][0] /
853 					8.0 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * v->VRatioPrefetchY[k];
854 
855 #ifdef __DML_VBA_DEBUG__
856 			dml_print("DML::%s: k=%0d DPPPerSurface=%d\n", __func__, k, mode_lib->vba.DPPPerPlane[k]);
857 			dml_print("DML::%s: k=%0d UrgBurstFactorLuma=%f\n", __func__, k, v->UrgBurstFactorLuma[k]);
858 			dml_print("DML::%s: k=%0d UrgBurstFactorChroma=%f\n", __func__, k, v->UrgBurstFactorChroma[k]);
859 			dml_print("DML::%s: k=%0d UrgBurstFactorLumaPre=%f\n", __func__, k,
860 					v->UrgBurstFactorLumaPre[k]);
861 			dml_print("DML::%s: k=%0d UrgBurstFactorChromaPre=%f\n", __func__, k,
862 					v->UrgBurstFactorChromaPre[k]);
863 
864 			dml_print("DML::%s: k=%0d VRatioPrefetchY=%f\n", __func__, k, v->VRatioPrefetchY[k]);
865 			dml_print("DML::%s: k=%0d VRatioY=%f\n", __func__, k, mode_lib->vba.VRatio[k]);
866 
867 			dml_print("DML::%s: k=%0d prefetch_vmrow_bw=%f\n", __func__, k, v->prefetch_vmrow_bw[k]);
868 			dml_print("DML::%s: k=%0d ReadBandwidthSurfaceLuma=%f\n", __func__, k,
869 					v->ReadBandwidthSurfaceLuma[k]);
870 			dml_print("DML::%s: k=%0d ReadBandwidthSurfaceChroma=%f\n", __func__, k,
871 					v->ReadBandwidthSurfaceChroma[k]);
872 			dml_print("DML::%s: k=%0d cursor_bw=%f\n", __func__, k, v->cursor_bw[k]);
873 			dml_print("DML::%s: k=%0d meta_row_bw=%f\n", __func__, k, v->meta_row_bw[k]);
874 			dml_print("DML::%s: k=%0d dpte_row_bw=%f\n", __func__, k, v->dpte_row_bw[k]);
875 			dml_print("DML::%s: k=%0d RequiredPrefetchPixDataBWLuma=%f\n", __func__, k,
876 					v->RequiredPrefetchPixDataBWLuma[k]);
877 			dml_print("DML::%s: k=%0d RequiredPrefetchPixDataBWChroma=%f\n", __func__, k,
878 					v->RequiredPrefetchPixDataBWChroma[k]);
879 			dml_print("DML::%s: k=%0d cursor_bw_pre=%f\n", __func__, k, v->cursor_bw_pre[k]);
880 			dml_print("DML::%s: k=%0d MaxTotalRDBandwidthNoUrgentBurst=%f\n", __func__, k,
881 					MaxTotalRDBandwidthNoUrgentBurst);
882 #endif
883 			if (v->DestinationLinesForPrefetch[k] < 2)
884 				DestinationLineTimesForPrefetchLessThan2 = true;
885 
886 			if (v->VRatioPrefetchY[k] > __DML_MAX_VRATIO_PRE__
887 					|| v->VRatioPrefetchC[k] > __DML_MAX_VRATIO_PRE__)
888 				VRatioPrefetchMoreThanMax = true;
889 
890 			//bool DestinationLinesToRequestVMInVBlankEqualOrMoreThan32 = false;
891 			//bool DestinationLinesToRequestRowInVBlankEqualOrMoreThan16 = false;
892 			//if (v->DestinationLinesToRequestVMInVBlank[k] >= 32) {
893 			//    DestinationLinesToRequestVMInVBlankEqualOrMoreThan32 = true;
894 			//}
895 
896 			//if (v->DestinationLinesToRequestRowInVBlank[k] >= 16) {
897 			//    DestinationLinesToRequestRowInVBlankEqualOrMoreThan16 = true;
898 			//}
899 		}
900 
901 		v->FractionOfUrgentBandwidth = MaxTotalRDBandwidthNoUrgentBurst / mode_lib->vba.ReturnBW;
902 
903 #ifdef __DML_VBA_DEBUG__
904 		dml_print("DML::%s: MaxTotalRDBandwidthNoUrgentBurst=%f\n",
905 				__func__, MaxTotalRDBandwidthNoUrgentBurst);
906 		dml_print("DML::%s: ReturnBW=%f\n", __func__, mode_lib->vba.ReturnBW);
907 		dml_print("DML::%s: FractionOfUrgentBandwidth=%f\n",
908 				__func__, mode_lib->vba.FractionOfUrgentBandwidth);
909 #endif
910 
911 		{
912 			dml32_CalculatePrefetchBandwithSupport(
913 					mode_lib->vba.NumberOfActiveSurfaces,
914 					mode_lib->vba.ReturnBW,
915 					v->NoUrgentLatencyHidingPre,
916 					v->ReadBandwidthSurfaceLuma,
917 					v->ReadBandwidthSurfaceChroma,
918 					v->RequiredPrefetchPixDataBWLuma,
919 					v->RequiredPrefetchPixDataBWChroma,
920 					v->cursor_bw,
921 					v->meta_row_bw,
922 					v->dpte_row_bw,
923 					v->cursor_bw_pre,
924 					v->prefetch_vmrow_bw,
925 					mode_lib->vba.DPPPerPlane,
926 					v->UrgBurstFactorLuma,
927 					v->UrgBurstFactorChroma,
928 					v->UrgBurstFactorCursor,
929 					v->UrgBurstFactorLumaPre,
930 					v->UrgBurstFactorChromaPre,
931 					v->UrgBurstFactorCursorPre,
932 
933 					/* output */
934 					&MaxTotalRDBandwidth,
935 					&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[0],
936 					&v->PrefetchModeSupported);
937 		}
938 
939 		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
940 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector[k] = 1.0;
941 
942 		{
943 			dml32_CalculatePrefetchBandwithSupport(mode_lib->vba.NumberOfActiveSurfaces,
944 					mode_lib->vba.ReturnBW,
945 					v->NoUrgentLatencyHidingPre,
946 					v->ReadBandwidthSurfaceLuma,
947 					v->ReadBandwidthSurfaceChroma,
948 					v->RequiredPrefetchPixDataBWLuma,
949 					v->RequiredPrefetchPixDataBWChroma,
950 					v->cursor_bw,
951 					v->meta_row_bw,
952 					v->dpte_row_bw,
953 					v->cursor_bw_pre,
954 					v->prefetch_vmrow_bw,
955 					mode_lib->vba.DPPPerPlane,
956 					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
957 					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
958 					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
959 					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
960 					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
961 					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
962 
963 					/* output */
964 					&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[0],
965 					&v->FractionOfUrgentBandwidth,
966 					&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean);
967 		}
968 
969 		if (VRatioPrefetchMoreThanMax != false || DestinationLineTimesForPrefetchLessThan2 != false) {
970 			v->PrefetchModeSupported = false;
971 		}
972 
973 		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
974 			if (v->ErrorResult[k] == true || v->NotEnoughTimeForDynamicMetadata[k]) {
975 				v->PrefetchModeSupported = false;
976 			}
977 		}
978 
979 		if (v->PrefetchModeSupported == true && mode_lib->vba.ImmediateFlipSupport == true) {
980 			mode_lib->vba.BandwidthAvailableForImmediateFlip = dml32_CalculateBandwidthAvailableForImmediateFlip(
981 					mode_lib->vba.NumberOfActiveSurfaces,
982 					mode_lib->vba.ReturnBW,
983 					v->ReadBandwidthSurfaceLuma,
984 					v->ReadBandwidthSurfaceChroma,
985 					v->RequiredPrefetchPixDataBWLuma,
986 					v->RequiredPrefetchPixDataBWChroma,
987 					v->cursor_bw,
988 					v->cursor_bw_pre,
989 					mode_lib->vba.DPPPerPlane,
990 					v->UrgBurstFactorLuma,
991 					v->UrgBurstFactorChroma,
992 					v->UrgBurstFactorCursor,
993 					v->UrgBurstFactorLumaPre,
994 					v->UrgBurstFactorChromaPre,
995 					v->UrgBurstFactorCursorPre);
996 
997 			mode_lib->vba.TotImmediateFlipBytes = 0;
998 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
999 				if (mode_lib->vba.ImmediateFlipRequirement[k] != dm_immediate_flip_not_required) {
1000 					mode_lib->vba.TotImmediateFlipBytes = mode_lib->vba.TotImmediateFlipBytes
1001 							+ mode_lib->vba.DPPPerPlane[k]
1002 									* (v->PDEAndMetaPTEBytesFrame[k]
1003 											+ v->MetaRowByte[k]);
1004 					if (v->use_one_row_for_frame_flip[k][0][0]) {
1005 						mode_lib->vba.TotImmediateFlipBytes =
1006 								mode_lib->vba.TotImmediateFlipBytes
1007 										+ 2 * v->PixelPTEBytesPerRow[k];
1008 					} else {
1009 						mode_lib->vba.TotImmediateFlipBytes =
1010 								mode_lib->vba.TotImmediateFlipBytes
1011 										+ v->PixelPTEBytesPerRow[k];
1012 					}
1013 				}
1014 			}
1015 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
1016 				dml32_CalculateFlipSchedule(v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor,
1017 						v->UrgentExtraLatency,
1018 						v->UrgentLatency,
1019 						mode_lib->vba.GPUVMMaxPageTableLevels,
1020 						mode_lib->vba.HostVMEnable,
1021 						mode_lib->vba.HostVMMaxNonCachedPageTableLevels,
1022 						mode_lib->vba.GPUVMEnable,
1023 						mode_lib->vba.HostVMMinPageSize,
1024 						v->PDEAndMetaPTEBytesFrame[k],
1025 						v->MetaRowByte[k],
1026 						v->PixelPTEBytesPerRow[k],
1027 						mode_lib->vba.BandwidthAvailableForImmediateFlip,
1028 						mode_lib->vba.TotImmediateFlipBytes,
1029 						mode_lib->vba.SourcePixelFormat[k],
1030 						mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
1031 						mode_lib->vba.VRatio[k],
1032 						mode_lib->vba.VRatioChroma[k],
1033 						v->Tno_bw[k],
1034 						mode_lib->vba.DCCEnable[k],
1035 						v->dpte_row_height[k],
1036 						v->meta_row_height[k],
1037 						v->dpte_row_height_chroma[k],
1038 						v->meta_row_height_chroma[k],
1039 						v->Use_One_Row_For_Frame_Flip[k],
1040 
1041 						/* Output */
1042 						&v->DestinationLinesToRequestVMInImmediateFlip[k],
1043 						&v->DestinationLinesToRequestRowInImmediateFlip[k],
1044 						&v->final_flip_bw[k],
1045 						&v->ImmediateFlipSupportedForPipe[k]);
1046 			}
1047 
1048 			{
1049 				dml32_CalculateImmediateFlipBandwithSupport(mode_lib->vba.NumberOfActiveSurfaces,
1050 						mode_lib->vba.ReturnBW,
1051 						mode_lib->vba.ImmediateFlipRequirement,
1052 						v->final_flip_bw,
1053 						v->ReadBandwidthSurfaceLuma,
1054 						v->ReadBandwidthSurfaceChroma,
1055 						v->RequiredPrefetchPixDataBWLuma,
1056 						v->RequiredPrefetchPixDataBWChroma,
1057 						v->cursor_bw,
1058 						v->meta_row_bw,
1059 						v->dpte_row_bw,
1060 						v->cursor_bw_pre,
1061 						v->prefetch_vmrow_bw,
1062 						mode_lib->vba.DPPPerPlane,
1063 						v->UrgBurstFactorLuma,
1064 						v->UrgBurstFactorChroma,
1065 						v->UrgBurstFactorCursor,
1066 						v->UrgBurstFactorLumaPre,
1067 						v->UrgBurstFactorChromaPre,
1068 						v->UrgBurstFactorCursorPre,
1069 
1070 						/* output */
1071 						&v->total_dcn_read_bw_with_flip,    // Single  *TotalBandwidth
1072 						&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[0],                        // Single  *FractionOfUrgentBandwidth
1073 						&v->ImmediateFlipSupported);        // Boolean *ImmediateFlipBandwidthSupport
1074 
1075 				dml32_CalculateImmediateFlipBandwithSupport(mode_lib->vba.NumberOfActiveSurfaces,
1076 						mode_lib->vba.ReturnBW,
1077 						mode_lib->vba.ImmediateFlipRequirement,
1078 						v->final_flip_bw,
1079 						v->ReadBandwidthSurfaceLuma,
1080 						v->ReadBandwidthSurfaceChroma,
1081 						v->RequiredPrefetchPixDataBWLuma,
1082 						v->RequiredPrefetchPixDataBWChroma,
1083 						v->cursor_bw,
1084 						v->meta_row_bw,
1085 						v->dpte_row_bw,
1086 						v->cursor_bw_pre,
1087 						v->prefetch_vmrow_bw,
1088 						mode_lib->vba.DPPPerPlane,
1089 						v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
1090 						v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
1091 						v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
1092 						v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
1093 						v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
1094 						v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
1095 
1096 						/* output */
1097 						&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[1],                                // Single  *TotalBandwidth
1098 						&v->FractionOfUrgentBandwidthImmediateFlip, // Single  *FractionOfUrgentBandwidth
1099 						&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean);                              // Boolean *ImmediateFlipBandwidthSupport
1100 			}
1101 
1102 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
1103 				if (mode_lib->vba.ImmediateFlipRequirement[k] != dm_immediate_flip_not_required && v->ImmediateFlipSupportedForPipe[k] == false) {
1104 					v->ImmediateFlipSupported = false;
1105 #ifdef __DML_VBA_DEBUG__
1106 					dml_print("DML::%s: Pipe %0d not supporting iflip\n", __func__, k);
1107 #endif
1108 				}
1109 			}
1110 		} else {
1111 			v->ImmediateFlipSupported = false;
1112 		}
1113 
1114 		/* consider flip support is okay if the flip bw is ok or (when user does't require a iflip and there is no host vm) */
1115 		v->PrefetchAndImmediateFlipSupported = (v->PrefetchModeSupported == true &&
1116 				((!mode_lib->vba.ImmediateFlipSupport && !mode_lib->vba.HostVMEnable && !ImmediateFlipRequirementFinal) ||
1117 						v->ImmediateFlipSupported)) ? true : false;
1118 
1119 #ifdef __DML_VBA_DEBUG__
1120 		dml_print("DML::%s: PrefetchModeSupported = %d\n", __func__, locals->PrefetchModeSupported);
1121 		for (uint k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
1122 			dml_print("DML::%s: ImmediateFlipRequirement[%d] = %d\n", __func__, k,  mode_lib->vba.ImmediateFlipRequirement[k] == dm_immediate_flip_required);
1123 		dml_print("DML::%s: ImmediateFlipSupported = %d\n", __func__, locals->ImmediateFlipSupported);
1124 		dml_print("DML::%s: ImmediateFlipSupport = %d\n", __func__, mode_lib->vba.ImmediateFlipSupport);
1125 		dml_print("DML::%s: HostVMEnable = %d\n", __func__, mode_lib->vba.HostVMEnable);
1126 		dml_print("DML::%s: PrefetchAndImmediateFlipSupported = %d\n", __func__, locals->PrefetchAndImmediateFlipSupported);
1127 		dml_print("DML::%s: Done loop: Vstartup=%d, Max Vstartup=%d\n", __func__, locals->VStartupLines, locals->MaximumMaxVStartupLines);
1128 #endif
1129 
1130 		v->VStartupLines = v->VStartupLines + 1;
1131 
1132 		if (v->VStartupLines > v->MaximumMaxVStartupLines) {
1133 #ifdef __DML_VBA_DEBUG__
1134 			dml_print("DML::%s: Vstartup exceeds max vstartup, exiting loop\n", __func__);
1135 #endif
1136 			break; // VBA_DELTA: Implementation divergence! Gabe is *still* iterating across prefetch modes which we don't care to do
1137 		}
1138 		iteration++;
1139 		if (iteration > 2500) {
1140 #ifdef __DML_VBA_DEBUG__
1141 			dml_print("DML::%s: too many errors, exit now\n", __func__);
1142 			assert(0);
1143 #endif
1144 		}
1145 	} while (!(v->PrefetchAndImmediateFlipSupported || NextPrefetchMode > mode_lib->vba.MaxPrefetchMode));
1146 
1147 
1148 	if (v->VStartupLines <= v->MaximumMaxVStartupLines) {
1149 #ifdef __DML_VBA_DEBUG__
1150 		dml_print("DML::%s: Good, Prefetch and flip scheduling found solution at VStartupLines=%d\n", __func__, locals->VStartupLines-1);
1151 #endif
1152 	}
1153 
1154 
1155 	//Watermarks and NB P-State/DRAM Clock Change Support
1156 	{
1157 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.UrgentLatency = v->UrgentLatency;
1158 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.ExtraLatency = v->UrgentExtraLatency;
1159 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.WritebackLatency = mode_lib->vba.WritebackLatency;
1160 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.DRAMClockChangeLatency = mode_lib->vba.DRAMClockChangeLatency;
1161 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.FCLKChangeLatency = mode_lib->vba.FCLKChangeLatency;
1162 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SRExitTime = mode_lib->vba.SRExitTime;
1163 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SREnterPlusExitTime = mode_lib->vba.SREnterPlusExitTime;
1164 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SRExitZ8Time = mode_lib->vba.SRExitZ8Time;
1165 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SREnterPlusExitZ8Time = mode_lib->vba.SREnterPlusExitZ8Time;
1166 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.USRRetrainingLatency = mode_lib->vba.USRRetrainingLatency;
1167 		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SMNLatency = mode_lib->vba.SMNLatency;
1168 
1169 		dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport(
1170 			&v->dummy_vars.dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport,
1171 			mode_lib->vba.USRRetrainingRequiredFinal,
1172 			mode_lib->vba.UsesMALLForPStateChange,
1173 			mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb],
1174 			mode_lib->vba.NumberOfActiveSurfaces,
1175 			mode_lib->vba.MaxLineBufferLines,
1176 			mode_lib->vba.LineBufferSizeFinal,
1177 			mode_lib->vba.WritebackInterfaceBufferSize,
1178 			mode_lib->vba.DCFCLK,
1179 			mode_lib->vba.ReturnBW,
1180 			mode_lib->vba.SynchronizeTimingsFinal,
1181 			mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
1182 			mode_lib->vba.DRRDisplay,
1183 			v->dpte_group_bytes,
1184 			v->meta_row_height,
1185 			v->meta_row_height_chroma,
1186 			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters,
1187 			mode_lib->vba.WritebackChunkSize,
1188 			mode_lib->vba.SOCCLK,
1189 			v->DCFCLKDeepSleep,
1190 			mode_lib->vba.DETBufferSizeY,
1191 			mode_lib->vba.DETBufferSizeC,
1192 			mode_lib->vba.SwathHeightY,
1193 			mode_lib->vba.SwathHeightC,
1194 			mode_lib->vba.LBBitPerPixel,
1195 			v->SwathWidthY,
1196 			v->SwathWidthC,
1197 			mode_lib->vba.HRatio,
1198 			mode_lib->vba.HRatioChroma,
1199 			mode_lib->vba.vtaps,
1200 			mode_lib->vba.VTAPsChroma,
1201 			mode_lib->vba.VRatio,
1202 			mode_lib->vba.VRatioChroma,
1203 			mode_lib->vba.HTotal,
1204 			mode_lib->vba.VTotal,
1205 			mode_lib->vba.VActive,
1206 			mode_lib->vba.PixelClock,
1207 			mode_lib->vba.BlendingAndTiming,
1208 			mode_lib->vba.DPPPerPlane,
1209 			v->BytePerPixelDETY,
1210 			v->BytePerPixelDETC,
1211 			v->DSTXAfterScaler,
1212 			v->DSTYAfterScaler,
1213 			mode_lib->vba.WritebackEnable,
1214 			mode_lib->vba.WritebackPixelFormat,
1215 			mode_lib->vba.WritebackDestinationWidth,
1216 			mode_lib->vba.WritebackDestinationHeight,
1217 			mode_lib->vba.WritebackSourceHeight,
1218 			v->UnboundedRequestEnabled,
1219 			v->CompressedBufferSizeInkByte,
1220 
1221 			/* Output */
1222 			&v->Watermark,
1223 			&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_dramchange_support,
1224 			v->MaxActiveDRAMClockChangeLatencySupported,
1225 			v->SubViewportLinesNeededInMALL,
1226 			&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_fclkchange_support,
1227 			&v->MinActiveFCLKChangeLatencySupported,
1228 			&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_USRRetrainingSupport,
1229 			mode_lib->vba.ActiveDRAMClockChangeLatencyMargin);
1230 
1231 		/* DCN32 has a new struct Watermarks (typedef) which is used to store
1232 		 * calculated WM values. Copy over values from struct to vba varaibles
1233 		 * to ensure that the DCN32 getters return the correct value.
1234 		 */
1235 		v->UrgentWatermark = v->Watermark.UrgentWatermark;
1236 		v->WritebackUrgentWatermark = v->Watermark.WritebackUrgentWatermark;
1237 		v->DRAMClockChangeWatermark = v->Watermark.DRAMClockChangeWatermark;
1238 		v->WritebackDRAMClockChangeWatermark = v->Watermark.WritebackDRAMClockChangeWatermark;
1239 		v->StutterExitWatermark = v->Watermark.StutterExitWatermark;
1240 		v->StutterEnterPlusExitWatermark = v->Watermark.StutterEnterPlusExitWatermark;
1241 		v->Z8StutterExitWatermark = v->Watermark.Z8StutterExitWatermark;
1242 		v->Z8StutterEnterPlusExitWatermark = v->Watermark.Z8StutterEnterPlusExitWatermark;
1243 
1244 		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
1245 			if (mode_lib->vba.WritebackEnable[k] == true) {
1246 				v->WritebackAllowDRAMClockChangeEndPosition[k] = dml_max(0,
1247 						v->VStartup[k] * mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]
1248 								- v->Watermark.WritebackDRAMClockChangeWatermark);
1249 				v->WritebackAllowFCLKChangeEndPosition[k] = dml_max(0,
1250 						v->VStartup[k] * mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]
1251 								- v->Watermark.WritebackFCLKChangeWatermark);
1252 			} else {
1253 				v->WritebackAllowDRAMClockChangeEndPosition[k] = 0;
1254 				v->WritebackAllowFCLKChangeEndPosition[k] = 0;
1255 			}
1256 		}
1257 	}
1258 
1259 	//Display Pipeline Delivery Time in Prefetch, Groups
1260 	dml32_CalculatePixelDeliveryTimes(
1261 			mode_lib->vba.NumberOfActiveSurfaces,
1262 			mode_lib->vba.VRatio,
1263 			mode_lib->vba.VRatioChroma,
1264 			v->VRatioPrefetchY,
1265 			v->VRatioPrefetchC,
1266 			v->swath_width_luma_ub,
1267 			v->swath_width_chroma_ub,
1268 			mode_lib->vba.DPPPerPlane,
1269 			mode_lib->vba.HRatio,
1270 			mode_lib->vba.HRatioChroma,
1271 			mode_lib->vba.PixelClock,
1272 			v->PSCL_THROUGHPUT_LUMA,
1273 			v->PSCL_THROUGHPUT_CHROMA,
1274 			mode_lib->vba.DPPCLK,
1275 			v->BytePerPixelC,
1276 			mode_lib->vba.SourceRotation,
1277 			mode_lib->vba.NumberOfCursors,
1278 			mode_lib->vba.CursorWidth,
1279 			mode_lib->vba.CursorBPP,
1280 			v->BlockWidth256BytesY,
1281 			v->BlockHeight256BytesY,
1282 			v->BlockWidth256BytesC,
1283 			v->BlockHeight256BytesC,
1284 
1285 			/* Output */
1286 			v->DisplayPipeLineDeliveryTimeLuma,
1287 			v->DisplayPipeLineDeliveryTimeChroma,
1288 			v->DisplayPipeLineDeliveryTimeLumaPrefetch,
1289 			v->DisplayPipeLineDeliveryTimeChromaPrefetch,
1290 			v->DisplayPipeRequestDeliveryTimeLuma,
1291 			v->DisplayPipeRequestDeliveryTimeChroma,
1292 			v->DisplayPipeRequestDeliveryTimeLumaPrefetch,
1293 			v->DisplayPipeRequestDeliveryTimeChromaPrefetch,
1294 			v->CursorRequestDeliveryTime,
1295 			v->CursorRequestDeliveryTimePrefetch);
1296 
1297 	dml32_CalculateMetaAndPTETimes(v->Use_One_Row_For_Frame,
1298 			mode_lib->vba.NumberOfActiveSurfaces,
1299 			mode_lib->vba.GPUVMEnable,
1300 			mode_lib->vba.MetaChunkSize,
1301 			mode_lib->vba.MinMetaChunkSizeBytes,
1302 			mode_lib->vba.HTotal,
1303 			mode_lib->vba.VRatio,
1304 			mode_lib->vba.VRatioChroma,
1305 			v->DestinationLinesToRequestRowInVBlank,
1306 			v->DestinationLinesToRequestRowInImmediateFlip,
1307 			mode_lib->vba.DCCEnable,
1308 			mode_lib->vba.PixelClock,
1309 			v->BytePerPixelY,
1310 			v->BytePerPixelC,
1311 			mode_lib->vba.SourceRotation,
1312 			v->dpte_row_height,
1313 			v->dpte_row_height_chroma,
1314 			v->meta_row_width,
1315 			v->meta_row_width_chroma,
1316 			v->meta_row_height,
1317 			v->meta_row_height_chroma,
1318 			v->meta_req_width,
1319 			v->meta_req_width_chroma,
1320 			v->meta_req_height,
1321 			v->meta_req_height_chroma,
1322 			v->dpte_group_bytes,
1323 			v->PTERequestSizeY,
1324 			v->PTERequestSizeC,
1325 			v->PixelPTEReqWidthY,
1326 			v->PixelPTEReqHeightY,
1327 			v->PixelPTEReqWidthC,
1328 			v->PixelPTEReqHeightC,
1329 			v->dpte_row_width_luma_ub,
1330 			v->dpte_row_width_chroma_ub,
1331 
1332 			/* Output */
1333 			v->DST_Y_PER_PTE_ROW_NOM_L,
1334 			v->DST_Y_PER_PTE_ROW_NOM_C,
1335 			v->DST_Y_PER_META_ROW_NOM_L,
1336 			v->DST_Y_PER_META_ROW_NOM_C,
1337 			v->TimePerMetaChunkNominal,
1338 			v->TimePerChromaMetaChunkNominal,
1339 			v->TimePerMetaChunkVBlank,
1340 			v->TimePerChromaMetaChunkVBlank,
1341 			v->TimePerMetaChunkFlip,
1342 			v->TimePerChromaMetaChunkFlip,
1343 			v->time_per_pte_group_nom_luma,
1344 			v->time_per_pte_group_vblank_luma,
1345 			v->time_per_pte_group_flip_luma,
1346 			v->time_per_pte_group_nom_chroma,
1347 			v->time_per_pte_group_vblank_chroma,
1348 			v->time_per_pte_group_flip_chroma);
1349 
1350 	dml32_CalculateVMGroupAndRequestTimes(
1351 			mode_lib->vba.NumberOfActiveSurfaces,
1352 			mode_lib->vba.GPUVMEnable,
1353 			mode_lib->vba.GPUVMMaxPageTableLevels,
1354 			mode_lib->vba.HTotal,
1355 			v->BytePerPixelC,
1356 			v->DestinationLinesToRequestVMInVBlank,
1357 			v->DestinationLinesToRequestVMInImmediateFlip,
1358 			mode_lib->vba.DCCEnable,
1359 			mode_lib->vba.PixelClock,
1360 			v->dpte_row_width_luma_ub,
1361 			v->dpte_row_width_chroma_ub,
1362 			v->vm_group_bytes,
1363 			v->dpde0_bytes_per_frame_ub_l,
1364 			v->dpde0_bytes_per_frame_ub_c,
1365 			v->meta_pte_bytes_per_frame_ub_l,
1366 			v->meta_pte_bytes_per_frame_ub_c,
1367 
1368 			/* Output */
1369 			v->TimePerVMGroupVBlank,
1370 			v->TimePerVMGroupFlip,
1371 			v->TimePerVMRequestVBlank,
1372 			v->TimePerVMRequestFlip);
1373 
1374 	// Min TTUVBlank
1375 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
1376 		if (mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] == 0) {
1377 			v->MinTTUVBlank[k] = dml_max4(v->Watermark.DRAMClockChangeWatermark,
1378 					v->Watermark.FCLKChangeWatermark, v->Watermark.StutterEnterPlusExitWatermark,
1379 					v->Watermark.UrgentWatermark);
1380 		} else if (mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb]
1381 				== 1) {
1382 			v->MinTTUVBlank[k] = dml_max3(v->Watermark.FCLKChangeWatermark,
1383 					v->Watermark.StutterEnterPlusExitWatermark, v->Watermark.UrgentWatermark);
1384 		} else if (mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb]
1385 				== 2) {
1386 			v->MinTTUVBlank[k] = dml_max(v->Watermark.StutterEnterPlusExitWatermark,
1387 					v->Watermark.UrgentWatermark);
1388 		} else {
1389 			v->MinTTUVBlank[k] = v->Watermark.UrgentWatermark;
1390 		}
1391 		if (!mode_lib->vba.DynamicMetadataEnable[k])
1392 			v->MinTTUVBlank[k] = mode_lib->vba.TCalc + v->MinTTUVBlank[k];
1393 	}
1394 
1395 	// DCC Configuration
1396 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
1397 #ifdef __DML_VBA_DEBUG__
1398 		dml_print("DML::%s: Calculate DCC configuration for surface k=%d\n", __func__, k);
1399 #endif
1400 		dml32_CalculateDCCConfiguration(
1401 				mode_lib->vba.DCCEnable[k],
1402 				mode_lib->vba.DCCProgrammingAssumesScanDirectionUnknownFinal,
1403 				mode_lib->vba.SourcePixelFormat[k], mode_lib->vba.SurfaceWidthY[k],
1404 				mode_lib->vba.SurfaceWidthC[k],
1405 				mode_lib->vba.SurfaceHeightY[k],
1406 				mode_lib->vba.SurfaceHeightC[k],
1407 				mode_lib->vba.nomDETInKByte,
1408 				v->BlockHeight256BytesY[k],
1409 				v->BlockHeight256BytesC[k],
1410 				mode_lib->vba.SurfaceTiling[k],
1411 				v->BytePerPixelY[k],
1412 				v->BytePerPixelC[k],
1413 				v->BytePerPixelDETY[k],
1414 				v->BytePerPixelDETC[k],
1415 				(enum dm_rotation_angle) mode_lib->vba.SourceScan[k],
1416 				/* Output */
1417 				&v->DCCYMaxUncompressedBlock[k],
1418 				&v->DCCCMaxUncompressedBlock[k],
1419 				&v->DCCYMaxCompressedBlock[k],
1420 				&v->DCCCMaxCompressedBlock[k],
1421 				&v->DCCYIndependentBlock[k],
1422 				&v->DCCCIndependentBlock[k]);
1423 	}
1424 
1425 	// VStartup Adjustment
1426 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
1427 		bool isInterlaceTiming;
1428 		double Tvstartup_margin = (v->MaxVStartupLines[k] - v->VStartup[k]) * mode_lib->vba.HTotal[k]
1429 				/ mode_lib->vba.PixelClock[k];
1430 #ifdef __DML_VBA_DEBUG__
1431 		dml_print("DML::%s: k=%d, MinTTUVBlank = %f (before vstartup margin)\n", __func__, k,
1432 				v->MinTTUVBlank[k]);
1433 #endif
1434 
1435 		v->MinTTUVBlank[k] = v->MinTTUVBlank[k] + Tvstartup_margin;
1436 
1437 #ifdef __DML_VBA_DEBUG__
1438 		dml_print("DML::%s: k=%d, Tvstartup_margin = %f\n", __func__, k, Tvstartup_margin);
1439 		dml_print("DML::%s: k=%d, MaxVStartupLines = %d\n", __func__, k, v->MaxVStartupLines[k]);
1440 		dml_print("DML::%s: k=%d, VStartup = %d\n", __func__, k, v->VStartup[k]);
1441 		dml_print("DML::%s: k=%d, MinTTUVBlank = %f\n", __func__, k, v->MinTTUVBlank[k]);
1442 #endif
1443 
1444 		v->Tdmdl[k] = v->Tdmdl[k] + Tvstartup_margin;
1445 		if (mode_lib->vba.DynamicMetadataEnable[k] && mode_lib->vba.DynamicMetadataVMEnabled)
1446 			v->Tdmdl_vm[k] = v->Tdmdl_vm[k] + Tvstartup_margin;
1447 
1448 		isInterlaceTiming = (mode_lib->vba.Interlace[k] &&
1449 				!mode_lib->vba.ProgressiveToInterlaceUnitInOPP);
1450 
1451 		v->MIN_DST_Y_NEXT_START[k] = ((isInterlaceTiming ? dml_floor((mode_lib->vba.VTotal[k] -
1452 						mode_lib->vba.VFrontPorch[k]) / 2.0, 1.0) :
1453 						mode_lib->vba.VTotal[k]) - mode_lib->vba.VFrontPorch[k])
1454 						+ dml_max(1.0,
1455 						dml_ceil(v->WritebackDelay[mode_lib->vba.VoltageLevel][k]
1456 						/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]), 1.0))
1457 						+ dml_floor(4.0 * v->TSetup[k] / (mode_lib->vba.HTotal[k]
1458 						/ mode_lib->vba.PixelClock[k]), 1.0) / 4.0;
1459 
1460 		v->VStartup[k] = (isInterlaceTiming ? (2 * v->MaxVStartupLines[k]) : v->MaxVStartupLines[k]);
1461 
1462 		if (((v->VUpdateOffsetPix[k] + v->VUpdateWidthPix[k] + v->VReadyOffsetPix[k])
1463 			/ mode_lib->vba.HTotal[k]) <= (isInterlaceTiming ? dml_floor((mode_lib->vba.VTotal[k]
1464 			- mode_lib->vba.VActive[k] - mode_lib->vba.VFrontPorch[k] - v->VStartup[k]) / 2.0, 1.0) :
1465 			(int) (mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]
1466 		       - mode_lib->vba.VFrontPorch[k] - v->VStartup[k]))) {
1467 			v->VREADY_AT_OR_AFTER_VSYNC[k] = true;
1468 		} else {
1469 			v->VREADY_AT_OR_AFTER_VSYNC[k] = false;
1470 		}
1471 #ifdef __DML_VBA_DEBUG__
1472 		dml_print("DML::%s: k=%d, VStartup = %d (max)\n", __func__, k, v->VStartup[k]);
1473 		dml_print("DML::%s: k=%d, VUpdateOffsetPix = %d\n", __func__, k, v->VUpdateOffsetPix[k]);
1474 		dml_print("DML::%s: k=%d, VUpdateWidthPix = %d\n", __func__, k, v->VUpdateWidthPix[k]);
1475 		dml_print("DML::%s: k=%d, VReadyOffsetPix = %d\n", __func__, k, v->VReadyOffsetPix[k]);
1476 		dml_print("DML::%s: k=%d, HTotal = %d\n", __func__, k, mode_lib->vba.HTotal[k]);
1477 		dml_print("DML::%s: k=%d, VTotal = %d\n", __func__, k, mode_lib->vba.VTotal[k]);
1478 		dml_print("DML::%s: k=%d, VActive = %d\n", __func__, k, mode_lib->vba.VActive[k]);
1479 		dml_print("DML::%s: k=%d, VFrontPorch = %d\n", __func__, k, mode_lib->vba.VFrontPorch[k]);
1480 		dml_print("DML::%s: k=%d, VStartup = %d\n", __func__, k, v->VStartup[k]);
1481 		dml_print("DML::%s: k=%d, TSetup = %f\n", __func__, k, v->TSetup[k]);
1482 		dml_print("DML::%s: k=%d, MIN_DST_Y_NEXT_START = %f\n", __func__, k, v->MIN_DST_Y_NEXT_START[k]);
1483 		dml_print("DML::%s: k=%d, VREADY_AT_OR_AFTER_VSYNC = %d\n", __func__, k,
1484 				v->VREADY_AT_OR_AFTER_VSYNC[k]);
1485 #endif
1486 	}
1487 
1488 	{
1489 		//Maximum Bandwidth Used
1490 		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
1491 			if (mode_lib->vba.WritebackEnable[k] == true
1492 					&& mode_lib->vba.WritebackPixelFormat[k] == dm_444_32) {
1493 				WRBandwidth = mode_lib->vba.WritebackDestinationWidth[k]
1494 						* mode_lib->vba.WritebackDestinationHeight[k]
1495 						/ (mode_lib->vba.HTotal[k] * mode_lib->vba.WritebackSourceHeight[k]
1496 								/ mode_lib->vba.PixelClock[k]) * 4;
1497 			} else if (mode_lib->vba.WritebackEnable[k] == true) {
1498 				WRBandwidth = mode_lib->vba.WritebackDestinationWidth[k]
1499 						* mode_lib->vba.WritebackDestinationHeight[k]
1500 						/ (mode_lib->vba.HTotal[k] * mode_lib->vba.WritebackSourceHeight[k]
1501 								/ mode_lib->vba.PixelClock[k]) * 8;
1502 			}
1503 			TotalWRBandwidth = TotalWRBandwidth + WRBandwidth;
1504 		}
1505 
1506 		v->TotalDataReadBandwidth = 0;
1507 		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
1508 			v->TotalDataReadBandwidth = v->TotalDataReadBandwidth + v->ReadBandwidthSurfaceLuma[k]
1509 					+ v->ReadBandwidthSurfaceChroma[k];
1510 #ifdef __DML_VBA_DEBUG__
1511 			dml_print("DML::%s: k=%d, TotalDataReadBandwidth = %f\n",
1512 					__func__, k, v->TotalDataReadBandwidth);
1513 			dml_print("DML::%s: k=%d, ReadBandwidthSurfaceLuma = %f\n",
1514 					__func__, k, v->ReadBandwidthSurfaceLuma[k]);
1515 			dml_print("DML::%s: k=%d, ReadBandwidthSurfaceChroma = %f\n",
1516 					__func__, k, v->ReadBandwidthSurfaceChroma[k]);
1517 #endif
1518 		}
1519 	}
1520 
1521 	// Stutter Efficiency
1522 	dml32_CalculateStutterEfficiency(v->CompressedBufferSizeInkByte,
1523 			mode_lib->vba.UsesMALLForPStateChange,
1524 			v->UnboundedRequestEnabled,
1525 			mode_lib->vba.MetaFIFOSizeInKEntries,
1526 			mode_lib->vba.ZeroSizeBufferEntries,
1527 			mode_lib->vba.PixelChunkSizeInKByte,
1528 			mode_lib->vba.NumberOfActiveSurfaces,
1529 			mode_lib->vba.ROBBufferSizeInKByte,
1530 			v->TotalDataReadBandwidth,
1531 			mode_lib->vba.DCFCLK,
1532 			mode_lib->vba.ReturnBW,
1533 			v->CompbufReservedSpace64B,
1534 			v->CompbufReservedSpaceZs,
1535 			mode_lib->vba.SRExitTime,
1536 			mode_lib->vba.SRExitZ8Time,
1537 			mode_lib->vba.SynchronizeTimingsFinal,
1538 			mode_lib->vba.BlendingAndTiming,
1539 			v->Watermark.StutterEnterPlusExitWatermark,
1540 			v->Watermark.Z8StutterEnterPlusExitWatermark,
1541 			mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
1542 			mode_lib->vba.Interlace,
1543 			v->MinTTUVBlank, mode_lib->vba.DPPPerPlane,
1544 			mode_lib->vba.DETBufferSizeY,
1545 			v->BytePerPixelY,
1546 			v->BytePerPixelDETY,
1547 			v->SwathWidthY,
1548 			mode_lib->vba.SwathHeightY,
1549 			mode_lib->vba.SwathHeightC,
1550 			mode_lib->vba.DCCRateLuma,
1551 			mode_lib->vba.DCCRateChroma,
1552 			mode_lib->vba.DCCFractionOfZeroSizeRequestsLuma,
1553 			mode_lib->vba.DCCFractionOfZeroSizeRequestsChroma,
1554 			mode_lib->vba.HTotal, mode_lib->vba.VTotal,
1555 			mode_lib->vba.PixelClock,
1556 			mode_lib->vba.VRatio,
1557 			mode_lib->vba.SourceRotation,
1558 			v->BlockHeight256BytesY,
1559 			v->BlockWidth256BytesY,
1560 			v->BlockHeight256BytesC,
1561 			v->BlockWidth256BytesC,
1562 			v->DCCYMaxUncompressedBlock,
1563 			v->DCCCMaxUncompressedBlock,
1564 			mode_lib->vba.VActive,
1565 			mode_lib->vba.DCCEnable,
1566 			mode_lib->vba.WritebackEnable,
1567 			v->ReadBandwidthSurfaceLuma,
1568 			v->ReadBandwidthSurfaceChroma,
1569 			v->meta_row_bw,
1570 			v->dpte_row_bw,
1571 			/* Output */
1572 			&v->StutterEfficiencyNotIncludingVBlank,
1573 			&v->StutterEfficiency,
1574 			&v->NumberOfStutterBurstsPerFrame,
1575 			&v->Z8StutterEfficiencyNotIncludingVBlank,
1576 			&v->Z8StutterEfficiency,
1577 			&v->Z8NumberOfStutterBurstsPerFrame,
1578 			&v->StutterPeriod,
1579 			&v->DCHUBBUB_ARB_CSTATE_MAX_CAP_MODE);
1580 
1581 #ifdef __DML_VBA_ALLOW_DELTA__
1582 	{
1583 		unsigned int dummy_integer[1];
1584 
1585 		// Calculate z8 stutter eff assuming 0 reserved space
1586 		dml32_CalculateStutterEfficiency(v->CompressedBufferSizeInkByte,
1587 				mode_lib->vba.UsesMALLForPStateChange,
1588 				v->UnboundedRequestEnabled,
1589 				mode_lib->vba.MetaFIFOSizeInKEntries,
1590 				mode_lib->vba.ZeroSizeBufferEntries,
1591 				mode_lib->vba.PixelChunkSizeInKByte,
1592 				mode_lib->vba.NumberOfActiveSurfaces,
1593 				mode_lib->vba.ROBBufferSizeInKByte,
1594 				v->TotalDataReadBandwidth,
1595 				mode_lib->vba.DCFCLK,
1596 				mode_lib->vba.ReturnBW,
1597 				0, //CompbufReservedSpace64B,
1598 				0, //CompbufReservedSpaceZs,
1599 				mode_lib->vba.SRExitTime,
1600 				mode_lib->vba.SRExitZ8Time,
1601 				mode_lib->vba.SynchronizeTimingsFinal,
1602 				mode_lib->vba.BlendingAndTiming,
1603 				v->Watermark.StutterEnterPlusExitWatermark,
1604 				v->Watermark.Z8StutterEnterPlusExitWatermark,
1605 				mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
1606 				mode_lib->vba.Interlace,
1607 				v->MinTTUVBlank,
1608 				mode_lib->vba.DPPPerPlane,
1609 				mode_lib->vba.DETBufferSizeY,
1610 				v->BytePerPixelY, v->BytePerPixelDETY,
1611 				v->SwathWidthY, mode_lib->vba.SwathHeightY,
1612 				mode_lib->vba.SwathHeightC,
1613 				mode_lib->vba.DCCRateLuma,
1614 				mode_lib->vba.DCCRateChroma,
1615 				mode_lib->vba.DCCFractionOfZeroSizeRequestsLuma,
1616 				mode_lib->vba.DCCFractionOfZeroSizeRequestsChroma,
1617 				mode_lib->vba.HTotal,
1618 				mode_lib->vba.VTotal,
1619 				mode_lib->vba.PixelClock,
1620 				mode_lib->vba.VRatio,
1621 				mode_lib->vba.SourceRotation,
1622 				v->BlockHeight256BytesY,
1623 				v->BlockWidth256BytesY,
1624 				v->BlockHeight256BytesC,
1625 				v->BlockWidth256BytesC,
1626 				v->DCCYMaxUncompressedBlock,
1627 				v->DCCCMaxUncompressedBlock,
1628 				mode_lib->vba.VActive,
1629 				mode_lib->vba.DCCEnable,
1630 				mode_lib->vba.WritebackEnable,
1631 				v->ReadBandwidthSurfaceLuma,
1632 				v->ReadBandwidthSurfaceChroma,
1633 				v->meta_row_bw, v->dpte_row_bw,
1634 
1635 				/* Output */
1636 				&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[0],
1637 				&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[1],
1638 				&dummy_integer[0],
1639 				&v->Z8StutterEfficiencyNotIncludingVBlankBestCase,
1640 				&v->Z8StutterEfficiencyBestCase,
1641 				&v->Z8NumberOfStutterBurstsPerFrameBestCase,
1642 				&v->StutterPeriodBestCase,
1643 				&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean);
1644 	}
1645 #else
1646 	v->Z8StutterEfficiencyNotIncludingVBlankBestCase = v->Z8StutterEfficiencyNotIncludingVBlank;
1647 	v->Z8StutterEfficiencyBestCase = v->Z8StutterEfficiency;
1648 	v->Z8NumberOfStutterBurstsPerFrameBestCase = v->Z8NumberOfStutterBurstsPerFrame;
1649 	v->StutterPeriodBestCase = v->StutterPeriod;
1650 #endif
1651 
1652 #ifdef __DML_VBA_DEBUG__
1653 	dml_print("DML::%s: --- END ---\n", __func__);
1654 #endif
1655 }
1656 
1657 static void mode_support_configuration(struct vba_vars_st *v,
1658 				  struct display_mode_lib *mode_lib)
1659 {
1660 	int i, j;
1661 
1662 	for (i = v->soc.num_states - 1; i >= 0; i--) {
1663 		for (j = 0; j < 2; j++) {
1664 			if (mode_lib->vba.ScaleRatioAndTapsSupport == true
1665 				&& mode_lib->vba.SourceFormatPixelAndScanSupport == true
1666 				&& mode_lib->vba.ViewportSizeSupport[i][j] == true
1667 				&& !mode_lib->vba.LinkRateDoesNotMatchDPVersion
1668 				&& !mode_lib->vba.LinkRateForMultistreamNotIndicated
1669 				&& !mode_lib->vba.BPPForMultistreamNotIndicated
1670 				&& !mode_lib->vba.MultistreamWithHDMIOreDP
1671 				&& !mode_lib->vba.ExceededMultistreamSlots[i]
1672 				&& !mode_lib->vba.MSOOrODMSplitWithNonDPLink
1673 				&& !mode_lib->vba.NotEnoughLanesForMSO
1674 				&& mode_lib->vba.LinkCapacitySupport[i] == true && !mode_lib->vba.P2IWith420
1675 				&& !mode_lib->vba.DSCOnlyIfNecessaryWithBPP
1676 				&& !mode_lib->vba.DSC422NativeNotSupported
1677 				&& !mode_lib->vba.MPCCombineMethodIncompatible
1678 				&& mode_lib->vba.ODMCombine2To1SupportCheckOK[i] == true
1679 				&& mode_lib->vba.ODMCombine4To1SupportCheckOK[i] == true
1680 				&& mode_lib->vba.NotEnoughDSCUnits[i] == false
1681 				&& !mode_lib->vba.NotEnoughDSCSlices[i]
1682 				&& !mode_lib->vba.ImmediateFlipOrHostVMAndPStateWithMALLFullFrameOrPhantomPipe
1683 				&& !mode_lib->vba.InvalidCombinationOfMALLUseForPStateAndStaticScreen
1684 				&& mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] == false
1685 				&& mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i]
1686 				&& mode_lib->vba.DTBCLKRequiredMoreThanSupported[i] == false
1687 				&& !mode_lib->vba.InvalidCombinationOfMALLUseForPState
1688 				&& !mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified
1689 				&& mode_lib->vba.ROBSupport[i][j] == true
1690 				&& mode_lib->vba.DISPCLK_DPPCLK_Support[i][j] == true
1691 				&& mode_lib->vba.TotalAvailablePipesSupport[i][j] == true
1692 				&& mode_lib->vba.NumberOfOTGSupport == true
1693 				&& mode_lib->vba.NumberOfHDMIFRLSupport == true
1694 				&& mode_lib->vba.EnoughWritebackUnits == true
1695 				&& mode_lib->vba.WritebackLatencySupport == true
1696 				&& mode_lib->vba.WritebackScaleRatioAndTapsSupport == true
1697 				&& mode_lib->vba.CursorSupport == true && mode_lib->vba.PitchSupport == true
1698 				&& mode_lib->vba.ViewportExceedsSurface == false
1699 				&& mode_lib->vba.PrefetchSupported[i][j] == true
1700 				&& mode_lib->vba.VActiveBandwithSupport[i][j] == true
1701 				&& mode_lib->vba.DynamicMetadataSupported[i][j] == true
1702 				&& mode_lib->vba.TotalVerticalActiveBandwidthSupport[i][j] == true
1703 				&& mode_lib->vba.VRatioInPrefetchSupported[i][j] == true
1704 				&& mode_lib->vba.PTEBufferSizeNotExceeded[i][j] == true
1705 				&& mode_lib->vba.DCCMetaBufferSizeNotExceeded[i][j] == true
1706 				&& mode_lib->vba.NonsupportedDSCInputBPC == false
1707 				&& !mode_lib->vba.ExceededMALLSize
1708 				&& ((mode_lib->vba.HostVMEnable == false
1709 				&& !mode_lib->vba.ImmediateFlipRequiredFinal)
1710 				|| mode_lib->vba.ImmediateFlipSupportedForState[i][j])
1711 				&& (!mode_lib->vba.DRAMClockChangeRequirementFinal
1712 				|| i == v->soc.num_states - 1
1713 				|| mode_lib->vba.DRAMClockChangeSupport[i][j] != dm_dram_clock_change_unsupported)
1714 				&& (!mode_lib->vba.FCLKChangeRequirementFinal || i == v->soc.num_states - 1
1715 				|| mode_lib->vba.FCLKChangeSupport[i][j] != dm_fclock_change_unsupported)
1716 				&& (!mode_lib->vba.USRRetrainingRequiredFinal
1717 				|| mode_lib->vba.USRRetrainingSupport[i][j])) {
1718 				mode_lib->vba.ModeSupport[i][j] = true;
1719 			} else {
1720 				mode_lib->vba.ModeSupport[i][j] = false;
1721 			}
1722 		}
1723 	}
1724 }
1725 
1726 void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib)
1727 {
1728 	struct vba_vars_st *v = &mode_lib->vba;
1729 	int i, j;
1730 	unsigned int k, m;
1731 	unsigned int MaximumMPCCombine;
1732 	unsigned int NumberOfNonCombinedSurfaceOfMaximumBandwidth;
1733 	unsigned int TotalSlots;
1734 	bool CompBufReservedSpaceNeedAdjustment;
1735 	bool CompBufReservedSpaceNeedAdjustmentSingleDPP;
1736 
1737 #ifdef __DML_VBA_DEBUG__
1738 	dml_print("DML::%s: called\n", __func__);
1739 #endif
1740 
1741 	/*MODE SUPPORT, VOLTAGE STATE AND SOC CONFIGURATION*/
1742 
1743 	/*Scale Ratio, taps Support Check*/
1744 
1745 	mode_lib->vba.ScaleRatioAndTapsSupport = true;
1746 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
1747 		if (mode_lib->vba.ScalerEnabled[k] == false
1748 				&& ((mode_lib->vba.SourcePixelFormat[k] != dm_444_64
1749 						&& mode_lib->vba.SourcePixelFormat[k] != dm_444_32
1750 						&& mode_lib->vba.SourcePixelFormat[k] != dm_444_16
1751 						&& mode_lib->vba.SourcePixelFormat[k] != dm_mono_16
1752 						&& mode_lib->vba.SourcePixelFormat[k] != dm_mono_8
1753 						&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe
1754 						&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe_alpha)
1755 						|| mode_lib->vba.HRatio[k] != 1.0 || mode_lib->vba.htaps[k] != 1.0
1756 						|| mode_lib->vba.VRatio[k] != 1.0 || mode_lib->vba.vtaps[k] != 1.0)) {
1757 			mode_lib->vba.ScaleRatioAndTapsSupport = false;
1758 		} else if (mode_lib->vba.vtaps[k] < 1.0 || mode_lib->vba.vtaps[k] > 8.0 || mode_lib->vba.htaps[k] < 1.0
1759 				|| mode_lib->vba.htaps[k] > 8.0
1760 				|| (mode_lib->vba.htaps[k] > 1.0 && (mode_lib->vba.htaps[k] % 2) == 1)
1761 				|| mode_lib->vba.HRatio[k] > mode_lib->vba.MaxHSCLRatio
1762 				|| mode_lib->vba.VRatio[k] > mode_lib->vba.MaxVSCLRatio
1763 				|| mode_lib->vba.HRatio[k] > mode_lib->vba.htaps[k]
1764 				|| mode_lib->vba.VRatio[k] > mode_lib->vba.vtaps[k]
1765 				|| (mode_lib->vba.SourcePixelFormat[k] != dm_444_64
1766 						&& mode_lib->vba.SourcePixelFormat[k] != dm_444_32
1767 						&& mode_lib->vba.SourcePixelFormat[k] != dm_444_16
1768 						&& mode_lib->vba.SourcePixelFormat[k] != dm_mono_16
1769 						&& mode_lib->vba.SourcePixelFormat[k] != dm_mono_8
1770 						&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe
1771 						&& (mode_lib->vba.VTAPsChroma[k] < 1
1772 								|| mode_lib->vba.VTAPsChroma[k] > 8
1773 								|| mode_lib->vba.HTAPsChroma[k] < 1
1774 								|| mode_lib->vba.HTAPsChroma[k] > 8
1775 								|| (mode_lib->vba.HTAPsChroma[k] > 1
1776 										&& mode_lib->vba.HTAPsChroma[k] % 2
1777 												== 1)
1778 								|| mode_lib->vba.HRatioChroma[k]
1779 										> mode_lib->vba.MaxHSCLRatio
1780 								|| mode_lib->vba.VRatioChroma[k]
1781 										> mode_lib->vba.MaxVSCLRatio
1782 								|| mode_lib->vba.HRatioChroma[k]
1783 										> mode_lib->vba.HTAPsChroma[k]
1784 								|| mode_lib->vba.VRatioChroma[k]
1785 										> mode_lib->vba.VTAPsChroma[k]))) {
1786 			mode_lib->vba.ScaleRatioAndTapsSupport = false;
1787 		}
1788 	}
1789 
1790 	/*Source Format, Pixel Format and Scan Support Check*/
1791 	mode_lib->vba.SourceFormatPixelAndScanSupport = true;
1792 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
1793 		if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear
1794 			&& (!(!IsVertical((enum dm_rotation_angle) mode_lib->vba.SourceScan[k]))
1795 				|| mode_lib->vba.DCCEnable[k] == true)) {
1796 			mode_lib->vba.SourceFormatPixelAndScanSupport = false;
1797 		}
1798 	}
1799 
1800 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
1801 		dml32_CalculateBytePerPixelAndBlockSizes(
1802 				mode_lib->vba.SourcePixelFormat[k],
1803 				mode_lib->vba.SurfaceTiling[k],
1804 
1805 				/* Output */
1806 				&mode_lib->vba.BytePerPixelY[k],
1807 				&mode_lib->vba.BytePerPixelC[k],
1808 				&mode_lib->vba.BytePerPixelInDETY[k],
1809 				&mode_lib->vba.BytePerPixelInDETC[k],
1810 				&mode_lib->vba.Read256BlockHeightY[k],
1811 				&mode_lib->vba.Read256BlockHeightC[k],
1812 				&mode_lib->vba.Read256BlockWidthY[k],
1813 				&mode_lib->vba.Read256BlockWidthC[k],
1814 				&mode_lib->vba.MicroTileHeightY[k],
1815 				&mode_lib->vba.MicroTileHeightC[k],
1816 				&mode_lib->vba.MicroTileWidthY[k],
1817 				&mode_lib->vba.MicroTileWidthC[k]);
1818 	}
1819 
1820 	/*Bandwidth Support Check*/
1821 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
1822 		if (!IsVertical(mode_lib->vba.SourceRotation[k])) {
1823 			v->SwathWidthYSingleDPP[k] = mode_lib->vba.ViewportWidth[k];
1824 			v->SwathWidthCSingleDPP[k] = mode_lib->vba.ViewportWidthChroma[k];
1825 		} else {
1826 			v->SwathWidthYSingleDPP[k] = mode_lib->vba.ViewportHeight[k];
1827 			v->SwathWidthCSingleDPP[k] = mode_lib->vba.ViewportHeightChroma[k];
1828 		}
1829 	}
1830 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
1831 		v->ReadBandwidthLuma[k] = v->SwathWidthYSingleDPP[k] * dml_ceil(v->BytePerPixelInDETY[k], 1.0)
1832 				/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k];
1833 		v->ReadBandwidthChroma[k] = v->SwathWidthYSingleDPP[k] / 2 * dml_ceil(v->BytePerPixelInDETC[k], 2.0)
1834 				/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k]
1835 				/ 2.0;
1836 	}
1837 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
1838 		if (mode_lib->vba.WritebackEnable[k] == true && mode_lib->vba.WritebackPixelFormat[k] == dm_444_64) {
1839 			v->WriteBandwidth[k] = mode_lib->vba.WritebackDestinationWidth[k]
1840 					* mode_lib->vba.WritebackDestinationHeight[k]
1841 					/ (mode_lib->vba.WritebackSourceHeight[k] * mode_lib->vba.HTotal[k]
1842 							/ mode_lib->vba.PixelClock[k]) * 8.0;
1843 		} else if (mode_lib->vba.WritebackEnable[k] == true) {
1844 			v->WriteBandwidth[k] = mode_lib->vba.WritebackDestinationWidth[k]
1845 					* mode_lib->vba.WritebackDestinationHeight[k]
1846 					/ (mode_lib->vba.WritebackSourceHeight[k] * mode_lib->vba.HTotal[k]
1847 							/ mode_lib->vba.PixelClock[k]) * 4.0;
1848 		} else {
1849 			v->WriteBandwidth[k] = 0.0;
1850 		}
1851 	}
1852 
1853 	/*Writeback Latency support check*/
1854 
1855 	mode_lib->vba.WritebackLatencySupport = true;
1856 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
1857 		if (mode_lib->vba.WritebackEnable[k] == true
1858 				&& (v->WriteBandwidth[k]
1859 						> mode_lib->vba.WritebackInterfaceBufferSize * 1024
1860 								/ mode_lib->vba.WritebackLatency)) {
1861 			mode_lib->vba.WritebackLatencySupport = false;
1862 		}
1863 	}
1864 
1865 	/*Writeback Mode Support Check*/
1866 	mode_lib->vba.EnoughWritebackUnits = true;
1867 	mode_lib->vba.TotalNumberOfActiveWriteback = 0;
1868 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
1869 		if (mode_lib->vba.WritebackEnable[k] == true)
1870 			mode_lib->vba.TotalNumberOfActiveWriteback = mode_lib->vba.TotalNumberOfActiveWriteback + 1;
1871 	}
1872 
1873 	if (mode_lib->vba.TotalNumberOfActiveWriteback > mode_lib->vba.MaxNumWriteback)
1874 		mode_lib->vba.EnoughWritebackUnits = false;
1875 
1876 	/*Writeback Scale Ratio and Taps Support Check*/
1877 	mode_lib->vba.WritebackScaleRatioAndTapsSupport = true;
1878 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
1879 		if (mode_lib->vba.WritebackEnable[k] == true) {
1880 			if (mode_lib->vba.WritebackHRatio[k] > mode_lib->vba.WritebackMaxHSCLRatio
1881 					|| mode_lib->vba.WritebackVRatio[k] > mode_lib->vba.WritebackMaxVSCLRatio
1882 					|| mode_lib->vba.WritebackHRatio[k] < mode_lib->vba.WritebackMinHSCLRatio
1883 					|| mode_lib->vba.WritebackVRatio[k] < mode_lib->vba.WritebackMinVSCLRatio
1884 					|| mode_lib->vba.WritebackHTaps[k] > mode_lib->vba.WritebackMaxHSCLTaps
1885 					|| mode_lib->vba.WritebackVTaps[k] > mode_lib->vba.WritebackMaxVSCLTaps
1886 					|| mode_lib->vba.WritebackHRatio[k] > mode_lib->vba.WritebackHTaps[k]
1887 					|| mode_lib->vba.WritebackVRatio[k] > mode_lib->vba.WritebackVTaps[k]
1888 					|| (mode_lib->vba.WritebackHTaps[k] > 2.0
1889 							&& ((mode_lib->vba.WritebackHTaps[k] % 2) == 1))) {
1890 				mode_lib->vba.WritebackScaleRatioAndTapsSupport = false;
1891 			}
1892 			if (2.0 * mode_lib->vba.WritebackDestinationWidth[k] * (mode_lib->vba.WritebackVTaps[k] - 1)
1893 					* 57 > mode_lib->vba.WritebackLineBufferSize) {
1894 				mode_lib->vba.WritebackScaleRatioAndTapsSupport = false;
1895 			}
1896 		}
1897 	}
1898 
1899 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
1900 		dml32_CalculateSinglePipeDPPCLKAndSCLThroughput(mode_lib->vba.HRatio[k], mode_lib->vba.HRatioChroma[k],
1901 				mode_lib->vba.VRatio[k], mode_lib->vba.VRatioChroma[k],
1902 				mode_lib->vba.MaxDCHUBToPSCLThroughput, mode_lib->vba.MaxPSCLToLBThroughput,
1903 				mode_lib->vba.PixelClock[k], mode_lib->vba.SourcePixelFormat[k],
1904 				mode_lib->vba.htaps[k], mode_lib->vba.HTAPsChroma[k], mode_lib->vba.vtaps[k],
1905 				mode_lib->vba.VTAPsChroma[k],
1906 				/* Output */
1907 				&mode_lib->vba.PSCL_FACTOR[k], &mode_lib->vba.PSCL_FACTOR_CHROMA[k],
1908 				&mode_lib->vba.MinDPPCLKUsingSingleDPP[k]);
1909 	}
1910 
1911 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
1912 
1913 		if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) {
1914 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 8192;
1915 		} else if (!IsVertical(mode_lib->vba.SourceRotation[k]) && v->BytePerPixelC[k] > 0
1916 				&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe_alpha) {
1917 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 7680;
1918 		} else if (IsVertical(mode_lib->vba.SourceRotation[k]) && v->BytePerPixelC[k] > 0
1919 				&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe_alpha) {
1920 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 4320;
1921 		} else if (mode_lib->vba.SourcePixelFormat[k] == dm_rgbe_alpha) {
1922 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 3840;
1923 		} else if (IsVertical(mode_lib->vba.SourceRotation[k]) && v->BytePerPixelY[k] == 8 &&
1924 				mode_lib->vba.DCCEnable[k] == true) {
1925 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 3072;
1926 		} else {
1927 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 6144;
1928 		}
1929 
1930 		if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8 || mode_lib->vba.SourcePixelFormat[k] == dm_420_10
1931 				|| mode_lib->vba.SourcePixelFormat[k] == dm_420_12) {
1932 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportChroma = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma / 2.0;
1933 		} else {
1934 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportChroma = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma;
1935 		}
1936 		v->MaximumSwathWidthInLineBufferLuma = mode_lib->vba.LineBufferSizeFinal
1937 				* dml_max(mode_lib->vba.HRatio[k], 1.0) / mode_lib->vba.LBBitPerPixel[k]
1938 				/ (mode_lib->vba.vtaps[k] + dml_max(dml_ceil(mode_lib->vba.VRatio[k], 1.0) - 2, 0.0));
1939 		if (v->BytePerPixelC[k] == 0.0) {
1940 			v->MaximumSwathWidthInLineBufferChroma = 0;
1941 		} else {
1942 			v->MaximumSwathWidthInLineBufferChroma = mode_lib->vba.LineBufferSizeFinal
1943 					* dml_max(mode_lib->vba.HRatioChroma[k], 1.0) / mode_lib->vba.LBBitPerPixel[k]
1944 					/ (mode_lib->vba.VTAPsChroma[k]
1945 							+ dml_max(dml_ceil(mode_lib->vba.VRatioChroma[k], 1.0) - 2,
1946 									0.0));
1947 		}
1948 		v->MaximumSwathWidthLuma[k] = dml_min(v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma,
1949 				v->MaximumSwathWidthInLineBufferLuma);
1950 		v->MaximumSwathWidthChroma[k] = dml_min(v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportChroma,
1951 				v->MaximumSwathWidthInLineBufferChroma);
1952 	}
1953 
1954 	dml32_CalculateSwathAndDETConfiguration(
1955 			&v->dummy_vars.dml32_CalculateSwathAndDETConfiguration,
1956 			mode_lib->vba.DETSizeOverride,
1957 			mode_lib->vba.UsesMALLForPStateChange,
1958 			mode_lib->vba.ConfigReturnBufferSizeInKByte,
1959 			mode_lib->vba.MaxTotalDETInKByte,
1960 			mode_lib->vba.MinCompressedBufferSizeInKByte,
1961 			1, /* ForceSingleDPP */
1962 			mode_lib->vba.NumberOfActiveSurfaces,
1963 			mode_lib->vba.nomDETInKByte,
1964 			mode_lib->vba.UseUnboundedRequesting,
1965 			mode_lib->vba.DisableUnboundRequestIfCompBufReservedSpaceNeedAdjustment,
1966 			mode_lib->vba.ip.pixel_chunk_size_kbytes,
1967 			mode_lib->vba.ip.rob_buffer_size_kbytes,
1968 			mode_lib->vba.CompressedBufferSegmentSizeInkByteFinal,
1969 			mode_lib->vba.Output,
1970 			mode_lib->vba.ReadBandwidthLuma,
1971 			mode_lib->vba.ReadBandwidthChroma,
1972 			mode_lib->vba.MaximumSwathWidthLuma,
1973 			mode_lib->vba.MaximumSwathWidthChroma,
1974 			mode_lib->vba.SourceRotation,
1975 			mode_lib->vba.ViewportStationary,
1976 			mode_lib->vba.SourcePixelFormat,
1977 			mode_lib->vba.SurfaceTiling,
1978 			mode_lib->vba.ViewportWidth,
1979 			mode_lib->vba.ViewportHeight,
1980 			mode_lib->vba.ViewportXStartY,
1981 			mode_lib->vba.ViewportYStartY,
1982 			mode_lib->vba.ViewportXStartC,
1983 			mode_lib->vba.ViewportYStartC,
1984 			mode_lib->vba.SurfaceWidthY,
1985 			mode_lib->vba.SurfaceWidthC,
1986 			mode_lib->vba.SurfaceHeightY,
1987 			mode_lib->vba.SurfaceHeightC,
1988 			mode_lib->vba.Read256BlockHeightY,
1989 			mode_lib->vba.Read256BlockHeightC,
1990 			mode_lib->vba.Read256BlockWidthY,
1991 			mode_lib->vba.Read256BlockWidthC,
1992 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_odm_mode,
1993 			mode_lib->vba.BlendingAndTiming,
1994 			mode_lib->vba.BytePerPixelY,
1995 			mode_lib->vba.BytePerPixelC,
1996 			mode_lib->vba.BytePerPixelInDETY,
1997 			mode_lib->vba.BytePerPixelInDETC,
1998 			mode_lib->vba.HActive,
1999 			mode_lib->vba.HRatio,
2000 			mode_lib->vba.HRatioChroma,
2001 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[0], /*  Integer DPPPerSurface[] */
2002 
2003 			/* Output */
2004 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[1], /* Long            swath_width_luma_ub[] */
2005 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[2], /* Long            swath_width_chroma_ub[]  */
2006 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_double_array[0], /* Long            SwathWidth[]  */
2007 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_double_array[1], /* Long            SwathWidthChroma[]  */
2008 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[3], /* Integer         SwathHeightY[]  */
2009 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[4], /* Integer         SwathHeightC[]  */
2010 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[5], /* Long            DETBufferSizeInKByte[]  */
2011 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[6], /* Long            DETBufferSizeY[]  */
2012 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[7], /* Long            DETBufferSizeC[]  */
2013 			&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[0][0], /* bool           *UnboundedRequestEnabled  */
2014 			&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[0][0], /* Long           *CompressedBufferSizeInkByte  */
2015 			&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[1][0], /* Long           *CompBufReservedSpaceKBytes */
2016 			&CompBufReservedSpaceNeedAdjustmentSingleDPP,
2017 			mode_lib->vba.SingleDPPViewportSizeSupportPerSurface,/* bool ViewportSizeSupportPerSurface[] */
2018 			&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[1][0]); /* bool           *ViewportSizeSupport */
2019 
2020 	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsNeededForPStateChangeAndVoltage = false;
2021 	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsPossible = false;
2022 
2023 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2024 		if (mode_lib->vba.MPCCombineUse[k] == dm_mpc_reduce_voltage_and_clocks)
2025 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsNeededForPStateChangeAndVoltage = true;
2026 		if (mode_lib->vba.MPCCombineUse[k] == dm_mpc_always_when_possible)
2027 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsPossible = true;
2028 	}
2029 	mode_lib->vba.MPCCombineMethodIncompatible = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsNeededForPStateChangeAndVoltage
2030 			&& v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsPossible;
2031 
2032 	for (i = 0; i < v->soc.num_states; i++) {
2033 		for (j = 0; j < 2; j++) {
2034 			mode_lib->vba.TotalNumberOfActiveDPP[i][j] = 0;
2035 			mode_lib->vba.TotalAvailablePipesSupport[i][j] = true;
2036 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeNoDSC = dm_odm_combine_mode_disabled;
2037 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeDSC = dm_odm_combine_mode_disabled;
2038 
2039 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2040 				dml32_CalculateODMMode(
2041 						mode_lib->vba.MaximumPixelsPerLinePerDSCUnit,
2042 						mode_lib->vba.HActive[k],
2043 						mode_lib->vba.Output[k],
2044 						mode_lib->vba.ODMUse[k],
2045 						mode_lib->vba.MaxDispclk[i],
2046 						mode_lib->vba.MaxDispclk[v->soc.num_states - 1],
2047 						false,
2048 						mode_lib->vba.TotalNumberOfActiveDPP[i][j],
2049 						mode_lib->vba.MaxNumDPP,
2050 						mode_lib->vba.PixelClock[k],
2051 						mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading,
2052 						mode_lib->vba.DISPCLKRampingMargin,
2053 						mode_lib->vba.DISPCLKDPPCLKVCOSpeed,
2054 
2055 						/* Output */
2056 						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportNoDSC,
2057 						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NumberOfDPPNoDSC,
2058 						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeNoDSC,
2059 						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.RequiredDISPCLKPerSurfaceNoDSC);
2060 
2061 				dml32_CalculateODMMode(
2062 						mode_lib->vba.MaximumPixelsPerLinePerDSCUnit,
2063 						mode_lib->vba.HActive[k],
2064 						mode_lib->vba.Output[k],
2065 						mode_lib->vba.ODMUse[k],
2066 						mode_lib->vba.MaxDispclk[i],
2067 						mode_lib->vba.MaxDispclk[v->soc.num_states - 1],
2068 						true,
2069 						mode_lib->vba.TotalNumberOfActiveDPP[i][j],
2070 						mode_lib->vba.MaxNumDPP,
2071 						mode_lib->vba.PixelClock[k],
2072 						mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading,
2073 						mode_lib->vba.DISPCLKRampingMargin,
2074 						mode_lib->vba.DISPCLKDPPCLKVCOSpeed,
2075 
2076 						/* Output */
2077 						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportDSC,
2078 						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NumberOfDPPDSC,
2079 						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeDSC,
2080 						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.RequiredDISPCLKPerSurfaceDSC);
2081 
2082 				dml32_CalculateOutputLink(
2083 						mode_lib->vba.PHYCLKPerState[i],
2084 						mode_lib->vba.PHYCLKD18PerState[i],
2085 						mode_lib->vba.PHYCLKD32PerState[i],
2086 						mode_lib->vba.Downspreading,
2087 						(mode_lib->vba.BlendingAndTiming[k] == k),
2088 						mode_lib->vba.Output[k],
2089 						mode_lib->vba.OutputFormat[k],
2090 						mode_lib->vba.HTotal[k],
2091 						mode_lib->vba.HActive[k],
2092 						mode_lib->vba.PixelClockBackEnd[k],
2093 						mode_lib->vba.ForcedOutputLinkBPP[k],
2094 						mode_lib->vba.DSCInputBitPerComponent[k],
2095 						mode_lib->vba.NumberOfDSCSlices[k],
2096 						mode_lib->vba.AudioSampleRate[k],
2097 						mode_lib->vba.AudioSampleLayout[k],
2098 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeNoDSC,
2099 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeDSC,
2100 						mode_lib->vba.DSCEnable[k],
2101 						mode_lib->vba.OutputLinkDPLanes[k],
2102 						mode_lib->vba.OutputLinkDPRate[k],
2103 
2104 						/* Output */
2105 						&mode_lib->vba.RequiresDSC[i][k],
2106 						&mode_lib->vba.RequiresFEC[i][k],
2107 						&mode_lib->vba.OutputBppPerState[i][k],
2108 						&mode_lib->vba.OutputTypePerState[i][k],
2109 						&mode_lib->vba.OutputRatePerState[i][k],
2110 						&mode_lib->vba.RequiredSlots[i][k]);
2111 
2112 				if (mode_lib->vba.RequiresDSC[i][k] == false) {
2113 					mode_lib->vba.ODMCombineEnablePerState[i][k] = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeNoDSC;
2114 					mode_lib->vba.RequiredDISPCLKPerSurface[i][j][k] =
2115 							v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.RequiredDISPCLKPerSurfaceNoDSC;
2116 					if (!v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportNoDSC)
2117 						mode_lib->vba.TotalAvailablePipesSupport[i][j] = false;
2118 					mode_lib->vba.TotalNumberOfActiveDPP[i][j] =
2119 							mode_lib->vba.TotalNumberOfActiveDPP[i][j] + v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NumberOfDPPNoDSC;
2120 				} else {
2121 					mode_lib->vba.ODMCombineEnablePerState[i][k] = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeDSC;
2122 					mode_lib->vba.RequiredDISPCLKPerSurface[i][j][k] =
2123 							v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.RequiredDISPCLKPerSurfaceDSC;
2124 					if (!v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportDSC)
2125 						mode_lib->vba.TotalAvailablePipesSupport[i][j] = false;
2126 					mode_lib->vba.TotalNumberOfActiveDPP[i][j] =
2127 							mode_lib->vba.TotalNumberOfActiveDPP[i][j] + v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NumberOfDPPDSC;
2128 				}
2129 			}
2130 
2131 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2132 				if (mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1) {
2133 					mode_lib->vba.MPCCombine[i][j][k] = false;
2134 					mode_lib->vba.NoOfDPP[i][j][k] = 4;
2135 				} else if (mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1) {
2136 					mode_lib->vba.MPCCombine[i][j][k] = false;
2137 					mode_lib->vba.NoOfDPP[i][j][k] = 2;
2138 				} else if (mode_lib->vba.MPCCombineUse[k] == dm_mpc_never) {
2139 					mode_lib->vba.MPCCombine[i][j][k] = false;
2140 					mode_lib->vba.NoOfDPP[i][j][k] = 1;
2141 				} else if (dml32_RoundToDFSGranularity(
2142 						mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
2143 								* (1 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
2144 												/ 100), 1,
2145 						mode_lib->vba.DISPCLKDPPCLKVCOSpeed) <= mode_lib->vba.MaxDppclk[i] &&
2146 				mode_lib->vba.SingleDPPViewportSizeSupportPerSurface[k] == true) {
2147 					mode_lib->vba.MPCCombine[i][j][k] = false;
2148 					mode_lib->vba.NoOfDPP[i][j][k] = 1;
2149 				} else if (mode_lib->vba.TotalNumberOfActiveDPP[i][j] < mode_lib->vba.MaxNumDPP) {
2150 					mode_lib->vba.MPCCombine[i][j][k] = true;
2151 					mode_lib->vba.NoOfDPP[i][j][k] = 2;
2152 					mode_lib->vba.TotalNumberOfActiveDPP[i][j] =
2153 							mode_lib->vba.TotalNumberOfActiveDPP[i][j] + 1;
2154 				} else {
2155 					mode_lib->vba.MPCCombine[i][j][k] = false;
2156 					mode_lib->vba.NoOfDPP[i][j][k] = 1;
2157 					mode_lib->vba.TotalAvailablePipesSupport[i][j] = false;
2158 				}
2159 			}
2160 
2161 			mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] = 0;
2162 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NoChroma = true;
2163 
2164 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2165 				if (mode_lib->vba.NoOfDPP[i][j][k] == 1)
2166 					mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] =
2167 							mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] + 1;
2168 				if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8
2169 						|| mode_lib->vba.SourcePixelFormat[k] == dm_420_10
2170 						|| mode_lib->vba.SourcePixelFormat[k] == dm_420_12
2171 						|| mode_lib->vba.SourcePixelFormat[k] == dm_rgbe_alpha) {
2172 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NoChroma = false;
2173 				}
2174 			}
2175 
2176 			// if TotalNumberOfActiveDPP is > 1, then there should be no unbounded req mode (hw limitation), the comp buf reserved adjustment is not needed regardless
2177 			// if TotalNumberOfActiveDPP is == 1, then will use the SingleDPP version of unbounded_req for the decision
2178 			CompBufReservedSpaceNeedAdjustment = (mode_lib->vba.TotalNumberOfActiveDPP[i][j] > 1) ? 0 : CompBufReservedSpaceNeedAdjustmentSingleDPP;
2179 
2180 
2181 
2182 			if (j == 1 && !dml32_UnboundedRequest(mode_lib->vba.UseUnboundedRequesting,
2183 					mode_lib->vba.TotalNumberOfActiveDPP[i][j], v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NoChroma,
2184 					mode_lib->vba.Output[0],
2185 					mode_lib->vba.SurfaceTiling[0],
2186 					CompBufReservedSpaceNeedAdjustment,
2187 					mode_lib->vba.DisableUnboundRequestIfCompBufReservedSpaceNeedAdjustment)) {
2188 				while (!(mode_lib->vba.TotalNumberOfActiveDPP[i][j] >= mode_lib->vba.MaxNumDPP
2189 						|| mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] == 0)) {
2190 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.BWOfNonCombinedSurfaceOfMaximumBandwidth = 0;
2191 					NumberOfNonCombinedSurfaceOfMaximumBandwidth = 0;
2192 
2193 					for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2194 						if (mode_lib->vba.MPCCombineUse[k]
2195 							!= dm_mpc_never &&
2196 							mode_lib->vba.MPCCombineUse[k] != dm_mpc_reduce_voltage &&
2197 							mode_lib->vba.ReadBandwidthLuma[k] +
2198 							mode_lib->vba.ReadBandwidthChroma[k] >
2199 							v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.BWOfNonCombinedSurfaceOfMaximumBandwidth &&
2200 							(mode_lib->vba.ODMCombineEnablePerState[i][k] !=
2201 							dm_odm_combine_mode_2to1 &&
2202 							mode_lib->vba.ODMCombineEnablePerState[i][k] !=
2203 							dm_odm_combine_mode_4to1) &&
2204 								mode_lib->vba.MPCCombine[i][j][k] == false) {
2205 							v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.BWOfNonCombinedSurfaceOfMaximumBandwidth =
2206 								mode_lib->vba.ReadBandwidthLuma[k]
2207 								+ mode_lib->vba.ReadBandwidthChroma[k];
2208 							NumberOfNonCombinedSurfaceOfMaximumBandwidth = k;
2209 						}
2210 					}
2211 					mode_lib->vba.MPCCombine[i][j][NumberOfNonCombinedSurfaceOfMaximumBandwidth] =
2212 							true;
2213 					mode_lib->vba.NoOfDPP[i][j][NumberOfNonCombinedSurfaceOfMaximumBandwidth] = 2;
2214 					mode_lib->vba.TotalNumberOfActiveDPP[i][j] =
2215 							mode_lib->vba.TotalNumberOfActiveDPP[i][j] + 1;
2216 					mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] =
2217 							mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] - 1;
2218 				}
2219 			}
2220 
2221 			//DISPCLK/DPPCLK
2222 			mode_lib->vba.WritebackRequiredDISPCLK = 0;
2223 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2224 				if (mode_lib->vba.WritebackEnable[k]) {
2225 					mode_lib->vba.WritebackRequiredDISPCLK = dml_max(
2226 							mode_lib->vba.WritebackRequiredDISPCLK,
2227 							dml32_CalculateWriteBackDISPCLK(
2228 									mode_lib->vba.WritebackPixelFormat[k],
2229 									mode_lib->vba.PixelClock[k],
2230 									mode_lib->vba.WritebackHRatio[k],
2231 									mode_lib->vba.WritebackVRatio[k],
2232 									mode_lib->vba.WritebackHTaps[k],
2233 									mode_lib->vba.WritebackVTaps[k],
2234 									mode_lib->vba.WritebackSourceWidth[k],
2235 									mode_lib->vba.WritebackDestinationWidth[k],
2236 									mode_lib->vba.HTotal[k],
2237 									mode_lib->vba.WritebackLineBufferSize,
2238 									mode_lib->vba.DISPCLKDPPCLKVCOSpeed));
2239 				}
2240 			}
2241 
2242 			mode_lib->vba.RequiredDISPCLK[i][j] = mode_lib->vba.WritebackRequiredDISPCLK;
2243 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2244 				mode_lib->vba.RequiredDISPCLK[i][j] = dml_max(mode_lib->vba.RequiredDISPCLK[i][j],
2245 						mode_lib->vba.RequiredDISPCLKPerSurface[i][j][k]);
2246 			}
2247 
2248 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
2249 				mode_lib->vba.NoOfDPPThisState[k] = mode_lib->vba.NoOfDPP[i][j][k];
2250 
2251 			dml32_CalculateDPPCLK(mode_lib->vba.NumberOfActiveSurfaces,
2252 					mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading,
2253 					mode_lib->vba.DISPCLKDPPCLKVCOSpeed, mode_lib->vba.MinDPPCLKUsingSingleDPP,
2254 					mode_lib->vba.NoOfDPPThisState,
2255 					/* Output */
2256 					&mode_lib->vba.GlobalDPPCLK, mode_lib->vba.RequiredDPPCLKThisState);
2257 
2258 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
2259 				mode_lib->vba.RequiredDPPCLK[i][j][k] = mode_lib->vba.RequiredDPPCLKThisState[k];
2260 
2261 			mode_lib->vba.DISPCLK_DPPCLK_Support[i][j] = !((mode_lib->vba.RequiredDISPCLK[i][j]
2262 					> mode_lib->vba.MaxDispclk[i])
2263 					|| (mode_lib->vba.GlobalDPPCLK > mode_lib->vba.MaxDppclk[i]));
2264 
2265 			if (mode_lib->vba.TotalNumberOfActiveDPP[i][j] > mode_lib->vba.MaxNumDPP)
2266 				mode_lib->vba.TotalAvailablePipesSupport[i][j] = false;
2267 		} // j
2268 	} // i (VOLTAGE_STATE)
2269 
2270 	/* Total Available OTG, HDMIFRL, DP Support Check */
2271 	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveOTG = 0;
2272 	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveHDMIFRL = 0;
2273 	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0 = 0;
2274 	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0Outputs = 0;
2275 
2276 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2277 		if (mode_lib->vba.BlendingAndTiming[k] == k) {
2278 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveOTG = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveOTG + 1;
2279 			if (mode_lib->vba.Output[k] == dm_dp2p0) {
2280 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0 = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0 + 1;
2281 				if (mode_lib->vba.OutputMultistreamId[k]
2282 						== k || mode_lib->vba.OutputMultistreamEn[k] == false) {
2283 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0Outputs = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0Outputs + 1;
2284 				}
2285 			}
2286 		}
2287 	}
2288 
2289 	mode_lib->vba.NumberOfOTGSupport = (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveOTG <= mode_lib->vba.MaxNumOTG);
2290 	mode_lib->vba.NumberOfHDMIFRLSupport = (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveHDMIFRL <= mode_lib->vba.MaxNumHDMIFRLOutputs);
2291 	mode_lib->vba.NumberOfDP2p0Support = (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0 <= mode_lib->vba.MaxNumDP2p0Streams
2292 			&& v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0Outputs <= mode_lib->vba.MaxNumDP2p0Outputs);
2293 
2294 	/* Display IO and DSC Support Check */
2295 	mode_lib->vba.NonsupportedDSCInputBPC = false;
2296 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
2297 		if (!(mode_lib->vba.DSCInputBitPerComponent[k] == 12.0
2298 				|| mode_lib->vba.DSCInputBitPerComponent[k] == 10.0
2299 				|| mode_lib->vba.DSCInputBitPerComponent[k] == 8.0
2300 				|| mode_lib->vba.DSCInputBitPerComponent[k] >
2301 				mode_lib->vba.MaximumDSCBitsPerComponent)) {
2302 			mode_lib->vba.NonsupportedDSCInputBPC = true;
2303 		}
2304 	}
2305 
2306 	for (i = 0; i < v->soc.num_states; ++i) {
2307 		mode_lib->vba.ExceededMultistreamSlots[i] = false;
2308 		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2309 			if (mode_lib->vba.OutputMultistreamEn[k] == true && mode_lib->vba.OutputMultistreamId[k] == k) {
2310 				TotalSlots = mode_lib->vba.RequiredSlots[i][k];
2311 				for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) {
2312 					if (mode_lib->vba.OutputMultistreamId[j] == k)
2313 						TotalSlots = TotalSlots + mode_lib->vba.RequiredSlots[i][j];
2314 				}
2315 				if (mode_lib->vba.Output[k] == dm_dp && TotalSlots > 63)
2316 					mode_lib->vba.ExceededMultistreamSlots[i] = true;
2317 				if (mode_lib->vba.Output[k] == dm_dp2p0 && TotalSlots > 64)
2318 					mode_lib->vba.ExceededMultistreamSlots[i] = true;
2319 			}
2320 		}
2321 		mode_lib->vba.LinkCapacitySupport[i] = true;
2322 		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2323 			if (mode_lib->vba.BlendingAndTiming[k] == k
2324 					&& (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_dp2p0
2325 							|| mode_lib->vba.Output[k] == dm_edp
2326 							|| mode_lib->vba.Output[k] == dm_hdmi)
2327 					&& mode_lib->vba.OutputBppPerState[i][k] == 0) {
2328 				mode_lib->vba.LinkCapacitySupport[i] = false;
2329 			}
2330 		}
2331 	}
2332 
2333 	mode_lib->vba.P2IWith420 = false;
2334 	mode_lib->vba.DSCOnlyIfNecessaryWithBPP = false;
2335 	mode_lib->vba.DSC422NativeNotSupported = false;
2336 	mode_lib->vba.LinkRateDoesNotMatchDPVersion = false;
2337 	mode_lib->vba.LinkRateForMultistreamNotIndicated = false;
2338 	mode_lib->vba.BPPForMultistreamNotIndicated = false;
2339 	mode_lib->vba.MultistreamWithHDMIOreDP = false;
2340 	mode_lib->vba.MSOOrODMSplitWithNonDPLink = false;
2341 	mode_lib->vba.NotEnoughLanesForMSO = false;
2342 
2343 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2344 		if (mode_lib->vba.BlendingAndTiming[k] == k
2345 				&& (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_dp2p0
2346 						|| mode_lib->vba.Output[k] == dm_edp
2347 						|| mode_lib->vba.Output[k] == dm_hdmi)) {
2348 			if (mode_lib->vba.OutputFormat[k]
2349 					== dm_420 && mode_lib->vba.Interlace[k] == 1 &&
2350 					mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true)
2351 				mode_lib->vba.P2IWith420 = true;
2352 
2353 			if (mode_lib->vba.DSCEnable[k] && mode_lib->vba.ForcedOutputLinkBPP[k] != 0)
2354 				mode_lib->vba.DSCOnlyIfNecessaryWithBPP = true;
2355 			if ((mode_lib->vba.DSCEnable[k] || mode_lib->vba.DSCEnable[k])
2356 					&& mode_lib->vba.OutputFormat[k] == dm_n422
2357 					&& !mode_lib->vba.DSC422NativeSupport)
2358 				mode_lib->vba.DSC422NativeNotSupported = true;
2359 
2360 			if (((mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_hbr
2361 					|| mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_hbr2
2362 					|| mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_hbr3)
2363 					&& mode_lib->vba.Output[k] != dm_dp && mode_lib->vba.Output[k] != dm_edp)
2364 					|| ((mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_uhbr10
2365 							|| mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_uhbr13p5
2366 							|| mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_uhbr20)
2367 							&& mode_lib->vba.Output[k] != dm_dp2p0))
2368 				mode_lib->vba.LinkRateDoesNotMatchDPVersion = true;
2369 
2370 			if (mode_lib->vba.OutputMultistreamEn[k] == true) {
2371 				if (mode_lib->vba.OutputMultistreamId[k] == k
2372 					&& mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_na)
2373 					mode_lib->vba.LinkRateForMultistreamNotIndicated = true;
2374 				if (mode_lib->vba.OutputMultistreamId[k] == k && mode_lib->vba.ForcedOutputLinkBPP[k] == 0)
2375 					mode_lib->vba.BPPForMultistreamNotIndicated = true;
2376 				for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) {
2377 					if (mode_lib->vba.OutputMultistreamId[k] == j && mode_lib->vba.OutputMultistreamEn[k]
2378 						&& mode_lib->vba.ForcedOutputLinkBPP[k] == 0)
2379 						mode_lib->vba.BPPForMultistreamNotIndicated = true;
2380 				}
2381 			}
2382 
2383 			if ((mode_lib->vba.Output[k] == dm_edp || mode_lib->vba.Output[k] == dm_hdmi)) {
2384 				if (mode_lib->vba.OutputMultistreamId[k] == k && mode_lib->vba.OutputMultistreamEn[k])
2385 					mode_lib->vba.MultistreamWithHDMIOreDP = true;
2386 
2387 				for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) {
2388 					if (mode_lib->vba.OutputMultistreamEn[k] == true && mode_lib->vba.OutputMultistreamId[k] == j)
2389 						mode_lib->vba.MultistreamWithHDMIOreDP = true;
2390 				}
2391 			}
2392 
2393 			if (mode_lib->vba.Output[k] != dm_dp
2394 					&& (mode_lib->vba.ODMUse[k] == dm_odm_split_policy_1to2
2395 							|| mode_lib->vba.ODMUse[k] == dm_odm_mso_policy_1to2
2396 							|| mode_lib->vba.ODMUse[k] == dm_odm_mso_policy_1to4))
2397 				mode_lib->vba.MSOOrODMSplitWithNonDPLink = true;
2398 
2399 			if ((mode_lib->vba.ODMUse[k] == dm_odm_mso_policy_1to2
2400 					&& mode_lib->vba.OutputLinkDPLanes[k] < 2)
2401 					|| (mode_lib->vba.ODMUse[k] == dm_odm_mso_policy_1to4
2402 							&& mode_lib->vba.OutputLinkDPLanes[k] < 4))
2403 				mode_lib->vba.NotEnoughLanesForMSO = true;
2404 		}
2405 	}
2406 
2407 	for (i = 0; i < v->soc.num_states; ++i) {
2408 		mode_lib->vba.DTBCLKRequiredMoreThanSupported[i] = false;
2409 		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2410 			if (mode_lib->vba.BlendingAndTiming[k] == k
2411 					&& dml32_RequiredDTBCLK(mode_lib->vba.RequiresDSC[i][k],
2412 							mode_lib->vba.PixelClockBackEnd[k],
2413 							mode_lib->vba.OutputFormat[k],
2414 							mode_lib->vba.OutputBppPerState[i][k],
2415 							mode_lib->vba.NumberOfDSCSlices[k], mode_lib->vba.HTotal[k],
2416 							mode_lib->vba.HActive[k], mode_lib->vba.AudioSampleRate[k],
2417 							mode_lib->vba.AudioSampleLayout[k])
2418 							> mode_lib->vba.DTBCLKPerState[i]) {
2419 				mode_lib->vba.DTBCLKRequiredMoreThanSupported[i] = true;
2420 			}
2421 		}
2422 	}
2423 
2424 	for (i = 0; i < v->soc.num_states; ++i) {
2425 		mode_lib->vba.ODMCombine2To1SupportCheckOK[i] = true;
2426 		mode_lib->vba.ODMCombine4To1SupportCheckOK[i] = true;
2427 		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2428 			if (mode_lib->vba.BlendingAndTiming[k] == k
2429 					&& mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1
2430 					&& mode_lib->vba.Output[k] == dm_hdmi) {
2431 				mode_lib->vba.ODMCombine2To1SupportCheckOK[i] = false;
2432 			}
2433 			if (mode_lib->vba.BlendingAndTiming[k] == k
2434 					&& mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1
2435 					&& (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_edp
2436 							|| mode_lib->vba.Output[k] == dm_hdmi)) {
2437 				mode_lib->vba.ODMCombine4To1SupportCheckOK[i] = false;
2438 			}
2439 		}
2440 	}
2441 
2442 	for (i = 0; i < v->soc.num_states; i++) {
2443 		mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = false;
2444 		for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
2445 			if (mode_lib->vba.BlendingAndTiming[k] == k) {
2446 				if (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_dp2p0
2447 						|| mode_lib->vba.Output[k] == dm_edp) {
2448 					if (mode_lib->vba.OutputFormat[k] == dm_420) {
2449 						mode_lib->vba.DSCFormatFactor = 2;
2450 					} else if (mode_lib->vba.OutputFormat[k] == dm_444) {
2451 						mode_lib->vba.DSCFormatFactor = 1;
2452 					} else if (mode_lib->vba.OutputFormat[k] == dm_n422) {
2453 						mode_lib->vba.DSCFormatFactor = 2;
2454 					} else {
2455 						mode_lib->vba.DSCFormatFactor = 1;
2456 					}
2457 					if (mode_lib->vba.RequiresDSC[i][k] == true) {
2458 						if (mode_lib->vba.ODMCombineEnablePerState[i][k]
2459 								== dm_odm_combine_mode_4to1) {
2460 							if (mode_lib->vba.PixelClockBackEnd[k] / 12.0 / mode_lib->vba.DSCFormatFactor > (1.0 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) * mode_lib->vba.MaxDSCCLK[i])
2461 								mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = true;
2462 						} else if (mode_lib->vba.ODMCombineEnablePerState[i][k]
2463 								== dm_odm_combine_mode_2to1) {
2464 							if (mode_lib->vba.PixelClockBackEnd[k] / 6.0 / mode_lib->vba.DSCFormatFactor > (1.0 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) * mode_lib->vba.MaxDSCCLK[i])
2465 								mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = true;
2466 						} else {
2467 							if (mode_lib->vba.PixelClockBackEnd[k] / 3.0 / mode_lib->vba.DSCFormatFactor > (1.0 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) * mode_lib->vba.MaxDSCCLK[i])
2468 								mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = true;
2469 						}
2470 					}
2471 				}
2472 			}
2473 		}
2474 	}
2475 
2476 	/* Check DSC Unit and Slices Support */
2477 	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = 0;
2478 
2479 	for (i = 0; i < v->soc.num_states; ++i) {
2480 		mode_lib->vba.NotEnoughDSCUnits[i] = false;
2481 		mode_lib->vba.NotEnoughDSCSlices[i] = false;
2482 		v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = 0;
2483 		mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i] = true;
2484 		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2485 			if (mode_lib->vba.RequiresDSC[i][k] == true) {
2486 				if (mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1) {
2487 					if (mode_lib->vba.HActive[k]
2488 							> 4 * mode_lib->vba.MaximumPixelsPerLinePerDSCUnit)
2489 						mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i] = false;
2490 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired + 4;
2491 					if (mode_lib->vba.NumberOfDSCSlices[k] > 16)
2492 						mode_lib->vba.NotEnoughDSCSlices[i] = true;
2493 				} else if (mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1) {
2494 					if (mode_lib->vba.HActive[k]
2495 							> 2 * mode_lib->vba.MaximumPixelsPerLinePerDSCUnit)
2496 						mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i] = false;
2497 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired + 2;
2498 					if (mode_lib->vba.NumberOfDSCSlices[k] > 8)
2499 						mode_lib->vba.NotEnoughDSCSlices[i] = true;
2500 				} else {
2501 					if (mode_lib->vba.HActive[k] > mode_lib->vba.MaximumPixelsPerLinePerDSCUnit)
2502 						mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i] = false;
2503 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired + 1;
2504 					if (mode_lib->vba.NumberOfDSCSlices[k] > 4)
2505 						mode_lib->vba.NotEnoughDSCSlices[i] = true;
2506 				}
2507 			}
2508 		}
2509 		if (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired > mode_lib->vba.NumberOfDSC)
2510 			mode_lib->vba.NotEnoughDSCUnits[i] = true;
2511 	}
2512 
2513 	/*DSC Delay per state*/
2514 	for (i = 0; i < v->soc.num_states; ++i) {
2515 		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2516 			mode_lib->vba.DSCDelayPerState[i][k] = dml32_DSCDelayRequirement(
2517 					mode_lib->vba.RequiresDSC[i][k], mode_lib->vba.ODMCombineEnablePerState[i][k],
2518 					mode_lib->vba.DSCInputBitPerComponent[k],
2519 					mode_lib->vba.OutputBppPerState[i][k], mode_lib->vba.HActive[k],
2520 					mode_lib->vba.HTotal[k], mode_lib->vba.NumberOfDSCSlices[k],
2521 					mode_lib->vba.OutputFormat[k], mode_lib->vba.Output[k],
2522 					mode_lib->vba.PixelClock[k], mode_lib->vba.PixelClockBackEnd[k]);
2523 		}
2524 
2525 		m = 0;
2526 
2527 		for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
2528 			for (m = 0; m <= mode_lib->vba.NumberOfActiveSurfaces - 1; m++) {
2529 				for (j = 0; j <= mode_lib->vba.NumberOfActiveSurfaces - 1; j++) {
2530 					if (mode_lib->vba.BlendingAndTiming[k] == m &&
2531 							mode_lib->vba.RequiresDSC[i][m] == true) {
2532 						mode_lib->vba.DSCDelayPerState[i][k] =
2533 							mode_lib->vba.DSCDelayPerState[i][m];
2534 					}
2535 				}
2536 			}
2537 		}
2538 	}
2539 
2540 	//Calculate Swath, DET Configuration, DCFCLKDeepSleep
2541 	//
2542 	for (i = 0; i < (int) v->soc.num_states; ++i) {
2543 		for (j = 0; j <= 1; ++j) {
2544 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2545 				mode_lib->vba.RequiredDPPCLKThisState[k] = mode_lib->vba.RequiredDPPCLK[i][j][k];
2546 				mode_lib->vba.NoOfDPPThisState[k] = mode_lib->vba.NoOfDPP[i][j][k];
2547 				mode_lib->vba.ODMCombineEnableThisState[k] =
2548 						mode_lib->vba.ODMCombineEnablePerState[i][k];
2549 			}
2550 
2551 			dml32_CalculateSwathAndDETConfiguration(
2552 					&v->dummy_vars.dml32_CalculateSwathAndDETConfiguration,
2553 					mode_lib->vba.DETSizeOverride,
2554 					mode_lib->vba.UsesMALLForPStateChange,
2555 					mode_lib->vba.ConfigReturnBufferSizeInKByte,
2556 					mode_lib->vba.MaxTotalDETInKByte,
2557 					mode_lib->vba.MinCompressedBufferSizeInKByte,
2558 					false, /* ForceSingleDPP */
2559 					mode_lib->vba.NumberOfActiveSurfaces,
2560 					mode_lib->vba.nomDETInKByte,
2561 					mode_lib->vba.UseUnboundedRequesting,
2562 					mode_lib->vba.DisableUnboundRequestIfCompBufReservedSpaceNeedAdjustment,
2563 					mode_lib->vba.ip.pixel_chunk_size_kbytes,
2564 					mode_lib->vba.ip.rob_buffer_size_kbytes,
2565 					mode_lib->vba.CompressedBufferSegmentSizeInkByteFinal,
2566 					mode_lib->vba.Output,
2567 					mode_lib->vba.ReadBandwidthLuma,
2568 					mode_lib->vba.ReadBandwidthChroma,
2569 					mode_lib->vba.MaximumSwathWidthLuma,
2570 					mode_lib->vba.MaximumSwathWidthChroma,
2571 					mode_lib->vba.SourceRotation,
2572 					mode_lib->vba.ViewportStationary,
2573 					mode_lib->vba.SourcePixelFormat,
2574 					mode_lib->vba.SurfaceTiling,
2575 					mode_lib->vba.ViewportWidth,
2576 					mode_lib->vba.ViewportHeight,
2577 					mode_lib->vba.ViewportXStartY,
2578 					mode_lib->vba.ViewportYStartY,
2579 					mode_lib->vba.ViewportXStartC,
2580 					mode_lib->vba.ViewportYStartC,
2581 					mode_lib->vba.SurfaceWidthY,
2582 					mode_lib->vba.SurfaceWidthC,
2583 					mode_lib->vba.SurfaceHeightY,
2584 					mode_lib->vba.SurfaceHeightC,
2585 					mode_lib->vba.Read256BlockHeightY,
2586 					mode_lib->vba.Read256BlockHeightC,
2587 					mode_lib->vba.Read256BlockWidthY,
2588 					mode_lib->vba.Read256BlockWidthC,
2589 					mode_lib->vba.ODMCombineEnableThisState,
2590 					mode_lib->vba.BlendingAndTiming,
2591 					mode_lib->vba.BytePerPixelY,
2592 					mode_lib->vba.BytePerPixelC,
2593 					mode_lib->vba.BytePerPixelInDETY,
2594 					mode_lib->vba.BytePerPixelInDETC,
2595 					mode_lib->vba.HActive,
2596 					mode_lib->vba.HRatio,
2597 					mode_lib->vba.HRatioChroma,
2598 					mode_lib->vba.NoOfDPPThisState,
2599 					/* Output */
2600 					mode_lib->vba.swath_width_luma_ub_this_state,
2601 					mode_lib->vba.swath_width_chroma_ub_this_state,
2602 					mode_lib->vba.SwathWidthYThisState,
2603 					mode_lib->vba.SwathWidthCThisState,
2604 					mode_lib->vba.SwathHeightYThisState,
2605 					mode_lib->vba.SwathHeightCThisState,
2606 					mode_lib->vba.DETBufferSizeInKByteThisState,
2607 					mode_lib->vba.DETBufferSizeYThisState,
2608 					mode_lib->vba.DETBufferSizeCThisState,
2609 					&mode_lib->vba.UnboundedRequestEnabledThisState,
2610 					&mode_lib->vba.CompressedBufferSizeInkByteThisState,
2611 					&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer[0], /* Long CompBufReservedSpaceKBytes */
2612 					&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean[0], /* bool CompBufReservedSpaceNeedAdjustment */
2613 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[0],
2614 					&mode_lib->vba.ViewportSizeSupport[i][j]);
2615 
2616 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2617 				mode_lib->vba.swath_width_luma_ub_all_states[i][j][k] =
2618 						mode_lib->vba.swath_width_luma_ub_this_state[k];
2619 				mode_lib->vba.swath_width_chroma_ub_all_states[i][j][k] =
2620 						mode_lib->vba.swath_width_chroma_ub_this_state[k];
2621 				mode_lib->vba.SwathWidthYAllStates[i][j][k] = mode_lib->vba.SwathWidthYThisState[k];
2622 				mode_lib->vba.SwathWidthCAllStates[i][j][k] = mode_lib->vba.SwathWidthCThisState[k];
2623 				mode_lib->vba.SwathHeightYAllStates[i][j][k] = mode_lib->vba.SwathHeightYThisState[k];
2624 				mode_lib->vba.SwathHeightCAllStates[i][j][k] = mode_lib->vba.SwathHeightCThisState[k];
2625 				mode_lib->vba.UnboundedRequestEnabledAllStates[i][j] =
2626 						mode_lib->vba.UnboundedRequestEnabledThisState;
2627 				mode_lib->vba.CompressedBufferSizeInkByteAllStates[i][j] =
2628 						mode_lib->vba.CompressedBufferSizeInkByteThisState;
2629 				mode_lib->vba.DETBufferSizeInKByteAllStates[i][j][k] =
2630 						mode_lib->vba.DETBufferSizeInKByteThisState[k];
2631 				mode_lib->vba.DETBufferSizeYAllStates[i][j][k] =
2632 						mode_lib->vba.DETBufferSizeYThisState[k];
2633 				mode_lib->vba.DETBufferSizeCAllStates[i][j][k] =
2634 						mode_lib->vba.DETBufferSizeCThisState[k];
2635 			}
2636 		}
2637 	}
2638 
2639 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2640 		mode_lib->vba.cursor_bw[k] = mode_lib->vba.NumberOfCursors[k] * mode_lib->vba.CursorWidth[k][0]
2641 				* mode_lib->vba.CursorBPP[k][0] / 8.0
2642 				/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k];
2643 	}
2644 
2645 	dml32_CalculateSurfaceSizeInMall(
2646 			mode_lib->vba.NumberOfActiveSurfaces,
2647 			mode_lib->vba.MALLAllocatedForDCNFinal,
2648 			mode_lib->vba.UseMALLForStaticScreen,
2649 			mode_lib->vba.DCCEnable,
2650 			mode_lib->vba.ViewportStationary,
2651 			mode_lib->vba.ViewportXStartY,
2652 			mode_lib->vba.ViewportYStartY,
2653 			mode_lib->vba.ViewportXStartC,
2654 			mode_lib->vba.ViewportYStartC,
2655 			mode_lib->vba.ViewportWidth,
2656 			mode_lib->vba.ViewportHeight,
2657 			mode_lib->vba.BytePerPixelY,
2658 			mode_lib->vba.ViewportWidthChroma,
2659 			mode_lib->vba.ViewportHeightChroma,
2660 			mode_lib->vba.BytePerPixelC,
2661 			mode_lib->vba.SurfaceWidthY,
2662 			mode_lib->vba.SurfaceWidthC,
2663 			mode_lib->vba.SurfaceHeightY,
2664 			mode_lib->vba.SurfaceHeightC,
2665 			mode_lib->vba.Read256BlockWidthY,
2666 			mode_lib->vba.Read256BlockWidthC,
2667 			mode_lib->vba.Read256BlockHeightY,
2668 			mode_lib->vba.Read256BlockHeightC,
2669 			mode_lib->vba.MicroTileWidthY,
2670 			mode_lib->vba.MicroTileWidthC,
2671 			mode_lib->vba.MicroTileHeightY,
2672 			mode_lib->vba.MicroTileHeightC,
2673 
2674 			/* Output */
2675 			mode_lib->vba.SurfaceSizeInMALL,
2676 			&mode_lib->vba.ExceededMALLSize);
2677 
2678 	for (i = 0; i < v->soc.num_states; i++) {
2679 		for (j = 0; j < 2; j++) {
2680 			for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
2681 				mode_lib->vba.swath_width_luma_ub_this_state[k] =
2682 						mode_lib->vba.swath_width_luma_ub_all_states[i][j][k];
2683 				mode_lib->vba.swath_width_chroma_ub_this_state[k] =
2684 						mode_lib->vba.swath_width_chroma_ub_all_states[i][j][k];
2685 				mode_lib->vba.SwathWidthYThisState[k] = mode_lib->vba.SwathWidthYAllStates[i][j][k];
2686 				mode_lib->vba.SwathWidthCThisState[k] = mode_lib->vba.SwathWidthCAllStates[i][j][k];
2687 				mode_lib->vba.SwathHeightYThisState[k] = mode_lib->vba.SwathHeightYAllStates[i][j][k];
2688 				mode_lib->vba.SwathHeightCThisState[k] = mode_lib->vba.SwathHeightCAllStates[i][j][k];
2689 				mode_lib->vba.DETBufferSizeInKByteThisState[k] =
2690 						mode_lib->vba.DETBufferSizeInKByteAllStates[i][j][k];
2691 				mode_lib->vba.DETBufferSizeYThisState[k] =
2692 						mode_lib->vba.DETBufferSizeYAllStates[i][j][k];
2693 				mode_lib->vba.DETBufferSizeCThisState[k] =
2694 						mode_lib->vba.DETBufferSizeCAllStates[i][j][k];
2695 				mode_lib->vba.RequiredDPPCLKThisState[k] = mode_lib->vba.RequiredDPPCLK[i][j][k];
2696 				mode_lib->vba.NoOfDPPThisState[k] = mode_lib->vba.NoOfDPP[i][j][k];
2697 			}
2698 
2699 			mode_lib->vba.TotalNumberOfDCCActiveDPP[i][j] = 0;
2700 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2701 				if (mode_lib->vba.DCCEnable[k] == true) {
2702 					mode_lib->vba.TotalNumberOfDCCActiveDPP[i][j] =
2703 							mode_lib->vba.TotalNumberOfDCCActiveDPP[i][j]
2704 									+ mode_lib->vba.NoOfDPP[i][j][k];
2705 				}
2706 			}
2707 
2708 
2709 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2710 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].PixelClock = mode_lib->vba.PixelClock[k];
2711 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].DPPPerSurface = mode_lib->vba.NoOfDPP[i][j][k];
2712 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SourceRotation = mode_lib->vba.SourceRotation[k];
2713 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportHeight = mode_lib->vba.ViewportHeight[k];
2714 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportHeightChroma = mode_lib->vba.ViewportHeightChroma[k];
2715 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockWidth256BytesY = mode_lib->vba.Read256BlockWidthY[k];
2716 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockHeight256BytesY = mode_lib->vba.Read256BlockHeightY[k];
2717 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockWidth256BytesC = mode_lib->vba.Read256BlockWidthC[k];
2718 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockHeight256BytesC = mode_lib->vba.Read256BlockHeightC[k];
2719 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockWidthY = mode_lib->vba.MicroTileWidthY[k];
2720 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockHeightY = mode_lib->vba.MicroTileHeightY[k];
2721 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockWidthC = mode_lib->vba.MicroTileWidthC[k];
2722 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockHeightC = mode_lib->vba.MicroTileHeightC[k];
2723 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].InterlaceEnable = mode_lib->vba.Interlace[k];
2724 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].HTotal = mode_lib->vba.HTotal[k];
2725 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].DCCEnable = mode_lib->vba.DCCEnable[k];
2726 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SourcePixelFormat = mode_lib->vba.SourcePixelFormat[k];
2727 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SurfaceTiling = mode_lib->vba.SurfaceTiling[k];
2728 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BytePerPixelY = mode_lib->vba.BytePerPixelY[k];
2729 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BytePerPixelC = mode_lib->vba.BytePerPixelC[k];
2730 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ProgressiveToInterlaceUnitInOPP =
2731 				mode_lib->vba.ProgressiveToInterlaceUnitInOPP;
2732 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].VRatio = mode_lib->vba.VRatio[k];
2733 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].VRatioChroma = mode_lib->vba.VRatioChroma[k];
2734 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].VTaps = mode_lib->vba.vtaps[k];
2735 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].VTapsChroma = mode_lib->vba.VTAPsChroma[k];
2736 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].PitchY = mode_lib->vba.PitchY[k];
2737 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].DCCMetaPitchY = mode_lib->vba.DCCMetaPitchY[k];
2738 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].PitchC = mode_lib->vba.PitchC[k];
2739 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].DCCMetaPitchC = mode_lib->vba.DCCMetaPitchC[k];
2740 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportStationary = mode_lib->vba.ViewportStationary[k];
2741 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportXStart = mode_lib->vba.ViewportXStartY[k];
2742 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportYStart = mode_lib->vba.ViewportYStartY[k];
2743 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportXStartC = mode_lib->vba.ViewportXStartC[k];
2744 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportYStartC = mode_lib->vba.ViewportYStartC[k];
2745 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].FORCE_ONE_ROW_FOR_FRAME = mode_lib->vba.ForceOneRowForFrame[k];
2746 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SwathHeightY = mode_lib->vba.SwathHeightYThisState[k];
2747 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SwathHeightC = mode_lib->vba.SwathHeightCThisState[k];
2748 			}
2749 
2750 			{
2751 				dml32_CalculateVMRowAndSwath(
2752 						&v->dummy_vars.dml32_CalculateVMRowAndSwath,
2753 						mode_lib->vba.NumberOfActiveSurfaces,
2754 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters,
2755 						mode_lib->vba.SurfaceSizeInMALL,
2756 						mode_lib->vba.PTEBufferSizeInRequestsLuma,
2757 						mode_lib->vba.PTEBufferSizeInRequestsChroma,
2758 						mode_lib->vba.DCCMetaBufferSizeBytes,
2759 						mode_lib->vba.UseMALLForStaticScreen,
2760 						mode_lib->vba.UsesMALLForPStateChange,
2761 						mode_lib->vba.MALLAllocatedForDCNFinal,
2762 						mode_lib->vba.SwathWidthYThisState,
2763 						mode_lib->vba.SwathWidthCThisState,
2764 						mode_lib->vba.GPUVMEnable,
2765 						mode_lib->vba.HostVMEnable,
2766 						mode_lib->vba.HostVMMaxNonCachedPageTableLevels,
2767 						mode_lib->vba.GPUVMMaxPageTableLevels,
2768 						mode_lib->vba.GPUVMMinPageSizeKBytes,
2769 						mode_lib->vba.HostVMMinPageSize,
2770 
2771 						/* Output */
2772 						mode_lib->vba.PTEBufferSizeNotExceededPerState,
2773 						mode_lib->vba.DCCMetaBufferSizeNotExceededPerState,
2774 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[0],
2775 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[1],
2776 						mode_lib->vba.dpte_row_height,
2777 						mode_lib->vba.dpte_row_height_chroma,
2778 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[2],
2779 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[3],
2780 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[4],
2781 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[5],
2782 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[6],
2783 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[7],
2784 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[8],
2785 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[9],
2786 						mode_lib->vba.meta_row_height,
2787 						mode_lib->vba.meta_row_height_chroma,
2788 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[10],
2789 						mode_lib->vba.dpte_group_bytes,
2790 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[11],
2791 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[12],
2792 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[13],
2793 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[14],
2794 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[15],
2795 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[16],
2796 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[17],
2797 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[18],
2798 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[19],
2799 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[20],
2800 						mode_lib->vba.PrefetchLinesYThisState,
2801 						mode_lib->vba.PrefetchLinesCThisState,
2802 						mode_lib->vba.PrefillY,
2803 						mode_lib->vba.PrefillC,
2804 						mode_lib->vba.MaxNumSwY,
2805 						mode_lib->vba.MaxNumSwC,
2806 						mode_lib->vba.meta_row_bandwidth_this_state,
2807 						mode_lib->vba.dpte_row_bandwidth_this_state,
2808 						mode_lib->vba.DPTEBytesPerRowThisState,
2809 						mode_lib->vba.PDEAndMetaPTEBytesPerFrameThisState,
2810 						mode_lib->vba.MetaRowBytesThisState,
2811 						mode_lib->vba.use_one_row_for_frame_this_state,
2812 						mode_lib->vba.use_one_row_for_frame_flip_this_state,
2813 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[0], // Boolean UsesMALLForStaticScreen[]
2814 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[1], // Boolean PTE_BUFFER_MODE[]
2815 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[21]); // Long BIGK_FRAGMENT_SIZE[]
2816 			}
2817 
2818 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2819 				mode_lib->vba.PrefetchLinesY[i][j][k] = mode_lib->vba.PrefetchLinesYThisState[k];
2820 				mode_lib->vba.PrefetchLinesC[i][j][k] = mode_lib->vba.PrefetchLinesCThisState[k];
2821 				mode_lib->vba.meta_row_bandwidth[i][j][k] =
2822 						mode_lib->vba.meta_row_bandwidth_this_state[k];
2823 				mode_lib->vba.dpte_row_bandwidth[i][j][k] =
2824 						mode_lib->vba.dpte_row_bandwidth_this_state[k];
2825 				mode_lib->vba.DPTEBytesPerRow[i][j][k] = mode_lib->vba.DPTEBytesPerRowThisState[k];
2826 				mode_lib->vba.PDEAndMetaPTEBytesPerFrame[i][j][k] =
2827 						mode_lib->vba.PDEAndMetaPTEBytesPerFrameThisState[k];
2828 				mode_lib->vba.MetaRowBytes[i][j][k] = mode_lib->vba.MetaRowBytesThisState[k];
2829 				mode_lib->vba.use_one_row_for_frame[i][j][k] =
2830 						mode_lib->vba.use_one_row_for_frame_this_state[k];
2831 				mode_lib->vba.use_one_row_for_frame_flip[i][j][k] =
2832 						mode_lib->vba.use_one_row_for_frame_flip_this_state[k];
2833 			}
2834 
2835 			mode_lib->vba.PTEBufferSizeNotExceeded[i][j] = true;
2836 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2837 				if (mode_lib->vba.PTEBufferSizeNotExceededPerState[k] == false)
2838 					mode_lib->vba.PTEBufferSizeNotExceeded[i][j] = false;
2839 			}
2840 
2841 			mode_lib->vba.DCCMetaBufferSizeNotExceeded[i][j] = true;
2842 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2843 				if (mode_lib->vba.DCCMetaBufferSizeNotExceededPerState[k] == false)
2844 					mode_lib->vba.DCCMetaBufferSizeNotExceeded[i][j] = false;
2845 			}
2846 
2847 			mode_lib->vba.UrgLatency[i] = dml32_CalculateUrgentLatency(
2848 					mode_lib->vba.UrgentLatencyPixelDataOnly,
2849 					mode_lib->vba.UrgentLatencyPixelMixedWithVMData,
2850 					mode_lib->vba.UrgentLatencyVMDataOnly, mode_lib->vba.DoUrgentLatencyAdjustment,
2851 					mode_lib->vba.UrgentLatencyAdjustmentFabricClockComponent,
2852 					mode_lib->vba.UrgentLatencyAdjustmentFabricClockReference,
2853 					mode_lib->vba.FabricClockPerState[i]);
2854 
2855 			//bool   NotUrgentLatencyHiding[DC__NUM_DPP__MAX];
2856 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2857 				dml32_CalculateUrgentBurstFactor(
2858 						mode_lib->vba.UsesMALLForPStateChange[k],
2859 						mode_lib->vba.swath_width_luma_ub_this_state[k],
2860 						mode_lib->vba.swath_width_chroma_ub_this_state[k],
2861 						mode_lib->vba.SwathHeightYThisState[k],
2862 						mode_lib->vba.SwathHeightCThisState[k],
2863 						(double) mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
2864 						mode_lib->vba.UrgLatency[i],
2865 						mode_lib->vba.CursorBufferSize,
2866 						mode_lib->vba.CursorWidth[k][0],
2867 						mode_lib->vba.CursorBPP[k][0],
2868 						mode_lib->vba.VRatio[k],
2869 						mode_lib->vba.VRatioChroma[k],
2870 						mode_lib->vba.BytePerPixelInDETY[k],
2871 						mode_lib->vba.BytePerPixelInDETC[k],
2872 						mode_lib->vba.DETBufferSizeYThisState[k],
2873 						mode_lib->vba.DETBufferSizeCThisState[k],
2874 						/* Output */
2875 						&mode_lib->vba.UrgentBurstFactorCursor[k],
2876 						&mode_lib->vba.UrgentBurstFactorLuma[k],
2877 						&mode_lib->vba.UrgentBurstFactorChroma[k],
2878 						&mode_lib->vba.NoUrgentLatencyHiding[k]);
2879 			}
2880 
2881 			dml32_CalculateDCFCLKDeepSleep(
2882 					mode_lib->vba.NumberOfActiveSurfaces,
2883 					mode_lib->vba.BytePerPixelY,
2884 					mode_lib->vba.BytePerPixelC,
2885 					mode_lib->vba.VRatio,
2886 					mode_lib->vba.VRatioChroma,
2887 					mode_lib->vba.SwathWidthYThisState,
2888 					mode_lib->vba.SwathWidthCThisState,
2889 					mode_lib->vba.NoOfDPPThisState,
2890 					mode_lib->vba.HRatio,
2891 					mode_lib->vba.HRatioChroma,
2892 					mode_lib->vba.PixelClock,
2893 					mode_lib->vba.PSCL_FACTOR,
2894 					mode_lib->vba.PSCL_FACTOR_CHROMA,
2895 					mode_lib->vba.RequiredDPPCLKThisState,
2896 					mode_lib->vba.ReadBandwidthLuma,
2897 					mode_lib->vba.ReadBandwidthChroma,
2898 					mode_lib->vba.ReturnBusWidth,
2899 
2900 					/* Output */
2901 					&mode_lib->vba.ProjectedDCFCLKDeepSleep[i][j]);
2902 		}
2903 	}
2904 
2905 	m = 0;
2906 
2907 	//Calculate Return BW
2908 	for (i = 0; i < (int) v->soc.num_states; ++i) {
2909 		for (j = 0; j <= 1; ++j) {
2910 			for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
2911 				if (mode_lib->vba.BlendingAndTiming[k] == k) {
2912 					if (mode_lib->vba.WritebackEnable[k] == true) {
2913 						mode_lib->vba.WritebackDelayTime[k] =
2914 							mode_lib->vba.WritebackLatency
2915 						+ dml32_CalculateWriteBackDelay(
2916 							mode_lib->vba.WritebackPixelFormat[k],
2917 							mode_lib->vba.WritebackHRatio[k],
2918 							mode_lib->vba.WritebackVRatio[k],
2919 							mode_lib->vba.WritebackVTaps[k],
2920 							mode_lib->vba.WritebackDestinationWidth[k],
2921 							mode_lib->vba.WritebackDestinationHeight[k],
2922 							mode_lib->vba.WritebackSourceHeight[k],
2923 							mode_lib->vba.HTotal[k])
2924 							/ mode_lib->vba.RequiredDISPCLK[i][j];
2925 					} else {
2926 						mode_lib->vba.WritebackDelayTime[k] = 0.0;
2927 					}
2928 					for (m = 0; m <= mode_lib->vba.NumberOfActiveSurfaces - 1; m++) {
2929 						if (mode_lib->vba.BlendingAndTiming[m]
2930 								== k && mode_lib->vba.WritebackEnable[m] == true) {
2931 							mode_lib->vba.WritebackDelayTime[k] =
2932 								dml_max(mode_lib->vba.WritebackDelayTime[k],
2933 									mode_lib->vba.WritebackLatency
2934 								+ dml32_CalculateWriteBackDelay(
2935 									mode_lib->vba.WritebackPixelFormat[m],
2936 									mode_lib->vba.WritebackHRatio[m],
2937 									mode_lib->vba.WritebackVRatio[m],
2938 									mode_lib->vba.WritebackVTaps[m],
2939 									mode_lib->vba.WritebackDestinationWidth[m],
2940 									mode_lib->vba.WritebackDestinationHeight[m],
2941 									mode_lib->vba.WritebackSourceHeight[m],
2942 									mode_lib->vba.HTotal[m]) /
2943 									mode_lib->vba.RequiredDISPCLK[i][j]);
2944 						}
2945 					}
2946 				}
2947 			}
2948 			for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
2949 				for (m = 0; m <= mode_lib->vba.NumberOfActiveSurfaces - 1; m++) {
2950 					if (mode_lib->vba.BlendingAndTiming[k] == m) {
2951 						mode_lib->vba.WritebackDelayTime[k] =
2952 								mode_lib->vba.WritebackDelayTime[m];
2953 					}
2954 				}
2955 			}
2956 			mode_lib->vba.MaxMaxVStartup[i][j] = 0;
2957 			for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
2958 				mode_lib->vba.MaximumVStartup[i][j][k] = ((mode_lib->vba.Interlace[k] &&
2959 								!mode_lib->vba.ProgressiveToInterlaceUnitInOPP) ?
2960 								dml_floor((mode_lib->vba.VTotal[k] -
2961 									mode_lib->vba.VActive[k]) / 2.0, 1.0) :
2962 								mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k])
2963 								- dml_max(1.0, dml_ceil(1.0 *
2964 									mode_lib->vba.WritebackDelayTime[k] /
2965 									(mode_lib->vba.HTotal[k] /
2966 									mode_lib->vba.PixelClock[k]), 1.0));
2967 
2968 				// Clamp to max OTG vstartup register limit
2969 				if (mode_lib->vba.MaximumVStartup[i][j][k] > 1023)
2970 					mode_lib->vba.MaximumVStartup[i][j][k] = 1023;
2971 
2972 				mode_lib->vba.MaxMaxVStartup[i][j] = dml_max(mode_lib->vba.MaxMaxVStartup[i][j],
2973 						mode_lib->vba.MaximumVStartup[i][j][k]);
2974 			}
2975 		}
2976 	}
2977 
2978 	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ReorderingBytes = mode_lib->vba.NumberOfChannels
2979 			* dml_max3(mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelDataOnly,
2980 					mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelMixedWithVMData,
2981 					mode_lib->vba.UrgentOutOfOrderReturnPerChannelVMDataOnly);
2982 
2983 	dml32_CalculateMinAndMaxPrefetchMode(mode_lib->vba.AllowForPStateChangeOrStutterInVBlankFinal,
2984 			&mode_lib->vba.MinPrefetchMode,
2985 			&mode_lib->vba.MaxPrefetchMode);
2986 
2987 	for (i = 0; i < (int) v->soc.num_states; ++i) {
2988 		for (j = 0; j <= 1; ++j)
2989 			mode_lib->vba.DCFCLKState[i][j] = mode_lib->vba.DCFCLKPerState[i];
2990 	}
2991 
2992 	/* Immediate Flip and MALL parameters */
2993 	mode_lib->vba.ImmediateFlipRequiredFinal = false;
2994 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
2995 		mode_lib->vba.ImmediateFlipRequiredFinal = mode_lib->vba.ImmediateFlipRequiredFinal
2996 				|| (mode_lib->vba.ImmediateFlipRequirement[k] == dm_immediate_flip_required);
2997 	}
2998 
2999 	mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified = false;
3000 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
3001 		mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified =
3002 				mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified
3003 						|| ((mode_lib->vba.ImmediateFlipRequirement[k]
3004 								!= dm_immediate_flip_required)
3005 								&& (mode_lib->vba.ImmediateFlipRequirement[k]
3006 										!= dm_immediate_flip_not_required));
3007 	}
3008 	mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified =
3009 			mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified
3010 					&& mode_lib->vba.ImmediateFlipRequiredFinal;
3011 
3012 	mode_lib->vba.ImmediateFlipOrHostVMAndPStateWithMALLFullFrameOrPhantomPipe = false;
3013 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
3014 		mode_lib->vba.ImmediateFlipOrHostVMAndPStateWithMALLFullFrameOrPhantomPipe =
3015 			mode_lib->vba.ImmediateFlipOrHostVMAndPStateWithMALLFullFrameOrPhantomPipe ||
3016 			((mode_lib->vba.HostVMEnable == true || mode_lib->vba.ImmediateFlipRequirement[k] !=
3017 					dm_immediate_flip_not_required) &&
3018 			(mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_full_frame ||
3019 			mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_phantom_pipe));
3020 	}
3021 
3022 	mode_lib->vba.InvalidCombinationOfMALLUseForPStateAndStaticScreen = false;
3023 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
3024 		mode_lib->vba.InvalidCombinationOfMALLUseForPStateAndStaticScreen =
3025 			mode_lib->vba.InvalidCombinationOfMALLUseForPStateAndStaticScreen
3026 			|| ((mode_lib->vba.UseMALLForStaticScreen[k] == dm_use_mall_static_screen_enable
3027 			|| mode_lib->vba.UseMALLForStaticScreen[k] == dm_use_mall_static_screen_optimize)
3028 			&& (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_phantom_pipe))
3029 			|| ((mode_lib->vba.UseMALLForStaticScreen[k] == dm_use_mall_static_screen_disable
3030 			|| mode_lib->vba.UseMALLForStaticScreen[k] == dm_use_mall_static_screen_optimize)
3031 			&& (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_full_frame));
3032 	}
3033 
3034 	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.FullFrameMALLPStateMethod = false;
3035 	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SubViewportMALLPStateMethod = false;
3036 	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.PhantomPipeMALLPStateMethod = false;
3037 
3038 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
3039 		if (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_full_frame)
3040 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.FullFrameMALLPStateMethod = true;
3041 		if (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_sub_viewport)
3042 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SubViewportMALLPStateMethod = true;
3043 		if (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_phantom_pipe)
3044 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.PhantomPipeMALLPStateMethod = true;
3045 	}
3046 	mode_lib->vba.InvalidCombinationOfMALLUseForPState = (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SubViewportMALLPStateMethod
3047 			!= v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.PhantomPipeMALLPStateMethod) || (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SubViewportMALLPStateMethod && v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.FullFrameMALLPStateMethod);
3048 
3049 	if (mode_lib->vba.UseMinimumRequiredDCFCLK == true) {
3050 		dml32_UseMinimumDCFCLK(
3051 				mode_lib->vba.UsesMALLForPStateChange,
3052 				mode_lib->vba.DRRDisplay,
3053 				mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
3054 				mode_lib->vba.MaxInterDCNTileRepeaters,
3055 				mode_lib->vba.MaxPrefetchMode,
3056 				mode_lib->vba.DRAMClockChangeLatency,
3057 				mode_lib->vba.FCLKChangeLatency,
3058 				mode_lib->vba.SREnterPlusExitTime,
3059 				mode_lib->vba.ReturnBusWidth,
3060 				mode_lib->vba.RoundTripPingLatencyCycles,
3061 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ReorderingBytes,
3062 				mode_lib->vba.PixelChunkSizeInKByte,
3063 				mode_lib->vba.MetaChunkSize,
3064 				mode_lib->vba.GPUVMEnable,
3065 				mode_lib->vba.GPUVMMaxPageTableLevels,
3066 				mode_lib->vba.HostVMEnable,
3067 				mode_lib->vba.NumberOfActiveSurfaces,
3068 				mode_lib->vba.HostVMMinPageSize,
3069 				mode_lib->vba.HostVMMaxNonCachedPageTableLevels,
3070 				mode_lib->vba.DynamicMetadataVMEnabled,
3071 				mode_lib->vba.ImmediateFlipRequiredFinal,
3072 				mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
3073 				mode_lib->vba.MaxAveragePercentOfIdealSDPPortBWDisplayCanUseInNormalSystemOperation,
3074 				mode_lib->vba.PercentOfIdealFabricAndSDPPortBWReceivedAfterUrgLatency,
3075 				mode_lib->vba.VTotal,
3076 				mode_lib->vba.VActive,
3077 				mode_lib->vba.DynamicMetadataTransmittedBytes,
3078 				mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired,
3079 				mode_lib->vba.Interlace,
3080 				mode_lib->vba.RequiredDPPCLK,
3081 				mode_lib->vba.RequiredDISPCLK,
3082 				mode_lib->vba.UrgLatency,
3083 				mode_lib->vba.NoOfDPP,
3084 				mode_lib->vba.ProjectedDCFCLKDeepSleep,
3085 				mode_lib->vba.MaximumVStartup,
3086 				mode_lib->vba.TotalNumberOfActiveDPP,
3087 				mode_lib->vba.TotalNumberOfDCCActiveDPP,
3088 				mode_lib->vba.dpte_group_bytes,
3089 				mode_lib->vba.PrefetchLinesY,
3090 				mode_lib->vba.PrefetchLinesC,
3091 				mode_lib->vba.swath_width_luma_ub_all_states,
3092 				mode_lib->vba.swath_width_chroma_ub_all_states,
3093 				mode_lib->vba.BytePerPixelY,
3094 				mode_lib->vba.BytePerPixelC,
3095 				mode_lib->vba.HTotal,
3096 				mode_lib->vba.PixelClock,
3097 				mode_lib->vba.PDEAndMetaPTEBytesPerFrame,
3098 				mode_lib->vba.DPTEBytesPerRow,
3099 				mode_lib->vba.MetaRowBytes,
3100 				mode_lib->vba.DynamicMetadataEnable,
3101 				mode_lib->vba.ReadBandwidthLuma,
3102 				mode_lib->vba.ReadBandwidthChroma,
3103 				mode_lib->vba.DCFCLKPerState,
3104 
3105 				/* Output */
3106 				mode_lib->vba.DCFCLKState);
3107 	} // UseMinimumRequiredDCFCLK == true
3108 
3109 	for (i = 0; i < (int) v->soc.num_states; ++i) {
3110 		for (j = 0; j <= 1; ++j) {
3111 			mode_lib->vba.ReturnBWPerState[i][j] = dml32_get_return_bw_mbps(&mode_lib->vba.soc, i,
3112 					mode_lib->vba.HostVMEnable, mode_lib->vba.DCFCLKState[i][j],
3113 					mode_lib->vba.FabricClockPerState[i], mode_lib->vba.DRAMSpeedPerState[i]);
3114 		}
3115 	}
3116 
3117 	//Re-ordering Buffer Support Check
3118 	for (i = 0; i < (int) v->soc.num_states; ++i) {
3119 		for (j = 0; j <= 1; ++j) {
3120 			if ((mode_lib->vba.ROBBufferSizeInKByte - mode_lib->vba.PixelChunkSizeInKByte) * 1024
3121 					/ mode_lib->vba.ReturnBWPerState[i][j]
3122 					> (mode_lib->vba.RoundTripPingLatencyCycles + 32)
3123 							/ mode_lib->vba.DCFCLKState[i][j]
3124 							+ v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ReorderingBytes / mode_lib->vba.ReturnBWPerState[i][j]) {
3125 				mode_lib->vba.ROBSupport[i][j] = true;
3126 			} else {
3127 				mode_lib->vba.ROBSupport[i][j] = false;
3128 			}
3129 		}
3130 	}
3131 
3132 	//Vertical Active BW support check
3133 	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaxTotalVActiveRDBandwidth = 0;
3134 
3135 	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
3136 		v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaxTotalVActiveRDBandwidth += mode_lib->vba.ReadBandwidthLuma[k]
3137 				+ mode_lib->vba.ReadBandwidthChroma[k];
3138 	}
3139 
3140 	for (i = 0; i < (int) v->soc.num_states; ++i) {
3141 		for (j = 0; j <= 1; ++j) {
3142 			mode_lib->vba.MaxTotalVerticalActiveAvailableBandwidth[i][j] =
3143 				dml_min3(mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLKState[i][j]
3144 					* mode_lib->vba.MaxAveragePercentOfIdealSDPPortBWDisplayCanUseInNormalSystemOperation / 100,
3145 					mode_lib->vba.FabricClockPerState[i]
3146 					* mode_lib->vba.FabricDatapathToDCNDataReturn
3147 					* mode_lib->vba.MaxAveragePercentOfIdealFabricBWDisplayCanUseInNormalSystemOperation / 100,
3148 					mode_lib->vba.DRAMSpeedPerState[i]
3149 					* mode_lib->vba.NumberOfChannels
3150 					* mode_lib->vba.DRAMChannelWidth
3151 					* (i < 2 ? mode_lib->vba.MaxAveragePercentOfIdealDRAMBWDisplayCanUseInNormalSystemOperationSTROBE : mode_lib->vba.MaxAveragePercentOfIdealDRAMBWDisplayCanUseInNormalSystemOperation) / 100);
3152 
3153 			if (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaxTotalVActiveRDBandwidth
3154 					<= mode_lib->vba.MaxTotalVerticalActiveAvailableBandwidth[i][j]) {
3155 				mode_lib->vba.TotalVerticalActiveBandwidthSupport[i][j] = true;
3156 			} else {
3157 				mode_lib->vba.TotalVerticalActiveBandwidthSupport[i][j] = false;
3158 			}
3159 		}
3160 	}
3161 
3162 	/* Prefetch Check */
3163 
3164 	for (i = 0; i < (int) v->soc.num_states; ++i) {
3165 		for (j = 0; j <= 1; ++j) {
3166 
3167 			mode_lib->vba.TimeCalc = 24 / mode_lib->vba.ProjectedDCFCLKDeepSleep[i][j];
3168 
3169 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
3170 				mode_lib->vba.NoOfDPPThisState[k] = mode_lib->vba.NoOfDPP[i][j][k];
3171 				mode_lib->vba.swath_width_luma_ub_this_state[k] =
3172 						mode_lib->vba.swath_width_luma_ub_all_states[i][j][k];
3173 				mode_lib->vba.swath_width_chroma_ub_this_state[k] =
3174 						mode_lib->vba.swath_width_chroma_ub_all_states[i][j][k];
3175 				mode_lib->vba.SwathWidthYThisState[k] = mode_lib->vba.SwathWidthYAllStates[i][j][k];
3176 				mode_lib->vba.SwathWidthCThisState[k] = mode_lib->vba.SwathWidthCAllStates[i][j][k];
3177 				mode_lib->vba.SwathHeightYThisState[k] = mode_lib->vba.SwathHeightYAllStates[i][j][k];
3178 				mode_lib->vba.SwathHeightCThisState[k] = mode_lib->vba.SwathHeightCAllStates[i][j][k];
3179 				mode_lib->vba.UnboundedRequestEnabledThisState =
3180 						mode_lib->vba.UnboundedRequestEnabledAllStates[i][j];
3181 				mode_lib->vba.CompressedBufferSizeInkByteThisState =
3182 						mode_lib->vba.CompressedBufferSizeInkByteAllStates[i][j];
3183 				mode_lib->vba.DETBufferSizeInKByteThisState[k] =
3184 						mode_lib->vba.DETBufferSizeInKByteAllStates[i][j][k];
3185 				mode_lib->vba.DETBufferSizeYThisState[k] =
3186 						mode_lib->vba.DETBufferSizeYAllStates[i][j][k];
3187 				mode_lib->vba.DETBufferSizeCThisState[k] =
3188 						mode_lib->vba.DETBufferSizeCAllStates[i][j][k];
3189 			}
3190 
3191 			mode_lib->vba.VActiveBandwithSupport[i][j] = dml32_CalculateVActiveBandwithSupport(
3192 					mode_lib->vba.NumberOfActiveSurfaces,
3193 					mode_lib->vba.ReturnBWPerState[i][j],
3194 					mode_lib->vba.NoUrgentLatencyHiding,
3195 					mode_lib->vba.ReadBandwidthLuma,
3196 					mode_lib->vba.ReadBandwidthChroma,
3197 					mode_lib->vba.cursor_bw,
3198 					mode_lib->vba.meta_row_bandwidth_this_state,
3199 					mode_lib->vba.dpte_row_bandwidth_this_state,
3200 					mode_lib->vba.NoOfDPPThisState,
3201 					mode_lib->vba.UrgentBurstFactorLuma,
3202 					mode_lib->vba.UrgentBurstFactorChroma,
3203 					mode_lib->vba.UrgentBurstFactorCursor);
3204 
3205 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.VMDataOnlyReturnBWPerState = dml32_get_return_bw_mbps_vm_only(&mode_lib->vba.soc, i,
3206 					mode_lib->vba.DCFCLKState[i][j], mode_lib->vba.FabricClockPerState[i],
3207 					mode_lib->vba.DRAMSpeedPerState[i]);
3208 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor = 1;
3209 
3210 			if (mode_lib->vba.GPUVMEnable && mode_lib->vba.HostVMEnable)
3211 				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor = mode_lib->vba.ReturnBWPerState[i][j]
3212 						/ v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.VMDataOnlyReturnBWPerState;
3213 
3214 			mode_lib->vba.ExtraLatency = dml32_CalculateExtraLatency(
3215 					mode_lib->vba.RoundTripPingLatencyCycles, v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ReorderingBytes,
3216 					mode_lib->vba.DCFCLKState[i][j], mode_lib->vba.TotalNumberOfActiveDPP[i][j],
3217 					mode_lib->vba.PixelChunkSizeInKByte,
3218 					mode_lib->vba.TotalNumberOfDCCActiveDPP[i][j], mode_lib->vba.MetaChunkSize,
3219 					mode_lib->vba.ReturnBWPerState[i][j], mode_lib->vba.GPUVMEnable,
3220 					mode_lib->vba.HostVMEnable, mode_lib->vba.NumberOfActiveSurfaces,
3221 					mode_lib->vba.NoOfDPPThisState, mode_lib->vba.dpte_group_bytes,
3222 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor, mode_lib->vba.HostVMMinPageSize,
3223 					mode_lib->vba.HostVMMaxNonCachedPageTableLevels);
3224 
3225 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState = mode_lib->vba.MinPrefetchMode;
3226 
3227 			mode_lib->vba.NextMaxVStartup = mode_lib->vba.MaxMaxVStartup[i][j];
3228 
3229 			do {
3230 				mode_lib->vba.PrefetchModePerState[i][j] = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState;
3231 				mode_lib->vba.MaxVStartup = mode_lib->vba.NextMaxVStartup;
3232 
3233 				for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
3234 					mode_lib->vba.TWait = dml32_CalculateTWait(
3235 							mode_lib->vba.PrefetchModePerState[i][j],
3236 							mode_lib->vba.UsesMALLForPStateChange[k],
3237 							mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
3238 							mode_lib->vba.DRRDisplay[k],
3239 							mode_lib->vba.DRAMClockChangeLatency,
3240 							mode_lib->vba.FCLKChangeLatency, mode_lib->vba.UrgLatency[i],
3241 							mode_lib->vba.SREnterPlusExitTime);
3242 
3243 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.Dppclk = mode_lib->vba.RequiredDPPCLK[i][j][k];
3244 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.Dispclk = mode_lib->vba.RequiredDISPCLK[i][j];
3245 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.PixelClock = mode_lib->vba.PixelClock[k];
3246 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.DCFClkDeepSleep = mode_lib->vba.ProjectedDCFCLKDeepSleep[i][j];
3247 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.DPPPerSurface = mode_lib->vba.NoOfDPP[i][j][k];
3248 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.ScalerEnabled = mode_lib->vba.ScalerEnabled[k];
3249 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.SourceRotation = mode_lib->vba.SourceRotation[k];
3250 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BlockWidth256BytesY = mode_lib->vba.Read256BlockWidthY[k];
3251 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BlockHeight256BytesY = mode_lib->vba.Read256BlockHeightY[k];
3252 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BlockWidth256BytesC = mode_lib->vba.Read256BlockWidthC[k];
3253 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BlockHeight256BytesC = mode_lib->vba.Read256BlockHeightC[k];
3254 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.InterlaceEnable = mode_lib->vba.Interlace[k];
3255 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.NumberOfCursors = mode_lib->vba.NumberOfCursors[k];
3256 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.VBlank = mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k];
3257 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.HTotal = mode_lib->vba.HTotal[k];
3258 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.HActive = mode_lib->vba.HActive[k];
3259 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.DCCEnable = mode_lib->vba.DCCEnable[k];
3260 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.ODMMode = mode_lib->vba.ODMCombineEnablePerState[i][k];
3261 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.SourcePixelFormat = mode_lib->vba.SourcePixelFormat[k];
3262 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BytePerPixelY = mode_lib->vba.BytePerPixelY[k];
3263 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BytePerPixelC = mode_lib->vba.BytePerPixelC[k];
3264 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.ProgressiveToInterlaceUnitInOPP =
3265 							mode_lib->vba.ProgressiveToInterlaceUnitInOPP;
3266 
3267 					mode_lib->vba.NoTimeForPrefetch[i][j][k] =
3268 						dml32_CalculatePrefetchSchedule(
3269 							&v->dummy_vars.dml32_CalculatePrefetchSchedule,
3270 							v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor,
3271 							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe,
3272 							mode_lib->vba.DSCDelayPerState[i][k],
3273 							mode_lib->vba.DPPCLKDelaySubtotal +
3274 								mode_lib->vba.DPPCLKDelayCNVCFormater,
3275 							mode_lib->vba.DPPCLKDelaySCL,
3276 							mode_lib->vba.DPPCLKDelaySCLLBOnly,
3277 							mode_lib->vba.DPPCLKDelayCNVCCursor,
3278 							mode_lib->vba.DISPCLKDelaySubtotal,
3279 							mode_lib->vba.SwathWidthYThisState[k] /
3280 								mode_lib->vba.HRatio[k],
3281 							mode_lib->vba.OutputFormat[k],
3282 							mode_lib->vba.MaxInterDCNTileRepeaters,
3283 							dml_min(mode_lib->vba.MaxVStartup,
3284 									mode_lib->vba.MaximumVStartup[i][j][k]),
3285 							mode_lib->vba.MaximumVStartup[i][j][k],
3286 							mode_lib->vba.GPUVMMaxPageTableLevels,
3287 							mode_lib->vba.GPUVMEnable, mode_lib->vba.HostVMEnable,
3288 							mode_lib->vba.HostVMMaxNonCachedPageTableLevels,
3289 							mode_lib->vba.HostVMMinPageSize,
3290 							mode_lib->vba.DynamicMetadataEnable[k],
3291 							mode_lib->vba.DynamicMetadataVMEnabled,
3292 							mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired[k],
3293 							mode_lib->vba.DynamicMetadataTransmittedBytes[k],
3294 							mode_lib->vba.UrgLatency[i],
3295 							mode_lib->vba.ExtraLatency,
3296 							mode_lib->vba.TimeCalc,
3297 							mode_lib->vba.PDEAndMetaPTEBytesPerFrame[i][j][k],
3298 							mode_lib->vba.MetaRowBytes[i][j][k],
3299 							mode_lib->vba.DPTEBytesPerRow[i][j][k],
3300 							mode_lib->vba.PrefetchLinesY[i][j][k],
3301 							mode_lib->vba.SwathWidthYThisState[k],
3302 							mode_lib->vba.PrefillY[k],
3303 							mode_lib->vba.MaxNumSwY[k],
3304 							mode_lib->vba.PrefetchLinesC[i][j][k],
3305 							mode_lib->vba.SwathWidthCThisState[k],
3306 							mode_lib->vba.PrefillC[k],
3307 							mode_lib->vba.MaxNumSwC[k],
3308 							mode_lib->vba.swath_width_luma_ub_this_state[k],
3309 							mode_lib->vba.swath_width_chroma_ub_this_state[k],
3310 							mode_lib->vba.SwathHeightYThisState[k],
3311 							mode_lib->vba.SwathHeightCThisState[k], mode_lib->vba.TWait,
3312 
3313 							/* Output */
3314 							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTXAfterScaler[k],
3315 							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTYAfterScaler[k],
3316 							&mode_lib->vba.LineTimesForPrefetch[k],
3317 							&mode_lib->vba.PrefetchBW[k],
3318 							&mode_lib->vba.LinesForMetaPTE[k],
3319 							&mode_lib->vba.LinesForMetaAndDPTERow[k],
3320 							&mode_lib->vba.VRatioPreY[i][j][k],
3321 							&mode_lib->vba.VRatioPreC[i][j][k],
3322 							&mode_lib->vba.RequiredPrefetchPixelDataBWLuma[0][0][k],
3323 							&mode_lib->vba.RequiredPrefetchPixelDataBWChroma[0][0][k],
3324 							&mode_lib->vba.NoTimeForDynamicMetadata[i][j][k],
3325 							&mode_lib->vba.Tno_bw[k],
3326 							&mode_lib->vba.prefetch_vmrow_bw[k],
3327 							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[0],         // double *Tdmdl_vm
3328 							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[1],         // double *Tdmdl
3329 							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[2],         // double *TSetup
3330 							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer[0],         							    // unsigned int   *VUpdateOffsetPix
3331 							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[3],         // unsigned int   *VUpdateWidthPix
3332 							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[4]);        // unsigned int   *VReadyOffsetPix
3333 				}
3334 
3335 				for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
3336 					dml32_CalculateUrgentBurstFactor(
3337 							mode_lib->vba.UsesMALLForPStateChange[k],
3338 							mode_lib->vba.swath_width_luma_ub_this_state[k],
3339 							mode_lib->vba.swath_width_chroma_ub_this_state[k],
3340 							mode_lib->vba.SwathHeightYThisState[k],
3341 							mode_lib->vba.SwathHeightCThisState[k],
3342 							mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
3343 							mode_lib->vba.UrgLatency[i], mode_lib->vba.CursorBufferSize,
3344 							mode_lib->vba.CursorWidth[k][0], mode_lib->vba.CursorBPP[k][0],
3345 							mode_lib->vba.VRatioPreY[i][j][k],
3346 							mode_lib->vba.VRatioPreC[i][j][k],
3347 							mode_lib->vba.BytePerPixelInDETY[k],
3348 							mode_lib->vba.BytePerPixelInDETC[k],
3349 							mode_lib->vba.DETBufferSizeYThisState[k],
3350 							mode_lib->vba.DETBufferSizeCThisState[k],
3351 							/* Output */
3352 							&mode_lib->vba.UrgentBurstFactorCursorPre[k],
3353 							&mode_lib->vba.UrgentBurstFactorLumaPre[k],
3354 							&mode_lib->vba.UrgentBurstFactorChroma[k],
3355 							&mode_lib->vba.NotUrgentLatencyHidingPre[k]);
3356 				}
3357 
3358 				{
3359 					dml32_CalculatePrefetchBandwithSupport(
3360 							mode_lib->vba.NumberOfActiveSurfaces,
3361 							mode_lib->vba.ReturnBWPerState[i][j],
3362 							mode_lib->vba.NotUrgentLatencyHidingPre,
3363 							mode_lib->vba.ReadBandwidthLuma,
3364 							mode_lib->vba.ReadBandwidthChroma,
3365 							mode_lib->vba.RequiredPrefetchPixelDataBWLuma[0][0],
3366 							mode_lib->vba.RequiredPrefetchPixelDataBWChroma[0][0],
3367 							mode_lib->vba.cursor_bw,
3368 							mode_lib->vba.meta_row_bandwidth_this_state,
3369 							mode_lib->vba.dpte_row_bandwidth_this_state,
3370 							mode_lib->vba.cursor_bw_pre,
3371 							mode_lib->vba.prefetch_vmrow_bw,
3372 							mode_lib->vba.NoOfDPPThisState,
3373 							mode_lib->vba.UrgentBurstFactorLuma,
3374 							mode_lib->vba.UrgentBurstFactorChroma,
3375 							mode_lib->vba.UrgentBurstFactorCursor,
3376 							mode_lib->vba.UrgentBurstFactorLumaPre,
3377 							mode_lib->vba.UrgentBurstFactorChromaPre,
3378 							mode_lib->vba.UrgentBurstFactorCursorPre,
3379 
3380 							/* output */
3381 							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[0],   // Single  *PrefetchBandwidth
3382 							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[1],   // Single  *FractionOfUrgentBandwidth
3383 							&mode_lib->vba.PrefetchSupported[i][j]);
3384 				}
3385 
3386 				for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
3387 					if (mode_lib->vba.LineTimesForPrefetch[k]
3388 							< 2.0 || mode_lib->vba.LinesForMetaPTE[k] >= 32.0
3389 							|| mode_lib->vba.LinesForMetaAndDPTERow[k] >= 16.0
3390 							|| mode_lib->vba.NoTimeForPrefetch[i][j][k] == true) {
3391 						mode_lib->vba.PrefetchSupported[i][j] = false;
3392 					}
3393 				}
3394 
3395 				mode_lib->vba.DynamicMetadataSupported[i][j] = true;
3396 				for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
3397 					if (mode_lib->vba.NoTimeForDynamicMetadata[i][j][k] == true)
3398 						mode_lib->vba.DynamicMetadataSupported[i][j] = false;
3399 				}
3400 
3401 				mode_lib->vba.VRatioInPrefetchSupported[i][j] = true;
3402 				for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
3403 					if (mode_lib->vba.VRatioPreY[i][j][k] > __DML_MAX_VRATIO_PRE__
3404 							|| mode_lib->vba.VRatioPreC[i][j][k] > __DML_MAX_VRATIO_PRE__
3405 							|| mode_lib->vba.NoTimeForPrefetch[i][j][k] == true) {
3406 						mode_lib->vba.VRatioInPrefetchSupported[i][j] = false;
3407 					}
3408 				}
3409 				mode_lib->vba.AnyLinesForVMOrRowTooLarge = false;
3410 				for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
3411 					if (mode_lib->vba.LinesForMetaAndDPTERow[k] >= 16
3412 							|| mode_lib->vba.LinesForMetaPTE[k] >= 32) {
3413 						mode_lib->vba.AnyLinesForVMOrRowTooLarge = true;
3414 					}
3415 				}
3416 
3417 				if (mode_lib->vba.PrefetchSupported[i][j] == true
3418 						&& mode_lib->vba.VRatioInPrefetchSupported[i][j] == true) {
3419 					mode_lib->vba.BandwidthAvailableForImmediateFlip =
3420 							dml32_CalculateBandwidthAvailableForImmediateFlip(
3421 							mode_lib->vba.NumberOfActiveSurfaces,
3422 							mode_lib->vba.ReturnBWPerState[i][j],
3423 							mode_lib->vba.ReadBandwidthLuma,
3424 							mode_lib->vba.ReadBandwidthChroma,
3425 							mode_lib->vba.RequiredPrefetchPixelDataBWLuma[0][0],
3426 							mode_lib->vba.RequiredPrefetchPixelDataBWChroma[0][0],
3427 							mode_lib->vba.cursor_bw,
3428 							mode_lib->vba.cursor_bw_pre,
3429 							mode_lib->vba.NoOfDPPThisState,
3430 							mode_lib->vba.UrgentBurstFactorLuma,
3431 							mode_lib->vba.UrgentBurstFactorChroma,
3432 							mode_lib->vba.UrgentBurstFactorCursor,
3433 							mode_lib->vba.UrgentBurstFactorLumaPre,
3434 							mode_lib->vba.UrgentBurstFactorChromaPre,
3435 							mode_lib->vba.UrgentBurstFactorCursorPre);
3436 
3437 					mode_lib->vba.TotImmediateFlipBytes = 0.0;
3438 					for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
3439 						if (!(mode_lib->vba.ImmediateFlipRequirement[k] ==
3440 								dm_immediate_flip_not_required)) {
3441 							mode_lib->vba.TotImmediateFlipBytes =
3442 									mode_lib->vba.TotImmediateFlipBytes
3443 								+ mode_lib->vba.NoOfDPP[i][j][k]
3444 								* mode_lib->vba.PDEAndMetaPTEBytesPerFrame[i][j][k]
3445 								+ mode_lib->vba.MetaRowBytes[i][j][k];
3446 							if (mode_lib->vba.use_one_row_for_frame_flip[i][j][k]) {
3447 								mode_lib->vba.TotImmediateFlipBytes =
3448 									mode_lib->vba.TotImmediateFlipBytes + 2
3449 								* mode_lib->vba.DPTEBytesPerRow[i][j][k];
3450 							} else {
3451 								mode_lib->vba.TotImmediateFlipBytes =
3452 									mode_lib->vba.TotImmediateFlipBytes
3453 								+ mode_lib->vba.DPTEBytesPerRow[i][j][k];
3454 							}
3455 						}
3456 					}
3457 
3458 					for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
3459 						dml32_CalculateFlipSchedule(v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor,
3460 							mode_lib->vba.ExtraLatency,
3461 							mode_lib->vba.UrgLatency[i],
3462 							mode_lib->vba.GPUVMMaxPageTableLevels,
3463 							mode_lib->vba.HostVMEnable,
3464 							mode_lib->vba.HostVMMaxNonCachedPageTableLevels,
3465 							mode_lib->vba.GPUVMEnable,
3466 							mode_lib->vba.HostVMMinPageSize,
3467 							mode_lib->vba.PDEAndMetaPTEBytesPerFrame[i][j][k],
3468 							mode_lib->vba.MetaRowBytes[i][j][k],
3469 							mode_lib->vba.DPTEBytesPerRow[i][j][k],
3470 							mode_lib->vba.BandwidthAvailableForImmediateFlip,
3471 							mode_lib->vba.TotImmediateFlipBytes,
3472 							mode_lib->vba.SourcePixelFormat[k],
3473 							(mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]),
3474 							mode_lib->vba.VRatio[k],
3475 							mode_lib->vba.VRatioChroma[k],
3476 							mode_lib->vba.Tno_bw[k],
3477 								mode_lib->vba.DCCEnable[k],
3478 							mode_lib->vba.dpte_row_height[k],
3479 							mode_lib->vba.meta_row_height[k],
3480 							mode_lib->vba.dpte_row_height_chroma[k],
3481 							mode_lib->vba.meta_row_height_chroma[k],
3482 							mode_lib->vba.use_one_row_for_frame_flip[i][j][k], // 24
3483 
3484 							/* Output */
3485 							&mode_lib->vba.DestinationLinesToRequestVMInImmediateFlip[k],
3486 							&mode_lib->vba.DestinationLinesToRequestRowInImmediateFlip[k],
3487 							&mode_lib->vba.final_flip_bw[k],
3488 							&mode_lib->vba.ImmediateFlipSupportedForPipe[k]);
3489 					}
3490 
3491 					{
3492 						dml32_CalculateImmediateFlipBandwithSupport(mode_lib->vba.NumberOfActiveSurfaces,
3493 								mode_lib->vba.ReturnBWPerState[i][j],
3494 								mode_lib->vba.ImmediateFlipRequirement,
3495 								mode_lib->vba.final_flip_bw,
3496 								mode_lib->vba.ReadBandwidthLuma,
3497 								mode_lib->vba.ReadBandwidthChroma,
3498 								mode_lib->vba.RequiredPrefetchPixelDataBWLuma[0][0],
3499 								mode_lib->vba.RequiredPrefetchPixelDataBWChroma[0][0],
3500 								mode_lib->vba.cursor_bw,
3501 								mode_lib->vba.meta_row_bandwidth_this_state,
3502 								mode_lib->vba.dpte_row_bandwidth_this_state,
3503 								mode_lib->vba.cursor_bw_pre,
3504 								mode_lib->vba.prefetch_vmrow_bw,
3505 								mode_lib->vba.DPPPerPlane,
3506 								mode_lib->vba.UrgentBurstFactorLuma,
3507 								mode_lib->vba.UrgentBurstFactorChroma,
3508 								mode_lib->vba.UrgentBurstFactorCursor,
3509 								mode_lib->vba.UrgentBurstFactorLumaPre,
3510 								mode_lib->vba.UrgentBurstFactorChromaPre,
3511 								mode_lib->vba.UrgentBurstFactorCursorPre,
3512 
3513 								/* output */
3514 								&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[0], //  Single  *TotalBandwidth
3515 								&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[1], //  Single  *FractionOfUrgentBandwidth
3516 								&mode_lib->vba.ImmediateFlipSupportedForState[i][j]); // Boolean *ImmediateFlipBandwidthSupport
3517 					}
3518 
3519 					for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
3520 						if (!(mode_lib->vba.ImmediateFlipRequirement[k]
3521 								== dm_immediate_flip_not_required)
3522 								&& (mode_lib->vba.ImmediateFlipSupportedForPipe[k]
3523 										== false))
3524 							mode_lib->vba.ImmediateFlipSupportedForState[i][j] = false;
3525 					}
3526 				} else { // if prefetch not support, assume iflip not supported
3527 					mode_lib->vba.ImmediateFlipSupportedForState[i][j] = false;
3528 				}
3529 
3530 				if (mode_lib->vba.MaxVStartup <= __DML_VBA_MIN_VSTARTUP__
3531 						|| mode_lib->vba.AnyLinesForVMOrRowTooLarge == false) {
3532 					mode_lib->vba.NextMaxVStartup = mode_lib->vba.MaxMaxVStartup[i][j];
3533 					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState + 1;
3534 				} else {
3535 					mode_lib->vba.NextMaxVStartup = mode_lib->vba.NextMaxVStartup - 1;
3536 				}
3537 			} while (!((mode_lib->vba.PrefetchSupported[i][j] == true
3538 					&& mode_lib->vba.DynamicMetadataSupported[i][j] == true
3539 					&& mode_lib->vba.VRatioInPrefetchSupported[i][j] == true &&
3540 					// consider flip support is okay if when there is no hostvm and the
3541 					// user does't require a iflip OR the flip bw is ok
3542 					// If there is hostvm, DCN needs to support iflip for invalidation
3543 					((mode_lib->vba.HostVMEnable == false
3544 							&& !mode_lib->vba.ImmediateFlipRequiredFinal)
3545 							|| mode_lib->vba.ImmediateFlipSupportedForState[i][j] == true))
3546 					|| (mode_lib->vba.NextMaxVStartup == mode_lib->vba.MaxMaxVStartup[i][j]
3547 							&& v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState > mode_lib->vba.MaxPrefetchMode)));
3548 
3549 			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
3550 				mode_lib->vba.use_one_row_for_frame_this_state[k] =
3551 						mode_lib->vba.use_one_row_for_frame[i][j][k];
3552 			}
3553 
3554 
3555 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.UrgentLatency = mode_lib->vba.UrgLatency[i];
3556 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.ExtraLatency = mode_lib->vba.ExtraLatency;
3557 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.WritebackLatency = mode_lib->vba.WritebackLatency;
3558 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.DRAMClockChangeLatency = mode_lib->vba.DRAMClockChangeLatency;
3559 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.FCLKChangeLatency = mode_lib->vba.FCLKChangeLatency;
3560 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SRExitTime = mode_lib->vba.SRExitTime;
3561 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SREnterPlusExitTime = mode_lib->vba.SREnterPlusExitTime;
3562 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SRExitZ8Time = mode_lib->vba.SRExitZ8Time;
3563 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SREnterPlusExitZ8Time = mode_lib->vba.SREnterPlusExitZ8Time;
3564 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.USRRetrainingLatency = mode_lib->vba.USRRetrainingLatency;
3565 			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SMNLatency = mode_lib->vba.SMNLatency;
3566 
3567 			{
3568 				dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport(
3569 						&v->dummy_vars.dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport,
3570 						mode_lib->vba.USRRetrainingRequiredFinal,
3571 						mode_lib->vba.UsesMALLForPStateChange,
3572 						mode_lib->vba.PrefetchModePerState[i][j],
3573 						mode_lib->vba.NumberOfActiveSurfaces,
3574 						mode_lib->vba.MaxLineBufferLines,
3575 						mode_lib->vba.LineBufferSizeFinal,
3576 						mode_lib->vba.WritebackInterfaceBufferSize,
3577 						mode_lib->vba.DCFCLKState[i][j],
3578 						mode_lib->vba.ReturnBWPerState[i][j],
3579 						mode_lib->vba.SynchronizeTimingsFinal,
3580 						mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
3581 						mode_lib->vba.DRRDisplay,
3582 						mode_lib->vba.dpte_group_bytes,
3583 						mode_lib->vba.meta_row_height,
3584 						mode_lib->vba.meta_row_height_chroma,
3585 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters,
3586 						mode_lib->vba.WritebackChunkSize,
3587 						mode_lib->vba.SOCCLKPerState[i],
3588 						mode_lib->vba.ProjectedDCFCLKDeepSleep[i][j],
3589 						mode_lib->vba.DETBufferSizeYThisState,
3590 						mode_lib->vba.DETBufferSizeCThisState,
3591 						mode_lib->vba.SwathHeightYThisState,
3592 						mode_lib->vba.SwathHeightCThisState,
3593 						mode_lib->vba.LBBitPerPixel,
3594 						mode_lib->vba.SwathWidthYThisState, // 24
3595 						mode_lib->vba.SwathWidthCThisState,
3596 						mode_lib->vba.HRatio,
3597 						mode_lib->vba.HRatioChroma,
3598 						mode_lib->vba.vtaps,
3599 						mode_lib->vba.VTAPsChroma,
3600 						mode_lib->vba.VRatio,
3601 						mode_lib->vba.VRatioChroma,
3602 						mode_lib->vba.HTotal,
3603 						mode_lib->vba.VTotal,
3604 						mode_lib->vba.VActive,
3605 						mode_lib->vba.PixelClock,
3606 						mode_lib->vba.BlendingAndTiming,
3607 						mode_lib->vba.NoOfDPPThisState,
3608 						mode_lib->vba.BytePerPixelInDETY,
3609 						mode_lib->vba.BytePerPixelInDETC,
3610 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTXAfterScaler,
3611 						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTYAfterScaler,
3612 						mode_lib->vba.WritebackEnable,
3613 						mode_lib->vba.WritebackPixelFormat,
3614 						mode_lib->vba.WritebackDestinationWidth,
3615 						mode_lib->vba.WritebackDestinationHeight,
3616 						mode_lib->vba.WritebackSourceHeight,
3617 						mode_lib->vba.UnboundedRequestEnabledThisState,
3618 						mode_lib->vba.CompressedBufferSizeInkByteThisState,
3619 
3620 						/* Output */
3621 						&mode_lib->vba.Watermark, // Store the values in vba
3622 						&mode_lib->vba.DRAMClockChangeSupport[i][j],
3623 						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single2[0], // double *MaxActiveDRAMClockChangeLatencySupported
3624 						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer[0], // Long SubViewportLinesNeededInMALL[]
3625 						&mode_lib->vba.FCLKChangeSupport[i][j],
3626 						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single2[1], // double *MinActiveFCLKChangeLatencySupported
3627 						&mode_lib->vba.USRRetrainingSupport[i][j],
3628 						mode_lib->vba.ActiveDRAMClockChangeLatencyMargin);
3629 			}
3630 		}
3631 	} // End of Prefetch Check
3632 
3633 	/*Cursor Support Check*/
3634 	mode_lib->vba.CursorSupport = true;
3635 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
3636 		if (mode_lib->vba.CursorWidth[k][0] > 0.0) {
3637 			if (mode_lib->vba.CursorBPP[k][0] == 64 && mode_lib->vba.Cursor64BppSupport == false)
3638 				mode_lib->vba.CursorSupport = false;
3639 		}
3640 	}
3641 
3642 	/*Valid Pitch Check*/
3643 	mode_lib->vba.PitchSupport = true;
3644 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
3645 		mode_lib->vba.AlignedYPitch[k] = dml_ceil(
3646 				dml_max(mode_lib->vba.PitchY[k], mode_lib->vba.SurfaceWidthY[k]),
3647 				mode_lib->vba.MacroTileWidthY[k]);
3648 		if (mode_lib->vba.DCCEnable[k] == true) {
3649 			mode_lib->vba.AlignedDCCMetaPitchY[k] = dml_ceil(
3650 					dml_max(mode_lib->vba.DCCMetaPitchY[k], mode_lib->vba.SurfaceWidthY[k]),
3651 					64.0 * mode_lib->vba.Read256BlockWidthY[k]);
3652 		} else {
3653 			mode_lib->vba.AlignedDCCMetaPitchY[k] = mode_lib->vba.DCCMetaPitchY[k];
3654 		}
3655 		if (mode_lib->vba.SourcePixelFormat[k] != dm_444_64 && mode_lib->vba.SourcePixelFormat[k] != dm_444_32
3656 				&& mode_lib->vba.SourcePixelFormat[k] != dm_444_16
3657 				&& mode_lib->vba.SourcePixelFormat[k] != dm_mono_16
3658 				&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe
3659 				&& mode_lib->vba.SourcePixelFormat[k] != dm_mono_8) {
3660 			mode_lib->vba.AlignedCPitch[k] = dml_ceil(
3661 					dml_max(mode_lib->vba.PitchC[k], mode_lib->vba.SurfaceWidthC[k]),
3662 					mode_lib->vba.MacroTileWidthC[k]);
3663 			if (mode_lib->vba.DCCEnable[k] == true) {
3664 				mode_lib->vba.AlignedDCCMetaPitchC[k] = dml_ceil(
3665 						dml_max(mode_lib->vba.DCCMetaPitchC[k],
3666 								mode_lib->vba.SurfaceWidthC[k]),
3667 						64.0 * mode_lib->vba.Read256BlockWidthC[k]);
3668 			} else {
3669 				mode_lib->vba.AlignedDCCMetaPitchC[k] = mode_lib->vba.DCCMetaPitchC[k];
3670 			}
3671 		} else {
3672 			mode_lib->vba.AlignedCPitch[k] = mode_lib->vba.PitchC[k];
3673 			mode_lib->vba.AlignedDCCMetaPitchC[k] = mode_lib->vba.DCCMetaPitchC[k];
3674 		}
3675 		if (mode_lib->vba.AlignedYPitch[k] > mode_lib->vba.PitchY[k]
3676 				|| mode_lib->vba.AlignedCPitch[k] > mode_lib->vba.PitchC[k]
3677 				|| mode_lib->vba.AlignedDCCMetaPitchY[k] > mode_lib->vba.DCCMetaPitchY[k]
3678 				|| mode_lib->vba.AlignedDCCMetaPitchC[k] > mode_lib->vba.DCCMetaPitchC[k]) {
3679 			mode_lib->vba.PitchSupport = false;
3680 		}
3681 	}
3682 
3683 	mode_lib->vba.ViewportExceedsSurface = false;
3684 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
3685 		if (mode_lib->vba.ViewportWidth[k] > mode_lib->vba.SurfaceWidthY[k]
3686 				|| mode_lib->vba.ViewportHeight[k] > mode_lib->vba.SurfaceHeightY[k]) {
3687 			mode_lib->vba.ViewportExceedsSurface = true;
3688 			if (mode_lib->vba.SourcePixelFormat[k] != dm_444_64
3689 					&& mode_lib->vba.SourcePixelFormat[k] != dm_444_32
3690 					&& mode_lib->vba.SourcePixelFormat[k] != dm_444_16
3691 					&& mode_lib->vba.SourcePixelFormat[k] != dm_444_16
3692 					&& mode_lib->vba.SourcePixelFormat[k] != dm_444_8
3693 					&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe) {
3694 				if (mode_lib->vba.ViewportWidthChroma[k] > mode_lib->vba.SurfaceWidthC[k]
3695 						|| mode_lib->vba.ViewportHeightChroma[k]
3696 								> mode_lib->vba.SurfaceHeightC[k]) {
3697 					mode_lib->vba.ViewportExceedsSurface = true;
3698 				}
3699 			}
3700 		}
3701 	}
3702 
3703 	/*Mode Support, Voltage State and SOC Configuration*/
3704 	mode_support_configuration(v, mode_lib);
3705 
3706 	MaximumMPCCombine = 0;
3707 
3708 	for (i = v->soc.num_states; i >= 0; i--) {
3709 		if (i == v->soc.num_states || mode_lib->vba.ModeSupport[i][0] == true ||
3710 				mode_lib->vba.ModeSupport[i][1] == true) {
3711 			mode_lib->vba.VoltageLevel = i;
3712 			mode_lib->vba.ModeIsSupported = mode_lib->vba.ModeSupport[i][0] == true
3713 					|| mode_lib->vba.ModeSupport[i][1] == true;
3714 
3715 			if (mode_lib->vba.ModeSupport[i][0] == true) {
3716 				MaximumMPCCombine = 0;
3717 			} else {
3718 				MaximumMPCCombine = 1;
3719 			}
3720 		}
3721 	}
3722 
3723 	mode_lib->vba.ImmediateFlipSupport =
3724 			mode_lib->vba.ImmediateFlipSupportedForState[mode_lib->vba.VoltageLevel][MaximumMPCCombine];
3725 	mode_lib->vba.UnboundedRequestEnabled =
3726 			mode_lib->vba.UnboundedRequestEnabledAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine];
3727 	mode_lib->vba.CompressedBufferSizeInkByte =
3728 			mode_lib->vba.CompressedBufferSizeInkByteAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine]; // Not used, informational
3729 
3730 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
3731 		mode_lib->vba.MPCCombineEnable[k] =
3732 				mode_lib->vba.MPCCombine[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
3733 		mode_lib->vba.DPPPerPlane[k] = mode_lib->vba.NoOfDPP[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
3734 		mode_lib->vba.SwathHeightY[k] =
3735 				mode_lib->vba.SwathHeightYAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
3736 		mode_lib->vba.SwathHeightC[k] =
3737 				mode_lib->vba.SwathHeightCAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
3738 		mode_lib->vba.DETBufferSizeInKByte[k] =
3739 			mode_lib->vba.DETBufferSizeInKByteAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
3740 		mode_lib->vba.DETBufferSizeY[k] =
3741 				mode_lib->vba.DETBufferSizeYAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
3742 		mode_lib->vba.DETBufferSizeC[k] =
3743 				mode_lib->vba.DETBufferSizeCAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
3744 		mode_lib->vba.OutputType[k] = mode_lib->vba.OutputTypePerState[mode_lib->vba.VoltageLevel][k];
3745 		mode_lib->vba.OutputRate[k] = mode_lib->vba.OutputRatePerState[mode_lib->vba.VoltageLevel][k];
3746 	}
3747 
3748 	mode_lib->vba.DCFCLK = mode_lib->vba.DCFCLKState[mode_lib->vba.VoltageLevel][MaximumMPCCombine];
3749 	mode_lib->vba.DRAMSpeed = mode_lib->vba.DRAMSpeedPerState[mode_lib->vba.VoltageLevel];
3750 	mode_lib->vba.FabricClock = mode_lib->vba.FabricClockPerState[mode_lib->vba.VoltageLevel];
3751 	mode_lib->vba.SOCCLK = mode_lib->vba.SOCCLKPerState[mode_lib->vba.VoltageLevel];
3752 	mode_lib->vba.ReturnBW = mode_lib->vba.ReturnBWPerState[mode_lib->vba.VoltageLevel][MaximumMPCCombine];
3753 	mode_lib->vba.DISPCLK = mode_lib->vba.RequiredDISPCLK[mode_lib->vba.VoltageLevel][MaximumMPCCombine];
3754 	mode_lib->vba.maxMpcComb = MaximumMPCCombine;
3755 
3756 	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
3757 		if (mode_lib->vba.BlendingAndTiming[k] == k) {
3758 			mode_lib->vba.ODMCombineEnabled[k] =
3759 					mode_lib->vba.ODMCombineEnablePerState[mode_lib->vba.VoltageLevel][k];
3760 		} else {
3761 			mode_lib->vba.ODMCombineEnabled[k] = dm_odm_combine_mode_disabled;
3762 		}
3763 
3764 		mode_lib->vba.DSCEnabled[k] = mode_lib->vba.RequiresDSC[mode_lib->vba.VoltageLevel][k];
3765 		mode_lib->vba.FECEnable[k] = mode_lib->vba.RequiresFEC[mode_lib->vba.VoltageLevel][k];
3766 		mode_lib->vba.OutputBpp[k] = mode_lib->vba.OutputBppPerState[mode_lib->vba.VoltageLevel][k];
3767 	}
3768 
3769 	mode_lib->vba.UrgentWatermark = mode_lib->vba.Watermark.UrgentWatermark;
3770 	mode_lib->vba.StutterEnterPlusExitWatermark = mode_lib->vba.Watermark.StutterEnterPlusExitWatermark;
3771 	mode_lib->vba.StutterExitWatermark = mode_lib->vba.Watermark.StutterExitWatermark;
3772 	mode_lib->vba.WritebackDRAMClockChangeWatermark = mode_lib->vba.Watermark.WritebackDRAMClockChangeWatermark;
3773 	mode_lib->vba.DRAMClockChangeWatermark = mode_lib->vba.Watermark.DRAMClockChangeWatermark;
3774 	mode_lib->vba.UrgentLatency = mode_lib->vba.UrgLatency[mode_lib->vba.VoltageLevel];
3775 	mode_lib->vba.DCFCLKDeepSleep = mode_lib->vba.ProjectedDCFCLKDeepSleep[mode_lib->vba.VoltageLevel][MaximumMPCCombine];
3776 
3777 	/* VBA has Error type to Error Msg output here, but not necessary for DML-C */
3778 } // ModeSupportAndSystemConfigurationFull
3779