root/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
/*
 * 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 "../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.OutputBppPerState[mode_lib->vba.VoltageLevel][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], mode_lib->vba.ip.dsc_delay_factor_wa);
        }

        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.UsesMALLForPStateChange,
                                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,
                                mode_lib->vba.DCCMetaPitchY,
                                mode_lib->vba.DCCMetaPitchC,

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

        v->NotEnoughDETSwathFillLatencyHiding = dml32_CalculateDETSwathFillLatencyHiding(
                                                mode_lib->vba.NumberOfActiveSurfaces,
                                                mode_lib->vba.ReturnBW,
                                                v->UrgentLatency,
                                                mode_lib->vba.SwathHeightY,
                                                mode_lib->vba.SwathHeightC,
                                                v->swath_width_luma_ub,
                                                v->swath_width_chroma_ub,
                                                v->BytePerPixelDETY,
                                                v->BytePerPixelDETC,
                                                mode_lib->vba.DETBufferSizeY,
                                                mode_lib->vba.DETBufferSizeC,
                                                mode_lib->vba.DPPPerPlane,
                                                mode_lib->vba.HTotal,
                                                mode_lib->vba.PixelClock,
                                                mode_lib->vba.VRatio,
                                                mode_lib->vba.VRatioChroma,
                                                mode_lib->vba.UsesMALLForPStateChange,
                                                mode_lib->vba.UseUnboundedRequesting);

        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;
                DestinationLineTimesForPrefetchLessThan2 = false;
                VRatioPrefetchMoreThanMax = false;
#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);

                        memset(&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe, 0, sizeof(DmlPipe));

                        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,
                                        (v->DRAMSpeedPerState[mode_lib->vba.VoltageLevel] <= MEM_STROBE_FREQ_MHZ ||
                                                v->DCFCLKPerState[mode_lib->vba.VoltageLevel] <= DCFCLK_FREQ_EXTRA_PREFETCH_REQ_MHZ) ?
                                                        mode_lib->vba.ip.min_prefetch_in_strobe_us : 0,
                                        mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] > 0 || mode_lib->vba.DRAMClockChangeRequirementFinal == false,

                                        /* 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] > v->MaxVRatioPre
                                        || v->VRatioPrefetchC[k] > v->MaxVRatioPre)
                                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,
                                        v->PrefetchBandwidth,
                                        v->VRatio,
                                        v->MaxVRatioPre,

                                        /* 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,
                                        v->PrefetchBandwidth,
                                        v->VRatio,
                                        v->MaxVRatioPre,

                                        /* 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, start_state;

        if (mode_lib->validate_max_state)
                start_state = v->soc.num_states - 1;
        else
                start_state = 0;

        for (i = v->soc.num_states - 1; i >= start_state; 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.NotEnoughDETSwathFillLatencyHidingPerState[i][j] == false
                                || i == v->soc.num_states - 1)
                                && ((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, start_state;
        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*/
        if (mode_lib->validate_max_state)
                start_state = v->soc.num_states - 1;
        else
                start_state = 0;

        /*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 = start_state; 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.OutputFormat[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,
                                                mode_lib->vba.NumberOfDSCSlices[k],

                                                /* 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.OutputFormat[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,
                                                mode_lib->vba.NumberOfDSCSlices[k],

                                                /* 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 = start_state; 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.UsesMALLForPStateChange[k] != dm_use_mall_pstate_change_phantom_pipe)) {
                                /* Phantom pipes don't consider DSC in DML, so it could fail link check.
                                 * However, we don't care about the link for phantom pipes.
                                 */
                                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.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.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.OutputMultistreamEn[k] == true && mode_lib->vba.OutputMultistreamId[k] == 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 = start_state; 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 = start_state; 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 = start_state; 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 = start_state; 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 = start_state; 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],
                                        mode_lib->vba.ip.dsc_delay_factor_wa);
                }

                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 = start_state; 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.UsesMALLForPStateChange,
                        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,
                        mode_lib->vba.DCCMetaPitchY,
                        mode_lib->vba.DCCMetaPitchC,

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

        for (i = start_state; 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]);
                }
        }

        //Calculate Return BW
        for (i = start_state; 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 = start_state; 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 = start_state; 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 = start_state; 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 = start_state; 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 = start_state; 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);

                        mode_lib->vba.NotEnoughDETSwathFillLatencyHidingPerState[i][j] = dml32_CalculateDETSwathFillLatencyHiding(
                                        mode_lib->vba.NumberOfActiveSurfaces,
                                        mode_lib->vba.ReturnBWPerState[i][j],
                                        mode_lib->vba.UrgLatency[i],
                                        mode_lib->vba.SwathHeightYThisState,
                                        mode_lib->vba.SwathHeightCThisState,
                                        mode_lib->vba.swath_width_luma_ub_this_state,
                                        mode_lib->vba.swath_width_chroma_ub_this_state,
                                        mode_lib->vba.BytePerPixelInDETY,
                                        mode_lib->vba.BytePerPixelInDETC,
                                        mode_lib->vba.DETBufferSizeYThisState,
                                        mode_lib->vba.DETBufferSizeCThisState,
                                        mode_lib->vba.NoOfDPPThisState,
                                        mode_lib->vba.HTotal,
                                        mode_lib->vba.PixelClock,
                                        mode_lib->vba.VRatio,
                                        mode_lib->vba.VRatioChroma,
                                        mode_lib->vba.UsesMALLForPStateChange,
                                        mode_lib->vba.UseUnboundedRequesting);

                        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);

                                        memset(&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull, 0, sizeof(DmlPipe));
                                        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,
                                                        (v->DRAMSpeedPerState[i] <= MEM_STROBE_FREQ_MHZ || v->DCFCLKState[i][j] <= DCFCLK_FREQ_EXTRA_PREFETCH_REQ_MHZ) ?
                                                                        mode_lib->vba.ip.min_prefetch_in_strobe_us : 0,
                                                        mode_lib->vba.PrefetchModePerState[i][j] > 0 || mode_lib->vba.DRAMClockChangeRequirementFinal == false,

                                                        /* 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.UrgentBurstFactorChromaPre[k],
                                                        &mode_lib->vba.NotUrgentLatencyHidingPre[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->VRatioPreY[i][j][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,
                                                        v->PrefetchBW,
                                                        v->VRatio,
                                                        v->MaxVRatioPre,

                                                        /* 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] > mode_lib->vba.MaxVRatioPre
                                                        || mode_lib->vba.VRatioPreC[i][j][k] > mode_lib->vba.MaxVRatioPre
                                                        || 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.ActiveDRAMClockChangeLatencyMarginPerState[i][j]);
                        }
                }
        } // 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_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 >= start_state; 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