/*
 * Copyright 2022 Advanced Micro Devices, Inc. All rights reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 * Authors: AMD
 *
 */

#include "dc.h"
#include "dc_link.h"
#include "../display_mode_lib.h"
#include "display_mode_vba_32.h"
#include "../dml_inline_defs.h"
#include "display_mode_vba_util_32.h"

void dml32_recalculate(struct display_mode_lib *mode_lib);
static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(
		struct display_mode_lib *mode_lib);
void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib);

void dml32_recalculate(struct display_mode_lib *mode_lib)
{
	ModeSupportAndSystemConfiguration(mode_lib);

	dml32_CalculateMaxDETAndMinCompressedBufferSize(mode_lib->vba.ConfigReturnBufferSizeInKByte,
			mode_lib->vba.ROBBufferSizeInKByte,
			DC__NUM_DPP,
			false, //mode_lib->vba.override_setting.nomDETInKByteOverrideEnable,
			0, //mode_lib->vba.override_setting.nomDETInKByteOverrideValue,

			/* Output */
			&mode_lib->vba.MaxTotalDETInKByte, &mode_lib->vba.nomDETInKByte,
			&mode_lib->vba.MinCompressedBufferSizeInKByte);

	PixelClockAdjustmentForProgressiveToInterlaceUnit(mode_lib);
#ifdef __DML_VBA_DEBUG__
	dml_print("DML::%s: Calling DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation\n", __func__);
#endif
	DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(mode_lib);
}

static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(
		struct display_mode_lib *mode_lib)
{
	struct vba_vars_st *v = &mode_lib->vba;
	unsigned int j, k;
	bool ImmediateFlipRequirementFinal;
	int iteration;
	double MaxTotalRDBandwidth;
	unsigned int NextPrefetchMode;
	double MaxTotalRDBandwidthNoUrgentBurst = 0.0;
	bool DestinationLineTimesForPrefetchLessThan2 = false;
	bool VRatioPrefetchMoreThanMax = false;
	double TWait;
	double TotalWRBandwidth = 0;
	double WRBandwidth = 0;

#ifdef __DML_VBA_DEBUG__
	dml_print("DML::%s: --- START ---\n", __func__);
	dml_print("DML::%s: mode_lib->vba.PrefetchMode = %d\n", __func__, mode_lib->vba.PrefetchMode);
	dml_print("DML::%s: mode_lib->vba.ImmediateFlipSupport = %d\n", __func__, mode_lib->vba.ImmediateFlipSupport);
	dml_print("DML::%s: mode_lib->vba.VoltageLevel = %d\n", __func__, mode_lib->vba.VoltageLevel);
#endif

	v->WritebackDISPCLK = 0.0;
	v->GlobalDPPCLK = 0.0;

	// DISPCLK and DPPCLK Calculation
	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		if (mode_lib->vba.WritebackEnable[k]) {
			v->WritebackDISPCLK = dml_max(v->WritebackDISPCLK,
					dml32_CalculateWriteBackDISPCLK(
							mode_lib->vba.WritebackPixelFormat[k],
							mode_lib->vba.PixelClock[k], mode_lib->vba.WritebackHRatio[k],
							mode_lib->vba.WritebackVRatio[k],
							mode_lib->vba.WritebackHTaps[k],
							mode_lib->vba.WritebackVTaps[k],
							mode_lib->vba.WritebackSourceWidth[k],
							mode_lib->vba.WritebackDestinationWidth[k],
							mode_lib->vba.HTotal[k], mode_lib->vba.WritebackLineBufferSize,
							mode_lib->vba.DISPCLKDPPCLKVCOSpeed));
		}
	}

	v->DISPCLK_calculated = v->WritebackDISPCLK;

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		if (mode_lib->vba.BlendingAndTiming[k] == k) {
			v->DISPCLK_calculated = dml_max(v->DISPCLK_calculated,
					dml32_CalculateRequiredDispclk(
							mode_lib->vba.ODMCombineEnabled[k],
							mode_lib->vba.PixelClock[k],
							mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading,
							mode_lib->vba.DISPCLKRampingMargin,
							mode_lib->vba.DISPCLKDPPCLKVCOSpeed,
							mode_lib->vba.MaxDppclk[v->soc.num_states - 1]));
		}
	}

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		dml32_CalculateSinglePipeDPPCLKAndSCLThroughput(mode_lib->vba.HRatio[k],
				mode_lib->vba.HRatioChroma[k],
				mode_lib->vba.VRatio[k],
				mode_lib->vba.VRatioChroma[k],
				mode_lib->vba.MaxDCHUBToPSCLThroughput,
				mode_lib->vba.MaxPSCLToLBThroughput,
				mode_lib->vba.PixelClock[k],
				mode_lib->vba.SourcePixelFormat[k],
				mode_lib->vba.htaps[k],
				mode_lib->vba.HTAPsChroma[k],
				mode_lib->vba.vtaps[k],
				mode_lib->vba.VTAPsChroma[k],

				/* Output */
				&v->PSCL_THROUGHPUT_LUMA[k], &v->PSCL_THROUGHPUT_CHROMA[k],
				&v->DPPCLKUsingSingleDPP[k]);
	}

	dml32_CalculateDPPCLK(mode_lib->vba.NumberOfActiveSurfaces, mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading,
			mode_lib->vba.DISPCLKDPPCLKVCOSpeed, v->DPPCLKUsingSingleDPP, mode_lib->vba.DPPPerPlane,
			/* Output */
			&v->GlobalDPPCLK, v->DPPCLK);

	for (k = 0; k < v->NumberOfActiveSurfaces; ++k) {
		v->DPPCLK_calculated[k] = v->DPPCLK[k];
	}

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		dml32_CalculateBytePerPixelAndBlockSizes(
				mode_lib->vba.SourcePixelFormat[k],
				mode_lib->vba.SurfaceTiling[k],

				/* Output */
				&v->BytePerPixelY[k],
				&v->BytePerPixelC[k],
				&v->BytePerPixelDETY[k],
				&v->BytePerPixelDETC[k],
				&v->BlockHeight256BytesY[k],
				&v->BlockHeight256BytesC[k],
				&v->BlockWidth256BytesY[k],
				&v->BlockWidth256BytesC[k],
				&v->BlockHeightY[k],
				&v->BlockHeightC[k],
				&v->BlockWidthY[k],
				&v->BlockWidthC[k]);
	}

#ifdef __DML_VBA_DEBUG__
	dml_print("DML::%s: %d\n", __func__, __LINE__);
#endif
	dml32_CalculateSwathWidth(
			false,  // ForceSingleDPP
			mode_lib->vba.NumberOfActiveSurfaces,
			mode_lib->vba.SourcePixelFormat,
			mode_lib->vba.SourceRotation,
			mode_lib->vba.ViewportStationary,
			mode_lib->vba.ViewportWidth,
			mode_lib->vba.ViewportHeight,
			mode_lib->vba.ViewportXStartY,
			mode_lib->vba.ViewportYStartY,
			mode_lib->vba.ViewportXStartC,
			mode_lib->vba.ViewportYStartC,
			mode_lib->vba.SurfaceWidthY,
			mode_lib->vba.SurfaceWidthC,
			mode_lib->vba.SurfaceHeightY,
			mode_lib->vba.SurfaceHeightC,
			mode_lib->vba.ODMCombineEnabled,
			v->BytePerPixelY,
			v->BytePerPixelC,
			v->BlockHeight256BytesY,
			v->BlockHeight256BytesC,
			v->BlockWidth256BytesY,
			v->BlockWidth256BytesC,
			mode_lib->vba.BlendingAndTiming,
			mode_lib->vba.HActive,
			mode_lib->vba.HRatio,
			mode_lib->vba.DPPPerPlane,

			/* Output */
			v->SwathWidthSingleDPPY, v->SwathWidthSingleDPPC, v->SwathWidthY, v->SwathWidthC,
			v->dummy_vars
				.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
				.dummy_integer_array[0], // Integer             MaximumSwathHeightY[]
			v->dummy_vars
				.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
				.dummy_integer_array[1], // Integer             MaximumSwathHeightC[]
			v->swath_width_luma_ub, v->swath_width_chroma_ub);

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		v->ReadBandwidthSurfaceLuma[k] = v->SwathWidthSingleDPPY[k] * v->BytePerPixelY[k]
				/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k];
		v->ReadBandwidthSurfaceChroma[k] = v->SwathWidthSingleDPPC[k] * v->BytePerPixelC[k]
				/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
				* mode_lib->vba.VRatioChroma[k];
#ifdef __DML_VBA_DEBUG__
		dml_print("DML::%s: ReadBandwidthSurfaceLuma[%i] = %fBps\n",
				__func__, k, v->ReadBandwidthSurfaceLuma[k]);
		dml_print("DML::%s: ReadBandwidthSurfaceChroma[%i] = %fBps\n",
				__func__, k, v->ReadBandwidthSurfaceChroma[k]);
#endif
	}

	{
		// VBA_DELTA
		// Calculate DET size, swath height
		dml32_CalculateSwathAndDETConfiguration(
				mode_lib->vba.DETSizeOverride,
				mode_lib->vba.UsesMALLForPStateChange,
				mode_lib->vba.ConfigReturnBufferSizeInKByte,
				mode_lib->vba.MaxTotalDETInKByte,
				mode_lib->vba.MinCompressedBufferSizeInKByte,
				false, /* ForceSingleDPP */
				mode_lib->vba.NumberOfActiveSurfaces,
				mode_lib->vba.nomDETInKByte,
				mode_lib->vba.UseUnboundedRequesting,
				mode_lib->vba.DisableUnboundRequestIfCompBufReservedSpaceNeedAdjustment,
				mode_lib->vba.ip.pixel_chunk_size_kbytes,
				mode_lib->vba.ip.rob_buffer_size_kbytes,
				mode_lib->vba.CompressedBufferSegmentSizeInkByteFinal,
				v->dummy_vars
					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
					.dummy_output_encoder_array, /* output_encoder_class Output[] */
				v->ReadBandwidthSurfaceLuma,
				v->ReadBandwidthSurfaceChroma,
				v->dummy_vars
					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
					.dummy_single_array[0], /* Single MaximumSwathWidthLuma[] */
				v->dummy_vars
					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
					.dummy_single_array[1], /* Single MaximumSwathWidthChroma[] */
				mode_lib->vba.SourceRotation,
				mode_lib->vba.ViewportStationary,
				mode_lib->vba.SourcePixelFormat,
				mode_lib->vba.SurfaceTiling,
				mode_lib->vba.ViewportWidth,
				mode_lib->vba.ViewportHeight,
				mode_lib->vba.ViewportXStartY,
				mode_lib->vba.ViewportYStartY,
				mode_lib->vba.ViewportXStartC,
				mode_lib->vba.ViewportYStartC,
				mode_lib->vba.SurfaceWidthY,
				mode_lib->vba.SurfaceWidthC,
				mode_lib->vba.SurfaceHeightY,
				mode_lib->vba.SurfaceHeightC,
				v->BlockHeight256BytesY,
				v->BlockHeight256BytesC,
				v->BlockWidth256BytesY,
				v->BlockWidth256BytesC,
				mode_lib->vba.ODMCombineEnabled,
				mode_lib->vba.BlendingAndTiming,
				v->BytePerPixelY,
				v->BytePerPixelC,
				v->BytePerPixelDETY,
				v->BytePerPixelDETC,
				mode_lib->vba.HActive,
				mode_lib->vba.HRatio,
				mode_lib->vba.HRatioChroma,
				mode_lib->vba.DPPPerPlane,

				/* Output */
				v->dummy_vars
					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
					.dummy_long_array[0], /* Long swath_width_luma_ub[] */
				v->dummy_vars
					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
					.dummy_long_array[1], /* Long swath_width_chroma_ub[] */
				v->dummy_vars
					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
					.dummy_double_array[0], /* Long SwathWidth[] */
				v->dummy_vars
					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
					.dummy_double_array[1], /* Long SwathWidthChroma[] */
				mode_lib->vba.SwathHeightY,
				mode_lib->vba.SwathHeightC,
				mode_lib->vba.DETBufferSizeInKByte,
				mode_lib->vba.DETBufferSizeY,
				mode_lib->vba.DETBufferSizeC,
				&v->UnboundedRequestEnabled,
				&v->CompressedBufferSizeInkByte,
				&v->CompBufReservedSpaceKBytes,
				&v->dummy_vars
					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
					.dummy_boolean,       /* bool *CompBufReservedSpaceNeedAjustment */
				v->dummy_vars
					.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
					.dummy_boolean_array, /* bool ViewportSizeSupportPerSurface[] */
				&v->dummy_vars
					 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
					 .dummy_boolean); /* bool *ViewportSizeSupport */
	}

	v->CompBufReservedSpaceZs     = v->CompBufReservedSpaceKBytes * 1024.0 / 256.0;
	v->CompBufReservedSpace64B    = v->CompBufReservedSpaceKBytes * 1024.0 / 64.0;

	// DCFCLK Deep Sleep
	dml32_CalculateDCFCLKDeepSleep(
			mode_lib->vba.NumberOfActiveSurfaces,
			v->BytePerPixelY,
			v->BytePerPixelC,
			mode_lib->vba.VRatio,
			mode_lib->vba.VRatioChroma,
			v->SwathWidthY,
			v->SwathWidthC,
			mode_lib->vba.DPPPerPlane,
			mode_lib->vba.HRatio,
			mode_lib->vba.HRatioChroma,
			mode_lib->vba.PixelClock,
			v->PSCL_THROUGHPUT_LUMA,
			v->PSCL_THROUGHPUT_CHROMA,
			mode_lib->vba.DPPCLK,
			v->ReadBandwidthSurfaceLuma,
			v->ReadBandwidthSurfaceChroma,
			mode_lib->vba.ReturnBusWidth,

			/* Output */
			&v->DCFCLKDeepSleep);

	// DSCCLK
	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		if ((mode_lib->vba.BlendingAndTiming[k] != k) || !mode_lib->vba.DSCEnabled[k]) {
			v->DSCCLK_calculated[k] = 0.0;
		} else {
			if (mode_lib->vba.OutputFormat[k] == dm_420)
				mode_lib->vba.DSCFormatFactor = 2;
			else if (mode_lib->vba.OutputFormat[k] == dm_444)
				mode_lib->vba.DSCFormatFactor = 1;
			else if (mode_lib->vba.OutputFormat[k] == dm_n422)
				mode_lib->vba.DSCFormatFactor = 2;
			else
				mode_lib->vba.DSCFormatFactor = 1;
			if (mode_lib->vba.ODMCombineEnabled[k] == dm_odm_combine_mode_4to1)
				v->DSCCLK_calculated[k] = mode_lib->vba.PixelClockBackEnd[k] / 12
						/ mode_lib->vba.DSCFormatFactor
						/ (1 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100);
			else if (mode_lib->vba.ODMCombineEnabled[k] == dm_odm_combine_mode_2to1)
				v->DSCCLK_calculated[k] = mode_lib->vba.PixelClockBackEnd[k] / 6
						/ mode_lib->vba.DSCFormatFactor
						/ (1 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100);
			else
				v->DSCCLK_calculated[k] = mode_lib->vba.PixelClockBackEnd[k] / 3
						/ mode_lib->vba.DSCFormatFactor
						/ (1 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100);
		}
	}

	// DSC Delay
	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		v->DSCDelay[k] = dml32_DSCDelayRequirement(mode_lib->vba.DSCEnabled[k],
				mode_lib->vba.ODMCombineEnabled[k], mode_lib->vba.DSCInputBitPerComponent[k],
				mode_lib->vba.OutputBpp[k], mode_lib->vba.HActive[k], mode_lib->vba.HTotal[k],
				mode_lib->vba.NumberOfDSCSlices[k], mode_lib->vba.OutputFormat[k],
				mode_lib->vba.Output[k], mode_lib->vba.PixelClock[k],
				mode_lib->vba.PixelClockBackEnd[k]);
	}

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
		for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) // NumberOfSurfaces
			if (j != k && mode_lib->vba.BlendingAndTiming[k] == j && mode_lib->vba.DSCEnabled[j])
				v->DSCDelay[k] = v->DSCDelay[j];

	//Immediate Flip
	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		v->ImmediateFlipSupportedSurface[k] = mode_lib->vba.ImmediateFlipSupport
				&& (mode_lib->vba.ImmediateFlipRequirement[k] != dm_immediate_flip_not_required);
	}

	// Prefetch
	dml32_CalculateSurfaceSizeInMall(
				mode_lib->vba.NumberOfActiveSurfaces,
				mode_lib->vba.MALLAllocatedForDCNFinal,
				mode_lib->vba.UseMALLForStaticScreen,
				mode_lib->vba.DCCEnable,
				mode_lib->vba.ViewportStationary,
				mode_lib->vba.ViewportXStartY,
				mode_lib->vba.ViewportYStartY,
				mode_lib->vba.ViewportXStartC,
				mode_lib->vba.ViewportYStartC,
				mode_lib->vba.ViewportWidth,
				mode_lib->vba.ViewportHeight,
				v->BytePerPixelY,
				mode_lib->vba.ViewportWidthChroma,
				mode_lib->vba.ViewportHeightChroma,
				v->BytePerPixelC,
				mode_lib->vba.SurfaceWidthY,
				mode_lib->vba.SurfaceWidthC,
				mode_lib->vba.SurfaceHeightY,
				mode_lib->vba.SurfaceHeightC,
				v->BlockWidth256BytesY,
				v->BlockWidth256BytesC,
				v->BlockHeight256BytesY,
				v->BlockHeight256BytesC,
				v->BlockWidthY,
				v->BlockWidthC,
				v->BlockHeightY,
				v->BlockHeightC,

				/* Output */
				v->SurfaceSizeInMALL,
				&v->dummy_vars.
				DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
				.dummy_boolean2); /* Boolean *ExceededMALLSize */

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].PixelClock = mode_lib->vba.PixelClock[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].DPPPerSurface = mode_lib->vba.DPPPerPlane[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SourceRotation = mode_lib->vba.SourceRotation[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportHeight = mode_lib->vba.ViewportHeight[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportHeightChroma = mode_lib->vba.ViewportHeightChroma[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockWidth256BytesY = v->BlockWidth256BytesY[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockHeight256BytesY = v->BlockHeight256BytesY[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockWidth256BytesC = v->BlockWidth256BytesC[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockHeight256BytesC = v->BlockHeight256BytesC[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockWidthY = v->BlockWidthY[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockHeightY = v->BlockHeightY[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockWidthC = v->BlockWidthC[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockHeightC = v->BlockHeightC[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].InterlaceEnable = mode_lib->vba.Interlace[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].HTotal = mode_lib->vba.HTotal[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].DCCEnable = mode_lib->vba.DCCEnable[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SourcePixelFormat = mode_lib->vba.SourcePixelFormat[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SurfaceTiling = mode_lib->vba.SurfaceTiling[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BytePerPixelY = v->BytePerPixelY[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BytePerPixelC = v->BytePerPixelC[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ProgressiveToInterlaceUnitInOPP = mode_lib->vba.ProgressiveToInterlaceUnitInOPP;
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].VRatio = mode_lib->vba.VRatio[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].VRatioChroma = mode_lib->vba.VRatioChroma[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].VTaps = mode_lib->vba.vtaps[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].VTapsChroma = mode_lib->vba.VTAPsChroma[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].PitchY = mode_lib->vba.PitchY[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].DCCMetaPitchY = mode_lib->vba.DCCMetaPitchY[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].PitchC = mode_lib->vba.PitchC[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].DCCMetaPitchC = mode_lib->vba.DCCMetaPitchC[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportStationary = mode_lib->vba.ViewportStationary[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportXStart = mode_lib->vba.ViewportXStartY[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportYStart = mode_lib->vba.ViewportYStartY[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportXStartC = mode_lib->vba.ViewportXStartC[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportYStartC = mode_lib->vba.ViewportYStartC[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].FORCE_ONE_ROW_FOR_FRAME = mode_lib->vba.ForceOneRowForFrame[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SwathHeightY = mode_lib->vba.SwathHeightY[k];
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SwathHeightC = mode_lib->vba.SwathHeightC[k];
	}

	{

		dml32_CalculateVMRowAndSwath(
				mode_lib->vba.NumberOfActiveSurfaces,
				v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters,
				v->SurfaceSizeInMALL,
				mode_lib->vba.PTEBufferSizeInRequestsLuma,
				mode_lib->vba.PTEBufferSizeInRequestsChroma,
				mode_lib->vba.DCCMetaBufferSizeBytes,
				mode_lib->vba.UseMALLForStaticScreen,
				mode_lib->vba.UsesMALLForPStateChange,
				mode_lib->vba.MALLAllocatedForDCNFinal,
				v->SwathWidthY,
				v->SwathWidthC,
				mode_lib->vba.GPUVMEnable,
				mode_lib->vba.HostVMEnable,
				mode_lib->vba.HostVMMaxNonCachedPageTableLevels,
				mode_lib->vba.GPUVMMaxPageTableLevels,
				mode_lib->vba.GPUVMMinPageSizeKBytes,
				mode_lib->vba.HostVMMinPageSize,

				/* Output */
				v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean_array2[0],  // Boolean PTEBufferSizeNotExceeded[]
				v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean_array2[1],  // Boolean DCCMetaBufferSizeNotExceeded[]
				v->dpte_row_width_luma_ub,
				v->dpte_row_width_chroma_ub,
				v->dpte_row_height,
				v->dpte_row_height_chroma,
				v->dpte_row_height_linear,
				v->dpte_row_height_linear_chroma,
				v->meta_req_width,
				v->meta_req_width_chroma,
				v->meta_req_height,
				v->meta_req_height_chroma,
				v->meta_row_width,
				v->meta_row_width_chroma,
				v->meta_row_height,
				v->meta_row_height_chroma,
				v->vm_group_bytes,
				v->dpte_group_bytes,
				v->PixelPTEReqWidthY,
				v->PixelPTEReqHeightY,
				v->PTERequestSizeY,
				v->PixelPTEReqWidthC,
				v->PixelPTEReqHeightC,
				v->PTERequestSizeC,
				v->dpde0_bytes_per_frame_ub_l,
				v->meta_pte_bytes_per_frame_ub_l,
				v->dpde0_bytes_per_frame_ub_c,
				v->meta_pte_bytes_per_frame_ub_c,
				v->PrefetchSourceLinesY,
				v->PrefetchSourceLinesC,
				v->VInitPreFillY, v->VInitPreFillC,
				v->MaxNumSwathY,
				v->MaxNumSwathC,
				v->meta_row_bw,
				v->dpte_row_bw,
				v->PixelPTEBytesPerRow,
				v->PDEAndMetaPTEBytesFrame,
				v->MetaRowByte,
				v->Use_One_Row_For_Frame,
				v->Use_One_Row_For_Frame_Flip,
				v->UsesMALLForStaticScreen,
				v->PTE_BUFFER_MODE,
				v->BIGK_FRAGMENT_SIZE);
	}


	v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.ReorderBytes = mode_lib->vba.NumberOfChannels
			* dml_max3(mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelDataOnly,
					mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelMixedWithVMData,
					mode_lib->vba.UrgentOutOfOrderReturnPerChannelVMDataOnly);

	v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.VMDataOnlyReturnBW = dml32_get_return_bw_mbps_vm_only(
			&mode_lib->vba.soc,
			mode_lib->vba.VoltageLevel,
			mode_lib->vba.DCFCLK,
			mode_lib->vba.FabricClock,
			mode_lib->vba.DRAMSpeed);

#ifdef __DML_VBA_DEBUG__
	dml_print("DML::%s: mode_lib->vba.ReturnBusWidth = %f\n", __func__, mode_lib->vba.ReturnBusWidth);
	dml_print("DML::%s: mode_lib->vba.DCFCLK = %f\n", __func__, mode_lib->vba.DCFCLK);
	dml_print("DML::%s: mode_lib->vba.FabricClock = %f\n", __func__, mode_lib->vba.FabricClock);
	dml_print("DML::%s: mode_lib->vba.FabricDatapathToDCNDataReturn = %f\n", __func__,
			mode_lib->vba.FabricDatapathToDCNDataReturn);
	dml_print("DML::%s: mode_lib->vba.PercentOfIdealSDPPortBWReceivedAfterUrgLatency = %f\n",
			__func__, mode_lib->vba.PercentOfIdealSDPPortBWReceivedAfterUrgLatency);
	dml_print("DML::%s: mode_lib->vba.DRAMSpeed = %f\n", __func__, mode_lib->vba.DRAMSpeed);
	dml_print("DML::%s: mode_lib->vba.NumberOfChannels = %f\n", __func__, mode_lib->vba.NumberOfChannels);
	dml_print("DML::%s: mode_lib->vba.DRAMChannelWidth = %f\n", __func__, mode_lib->vba.DRAMChannelWidth);
	dml_print("DML::%s: mode_lib->vba.PercentOfIdealDRAMBWReceivedAfterUrgLatencyVMDataOnly = %f\n",
			__func__, mode_lib->vba.PercentOfIdealDRAMBWReceivedAfterUrgLatencyVMDataOnly);
	dml_print("DML::%s: VMDataOnlyReturnBW = %f\n", __func__, VMDataOnlyReturnBW);
	dml_print("DML::%s: ReturnBW = %f\n", __func__, mode_lib->vba.ReturnBW);
#endif

	v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor = 1.0;

	if (mode_lib->vba.GPUVMEnable && mode_lib->vba.HostVMEnable)
		v->dummy_vars
			.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
			.HostVMInefficiencyFactor =
			mode_lib->vba.ReturnBW / v->dummy_vars
				.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation
				.VMDataOnlyReturnBW;

	mode_lib->vba.TotalDCCActiveDPP = 0;
	mode_lib->vba.TotalActiveDPP = 0;
	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		mode_lib->vba.TotalActiveDPP = mode_lib->vba.TotalActiveDPP + mode_lib->vba.DPPPerPlane[k];
		if (mode_lib->vba.DCCEnable[k])
			mode_lib->vba.TotalDCCActiveDPP = mode_lib->vba.TotalDCCActiveDPP
					+ mode_lib->vba.DPPPerPlane[k];
	}

	v->UrgentExtraLatency = dml32_CalculateExtraLatency(
			mode_lib->vba.RoundTripPingLatencyCycles,
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.ReorderBytes,
			mode_lib->vba.DCFCLK,
			mode_lib->vba.TotalActiveDPP,
			mode_lib->vba.PixelChunkSizeInKByte,
			mode_lib->vba.TotalDCCActiveDPP,
			mode_lib->vba.MetaChunkSize,
			mode_lib->vba.ReturnBW,
			mode_lib->vba.GPUVMEnable,
			mode_lib->vba.HostVMEnable,
			mode_lib->vba.NumberOfActiveSurfaces,
			mode_lib->vba.DPPPerPlane,
			v->dpte_group_bytes,
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor,
			mode_lib->vba.HostVMMinPageSize,
			mode_lib->vba.HostVMMaxNonCachedPageTableLevels);

	mode_lib->vba.TCalc = 24.0 / v->DCFCLKDeepSleep;

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		if (mode_lib->vba.BlendingAndTiming[k] == k) {
			if (mode_lib->vba.WritebackEnable[k] == true) {
				v->WritebackDelay[mode_lib->vba.VoltageLevel][k] = mode_lib->vba.WritebackLatency
						+ dml32_CalculateWriteBackDelay(
								mode_lib->vba.WritebackPixelFormat[k],
								mode_lib->vba.WritebackHRatio[k],
								mode_lib->vba.WritebackVRatio[k],
								mode_lib->vba.WritebackVTaps[k],
								mode_lib->vba.WritebackDestinationWidth[k],
								mode_lib->vba.WritebackDestinationHeight[k],
								mode_lib->vba.WritebackSourceHeight[k],
								mode_lib->vba.HTotal[k]) / mode_lib->vba.DISPCLK;
			} else
				v->WritebackDelay[mode_lib->vba.VoltageLevel][k] = 0;
			for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) {
				if (mode_lib->vba.BlendingAndTiming[j] == k &&
					mode_lib->vba.WritebackEnable[j] == true) {
					v->WritebackDelay[mode_lib->vba.VoltageLevel][k] =
						dml_max(v->WritebackDelay[mode_lib->vba.VoltageLevel][k],
						mode_lib->vba.WritebackLatency +
						dml32_CalculateWriteBackDelay(
								mode_lib->vba.WritebackPixelFormat[j],
								mode_lib->vba.WritebackHRatio[j],
								mode_lib->vba.WritebackVRatio[j],
								mode_lib->vba.WritebackVTaps[j],
								mode_lib->vba.WritebackDestinationWidth[j],
								mode_lib->vba.WritebackDestinationHeight[j],
								mode_lib->vba.WritebackSourceHeight[j],
								mode_lib->vba.HTotal[k]) / mode_lib->vba.DISPCLK);
				}
			}
		}
	}

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
		for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j)
			if (mode_lib->vba.BlendingAndTiming[k] == j)
				v->WritebackDelay[mode_lib->vba.VoltageLevel][k] =
						v->WritebackDelay[mode_lib->vba.VoltageLevel][j];

	v->UrgentLatency = dml32_CalculateUrgentLatency(mode_lib->vba.UrgentLatencyPixelDataOnly,
			mode_lib->vba.UrgentLatencyPixelMixedWithVMData,
			mode_lib->vba.UrgentLatencyVMDataOnly,
			mode_lib->vba.DoUrgentLatencyAdjustment,
			mode_lib->vba.UrgentLatencyAdjustmentFabricClockComponent,
			mode_lib->vba.UrgentLatencyAdjustmentFabricClockReference,
			mode_lib->vba.FabricClock);

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		dml32_CalculateUrgentBurstFactor(mode_lib->vba.UsesMALLForPStateChange[k],
				v->swath_width_luma_ub[k],
				v->swath_width_chroma_ub[k],
				mode_lib->vba.SwathHeightY[k],
				mode_lib->vba.SwathHeightC[k],
				mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
				v->UrgentLatency,
				mode_lib->vba.CursorBufferSize,
				mode_lib->vba.CursorWidth[k][0],
				mode_lib->vba.CursorBPP[k][0],
				mode_lib->vba.VRatio[k],
				mode_lib->vba.VRatioChroma[k],
				v->BytePerPixelDETY[k],
				v->BytePerPixelDETC[k],
				mode_lib->vba.DETBufferSizeY[k],
				mode_lib->vba.DETBufferSizeC[k],

				/* output */
				&v->UrgBurstFactorCursor[k],
				&v->UrgBurstFactorLuma[k],
				&v->UrgBurstFactorChroma[k],
				&v->NoUrgentLatencyHiding[k]);

		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];
	}

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		v->MaxVStartupLines[k] = ((mode_lib->vba.Interlace[k] &&
				!mode_lib->vba.ProgressiveToInterlaceUnitInOPP) ?
				dml_floor((mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]) / 2.0, 1.0) :
				mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]) - dml_max(1.0,
				dml_ceil((double) v->WritebackDelay[mode_lib->vba.VoltageLevel][k]
				/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]), 1));

	// Clamp to max OTG vstartup register limit
	if (v->MaxVStartupLines[k] > 1023)
		v->MaxVStartupLines[k] = 1023;

#ifdef __DML_VBA_DEBUG__
		dml_print("DML::%s: k=%d MaxVStartupLines = %d\n", __func__, k, v->MaxVStartupLines[k]);
		dml_print("DML::%s: k=%d VoltageLevel = %d\n", __func__, k, mode_lib->vba.VoltageLevel);
		dml_print("DML::%s: k=%d WritebackDelay = %f\n", __func__,
				k, v->WritebackDelay[mode_lib->vba.VoltageLevel][k]);
#endif
	}

	v->MaximumMaxVStartupLines = 0;
	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
		v->MaximumMaxVStartupLines = dml_max(v->MaximumMaxVStartupLines, v->MaxVStartupLines[k]);

	ImmediateFlipRequirementFinal = false;

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		ImmediateFlipRequirementFinal = ImmediateFlipRequirementFinal
				|| (mode_lib->vba.ImmediateFlipRequirement[k] == dm_immediate_flip_required);
	}
#ifdef __DML_VBA_DEBUG__
	dml_print("DML::%s: ImmediateFlipRequirementFinal = %d\n", __func__, ImmediateFlipRequirementFinal);
#endif
	// ModeProgramming will not repeat the schedule calculation using different prefetch mode,
	//it is just calcualated once with given prefetch mode
	dml32_CalculateMinAndMaxPrefetchMode(
			mode_lib->vba.AllowForPStateChangeOrStutterInVBlankFinal,
			&mode_lib->vba.MinPrefetchMode,
			&mode_lib->vba.MaxPrefetchMode);

	v->VStartupLines = __DML_VBA_MIN_VSTARTUP__;

	iteration = 0;
	MaxTotalRDBandwidth = 0;
	NextPrefetchMode = mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb];

	do {
		MaxTotalRDBandwidth = 0;
#ifdef __DML_VBA_DEBUG__
		dml_print("DML::%s: Start loop: VStartup = %d\n", __func__, mode_lib->vba.VStartupLines);
#endif
		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
			/* NOTE PerfetchMode variable is invalid in DAL as per the input received.
			 * Hence the direction is to use PrefetchModePerState.
			 */
			TWait = dml32_CalculateTWait(
				mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb],
				mode_lib->vba.UsesMALLForPStateChange[k],
				mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
				mode_lib->vba.DRRDisplay[k],
				mode_lib->vba.DRAMClockChangeLatency,
				mode_lib->vba.FCLKChangeLatency, v->UrgentLatency,
				mode_lib->vba.SREnterPlusExitTime);

			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.Dppclk = mode_lib->vba.DPPCLK[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.Dispclk = mode_lib->vba.DISPCLK;
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.PixelClock = mode_lib->vba.PixelClock[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.DCFClkDeepSleep = v->DCFCLKDeepSleep;
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.DPPPerSurface = mode_lib->vba.DPPPerPlane[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.ScalerEnabled = mode_lib->vba.ScalerEnabled[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.SourceRotation = mode_lib->vba.SourceRotation[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BlockWidth256BytesY = v->BlockWidth256BytesY[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BlockHeight256BytesY = v->BlockHeight256BytesY[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BlockWidth256BytesC = v->BlockWidth256BytesC[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BlockHeight256BytesC = v->BlockHeight256BytesC[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.InterlaceEnable = mode_lib->vba.Interlace[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.NumberOfCursors = mode_lib->vba.NumberOfCursors[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.VBlank = mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.HTotal = mode_lib->vba.HTotal[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.HActive = mode_lib->vba.HActive[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.DCCEnable = mode_lib->vba.DCCEnable[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.ODMMode = mode_lib->vba.ODMCombineEnabled[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.SourcePixelFormat = mode_lib->vba.SourcePixelFormat[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BytePerPixelY = v->BytePerPixelY[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BytePerPixelC = v->BytePerPixelC[k];
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.ProgressiveToInterlaceUnitInOPP = mode_lib->vba.ProgressiveToInterlaceUnitInOPP;
			v->ErrorResult[k] = dml32_CalculatePrefetchSchedule(
					v,
					k,
					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor,
					&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe,
					v->DSCDelay[k],
					(unsigned int) (v->SwathWidthY[k] / v->HRatio[k]),
					dml_min(v->VStartupLines, v->MaxVStartupLines[k]),
					v->MaxVStartupLines[k],
					v->UrgentLatency,
					v->UrgentExtraLatency,
					v->TCalc,
					v->PDEAndMetaPTEBytesFrame[k],
					v->MetaRowByte[k],
					v->PixelPTEBytesPerRow[k],
					v->PrefetchSourceLinesY[k],
					v->SwathWidthY[k],
					v->VInitPreFillY[k],
					v->MaxNumSwathY[k],
					v->PrefetchSourceLinesC[k],
					v->SwathWidthC[k],
					v->VInitPreFillC[k],
					v->MaxNumSwathC[k],
					v->swath_width_luma_ub[k],
					v->swath_width_chroma_ub[k],
					v->SwathHeightY[k],
					v->SwathHeightC[k],
					TWait,
					/* Output */
					&v->DSTXAfterScaler[k],
					&v->DSTYAfterScaler[k],
					&v->DestinationLinesForPrefetch[k],
					&v->PrefetchBandwidth[k],
					&v->DestinationLinesToRequestVMInVBlank[k],
					&v->DestinationLinesToRequestRowInVBlank[k],
					&v->VRatioPrefetchY[k],
					&v->VRatioPrefetchC[k],
					&v->RequiredPrefetchPixDataBWLuma[k],
					&v->RequiredPrefetchPixDataBWChroma[k],
					&v->NotEnoughTimeForDynamicMetadata[k],
					&v->Tno_bw[k], &v->prefetch_vmrow_bw[k],
					&v->Tdmdl_vm[k],
					&v->Tdmdl[k],
					&v->TSetup[k],
					&v->VUpdateOffsetPix[k],
					&v->VUpdateWidthPix[k],
					&v->VReadyOffsetPix[k]);

#ifdef __DML_VBA_DEBUG__
			dml_print("DML::%s: k=%0d Prefetch calculation errResult=%0d\n",
					__func__, k, mode_lib->vba.ErrorResult[k]);
#endif
			v->VStartup[k] = dml_min(v->VStartupLines, v->MaxVStartupLines[k]);
		}

		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
			dml32_CalculateUrgentBurstFactor(mode_lib->vba.UsesMALLForPStateChange[k],
					v->swath_width_luma_ub[k],
					v->swath_width_chroma_ub[k],
					mode_lib->vba.SwathHeightY[k],
					mode_lib->vba.SwathHeightC[k],
					mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
					v->UrgentLatency,
					mode_lib->vba.CursorBufferSize,
					mode_lib->vba.CursorWidth[k][0],
					mode_lib->vba.CursorBPP[k][0],
					v->VRatioPrefetchY[k],
					v->VRatioPrefetchC[k],
					v->BytePerPixelDETY[k],
					v->BytePerPixelDETC[k],
					mode_lib->vba.DETBufferSizeY[k],
					mode_lib->vba.DETBufferSizeC[k],
					/* Output */
					&v->UrgBurstFactorCursorPre[k],
					&v->UrgBurstFactorLumaPre[k],
					&v->UrgBurstFactorChromaPre[k],
					&v->NoUrgentLatencyHidingPre[k]);

			v->cursor_bw_pre[k] = mode_lib->vba.NumberOfCursors[k] * mode_lib->vba.CursorWidth[k][0] * mode_lib->vba.CursorBPP[k][0] /
					8.0 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * v->VRatioPrefetchY[k];

#ifdef __DML_VBA_DEBUG__
			dml_print("DML::%s: k=%0d DPPPerSurface=%d\n", __func__, k, mode_lib->vba.DPPPerPlane[k]);
			dml_print("DML::%s: k=%0d UrgBurstFactorLuma=%f\n", __func__, k, v->UrgBurstFactorLuma[k]);
			dml_print("DML::%s: k=%0d UrgBurstFactorChroma=%f\n", __func__, k, v->UrgBurstFactorChroma[k]);
			dml_print("DML::%s: k=%0d UrgBurstFactorLumaPre=%f\n", __func__, k,
					v->UrgBurstFactorLumaPre[k]);
			dml_print("DML::%s: k=%0d UrgBurstFactorChromaPre=%f\n", __func__, k,
					v->UrgBurstFactorChromaPre[k]);

			dml_print("DML::%s: k=%0d VRatioPrefetchY=%f\n", __func__, k, v->VRatioPrefetchY[k]);
			dml_print("DML::%s: k=%0d VRatioY=%f\n", __func__, k, mode_lib->vba.VRatio[k]);

			dml_print("DML::%s: k=%0d prefetch_vmrow_bw=%f\n", __func__, k, v->prefetch_vmrow_bw[k]);
			dml_print("DML::%s: k=%0d ReadBandwidthSurfaceLuma=%f\n", __func__, k,
					v->ReadBandwidthSurfaceLuma[k]);
			dml_print("DML::%s: k=%0d ReadBandwidthSurfaceChroma=%f\n", __func__, k,
					v->ReadBandwidthSurfaceChroma[k]);
			dml_print("DML::%s: k=%0d cursor_bw=%f\n", __func__, k, v->cursor_bw[k]);
			dml_print("DML::%s: k=%0d meta_row_bw=%f\n", __func__, k, v->meta_row_bw[k]);
			dml_print("DML::%s: k=%0d dpte_row_bw=%f\n", __func__, k, v->dpte_row_bw[k]);
			dml_print("DML::%s: k=%0d RequiredPrefetchPixDataBWLuma=%f\n", __func__, k,
					v->RequiredPrefetchPixDataBWLuma[k]);
			dml_print("DML::%s: k=%0d RequiredPrefetchPixDataBWChroma=%f\n", __func__, k,
					v->RequiredPrefetchPixDataBWChroma[k]);
			dml_print("DML::%s: k=%0d cursor_bw_pre=%f\n", __func__, k, v->cursor_bw_pre[k]);
			dml_print("DML::%s: k=%0d MaxTotalRDBandwidthNoUrgentBurst=%f\n", __func__, k,
					MaxTotalRDBandwidthNoUrgentBurst);
#endif
			if (v->DestinationLinesForPrefetch[k] < 2)
				DestinationLineTimesForPrefetchLessThan2 = true;

			if (v->VRatioPrefetchY[k] > __DML_MAX_VRATIO_PRE__
					|| v->VRatioPrefetchC[k] > __DML_MAX_VRATIO_PRE__)
				VRatioPrefetchMoreThanMax = true;

			//bool DestinationLinesToRequestVMInVBlankEqualOrMoreThan32 = false;
			//bool DestinationLinesToRequestRowInVBlankEqualOrMoreThan16 = false;
			//if (v->DestinationLinesToRequestVMInVBlank[k] >= 32) {
			//    DestinationLinesToRequestVMInVBlankEqualOrMoreThan32 = true;
			//}

			//if (v->DestinationLinesToRequestRowInVBlank[k] >= 16) {
			//    DestinationLinesToRequestRowInVBlankEqualOrMoreThan16 = true;
			//}
		}

		v->FractionOfUrgentBandwidth = MaxTotalRDBandwidthNoUrgentBurst / mode_lib->vba.ReturnBW;

#ifdef __DML_VBA_DEBUG__
		dml_print("DML::%s: MaxTotalRDBandwidthNoUrgentBurst=%f\n",
				__func__, MaxTotalRDBandwidthNoUrgentBurst);
		dml_print("DML::%s: ReturnBW=%f\n", __func__, mode_lib->vba.ReturnBW);
		dml_print("DML::%s: FractionOfUrgentBandwidth=%f\n",
				__func__, mode_lib->vba.FractionOfUrgentBandwidth);
#endif

		{
			dml32_CalculatePrefetchBandwithSupport(
					mode_lib->vba.NumberOfActiveSurfaces,
					mode_lib->vba.ReturnBW,
					v->NoUrgentLatencyHidingPre,
					v->ReadBandwidthSurfaceLuma,
					v->ReadBandwidthSurfaceChroma,
					v->RequiredPrefetchPixDataBWLuma,
					v->RequiredPrefetchPixDataBWChroma,
					v->cursor_bw,
					v->meta_row_bw,
					v->dpte_row_bw,
					v->cursor_bw_pre,
					v->prefetch_vmrow_bw,
					mode_lib->vba.DPPPerPlane,
					v->UrgBurstFactorLuma,
					v->UrgBurstFactorChroma,
					v->UrgBurstFactorCursor,
					v->UrgBurstFactorLumaPre,
					v->UrgBurstFactorChromaPre,
					v->UrgBurstFactorCursorPre,

					/* output */
					&MaxTotalRDBandwidth,
					&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[0],
					&v->PrefetchModeSupported);
		}

		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector[k] = 1.0;

		{
			dml32_CalculatePrefetchBandwithSupport(mode_lib->vba.NumberOfActiveSurfaces,
					mode_lib->vba.ReturnBW,
					v->NoUrgentLatencyHidingPre,
					v->ReadBandwidthSurfaceLuma,
					v->ReadBandwidthSurfaceChroma,
					v->RequiredPrefetchPixDataBWLuma,
					v->RequiredPrefetchPixDataBWChroma,
					v->cursor_bw,
					v->meta_row_bw,
					v->dpte_row_bw,
					v->cursor_bw_pre,
					v->prefetch_vmrow_bw,
					mode_lib->vba.DPPPerPlane,
					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
					v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,

					/* output */
					&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[0],
					&v->FractionOfUrgentBandwidth,
					&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean);
		}

		if (VRatioPrefetchMoreThanMax != false || DestinationLineTimesForPrefetchLessThan2 != false) {
			v->PrefetchModeSupported = false;
		}

		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
			if (v->ErrorResult[k] == true || v->NotEnoughTimeForDynamicMetadata[k]) {
				v->PrefetchModeSupported = false;
			}
		}

		if (v->PrefetchModeSupported == true && mode_lib->vba.ImmediateFlipSupport == true) {
			mode_lib->vba.BandwidthAvailableForImmediateFlip = dml32_CalculateBandwidthAvailableForImmediateFlip(
					mode_lib->vba.NumberOfActiveSurfaces,
					mode_lib->vba.ReturnBW,
					v->ReadBandwidthSurfaceLuma,
					v->ReadBandwidthSurfaceChroma,
					v->RequiredPrefetchPixDataBWLuma,
					v->RequiredPrefetchPixDataBWChroma,
					v->cursor_bw,
					v->cursor_bw_pre,
					mode_lib->vba.DPPPerPlane,
					v->UrgBurstFactorLuma,
					v->UrgBurstFactorChroma,
					v->UrgBurstFactorCursor,
					v->UrgBurstFactorLumaPre,
					v->UrgBurstFactorChromaPre,
					v->UrgBurstFactorCursorPre);

			mode_lib->vba.TotImmediateFlipBytes = 0;
			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				if (mode_lib->vba.ImmediateFlipRequirement[k] != dm_immediate_flip_not_required) {
					mode_lib->vba.TotImmediateFlipBytes = mode_lib->vba.TotImmediateFlipBytes
							+ mode_lib->vba.DPPPerPlane[k]
									* (v->PDEAndMetaPTEBytesFrame[k]
											+ v->MetaRowByte[k]);
					if (v->use_one_row_for_frame_flip[k][0][0]) {
						mode_lib->vba.TotImmediateFlipBytes =
								mode_lib->vba.TotImmediateFlipBytes
										+ 2 * v->PixelPTEBytesPerRow[k];
					} else {
						mode_lib->vba.TotImmediateFlipBytes =
								mode_lib->vba.TotImmediateFlipBytes
										+ v->PixelPTEBytesPerRow[k];
					}
				}
			}
			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				dml32_CalculateFlipSchedule(v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor,
						v->UrgentExtraLatency,
						v->UrgentLatency,
						mode_lib->vba.GPUVMMaxPageTableLevels,
						mode_lib->vba.HostVMEnable,
						mode_lib->vba.HostVMMaxNonCachedPageTableLevels,
						mode_lib->vba.GPUVMEnable,
						mode_lib->vba.HostVMMinPageSize,
						v->PDEAndMetaPTEBytesFrame[k],
						v->MetaRowByte[k],
						v->PixelPTEBytesPerRow[k],
						mode_lib->vba.BandwidthAvailableForImmediateFlip,
						mode_lib->vba.TotImmediateFlipBytes,
						mode_lib->vba.SourcePixelFormat[k],
						mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
						mode_lib->vba.VRatio[k],
						mode_lib->vba.VRatioChroma[k],
						v->Tno_bw[k],
						mode_lib->vba.DCCEnable[k],
						v->dpte_row_height[k],
						v->meta_row_height[k],
						v->dpte_row_height_chroma[k],
						v->meta_row_height_chroma[k],
						v->Use_One_Row_For_Frame_Flip[k],

						/* Output */
						&v->DestinationLinesToRequestVMInImmediateFlip[k],
						&v->DestinationLinesToRequestRowInImmediateFlip[k],
						&v->final_flip_bw[k],
						&v->ImmediateFlipSupportedForPipe[k]);
			}

			{
				dml32_CalculateImmediateFlipBandwithSupport(mode_lib->vba.NumberOfActiveSurfaces,
						mode_lib->vba.ReturnBW,
						mode_lib->vba.ImmediateFlipRequirement,
						v->final_flip_bw,
						v->ReadBandwidthSurfaceLuma,
						v->ReadBandwidthSurfaceChroma,
						v->RequiredPrefetchPixDataBWLuma,
						v->RequiredPrefetchPixDataBWChroma,
						v->cursor_bw,
						v->meta_row_bw,
						v->dpte_row_bw,
						v->cursor_bw_pre,
						v->prefetch_vmrow_bw,
						mode_lib->vba.DPPPerPlane,
						v->UrgBurstFactorLuma,
						v->UrgBurstFactorChroma,
						v->UrgBurstFactorCursor,
						v->UrgBurstFactorLumaPre,
						v->UrgBurstFactorChromaPre,
						v->UrgBurstFactorCursorPre,

						/* output */
						&v->total_dcn_read_bw_with_flip,    // Single  *TotalBandwidth
						&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[0],                        // Single  *FractionOfUrgentBandwidth
						&v->ImmediateFlipSupported);        // Boolean *ImmediateFlipBandwidthSupport

				dml32_CalculateImmediateFlipBandwithSupport(mode_lib->vba.NumberOfActiveSurfaces,
						mode_lib->vba.ReturnBW,
						mode_lib->vba.ImmediateFlipRequirement,
						v->final_flip_bw,
						v->ReadBandwidthSurfaceLuma,
						v->ReadBandwidthSurfaceChroma,
						v->RequiredPrefetchPixDataBWLuma,
						v->RequiredPrefetchPixDataBWChroma,
						v->cursor_bw,
						v->meta_row_bw,
						v->dpte_row_bw,
						v->cursor_bw_pre,
						v->prefetch_vmrow_bw,
						mode_lib->vba.DPPPerPlane,
						v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
						v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
						v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
						v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
						v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,
						v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector,

						/* output */
						&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[1],                                // Single  *TotalBandwidth
						&v->FractionOfUrgentBandwidthImmediateFlip, // Single  *FractionOfUrgentBandwidth
						&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean);                              // Boolean *ImmediateFlipBandwidthSupport
			}

			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				if (mode_lib->vba.ImmediateFlipRequirement[k] != dm_immediate_flip_not_required && v->ImmediateFlipSupportedForPipe[k] == false) {
					v->ImmediateFlipSupported = false;
#ifdef __DML_VBA_DEBUG__
					dml_print("DML::%s: Pipe %0d not supporting iflip\n", __func__, k);
#endif
				}
			}
		} else {
			v->ImmediateFlipSupported = false;
		}

		/* 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) */
		v->PrefetchAndImmediateFlipSupported = (v->PrefetchModeSupported == true &&
				((!mode_lib->vba.ImmediateFlipSupport && !mode_lib->vba.HostVMEnable && !ImmediateFlipRequirementFinal) ||
						v->ImmediateFlipSupported)) ? true : false;

#ifdef __DML_VBA_DEBUG__
		dml_print("DML::%s: PrefetchModeSupported = %d\n", __func__, locals->PrefetchModeSupported);
		for (uint k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
			dml_print("DML::%s: ImmediateFlipRequirement[%d] = %d\n", __func__, k,  mode_lib->vba.ImmediateFlipRequirement[k] == dm_immediate_flip_required);
		dml_print("DML::%s: ImmediateFlipSupported = %d\n", __func__, locals->ImmediateFlipSupported);
		dml_print("DML::%s: ImmediateFlipSupport = %d\n", __func__, mode_lib->vba.ImmediateFlipSupport);
		dml_print("DML::%s: HostVMEnable = %d\n", __func__, mode_lib->vba.HostVMEnable);
		dml_print("DML::%s: PrefetchAndImmediateFlipSupported = %d\n", __func__, locals->PrefetchAndImmediateFlipSupported);
		dml_print("DML::%s: Done loop: Vstartup=%d, Max Vstartup=%d\n", __func__, locals->VStartupLines, locals->MaximumMaxVStartupLines);
#endif

		v->VStartupLines = v->VStartupLines + 1;

		if (v->VStartupLines > v->MaximumMaxVStartupLines) {
#ifdef __DML_VBA_DEBUG__
			dml_print("DML::%s: Vstartup exceeds max vstartup, exiting loop\n", __func__);
#endif
			break; // VBA_DELTA: Implementation divergence! Gabe is *still* iterating across prefetch modes which we don't care to do
		}
		iteration++;
		if (iteration > 2500) {
#ifdef __DML_VBA_DEBUG__
			dml_print("DML::%s: too many errors, exit now\n", __func__);
			assert(0);
#endif
		}
	} while (!(v->PrefetchAndImmediateFlipSupported || NextPrefetchMode > mode_lib->vba.MaxPrefetchMode));


	if (v->VStartupLines <= v->MaximumMaxVStartupLines) {
#ifdef __DML_VBA_DEBUG__
		dml_print("DML::%s: Good, Prefetch and flip scheduling found solution at VStartupLines=%d\n", __func__, locals->VStartupLines-1);
#endif
	}


	//Watermarks and NB P-State/DRAM Clock Change Support
	{
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.UrgentLatency = v->UrgentLatency;
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.ExtraLatency = v->UrgentExtraLatency;
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.WritebackLatency = mode_lib->vba.WritebackLatency;
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.DRAMClockChangeLatency = mode_lib->vba.DRAMClockChangeLatency;
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.FCLKChangeLatency = mode_lib->vba.FCLKChangeLatency;
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SRExitTime = mode_lib->vba.SRExitTime;
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SREnterPlusExitTime = mode_lib->vba.SREnterPlusExitTime;
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SRExitZ8Time = mode_lib->vba.SRExitZ8Time;
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SREnterPlusExitZ8Time = mode_lib->vba.SREnterPlusExitZ8Time;
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.USRRetrainingLatency = mode_lib->vba.USRRetrainingLatency;
		v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SMNLatency = mode_lib->vba.SMNLatency;

		dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport(
			v,
			v->PrefetchModePerState[v->VoltageLevel][v->maxMpcComb],
			v->DCFCLK,
			v->ReturnBW,
			v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters,
			v->SOCCLK,
			v->DCFCLKDeepSleep,
			v->DETBufferSizeY,
			v->DETBufferSizeC,
			v->SwathHeightY,
			v->SwathHeightC,
			v->SwathWidthY,
			v->SwathWidthC,
			v->DPPPerPlane,
			v->BytePerPixelDETY,
			v->BytePerPixelDETC,
			v->DSTXAfterScaler,
			v->DSTYAfterScaler,
			v->UnboundedRequestEnabled,
			v->CompressedBufferSizeInkByte,

			/* Output */
			&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_dramchange_support,
			v->MaxActiveDRAMClockChangeLatencySupported,
			v->SubViewportLinesNeededInMALL,
			&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_fclkchange_support,
			&v->MinActiveFCLKChangeLatencySupported,
			&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_USRRetrainingSupport,
			mode_lib->vba.ActiveDRAMClockChangeLatencyMargin);

		/* DCN32 has a new struct Watermarks (typedef) which is used to store
		 * calculated WM values. Copy over values from struct to vba varaibles
		 * to ensure that the DCN32 getters return the correct value.
		 */
		v->UrgentWatermark = v->Watermark.UrgentWatermark;
		v->WritebackUrgentWatermark = v->Watermark.WritebackUrgentWatermark;
		v->DRAMClockChangeWatermark = v->Watermark.DRAMClockChangeWatermark;
		v->WritebackDRAMClockChangeWatermark = v->Watermark.WritebackDRAMClockChangeWatermark;
		v->StutterExitWatermark = v->Watermark.StutterExitWatermark;
		v->StutterEnterPlusExitWatermark = v->Watermark.StutterEnterPlusExitWatermark;
		v->Z8StutterExitWatermark = v->Watermark.Z8StutterExitWatermark;
		v->Z8StutterEnterPlusExitWatermark = v->Watermark.Z8StutterEnterPlusExitWatermark;

		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
			if (mode_lib->vba.WritebackEnable[k] == true) {
				v->WritebackAllowDRAMClockChangeEndPosition[k] = dml_max(0,
						v->VStartup[k] * mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]
								- v->Watermark.WritebackDRAMClockChangeWatermark);
				v->WritebackAllowFCLKChangeEndPosition[k] = dml_max(0,
						v->VStartup[k] * mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]
								- v->Watermark.WritebackFCLKChangeWatermark);
			} else {
				v->WritebackAllowDRAMClockChangeEndPosition[k] = 0;
				v->WritebackAllowFCLKChangeEndPosition[k] = 0;
			}
		}
	}

	//Display Pipeline Delivery Time in Prefetch, Groups
	dml32_CalculatePixelDeliveryTimes(
			mode_lib->vba.NumberOfActiveSurfaces,
			mode_lib->vba.VRatio,
			mode_lib->vba.VRatioChroma,
			v->VRatioPrefetchY,
			v->VRatioPrefetchC,
			v->swath_width_luma_ub,
			v->swath_width_chroma_ub,
			mode_lib->vba.DPPPerPlane,
			mode_lib->vba.HRatio,
			mode_lib->vba.HRatioChroma,
			mode_lib->vba.PixelClock,
			v->PSCL_THROUGHPUT_LUMA,
			v->PSCL_THROUGHPUT_CHROMA,
			mode_lib->vba.DPPCLK,
			v->BytePerPixelC,
			mode_lib->vba.SourceRotation,
			mode_lib->vba.NumberOfCursors,
			mode_lib->vba.CursorWidth,
			mode_lib->vba.CursorBPP,
			v->BlockWidth256BytesY,
			v->BlockHeight256BytesY,
			v->BlockWidth256BytesC,
			v->BlockHeight256BytesC,

			/* Output */
			v->DisplayPipeLineDeliveryTimeLuma,
			v->DisplayPipeLineDeliveryTimeChroma,
			v->DisplayPipeLineDeliveryTimeLumaPrefetch,
			v->DisplayPipeLineDeliveryTimeChromaPrefetch,
			v->DisplayPipeRequestDeliveryTimeLuma,
			v->DisplayPipeRequestDeliveryTimeChroma,
			v->DisplayPipeRequestDeliveryTimeLumaPrefetch,
			v->DisplayPipeRequestDeliveryTimeChromaPrefetch,
			v->CursorRequestDeliveryTime,
			v->CursorRequestDeliveryTimePrefetch);

	dml32_CalculateMetaAndPTETimes(v->Use_One_Row_For_Frame,
			mode_lib->vba.NumberOfActiveSurfaces,
			mode_lib->vba.GPUVMEnable,
			mode_lib->vba.MetaChunkSize,
			mode_lib->vba.MinMetaChunkSizeBytes,
			mode_lib->vba.HTotal,
			mode_lib->vba.VRatio,
			mode_lib->vba.VRatioChroma,
			v->DestinationLinesToRequestRowInVBlank,
			v->DestinationLinesToRequestRowInImmediateFlip,
			mode_lib->vba.DCCEnable,
			mode_lib->vba.PixelClock,
			v->BytePerPixelY,
			v->BytePerPixelC,
			mode_lib->vba.SourceRotation,
			v->dpte_row_height,
			v->dpte_row_height_chroma,
			v->meta_row_width,
			v->meta_row_width_chroma,
			v->meta_row_height,
			v->meta_row_height_chroma,
			v->meta_req_width,
			v->meta_req_width_chroma,
			v->meta_req_height,
			v->meta_req_height_chroma,
			v->dpte_group_bytes,
			v->PTERequestSizeY,
			v->PTERequestSizeC,
			v->PixelPTEReqWidthY,
			v->PixelPTEReqHeightY,
			v->PixelPTEReqWidthC,
			v->PixelPTEReqHeightC,
			v->dpte_row_width_luma_ub,
			v->dpte_row_width_chroma_ub,

			/* Output */
			v->DST_Y_PER_PTE_ROW_NOM_L,
			v->DST_Y_PER_PTE_ROW_NOM_C,
			v->DST_Y_PER_META_ROW_NOM_L,
			v->DST_Y_PER_META_ROW_NOM_C,
			v->TimePerMetaChunkNominal,
			v->TimePerChromaMetaChunkNominal,
			v->TimePerMetaChunkVBlank,
			v->TimePerChromaMetaChunkVBlank,
			v->TimePerMetaChunkFlip,
			v->TimePerChromaMetaChunkFlip,
			v->time_per_pte_group_nom_luma,
			v->time_per_pte_group_vblank_luma,
			v->time_per_pte_group_flip_luma,
			v->time_per_pte_group_nom_chroma,
			v->time_per_pte_group_vblank_chroma,
			v->time_per_pte_group_flip_chroma);

	dml32_CalculateVMGroupAndRequestTimes(
			mode_lib->vba.NumberOfActiveSurfaces,
			mode_lib->vba.GPUVMEnable,
			mode_lib->vba.GPUVMMaxPageTableLevels,
			mode_lib->vba.HTotal,
			v->BytePerPixelC,
			v->DestinationLinesToRequestVMInVBlank,
			v->DestinationLinesToRequestVMInImmediateFlip,
			mode_lib->vba.DCCEnable,
			mode_lib->vba.PixelClock,
			v->dpte_row_width_luma_ub,
			v->dpte_row_width_chroma_ub,
			v->vm_group_bytes,
			v->dpde0_bytes_per_frame_ub_l,
			v->dpde0_bytes_per_frame_ub_c,
			v->meta_pte_bytes_per_frame_ub_l,
			v->meta_pte_bytes_per_frame_ub_c,

			/* Output */
			v->TimePerVMGroupVBlank,
			v->TimePerVMGroupFlip,
			v->TimePerVMRequestVBlank,
			v->TimePerVMRequestFlip);

	// Min TTUVBlank
	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		if (mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] == 0) {
			v->MinTTUVBlank[k] = dml_max4(v->Watermark.DRAMClockChangeWatermark,
					v->Watermark.FCLKChangeWatermark, v->Watermark.StutterEnterPlusExitWatermark,
					v->Watermark.UrgentWatermark);
		} else if (mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb]
				== 1) {
			v->MinTTUVBlank[k] = dml_max3(v->Watermark.FCLKChangeWatermark,
					v->Watermark.StutterEnterPlusExitWatermark, v->Watermark.UrgentWatermark);
		} else if (mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb]
				== 2) {
			v->MinTTUVBlank[k] = dml_max(v->Watermark.StutterEnterPlusExitWatermark,
					v->Watermark.UrgentWatermark);
		} else {
			v->MinTTUVBlank[k] = v->Watermark.UrgentWatermark;
		}
		if (!mode_lib->vba.DynamicMetadataEnable[k])
			v->MinTTUVBlank[k] = mode_lib->vba.TCalc + v->MinTTUVBlank[k];
	}

	// DCC Configuration
	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
#ifdef __DML_VBA_DEBUG__
		dml_print("DML::%s: Calculate DCC configuration for surface k=%d\n", __func__, k);
#endif
		dml32_CalculateDCCConfiguration(
				mode_lib->vba.DCCEnable[k],
				mode_lib->vba.DCCProgrammingAssumesScanDirectionUnknownFinal,
				mode_lib->vba.SourcePixelFormat[k], mode_lib->vba.SurfaceWidthY[k],
				mode_lib->vba.SurfaceWidthC[k],
				mode_lib->vba.SurfaceHeightY[k],
				mode_lib->vba.SurfaceHeightC[k],
				mode_lib->vba.nomDETInKByte,
				v->BlockHeight256BytesY[k],
				v->BlockHeight256BytesC[k],
				mode_lib->vba.SurfaceTiling[k],
				v->BytePerPixelY[k],
				v->BytePerPixelC[k],
				v->BytePerPixelDETY[k],
				v->BytePerPixelDETC[k],
				(enum dm_rotation_angle) mode_lib->vba.SourceScan[k],
				/* Output */
				&v->DCCYMaxUncompressedBlock[k],
				&v->DCCCMaxUncompressedBlock[k],
				&v->DCCYMaxCompressedBlock[k],
				&v->DCCCMaxCompressedBlock[k],
				&v->DCCYIndependentBlock[k],
				&v->DCCCIndependentBlock[k]);
	}

	// VStartup Adjustment
	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		bool isInterlaceTiming;
		double Tvstartup_margin = (v->MaxVStartupLines[k] - v->VStartup[k]) * mode_lib->vba.HTotal[k]
				/ mode_lib->vba.PixelClock[k];
#ifdef __DML_VBA_DEBUG__
		dml_print("DML::%s: k=%d, MinTTUVBlank = %f (before vstartup margin)\n", __func__, k,
				v->MinTTUVBlank[k]);
#endif

		v->MinTTUVBlank[k] = v->MinTTUVBlank[k] + Tvstartup_margin;

#ifdef __DML_VBA_DEBUG__
		dml_print("DML::%s: k=%d, Tvstartup_margin = %f\n", __func__, k, Tvstartup_margin);
		dml_print("DML::%s: k=%d, MaxVStartupLines = %d\n", __func__, k, v->MaxVStartupLines[k]);
		dml_print("DML::%s: k=%d, VStartup = %d\n", __func__, k, v->VStartup[k]);
		dml_print("DML::%s: k=%d, MinTTUVBlank = %f\n", __func__, k, v->MinTTUVBlank[k]);
#endif

		v->Tdmdl[k] = v->Tdmdl[k] + Tvstartup_margin;
		if (mode_lib->vba.DynamicMetadataEnable[k] && mode_lib->vba.DynamicMetadataVMEnabled)
			v->Tdmdl_vm[k] = v->Tdmdl_vm[k] + Tvstartup_margin;

		isInterlaceTiming = (mode_lib->vba.Interlace[k] &&
				!mode_lib->vba.ProgressiveToInterlaceUnitInOPP);

		v->MIN_DST_Y_NEXT_START[k] = ((isInterlaceTiming ? dml_floor((mode_lib->vba.VTotal[k] -
						mode_lib->vba.VFrontPorch[k]) / 2.0, 1.0) :
						mode_lib->vba.VTotal[k]) - mode_lib->vba.VFrontPorch[k])
						+ dml_max(1.0,
						dml_ceil(v->WritebackDelay[mode_lib->vba.VoltageLevel][k]
						/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]), 1.0))
						+ dml_floor(4.0 * v->TSetup[k] / (mode_lib->vba.HTotal[k]
						/ mode_lib->vba.PixelClock[k]), 1.0) / 4.0;

		v->VStartup[k] = (isInterlaceTiming ? (2 * v->MaxVStartupLines[k]) : v->MaxVStartupLines[k]);

		if (((v->VUpdateOffsetPix[k] + v->VUpdateWidthPix[k] + v->VReadyOffsetPix[k])
			/ mode_lib->vba.HTotal[k]) <= (isInterlaceTiming ? dml_floor((mode_lib->vba.VTotal[k]
			- mode_lib->vba.VActive[k] - mode_lib->vba.VFrontPorch[k] - v->VStartup[k]) / 2.0, 1.0) :
			(int) (mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]
		       - mode_lib->vba.VFrontPorch[k] - v->VStartup[k]))) {
			v->VREADY_AT_OR_AFTER_VSYNC[k] = true;
		} else {
			v->VREADY_AT_OR_AFTER_VSYNC[k] = false;
		}
#ifdef __DML_VBA_DEBUG__
		dml_print("DML::%s: k=%d, VStartup = %d (max)\n", __func__, k, v->VStartup[k]);
		dml_print("DML::%s: k=%d, VUpdateOffsetPix = %d\n", __func__, k, v->VUpdateOffsetPix[k]);
		dml_print("DML::%s: k=%d, VUpdateWidthPix = %d\n", __func__, k, v->VUpdateWidthPix[k]);
		dml_print("DML::%s: k=%d, VReadyOffsetPix = %d\n", __func__, k, v->VReadyOffsetPix[k]);
		dml_print("DML::%s: k=%d, HTotal = %d\n", __func__, k, mode_lib->vba.HTotal[k]);
		dml_print("DML::%s: k=%d, VTotal = %d\n", __func__, k, mode_lib->vba.VTotal[k]);
		dml_print("DML::%s: k=%d, VActive = %d\n", __func__, k, mode_lib->vba.VActive[k]);
		dml_print("DML::%s: k=%d, VFrontPorch = %d\n", __func__, k, mode_lib->vba.VFrontPorch[k]);
		dml_print("DML::%s: k=%d, VStartup = %d\n", __func__, k, v->VStartup[k]);
		dml_print("DML::%s: k=%d, TSetup = %f\n", __func__, k, v->TSetup[k]);
		dml_print("DML::%s: k=%d, MIN_DST_Y_NEXT_START = %f\n", __func__, k, v->MIN_DST_Y_NEXT_START[k]);
		dml_print("DML::%s: k=%d, VREADY_AT_OR_AFTER_VSYNC = %d\n", __func__, k,
				v->VREADY_AT_OR_AFTER_VSYNC[k]);
#endif
	}

	{
		//Maximum Bandwidth Used
		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
			if (mode_lib->vba.WritebackEnable[k] == true
					&& mode_lib->vba.WritebackPixelFormat[k] == dm_444_32) {
				WRBandwidth = mode_lib->vba.WritebackDestinationWidth[k]
						* mode_lib->vba.WritebackDestinationHeight[k]
						/ (mode_lib->vba.HTotal[k] * mode_lib->vba.WritebackSourceHeight[k]
								/ mode_lib->vba.PixelClock[k]) * 4;
			} else if (mode_lib->vba.WritebackEnable[k] == true) {
				WRBandwidth = mode_lib->vba.WritebackDestinationWidth[k]
						* mode_lib->vba.WritebackDestinationHeight[k]
						/ (mode_lib->vba.HTotal[k] * mode_lib->vba.WritebackSourceHeight[k]
								/ mode_lib->vba.PixelClock[k]) * 8;
			}
			TotalWRBandwidth = TotalWRBandwidth + WRBandwidth;
		}

		v->TotalDataReadBandwidth = 0;
		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
			v->TotalDataReadBandwidth = v->TotalDataReadBandwidth + v->ReadBandwidthSurfaceLuma[k]
					+ v->ReadBandwidthSurfaceChroma[k];
#ifdef __DML_VBA_DEBUG__
			dml_print("DML::%s: k=%d, TotalDataReadBandwidth = %f\n",
					__func__, k, v->TotalDataReadBandwidth);
			dml_print("DML::%s: k=%d, ReadBandwidthSurfaceLuma = %f\n",
					__func__, k, v->ReadBandwidthSurfaceLuma[k]);
			dml_print("DML::%s: k=%d, ReadBandwidthSurfaceChroma = %f\n",
					__func__, k, v->ReadBandwidthSurfaceChroma[k]);
#endif
		}
	}

	// Stutter Efficiency
	dml32_CalculateStutterEfficiency(v->CompressedBufferSizeInkByte,
			mode_lib->vba.UsesMALLForPStateChange,
			v->UnboundedRequestEnabled,
			mode_lib->vba.MetaFIFOSizeInKEntries,
			mode_lib->vba.ZeroSizeBufferEntries,
			mode_lib->vba.PixelChunkSizeInKByte,
			mode_lib->vba.NumberOfActiveSurfaces,
			mode_lib->vba.ROBBufferSizeInKByte,
			v->TotalDataReadBandwidth,
			mode_lib->vba.DCFCLK,
			mode_lib->vba.ReturnBW,
			v->CompbufReservedSpace64B,
			v->CompbufReservedSpaceZs,
			mode_lib->vba.SRExitTime,
			mode_lib->vba.SRExitZ8Time,
			mode_lib->vba.SynchronizeTimingsFinal,
			mode_lib->vba.BlendingAndTiming,
			v->Watermark.StutterEnterPlusExitWatermark,
			v->Watermark.Z8StutterEnterPlusExitWatermark,
			mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
			mode_lib->vba.Interlace,
			v->MinTTUVBlank, mode_lib->vba.DPPPerPlane,
			mode_lib->vba.DETBufferSizeY,
			v->BytePerPixelY,
			v->BytePerPixelDETY,
			v->SwathWidthY,
			mode_lib->vba.SwathHeightY,
			mode_lib->vba.SwathHeightC,
			mode_lib->vba.DCCRateLuma,
			mode_lib->vba.DCCRateChroma,
			mode_lib->vba.DCCFractionOfZeroSizeRequestsLuma,
			mode_lib->vba.DCCFractionOfZeroSizeRequestsChroma,
			mode_lib->vba.HTotal, mode_lib->vba.VTotal,
			mode_lib->vba.PixelClock,
			mode_lib->vba.VRatio,
			mode_lib->vba.SourceRotation,
			v->BlockHeight256BytesY,
			v->BlockWidth256BytesY,
			v->BlockHeight256BytesC,
			v->BlockWidth256BytesC,
			v->DCCYMaxUncompressedBlock,
			v->DCCCMaxUncompressedBlock,
			mode_lib->vba.VActive,
			mode_lib->vba.DCCEnable,
			mode_lib->vba.WritebackEnable,
			v->ReadBandwidthSurfaceLuma,
			v->ReadBandwidthSurfaceChroma,
			v->meta_row_bw,
			v->dpte_row_bw,
			/* Output */
			&v->StutterEfficiencyNotIncludingVBlank,
			&v->StutterEfficiency,
			&v->NumberOfStutterBurstsPerFrame,
			&v->Z8StutterEfficiencyNotIncludingVBlank,
			&v->Z8StutterEfficiency,
			&v->Z8NumberOfStutterBurstsPerFrame,
			&v->StutterPeriod,
			&v->DCHUBBUB_ARB_CSTATE_MAX_CAP_MODE);

#ifdef __DML_VBA_ALLOW_DELTA__
	{
		unsigned int dummy_integer[1];

		// Calculate z8 stutter eff assuming 0 reserved space
		dml32_CalculateStutterEfficiency(v->CompressedBufferSizeInkByte,
				mode_lib->vba.UsesMALLForPStateChange,
				v->UnboundedRequestEnabled,
				mode_lib->vba.MetaFIFOSizeInKEntries,
				mode_lib->vba.ZeroSizeBufferEntries,
				mode_lib->vba.PixelChunkSizeInKByte,
				mode_lib->vba.NumberOfActiveSurfaces,
				mode_lib->vba.ROBBufferSizeInKByte,
				v->TotalDataReadBandwidth,
				mode_lib->vba.DCFCLK,
				mode_lib->vba.ReturnBW,
				0, //CompbufReservedSpace64B,
				0, //CompbufReservedSpaceZs,
				mode_lib->vba.SRExitTime,
				mode_lib->vba.SRExitZ8Time,
				mode_lib->vba.SynchronizeTimingsFinal,
				mode_lib->vba.BlendingAndTiming,
				v->Watermark.StutterEnterPlusExitWatermark,
				v->Watermark.Z8StutterEnterPlusExitWatermark,
				mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
				mode_lib->vba.Interlace,
				v->MinTTUVBlank,
				mode_lib->vba.DPPPerPlane,
				mode_lib->vba.DETBufferSizeY,
				v->BytePerPixelY, v->BytePerPixelDETY,
				v->SwathWidthY, mode_lib->vba.SwathHeightY,
				mode_lib->vba.SwathHeightC,
				mode_lib->vba.DCCRateLuma,
				mode_lib->vba.DCCRateChroma,
				mode_lib->vba.DCCFractionOfZeroSizeRequestsLuma,
				mode_lib->vba.DCCFractionOfZeroSizeRequestsChroma,
				mode_lib->vba.HTotal,
				mode_lib->vba.VTotal,
				mode_lib->vba.PixelClock,
				mode_lib->vba.VRatio,
				mode_lib->vba.SourceRotation,
				v->BlockHeight256BytesY,
				v->BlockWidth256BytesY,
				v->BlockHeight256BytesC,
				v->BlockWidth256BytesC,
				v->DCCYMaxUncompressedBlock,
				v->DCCCMaxUncompressedBlock,
				mode_lib->vba.VActive,
				mode_lib->vba.DCCEnable,
				mode_lib->vba.WritebackEnable,
				v->ReadBandwidthSurfaceLuma,
				v->ReadBandwidthSurfaceChroma,
				v->meta_row_bw, v->dpte_row_bw,

				/* Output */
				&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[0],
				&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[1],
				&dummy_integer[0],
				&v->Z8StutterEfficiencyNotIncludingVBlankBestCase,
				&v->Z8StutterEfficiencyBestCase,
				&v->Z8NumberOfStutterBurstsPerFrameBestCase,
				&v->StutterPeriodBestCase,
				&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean);
	}
#else
	v->Z8StutterEfficiencyNotIncludingVBlankBestCase = v->Z8StutterEfficiencyNotIncludingVBlank;
	v->Z8StutterEfficiencyBestCase = v->Z8StutterEfficiency;
	v->Z8NumberOfStutterBurstsPerFrameBestCase = v->Z8NumberOfStutterBurstsPerFrame;
	v->StutterPeriodBestCase = v->StutterPeriod;
#endif

#ifdef __DML_VBA_DEBUG__
	dml_print("DML::%s: --- END ---\n", __func__);
#endif
}

static void mode_support_configuration(struct vba_vars_st *v,
				  struct display_mode_lib *mode_lib)
{
	int i, j;

	for (i = v->soc.num_states - 1; i >= 0; i--) {
		for (j = 0; j < 2; j++) {
			if (mode_lib->vba.ScaleRatioAndTapsSupport == true
				&& mode_lib->vba.SourceFormatPixelAndScanSupport == true
				&& mode_lib->vba.ViewportSizeSupport[i][j] == true
				&& !mode_lib->vba.LinkRateDoesNotMatchDPVersion
				&& !mode_lib->vba.LinkRateForMultistreamNotIndicated
				&& !mode_lib->vba.BPPForMultistreamNotIndicated
				&& !mode_lib->vba.MultistreamWithHDMIOreDP
				&& !mode_lib->vba.ExceededMultistreamSlots[i]
				&& !mode_lib->vba.MSOOrODMSplitWithNonDPLink
				&& !mode_lib->vba.NotEnoughLanesForMSO
				&& mode_lib->vba.LinkCapacitySupport[i] == true && !mode_lib->vba.P2IWith420
				&& !mode_lib->vba.DSCOnlyIfNecessaryWithBPP
				&& !mode_lib->vba.DSC422NativeNotSupported
				&& !mode_lib->vba.MPCCombineMethodIncompatible
				&& mode_lib->vba.ODMCombine2To1SupportCheckOK[i] == true
				&& mode_lib->vba.ODMCombine4To1SupportCheckOK[i] == true
				&& mode_lib->vba.NotEnoughDSCUnits[i] == false
				&& !mode_lib->vba.NotEnoughDSCSlices[i]
				&& !mode_lib->vba.ImmediateFlipOrHostVMAndPStateWithMALLFullFrameOrPhantomPipe
				&& !mode_lib->vba.InvalidCombinationOfMALLUseForPStateAndStaticScreen
				&& mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] == false
				&& mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i]
				&& mode_lib->vba.DTBCLKRequiredMoreThanSupported[i] == false
				&& !mode_lib->vba.InvalidCombinationOfMALLUseForPState
				&& !mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified
				&& mode_lib->vba.ROBSupport[i][j] == true
				&& mode_lib->vba.DISPCLK_DPPCLK_Support[i][j] == true
				&& mode_lib->vba.TotalAvailablePipesSupport[i][j] == true
				&& mode_lib->vba.NumberOfOTGSupport == true
				&& mode_lib->vba.NumberOfHDMIFRLSupport == true
				&& mode_lib->vba.EnoughWritebackUnits == true
				&& mode_lib->vba.WritebackLatencySupport == true
				&& mode_lib->vba.WritebackScaleRatioAndTapsSupport == true
				&& mode_lib->vba.CursorSupport == true && mode_lib->vba.PitchSupport == true
				&& mode_lib->vba.ViewportExceedsSurface == false
				&& mode_lib->vba.PrefetchSupported[i][j] == true
				&& mode_lib->vba.VActiveBandwithSupport[i][j] == true
				&& mode_lib->vba.DynamicMetadataSupported[i][j] == true
				&& mode_lib->vba.TotalVerticalActiveBandwidthSupport[i][j] == true
				&& mode_lib->vba.VRatioInPrefetchSupported[i][j] == true
				&& mode_lib->vba.PTEBufferSizeNotExceeded[i][j] == true
				&& mode_lib->vba.DCCMetaBufferSizeNotExceeded[i][j] == true
				&& mode_lib->vba.NonsupportedDSCInputBPC == false
				&& !mode_lib->vba.ExceededMALLSize
				&& ((mode_lib->vba.HostVMEnable == false
				&& !mode_lib->vba.ImmediateFlipRequiredFinal)
				|| mode_lib->vba.ImmediateFlipSupportedForState[i][j])
				&& (!mode_lib->vba.DRAMClockChangeRequirementFinal
				|| i == v->soc.num_states - 1
				|| mode_lib->vba.DRAMClockChangeSupport[i][j] != dm_dram_clock_change_unsupported)
				&& (!mode_lib->vba.FCLKChangeRequirementFinal || i == v->soc.num_states - 1
				|| mode_lib->vba.FCLKChangeSupport[i][j] != dm_fclock_change_unsupported)
				&& (!mode_lib->vba.USRRetrainingRequiredFinal
				|| mode_lib->vba.USRRetrainingSupport[i][j])) {
				mode_lib->vba.ModeSupport[i][j] = true;
			} else {
				mode_lib->vba.ModeSupport[i][j] = false;
			}
		}
	}
}

void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib)
{
	struct vba_vars_st *v = &mode_lib->vba;
	int i, j;
	unsigned int k, m;
	unsigned int MaximumMPCCombine;
	unsigned int NumberOfNonCombinedSurfaceOfMaximumBandwidth;
	unsigned int TotalSlots;
	bool CompBufReservedSpaceNeedAdjustment;
	bool CompBufReservedSpaceNeedAdjustmentSingleDPP;

#ifdef __DML_VBA_DEBUG__
	dml_print("DML::%s: called\n", __func__);
#endif

	/*MODE SUPPORT, VOLTAGE STATE AND SOC CONFIGURATION*/

	/*Scale Ratio, taps Support Check*/

	mode_lib->vba.ScaleRatioAndTapsSupport = true;
	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		if (mode_lib->vba.ScalerEnabled[k] == false
				&& ((mode_lib->vba.SourcePixelFormat[k] != dm_444_64
						&& mode_lib->vba.SourcePixelFormat[k] != dm_444_32
						&& mode_lib->vba.SourcePixelFormat[k] != dm_444_16
						&& mode_lib->vba.SourcePixelFormat[k] != dm_mono_16
						&& mode_lib->vba.SourcePixelFormat[k] != dm_mono_8
						&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe
						&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe_alpha)
						|| mode_lib->vba.HRatio[k] != 1.0 || mode_lib->vba.htaps[k] != 1.0
						|| mode_lib->vba.VRatio[k] != 1.0 || mode_lib->vba.vtaps[k] != 1.0)) {
			mode_lib->vba.ScaleRatioAndTapsSupport = false;
		} else if (mode_lib->vba.vtaps[k] < 1.0 || mode_lib->vba.vtaps[k] > 8.0 || mode_lib->vba.htaps[k] < 1.0
				|| mode_lib->vba.htaps[k] > 8.0
				|| (mode_lib->vba.htaps[k] > 1.0 && (mode_lib->vba.htaps[k] % 2) == 1)
				|| mode_lib->vba.HRatio[k] > mode_lib->vba.MaxHSCLRatio
				|| mode_lib->vba.VRatio[k] > mode_lib->vba.MaxVSCLRatio
				|| mode_lib->vba.HRatio[k] > mode_lib->vba.htaps[k]
				|| mode_lib->vba.VRatio[k] > mode_lib->vba.vtaps[k]
				|| (mode_lib->vba.SourcePixelFormat[k] != dm_444_64
						&& mode_lib->vba.SourcePixelFormat[k] != dm_444_32
						&& mode_lib->vba.SourcePixelFormat[k] != dm_444_16
						&& mode_lib->vba.SourcePixelFormat[k] != dm_mono_16
						&& mode_lib->vba.SourcePixelFormat[k] != dm_mono_8
						&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe
						&& (mode_lib->vba.VTAPsChroma[k] < 1
								|| mode_lib->vba.VTAPsChroma[k] > 8
								|| mode_lib->vba.HTAPsChroma[k] < 1
								|| mode_lib->vba.HTAPsChroma[k] > 8
								|| (mode_lib->vba.HTAPsChroma[k] > 1
										&& mode_lib->vba.HTAPsChroma[k] % 2
												== 1)
								|| mode_lib->vba.HRatioChroma[k]
										> mode_lib->vba.MaxHSCLRatio
								|| mode_lib->vba.VRatioChroma[k]
										> mode_lib->vba.MaxVSCLRatio
								|| mode_lib->vba.HRatioChroma[k]
										> mode_lib->vba.HTAPsChroma[k]
								|| mode_lib->vba.VRatioChroma[k]
										> mode_lib->vba.VTAPsChroma[k]))) {
			mode_lib->vba.ScaleRatioAndTapsSupport = false;
		}
	}

	/*Source Format, Pixel Format and Scan Support Check*/
	mode_lib->vba.SourceFormatPixelAndScanSupport = true;
	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear
			&& (!(!IsVertical((enum dm_rotation_angle) mode_lib->vba.SourceScan[k]))
				|| mode_lib->vba.DCCEnable[k] == true)) {
			mode_lib->vba.SourceFormatPixelAndScanSupport = false;
		}
	}

	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		dml32_CalculateBytePerPixelAndBlockSizes(
				mode_lib->vba.SourcePixelFormat[k],
				mode_lib->vba.SurfaceTiling[k],

				/* Output */
				&mode_lib->vba.BytePerPixelY[k],
				&mode_lib->vba.BytePerPixelC[k],
				&mode_lib->vba.BytePerPixelInDETY[k],
				&mode_lib->vba.BytePerPixelInDETC[k],
				&mode_lib->vba.Read256BlockHeightY[k],
				&mode_lib->vba.Read256BlockHeightC[k],
				&mode_lib->vba.Read256BlockWidthY[k],
				&mode_lib->vba.Read256BlockWidthC[k],
				&mode_lib->vba.MacroTileHeightY[k],
				&mode_lib->vba.MacroTileHeightC[k],
				&mode_lib->vba.MacroTileWidthY[k],
				&mode_lib->vba.MacroTileWidthC[k]);
	}

	/*Bandwidth Support Check*/
	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		if (!IsVertical(mode_lib->vba.SourceRotation[k])) {
			v->SwathWidthYSingleDPP[k] = mode_lib->vba.ViewportWidth[k];
			v->SwathWidthCSingleDPP[k] = mode_lib->vba.ViewportWidthChroma[k];
		} else {
			v->SwathWidthYSingleDPP[k] = mode_lib->vba.ViewportHeight[k];
			v->SwathWidthCSingleDPP[k] = mode_lib->vba.ViewportHeightChroma[k];
		}
	}
	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		v->ReadBandwidthLuma[k] = v->SwathWidthYSingleDPP[k] * dml_ceil(v->BytePerPixelInDETY[k], 1.0)
				/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k];
		v->ReadBandwidthChroma[k] = v->SwathWidthYSingleDPP[k] / 2 * dml_ceil(v->BytePerPixelInDETC[k], 2.0)
				/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k]
				/ 2.0;
	}
	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		if (mode_lib->vba.WritebackEnable[k] == true && mode_lib->vba.WritebackPixelFormat[k] == dm_444_64) {
			v->WriteBandwidth[k] = mode_lib->vba.WritebackDestinationWidth[k]
					* mode_lib->vba.WritebackDestinationHeight[k]
					/ (mode_lib->vba.WritebackSourceHeight[k] * mode_lib->vba.HTotal[k]
							/ mode_lib->vba.PixelClock[k]) * 8.0;
		} else if (mode_lib->vba.WritebackEnable[k] == true) {
			v->WriteBandwidth[k] = mode_lib->vba.WritebackDestinationWidth[k]
					* mode_lib->vba.WritebackDestinationHeight[k]
					/ (mode_lib->vba.WritebackSourceHeight[k] * mode_lib->vba.HTotal[k]
							/ mode_lib->vba.PixelClock[k]) * 4.0;
		} else {
			v->WriteBandwidth[k] = 0.0;
		}
	}

	/*Writeback Latency support check*/

	mode_lib->vba.WritebackLatencySupport = true;
	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		if (mode_lib->vba.WritebackEnable[k] == true
				&& (v->WriteBandwidth[k]
						> mode_lib->vba.WritebackInterfaceBufferSize * 1024
								/ mode_lib->vba.WritebackLatency)) {
			mode_lib->vba.WritebackLatencySupport = false;
		}
	}

	/*Writeback Mode Support Check*/
	mode_lib->vba.EnoughWritebackUnits = true;
	mode_lib->vba.TotalNumberOfActiveWriteback = 0;
	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		if (mode_lib->vba.WritebackEnable[k] == true)
			mode_lib->vba.TotalNumberOfActiveWriteback = mode_lib->vba.TotalNumberOfActiveWriteback + 1;
	}

	if (mode_lib->vba.TotalNumberOfActiveWriteback > mode_lib->vba.MaxNumWriteback)
		mode_lib->vba.EnoughWritebackUnits = false;

	/*Writeback Scale Ratio and Taps Support Check*/
	mode_lib->vba.WritebackScaleRatioAndTapsSupport = true;
	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		if (mode_lib->vba.WritebackEnable[k] == true) {
			if (mode_lib->vba.WritebackHRatio[k] > mode_lib->vba.WritebackMaxHSCLRatio
					|| mode_lib->vba.WritebackVRatio[k] > mode_lib->vba.WritebackMaxVSCLRatio
					|| mode_lib->vba.WritebackHRatio[k] < mode_lib->vba.WritebackMinHSCLRatio
					|| mode_lib->vba.WritebackVRatio[k] < mode_lib->vba.WritebackMinVSCLRatio
					|| mode_lib->vba.WritebackHTaps[k] > mode_lib->vba.WritebackMaxHSCLTaps
					|| mode_lib->vba.WritebackVTaps[k] > mode_lib->vba.WritebackMaxVSCLTaps
					|| mode_lib->vba.WritebackHRatio[k] > mode_lib->vba.WritebackHTaps[k]
					|| mode_lib->vba.WritebackVRatio[k] > mode_lib->vba.WritebackVTaps[k]
					|| (mode_lib->vba.WritebackHTaps[k] > 2.0
							&& ((mode_lib->vba.WritebackHTaps[k] % 2) == 1))) {
				mode_lib->vba.WritebackScaleRatioAndTapsSupport = false;
			}
			if (2.0 * mode_lib->vba.WritebackDestinationWidth[k] * (mode_lib->vba.WritebackVTaps[k] - 1)
					* 57 > mode_lib->vba.WritebackLineBufferSize) {
				mode_lib->vba.WritebackScaleRatioAndTapsSupport = false;
			}
		}
	}

	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		dml32_CalculateSinglePipeDPPCLKAndSCLThroughput(mode_lib->vba.HRatio[k], mode_lib->vba.HRatioChroma[k],
				mode_lib->vba.VRatio[k], mode_lib->vba.VRatioChroma[k],
				mode_lib->vba.MaxDCHUBToPSCLThroughput, mode_lib->vba.MaxPSCLToLBThroughput,
				mode_lib->vba.PixelClock[k], mode_lib->vba.SourcePixelFormat[k],
				mode_lib->vba.htaps[k], mode_lib->vba.HTAPsChroma[k], mode_lib->vba.vtaps[k],
				mode_lib->vba.VTAPsChroma[k],
				/* Output */
				&mode_lib->vba.PSCL_FACTOR[k], &mode_lib->vba.PSCL_FACTOR_CHROMA[k],
				&mode_lib->vba.MinDPPCLKUsingSingleDPP[k]);
	}

	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {

		if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) {
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 8192;
		} else if (!IsVertical(mode_lib->vba.SourceRotation[k]) && v->BytePerPixelC[k] > 0
				&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe_alpha) {
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 7680;
		} else if (IsVertical(mode_lib->vba.SourceRotation[k]) && v->BytePerPixelC[k] > 0
				&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe_alpha) {
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 4320;
		} else if (mode_lib->vba.SourcePixelFormat[k] == dm_rgbe_alpha) {
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 3840;
		} else if (IsVertical(mode_lib->vba.SourceRotation[k]) && v->BytePerPixelY[k] == 8 &&
				mode_lib->vba.DCCEnable[k] == true) {
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 3072;
		} else {
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 6144;
		}

		if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8 || mode_lib->vba.SourcePixelFormat[k] == dm_420_10
				|| mode_lib->vba.SourcePixelFormat[k] == dm_420_12) {
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportChroma = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma / 2.0;
		} else {
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportChroma = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma;
		}
		v->MaximumSwathWidthInLineBufferLuma = mode_lib->vba.LineBufferSizeFinal
				* dml_max(mode_lib->vba.HRatio[k], 1.0) / mode_lib->vba.LBBitPerPixel[k]
				/ (mode_lib->vba.vtaps[k] + dml_max(dml_ceil(mode_lib->vba.VRatio[k], 1.0) - 2, 0.0));
		if (v->BytePerPixelC[k] == 0.0) {
			v->MaximumSwathWidthInLineBufferChroma = 0;
		} else {
			v->MaximumSwathWidthInLineBufferChroma = mode_lib->vba.LineBufferSizeFinal
					* dml_max(mode_lib->vba.HRatioChroma[k], 1.0) / mode_lib->vba.LBBitPerPixel[k]
					/ (mode_lib->vba.VTAPsChroma[k]
							+ dml_max(dml_ceil(mode_lib->vba.VRatioChroma[k], 1.0) - 2,
									0.0));
		}
		v->MaximumSwathWidthLuma[k] = dml_min(v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma,
				v->MaximumSwathWidthInLineBufferLuma);
		v->MaximumSwathWidthChroma[k] = dml_min(v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportChroma,
				v->MaximumSwathWidthInLineBufferChroma);
	}

	dml32_CalculateSwathAndDETConfiguration(
			mode_lib->vba.DETSizeOverride,
			mode_lib->vba.UsesMALLForPStateChange,
			mode_lib->vba.ConfigReturnBufferSizeInKByte,
			mode_lib->vba.MaxTotalDETInKByte,
			mode_lib->vba.MinCompressedBufferSizeInKByte,
			1, /* ForceSingleDPP */
			mode_lib->vba.NumberOfActiveSurfaces,
			mode_lib->vba.nomDETInKByte,
			mode_lib->vba.UseUnboundedRequesting,
			mode_lib->vba.DisableUnboundRequestIfCompBufReservedSpaceNeedAdjustment,
			mode_lib->vba.ip.pixel_chunk_size_kbytes,
			mode_lib->vba.ip.rob_buffer_size_kbytes,
			mode_lib->vba.CompressedBufferSegmentSizeInkByteFinal,
			mode_lib->vba.Output,
			mode_lib->vba.ReadBandwidthLuma,
			mode_lib->vba.ReadBandwidthChroma,
			mode_lib->vba.MaximumSwathWidthLuma,
			mode_lib->vba.MaximumSwathWidthChroma,
			mode_lib->vba.SourceRotation,
			mode_lib->vba.ViewportStationary,
			mode_lib->vba.SourcePixelFormat,
			mode_lib->vba.SurfaceTiling,
			mode_lib->vba.ViewportWidth,
			mode_lib->vba.ViewportHeight,
			mode_lib->vba.ViewportXStartY,
			mode_lib->vba.ViewportYStartY,
			mode_lib->vba.ViewportXStartC,
			mode_lib->vba.ViewportYStartC,
			mode_lib->vba.SurfaceWidthY,
			mode_lib->vba.SurfaceWidthC,
			mode_lib->vba.SurfaceHeightY,
			mode_lib->vba.SurfaceHeightC,
			mode_lib->vba.Read256BlockHeightY,
			mode_lib->vba.Read256BlockHeightC,
			mode_lib->vba.Read256BlockWidthY,
			mode_lib->vba.Read256BlockWidthC,
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_odm_mode,
			mode_lib->vba.BlendingAndTiming,
			mode_lib->vba.BytePerPixelY,
			mode_lib->vba.BytePerPixelC,
			mode_lib->vba.BytePerPixelInDETY,
			mode_lib->vba.BytePerPixelInDETC,
			mode_lib->vba.HActive,
			mode_lib->vba.HRatio,
			mode_lib->vba.HRatioChroma,
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[0], /*  Integer DPPPerSurface[] */

			/* Output */
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[1], /* Long            swath_width_luma_ub[] */
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[2], /* Long            swath_width_chroma_ub[]  */
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_double_array[0], /* Long            SwathWidth[]  */
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_double_array[1], /* Long            SwathWidthChroma[]  */
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[3], /* Integer         SwathHeightY[]  */
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[4], /* Integer         SwathHeightC[]  */
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[5], /* Long            DETBufferSizeInKByte[]  */
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[6], /* Long            DETBufferSizeY[]  */
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[7], /* Long            DETBufferSizeC[]  */
			&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[0][0], /* bool           *UnboundedRequestEnabled  */
			&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[0][0], /* Long           *CompressedBufferSizeInkByte  */
			&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[1][0], /* Long           *CompBufReservedSpaceKBytes */
			&CompBufReservedSpaceNeedAdjustmentSingleDPP,
			mode_lib->vba.SingleDPPViewportSizeSupportPerSurface,/* bool ViewportSizeSupportPerSurface[] */
			&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[1][0]); /* bool           *ViewportSizeSupport */

	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsNeededForPStateChangeAndVoltage = false;
	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsPossible = false;

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		if (mode_lib->vba.MPCCombineUse[k] == dm_mpc_reduce_voltage_and_clocks)
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsNeededForPStateChangeAndVoltage = true;
		if (mode_lib->vba.MPCCombineUse[k] == dm_mpc_always_when_possible)
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsPossible = true;
	}
	mode_lib->vba.MPCCombineMethodIncompatible = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsNeededForPStateChangeAndVoltage
			&& v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsPossible;

	for (i = 0; i < v->soc.num_states; i++) {
		for (j = 0; j < 2; j++) {
			mode_lib->vba.TotalNumberOfActiveDPP[i][j] = 0;
			mode_lib->vba.TotalAvailablePipesSupport[i][j] = true;
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeNoDSC = dm_odm_combine_mode_disabled;
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeDSC = dm_odm_combine_mode_disabled;

			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				dml32_CalculateODMMode(
						mode_lib->vba.MaximumPixelsPerLinePerDSCUnit,
						mode_lib->vba.HActive[k],
						mode_lib->vba.Output[k],
						mode_lib->vba.ODMUse[k],
						mode_lib->vba.MaxDispclk[i],
						mode_lib->vba.MaxDispclk[v->soc.num_states - 1],
						false,
						mode_lib->vba.TotalNumberOfActiveDPP[i][j],
						mode_lib->vba.MaxNumDPP,
						mode_lib->vba.PixelClock[k],
						mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading,
						mode_lib->vba.DISPCLKRampingMargin,
						mode_lib->vba.DISPCLKDPPCLKVCOSpeed,

						/* Output */
						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportNoDSC,
						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NumberOfDPPNoDSC,
						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeNoDSC,
						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.RequiredDISPCLKPerSurfaceNoDSC);

				dml32_CalculateODMMode(
						mode_lib->vba.MaximumPixelsPerLinePerDSCUnit,
						mode_lib->vba.HActive[k],
						mode_lib->vba.Output[k],
						mode_lib->vba.ODMUse[k],
						mode_lib->vba.MaxDispclk[i],
						mode_lib->vba.MaxDispclk[v->soc.num_states - 1],
						true,
						mode_lib->vba.TotalNumberOfActiveDPP[i][j],
						mode_lib->vba.MaxNumDPP,
						mode_lib->vba.PixelClock[k],
						mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading,
						mode_lib->vba.DISPCLKRampingMargin,
						mode_lib->vba.DISPCLKDPPCLKVCOSpeed,

						/* Output */
						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportDSC,
						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NumberOfDPPDSC,
						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeDSC,
						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.RequiredDISPCLKPerSurfaceDSC);

				dml32_CalculateOutputLink(
						mode_lib->vba.PHYCLKPerState[i],
						mode_lib->vba.PHYCLKD18PerState[i],
						mode_lib->vba.PHYCLKD32PerState[i],
						mode_lib->vba.Downspreading,
						(mode_lib->vba.BlendingAndTiming[k] == k),
						mode_lib->vba.Output[k],
						mode_lib->vba.OutputFormat[k],
						mode_lib->vba.HTotal[k],
						mode_lib->vba.HActive[k],
						mode_lib->vba.PixelClockBackEnd[k],
						mode_lib->vba.ForcedOutputLinkBPP[k],
						mode_lib->vba.DSCInputBitPerComponent[k],
						mode_lib->vba.NumberOfDSCSlices[k],
						mode_lib->vba.AudioSampleRate[k],
						mode_lib->vba.AudioSampleLayout[k],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeNoDSC,
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeDSC,
						mode_lib->vba.DSCEnable[k],
						mode_lib->vba.OutputLinkDPLanes[k],
						mode_lib->vba.OutputLinkDPRate[k],

						/* Output */
						&mode_lib->vba.RequiresDSC[i][k],
						&mode_lib->vba.RequiresFEC[i][k],
						&mode_lib->vba.OutputBppPerState[i][k],
						&mode_lib->vba.OutputTypePerState[i][k],
						&mode_lib->vba.OutputRatePerState[i][k],
						&mode_lib->vba.RequiredSlots[i][k]);

				if (mode_lib->vba.RequiresDSC[i][k] == false) {
					mode_lib->vba.ODMCombineEnablePerState[i][k] = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeNoDSC;
					mode_lib->vba.RequiredDISPCLKPerSurface[i][j][k] =
							v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.RequiredDISPCLKPerSurfaceNoDSC;
					if (!v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportNoDSC)
						mode_lib->vba.TotalAvailablePipesSupport[i][j] = false;
					mode_lib->vba.TotalNumberOfActiveDPP[i][j] =
							mode_lib->vba.TotalNumberOfActiveDPP[i][j] + v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NumberOfDPPNoDSC;
				} else {
					mode_lib->vba.ODMCombineEnablePerState[i][k] = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeDSC;
					mode_lib->vba.RequiredDISPCLKPerSurface[i][j][k] =
							v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.RequiredDISPCLKPerSurfaceDSC;
					if (!v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportDSC)
						mode_lib->vba.TotalAvailablePipesSupport[i][j] = false;
					mode_lib->vba.TotalNumberOfActiveDPP[i][j] =
							mode_lib->vba.TotalNumberOfActiveDPP[i][j] + v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NumberOfDPPDSC;
				}
			}

			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				if (mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1) {
					mode_lib->vba.MPCCombine[i][j][k] = false;
					mode_lib->vba.NoOfDPP[i][j][k] = 4;
				} else if (mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1) {
					mode_lib->vba.MPCCombine[i][j][k] = false;
					mode_lib->vba.NoOfDPP[i][j][k] = 2;
				} else if (mode_lib->vba.MPCCombineUse[k] == dm_mpc_never) {
					mode_lib->vba.MPCCombine[i][j][k] = false;
					mode_lib->vba.NoOfDPP[i][j][k] = 1;
				} else if (dml32_RoundToDFSGranularity(
						mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
								* (1 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
												/ 100), 1,
						mode_lib->vba.DISPCLKDPPCLKVCOSpeed) <= mode_lib->vba.MaxDppclk[i] &&
				mode_lib->vba.SingleDPPViewportSizeSupportPerSurface[k] == true) {
					mode_lib->vba.MPCCombine[i][j][k] = false;
					mode_lib->vba.NoOfDPP[i][j][k] = 1;
				} else if (mode_lib->vba.TotalNumberOfActiveDPP[i][j] < mode_lib->vba.MaxNumDPP) {
					mode_lib->vba.MPCCombine[i][j][k] = true;
					mode_lib->vba.NoOfDPP[i][j][k] = 2;
					mode_lib->vba.TotalNumberOfActiveDPP[i][j] =
							mode_lib->vba.TotalNumberOfActiveDPP[i][j] + 1;
				} else {
					mode_lib->vba.MPCCombine[i][j][k] = false;
					mode_lib->vba.NoOfDPP[i][j][k] = 1;
					mode_lib->vba.TotalAvailablePipesSupport[i][j] = false;
				}
			}

			mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] = 0;
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NoChroma = true;

			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				if (mode_lib->vba.NoOfDPP[i][j][k] == 1)
					mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] =
							mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] + 1;
				if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8
						|| mode_lib->vba.SourcePixelFormat[k] == dm_420_10
						|| mode_lib->vba.SourcePixelFormat[k] == dm_420_12
						|| mode_lib->vba.SourcePixelFormat[k] == dm_rgbe_alpha) {
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NoChroma = false;
				}
			}

			// if TotalNumberOfActiveDPP is > 1, then there should be no unbounded req mode (hw limitation), the comp buf reserved adjustment is not needed regardless
			// if TotalNumberOfActiveDPP is == 1, then will use the SingleDPP version of unbounded_req for the decision
			CompBufReservedSpaceNeedAdjustment = (mode_lib->vba.TotalNumberOfActiveDPP[i][j] > 1) ? 0 : CompBufReservedSpaceNeedAdjustmentSingleDPP;



			if (j == 1 && !dml32_UnboundedRequest(mode_lib->vba.UseUnboundedRequesting,
					mode_lib->vba.TotalNumberOfActiveDPP[i][j], v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NoChroma,
					mode_lib->vba.Output[0],
					mode_lib->vba.SurfaceTiling[0],
					CompBufReservedSpaceNeedAdjustment,
					mode_lib->vba.DisableUnboundRequestIfCompBufReservedSpaceNeedAdjustment)) {
				while (!(mode_lib->vba.TotalNumberOfActiveDPP[i][j] >= mode_lib->vba.MaxNumDPP
						|| mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] == 0)) {
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.BWOfNonCombinedSurfaceOfMaximumBandwidth = 0;
					NumberOfNonCombinedSurfaceOfMaximumBandwidth = 0;

					for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
						if (mode_lib->vba.MPCCombineUse[k]
							!= dm_mpc_never &&
							mode_lib->vba.MPCCombineUse[k] != dm_mpc_reduce_voltage &&
							mode_lib->vba.ReadBandwidthLuma[k] +
							mode_lib->vba.ReadBandwidthChroma[k] >
							v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.BWOfNonCombinedSurfaceOfMaximumBandwidth &&
							(mode_lib->vba.ODMCombineEnablePerState[i][k] !=
							dm_odm_combine_mode_2to1 &&
							mode_lib->vba.ODMCombineEnablePerState[i][k] !=
							dm_odm_combine_mode_4to1) &&
								mode_lib->vba.MPCCombine[i][j][k] == false) {
							v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.BWOfNonCombinedSurfaceOfMaximumBandwidth =
								mode_lib->vba.ReadBandwidthLuma[k]
								+ mode_lib->vba.ReadBandwidthChroma[k];
							NumberOfNonCombinedSurfaceOfMaximumBandwidth = k;
						}
					}
					mode_lib->vba.MPCCombine[i][j][NumberOfNonCombinedSurfaceOfMaximumBandwidth] =
							true;
					mode_lib->vba.NoOfDPP[i][j][NumberOfNonCombinedSurfaceOfMaximumBandwidth] = 2;
					mode_lib->vba.TotalNumberOfActiveDPP[i][j] =
							mode_lib->vba.TotalNumberOfActiveDPP[i][j] + 1;
					mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] =
							mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] - 1;
				}
			}

			//DISPCLK/DPPCLK
			mode_lib->vba.WritebackRequiredDISPCLK = 0;
			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				if (mode_lib->vba.WritebackEnable[k]) {
					mode_lib->vba.WritebackRequiredDISPCLK = dml_max(
							mode_lib->vba.WritebackRequiredDISPCLK,
							dml32_CalculateWriteBackDISPCLK(
									mode_lib->vba.WritebackPixelFormat[k],
									mode_lib->vba.PixelClock[k],
									mode_lib->vba.WritebackHRatio[k],
									mode_lib->vba.WritebackVRatio[k],
									mode_lib->vba.WritebackHTaps[k],
									mode_lib->vba.WritebackVTaps[k],
									mode_lib->vba.WritebackSourceWidth[k],
									mode_lib->vba.WritebackDestinationWidth[k],
									mode_lib->vba.HTotal[k],
									mode_lib->vba.WritebackLineBufferSize,
									mode_lib->vba.DISPCLKDPPCLKVCOSpeed));
				}
			}

			mode_lib->vba.RequiredDISPCLK[i][j] = mode_lib->vba.WritebackRequiredDISPCLK;
			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				mode_lib->vba.RequiredDISPCLK[i][j] = dml_max(mode_lib->vba.RequiredDISPCLK[i][j],
						mode_lib->vba.RequiredDISPCLKPerSurface[i][j][k]);
			}

			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
				mode_lib->vba.NoOfDPPThisState[k] = mode_lib->vba.NoOfDPP[i][j][k];

			dml32_CalculateDPPCLK(mode_lib->vba.NumberOfActiveSurfaces,
					mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading,
					mode_lib->vba.DISPCLKDPPCLKVCOSpeed, mode_lib->vba.MinDPPCLKUsingSingleDPP,
					mode_lib->vba.NoOfDPPThisState,
					/* Output */
					&mode_lib->vba.GlobalDPPCLK, mode_lib->vba.RequiredDPPCLKThisState);

			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)
				mode_lib->vba.RequiredDPPCLK[i][j][k] = mode_lib->vba.RequiredDPPCLKThisState[k];

			mode_lib->vba.DISPCLK_DPPCLK_Support[i][j] = !((mode_lib->vba.RequiredDISPCLK[i][j]
					> mode_lib->vba.MaxDispclk[i])
					|| (mode_lib->vba.GlobalDPPCLK > mode_lib->vba.MaxDppclk[i]));

			if (mode_lib->vba.TotalNumberOfActiveDPP[i][j] > mode_lib->vba.MaxNumDPP)
				mode_lib->vba.TotalAvailablePipesSupport[i][j] = false;
		} // j
	} // i (VOLTAGE_STATE)

	/* Total Available OTG, HDMIFRL, DP Support Check */
	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveOTG = 0;
	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveHDMIFRL = 0;
	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0 = 0;
	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0Outputs = 0;

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		if (mode_lib->vba.BlendingAndTiming[k] == k) {
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveOTG = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveOTG + 1;
			if (mode_lib->vba.Output[k] == dm_dp2p0) {
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0 = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0 + 1;
				if (mode_lib->vba.OutputMultistreamId[k]
						== k || mode_lib->vba.OutputMultistreamEn[k] == false) {
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0Outputs = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0Outputs + 1;
				}
			}
		}
	}

	mode_lib->vba.NumberOfOTGSupport = (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveOTG <= mode_lib->vba.MaxNumOTG);
	mode_lib->vba.NumberOfHDMIFRLSupport = (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveHDMIFRL <= mode_lib->vba.MaxNumHDMIFRLOutputs);
	mode_lib->vba.NumberOfDP2p0Support = (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0 <= mode_lib->vba.MaxNumDP2p0Streams
			&& v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0Outputs <= mode_lib->vba.MaxNumDP2p0Outputs);

	/* Display IO and DSC Support Check */
	mode_lib->vba.NonsupportedDSCInputBPC = false;
	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		if (!(mode_lib->vba.DSCInputBitPerComponent[k] == 12.0
				|| mode_lib->vba.DSCInputBitPerComponent[k] == 10.0
				|| mode_lib->vba.DSCInputBitPerComponent[k] == 8.0
				|| mode_lib->vba.DSCInputBitPerComponent[k] >
				mode_lib->vba.MaximumDSCBitsPerComponent)) {
			mode_lib->vba.NonsupportedDSCInputBPC = true;
		}
	}

	for (i = 0; i < v->soc.num_states; ++i) {
		mode_lib->vba.ExceededMultistreamSlots[i] = false;
		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
			if (mode_lib->vba.OutputMultistreamEn[k] == true && mode_lib->vba.OutputMultistreamId[k] == k) {
				TotalSlots = mode_lib->vba.RequiredSlots[i][k];
				for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) {
					if (mode_lib->vba.OutputMultistreamId[j] == k)
						TotalSlots = TotalSlots + mode_lib->vba.RequiredSlots[i][j];
				}
				if (mode_lib->vba.Output[k] == dm_dp && TotalSlots > 63)
					mode_lib->vba.ExceededMultistreamSlots[i] = true;
				if (mode_lib->vba.Output[k] == dm_dp2p0 && TotalSlots > 64)
					mode_lib->vba.ExceededMultistreamSlots[i] = true;
			}
		}
		mode_lib->vba.LinkCapacitySupport[i] = true;
		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
			if (mode_lib->vba.BlendingAndTiming[k] == k
					&& (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_dp2p0
							|| mode_lib->vba.Output[k] == dm_edp
							|| mode_lib->vba.Output[k] == dm_hdmi)
					&& mode_lib->vba.OutputBppPerState[i][k] == 0) {
				mode_lib->vba.LinkCapacitySupport[i] = false;
			}
		}
	}

	mode_lib->vba.P2IWith420 = false;
	mode_lib->vba.DSCOnlyIfNecessaryWithBPP = false;
	mode_lib->vba.DSC422NativeNotSupported = false;
	mode_lib->vba.LinkRateDoesNotMatchDPVersion = false;
	mode_lib->vba.LinkRateForMultistreamNotIndicated = false;
	mode_lib->vba.BPPForMultistreamNotIndicated = false;
	mode_lib->vba.MultistreamWithHDMIOreDP = false;
	mode_lib->vba.MSOOrODMSplitWithNonDPLink = false;
	mode_lib->vba.NotEnoughLanesForMSO = false;

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		if (mode_lib->vba.BlendingAndTiming[k] == k
				&& (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_dp2p0
						|| mode_lib->vba.Output[k] == dm_edp
						|| mode_lib->vba.Output[k] == dm_hdmi)) {
			if (mode_lib->vba.OutputFormat[k]
					== dm_420 && mode_lib->vba.Interlace[k] == 1 &&
					mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true)
				mode_lib->vba.P2IWith420 = true;

			if (mode_lib->vba.DSCEnable[k] && mode_lib->vba.ForcedOutputLinkBPP[k] != 0)
				mode_lib->vba.DSCOnlyIfNecessaryWithBPP = true;
			if ((mode_lib->vba.DSCEnable[k] || mode_lib->vba.DSCEnable[k])
					&& mode_lib->vba.OutputFormat[k] == dm_n422
					&& !mode_lib->vba.DSC422NativeSupport)
				mode_lib->vba.DSC422NativeNotSupported = true;

			if (((mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_hbr
					|| mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_hbr2
					|| mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_hbr3)
					&& mode_lib->vba.Output[k] != dm_dp && mode_lib->vba.Output[k] != dm_edp)
					|| ((mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_uhbr10
							|| mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_uhbr13p5
							|| mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_uhbr20)
							&& mode_lib->vba.Output[k] != dm_dp2p0))
				mode_lib->vba.LinkRateDoesNotMatchDPVersion = true;

			if (mode_lib->vba.OutputMultistreamEn[k] == true) {
				if (mode_lib->vba.OutputMultistreamId[k] == k
					&& mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_na)
					mode_lib->vba.LinkRateForMultistreamNotIndicated = true;
				if (mode_lib->vba.OutputMultistreamId[k] == k && mode_lib->vba.ForcedOutputLinkBPP[k] == 0)
					mode_lib->vba.BPPForMultistreamNotIndicated = true;
				for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) {
					if (mode_lib->vba.OutputMultistreamId[k] == j && mode_lib->vba.OutputMultistreamEn[k]
						&& mode_lib->vba.ForcedOutputLinkBPP[k] == 0)
						mode_lib->vba.BPPForMultistreamNotIndicated = true;
				}
			}

			if ((mode_lib->vba.Output[k] == dm_edp || mode_lib->vba.Output[k] == dm_hdmi)) {
				if (mode_lib->vba.OutputMultistreamId[k] == k && mode_lib->vba.OutputMultistreamEn[k])
					mode_lib->vba.MultistreamWithHDMIOreDP = true;

				for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) {
					if (mode_lib->vba.OutputMultistreamEn[k] == true && mode_lib->vba.OutputMultistreamId[k] == j)
						mode_lib->vba.MultistreamWithHDMIOreDP = true;
				}
			}

			if (mode_lib->vba.Output[k] != dm_dp
					&& (mode_lib->vba.ODMUse[k] == dm_odm_split_policy_1to2
							|| mode_lib->vba.ODMUse[k] == dm_odm_mso_policy_1to2
							|| mode_lib->vba.ODMUse[k] == dm_odm_mso_policy_1to4))
				mode_lib->vba.MSOOrODMSplitWithNonDPLink = true;

			if ((mode_lib->vba.ODMUse[k] == dm_odm_mso_policy_1to2
					&& mode_lib->vba.OutputLinkDPLanes[k] < 2)
					|| (mode_lib->vba.ODMUse[k] == dm_odm_mso_policy_1to4
							&& mode_lib->vba.OutputLinkDPLanes[k] < 4))
				mode_lib->vba.NotEnoughLanesForMSO = true;
		}
	}

	for (i = 0; i < v->soc.num_states; ++i) {
		mode_lib->vba.DTBCLKRequiredMoreThanSupported[i] = false;
		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
			if (mode_lib->vba.BlendingAndTiming[k] == k
					&& dml32_RequiredDTBCLK(mode_lib->vba.RequiresDSC[i][k],
							mode_lib->vba.PixelClockBackEnd[k],
							mode_lib->vba.OutputFormat[k],
							mode_lib->vba.OutputBppPerState[i][k],
							mode_lib->vba.NumberOfDSCSlices[k], mode_lib->vba.HTotal[k],
							mode_lib->vba.HActive[k], mode_lib->vba.AudioSampleRate[k],
							mode_lib->vba.AudioSampleLayout[k])
							> mode_lib->vba.DTBCLKPerState[i]) {
				mode_lib->vba.DTBCLKRequiredMoreThanSupported[i] = true;
			}
		}
	}

	for (i = 0; i < v->soc.num_states; ++i) {
		mode_lib->vba.ODMCombine2To1SupportCheckOK[i] = true;
		mode_lib->vba.ODMCombine4To1SupportCheckOK[i] = true;
		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
			if (mode_lib->vba.BlendingAndTiming[k] == k
					&& mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1
					&& mode_lib->vba.Output[k] == dm_hdmi) {
				mode_lib->vba.ODMCombine2To1SupportCheckOK[i] = false;
			}
			if (mode_lib->vba.BlendingAndTiming[k] == k
					&& mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1
					&& (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_edp
							|| mode_lib->vba.Output[k] == dm_hdmi)) {
				mode_lib->vba.ODMCombine4To1SupportCheckOK[i] = false;
			}
		}
	}

	for (i = 0; i < v->soc.num_states; i++) {
		mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = false;
		for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
			if (mode_lib->vba.BlendingAndTiming[k] == k) {
				if (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_dp2p0
						|| mode_lib->vba.Output[k] == dm_edp) {
					if (mode_lib->vba.OutputFormat[k] == dm_420) {
						mode_lib->vba.DSCFormatFactor = 2;
					} else if (mode_lib->vba.OutputFormat[k] == dm_444) {
						mode_lib->vba.DSCFormatFactor = 1;
					} else if (mode_lib->vba.OutputFormat[k] == dm_n422) {
						mode_lib->vba.DSCFormatFactor = 2;
					} else {
						mode_lib->vba.DSCFormatFactor = 1;
					}
					if (mode_lib->vba.RequiresDSC[i][k] == true) {
						if (mode_lib->vba.ODMCombineEnablePerState[i][k]
								== dm_odm_combine_mode_4to1) {
							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])
								mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = true;
						} else if (mode_lib->vba.ODMCombineEnablePerState[i][k]
								== dm_odm_combine_mode_2to1) {
							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])
								mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = true;
						} else {
							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])
								mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = true;
						}
					}
				}
			}
		}
	}

	/* Check DSC Unit and Slices Support */
	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = 0;

	for (i = 0; i < v->soc.num_states; ++i) {
		mode_lib->vba.NotEnoughDSCUnits[i] = false;
		mode_lib->vba.NotEnoughDSCSlices[i] = false;
		v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = 0;
		mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i] = true;
		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
			if (mode_lib->vba.RequiresDSC[i][k] == true) {
				if (mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1) {
					if (mode_lib->vba.HActive[k]
							> 4 * mode_lib->vba.MaximumPixelsPerLinePerDSCUnit)
						mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i] = false;
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired + 4;
					if (mode_lib->vba.NumberOfDSCSlices[k] > 16)
						mode_lib->vba.NotEnoughDSCSlices[i] = true;
				} else if (mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1) {
					if (mode_lib->vba.HActive[k]
							> 2 * mode_lib->vba.MaximumPixelsPerLinePerDSCUnit)
						mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i] = false;
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired + 2;
					if (mode_lib->vba.NumberOfDSCSlices[k] > 8)
						mode_lib->vba.NotEnoughDSCSlices[i] = true;
				} else {
					if (mode_lib->vba.HActive[k] > mode_lib->vba.MaximumPixelsPerLinePerDSCUnit)
						mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i] = false;
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired + 1;
					if (mode_lib->vba.NumberOfDSCSlices[k] > 4)
						mode_lib->vba.NotEnoughDSCSlices[i] = true;
				}
			}
		}
		if (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired > mode_lib->vba.NumberOfDSC)
			mode_lib->vba.NotEnoughDSCUnits[i] = true;
	}

	/*DSC Delay per state*/
	for (i = 0; i < v->soc.num_states; ++i) {
		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
			mode_lib->vba.DSCDelayPerState[i][k] = dml32_DSCDelayRequirement(
					mode_lib->vba.RequiresDSC[i][k], mode_lib->vba.ODMCombineEnablePerState[i][k],
					mode_lib->vba.DSCInputBitPerComponent[k],
					mode_lib->vba.OutputBppPerState[i][k], mode_lib->vba.HActive[k],
					mode_lib->vba.HTotal[k], mode_lib->vba.NumberOfDSCSlices[k],
					mode_lib->vba.OutputFormat[k], mode_lib->vba.Output[k],
					mode_lib->vba.PixelClock[k], mode_lib->vba.PixelClockBackEnd[k]);
		}

		m = 0;

		for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
			for (m = 0; m <= mode_lib->vba.NumberOfActiveSurfaces - 1; m++) {
				for (j = 0; j <= mode_lib->vba.NumberOfActiveSurfaces - 1; j++) {
					if (mode_lib->vba.BlendingAndTiming[k] == m &&
							mode_lib->vba.RequiresDSC[i][m] == true) {
						mode_lib->vba.DSCDelayPerState[i][k] =
							mode_lib->vba.DSCDelayPerState[i][m];
					}
				}
			}
		}
	}

	//Calculate Swath, DET Configuration, DCFCLKDeepSleep
	//
	for (i = 0; i < (int) v->soc.num_states; ++i) {
		for (j = 0; j <= 1; ++j) {
			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				mode_lib->vba.RequiredDPPCLKThisState[k] = mode_lib->vba.RequiredDPPCLK[i][j][k];
				mode_lib->vba.NoOfDPPThisState[k] = mode_lib->vba.NoOfDPP[i][j][k];
				mode_lib->vba.ODMCombineEnableThisState[k] =
						mode_lib->vba.ODMCombineEnablePerState[i][k];
			}

			dml32_CalculateSwathAndDETConfiguration(
					mode_lib->vba.DETSizeOverride,
					mode_lib->vba.UsesMALLForPStateChange,
					mode_lib->vba.ConfigReturnBufferSizeInKByte,
					mode_lib->vba.MaxTotalDETInKByte,
					mode_lib->vba.MinCompressedBufferSizeInKByte,
					false, /* ForceSingleDPP */
					mode_lib->vba.NumberOfActiveSurfaces,
					mode_lib->vba.nomDETInKByte,
					mode_lib->vba.UseUnboundedRequesting,
					mode_lib->vba.DisableUnboundRequestIfCompBufReservedSpaceNeedAdjustment,
					mode_lib->vba.ip.pixel_chunk_size_kbytes,
					mode_lib->vba.ip.rob_buffer_size_kbytes,
					mode_lib->vba.CompressedBufferSegmentSizeInkByteFinal,
					mode_lib->vba.Output,
					mode_lib->vba.ReadBandwidthLuma,
					mode_lib->vba.ReadBandwidthChroma,
					mode_lib->vba.MaximumSwathWidthLuma,
					mode_lib->vba.MaximumSwathWidthChroma,
					mode_lib->vba.SourceRotation,
					mode_lib->vba.ViewportStationary,
					mode_lib->vba.SourcePixelFormat,
					mode_lib->vba.SurfaceTiling,
					mode_lib->vba.ViewportWidth,
					mode_lib->vba.ViewportHeight,
					mode_lib->vba.ViewportXStartY,
					mode_lib->vba.ViewportYStartY,
					mode_lib->vba.ViewportXStartC,
					mode_lib->vba.ViewportYStartC,
					mode_lib->vba.SurfaceWidthY,
					mode_lib->vba.SurfaceWidthC,
					mode_lib->vba.SurfaceHeightY,
					mode_lib->vba.SurfaceHeightC,
					mode_lib->vba.Read256BlockHeightY,
					mode_lib->vba.Read256BlockHeightC,
					mode_lib->vba.Read256BlockWidthY,
					mode_lib->vba.Read256BlockWidthC,
					mode_lib->vba.ODMCombineEnableThisState,
					mode_lib->vba.BlendingAndTiming,
					mode_lib->vba.BytePerPixelY,
					mode_lib->vba.BytePerPixelC,
					mode_lib->vba.BytePerPixelInDETY,
					mode_lib->vba.BytePerPixelInDETC,
					mode_lib->vba.HActive,
					mode_lib->vba.HRatio,
					mode_lib->vba.HRatioChroma,
					mode_lib->vba.NoOfDPPThisState,
					/* Output */
					mode_lib->vba.swath_width_luma_ub_this_state,
					mode_lib->vba.swath_width_chroma_ub_this_state,
					mode_lib->vba.SwathWidthYThisState,
					mode_lib->vba.SwathWidthCThisState,
					mode_lib->vba.SwathHeightYThisState,
					mode_lib->vba.SwathHeightCThisState,
					mode_lib->vba.DETBufferSizeInKByteThisState,
					mode_lib->vba.DETBufferSizeYThisState,
					mode_lib->vba.DETBufferSizeCThisState,
					&mode_lib->vba.UnboundedRequestEnabledThisState,
					&mode_lib->vba.CompressedBufferSizeInkByteThisState,
					&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer[0], /* Long CompBufReservedSpaceKBytes */
					&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean[0], /* bool CompBufReservedSpaceNeedAdjustment */
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[0],
					&mode_lib->vba.ViewportSizeSupport[i][j]);

			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				mode_lib->vba.swath_width_luma_ub_all_states[i][j][k] =
						mode_lib->vba.swath_width_luma_ub_this_state[k];
				mode_lib->vba.swath_width_chroma_ub_all_states[i][j][k] =
						mode_lib->vba.swath_width_chroma_ub_this_state[k];
				mode_lib->vba.SwathWidthYAllStates[i][j][k] = mode_lib->vba.SwathWidthYThisState[k];
				mode_lib->vba.SwathWidthCAllStates[i][j][k] = mode_lib->vba.SwathWidthCThisState[k];
				mode_lib->vba.SwathHeightYAllStates[i][j][k] = mode_lib->vba.SwathHeightYThisState[k];
				mode_lib->vba.SwathHeightCAllStates[i][j][k] = mode_lib->vba.SwathHeightCThisState[k];
				mode_lib->vba.UnboundedRequestEnabledAllStates[i][j] =
						mode_lib->vba.UnboundedRequestEnabledThisState;
				mode_lib->vba.CompressedBufferSizeInkByteAllStates[i][j] =
						mode_lib->vba.CompressedBufferSizeInkByteThisState;
				mode_lib->vba.DETBufferSizeInKByteAllStates[i][j][k] =
						mode_lib->vba.DETBufferSizeInKByteThisState[k];
				mode_lib->vba.DETBufferSizeYAllStates[i][j][k] =
						mode_lib->vba.DETBufferSizeYThisState[k];
				mode_lib->vba.DETBufferSizeCAllStates[i][j][k] =
						mode_lib->vba.DETBufferSizeCThisState[k];
			}
		}
	}

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		mode_lib->vba.cursor_bw[k] = mode_lib->vba.NumberOfCursors[k] * mode_lib->vba.CursorWidth[k][0]
				* mode_lib->vba.CursorBPP[k][0] / 8.0
				/ (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k];
	}

	dml32_CalculateSurfaceSizeInMall(
			mode_lib->vba.NumberOfActiveSurfaces,
			mode_lib->vba.MALLAllocatedForDCNFinal,
			mode_lib->vba.UseMALLForStaticScreen,
			mode_lib->vba.DCCEnable,
			mode_lib->vba.ViewportStationary,
			mode_lib->vba.ViewportXStartY,
			mode_lib->vba.ViewportYStartY,
			mode_lib->vba.ViewportXStartC,
			mode_lib->vba.ViewportYStartC,
			mode_lib->vba.ViewportWidth,
			mode_lib->vba.ViewportHeight,
			mode_lib->vba.BytePerPixelY,
			mode_lib->vba.ViewportWidthChroma,
			mode_lib->vba.ViewportHeightChroma,
			mode_lib->vba.BytePerPixelC,
			mode_lib->vba.SurfaceWidthY,
			mode_lib->vba.SurfaceWidthC,
			mode_lib->vba.SurfaceHeightY,
			mode_lib->vba.SurfaceHeightC,
			mode_lib->vba.Read256BlockWidthY,
			mode_lib->vba.Read256BlockWidthC,
			mode_lib->vba.Read256BlockHeightY,
			mode_lib->vba.Read256BlockHeightC,
			mode_lib->vba.MacroTileWidthY,
			mode_lib->vba.MacroTileWidthC,
			mode_lib->vba.MacroTileHeightY,
			mode_lib->vba.MacroTileHeightC,

			/* Output */
			mode_lib->vba.SurfaceSizeInMALL,
			&mode_lib->vba.ExceededMALLSize);

	for (i = 0; i < v->soc.num_states; i++) {
		for (j = 0; j < 2; j++) {
			for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
				mode_lib->vba.swath_width_luma_ub_this_state[k] =
						mode_lib->vba.swath_width_luma_ub_all_states[i][j][k];
				mode_lib->vba.swath_width_chroma_ub_this_state[k] =
						mode_lib->vba.swath_width_chroma_ub_all_states[i][j][k];
				mode_lib->vba.SwathWidthYThisState[k] = mode_lib->vba.SwathWidthYAllStates[i][j][k];
				mode_lib->vba.SwathWidthCThisState[k] = mode_lib->vba.SwathWidthCAllStates[i][j][k];
				mode_lib->vba.SwathHeightYThisState[k] = mode_lib->vba.SwathHeightYAllStates[i][j][k];
				mode_lib->vba.SwathHeightCThisState[k] = mode_lib->vba.SwathHeightCAllStates[i][j][k];
				mode_lib->vba.DETBufferSizeInKByteThisState[k] =
						mode_lib->vba.DETBufferSizeInKByteAllStates[i][j][k];
				mode_lib->vba.DETBufferSizeYThisState[k] =
						mode_lib->vba.DETBufferSizeYAllStates[i][j][k];
				mode_lib->vba.DETBufferSizeCThisState[k] =
						mode_lib->vba.DETBufferSizeCAllStates[i][j][k];
				mode_lib->vba.RequiredDPPCLKThisState[k] = mode_lib->vba.RequiredDPPCLK[i][j][k];
				mode_lib->vba.NoOfDPPThisState[k] = mode_lib->vba.NoOfDPP[i][j][k];
			}

			mode_lib->vba.TotalNumberOfDCCActiveDPP[i][j] = 0;
			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				if (mode_lib->vba.DCCEnable[k] == true) {
					mode_lib->vba.TotalNumberOfDCCActiveDPP[i][j] =
							mode_lib->vba.TotalNumberOfDCCActiveDPP[i][j]
									+ mode_lib->vba.NoOfDPP[i][j][k];
				}
			}


			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].PixelClock = mode_lib->vba.PixelClock[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].DPPPerSurface = mode_lib->vba.NoOfDPP[i][j][k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SourceRotation = mode_lib->vba.SourceRotation[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportHeight = mode_lib->vba.ViewportHeight[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportHeightChroma = mode_lib->vba.ViewportHeightChroma[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockWidth256BytesY = mode_lib->vba.Read256BlockWidthY[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockHeight256BytesY = mode_lib->vba.Read256BlockHeightY[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockWidth256BytesC = mode_lib->vba.Read256BlockWidthC[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockHeight256BytesC = mode_lib->vba.Read256BlockHeightC[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockWidthY = mode_lib->vba.MacroTileWidthY[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockHeightY = mode_lib->vba.MacroTileHeightY[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockWidthC = mode_lib->vba.MacroTileWidthC[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockHeightC = mode_lib->vba.MacroTileHeightC[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].InterlaceEnable = mode_lib->vba.Interlace[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].HTotal = mode_lib->vba.HTotal[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].DCCEnable = mode_lib->vba.DCCEnable[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SourcePixelFormat = mode_lib->vba.SourcePixelFormat[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SurfaceTiling = mode_lib->vba.SurfaceTiling[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BytePerPixelY = mode_lib->vba.BytePerPixelY[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BytePerPixelC = mode_lib->vba.BytePerPixelC[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ProgressiveToInterlaceUnitInOPP =
				mode_lib->vba.ProgressiveToInterlaceUnitInOPP;
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].VRatio = mode_lib->vba.VRatio[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].VRatioChroma = mode_lib->vba.VRatioChroma[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].VTaps = mode_lib->vba.vtaps[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].VTapsChroma = mode_lib->vba.VTAPsChroma[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].PitchY = mode_lib->vba.PitchY[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].DCCMetaPitchY = mode_lib->vba.DCCMetaPitchY[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].PitchC = mode_lib->vba.PitchC[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].DCCMetaPitchC = mode_lib->vba.DCCMetaPitchC[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportStationary = mode_lib->vba.ViewportStationary[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportXStart = mode_lib->vba.ViewportXStartY[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportYStart = mode_lib->vba.ViewportYStartY[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportXStartC = mode_lib->vba.ViewportXStartC[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportYStartC = mode_lib->vba.ViewportYStartC[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].FORCE_ONE_ROW_FOR_FRAME = mode_lib->vba.ForceOneRowForFrame[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SwathHeightY = mode_lib->vba.SwathHeightYThisState[k];
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SwathHeightC = mode_lib->vba.SwathHeightCThisState[k];
			}

			{
				dml32_CalculateVMRowAndSwath(
						mode_lib->vba.NumberOfActiveSurfaces,
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters,
						mode_lib->vba.SurfaceSizeInMALL,
						mode_lib->vba.PTEBufferSizeInRequestsLuma,
						mode_lib->vba.PTEBufferSizeInRequestsChroma,
						mode_lib->vba.DCCMetaBufferSizeBytes,
						mode_lib->vba.UseMALLForStaticScreen,
						mode_lib->vba.UsesMALLForPStateChange,
						mode_lib->vba.MALLAllocatedForDCNFinal,
						mode_lib->vba.SwathWidthYThisState,
						mode_lib->vba.SwathWidthCThisState,
						mode_lib->vba.GPUVMEnable,
						mode_lib->vba.HostVMEnable,
						mode_lib->vba.HostVMMaxNonCachedPageTableLevels,
						mode_lib->vba.GPUVMMaxPageTableLevels,
						mode_lib->vba.GPUVMMinPageSizeKBytes,
						mode_lib->vba.HostVMMinPageSize,

						/* Output */
						mode_lib->vba.PTEBufferSizeNotExceededPerState,
						mode_lib->vba.DCCMetaBufferSizeNotExceededPerState,
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[0],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[1],
						mode_lib->vba.dpte_row_height,
						mode_lib->vba.dpte_row_height_chroma,
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[2],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[3],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[4],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[5],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[6],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[7],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[8],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[9],
						mode_lib->vba.meta_row_height,
						mode_lib->vba.meta_row_height_chroma,
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[10],
						mode_lib->vba.dpte_group_bytes,
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[11],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[12],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[13],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[14],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[15],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[16],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[17],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[18],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[19],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[20],
						mode_lib->vba.PrefetchLinesYThisState,
						mode_lib->vba.PrefetchLinesCThisState,
						mode_lib->vba.PrefillY,
						mode_lib->vba.PrefillC,
						mode_lib->vba.MaxNumSwY,
						mode_lib->vba.MaxNumSwC,
						mode_lib->vba.meta_row_bandwidth_this_state,
						mode_lib->vba.dpte_row_bandwidth_this_state,
						mode_lib->vba.DPTEBytesPerRowThisState,
						mode_lib->vba.PDEAndMetaPTEBytesPerFrameThisState,
						mode_lib->vba.MetaRowBytesThisState,
						mode_lib->vba.use_one_row_for_frame_this_state,
						mode_lib->vba.use_one_row_for_frame_flip_this_state,
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[0], // Boolean UsesMALLForStaticScreen[]
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[1], // Boolean PTE_BUFFER_MODE[]
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[21]); // Long BIGK_FRAGMENT_SIZE[]
			}

			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				mode_lib->vba.PrefetchLinesY[i][j][k] = mode_lib->vba.PrefetchLinesYThisState[k];
				mode_lib->vba.PrefetchLinesC[i][j][k] = mode_lib->vba.PrefetchLinesCThisState[k];
				mode_lib->vba.meta_row_bandwidth[i][j][k] =
						mode_lib->vba.meta_row_bandwidth_this_state[k];
				mode_lib->vba.dpte_row_bandwidth[i][j][k] =
						mode_lib->vba.dpte_row_bandwidth_this_state[k];
				mode_lib->vba.DPTEBytesPerRow[i][j][k] = mode_lib->vba.DPTEBytesPerRowThisState[k];
				mode_lib->vba.PDEAndMetaPTEBytesPerFrame[i][j][k] =
						mode_lib->vba.PDEAndMetaPTEBytesPerFrameThisState[k];
				mode_lib->vba.MetaRowBytes[i][j][k] = mode_lib->vba.MetaRowBytesThisState[k];
				mode_lib->vba.use_one_row_for_frame[i][j][k] =
						mode_lib->vba.use_one_row_for_frame_this_state[k];
				mode_lib->vba.use_one_row_for_frame_flip[i][j][k] =
						mode_lib->vba.use_one_row_for_frame_flip_this_state[k];
			}

			mode_lib->vba.PTEBufferSizeNotExceeded[i][j] = true;
			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				if (mode_lib->vba.PTEBufferSizeNotExceededPerState[k] == false)
					mode_lib->vba.PTEBufferSizeNotExceeded[i][j] = false;
			}

			mode_lib->vba.DCCMetaBufferSizeNotExceeded[i][j] = true;
			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				if (mode_lib->vba.DCCMetaBufferSizeNotExceededPerState[k] == false)
					mode_lib->vba.DCCMetaBufferSizeNotExceeded[i][j] = false;
			}

			mode_lib->vba.UrgLatency[i] = dml32_CalculateUrgentLatency(
					mode_lib->vba.UrgentLatencyPixelDataOnly,
					mode_lib->vba.UrgentLatencyPixelMixedWithVMData,
					mode_lib->vba.UrgentLatencyVMDataOnly, mode_lib->vba.DoUrgentLatencyAdjustment,
					mode_lib->vba.UrgentLatencyAdjustmentFabricClockComponent,
					mode_lib->vba.UrgentLatencyAdjustmentFabricClockReference,
					mode_lib->vba.FabricClockPerState[i]);

			//bool   NotUrgentLatencyHiding[DC__NUM_DPP__MAX];
			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				dml32_CalculateUrgentBurstFactor(
						mode_lib->vba.UsesMALLForPStateChange[k],
						mode_lib->vba.swath_width_luma_ub_this_state[k],
						mode_lib->vba.swath_width_chroma_ub_this_state[k],
						mode_lib->vba.SwathHeightYThisState[k],
						mode_lib->vba.SwathHeightCThisState[k],
						(double) mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
						mode_lib->vba.UrgLatency[i],
						mode_lib->vba.CursorBufferSize,
						mode_lib->vba.CursorWidth[k][0],
						mode_lib->vba.CursorBPP[k][0],
						mode_lib->vba.VRatio[k],
						mode_lib->vba.VRatioChroma[k],
						mode_lib->vba.BytePerPixelInDETY[k],
						mode_lib->vba.BytePerPixelInDETC[k],
						mode_lib->vba.DETBufferSizeYThisState[k],
						mode_lib->vba.DETBufferSizeCThisState[k],
						/* Output */
						&mode_lib->vba.UrgentBurstFactorCursor[k],
						&mode_lib->vba.UrgentBurstFactorLuma[k],
						&mode_lib->vba.UrgentBurstFactorChroma[k],
						&mode_lib->vba.NoUrgentLatencyHiding[k]);
			}

			dml32_CalculateDCFCLKDeepSleep(
					mode_lib->vba.NumberOfActiveSurfaces,
					mode_lib->vba.BytePerPixelY,
					mode_lib->vba.BytePerPixelC,
					mode_lib->vba.VRatio,
					mode_lib->vba.VRatioChroma,
					mode_lib->vba.SwathWidthYThisState,
					mode_lib->vba.SwathWidthCThisState,
					mode_lib->vba.NoOfDPPThisState,
					mode_lib->vba.HRatio,
					mode_lib->vba.HRatioChroma,
					mode_lib->vba.PixelClock,
					mode_lib->vba.PSCL_FACTOR,
					mode_lib->vba.PSCL_FACTOR_CHROMA,
					mode_lib->vba.RequiredDPPCLKThisState,
					mode_lib->vba.ReadBandwidthLuma,
					mode_lib->vba.ReadBandwidthChroma,
					mode_lib->vba.ReturnBusWidth,

					/* Output */
					&mode_lib->vba.ProjectedDCFCLKDeepSleep[i][j]);
		}
	}

	m = 0;

	//Calculate Return BW
	for (i = 0; i < (int) v->soc.num_states; ++i) {
		for (j = 0; j <= 1; ++j) {
			for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
				if (mode_lib->vba.BlendingAndTiming[k] == k) {
					if (mode_lib->vba.WritebackEnable[k] == true) {
						mode_lib->vba.WritebackDelayTime[k] =
							mode_lib->vba.WritebackLatency
						+ dml32_CalculateWriteBackDelay(
							mode_lib->vba.WritebackPixelFormat[k],
							mode_lib->vba.WritebackHRatio[k],
							mode_lib->vba.WritebackVRatio[k],
							mode_lib->vba.WritebackVTaps[k],
							mode_lib->vba.WritebackDestinationWidth[k],
							mode_lib->vba.WritebackDestinationHeight[k],
							mode_lib->vba.WritebackSourceHeight[k],
							mode_lib->vba.HTotal[k])
							/ mode_lib->vba.RequiredDISPCLK[i][j];
					} else {
						mode_lib->vba.WritebackDelayTime[k] = 0.0;
					}
					for (m = 0; m <= mode_lib->vba.NumberOfActiveSurfaces - 1; m++) {
						if (mode_lib->vba.BlendingAndTiming[m]
								== k && mode_lib->vba.WritebackEnable[m] == true) {
							mode_lib->vba.WritebackDelayTime[k] =
								dml_max(mode_lib->vba.WritebackDelayTime[k],
									mode_lib->vba.WritebackLatency
								+ dml32_CalculateWriteBackDelay(
									mode_lib->vba.WritebackPixelFormat[m],
									mode_lib->vba.WritebackHRatio[m],
									mode_lib->vba.WritebackVRatio[m],
									mode_lib->vba.WritebackVTaps[m],
									mode_lib->vba.WritebackDestinationWidth[m],
									mode_lib->vba.WritebackDestinationHeight[m],
									mode_lib->vba.WritebackSourceHeight[m],
									mode_lib->vba.HTotal[m]) /
									mode_lib->vba.RequiredDISPCLK[i][j]);
						}
					}
				}
			}
			for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
				for (m = 0; m <= mode_lib->vba.NumberOfActiveSurfaces - 1; m++) {
					if (mode_lib->vba.BlendingAndTiming[k] == m) {
						mode_lib->vba.WritebackDelayTime[k] =
								mode_lib->vba.WritebackDelayTime[m];
					}
				}
			}
			mode_lib->vba.MaxMaxVStartup[i][j] = 0;
			for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
				mode_lib->vba.MaximumVStartup[i][j][k] = ((mode_lib->vba.Interlace[k] &&
								!mode_lib->vba.ProgressiveToInterlaceUnitInOPP) ?
								dml_floor((mode_lib->vba.VTotal[k] -
									mode_lib->vba.VActive[k]) / 2.0, 1.0) :
								mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k])
								- dml_max(1.0, dml_ceil(1.0 *
									mode_lib->vba.WritebackDelayTime[k] /
									(mode_lib->vba.HTotal[k] /
									mode_lib->vba.PixelClock[k]), 1.0));

				// Clamp to max OTG vstartup register limit
				if (mode_lib->vba.MaximumVStartup[i][j][k] > 1023)
					mode_lib->vba.MaximumVStartup[i][j][k] = 1023;

				mode_lib->vba.MaxMaxVStartup[i][j] = dml_max(mode_lib->vba.MaxMaxVStartup[i][j],
						mode_lib->vba.MaximumVStartup[i][j][k]);
			}
		}
	}

	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ReorderingBytes = mode_lib->vba.NumberOfChannels
			* dml_max3(mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelDataOnly,
					mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelMixedWithVMData,
					mode_lib->vba.UrgentOutOfOrderReturnPerChannelVMDataOnly);

	dml32_CalculateMinAndMaxPrefetchMode(mode_lib->vba.AllowForPStateChangeOrStutterInVBlankFinal,
			&mode_lib->vba.MinPrefetchMode,
			&mode_lib->vba.MaxPrefetchMode);

	for (i = 0; i < (int) v->soc.num_states; ++i) {
		for (j = 0; j <= 1; ++j)
			mode_lib->vba.DCFCLKState[i][j] = mode_lib->vba.DCFCLKPerState[i];
	}

	/* Immediate Flip and MALL parameters */
	mode_lib->vba.ImmediateFlipRequiredFinal = false;
	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		mode_lib->vba.ImmediateFlipRequiredFinal = mode_lib->vba.ImmediateFlipRequiredFinal
				|| (mode_lib->vba.ImmediateFlipRequirement[k] == dm_immediate_flip_required);
	}

	mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified = false;
	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified =
				mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified
						|| ((mode_lib->vba.ImmediateFlipRequirement[k]
								!= dm_immediate_flip_required)
								&& (mode_lib->vba.ImmediateFlipRequirement[k]
										!= dm_immediate_flip_not_required));
	}
	mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified =
			mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified
					&& mode_lib->vba.ImmediateFlipRequiredFinal;

	mode_lib->vba.ImmediateFlipOrHostVMAndPStateWithMALLFullFrameOrPhantomPipe = false;
	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		mode_lib->vba.ImmediateFlipOrHostVMAndPStateWithMALLFullFrameOrPhantomPipe =
			mode_lib->vba.ImmediateFlipOrHostVMAndPStateWithMALLFullFrameOrPhantomPipe ||
			((mode_lib->vba.HostVMEnable == true || mode_lib->vba.ImmediateFlipRequirement[k] !=
					dm_immediate_flip_not_required) &&
			(mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_full_frame ||
			mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_phantom_pipe));
	}

	mode_lib->vba.InvalidCombinationOfMALLUseForPStateAndStaticScreen = false;
	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		mode_lib->vba.InvalidCombinationOfMALLUseForPStateAndStaticScreen =
			mode_lib->vba.InvalidCombinationOfMALLUseForPStateAndStaticScreen
			|| ((mode_lib->vba.UseMALLForStaticScreen[k] == dm_use_mall_static_screen_enable
			|| mode_lib->vba.UseMALLForStaticScreen[k] == dm_use_mall_static_screen_optimize)
			&& (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_phantom_pipe))
			|| ((mode_lib->vba.UseMALLForStaticScreen[k] == dm_use_mall_static_screen_disable
			|| mode_lib->vba.UseMALLForStaticScreen[k] == dm_use_mall_static_screen_optimize)
			&& (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_full_frame));
	}

	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.FullFrameMALLPStateMethod = false;
	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SubViewportMALLPStateMethod = false;
	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.PhantomPipeMALLPStateMethod = false;

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		if (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_full_frame)
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.FullFrameMALLPStateMethod = true;
		if (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_sub_viewport)
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SubViewportMALLPStateMethod = true;
		if (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_phantom_pipe)
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.PhantomPipeMALLPStateMethod = true;
	}
	mode_lib->vba.InvalidCombinationOfMALLUseForPState = (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SubViewportMALLPStateMethod
			!= v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.PhantomPipeMALLPStateMethod) || (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SubViewportMALLPStateMethod && v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.FullFrameMALLPStateMethod);

	if (mode_lib->vba.UseMinimumRequiredDCFCLK == true) {
		dml32_UseMinimumDCFCLK(
				mode_lib->vba.UsesMALLForPStateChange,
				mode_lib->vba.DRRDisplay,
				mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
				mode_lib->vba.MaxInterDCNTileRepeaters,
				mode_lib->vba.MaxPrefetchMode,
				mode_lib->vba.DRAMClockChangeLatency,
				mode_lib->vba.FCLKChangeLatency,
				mode_lib->vba.SREnterPlusExitTime,
				mode_lib->vba.ReturnBusWidth,
				mode_lib->vba.RoundTripPingLatencyCycles,
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ReorderingBytes,
				mode_lib->vba.PixelChunkSizeInKByte,
				mode_lib->vba.MetaChunkSize,
				mode_lib->vba.GPUVMEnable,
				mode_lib->vba.GPUVMMaxPageTableLevels,
				mode_lib->vba.HostVMEnable,
				mode_lib->vba.NumberOfActiveSurfaces,
				mode_lib->vba.HostVMMinPageSize,
				mode_lib->vba.HostVMMaxNonCachedPageTableLevels,
				mode_lib->vba.DynamicMetadataVMEnabled,
				mode_lib->vba.ImmediateFlipRequiredFinal,
				mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
				mode_lib->vba.MaxAveragePercentOfIdealSDPPortBWDisplayCanUseInNormalSystemOperation,
				mode_lib->vba.PercentOfIdealFabricAndSDPPortBWReceivedAfterUrgLatency,
				mode_lib->vba.VTotal,
				mode_lib->vba.VActive,
				mode_lib->vba.DynamicMetadataTransmittedBytes,
				mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired,
				mode_lib->vba.Interlace,
				mode_lib->vba.RequiredDPPCLK,
				mode_lib->vba.RequiredDISPCLK,
				mode_lib->vba.UrgLatency,
				mode_lib->vba.NoOfDPP,
				mode_lib->vba.ProjectedDCFCLKDeepSleep,
				mode_lib->vba.MaximumVStartup,
				mode_lib->vba.TotalNumberOfActiveDPP,
				mode_lib->vba.TotalNumberOfDCCActiveDPP,
				mode_lib->vba.dpte_group_bytes,
				mode_lib->vba.PrefetchLinesY,
				mode_lib->vba.PrefetchLinesC,
				mode_lib->vba.swath_width_luma_ub_all_states,
				mode_lib->vba.swath_width_chroma_ub_all_states,
				mode_lib->vba.BytePerPixelY,
				mode_lib->vba.BytePerPixelC,
				mode_lib->vba.HTotal,
				mode_lib->vba.PixelClock,
				mode_lib->vba.PDEAndMetaPTEBytesPerFrame,
				mode_lib->vba.DPTEBytesPerRow,
				mode_lib->vba.MetaRowBytes,
				mode_lib->vba.DynamicMetadataEnable,
				mode_lib->vba.ReadBandwidthLuma,
				mode_lib->vba.ReadBandwidthChroma,
				mode_lib->vba.DCFCLKPerState,

				/* Output */
				mode_lib->vba.DCFCLKState);
	} // UseMinimumRequiredDCFCLK == true

	for (i = 0; i < (int) v->soc.num_states; ++i) {
		for (j = 0; j <= 1; ++j) {
			mode_lib->vba.ReturnBWPerState[i][j] = dml32_get_return_bw_mbps(&mode_lib->vba.soc, i,
					mode_lib->vba.HostVMEnable, mode_lib->vba.DCFCLKState[i][j],
					mode_lib->vba.FabricClockPerState[i], mode_lib->vba.DRAMSpeedPerState[i]);
		}
	}

	//Re-ordering Buffer Support Check
	for (i = 0; i < (int) v->soc.num_states; ++i) {
		for (j = 0; j <= 1; ++j) {
			if ((mode_lib->vba.ROBBufferSizeInKByte - mode_lib->vba.PixelChunkSizeInKByte) * 1024
					/ mode_lib->vba.ReturnBWPerState[i][j]
					> (mode_lib->vba.RoundTripPingLatencyCycles + 32)
							/ mode_lib->vba.DCFCLKState[i][j]
							+ v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ReorderingBytes / mode_lib->vba.ReturnBWPerState[i][j]) {
				mode_lib->vba.ROBSupport[i][j] = true;
			} else {
				mode_lib->vba.ROBSupport[i][j] = false;
			}
		}
	}

	//Vertical Active BW support check
	v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaxTotalVActiveRDBandwidth = 0;

	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
		v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaxTotalVActiveRDBandwidth += mode_lib->vba.ReadBandwidthLuma[k]
				+ mode_lib->vba.ReadBandwidthChroma[k];
	}

	for (i = 0; i < (int) v->soc.num_states; ++i) {
		for (j = 0; j <= 1; ++j) {
			mode_lib->vba.MaxTotalVerticalActiveAvailableBandwidth[i][j] =
				dml_min3(mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLKState[i][j]
					* mode_lib->vba.MaxAveragePercentOfIdealSDPPortBWDisplayCanUseInNormalSystemOperation / 100,
					mode_lib->vba.FabricClockPerState[i]
					* mode_lib->vba.FabricDatapathToDCNDataReturn
					* mode_lib->vba.MaxAveragePercentOfIdealFabricBWDisplayCanUseInNormalSystemOperation / 100,
					mode_lib->vba.DRAMSpeedPerState[i]
					* mode_lib->vba.NumberOfChannels
					* mode_lib->vba.DRAMChannelWidth
					* (i < 2 ? mode_lib->vba.MaxAveragePercentOfIdealDRAMBWDisplayCanUseInNormalSystemOperationSTROBE : mode_lib->vba.MaxAveragePercentOfIdealDRAMBWDisplayCanUseInNormalSystemOperation) / 100);

			if (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaxTotalVActiveRDBandwidth
					<= mode_lib->vba.MaxTotalVerticalActiveAvailableBandwidth[i][j]) {
				mode_lib->vba.TotalVerticalActiveBandwidthSupport[i][j] = true;
			} else {
				mode_lib->vba.TotalVerticalActiveBandwidthSupport[i][j] = false;
			}
		}
	}

	/* Prefetch Check */

	for (i = 0; i < (int) v->soc.num_states; ++i) {
		for (j = 0; j <= 1; ++j) {

			mode_lib->vba.TimeCalc = 24 / mode_lib->vba.ProjectedDCFCLKDeepSleep[i][j];

			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				mode_lib->vba.NoOfDPPThisState[k] = mode_lib->vba.NoOfDPP[i][j][k];
				mode_lib->vba.swath_width_luma_ub_this_state[k] =
						mode_lib->vba.swath_width_luma_ub_all_states[i][j][k];
				mode_lib->vba.swath_width_chroma_ub_this_state[k] =
						mode_lib->vba.swath_width_chroma_ub_all_states[i][j][k];
				mode_lib->vba.SwathWidthYThisState[k] = mode_lib->vba.SwathWidthYAllStates[i][j][k];
				mode_lib->vba.SwathWidthCThisState[k] = mode_lib->vba.SwathWidthCAllStates[i][j][k];
				mode_lib->vba.SwathHeightYThisState[k] = mode_lib->vba.SwathHeightYAllStates[i][j][k];
				mode_lib->vba.SwathHeightCThisState[k] = mode_lib->vba.SwathHeightCAllStates[i][j][k];
				mode_lib->vba.UnboundedRequestEnabledThisState =
						mode_lib->vba.UnboundedRequestEnabledAllStates[i][j];
				mode_lib->vba.CompressedBufferSizeInkByteThisState =
						mode_lib->vba.CompressedBufferSizeInkByteAllStates[i][j];
				mode_lib->vba.DETBufferSizeInKByteThisState[k] =
						mode_lib->vba.DETBufferSizeInKByteAllStates[i][j][k];
				mode_lib->vba.DETBufferSizeYThisState[k] =
						mode_lib->vba.DETBufferSizeYAllStates[i][j][k];
				mode_lib->vba.DETBufferSizeCThisState[k] =
						mode_lib->vba.DETBufferSizeCAllStates[i][j][k];
			}

			mode_lib->vba.VActiveBandwithSupport[i][j] = dml32_CalculateVActiveBandwithSupport(
					mode_lib->vba.NumberOfActiveSurfaces,
					mode_lib->vba.ReturnBWPerState[i][j],
					mode_lib->vba.NoUrgentLatencyHiding,
					mode_lib->vba.ReadBandwidthLuma,
					mode_lib->vba.ReadBandwidthChroma,
					mode_lib->vba.cursor_bw,
					mode_lib->vba.meta_row_bandwidth_this_state,
					mode_lib->vba.dpte_row_bandwidth_this_state,
					mode_lib->vba.NoOfDPPThisState,
					mode_lib->vba.UrgentBurstFactorLuma,
					mode_lib->vba.UrgentBurstFactorChroma,
					mode_lib->vba.UrgentBurstFactorCursor);

			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.VMDataOnlyReturnBWPerState = dml32_get_return_bw_mbps_vm_only(&mode_lib->vba.soc, i,
					mode_lib->vba.DCFCLKState[i][j], mode_lib->vba.FabricClockPerState[i],
					mode_lib->vba.DRAMSpeedPerState[i]);
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor = 1;

			if (mode_lib->vba.GPUVMEnable && mode_lib->vba.HostVMEnable)
				v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor = mode_lib->vba.ReturnBWPerState[i][j]
						/ v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.VMDataOnlyReturnBWPerState;

			mode_lib->vba.ExtraLatency = dml32_CalculateExtraLatency(
					mode_lib->vba.RoundTripPingLatencyCycles, v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ReorderingBytes,
					mode_lib->vba.DCFCLKState[i][j], mode_lib->vba.TotalNumberOfActiveDPP[i][j],
					mode_lib->vba.PixelChunkSizeInKByte,
					mode_lib->vba.TotalNumberOfDCCActiveDPP[i][j], mode_lib->vba.MetaChunkSize,
					mode_lib->vba.ReturnBWPerState[i][j], mode_lib->vba.GPUVMEnable,
					mode_lib->vba.HostVMEnable, mode_lib->vba.NumberOfActiveSurfaces,
					mode_lib->vba.NoOfDPPThisState, mode_lib->vba.dpte_group_bytes,
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor, mode_lib->vba.HostVMMinPageSize,
					mode_lib->vba.HostVMMaxNonCachedPageTableLevels);

			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState = mode_lib->vba.MinPrefetchMode;

			mode_lib->vba.NextMaxVStartup = mode_lib->vba.MaxMaxVStartup[i][j];

			do {
				mode_lib->vba.PrefetchModePerState[i][j] = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState;
				mode_lib->vba.MaxVStartup = mode_lib->vba.NextMaxVStartup;

				for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
					mode_lib->vba.TWait = dml32_CalculateTWait(
							mode_lib->vba.PrefetchModePerState[i][j],
							mode_lib->vba.UsesMALLForPStateChange[k],
							mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
							mode_lib->vba.DRRDisplay[k],
							mode_lib->vba.DRAMClockChangeLatency,
							mode_lib->vba.FCLKChangeLatency, mode_lib->vba.UrgLatency[i],
							mode_lib->vba.SREnterPlusExitTime);

					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.Dppclk = mode_lib->vba.RequiredDPPCLK[i][j][k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.Dispclk = mode_lib->vba.RequiredDISPCLK[i][j];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.PixelClock = mode_lib->vba.PixelClock[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.DCFClkDeepSleep = mode_lib->vba.ProjectedDCFCLKDeepSleep[i][j];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.DPPPerSurface = mode_lib->vba.NoOfDPP[i][j][k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.ScalerEnabled = mode_lib->vba.ScalerEnabled[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.SourceRotation = mode_lib->vba.SourceRotation[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BlockWidth256BytesY = mode_lib->vba.Read256BlockWidthY[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BlockHeight256BytesY = mode_lib->vba.Read256BlockHeightY[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BlockWidth256BytesC = mode_lib->vba.Read256BlockWidthC[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BlockHeight256BytesC = mode_lib->vba.Read256BlockHeightC[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.InterlaceEnable = mode_lib->vba.Interlace[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.NumberOfCursors = mode_lib->vba.NumberOfCursors[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.VBlank = mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.HTotal = mode_lib->vba.HTotal[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.HActive = mode_lib->vba.HActive[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.DCCEnable = mode_lib->vba.DCCEnable[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.ODMMode = mode_lib->vba.ODMCombineEnablePerState[i][k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.SourcePixelFormat = mode_lib->vba.SourcePixelFormat[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BytePerPixelY = mode_lib->vba.BytePerPixelY[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BytePerPixelC = mode_lib->vba.BytePerPixelC[k];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.ProgressiveToInterlaceUnitInOPP =
							mode_lib->vba.ProgressiveToInterlaceUnitInOPP;

					mode_lib->vba.NoTimeForPrefetch[i][j][k] =
						dml32_CalculatePrefetchSchedule(
							v,
							k,
							v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor,
							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe,
							v->DSCDelayPerState[i][k],
							v->SwathWidthYThisState[k] / v->HRatio[k],
							dml_min(v->MaxVStartup, v->MaximumVStartup[i][j][k]),
							v->MaximumVStartup[i][j][k],
							v->UrgLatency[i],
							v->ExtraLatency,
							v->TimeCalc,
							v->PDEAndMetaPTEBytesPerFrame[i][j][k],
							v->MetaRowBytes[i][j][k],
							v->DPTEBytesPerRow[i][j][k],
							v->PrefetchLinesY[i][j][k],
							v->SwathWidthYThisState[k],
							v->PrefillY[k],
							v->MaxNumSwY[k],
							v->PrefetchLinesC[i][j][k],
							v->SwathWidthCThisState[k],
							v->PrefillC[k],
							v->MaxNumSwC[k],
							v->swath_width_luma_ub_this_state[k],
							v->swath_width_chroma_ub_this_state[k],
							v->SwathHeightYThisState[k],
							v->SwathHeightCThisState[k], v->TWait,

							/* Output */
							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTXAfterScaler[k],
							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTYAfterScaler[k],
							&v->LineTimesForPrefetch[k],
							&v->PrefetchBW[k],
							&v->LinesForMetaPTE[k],
							&v->LinesForMetaAndDPTERow[k],
							&v->VRatioPreY[i][j][k],
							&v->VRatioPreC[i][j][k],
							&v->RequiredPrefetchPixelDataBWLuma[0][0][k],
							&v->RequiredPrefetchPixelDataBWChroma[0][0][k],
							&v->NoTimeForDynamicMetadata[i][j][k],
							&v->Tno_bw[k],
							&v->prefetch_vmrow_bw[k],
							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[0],         // double *Tdmdl_vm
							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[1],         // double *Tdmdl
							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[2],         // double *TSetup
							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer[0],         							    // unsigned int   *VUpdateOffsetPix
							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[3],         // unsigned int   *VUpdateWidthPix
							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[4]);        // unsigned int   *VReadyOffsetPix
				}

				for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
					dml32_CalculateUrgentBurstFactor(
							mode_lib->vba.UsesMALLForPStateChange[k],
							mode_lib->vba.swath_width_luma_ub_this_state[k],
							mode_lib->vba.swath_width_chroma_ub_this_state[k],
							mode_lib->vba.SwathHeightYThisState[k],
							mode_lib->vba.SwathHeightCThisState[k],
							mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
							mode_lib->vba.UrgLatency[i], mode_lib->vba.CursorBufferSize,
							mode_lib->vba.CursorWidth[k][0], mode_lib->vba.CursorBPP[k][0],
							mode_lib->vba.VRatioPreY[i][j][k],
							mode_lib->vba.VRatioPreC[i][j][k],
							mode_lib->vba.BytePerPixelInDETY[k],
							mode_lib->vba.BytePerPixelInDETC[k],
							mode_lib->vba.DETBufferSizeYThisState[k],
							mode_lib->vba.DETBufferSizeCThisState[k],
							/* Output */
							&mode_lib->vba.UrgentBurstFactorCursorPre[k],
							&mode_lib->vba.UrgentBurstFactorLumaPre[k],
							&mode_lib->vba.UrgentBurstFactorChroma[k],
							&mode_lib->vba.NotUrgentLatencyHidingPre[k]);
				}

				{
					dml32_CalculatePrefetchBandwithSupport(
							mode_lib->vba.NumberOfActiveSurfaces,
							mode_lib->vba.ReturnBWPerState[i][j],
							mode_lib->vba.NotUrgentLatencyHidingPre,
							mode_lib->vba.ReadBandwidthLuma,
							mode_lib->vba.ReadBandwidthChroma,
							mode_lib->vba.RequiredPrefetchPixelDataBWLuma[0][0],
							mode_lib->vba.RequiredPrefetchPixelDataBWChroma[0][0],
							mode_lib->vba.cursor_bw,
							mode_lib->vba.meta_row_bandwidth_this_state,
							mode_lib->vba.dpte_row_bandwidth_this_state,
							mode_lib->vba.cursor_bw_pre,
							mode_lib->vba.prefetch_vmrow_bw,
							mode_lib->vba.NoOfDPPThisState,
							mode_lib->vba.UrgentBurstFactorLuma,
							mode_lib->vba.UrgentBurstFactorChroma,
							mode_lib->vba.UrgentBurstFactorCursor,
							mode_lib->vba.UrgentBurstFactorLumaPre,
							mode_lib->vba.UrgentBurstFactorChromaPre,
							mode_lib->vba.UrgentBurstFactorCursorPre,

							/* output */
							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[0],   // Single  *PrefetchBandwidth
							&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[1],   // Single  *FractionOfUrgentBandwidth
							&mode_lib->vba.PrefetchSupported[i][j]);
				}

				for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
					if (mode_lib->vba.LineTimesForPrefetch[k]
							< 2.0 || mode_lib->vba.LinesForMetaPTE[k] >= 32.0
							|| mode_lib->vba.LinesForMetaAndDPTERow[k] >= 16.0
							|| mode_lib->vba.NoTimeForPrefetch[i][j][k] == true) {
						mode_lib->vba.PrefetchSupported[i][j] = false;
					}
				}

				mode_lib->vba.DynamicMetadataSupported[i][j] = true;
				for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
					if (mode_lib->vba.NoTimeForDynamicMetadata[i][j][k] == true)
						mode_lib->vba.DynamicMetadataSupported[i][j] = false;
				}

				mode_lib->vba.VRatioInPrefetchSupported[i][j] = true;
				for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
					if (mode_lib->vba.VRatioPreY[i][j][k] > __DML_MAX_VRATIO_PRE__
							|| mode_lib->vba.VRatioPreC[i][j][k] > __DML_MAX_VRATIO_PRE__
							|| mode_lib->vba.NoTimeForPrefetch[i][j][k] == true) {
						mode_lib->vba.VRatioInPrefetchSupported[i][j] = false;
					}
				}
				mode_lib->vba.AnyLinesForVMOrRowTooLarge = false;
				for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
					if (mode_lib->vba.LinesForMetaAndDPTERow[k] >= 16
							|| mode_lib->vba.LinesForMetaPTE[k] >= 32) {
						mode_lib->vba.AnyLinesForVMOrRowTooLarge = true;
					}
				}

				if (mode_lib->vba.PrefetchSupported[i][j] == true
						&& mode_lib->vba.VRatioInPrefetchSupported[i][j] == true) {
					mode_lib->vba.BandwidthAvailableForImmediateFlip =
							dml32_CalculateBandwidthAvailableForImmediateFlip(
							mode_lib->vba.NumberOfActiveSurfaces,
							mode_lib->vba.ReturnBWPerState[i][j],
							mode_lib->vba.ReadBandwidthLuma,
							mode_lib->vba.ReadBandwidthChroma,
							mode_lib->vba.RequiredPrefetchPixelDataBWLuma[0][0],
							mode_lib->vba.RequiredPrefetchPixelDataBWChroma[0][0],
							mode_lib->vba.cursor_bw,
							mode_lib->vba.cursor_bw_pre,
							mode_lib->vba.NoOfDPPThisState,
							mode_lib->vba.UrgentBurstFactorLuma,
							mode_lib->vba.UrgentBurstFactorChroma,
							mode_lib->vba.UrgentBurstFactorCursor,
							mode_lib->vba.UrgentBurstFactorLumaPre,
							mode_lib->vba.UrgentBurstFactorChromaPre,
							mode_lib->vba.UrgentBurstFactorCursorPre);

					mode_lib->vba.TotImmediateFlipBytes = 0.0;
					for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
						if (!(mode_lib->vba.ImmediateFlipRequirement[k] ==
								dm_immediate_flip_not_required)) {
							mode_lib->vba.TotImmediateFlipBytes =
									mode_lib->vba.TotImmediateFlipBytes
								+ mode_lib->vba.NoOfDPP[i][j][k]
								* mode_lib->vba.PDEAndMetaPTEBytesPerFrame[i][j][k]
								+ mode_lib->vba.MetaRowBytes[i][j][k];
							if (mode_lib->vba.use_one_row_for_frame_flip[i][j][k]) {
								mode_lib->vba.TotImmediateFlipBytes =
									mode_lib->vba.TotImmediateFlipBytes + 2
								* mode_lib->vba.DPTEBytesPerRow[i][j][k];
							} else {
								mode_lib->vba.TotImmediateFlipBytes =
									mode_lib->vba.TotImmediateFlipBytes
								+ mode_lib->vba.DPTEBytesPerRow[i][j][k];
							}
						}
					}

					for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
						dml32_CalculateFlipSchedule(v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor,
							mode_lib->vba.ExtraLatency,
							mode_lib->vba.UrgLatency[i],
							mode_lib->vba.GPUVMMaxPageTableLevels,
							mode_lib->vba.HostVMEnable,
							mode_lib->vba.HostVMMaxNonCachedPageTableLevels,
							mode_lib->vba.GPUVMEnable,
							mode_lib->vba.HostVMMinPageSize,
							mode_lib->vba.PDEAndMetaPTEBytesPerFrame[i][j][k],
							mode_lib->vba.MetaRowBytes[i][j][k],
							mode_lib->vba.DPTEBytesPerRow[i][j][k],
							mode_lib->vba.BandwidthAvailableForImmediateFlip,
							mode_lib->vba.TotImmediateFlipBytes,
							mode_lib->vba.SourcePixelFormat[k],
							(mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]),
							mode_lib->vba.VRatio[k],
							mode_lib->vba.VRatioChroma[k],
							mode_lib->vba.Tno_bw[k],
								mode_lib->vba.DCCEnable[k],
							mode_lib->vba.dpte_row_height[k],
							mode_lib->vba.meta_row_height[k],
							mode_lib->vba.dpte_row_height_chroma[k],
							mode_lib->vba.meta_row_height_chroma[k],
							mode_lib->vba.use_one_row_for_frame_flip[i][j][k], // 24

							/* Output */
							&mode_lib->vba.DestinationLinesToRequestVMInImmediateFlip[k],
							&mode_lib->vba.DestinationLinesToRequestRowInImmediateFlip[k],
							&mode_lib->vba.final_flip_bw[k],
							&mode_lib->vba.ImmediateFlipSupportedForPipe[k]);
					}

					{
						dml32_CalculateImmediateFlipBandwithSupport(mode_lib->vba.NumberOfActiveSurfaces,
								mode_lib->vba.ReturnBWPerState[i][j],
								mode_lib->vba.ImmediateFlipRequirement,
								mode_lib->vba.final_flip_bw,
								mode_lib->vba.ReadBandwidthLuma,
								mode_lib->vba.ReadBandwidthChroma,
								mode_lib->vba.RequiredPrefetchPixelDataBWLuma[0][0],
								mode_lib->vba.RequiredPrefetchPixelDataBWChroma[0][0],
								mode_lib->vba.cursor_bw,
								mode_lib->vba.meta_row_bandwidth_this_state,
								mode_lib->vba.dpte_row_bandwidth_this_state,
								mode_lib->vba.cursor_bw_pre,
								mode_lib->vba.prefetch_vmrow_bw,
								mode_lib->vba.DPPPerPlane,
								mode_lib->vba.UrgentBurstFactorLuma,
								mode_lib->vba.UrgentBurstFactorChroma,
								mode_lib->vba.UrgentBurstFactorCursor,
								mode_lib->vba.UrgentBurstFactorLumaPre,
								mode_lib->vba.UrgentBurstFactorChromaPre,
								mode_lib->vba.UrgentBurstFactorCursorPre,

								/* output */
								&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[0], //  Single  *TotalBandwidth
								&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[1], //  Single  *FractionOfUrgentBandwidth
								&mode_lib->vba.ImmediateFlipSupportedForState[i][j]); // Boolean *ImmediateFlipBandwidthSupport
					}

					for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
						if (!(mode_lib->vba.ImmediateFlipRequirement[k]
								== dm_immediate_flip_not_required)
								&& (mode_lib->vba.ImmediateFlipSupportedForPipe[k]
										== false))
							mode_lib->vba.ImmediateFlipSupportedForState[i][j] = false;
					}
				} else { // if prefetch not support, assume iflip not supported
					mode_lib->vba.ImmediateFlipSupportedForState[i][j] = false;
				}

				if (mode_lib->vba.MaxVStartup <= __DML_VBA_MIN_VSTARTUP__
						|| mode_lib->vba.AnyLinesForVMOrRowTooLarge == false) {
					mode_lib->vba.NextMaxVStartup = mode_lib->vba.MaxMaxVStartup[i][j];
					v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState + 1;
				} else {
					mode_lib->vba.NextMaxVStartup = mode_lib->vba.NextMaxVStartup - 1;
				}
			} while (!((mode_lib->vba.PrefetchSupported[i][j] == true
					&& mode_lib->vba.DynamicMetadataSupported[i][j] == true
					&& mode_lib->vba.VRatioInPrefetchSupported[i][j] == true &&
					// consider flip support is okay if when there is no hostvm and the
					// user does't require a iflip OR the flip bw is ok
					// If there is hostvm, DCN needs to support iflip for invalidation
					((mode_lib->vba.HostVMEnable == false
							&& !mode_lib->vba.ImmediateFlipRequiredFinal)
							|| mode_lib->vba.ImmediateFlipSupportedForState[i][j] == true))
					|| (mode_lib->vba.NextMaxVStartup == mode_lib->vba.MaxMaxVStartup[i][j]
							&& v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState > mode_lib->vba.MaxPrefetchMode)));

			for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {
				mode_lib->vba.use_one_row_for_frame_this_state[k] =
						mode_lib->vba.use_one_row_for_frame[i][j][k];
			}


			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.UrgentLatency = mode_lib->vba.UrgLatency[i];
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.ExtraLatency = mode_lib->vba.ExtraLatency;
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.WritebackLatency = mode_lib->vba.WritebackLatency;
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.DRAMClockChangeLatency = mode_lib->vba.DRAMClockChangeLatency;
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.FCLKChangeLatency = mode_lib->vba.FCLKChangeLatency;
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SRExitTime = mode_lib->vba.SRExitTime;
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SREnterPlusExitTime = mode_lib->vba.SREnterPlusExitTime;
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SRExitZ8Time = mode_lib->vba.SRExitZ8Time;
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SREnterPlusExitZ8Time = mode_lib->vba.SREnterPlusExitZ8Time;
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.USRRetrainingLatency = mode_lib->vba.USRRetrainingLatency;
			v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SMNLatency = mode_lib->vba.SMNLatency;

			{
				dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport(
						v,
						v->PrefetchModePerState[i][j],
						v->DCFCLKState[i][j],
						v->ReturnBWPerState[i][j],
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters,
						v->SOCCLKPerState[i],
						v->ProjectedDCFCLKDeepSleep[i][j],
						v->DETBufferSizeYThisState,
						v->DETBufferSizeCThisState,
						v->SwathHeightYThisState,
						v->SwathHeightCThisState,
						v->SwathWidthYThisState, // 24
						v->SwathWidthCThisState,
						v->NoOfDPPThisState,
						v->BytePerPixelInDETY,
						v->BytePerPixelInDETC,
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTXAfterScaler,
						v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTYAfterScaler,
						v->UnboundedRequestEnabledThisState,
						v->CompressedBufferSizeInkByteThisState,

						/* Output */
						&v->DRAMClockChangeSupport[i][j],
						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single2[0], // double *MaxActiveDRAMClockChangeLatencySupported
						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer[0], // Long SubViewportLinesNeededInMALL[]
						&v->FCLKChangeSupport[i][j],
						&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single2[1], // double *MinActiveFCLKChangeLatencySupported
						&mode_lib->vba.USRRetrainingSupport[i][j],
						mode_lib->vba.ActiveDRAMClockChangeLatencyMargin);
			}
		}
	} // End of Prefetch Check

	/*Cursor Support Check*/
	mode_lib->vba.CursorSupport = true;
	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		if (mode_lib->vba.CursorWidth[k][0] > 0.0) {
			if (mode_lib->vba.CursorBPP[k][0] == 64 && mode_lib->vba.Cursor64BppSupport == false)
				mode_lib->vba.CursorSupport = false;
		}
	}

	/*Valid Pitch Check*/
	mode_lib->vba.PitchSupport = true;
	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		mode_lib->vba.AlignedYPitch[k] = dml_ceil(
				dml_max(mode_lib->vba.PitchY[k], mode_lib->vba.SurfaceWidthY[k]),
				mode_lib->vba.MacroTileWidthY[k]);
		if (mode_lib->vba.DCCEnable[k] == true) {
			mode_lib->vba.AlignedDCCMetaPitchY[k] = dml_ceil(
					dml_max(mode_lib->vba.DCCMetaPitchY[k], mode_lib->vba.SurfaceWidthY[k]),
					64.0 * mode_lib->vba.Read256BlockWidthY[k]);
		} else {
			mode_lib->vba.AlignedDCCMetaPitchY[k] = mode_lib->vba.DCCMetaPitchY[k];
		}
		if (mode_lib->vba.SourcePixelFormat[k] != dm_444_64 && mode_lib->vba.SourcePixelFormat[k] != dm_444_32
				&& mode_lib->vba.SourcePixelFormat[k] != dm_444_16
				&& mode_lib->vba.SourcePixelFormat[k] != dm_mono_16
				&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe
				&& mode_lib->vba.SourcePixelFormat[k] != dm_mono_8) {
			mode_lib->vba.AlignedCPitch[k] = dml_ceil(
					dml_max(mode_lib->vba.PitchC[k], mode_lib->vba.SurfaceWidthC[k]),
					mode_lib->vba.MacroTileWidthC[k]);
			if (mode_lib->vba.DCCEnable[k] == true) {
				mode_lib->vba.AlignedDCCMetaPitchC[k] = dml_ceil(
						dml_max(mode_lib->vba.DCCMetaPitchC[k],
								mode_lib->vba.SurfaceWidthC[k]),
						64.0 * mode_lib->vba.Read256BlockWidthC[k]);
			} else {
				mode_lib->vba.AlignedDCCMetaPitchC[k] = mode_lib->vba.DCCMetaPitchC[k];
			}
		} else {
			mode_lib->vba.AlignedCPitch[k] = mode_lib->vba.PitchC[k];
			mode_lib->vba.AlignedDCCMetaPitchC[k] = mode_lib->vba.DCCMetaPitchC[k];
		}
		if (mode_lib->vba.AlignedYPitch[k] > mode_lib->vba.PitchY[k]
				|| mode_lib->vba.AlignedCPitch[k] > mode_lib->vba.PitchC[k]
				|| mode_lib->vba.AlignedDCCMetaPitchY[k] > mode_lib->vba.DCCMetaPitchY[k]
				|| mode_lib->vba.AlignedDCCMetaPitchC[k] > mode_lib->vba.DCCMetaPitchC[k]) {
			mode_lib->vba.PitchSupport = false;
		}
	}

	mode_lib->vba.ViewportExceedsSurface = false;
	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		if (mode_lib->vba.ViewportWidth[k] > mode_lib->vba.SurfaceWidthY[k]
				|| mode_lib->vba.ViewportHeight[k] > mode_lib->vba.SurfaceHeightY[k]) {
			mode_lib->vba.ViewportExceedsSurface = true;
			if (mode_lib->vba.SourcePixelFormat[k] != dm_444_64
					&& mode_lib->vba.SourcePixelFormat[k] != dm_444_32
					&& mode_lib->vba.SourcePixelFormat[k] != dm_444_16
					&& mode_lib->vba.SourcePixelFormat[k] != dm_444_16
					&& mode_lib->vba.SourcePixelFormat[k] != dm_444_8
					&& mode_lib->vba.SourcePixelFormat[k] != dm_rgbe) {
				if (mode_lib->vba.ViewportWidthChroma[k] > mode_lib->vba.SurfaceWidthC[k]
						|| mode_lib->vba.ViewportHeightChroma[k]
								> mode_lib->vba.SurfaceHeightC[k]) {
					mode_lib->vba.ViewportExceedsSurface = true;
				}
			}
		}
	}

	/*Mode Support, Voltage State and SOC Configuration*/
	mode_support_configuration(v, mode_lib);

	MaximumMPCCombine = 0;

	for (i = v->soc.num_states; i >= 0; i--) {
		if (i == v->soc.num_states || mode_lib->vba.ModeSupport[i][0] == true ||
				mode_lib->vba.ModeSupport[i][1] == true) {
			mode_lib->vba.VoltageLevel = i;
			mode_lib->vba.ModeIsSupported = mode_lib->vba.ModeSupport[i][0] == true
					|| mode_lib->vba.ModeSupport[i][1] == true;

			if (mode_lib->vba.ModeSupport[i][0] == true) {
				MaximumMPCCombine = 0;
			} else {
				MaximumMPCCombine = 1;
			}
		}
	}

	mode_lib->vba.ImmediateFlipSupport =
			mode_lib->vba.ImmediateFlipSupportedForState[mode_lib->vba.VoltageLevel][MaximumMPCCombine];
	mode_lib->vba.UnboundedRequestEnabled =
			mode_lib->vba.UnboundedRequestEnabledAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine];
	mode_lib->vba.CompressedBufferSizeInkByte =
			mode_lib->vba.CompressedBufferSizeInkByteAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine]; // Not used, informational

	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		mode_lib->vba.MPCCombineEnable[k] =
				mode_lib->vba.MPCCombine[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
		mode_lib->vba.DPPPerPlane[k] = mode_lib->vba.NoOfDPP[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
		mode_lib->vba.SwathHeightY[k] =
				mode_lib->vba.SwathHeightYAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
		mode_lib->vba.SwathHeightC[k] =
				mode_lib->vba.SwathHeightCAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
		mode_lib->vba.DETBufferSizeInKByte[k] =
			mode_lib->vba.DETBufferSizeInKByteAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
		mode_lib->vba.DETBufferSizeY[k] =
				mode_lib->vba.DETBufferSizeYAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
		mode_lib->vba.DETBufferSizeC[k] =
				mode_lib->vba.DETBufferSizeCAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k];
		mode_lib->vba.OutputType[k] = mode_lib->vba.OutputTypePerState[mode_lib->vba.VoltageLevel][k];
		mode_lib->vba.OutputRate[k] = mode_lib->vba.OutputRatePerState[mode_lib->vba.VoltageLevel][k];
	}

	mode_lib->vba.DCFCLK = mode_lib->vba.DCFCLKState[mode_lib->vba.VoltageLevel][MaximumMPCCombine];
	mode_lib->vba.DRAMSpeed = mode_lib->vba.DRAMSpeedPerState[mode_lib->vba.VoltageLevel];
	mode_lib->vba.FabricClock = mode_lib->vba.FabricClockPerState[mode_lib->vba.VoltageLevel];
	mode_lib->vba.SOCCLK = mode_lib->vba.SOCCLKPerState[mode_lib->vba.VoltageLevel];
	mode_lib->vba.ReturnBW = mode_lib->vba.ReturnBWPerState[mode_lib->vba.VoltageLevel][MaximumMPCCombine];
	mode_lib->vba.DISPCLK = mode_lib->vba.RequiredDISPCLK[mode_lib->vba.VoltageLevel][MaximumMPCCombine];
	mode_lib->vba.maxMpcComb = MaximumMPCCombine;

	for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) {
		if (mode_lib->vba.BlendingAndTiming[k] == k) {
			mode_lib->vba.ODMCombineEnabled[k] =
					mode_lib->vba.ODMCombineEnablePerState[mode_lib->vba.VoltageLevel][k];
		} else {
			mode_lib->vba.ODMCombineEnabled[k] = dm_odm_combine_mode_disabled;
		}

		mode_lib->vba.DSCEnabled[k] = mode_lib->vba.RequiresDSC[mode_lib->vba.VoltageLevel][k];
		mode_lib->vba.FECEnable[k] = mode_lib->vba.RequiresFEC[mode_lib->vba.VoltageLevel][k];
		mode_lib->vba.OutputBpp[k] = mode_lib->vba.OutputBppPerState[mode_lib->vba.VoltageLevel][k];
	}

	mode_lib->vba.UrgentWatermark = mode_lib->vba.Watermark.UrgentWatermark;
	mode_lib->vba.StutterEnterPlusExitWatermark = mode_lib->vba.Watermark.StutterEnterPlusExitWatermark;
	mode_lib->vba.StutterExitWatermark = mode_lib->vba.Watermark.StutterExitWatermark;
	mode_lib->vba.WritebackDRAMClockChangeWatermark = mode_lib->vba.Watermark.WritebackDRAMClockChangeWatermark;
	mode_lib->vba.DRAMClockChangeWatermark = mode_lib->vba.Watermark.DRAMClockChangeWatermark;
	mode_lib->vba.UrgentLatency = mode_lib->vba.UrgLatency[mode_lib->vba.VoltageLevel];
	mode_lib->vba.DCFCLKDeepSleep = mode_lib->vba.ProjectedDCFCLKDeepSleep[mode_lib->vba.VoltageLevel][MaximumMPCCombine];

	/* VBA has Error type to Error Msg output here, but not necessary for DML-C */
} // ModeSupportAndSystemConfigurationFull
