aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3247-drm-amd-display-dc-Remove-unused-display_mode_vba.c.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3247-drm-amd-display-dc-Remove-unused-display_mode_vba.c.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3247-drm-amd-display-dc-Remove-unused-display_mode_vba.c.patch8717
1 files changed, 8717 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3247-drm-amd-display-dc-Remove-unused-display_mode_vba.c.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3247-drm-amd-display-dc-Remove-unused-display_mode_vba.c.patch
new file mode 100644
index 00000000..9c7b6bac
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3247-drm-amd-display-dc-Remove-unused-display_mode_vba.c.patch
@@ -0,0 +1,8717 @@
+From d439c828c0d7bd2de0797a57c8cf49db1b5b8eb5 Mon Sep 17 00:00:00 2001
+From: Harry Wentland <harry.wentland@amd.com>
+Date: Thu, 18 Jan 2018 09:54:44 -0500
+Subject: [PATCH 3247/4131] drm/amd/display: dc: Remove unused
+ display_mode_vba.c
+
+We're currently not using this.
+
+v2: More files and includes to remove.
+
+Signed-off-by: Harry Wentland <harry.wentland@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/dml/Makefile | 6 +-
+ .../gpu/drm/amd/display/dc/dml/display_mode_lib.h | 3 -
+ .../gpu/drm/amd/display/dc/dml/display_mode_vba.c | 6085 --------------------
+ .../gpu/drm/amd/display/dc/dml/display_mode_vba.h | 598 --
+ .../drm/amd/display/dc/dml/display_rq_dlg_calc.c | 1772 ------
+ .../drm/amd/display/dc/dml/display_rq_dlg_calc.h | 148 -
+ .../amd/display/dc/dml/dml1_display_rq_dlg_calc.h | 3 +-
+ 7 files changed, 4 insertions(+), 8611 deletions(-)
+ delete mode 100644 drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c
+ delete mode 100644 drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.h
+ delete mode 100644 drivers/gpu/drm/amd/display/dc/dml/display_rq_dlg_calc.c
+ delete mode 100644 drivers/gpu/drm/amd/display/dc/dml/display_rq_dlg_calc.h
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/Makefile b/drivers/gpu/drm/amd/display/dc/dml/Makefile
+index 87bab8e..f195aca 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/Makefile
++++ b/drivers/gpu/drm/amd/display/dc/dml/Makefile
+@@ -6,16 +6,14 @@
+ CFLAGS_display_mode_vba.o := -mhard-float -msse -mpreferred-stack-boundary=4
+ CFLAGS_display_mode_lib.o := -mhard-float -msse -mpreferred-stack-boundary=4
+ CFLAGS_display_pipe_clocks.o := -mhard-float -msse -mpreferred-stack-boundary=4
+-CFLAGS_display_rq_dlg_calc.o := -mhard-float -msse -mpreferred-stack-boundary=4
+ CFLAGS_dml1_display_rq_dlg_calc.o := -mhard-float -msse -mpreferred-stack-boundary=4
+ CFLAGS_display_rq_dlg_helpers.o := -mhard-float -msse -mpreferred-stack-boundary=4
+ CFLAGS_soc_bounding_box.o := -mhard-float -msse -mpreferred-stack-boundary=4
+ CFLAGS_dml_common_defs.o := -mhard-float -msse -mpreferred-stack-boundary=4
+
+
+-DML = display_mode_lib.o display_rq_dlg_calc.o \
+- display_rq_dlg_helpers.o dml1_display_rq_dlg_calc.o \
+- soc_bounding_box.o dml_common_defs.o display_mode_vba.o
++DML = display_mode_lib.o display_rq_dlg_helpers.o dml1_display_rq_dlg_calc.o \
++ soc_bounding_box.o dml_common_defs.o
+
+ AMD_DAL_DML = $(addprefix $(AMDDALPATH)/dc/dml/,$(DML))
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.h b/drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.h
+index 26f4f2a..3c2abcb 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.h
++++ b/drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.h
+@@ -28,8 +28,6 @@
+
+ #include "dml_common_defs.h"
+ #include "soc_bounding_box.h"
+-#include "display_mode_vba.h"
+-#include "display_rq_dlg_calc.h"
+ #include "dml1_display_rq_dlg_calc.h"
+
+ enum dml_project {
+@@ -41,7 +39,6 @@ struct display_mode_lib {
+ struct _vcs_dpi_ip_params_st ip;
+ struct _vcs_dpi_soc_bounding_box_st soc;
+ enum dml_project project;
+- struct vba_vars_st vba;
+ struct dal_logger *logger;
+ };
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c b/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c
+deleted file mode 100644
+index 260e113..0000000
+--- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c
++++ /dev/null
+@@ -1,6085 +0,0 @@
+-/*
+- * Copyright 2017 Advanced Micro Devices, Inc.
+- *
+- * 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 "display_mode_lib.h"
+-#include "display_mode_vba.h"
+-
+-#include "dml_inline_defs.h"
+-
+-/*
+- * NOTE:
+- * This file is gcc-parseable HW gospel, coming straight from HW engineers.
+- *
+- * It doesn't adhere to Linux kernel style and sometimes will do things in odd
+- * ways. Unless there is something clearly wrong with it the code should
+- * remain as-is as it provides us with a guarantee from HW that it is correct.
+- */
+-
+-#define BPP_INVALID 0
+-#define BPP_BLENDED_PIPE 0xffffffff
+-static const unsigned int NumberOfStates = DC__VOLTAGE_STATES;
+-
+-static void fetch_socbb_params(struct display_mode_lib *mode_lib);
+-static void fetch_ip_params(struct display_mode_lib *mode_lib);
+-static void fetch_pipe_params(struct display_mode_lib *mode_lib);
+-static void recalculate_params(
+- struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *pipes,
+- unsigned int num_pipes);
+-static void recalculate(struct display_mode_lib *mode_lib);
+-static double adjust_ReturnBW(
+- struct display_mode_lib *mode_lib,
+- double ReturnBW,
+- bool DCCEnabledAnyPlane,
+- double ReturnBandwidthToDCN);
+-static void ModeSupportAndSystemConfiguration(struct display_mode_lib *mode_lib);
+-static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib);
+-static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(
+- struct display_mode_lib *mode_lib);
+-static unsigned int dscceComputeDelay(
+- unsigned int bpc,
+- double bpp,
+- unsigned int sliceWidth,
+- unsigned int numSlices,
+- enum output_format_class pixelFormat);
+-static unsigned int dscComputeDelay(enum output_format_class pixelFormat);
+-// Super monster function with some 45 argument
+-static bool CalculatePrefetchSchedule(
+- struct display_mode_lib *mode_lib,
+- double DPPCLK,
+- double DISPCLK,
+- double PixelClock,
+- double DCFClkDeepSleep,
+- unsigned int DSCDelay,
+- unsigned int DPPPerPlane,
+- bool ScalerEnabled,
+- unsigned int NumberOfCursors,
+- double DPPCLKDelaySubtotal,
+- double DPPCLKDelaySCL,
+- double DPPCLKDelaySCLLBOnly,
+- double DPPCLKDelayCNVCFormater,
+- double DPPCLKDelayCNVCCursor,
+- double DISPCLKDelaySubtotal,
+- unsigned int ScalerRecoutWidth,
+- enum output_format_class OutputFormat,
+- unsigned int VBlank,
+- unsigned int HTotal,
+- unsigned int MaxInterDCNTileRepeaters,
+- unsigned int VStartup,
+- unsigned int PageTableLevels,
+- bool VirtualMemoryEnable,
+- bool DynamicMetadataEnable,
+- unsigned int DynamicMetadataLinesBeforeActiveRequired,
+- unsigned int DynamicMetadataTransmittedBytes,
+- bool DCCEnable,
+- double UrgentLatency,
+- double UrgentExtraLatency,
+- double TCalc,
+- unsigned int PDEAndMetaPTEBytesFrame,
+- unsigned int MetaRowByte,
+- unsigned int PixelPTEBytesPerRow,
+- double PrefetchSourceLinesY,
+- unsigned int SwathWidthY,
+- double BytePerPixelDETY,
+- double VInitPreFillY,
+- unsigned int MaxNumSwathY,
+- double PrefetchSourceLinesC,
+- double BytePerPixelDETC,
+- double VInitPreFillC,
+- unsigned int MaxNumSwathC,
+- unsigned int SwathHeightY,
+- unsigned int SwathHeightC,
+- double TWait,
+- bool XFCEnabled,
+- double XFCRemoteSurfaceFlipDelay,
+- bool InterlaceEnable,
+- bool ProgressiveToInterlaceUnitInOPP,
+- double *DSTXAfterScaler,
+- double *DSTYAfterScaler,
+- double *DestinationLinesForPrefetch,
+- double *PrefetchBandwidth,
+- double *DestinationLinesToRequestVMInVBlank,
+- double *DestinationLinesToRequestRowInVBlank,
+- double *VRatioPrefetchY,
+- double *VRatioPrefetchC,
+- double *RequiredPrefetchPixDataBW,
+- unsigned int *VStartupRequiredWhenNotEnoughTimeForDynamicMetadata,
+- double *Tno_bw,
+- unsigned int *VUpdateOffsetPix,
+- unsigned int *VUpdateWidthPix,
+- unsigned int *VReadyOffsetPix);
+-static double RoundToDFSGranularityUp(double Clock, double VCOSpeed);
+-static double RoundToDFSGranularityDown(double Clock, double VCOSpeed);
+-static double CalculatePrefetchSourceLines(
+- struct display_mode_lib *mode_lib,
+- double VRatio,
+- double vtaps,
+- bool Interlace,
+- bool ProgressiveToInterlaceUnitInOPP,
+- unsigned int SwathHeight,
+- unsigned int ViewportYStart,
+- double *VInitPreFill,
+- unsigned int *MaxNumSwath);
+-static unsigned int CalculateVMAndRowBytes(
+- struct display_mode_lib *mode_lib,
+- bool DCCEnable,
+- unsigned int BlockHeight256Bytes,
+- unsigned int BlockWidth256Bytes,
+- enum source_format_class SourcePixelFormat,
+- unsigned int SurfaceTiling,
+- unsigned int BytePerPixel,
+- enum scan_direction_class ScanDirection,
+- unsigned int ViewportWidth,
+- unsigned int ViewportHeight,
+- unsigned int SwathWidthY,
+- bool VirtualMemoryEnable,
+- unsigned int VMMPageSize,
+- unsigned int PTEBufferSizeInRequests,
+- unsigned int PDEProcessingBufIn64KBReqs,
+- unsigned int Pitch,
+- unsigned int DCCMetaPitch,
+- unsigned int *MacroTileWidth,
+- unsigned int *MetaRowByte,
+- unsigned int *PixelPTEBytesPerRow,
+- bool *PTEBufferSizeNotExceeded,
+- unsigned int *dpte_row_height,
+- unsigned int *meta_row_height);
+-static double CalculateTWait(
+- unsigned int PrefetchMode,
+- double DRAMClockChangeLatency,
+- double UrgentLatency,
+- double SREnterPlusExitTime);
+-static double CalculateRemoteSurfaceFlipDelay(
+- struct display_mode_lib *mode_lib,
+- double VRatio,
+- double SwathWidth,
+- double Bpp,
+- double LineTime,
+- double XFCTSlvVupdateOffset,
+- double XFCTSlvVupdateWidth,
+- double XFCTSlvVreadyOffset,
+- double XFCXBUFLatencyTolerance,
+- double XFCFillBWOverhead,
+- double XFCSlvChunkSize,
+- double XFCBusTransportTime,
+- double TCalc,
+- double TWait,
+- double *SrcActiveDrainRate,
+- double *TInitXFill,
+- double *TslvChk);
+-static double CalculateWriteBackDISPCLK(
+- enum source_format_class WritebackPixelFormat,
+- double PixelClock,
+- double WritebackHRatio,
+- double WritebackVRatio,
+- unsigned int WritebackLumaHTaps,
+- unsigned int WritebackLumaVTaps,
+- unsigned int WritebackChromaHTaps,
+- unsigned int WritebackChromaVTaps,
+- double WritebackDestinationWidth,
+- unsigned int HTotal,
+- unsigned int WritebackChromaLineBufferWidth);
+-static void CalculateActiveRowBandwidth(
+- bool VirtualMemoryEnable,
+- enum source_format_class SourcePixelFormat,
+- double VRatio,
+- bool DCCEnable,
+- double LineTime,
+- unsigned int MetaRowByteLuma,
+- unsigned int MetaRowByteChroma,
+- unsigned int meta_row_height_luma,
+- unsigned int meta_row_height_chroma,
+- unsigned int PixelPTEBytesPerRowLuma,
+- unsigned int PixelPTEBytesPerRowChroma,
+- unsigned int dpte_row_height_luma,
+- unsigned int dpte_row_height_chroma,
+- double *meta_row_bw,
+- double *dpte_row_bw,
+- double *qual_row_bw);
+-static void CalculateFlipSchedule(
+- struct display_mode_lib *mode_lib,
+- double UrgentExtraLatency,
+- double UrgentLatency,
+- unsigned int MaxPageTableLevels,
+- bool VirtualMemoryEnable,
+- double BandwidthAvailableForImmediateFlip,
+- unsigned int TotImmediateFlipBytes,
+- enum source_format_class SourcePixelFormat,
+- unsigned int ImmediateFlipBytes,
+- double LineTime,
+- double Tno_bw,
+- double VRatio,
+- double PDEAndMetaPTEBytesFrame,
+- unsigned int MetaRowByte,
+- unsigned int PixelPTEBytesPerRow,
+- bool DCCEnable,
+- unsigned int dpte_row_height,
+- unsigned int meta_row_height,
+- double qual_row_bw,
+- double *DestinationLinesToRequestVMInImmediateFlip,
+- double *DestinationLinesToRequestRowInImmediateFlip,
+- double *final_flip_bw,
+- bool *ImmediateFlipSupportedForPipe);
+-static double CalculateWriteBackDelay(
+- enum source_format_class WritebackPixelFormat,
+- double WritebackHRatio,
+- double WritebackVRatio,
+- unsigned int WritebackLumaHTaps,
+- unsigned int WritebackLumaVTaps,
+- unsigned int WritebackChromaHTaps,
+- unsigned int WritebackChromaVTaps,
+- unsigned int WritebackDestinationWidth);
+-static void PixelClockAdjustmentForProgressiveToInterlaceUnit(struct display_mode_lib *mode_lib);
+-static unsigned int CursorBppEnumToBits(enum cursor_bpp ebpp);
+-static void ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib);
+-
+-void set_prefetch_mode(
+- struct display_mode_lib *mode_lib,
+- bool cstate_en,
+- bool pstate_en,
+- bool ignore_viewport_pos,
+- bool immediate_flip_support)
+-{
+- unsigned int prefetch_mode;
+-
+- if (cstate_en && pstate_en)
+- prefetch_mode = 0;
+- else if (cstate_en)
+- prefetch_mode = 1;
+- else
+- prefetch_mode = 2;
+- if (prefetch_mode != mode_lib->vba.PrefetchMode
+- || ignore_viewport_pos != mode_lib->vba.IgnoreViewportPositioning
+- || immediate_flip_support != mode_lib->vba.ImmediateFlipSupport) {
+- DTRACE(
+- " Prefetch mode has changed from %i to %i. Recalculating.",
+- prefetch_mode,
+- mode_lib->vba.PrefetchMode);
+- mode_lib->vba.PrefetchMode = prefetch_mode;
+- mode_lib->vba.IgnoreViewportPositioning = ignore_viewport_pos;
+- mode_lib->vba.ImmediateFlipSupport = immediate_flip_support;
+- recalculate(mode_lib);
+- }
+-}
+-
+-unsigned int dml_get_voltage_level(
+- struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *pipes,
+- unsigned int num_pipes)
+-{
+- bool need_recalculate = memcmp(&mode_lib->soc, &mode_lib->vba.soc, sizeof(mode_lib->vba.soc)) != 0
+- || memcmp(&mode_lib->ip, &mode_lib->vba.ip, sizeof(mode_lib->vba.ip)) != 0
+- || num_pipes != mode_lib->vba.cache_num_pipes
+- || memcmp(pipes, mode_lib->vba.cache_pipes,
+- sizeof(display_e2e_pipe_params_st) * num_pipes) != 0;
+-
+- mode_lib->vba.soc = mode_lib->soc;
+- mode_lib->vba.ip = mode_lib->ip;
+- memcpy(mode_lib->vba.cache_pipes, pipes, sizeof(*pipes) * num_pipes);
+- mode_lib->vba.cache_num_pipes = num_pipes;
+-
+- if (need_recalculate && pipes[0].clks_cfg.dppclk_mhz != 0)
+- recalculate(mode_lib);
+- else {
+- fetch_socbb_params(mode_lib);
+- fetch_ip_params(mode_lib);
+- fetch_pipe_params(mode_lib);
+- }
+- ModeSupportAndSystemConfigurationFull(mode_lib);
+-
+- return mode_lib->vba.VoltageLevel;
+-}
+-
+-#define dml_get_attr_func(attr, var) double get_##attr(struct display_mode_lib *mode_lib, const display_e2e_pipe_params_st *pipes, unsigned int num_pipes) \
+-{ \
+- recalculate_params(mode_lib, pipes, num_pipes); \
+- return var; \
+-}
+-
+-dml_get_attr_func(clk_dcf_deepsleep, mode_lib->vba.DCFClkDeepSleep);
+-dml_get_attr_func(wm_urgent, mode_lib->vba.UrgentWatermark);
+-dml_get_attr_func(wm_memory_trip, mode_lib->vba.MemoryTripWatermark);
+-dml_get_attr_func(wm_writeback_urgent, mode_lib->vba.WritebackUrgentWatermark);
+-dml_get_attr_func(wm_stutter_exit, mode_lib->vba.StutterExitWatermark);
+-dml_get_attr_func(wm_stutter_enter_exit, mode_lib->vba.StutterEnterPlusExitWatermark);
+-dml_get_attr_func(wm_dram_clock_change, mode_lib->vba.DRAMClockChangeWatermark);
+-dml_get_attr_func(wm_writeback_dram_clock_change, mode_lib->vba.WritebackDRAMClockChangeWatermark);
+-dml_get_attr_func(wm_xfc_underflow, mode_lib->vba.UrgentWatermark); // xfc_underflow maps to urgent
+-dml_get_attr_func(stutter_efficiency, mode_lib->vba.StutterEfficiency);
+-dml_get_attr_func(stutter_efficiency_no_vblank, mode_lib->vba.StutterEfficiencyNotIncludingVBlank);
+-dml_get_attr_func(urgent_latency, mode_lib->vba.MinUrgentLatencySupportUs);
+-dml_get_attr_func(urgent_extra_latency, mode_lib->vba.UrgentExtraLatency);
+-dml_get_attr_func(nonurgent_latency, mode_lib->vba.NonUrgentLatencyTolerance);
+-dml_get_attr_func(
+- dram_clock_change_latency,
+- mode_lib->vba.MinActiveDRAMClockChangeLatencySupported);
+-dml_get_attr_func(dispclk_calculated, mode_lib->vba.DISPCLK_calculated);
+-dml_get_attr_func(total_data_read_bw, mode_lib->vba.TotalDataReadBandwidth);
+-dml_get_attr_func(return_bw, mode_lib->vba.ReturnBW);
+-dml_get_attr_func(tcalc, mode_lib->vba.TCalc);
+-
+-#define dml_get_pipe_attr_func(attr, var) double get_##attr(struct display_mode_lib *mode_lib, const display_e2e_pipe_params_st *pipes, unsigned int num_pipes, unsigned int which_pipe) \
+-{\
+- unsigned int which_plane; \
+- recalculate_params(mode_lib, pipes, num_pipes); \
+- which_plane = mode_lib->vba.pipe_plane[which_pipe]; \
+- return var[which_plane]; \
+-}
+-
+-dml_get_pipe_attr_func(dsc_delay, mode_lib->vba.DSCDelay);
+-dml_get_pipe_attr_func(dppclk_calculated, mode_lib->vba.DPPCLK_calculated);
+-dml_get_pipe_attr_func(dscclk_calculated, mode_lib->vba.DSCCLK_calculated);
+-dml_get_pipe_attr_func(min_ttu_vblank, mode_lib->vba.MinTTUVBlank);
+-dml_get_pipe_attr_func(vratio_prefetch_l, mode_lib->vba.VRatioPrefetchY);
+-dml_get_pipe_attr_func(vratio_prefetch_c, mode_lib->vba.VRatioPrefetchC);
+-dml_get_pipe_attr_func(dst_x_after_scaler, mode_lib->vba.DSTXAfterScaler);
+-dml_get_pipe_attr_func(dst_y_after_scaler, mode_lib->vba.DSTYAfterScaler);
+-dml_get_pipe_attr_func(dst_y_per_vm_vblank, mode_lib->vba.DestinationLinesToRequestVMInVBlank);
+-dml_get_pipe_attr_func(dst_y_per_row_vblank, mode_lib->vba.DestinationLinesToRequestRowInVBlank);
+-dml_get_pipe_attr_func(dst_y_prefetch, mode_lib->vba.DestinationLinesForPrefetch);
+-dml_get_pipe_attr_func(dst_y_per_vm_flip, mode_lib->vba.DestinationLinesToRequestVMInImmediateFlip);
+-dml_get_pipe_attr_func(
+- dst_y_per_row_flip,
+- mode_lib->vba.DestinationLinesToRequestRowInImmediateFlip);
+-
+-dml_get_pipe_attr_func(xfc_transfer_delay, mode_lib->vba.XFCTransferDelay);
+-dml_get_pipe_attr_func(xfc_precharge_delay, mode_lib->vba.XFCPrechargeDelay);
+-dml_get_pipe_attr_func(xfc_remote_surface_flip_latency, mode_lib->vba.XFCRemoteSurfaceFlipLatency);
+-dml_get_pipe_attr_func(xfc_prefetch_margin, mode_lib->vba.XFCPrefetchMargin);
+-
+-unsigned int get_vstartup_calculated(
+- struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *pipes,
+- unsigned int num_pipes,
+- unsigned int which_pipe)
+-{
+- unsigned int which_plane;
+-
+- recalculate_params(mode_lib, pipes, num_pipes);
+- which_plane = mode_lib->vba.pipe_plane[which_pipe];
+- return mode_lib->vba.VStartup[which_plane];
+-}
+-
+-double get_total_immediate_flip_bytes(
+- struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *pipes,
+- unsigned int num_pipes)
+-{
+- recalculate_params(mode_lib, pipes, num_pipes);
+- return mode_lib->vba.TotImmediateFlipBytes;
+-}
+-
+-double get_total_immediate_flip_bw(
+- struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *pipes,
+- unsigned int num_pipes)
+-{
+- recalculate_params(mode_lib, pipes, num_pipes);
+- return mode_lib->vba.ImmediateFlipBW;
+-}
+-
+-double get_total_prefetch_bw(
+- struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *pipes,
+- unsigned int num_pipes)
+-{
+- unsigned int k;
+- double total_prefetch_bw = 0.0;
+-
+- recalculate_params(mode_lib, pipes, num_pipes);
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k)
+- total_prefetch_bw += mode_lib->vba.PrefetchBandwidth[k];
+- return total_prefetch_bw;
+-}
+-
+-static void fetch_socbb_params(struct display_mode_lib *mode_lib)
+-{
+- soc_bounding_box_st *soc = &mode_lib->vba.soc;
+- unsigned int i;
+-
+- // SOC Bounding Box Parameters
+- mode_lib->vba.ReturnBusWidth = soc->return_bus_width_bytes;
+- mode_lib->vba.NumberOfChannels = soc->num_chans;
+- mode_lib->vba.PercentOfIdealDRAMAndFabricBWReceivedAfterUrgLatency =
+- soc->ideal_dram_bw_after_urgent_percent; // there's always that one bastard variable that's so long it throws everything out of alignment!
+- mode_lib->vba.UrgentLatency = soc->urgent_latency_us;
+- mode_lib->vba.RoundTripPingLatencyCycles = soc->round_trip_ping_latency_dcfclk_cycles;
+- mode_lib->vba.UrgentOutOfOrderReturnPerChannel =
+- soc->urgent_out_of_order_return_per_channel_bytes;
+- mode_lib->vba.WritebackLatency = soc->writeback_latency_us;
+- mode_lib->vba.SRExitTime = soc->sr_exit_time_us;
+- mode_lib->vba.SREnterPlusExitTime = soc->sr_enter_plus_exit_time_us;
+- mode_lib->vba.DRAMClockChangeLatency = soc->dram_clock_change_latency_us;
+- mode_lib->vba.Downspreading = soc->downspread_percent;
+- mode_lib->vba.DRAMChannelWidth = soc->dram_channel_width_bytes; // new!
+- mode_lib->vba.FabricDatapathToDCNDataReturn = soc->fabric_datapath_to_dcn_data_return_bytes; // new!
+- mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading = soc->dcn_downspread_percent; // new
+- mode_lib->vba.DISPCLKDPPCLKVCOSpeed = soc->dispclk_dppclk_vco_speed_mhz; // new
+- mode_lib->vba.VMMPageSize = soc->vmm_page_size_bytes;
+- // Set the voltage scaling clocks as the defaults. Most of these will
+- // be set to different values by the test
+- for (i = 0; i < DC__VOLTAGE_STATES; i++)
+- if (soc->clock_limits[i].state == mode_lib->vba.VoltageLevel)
+- break;
+-
+- mode_lib->vba.DCFCLK = soc->clock_limits[i].dcfclk_mhz;
+- mode_lib->vba.SOCCLK = soc->clock_limits[i].socclk_mhz;
+- mode_lib->vba.DRAMSpeed = soc->clock_limits[i].dram_speed_mhz;
+- mode_lib->vba.FabricClock = soc->clock_limits[i].fabricclk_mhz;
+-
+- mode_lib->vba.XFCBusTransportTime = soc->xfc_bus_transport_time_us;
+- mode_lib->vba.XFCXBUFLatencyTolerance = soc->xfc_xbuf_latency_tolerance_us;
+-
+- mode_lib->vba.SupportGFX7CompatibleTilingIn32bppAnd64bpp = false;
+- mode_lib->vba.MaxHSCLRatio = 4;
+- mode_lib->vba.MaxVSCLRatio = 4;
+- mode_lib->vba.MaxNumWriteback = 0; /*TODO*/
+- mode_lib->vba.WritebackLumaAndChromaScalingSupported = true;
+- mode_lib->vba.Cursor64BppSupport = true;
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- mode_lib->vba.DCFCLKPerState[i] = soc->clock_limits[i].dcfclk_mhz;
+- mode_lib->vba.FabricClockPerState[i] = soc->clock_limits[i].fabricclk_mhz;
+- mode_lib->vba.SOCCLKPerState[i] = soc->clock_limits[i].socclk_mhz;
+- mode_lib->vba.PHYCLKPerState[i] = soc->clock_limits[i].phyclk_mhz;
+- mode_lib->vba.MaxDppclk[i] = soc->clock_limits[i].dppclk_mhz;
+- mode_lib->vba.MaxDSCCLK[i] = soc->clock_limits[i].dscclk_mhz;
+- mode_lib->vba.DRAMSpeedPerState[i] = soc->clock_limits[i].dram_speed_mhz;
+- mode_lib->vba.MaxDispclk[i] = soc->clock_limits[i].dispclk_mhz;
+- }
+-}
+-
+-static void fetch_ip_params(struct display_mode_lib *mode_lib)
+-{
+- ip_params_st *ip = &mode_lib->vba.ip;
+-
+- // IP Parameters
+- mode_lib->vba.MaxNumDPP = ip->max_num_dpp;
+- mode_lib->vba.MaxNumOTG = ip->max_num_otg;
+- mode_lib->vba.CursorChunkSize = ip->cursor_chunk_size;
+- mode_lib->vba.CursorBufferSize = ip->cursor_buffer_size;
+-
+- mode_lib->vba.MaxDCHUBToPSCLThroughput = ip->max_dchub_pscl_bw_pix_per_clk;
+- mode_lib->vba.MaxPSCLToLBThroughput = ip->max_pscl_lb_bw_pix_per_clk;
+- mode_lib->vba.ROBBufferSizeInKByte = ip->rob_buffer_size_kbytes;
+- mode_lib->vba.DETBufferSizeInKByte = ip->det_buffer_size_kbytes;
+- mode_lib->vba.PixelChunkSizeInKByte = ip->pixel_chunk_size_kbytes;
+- mode_lib->vba.MetaChunkSize = ip->meta_chunk_size_kbytes;
+- mode_lib->vba.PTEChunkSize = ip->pte_chunk_size_kbytes;
+- mode_lib->vba.WritebackChunkSize = ip->writeback_chunk_size_kbytes;
+- mode_lib->vba.LineBufferSize = ip->line_buffer_size_bits;
+- mode_lib->vba.MaxLineBufferLines = ip->max_line_buffer_lines;
+- mode_lib->vba.PTEBufferSizeInRequests = ip->dpte_buffer_size_in_pte_reqs;
+- mode_lib->vba.DPPOutputBufferPixels = ip->dpp_output_buffer_pixels;
+- mode_lib->vba.OPPOutputBufferLines = ip->opp_output_buffer_lines;
+- mode_lib->vba.WritebackInterfaceLumaBufferSize = ip->writeback_luma_buffer_size_kbytes;
+- mode_lib->vba.WritebackInterfaceChromaBufferSize = ip->writeback_chroma_buffer_size_kbytes;
+- mode_lib->vba.WritebackChromaLineBufferWidth =
+- ip->writeback_chroma_line_buffer_width_pixels;
+- mode_lib->vba.MaxPageTableLevels = ip->max_page_table_levels;
+- mode_lib->vba.MaxInterDCNTileRepeaters = ip->max_inter_dcn_tile_repeaters;
+- mode_lib->vba.NumberOfDSC = ip->num_dsc;
+- mode_lib->vba.ODMCapability = ip->odm_capable;
+- mode_lib->vba.DISPCLKRampingMargin = ip->dispclk_ramp_margin_percent;
+-
+- mode_lib->vba.XFCSupported = ip->xfc_supported;
+- mode_lib->vba.XFCFillBWOverhead = ip->xfc_fill_bw_overhead_percent;
+- mode_lib->vba.XFCFillConstant = ip->xfc_fill_constant_bytes;
+- mode_lib->vba.DPPCLKDelaySubtotal = ip->dppclk_delay_subtotal;
+- mode_lib->vba.DPPCLKDelaySCL = ip->dppclk_delay_scl;
+- mode_lib->vba.DPPCLKDelaySCLLBOnly = ip->dppclk_delay_scl_lb_only;
+- mode_lib->vba.DPPCLKDelayCNVCFormater = ip->dppclk_delay_cnvc_formatter;
+- mode_lib->vba.DPPCLKDelayCNVCCursor = ip->dppclk_delay_cnvc_cursor;
+- mode_lib->vba.DISPCLKDelaySubtotal = ip->dispclk_delay_subtotal;
+-
+- mode_lib->vba.ProgressiveToInterlaceUnitInOPP = ip->ptoi_supported;
+-
+- mode_lib->vba.PDEProcessingBufIn64KBReqs = ip->pde_proc_buffer_size_64k_reqs;
+-}
+-
+-static void fetch_pipe_params(struct display_mode_lib *mode_lib)
+-{
+- display_e2e_pipe_params_st *pipes = mode_lib->vba.cache_pipes;
+- ip_params_st *ip = &mode_lib->vba.ip;
+-
+- unsigned int OTGInstPlane[DC__NUM_DPP__MAX];
+- unsigned int j, k;
+- bool PlaneVisited[DC__NUM_DPP__MAX];
+- bool visited[DC__NUM_DPP__MAX];
+-
+- // Convert Pipes to Planes
+- for (k = 0; k < mode_lib->vba.cache_num_pipes; ++k)
+- visited[k] = false;
+-
+- mode_lib->vba.NumberOfActivePlanes = 0;
+- for (j = 0; j < mode_lib->vba.cache_num_pipes; ++j) {
+- display_pipe_source_params_st *src = &pipes[j].pipe.src;
+- display_pipe_dest_params_st *dst = &pipes[j].pipe.dest;
+- scaler_ratio_depth_st *scl = &pipes[j].pipe.scale_ratio_depth;
+- scaler_taps_st *taps = &pipes[j].pipe.scale_taps;
+- display_output_params_st *dout = &pipes[j].dout;
+- display_clocks_and_cfg_st *clks = &pipes[j].clks_cfg;
+-
+- if (visited[j])
+- continue;
+- visited[j] = true;
+-
+- mode_lib->vba.pipe_plane[j] = mode_lib->vba.NumberOfActivePlanes;
+-
+- mode_lib->vba.DPPPerPlane[mode_lib->vba.NumberOfActivePlanes] = 1;
+- mode_lib->vba.SourceScan[mode_lib->vba.NumberOfActivePlanes] =
+- (enum scan_direction_class) (src->source_scan);
+- mode_lib->vba.ViewportWidth[mode_lib->vba.NumberOfActivePlanes] =
+- src->viewport_width;
+- mode_lib->vba.ViewportHeight[mode_lib->vba.NumberOfActivePlanes] =
+- src->viewport_height;
+- mode_lib->vba.ViewportYStartY[mode_lib->vba.NumberOfActivePlanes] =
+- src->viewport_y_y;
+- mode_lib->vba.ViewportYStartC[mode_lib->vba.NumberOfActivePlanes] =
+- src->viewport_y_c;
+- mode_lib->vba.PitchY[mode_lib->vba.NumberOfActivePlanes] = src->data_pitch;
+- mode_lib->vba.PitchC[mode_lib->vba.NumberOfActivePlanes] = src->data_pitch_c;
+- mode_lib->vba.DCCMetaPitchY[mode_lib->vba.NumberOfActivePlanes] = src->meta_pitch;
+- mode_lib->vba.HRatio[mode_lib->vba.NumberOfActivePlanes] = scl->hscl_ratio;
+- mode_lib->vba.VRatio[mode_lib->vba.NumberOfActivePlanes] = scl->vscl_ratio;
+- mode_lib->vba.ScalerEnabled[mode_lib->vba.NumberOfActivePlanes] = scl->scl_enable;
+- mode_lib->vba.Interlace[mode_lib->vba.NumberOfActivePlanes] = dst->interlaced;
+- if (mode_lib->vba.Interlace[mode_lib->vba.NumberOfActivePlanes])
+- mode_lib->vba.VRatio[mode_lib->vba.NumberOfActivePlanes] *= 2.0;
+- mode_lib->vba.htaps[mode_lib->vba.NumberOfActivePlanes] = taps->htaps;
+- mode_lib->vba.vtaps[mode_lib->vba.NumberOfActivePlanes] = taps->vtaps;
+- mode_lib->vba.HTAPsChroma[mode_lib->vba.NumberOfActivePlanes] = taps->htaps_c;
+- mode_lib->vba.VTAPsChroma[mode_lib->vba.NumberOfActivePlanes] = taps->vtaps_c;
+- mode_lib->vba.HTotal[mode_lib->vba.NumberOfActivePlanes] = dst->htotal;
+- mode_lib->vba.VTotal[mode_lib->vba.NumberOfActivePlanes] = dst->vtotal;
+- mode_lib->vba.DCCEnable[mode_lib->vba.NumberOfActivePlanes] =
+- src->dcc_use_global ?
+- ip->dcc_supported : src->dcc && ip->dcc_supported;
+- mode_lib->vba.DCCRate[mode_lib->vba.NumberOfActivePlanes] = src->dcc_rate;
+- mode_lib->vba.SourcePixelFormat[mode_lib->vba.NumberOfActivePlanes] =
+- (enum source_format_class) (src->source_format);
+- mode_lib->vba.HActive[mode_lib->vba.NumberOfActivePlanes] = dst->hactive;
+- mode_lib->vba.VActive[mode_lib->vba.NumberOfActivePlanes] = dst->vactive;
+- mode_lib->vba.SurfaceTiling[mode_lib->vba.NumberOfActivePlanes] =
+- (enum dm_swizzle_mode) (src->sw_mode);
+- mode_lib->vba.ScalerRecoutWidth[mode_lib->vba.NumberOfActivePlanes] =
+- dst->recout_width; // TODO: or should this be full_recout_width???...maybe only when in hsplit mode?
+- mode_lib->vba.ODMCombineEnabled[mode_lib->vba.NumberOfActivePlanes] =
+- dst->odm_combine;
+- mode_lib->vba.OutputFormat[mode_lib->vba.NumberOfActivePlanes] =
+- (enum output_format_class) (dout->output_format);
+- mode_lib->vba.Output[mode_lib->vba.NumberOfActivePlanes] =
+- (enum output_encoder_class) (dout->output_type);
+- mode_lib->vba.OutputBpp[mode_lib->vba.NumberOfActivePlanes] = dout->output_bpp;
+- mode_lib->vba.OutputLinkDPLanes[mode_lib->vba.NumberOfActivePlanes] =
+- dout->dp_lanes;
+- mode_lib->vba.DSCEnabled[mode_lib->vba.NumberOfActivePlanes] = dout->dsc_enable;
+- mode_lib->vba.NumberOfDSCSlices[mode_lib->vba.NumberOfActivePlanes] =
+- dout->dsc_slices;
+- mode_lib->vba.DSCInputBitPerComponent[mode_lib->vba.NumberOfActivePlanes] =
+- dout->opp_input_bpc == 0 ? 12 : dout->opp_input_bpc;
+- mode_lib->vba.WritebackEnable[mode_lib->vba.NumberOfActivePlanes] = dout->wb_enable;
+- mode_lib->vba.WritebackSourceHeight[mode_lib->vba.NumberOfActivePlanes] =
+- dout->wb.wb_src_height;
+- mode_lib->vba.WritebackDestinationWidth[mode_lib->vba.NumberOfActivePlanes] =
+- dout->wb.wb_dst_width;
+- mode_lib->vba.WritebackDestinationHeight[mode_lib->vba.NumberOfActivePlanes] =
+- dout->wb.wb_dst_height;
+- mode_lib->vba.WritebackPixelFormat[mode_lib->vba.NumberOfActivePlanes] =
+- (enum source_format_class) (dout->wb.wb_pixel_format);
+- mode_lib->vba.WritebackLumaHTaps[mode_lib->vba.NumberOfActivePlanes] =
+- dout->wb.wb_htaps_luma;
+- mode_lib->vba.WritebackLumaVTaps[mode_lib->vba.NumberOfActivePlanes] =
+- dout->wb.wb_vtaps_luma;
+- mode_lib->vba.WritebackChromaHTaps[mode_lib->vba.NumberOfActivePlanes] =
+- dout->wb.wb_htaps_chroma;
+- mode_lib->vba.WritebackChromaVTaps[mode_lib->vba.NumberOfActivePlanes] =
+- dout->wb.wb_vtaps_chroma;
+- mode_lib->vba.WritebackHRatio[mode_lib->vba.NumberOfActivePlanes] =
+- dout->wb.wb_hratio;
+- mode_lib->vba.WritebackVRatio[mode_lib->vba.NumberOfActivePlanes] =
+- dout->wb.wb_vratio;
+-
+- mode_lib->vba.DynamicMetadataEnable[mode_lib->vba.NumberOfActivePlanes] =
+- src->dynamic_metadata_enable;
+- mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired[mode_lib->vba.NumberOfActivePlanes] =
+- src->dynamic_metadata_lines_before_active;
+- mode_lib->vba.DynamicMetadataTransmittedBytes[mode_lib->vba.NumberOfActivePlanes] =
+- src->dynamic_metadata_xmit_bytes;
+-
+- mode_lib->vba.XFCEnabled[mode_lib->vba.NumberOfActivePlanes] = src->xfc_enable
+- && ip->xfc_supported;
+- mode_lib->vba.XFCSlvChunkSize = src->xfc_params.xfc_slv_chunk_size_bytes;
+- mode_lib->vba.XFCTSlvVupdateOffset = src->xfc_params.xfc_tslv_vupdate_offset_us;
+- mode_lib->vba.XFCTSlvVupdateWidth = src->xfc_params.xfc_tslv_vupdate_width_us;
+- mode_lib->vba.XFCTSlvVreadyOffset = src->xfc_params.xfc_tslv_vready_offset_us;
+- mode_lib->vba.PixelClock[mode_lib->vba.NumberOfActivePlanes] = dst->pixel_rate_mhz;
+- mode_lib->vba.DPPCLK[mode_lib->vba.NumberOfActivePlanes] = clks->dppclk_mhz;
+- if (ip->is_line_buffer_bpp_fixed)
+- mode_lib->vba.LBBitPerPixel[mode_lib->vba.NumberOfActivePlanes] =
+- ip->line_buffer_fixed_bpp;
+- else {
+- unsigned int lb_depth;
+-
+- switch (scl->lb_depth) {
+- case dm_lb_6:
+- lb_depth = 18;
+- break;
+- case dm_lb_8:
+- lb_depth = 24;
+- break;
+- case dm_lb_10:
+- lb_depth = 30;
+- break;
+- case dm_lb_12:
+- lb_depth = 36;
+- break;
+- case dm_lb_16:
+- lb_depth = 48;
+- break;
+- default:
+- lb_depth = 36;
+- }
+- mode_lib->vba.LBBitPerPixel[mode_lib->vba.NumberOfActivePlanes] = lb_depth;
+- }
+- mode_lib->vba.NumberOfCursors[mode_lib->vba.NumberOfActivePlanes] = 0;
+- // The DML spreadsheet assumes that the two cursors utilize the same amount of bandwidth. We'll
+- // calculate things a little more accurately
+- for (k = 0; k < DC__NUM_CURSOR__MAX; ++k) {
+- switch (k) {
+- case 0:
+- mode_lib->vba.CursorBPP[mode_lib->vba.NumberOfActivePlanes][0] =
+- CursorBppEnumToBits(
+- (enum cursor_bpp) (src->cur0_bpp));
+- mode_lib->vba.CursorWidth[mode_lib->vba.NumberOfActivePlanes][0] =
+- src->cur0_src_width;
+- if (src->cur0_src_width > 0)
+- mode_lib->vba.NumberOfCursors[mode_lib->vba.NumberOfActivePlanes]++;
+- break;
+- case 1:
+- mode_lib->vba.CursorBPP[mode_lib->vba.NumberOfActivePlanes][1] =
+- CursorBppEnumToBits(
+- (enum cursor_bpp) (src->cur1_bpp));
+- mode_lib->vba.CursorWidth[mode_lib->vba.NumberOfActivePlanes][1] =
+- src->cur1_src_width;
+- if (src->cur1_src_width > 0)
+- mode_lib->vba.NumberOfCursors[mode_lib->vba.NumberOfActivePlanes]++;
+- break;
+- default:
+- dml_print(
+- "ERROR: Number of cursors specified exceeds supported maximum\n")
+- ;
+- }
+- }
+-
+- OTGInstPlane[mode_lib->vba.NumberOfActivePlanes] = dst->otg_inst;
+-
+- if (dst->odm_combine && !src->is_hsplit)
+- dml_print(
+- "ERROR: ODM Combine is specified but is_hsplit has not be specified for pipe %i\n",
+- j);
+-
+- if (src->is_hsplit) {
+- for (k = j + 1; k < mode_lib->vba.cache_num_pipes; ++k) {
+- display_pipe_source_params_st *src_k = &pipes[k].pipe.src;
+- display_output_params_st *dout_k = &pipes[k].dout;
+-
+- if (src_k->is_hsplit && !visited[k]
+- && src->hsplit_grp == src_k->hsplit_grp) {
+- mode_lib->vba.pipe_plane[k] =
+- mode_lib->vba.NumberOfActivePlanes;
+- mode_lib->vba.DPPPerPlane[mode_lib->vba.NumberOfActivePlanes]++;
+- if (mode_lib->vba.SourceScan[mode_lib->vba.NumberOfActivePlanes]
+- == dm_horz)
+- mode_lib->vba.ViewportWidth[mode_lib->vba.NumberOfActivePlanes] +=
+- src_k->viewport_width;
+- else
+- mode_lib->vba.ViewportHeight[mode_lib->vba.NumberOfActivePlanes] +=
+- src_k->viewport_height;
+-
+- mode_lib->vba.NumberOfDSCSlices[mode_lib->vba.NumberOfActivePlanes] +=
+- dout_k->dsc_slices;
+- visited[k] = true;
+- }
+- }
+- }
+-
+- mode_lib->vba.NumberOfActivePlanes++;
+- }
+-
+- // handle overlays through dml_ml->vba.BlendingAndTiming
+- // dml_ml->vba.BlendingAndTiming tells you which instance to look at to get timing, the so called 'master'
+-
+- for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j)
+- PlaneVisited[j] = false;
+-
+- for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) {
+- for (k = j + 1; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (!PlaneVisited[k] && OTGInstPlane[j] == OTGInstPlane[k]) {
+- // doesn't matter, so choose the smaller one
+- mode_lib->vba.BlendingAndTiming[j] = j;
+- PlaneVisited[j] = true;
+- mode_lib->vba.BlendingAndTiming[k] = j;
+- PlaneVisited[k] = true;
+- }
+- }
+-
+- if (!PlaneVisited[j]) {
+- mode_lib->vba.BlendingAndTiming[j] = j;
+- PlaneVisited[j] = true;
+- }
+- }
+-
+- // TODO: dml_ml->vba.ODMCombineEnabled => 2 * dml_ml->vba.DPPPerPlane...actually maybe not since all pipes are specified
+- // Do we want the dscclk to automatically be halved? Guess not since the value is specified
+-
+- mode_lib->vba.SynchronizedVBlank = pipes[0].pipe.dest.synchronized_vblank_all_planes;
+- for (k = 1; k < mode_lib->vba.cache_num_pipes; ++k)
+- ASSERT(mode_lib->vba.SynchronizedVBlank == pipes[k].pipe.dest.synchronized_vblank_all_planes);
+-
+- mode_lib->vba.VirtualMemoryEnable = false;
+- mode_lib->vba.OverridePageTableLevels = 0;
+-
+- for (k = 0; k < mode_lib->vba.cache_num_pipes; ++k) {
+- mode_lib->vba.VirtualMemoryEnable = mode_lib->vba.VirtualMemoryEnable
+- || !!pipes[k].pipe.src.vm;
+- mode_lib->vba.OverridePageTableLevels =
+- (pipes[k].pipe.src.vm_levels_force_en
+- && mode_lib->vba.OverridePageTableLevels
+- < pipes[k].pipe.src.vm_levels_force) ?
+- pipes[k].pipe.src.vm_levels_force :
+- mode_lib->vba.OverridePageTableLevels;
+- }
+-
+- if (mode_lib->vba.OverridePageTableLevels)
+- mode_lib->vba.MaxPageTableLevels = mode_lib->vba.OverridePageTableLevels;
+-
+- mode_lib->vba.VirtualMemoryEnable = mode_lib->vba.VirtualMemoryEnable && !!ip->pte_enable;
+-
+- mode_lib->vba.FabricAndDRAMBandwidth = dml_min(
+- mode_lib->vba.DRAMSpeed * mode_lib->vba.NumberOfChannels
+- * mode_lib->vba.DRAMChannelWidth,
+- mode_lib->vba.FabricClock * mode_lib->vba.FabricDatapathToDCNDataReturn)
+- / 1000.0;
+-
+- // TODO: Must be consistent across all pipes
+- // DCCProgrammingAssumesScanDirectionUnknown = src.dcc_scan_dir_unknown;
+-}
+-
+-static void recalculate(struct display_mode_lib *mode_lib)
+-{
+- ModeSupportAndSystemConfiguration(mode_lib);
+- PixelClockAdjustmentForProgressiveToInterlaceUnit(mode_lib);
+- DisplayPipeConfiguration(mode_lib);
+- DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(mode_lib);
+-}
+-
+-// in wm mode we pull the parameters needed from the display_e2e_pipe_params_st structs
+-// rather than working them out as in recalculate_ms
+-static void recalculate_params(
+- struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *pipes,
+- unsigned int num_pipes)
+-{
+- // This is only safe to use memcmp because there are non-POD types in struct display_mode_lib
+- if (memcmp(&mode_lib->soc, &mode_lib->vba.soc, sizeof(mode_lib->vba.soc)) != 0
+- || memcmp(&mode_lib->ip, &mode_lib->vba.ip, sizeof(mode_lib->vba.ip)) != 0
+- || num_pipes != mode_lib->vba.cache_num_pipes
+- || memcmp(
+- pipes,
+- mode_lib->vba.cache_pipes,
+- sizeof(display_e2e_pipe_params_st) * num_pipes) != 0) {
+- mode_lib->vba.soc = mode_lib->soc;
+- mode_lib->vba.ip = mode_lib->ip;
+- memcpy(mode_lib->vba.cache_pipes, pipes, sizeof(*pipes) * num_pipes);
+- mode_lib->vba.cache_num_pipes = num_pipes;
+- recalculate(mode_lib);
+- }
+-}
+-
+-static void ModeSupportAndSystemConfiguration(struct display_mode_lib *mode_lib)
+-{
+- soc_bounding_box_st *soc = &mode_lib->vba.soc;
+- unsigned int i, k;
+- unsigned int total_pipes = 0;
+-
+- mode_lib->vba.VoltageLevel = mode_lib->vba.cache_pipes[0].clks_cfg.voltage;
+- for (i = 1; i < mode_lib->vba.cache_num_pipes; ++i)
+- ASSERT(mode_lib->vba.VoltageLevel == -1 || mode_lib->vba.VoltageLevel == mode_lib->vba.cache_pipes[i].clks_cfg.voltage);
+-
+- mode_lib->vba.DCFCLK = mode_lib->vba.cache_pipes[0].clks_cfg.dcfclk_mhz;
+- mode_lib->vba.SOCCLK = mode_lib->vba.cache_pipes[0].clks_cfg.socclk_mhz;
+-
+- if (mode_lib->vba.cache_pipes[0].clks_cfg.dispclk_mhz > 0.0)
+- mode_lib->vba.DISPCLK = mode_lib->vba.cache_pipes[0].clks_cfg.dispclk_mhz;
+- else
+- mode_lib->vba.DISPCLK = soc->clock_limits[mode_lib->vba.VoltageLevel].dispclk_mhz;
+-
+- fetch_socbb_params(mode_lib);
+- fetch_ip_params(mode_lib);
+- fetch_pipe_params(mode_lib);
+-
+- // Total Available Pipes Support Check
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k)
+- total_pipes += mode_lib->vba.DPPPerPlane[k];
+- ASSERT(total_pipes <= DC__NUM_DPP__MAX);
+-}
+-
+-static double adjust_ReturnBW(
+- struct display_mode_lib *mode_lib,
+- double ReturnBW,
+- bool DCCEnabledAnyPlane,
+- double ReturnBandwidthToDCN)
+-{
+- double CriticalCompression;
+-
+- if (DCCEnabledAnyPlane
+- && ReturnBandwidthToDCN
+- > mode_lib->vba.DCFCLK * mode_lib->vba.ReturnBusWidth / 4.0)
+- ReturnBW =
+- dml_min(
+- ReturnBW,
+- ReturnBandwidthToDCN * 4
+- * (1.0
+- - mode_lib->vba.UrgentLatency
+- / ((mode_lib->vba.ROBBufferSizeInKByte
+- - mode_lib->vba.PixelChunkSizeInKByte)
+- * 1024
+- / ReturnBandwidthToDCN
+- - mode_lib->vba.DCFCLK
+- * mode_lib->vba.ReturnBusWidth
+- / 4)
+- + mode_lib->vba.UrgentLatency));
+-
+- CriticalCompression = 2.0 * mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLK
+- * mode_lib->vba.UrgentLatency
+- / (ReturnBandwidthToDCN * mode_lib->vba.UrgentLatency
+- + (mode_lib->vba.ROBBufferSizeInKByte
+- - mode_lib->vba.PixelChunkSizeInKByte)
+- * 1024);
+-
+- if (DCCEnabledAnyPlane && CriticalCompression > 1.0 && CriticalCompression < 4.0)
+- ReturnBW =
+- dml_min(
+- ReturnBW,
+- 4.0 * ReturnBandwidthToDCN
+- * (mode_lib->vba.ROBBufferSizeInKByte
+- - mode_lib->vba.PixelChunkSizeInKByte)
+- * 1024
+- * mode_lib->vba.ReturnBusWidth
+- * mode_lib->vba.DCFCLK
+- * mode_lib->vba.UrgentLatency
+- / dml_pow(
+- (ReturnBandwidthToDCN
+- * mode_lib->vba.UrgentLatency
+- + (mode_lib->vba.ROBBufferSizeInKByte
+- - mode_lib->vba.PixelChunkSizeInKByte)
+- * 1024),
+- 2));
+-
+- return ReturnBW;
+-}
+-
+-static unsigned int dscceComputeDelay(
+- unsigned int bpc,
+- double bpp,
+- unsigned int sliceWidth,
+- unsigned int numSlices,
+- enum output_format_class pixelFormat)
+-{
+- // valid bpc = source bits per component in the set of {8, 10, 12}
+- // valid bpp = increments of 1/16 of a bit
+- // min = 6/7/8 in N420/N422/444, respectively
+- // max = such that compression is 1:1
+- //valid sliceWidth = number of pixels per slice line, must be less than or equal to 5184/numSlices (or 4096/numSlices in 420 mode)
+- //valid numSlices = number of slices in the horiziontal direction per DSC engine in the set of {1, 2, 3, 4}
+- //valid pixelFormat = pixel/color format in the set of {:N444_RGB, :S422, :N422, :N420}
+-
+- // fixed value
+- unsigned int rcModelSize = 8192;
+-
+- // N422/N420 operate at 2 pixels per clock
+- unsigned int pixelsPerClock, lstall, D, initalXmitDelay, w, s, ix, wx, p, l0, a, ax, l,
+- Delay, pixels;
+-
+- if (pixelFormat == dm_n422 || pixelFormat == dm_420)
+- pixelsPerClock = 2;
+- // #all other modes operate at 1 pixel per clock
+- else
+- pixelsPerClock = 1;
+-
+- //initial transmit delay as per PPS
+- initalXmitDelay = dml_round(rcModelSize / 2.0 / bpp / pixelsPerClock);
+-
+- //compute ssm delay
+- if (bpc == 8)
+- D = 81;
+- else if (bpc == 10)
+- D = 89;
+- else
+- D = 113;
+-
+- //divide by pixel per cycle to compute slice width as seen by DSC
+- w = sliceWidth / pixelsPerClock;
+-
+- //422 mode has an additional cycle of delay
+- if (pixelFormat == dm_s422)
+- s = 1;
+- else
+- s = 0;
+-
+- //main calculation for the dscce
+- ix = initalXmitDelay + 45;
+- wx = (w + 2) / 3;
+- p = 3 * wx - w;
+- l0 = ix / w;
+- a = ix + p * l0;
+- ax = (a + 2) / 3 + D + 6 + 1;
+- l = (ax + wx - 1) / wx;
+- if ((ix % w) == 0 && p != 0)
+- lstall = 1;
+- else
+- lstall = 0;
+- Delay = l * wx * (numSlices - 1) + ax + s + lstall + 22;
+-
+- //dsc processes 3 pixel containers per cycle and a container can contain 1 or 2 pixels
+- pixels = Delay * 3 * pixelsPerClock;
+- return pixels;
+-}
+-
+-static unsigned int dscComputeDelay(enum output_format_class pixelFormat)
+-{
+- unsigned int Delay = 0;
+-
+- if (pixelFormat == dm_420) {
+- // sfr
+- Delay = Delay + 2;
+- // dsccif
+- Delay = Delay + 0;
+- // dscc - input deserializer
+- Delay = Delay + 3;
+- // dscc gets pixels every other cycle
+- Delay = Delay + 2;
+- // dscc - input cdc fifo
+- Delay = Delay + 12;
+- // dscc gets pixels every other cycle
+- Delay = Delay + 13;
+- // dscc - cdc uncertainty
+- Delay = Delay + 2;
+- // dscc - output cdc fifo
+- Delay = Delay + 7;
+- // dscc gets pixels every other cycle
+- Delay = Delay + 3;
+- // dscc - cdc uncertainty
+- Delay = Delay + 2;
+- // dscc - output serializer
+- Delay = Delay + 1;
+- // sft
+- Delay = Delay + 1;
+- } else if (pixelFormat == dm_n422) {
+- // sfr
+- Delay = Delay + 2;
+- // dsccif
+- Delay = Delay + 1;
+- // dscc - input deserializer
+- Delay = Delay + 5;
+- // dscc - input cdc fifo
+- Delay = Delay + 25;
+- // dscc - cdc uncertainty
+- Delay = Delay + 2;
+- // dscc - output cdc fifo
+- Delay = Delay + 10;
+- // dscc - cdc uncertainty
+- Delay = Delay + 2;
+- // dscc - output serializer
+- Delay = Delay + 1;
+- // sft
+- Delay = Delay + 1;
+- } else {
+- // sfr
+- Delay = Delay + 2;
+- // dsccif
+- Delay = Delay + 0;
+- // dscc - input deserializer
+- Delay = Delay + 3;
+- // dscc - input cdc fifo
+- Delay = Delay + 12;
+- // dscc - cdc uncertainty
+- Delay = Delay + 2;
+- // dscc - output cdc fifo
+- Delay = Delay + 7;
+- // dscc - output serializer
+- Delay = Delay + 1;
+- // dscc - cdc uncertainty
+- Delay = Delay + 2;
+- // sft
+- Delay = Delay + 1;
+- }
+-
+- return Delay;
+-}
+-
+-static bool CalculatePrefetchSchedule(
+- struct display_mode_lib *mode_lib,
+- double DPPCLK,
+- double DISPCLK,
+- double PixelClock,
+- double DCFClkDeepSleep,
+- unsigned int DSCDelay,
+- unsigned int DPPPerPlane,
+- bool ScalerEnabled,
+- unsigned int NumberOfCursors,
+- double DPPCLKDelaySubtotal,
+- double DPPCLKDelaySCL,
+- double DPPCLKDelaySCLLBOnly,
+- double DPPCLKDelayCNVCFormater,
+- double DPPCLKDelayCNVCCursor,
+- double DISPCLKDelaySubtotal,
+- unsigned int ScalerRecoutWidth,
+- enum output_format_class OutputFormat,
+- unsigned int VBlank,
+- unsigned int HTotal,
+- unsigned int MaxInterDCNTileRepeaters,
+- unsigned int VStartup,
+- unsigned int PageTableLevels,
+- bool VirtualMemoryEnable,
+- bool DynamicMetadataEnable,
+- unsigned int DynamicMetadataLinesBeforeActiveRequired,
+- unsigned int DynamicMetadataTransmittedBytes,
+- bool DCCEnable,
+- double UrgentLatency,
+- double UrgentExtraLatency,
+- double TCalc,
+- unsigned int PDEAndMetaPTEBytesFrame,
+- unsigned int MetaRowByte,
+- unsigned int PixelPTEBytesPerRow,
+- double PrefetchSourceLinesY,
+- unsigned int SwathWidthY,
+- double BytePerPixelDETY,
+- double VInitPreFillY,
+- unsigned int MaxNumSwathY,
+- double PrefetchSourceLinesC,
+- double BytePerPixelDETC,
+- double VInitPreFillC,
+- unsigned int MaxNumSwathC,
+- unsigned int SwathHeightY,
+- unsigned int SwathHeightC,
+- double TWait,
+- bool XFCEnabled,
+- double XFCRemoteSurfaceFlipDelay,
+- bool InterlaceEnable,
+- bool ProgressiveToInterlaceUnitInOPP,
+- double *DSTXAfterScaler,
+- double *DSTYAfterScaler,
+- double *DestinationLinesForPrefetch,
+- double *PrefetchBandwidth,
+- double *DestinationLinesToRequestVMInVBlank,
+- double *DestinationLinesToRequestRowInVBlank,
+- double *VRatioPrefetchY,
+- double *VRatioPrefetchC,
+- double *RequiredPrefetchPixDataBW,
+- unsigned int *VStartupRequiredWhenNotEnoughTimeForDynamicMetadata,
+- double *Tno_bw,
+- unsigned int *VUpdateOffsetPix,
+- unsigned int *VUpdateWidthPix,
+- unsigned int *VReadyOffsetPix)
+-{
+- bool MyError = false;
+- unsigned int DPPCycles, DISPCLKCycles;
+- double DSTTotalPixelsAfterScaler, TotalRepeaterDelayTime;
+- double Tdm, LineTime, Tsetup;
+- double dst_y_prefetch_equ;
+- double Tsw_oto;
+- double prefetch_bw_oto;
+- double Tvm_oto;
+- double Tr0_oto;
+- double Tpre_oto;
+- double dst_y_prefetch_oto;
+- double TimeForFetchingMetaPTE = 0;
+- double TimeForFetchingRowInVBlank = 0;
+- double LinesToRequestPrefetchPixelData = 0;
+-
+- if (ScalerEnabled)
+- DPPCycles = DPPCLKDelaySubtotal + DPPCLKDelaySCL;
+- else
+- DPPCycles = DPPCLKDelaySubtotal + DPPCLKDelaySCLLBOnly;
+-
+- DPPCycles = DPPCycles + DPPCLKDelayCNVCFormater + NumberOfCursors * DPPCLKDelayCNVCCursor;
+-
+- DISPCLKCycles = DISPCLKDelaySubtotal;
+-
+- if (DPPCLK == 0.0 || DISPCLK == 0.0)
+- return true;
+-
+- *DSTXAfterScaler = DPPCycles * PixelClock / DPPCLK + DISPCLKCycles * PixelClock / DISPCLK
+- + DSCDelay;
+-
+- if (DPPPerPlane > 1)
+- *DSTXAfterScaler = *DSTXAfterScaler + ScalerRecoutWidth;
+-
+- if (OutputFormat == dm_420 || (InterlaceEnable && ProgressiveToInterlaceUnitInOPP))
+- *DSTYAfterScaler = 1;
+- else
+- *DSTYAfterScaler = 0;
+-
+- DSTTotalPixelsAfterScaler = ((double) (*DSTYAfterScaler * HTotal)) + *DSTXAfterScaler;
+- *DSTYAfterScaler = dml_floor(DSTTotalPixelsAfterScaler / HTotal, 1);
+- *DSTXAfterScaler = DSTTotalPixelsAfterScaler - ((double) (*DSTYAfterScaler * HTotal));
+-
+- *VUpdateOffsetPix = dml_ceil(HTotal / 4.0, 1);
+- TotalRepeaterDelayTime = MaxInterDCNTileRepeaters * (2.0 / DPPCLK + 3.0 / DISPCLK);
+- *VUpdateWidthPix = (14.0 / DCFClkDeepSleep + 12.0 / DPPCLK + TotalRepeaterDelayTime)
+- * PixelClock;
+-
+- *VReadyOffsetPix = dml_max(
+- 150.0 / DPPCLK,
+- TotalRepeaterDelayTime + 20.0 / DCFClkDeepSleep + 10.0 / DPPCLK)
+- * PixelClock;
+-
+- Tsetup = (double) (*VUpdateOffsetPix + *VUpdateWidthPix + *VReadyOffsetPix) / PixelClock;
+-
+- LineTime = (double) HTotal / PixelClock;
+-
+- if (DynamicMetadataEnable) {
+- double Tdmbf, Tdmec, Tdmsks;
+-
+- Tdm = dml_max(0.0, UrgentExtraLatency - TCalc);
+- Tdmbf = DynamicMetadataTransmittedBytes / 4.0 / DISPCLK;
+- Tdmec = LineTime;
+- if (DynamicMetadataLinesBeforeActiveRequired == 0)
+- Tdmsks = VBlank * LineTime / 2.0;
+- else
+- Tdmsks = DynamicMetadataLinesBeforeActiveRequired * LineTime;
+- if (InterlaceEnable && !ProgressiveToInterlaceUnitInOPP)
+- Tdmsks = Tdmsks / 2;
+- if (VStartup * LineTime
+- < Tsetup + TWait + UrgentExtraLatency + Tdmbf + Tdmec + Tdmsks) {
+- MyError = true;
+- *VStartupRequiredWhenNotEnoughTimeForDynamicMetadata = (Tsetup + TWait
+- + UrgentExtraLatency + Tdmbf + Tdmec + Tdmsks) / LineTime;
+- } else
+- *VStartupRequiredWhenNotEnoughTimeForDynamicMetadata = 0.0;
+- } else
+- Tdm = 0;
+-
+- if (VirtualMemoryEnable) {
+- if (PageTableLevels == 4)
+- *Tno_bw = UrgentExtraLatency + UrgentLatency;
+- else if (PageTableLevels == 3)
+- *Tno_bw = UrgentExtraLatency;
+- else
+- *Tno_bw = 0;
+- } else if (DCCEnable)
+- *Tno_bw = LineTime;
+- else
+- *Tno_bw = LineTime / 4;
+-
+- dst_y_prefetch_equ = VStartup - dml_max(TCalc + TWait, XFCRemoteSurfaceFlipDelay) / LineTime
+- - (Tsetup + Tdm) / LineTime
+- - (*DSTYAfterScaler + *DSTXAfterScaler / HTotal);
+-
+- Tsw_oto = dml_max(PrefetchSourceLinesY, PrefetchSourceLinesC) * LineTime;
+-
+- prefetch_bw_oto = (MetaRowByte + PixelPTEBytesPerRow
+- + PrefetchSourceLinesY * SwathWidthY * dml_ceil(BytePerPixelDETY, 1)
+- + PrefetchSourceLinesC * SwathWidthY / 2 * dml_ceil(BytePerPixelDETC, 2))
+- / Tsw_oto;
+-
+- if (VirtualMemoryEnable == true) {
+- Tvm_oto =
+- dml_max(
+- *Tno_bw + PDEAndMetaPTEBytesFrame / prefetch_bw_oto,
+- dml_max(
+- UrgentExtraLatency
+- + UrgentLatency
+- * (PageTableLevels
+- - 1),
+- LineTime / 4.0));
+- } else
+- Tvm_oto = LineTime / 4.0;
+-
+- if ((VirtualMemoryEnable == true || DCCEnable == true)) {
+- Tr0_oto = dml_max(
+- (MetaRowByte + PixelPTEBytesPerRow) / prefetch_bw_oto,
+- dml_max(UrgentLatency, dml_max(LineTime - Tvm_oto, LineTime / 4)));
+- } else
+- Tr0_oto = LineTime - Tvm_oto;
+-
+- Tpre_oto = Tvm_oto + Tr0_oto + Tsw_oto;
+-
+- dst_y_prefetch_oto = Tpre_oto / LineTime;
+-
+- if (dst_y_prefetch_oto < dst_y_prefetch_equ)
+- *DestinationLinesForPrefetch = dst_y_prefetch_oto;
+- else
+- *DestinationLinesForPrefetch = dst_y_prefetch_equ;
+-
+- *DestinationLinesForPrefetch = dml_floor(4.0 * (*DestinationLinesForPrefetch + 0.125), 1)
+- / 4;
+-
+- dml_print("DML: VStartup: %d\n", VStartup);
+- dml_print("DML: TCalc: %f\n", TCalc);
+- dml_print("DML: TWait: %f\n", TWait);
+- dml_print("DML: XFCRemoteSurfaceFlipDelay: %f\n", XFCRemoteSurfaceFlipDelay);
+- dml_print("DML: LineTime: %f\n", LineTime);
+- dml_print("DML: Tsetup: %f\n", Tsetup);
+- dml_print("DML: Tdm: %f\n", Tdm);
+- dml_print("DML: DSTYAfterScaler: %f\n", *DSTYAfterScaler);
+- dml_print("DML: DSTXAfterScaler: %f\n", *DSTXAfterScaler);
+- dml_print("DML: HTotal: %d\n", HTotal);
+-
+- *PrefetchBandwidth = 0;
+- *DestinationLinesToRequestVMInVBlank = 0;
+- *DestinationLinesToRequestRowInVBlank = 0;
+- *VRatioPrefetchY = 0;
+- *VRatioPrefetchC = 0;
+- *RequiredPrefetchPixDataBW = 0;
+- if (*DestinationLinesForPrefetch > 1) {
+- *PrefetchBandwidth = (PDEAndMetaPTEBytesFrame + 2 * MetaRowByte
+- + 2 * PixelPTEBytesPerRow
+- + PrefetchSourceLinesY * SwathWidthY * dml_ceil(BytePerPixelDETY, 1)
+- + PrefetchSourceLinesC * SwathWidthY / 2
+- * dml_ceil(BytePerPixelDETC, 2))
+- / (*DestinationLinesForPrefetch * LineTime - *Tno_bw);
+- if (VirtualMemoryEnable) {
+- TimeForFetchingMetaPTE =
+- dml_max(
+- *Tno_bw
+- + (double) PDEAndMetaPTEBytesFrame
+- / *PrefetchBandwidth,
+- dml_max(
+- UrgentExtraLatency
+- + UrgentLatency
+- * (PageTableLevels
+- - 1),
+- LineTime / 4));
+- } else {
+- if (NumberOfCursors > 0 || XFCEnabled)
+- TimeForFetchingMetaPTE = LineTime / 4;
+- else
+- TimeForFetchingMetaPTE = 0.0;
+- }
+-
+- if ((VirtualMemoryEnable == true || DCCEnable == true)) {
+- TimeForFetchingRowInVBlank =
+- dml_max(
+- (MetaRowByte + PixelPTEBytesPerRow)
+- / *PrefetchBandwidth,
+- dml_max(
+- UrgentLatency,
+- dml_max(
+- LineTime
+- - TimeForFetchingMetaPTE,
+- LineTime
+- / 4.0)));
+- } else {
+- if (NumberOfCursors > 0 || XFCEnabled)
+- TimeForFetchingRowInVBlank = LineTime - TimeForFetchingMetaPTE;
+- else
+- TimeForFetchingRowInVBlank = 0.0;
+- }
+-
+- *DestinationLinesToRequestVMInVBlank = dml_floor(
+- 4.0 * (TimeForFetchingMetaPTE / LineTime + 0.125),
+- 1) / 4.0;
+-
+- *DestinationLinesToRequestRowInVBlank = dml_floor(
+- 4.0 * (TimeForFetchingRowInVBlank / LineTime + 0.125),
+- 1) / 4.0;
+-
+- LinesToRequestPrefetchPixelData =
+- *DestinationLinesForPrefetch
+- - ((NumberOfCursors > 0 || VirtualMemoryEnable
+- || DCCEnable) ?
+- (*DestinationLinesToRequestVMInVBlank
+- + *DestinationLinesToRequestRowInVBlank) :
+- 0.0);
+-
+- if (LinesToRequestPrefetchPixelData > 0) {
+-
+- *VRatioPrefetchY = (double) PrefetchSourceLinesY
+- / LinesToRequestPrefetchPixelData;
+- *VRatioPrefetchY = dml_max(*VRatioPrefetchY, 1.0);
+- if ((SwathHeightY > 4) && (VInitPreFillY > 3)) {
+- if (LinesToRequestPrefetchPixelData > (VInitPreFillY - 3.0) / 2.0) {
+- *VRatioPrefetchY =
+- dml_max(
+- (double) PrefetchSourceLinesY
+- / LinesToRequestPrefetchPixelData,
+- (double) MaxNumSwathY
+- * SwathHeightY
+- / (LinesToRequestPrefetchPixelData
+- - (VInitPreFillY
+- - 3.0)
+- / 2.0));
+- *VRatioPrefetchY = dml_max(*VRatioPrefetchY, 1.0);
+- } else {
+- MyError = true;
+- *VRatioPrefetchY = 0;
+- }
+- }
+-
+- *VRatioPrefetchC = (double) PrefetchSourceLinesC
+- / LinesToRequestPrefetchPixelData;
+- *VRatioPrefetchC = dml_max(*VRatioPrefetchC, 1.0);
+-
+- if ((SwathHeightC > 4)) {
+- if (LinesToRequestPrefetchPixelData > (VInitPreFillC - 3.0) / 2.0) {
+- *VRatioPrefetchC =
+- dml_max(
+- *VRatioPrefetchC,
+- (double) MaxNumSwathC
+- * SwathHeightC
+- / (LinesToRequestPrefetchPixelData
+- - (VInitPreFillC
+- - 3.0)
+- / 2.0));
+- *VRatioPrefetchC = dml_max(*VRatioPrefetchC, 1.0);
+- } else {
+- MyError = true;
+- *VRatioPrefetchC = 0;
+- }
+- }
+-
+- *RequiredPrefetchPixDataBW =
+- DPPPerPlane
+- * ((double) PrefetchSourceLinesY
+- / LinesToRequestPrefetchPixelData
+- * dml_ceil(
+- BytePerPixelDETY,
+- 1)
+- + (double) PrefetchSourceLinesC
+- / LinesToRequestPrefetchPixelData
+- * dml_ceil(
+- BytePerPixelDETC,
+- 2)
+- / 2)
+- * SwathWidthY / LineTime;
+- } else {
+- MyError = true;
+- *VRatioPrefetchY = 0;
+- *VRatioPrefetchC = 0;
+- *RequiredPrefetchPixDataBW = 0;
+- }
+-
+- } else {
+- MyError = true;
+- }
+-
+- if (MyError) {
+- *PrefetchBandwidth = 0;
+- TimeForFetchingMetaPTE = 0;
+- TimeForFetchingRowInVBlank = 0;
+- *DestinationLinesToRequestVMInVBlank = 0;
+- *DestinationLinesToRequestRowInVBlank = 0;
+- *DestinationLinesForPrefetch = 0;
+- LinesToRequestPrefetchPixelData = 0;
+- *VRatioPrefetchY = 0;
+- *VRatioPrefetchC = 0;
+- *RequiredPrefetchPixDataBW = 0;
+- }
+-
+- return MyError;
+-}
+-
+-static double RoundToDFSGranularityUp(double Clock, double VCOSpeed)
+-{
+- return VCOSpeed * 4 / dml_floor(VCOSpeed * 4 / Clock, 1);
+-}
+-
+-static double RoundToDFSGranularityDown(double Clock, double VCOSpeed)
+-{
+- return VCOSpeed * 4 / dml_ceil(VCOSpeed * 4 / Clock, 1);
+-}
+-
+-static double CalculatePrefetchSourceLines(
+- struct display_mode_lib *mode_lib,
+- double VRatio,
+- double vtaps,
+- bool Interlace,
+- bool ProgressiveToInterlaceUnitInOPP,
+- unsigned int SwathHeight,
+- unsigned int ViewportYStart,
+- double *VInitPreFill,
+- unsigned int *MaxNumSwath)
+-{
+- unsigned int MaxPartialSwath;
+-
+- if (ProgressiveToInterlaceUnitInOPP)
+- *VInitPreFill = dml_floor((VRatio + vtaps + 1) / 2.0, 1);
+- else
+- *VInitPreFill = dml_floor((VRatio + vtaps + 1 + Interlace * 0.5 * VRatio) / 2.0, 1);
+-
+- if (!mode_lib->vba.IgnoreViewportPositioning) {
+-
+- *MaxNumSwath = dml_ceil((*VInitPreFill - 1.0) / SwathHeight, 1) + 1.0;
+-
+- if (*VInitPreFill > 1.0)
+- MaxPartialSwath = (unsigned int) (*VInitPreFill - 2) % SwathHeight;
+- else
+- MaxPartialSwath = (unsigned int) (*VInitPreFill + SwathHeight - 2)
+- % SwathHeight;
+- MaxPartialSwath = dml_max(1U, MaxPartialSwath);
+-
+- } else {
+-
+- if (ViewportYStart != 0)
+- dml_print(
+- "WARNING DML: using viewport y position of 0 even though actual viewport y position is non-zero in prefetch source lines calculation\n");
+-
+- *MaxNumSwath = dml_ceil(*VInitPreFill / SwathHeight, 1);
+-
+- if (*VInitPreFill > 1.0)
+- MaxPartialSwath = (unsigned int) (*VInitPreFill - 1) % SwathHeight;
+- else
+- MaxPartialSwath = (unsigned int) (*VInitPreFill + SwathHeight - 1)
+- % SwathHeight;
+- }
+-
+- return *MaxNumSwath * SwathHeight + MaxPartialSwath;
+-}
+-
+-static unsigned int CalculateVMAndRowBytes(
+- struct display_mode_lib *mode_lib,
+- bool DCCEnable,
+- unsigned int BlockHeight256Bytes,
+- unsigned int BlockWidth256Bytes,
+- enum source_format_class SourcePixelFormat,
+- unsigned int SurfaceTiling,
+- unsigned int BytePerPixel,
+- enum scan_direction_class ScanDirection,
+- unsigned int ViewportWidth,
+- unsigned int ViewportHeight,
+- unsigned int SwathWidth,
+- bool VirtualMemoryEnable,
+- unsigned int VMMPageSize,
+- unsigned int PTEBufferSizeInRequests,
+- unsigned int PDEProcessingBufIn64KBReqs,
+- unsigned int Pitch,
+- unsigned int DCCMetaPitch,
+- unsigned int *MacroTileWidth,
+- unsigned int *MetaRowByte,
+- unsigned int *PixelPTEBytesPerRow,
+- bool *PTEBufferSizeNotExceeded,
+- unsigned int *dpte_row_height,
+- unsigned int *meta_row_height)
+-{
+- unsigned int MetaRequestHeight;
+- unsigned int MetaRequestWidth;
+- unsigned int MetaSurfWidth;
+- unsigned int MetaSurfHeight;
+- unsigned int MPDEBytesFrame;
+- unsigned int MetaPTEBytesFrame;
+- unsigned int DCCMetaSurfaceBytes;
+-
+- unsigned int MacroTileSizeBytes;
+- unsigned int MacroTileHeight;
+- unsigned int DPDE0BytesFrame;
+- unsigned int ExtraDPDEBytesFrame;
+- unsigned int PDEAndMetaPTEBytesFrame;
+-
+- if (DCCEnable == true) {
+- MetaRequestHeight = 8 * BlockHeight256Bytes;
+- MetaRequestWidth = 8 * BlockWidth256Bytes;
+- if (ScanDirection == dm_horz) {
+- *meta_row_height = MetaRequestHeight;
+- MetaSurfWidth = dml_ceil((double) SwathWidth - 1, MetaRequestWidth)
+- + MetaRequestWidth;
+- *MetaRowByte = MetaSurfWidth * MetaRequestHeight * BytePerPixel / 256.0;
+- } else {
+- *meta_row_height = MetaRequestWidth;
+- MetaSurfHeight = dml_ceil((double) SwathWidth - 1, MetaRequestHeight)
+- + MetaRequestHeight;
+- *MetaRowByte = MetaSurfHeight * MetaRequestWidth * BytePerPixel / 256.0;
+- }
+- if (ScanDirection == dm_horz) {
+- DCCMetaSurfaceBytes = DCCMetaPitch
+- * (dml_ceil(ViewportHeight - 1, 64 * BlockHeight256Bytes)
+- + 64 * BlockHeight256Bytes) * BytePerPixel
+- / 256;
+- } else {
+- DCCMetaSurfaceBytes = DCCMetaPitch
+- * (dml_ceil(
+- (double) ViewportHeight - 1,
+- 64 * BlockHeight256Bytes)
+- + 64 * BlockHeight256Bytes) * BytePerPixel
+- / 256;
+- }
+- if (VirtualMemoryEnable == true) {
+- MetaPTEBytesFrame = (dml_ceil(
+- (double) (DCCMetaSurfaceBytes - VMMPageSize)
+- / (8 * VMMPageSize),
+- 1) + 1) * 64;
+- MPDEBytesFrame = 128 * (mode_lib->vba.MaxPageTableLevels - 1);
+- } else {
+- MetaPTEBytesFrame = 0;
+- MPDEBytesFrame = 0;
+- }
+- } else {
+- MetaPTEBytesFrame = 0;
+- MPDEBytesFrame = 0;
+- *MetaRowByte = 0;
+- }
+-
+- if (SurfaceTiling == dm_sw_linear) {
+- MacroTileSizeBytes = 256;
+- MacroTileHeight = 1;
+- } else if (SurfaceTiling == dm_sw_4kb_s || SurfaceTiling == dm_sw_4kb_s_x
+- || SurfaceTiling == dm_sw_4kb_d || SurfaceTiling == dm_sw_4kb_d_x) {
+- MacroTileSizeBytes = 4096;
+- MacroTileHeight = 4 * BlockHeight256Bytes;
+- } else if (SurfaceTiling == dm_sw_64kb_s || SurfaceTiling == dm_sw_64kb_s_t
+- || SurfaceTiling == dm_sw_64kb_s_x || SurfaceTiling == dm_sw_64kb_d
+- || SurfaceTiling == dm_sw_64kb_d_t || SurfaceTiling == dm_sw_64kb_d_x
+- || SurfaceTiling == dm_sw_64kb_r_x) {
+- MacroTileSizeBytes = 65536;
+- MacroTileHeight = 16 * BlockHeight256Bytes;
+- } else {
+- MacroTileSizeBytes = 262144;
+- MacroTileHeight = 32 * BlockHeight256Bytes;
+- }
+- *MacroTileWidth = MacroTileSizeBytes / BytePerPixel / MacroTileHeight;
+-
+- if (VirtualMemoryEnable == true && mode_lib->vba.MaxPageTableLevels > 1) {
+- if (ScanDirection == dm_horz) {
+- DPDE0BytesFrame =
+- 64
+- * (dml_ceil(
+- ((Pitch
+- * (dml_ceil(
+- ViewportHeight
+- - 1,
+- MacroTileHeight)
+- + MacroTileHeight)
+- * BytePerPixel)
+- - MacroTileSizeBytes)
+- / (8
+- * 2097152),
+- 1) + 1);
+- } else {
+- DPDE0BytesFrame =
+- 64
+- * (dml_ceil(
+- ((Pitch
+- * (dml_ceil(
+- (double) SwathWidth
+- - 1,
+- MacroTileHeight)
+- + MacroTileHeight)
+- * BytePerPixel)
+- - MacroTileSizeBytes)
+- / (8
+- * 2097152),
+- 1) + 1);
+- }
+- ExtraDPDEBytesFrame = 128 * (mode_lib->vba.MaxPageTableLevels - 2);
+- } else {
+- DPDE0BytesFrame = 0;
+- ExtraDPDEBytesFrame = 0;
+- }
+-
+- PDEAndMetaPTEBytesFrame = MetaPTEBytesFrame + MPDEBytesFrame + DPDE0BytesFrame
+- + ExtraDPDEBytesFrame;
+-
+- if (VirtualMemoryEnable == true) {
+- unsigned int PTERequestSize;
+- unsigned int PixelPTEReqHeight;
+- unsigned int PixelPTEReqWidth;
+- double FractionOfPTEReturnDrop;
+- unsigned int EffectivePDEProcessingBufIn64KBReqs;
+-
+- if (SurfaceTiling == dm_sw_linear) {
+- PixelPTEReqHeight = 1;
+- PixelPTEReqWidth = 8.0 * VMMPageSize / BytePerPixel;
+- PTERequestSize = 64;
+- FractionOfPTEReturnDrop = 0;
+- } else if (MacroTileSizeBytes == 4096) {
+- PixelPTEReqHeight = MacroTileHeight;
+- PixelPTEReqWidth = 8 * *MacroTileWidth;
+- PTERequestSize = 64;
+- if (ScanDirection == dm_horz)
+- FractionOfPTEReturnDrop = 0;
+- else
+- FractionOfPTEReturnDrop = 7 / 8;
+- } else if (VMMPageSize == 4096 && MacroTileSizeBytes > 4096) {
+- PixelPTEReqHeight = 16 * BlockHeight256Bytes;
+- PixelPTEReqWidth = 16 * BlockWidth256Bytes;
+- PTERequestSize = 128;
+- FractionOfPTEReturnDrop = 0;
+- } else {
+- PixelPTEReqHeight = MacroTileHeight;
+- PixelPTEReqWidth = 8 * *MacroTileWidth;
+- PTERequestSize = 64;
+- FractionOfPTEReturnDrop = 0;
+- }
+-
+- if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10)
+- EffectivePDEProcessingBufIn64KBReqs = PDEProcessingBufIn64KBReqs / 2;
+- else
+- EffectivePDEProcessingBufIn64KBReqs = PDEProcessingBufIn64KBReqs;
+-
+- if (SurfaceTiling == dm_sw_linear) {
+- *dpte_row_height =
+- dml_min(
+- 128,
+- 1
+- << (unsigned int) dml_floor(
+- dml_log2(
+- dml_min(
+- (double) PTEBufferSizeInRequests
+- * PixelPTEReqWidth,
+- EffectivePDEProcessingBufIn64KBReqs
+- * 65536.0
+- / BytePerPixel)
+- / Pitch),
+- 1));
+- *PixelPTEBytesPerRow = PTERequestSize
+- * (dml_ceil(
+- (double) (Pitch * *dpte_row_height - 1)
+- / PixelPTEReqWidth,
+- 1) + 1);
+- } else if (ScanDirection == dm_horz) {
+- *dpte_row_height = PixelPTEReqHeight;
+- *PixelPTEBytesPerRow = PTERequestSize
+- * (dml_ceil(((double) SwathWidth - 1) / PixelPTEReqWidth, 1)
+- + 1);
+- } else {
+- *dpte_row_height = dml_min(PixelPTEReqWidth, *MacroTileWidth);
+- *PixelPTEBytesPerRow = PTERequestSize
+- * (dml_ceil(
+- ((double) SwathWidth - 1)
+- / PixelPTEReqHeight,
+- 1) + 1);
+- }
+- if (*PixelPTEBytesPerRow * (1 - FractionOfPTEReturnDrop)
+- <= 64 * PTEBufferSizeInRequests) {
+- *PTEBufferSizeNotExceeded = true;
+- } else {
+- *PTEBufferSizeNotExceeded = false;
+- }
+- } else {
+- *PixelPTEBytesPerRow = 0;
+- *PTEBufferSizeNotExceeded = true;
+- }
+-
+- return PDEAndMetaPTEBytesFrame;
+-}
+-
+-static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(
+- struct display_mode_lib *mode_lib)
+-{
+- unsigned int j, k;
+-
+- mode_lib->vba.WritebackDISPCLK = 0.0;
+- mode_lib->vba.DISPCLKWithRamping = 0;
+- mode_lib->vba.DISPCLKWithoutRamping = 0;
+- mode_lib->vba.GlobalDPPCLK = 0.0;
+-
+- // dml_ml->vba.DISPCLK and dml_ml->vba.DPPCLK Calculation
+- //
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.WritebackEnable[k]) {
+- mode_lib->vba.WritebackDISPCLK =
+- dml_max(
+- mode_lib->vba.WritebackDISPCLK,
+- CalculateWriteBackDISPCLK(
+- mode_lib->vba.WritebackPixelFormat[k],
+- mode_lib->vba.PixelClock[k],
+- mode_lib->vba.WritebackHRatio[k],
+- mode_lib->vba.WritebackVRatio[k],
+- mode_lib->vba.WritebackLumaHTaps[k],
+- mode_lib->vba.WritebackLumaVTaps[k],
+- mode_lib->vba.WritebackChromaHTaps[k],
+- mode_lib->vba.WritebackChromaVTaps[k],
+- mode_lib->vba.WritebackDestinationWidth[k],
+- mode_lib->vba.HTotal[k],
+- mode_lib->vba.WritebackChromaLineBufferWidth));
+- }
+- }
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.HRatio[k] > 1) {
+- mode_lib->vba.PSCL_THROUGHPUT_LUMA[k] = dml_min(
+- mode_lib->vba.MaxDCHUBToPSCLThroughput,
+- mode_lib->vba.MaxPSCLToLBThroughput
+- * mode_lib->vba.HRatio[k]
+- / dml_ceil(
+- mode_lib->vba.htaps[k]
+- / 6.0,
+- 1));
+- } else {
+- mode_lib->vba.PSCL_THROUGHPUT_LUMA[k] = dml_min(
+- mode_lib->vba.MaxDCHUBToPSCLThroughput,
+- mode_lib->vba.MaxPSCLToLBThroughput);
+- }
+-
+- mode_lib->vba.DPPCLKUsingSingleDPPLuma =
+- mode_lib->vba.PixelClock[k]
+- * dml_max(
+- mode_lib->vba.vtaps[k] / 6.0
+- * dml_min(
+- 1.0,
+- mode_lib->vba.HRatio[k]),
+- dml_max(
+- mode_lib->vba.HRatio[k]
+- * mode_lib->vba.VRatio[k]
+- / mode_lib->vba.PSCL_THROUGHPUT_LUMA[k],
+- 1.0));
+-
+- if ((mode_lib->vba.htaps[k] > 6 || mode_lib->vba.vtaps[k] > 6)
+- && mode_lib->vba.DPPCLKUsingSingleDPPLuma
+- < 2 * mode_lib->vba.PixelClock[k]) {
+- mode_lib->vba.DPPCLKUsingSingleDPPLuma = 2 * mode_lib->vba.PixelClock[k];
+- }
+-
+- if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8
+- && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) {
+- mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k] = 0.0;
+- mode_lib->vba.DPPCLKUsingSingleDPP[k] =
+- mode_lib->vba.DPPCLKUsingSingleDPPLuma;
+- } else {
+- if (mode_lib->vba.HRatio[k] > 1) {
+- mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k] =
+- dml_min(
+- mode_lib->vba.MaxDCHUBToPSCLThroughput,
+- mode_lib->vba.MaxPSCLToLBThroughput
+- * mode_lib->vba.HRatio[k]
+- / 2
+- / dml_ceil(
+- mode_lib->vba.HTAPsChroma[k]
+- / 6.0,
+- 1.0));
+- } else {
+- mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k] = dml_min(
+- mode_lib->vba.MaxDCHUBToPSCLThroughput,
+- mode_lib->vba.MaxPSCLToLBThroughput);
+- }
+- mode_lib->vba.DPPCLKUsingSingleDPPChroma =
+- mode_lib->vba.PixelClock[k]
+- * dml_max(
+- mode_lib->vba.VTAPsChroma[k]
+- / 6.0
+- * dml_min(
+- 1.0,
+- mode_lib->vba.HRatio[k]
+- / 2),
+- dml_max(
+- mode_lib->vba.HRatio[k]
+- * mode_lib->vba.VRatio[k]
+- / 4
+- / mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k],
+- 1.0));
+-
+- if ((mode_lib->vba.HTAPsChroma[k] > 6 || mode_lib->vba.VTAPsChroma[k] > 6)
+- && mode_lib->vba.DPPCLKUsingSingleDPPChroma
+- < 2 * mode_lib->vba.PixelClock[k]) {
+- mode_lib->vba.DPPCLKUsingSingleDPPChroma = 2
+- * mode_lib->vba.PixelClock[k];
+- }
+-
+- mode_lib->vba.DPPCLKUsingSingleDPP[k] = dml_max(
+- mode_lib->vba.DPPCLKUsingSingleDPPLuma,
+- mode_lib->vba.DPPCLKUsingSingleDPPChroma);
+- }
+- }
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.BlendingAndTiming[k] != k)
+- continue;
+- if (mode_lib->vba.ODMCombineEnabled[k]) {
+- mode_lib->vba.DISPCLKWithRamping =
+- dml_max(
+- mode_lib->vba.DISPCLKWithRamping,
+- mode_lib->vba.PixelClock[k] / 2
+- * (1
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100)
+- * (1
+- + mode_lib->vba.DISPCLKRampingMargin
+- / 100));
+- mode_lib->vba.DISPCLKWithoutRamping =
+- dml_max(
+- mode_lib->vba.DISPCLKWithoutRamping,
+- mode_lib->vba.PixelClock[k] / 2
+- * (1
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100));
+- } else if (!mode_lib->vba.ODMCombineEnabled[k]) {
+- mode_lib->vba.DISPCLKWithRamping =
+- dml_max(
+- mode_lib->vba.DISPCLKWithRamping,
+- mode_lib->vba.PixelClock[k]
+- * (1
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100)
+- * (1
+- + mode_lib->vba.DISPCLKRampingMargin
+- / 100));
+- mode_lib->vba.DISPCLKWithoutRamping =
+- dml_max(
+- mode_lib->vba.DISPCLKWithoutRamping,
+- mode_lib->vba.PixelClock[k]
+- * (1
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100));
+- }
+- }
+-
+- mode_lib->vba.DISPCLKWithRamping = dml_max(
+- mode_lib->vba.DISPCLKWithRamping,
+- mode_lib->vba.WritebackDISPCLK);
+- mode_lib->vba.DISPCLKWithoutRamping = dml_max(
+- mode_lib->vba.DISPCLKWithoutRamping,
+- mode_lib->vba.WritebackDISPCLK);
+-
+- ASSERT(mode_lib->vba.DISPCLKDPPCLKVCOSpeed != 0);
+- mode_lib->vba.DISPCLKWithRampingRoundedToDFSGranularity = RoundToDFSGranularityUp(
+- mode_lib->vba.DISPCLKWithRamping,
+- mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
+- mode_lib->vba.DISPCLKWithoutRampingRoundedToDFSGranularity = RoundToDFSGranularityUp(
+- mode_lib->vba.DISPCLKWithoutRamping,
+- mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
+- mode_lib->vba.MaxDispclkRoundedToDFSGranularity = RoundToDFSGranularityDown(
+- mode_lib->vba.soc.clock_limits[NumberOfStates - 1].dispclk_mhz,
+- mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
+- if (mode_lib->vba.DISPCLKWithoutRampingRoundedToDFSGranularity
+- > mode_lib->vba.MaxDispclkRoundedToDFSGranularity) {
+- mode_lib->vba.DISPCLK_calculated =
+- mode_lib->vba.DISPCLKWithoutRampingRoundedToDFSGranularity;
+- } else if (mode_lib->vba.DISPCLKWithRampingRoundedToDFSGranularity
+- > mode_lib->vba.MaxDispclkRoundedToDFSGranularity) {
+- mode_lib->vba.DISPCLK_calculated = mode_lib->vba.MaxDispclkRoundedToDFSGranularity;
+- } else {
+- mode_lib->vba.DISPCLK_calculated =
+- mode_lib->vba.DISPCLKWithRampingRoundedToDFSGranularity;
+- }
+- DTRACE(" dispclk_mhz (calculated) = %f", mode_lib->vba.DISPCLK_calculated);
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- mode_lib->vba.DPPCLK_calculated[k] = mode_lib->vba.DPPCLKUsingSingleDPP[k]
+- / mode_lib->vba.DPPPerPlane[k]
+- * (1 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100);
+- mode_lib->vba.GlobalDPPCLK = dml_max(
+- mode_lib->vba.GlobalDPPCLK,
+- mode_lib->vba.DPPCLK_calculated[k]);
+- }
+- mode_lib->vba.GlobalDPPCLK = RoundToDFSGranularityUp(
+- mode_lib->vba.GlobalDPPCLK,
+- mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- mode_lib->vba.DPPCLK_calculated[k] = mode_lib->vba.GlobalDPPCLK / 255
+- * dml_ceil(
+- mode_lib->vba.DPPCLK_calculated[k] * 255
+- / mode_lib->vba.GlobalDPPCLK,
+- 1);
+- DTRACE(" dppclk_mhz[%i] (calculated) = %f", k, mode_lib->vba.DPPCLK_calculated[k]);
+- }
+-
+- // Urgent Watermark
+- mode_lib->vba.DCCEnabledAnyPlane = false;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k)
+- if (mode_lib->vba.DCCEnable[k])
+- mode_lib->vba.DCCEnabledAnyPlane = true;
+-
+- mode_lib->vba.ReturnBandwidthToDCN = dml_min(
+- mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLK,
+- mode_lib->vba.FabricAndDRAMBandwidth * 1000)
+- * mode_lib->vba.PercentOfIdealDRAMAndFabricBWReceivedAfterUrgLatency / 100;
+-
+- mode_lib->vba.ReturnBW = mode_lib->vba.ReturnBandwidthToDCN;
+- mode_lib->vba.ReturnBW = adjust_ReturnBW(
+- mode_lib,
+- mode_lib->vba.ReturnBW,
+- mode_lib->vba.DCCEnabledAnyPlane,
+- mode_lib->vba.ReturnBandwidthToDCN);
+-
+- // Let's do this calculation again??
+- mode_lib->vba.ReturnBandwidthToDCN = dml_min(
+- mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLK,
+- mode_lib->vba.FabricAndDRAMBandwidth * 1000);
+- mode_lib->vba.ReturnBW = adjust_ReturnBW(
+- mode_lib,
+- mode_lib->vba.ReturnBW,
+- mode_lib->vba.DCCEnabledAnyPlane,
+- mode_lib->vba.ReturnBandwidthToDCN);
+-
+- DTRACE(" dcfclk_mhz = %f", mode_lib->vba.DCFCLK);
+- DTRACE(" return_bw_to_dcn = %f", mode_lib->vba.ReturnBandwidthToDCN);
+- DTRACE(" return_bus_bw = %f", mode_lib->vba.ReturnBW);
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- bool MainPlaneDoesODMCombine = false;
+-
+- if (mode_lib->vba.SourceScan[k] == dm_horz)
+- mode_lib->vba.SwathWidthSingleDPPY[k] = mode_lib->vba.ViewportWidth[k];
+- else
+- mode_lib->vba.SwathWidthSingleDPPY[k] = mode_lib->vba.ViewportHeight[k];
+-
+- if (mode_lib->vba.ODMCombineEnabled[k] == true)
+- MainPlaneDoesODMCombine = true;
+- for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j)
+- if (mode_lib->vba.BlendingAndTiming[k] == j
+- && mode_lib->vba.ODMCombineEnabled[j] == true)
+- MainPlaneDoesODMCombine = true;
+-
+- if (MainPlaneDoesODMCombine == true)
+- mode_lib->vba.SwathWidthY[k] = dml_min(
+- (double) mode_lib->vba.SwathWidthSingleDPPY[k],
+- dml_round(
+- mode_lib->vba.HActive[k] / 2.0
+- * mode_lib->vba.HRatio[k]));
+- else
+- mode_lib->vba.SwathWidthY[k] = mode_lib->vba.SwathWidthSingleDPPY[k]
+- / mode_lib->vba.DPPPerPlane[k];
+- }
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.SourcePixelFormat[k] == dm_444_64) {
+- mode_lib->vba.BytePerPixelDETY[k] = 8;
+- mode_lib->vba.BytePerPixelDETC[k] = 0;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_32) {
+- mode_lib->vba.BytePerPixelDETY[k] = 4;
+- mode_lib->vba.BytePerPixelDETC[k] = 0;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_16) {
+- mode_lib->vba.BytePerPixelDETY[k] = 2;
+- mode_lib->vba.BytePerPixelDETC[k] = 0;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_8) {
+- mode_lib->vba.BytePerPixelDETY[k] = 1;
+- mode_lib->vba.BytePerPixelDETC[k] = 0;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8) {
+- mode_lib->vba.BytePerPixelDETY[k] = 1;
+- mode_lib->vba.BytePerPixelDETC[k] = 2;
+- } else { // dm_420_10
+- mode_lib->vba.BytePerPixelDETY[k] = 4.0 / 3.0;
+- mode_lib->vba.BytePerPixelDETC[k] = 8.0 / 3.0;
+- }
+- }
+-
+- mode_lib->vba.TotalDataReadBandwidth = 0.0;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- mode_lib->vba.ReadBandwidthPlaneLuma[k] = mode_lib->vba.SwathWidthSingleDPPY[k]
+- * dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1)
+- / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
+- * mode_lib->vba.VRatio[k];
+- mode_lib->vba.ReadBandwidthPlaneChroma[k] = mode_lib->vba.SwathWidthSingleDPPY[k]
+- / 2 * dml_ceil(mode_lib->vba.BytePerPixelDETC[k], 2)
+- / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
+- * mode_lib->vba.VRatio[k] / 2;
+- DTRACE(
+- " read_bw[%i] = %fBps",
+- k,
+- mode_lib->vba.ReadBandwidthPlaneLuma[k]
+- + mode_lib->vba.ReadBandwidthPlaneChroma[k]);
+- mode_lib->vba.TotalDataReadBandwidth += mode_lib->vba.ReadBandwidthPlaneLuma[k]
+- + mode_lib->vba.ReadBandwidthPlaneChroma[k];
+- }
+-
+- mode_lib->vba.TotalDCCActiveDPP = 0;
+- mode_lib->vba.TotalActiveDPP = 0;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++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];
+- }
+-
+- mode_lib->vba.UrgentRoundTripAndOutOfOrderLatency =
+- (mode_lib->vba.RoundTripPingLatencyCycles + 32) / mode_lib->vba.DCFCLK
+- + mode_lib->vba.UrgentOutOfOrderReturnPerChannel
+- * mode_lib->vba.NumberOfChannels
+- / mode_lib->vba.ReturnBW;
+-
+- mode_lib->vba.LastPixelOfLineExtraWatermark = 0;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- double DataFabricLineDeliveryTimeLuma, DataFabricLineDeliveryTimeChroma;
+-
+- if (mode_lib->vba.VRatio[k] <= 1.0)
+- mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k] =
+- (double) mode_lib->vba.SwathWidthY[k]
+- * mode_lib->vba.DPPPerPlane[k]
+- / mode_lib->vba.HRatio[k]
+- / mode_lib->vba.PixelClock[k];
+- else
+- mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k] =
+- (double) mode_lib->vba.SwathWidthY[k]
+- / mode_lib->vba.PSCL_THROUGHPUT_LUMA[k]
+- / mode_lib->vba.DPPCLK[k];
+-
+- DataFabricLineDeliveryTimeLuma = mode_lib->vba.SwathWidthSingleDPPY[k]
+- * mode_lib->vba.SwathHeightY[k]
+- * dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1)
+- / (mode_lib->vba.ReturnBW * mode_lib->vba.ReadBandwidthPlaneLuma[k]
+- / mode_lib->vba.TotalDataReadBandwidth);
+- mode_lib->vba.LastPixelOfLineExtraWatermark = dml_max(
+- mode_lib->vba.LastPixelOfLineExtraWatermark,
+- DataFabricLineDeliveryTimeLuma
+- - mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k]);
+-
+- if (mode_lib->vba.BytePerPixelDETC[k] == 0)
+- mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k] = 0.0;
+- else if (mode_lib->vba.VRatio[k] / 2.0 <= 1.0)
+- mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k] =
+- mode_lib->vba.SwathWidthY[k] / 2.0
+- * mode_lib->vba.DPPPerPlane[k]
+- / (mode_lib->vba.HRatio[k] / 2.0)
+- / mode_lib->vba.PixelClock[k];
+- else
+- mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k] =
+- mode_lib->vba.SwathWidthY[k] / 2.0
+- / mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k]
+- / mode_lib->vba.DPPCLK[k];
+-
+- DataFabricLineDeliveryTimeChroma = mode_lib->vba.SwathWidthSingleDPPY[k] / 2.0
+- * mode_lib->vba.SwathHeightC[k]
+- * dml_ceil(mode_lib->vba.BytePerPixelDETC[k], 2)
+- / (mode_lib->vba.ReturnBW
+- * mode_lib->vba.ReadBandwidthPlaneChroma[k]
+- / mode_lib->vba.TotalDataReadBandwidth);
+- mode_lib->vba.LastPixelOfLineExtraWatermark =
+- dml_max(
+- mode_lib->vba.LastPixelOfLineExtraWatermark,
+- DataFabricLineDeliveryTimeChroma
+- - mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k]);
+- }
+-
+- mode_lib->vba.UrgentExtraLatency = mode_lib->vba.UrgentRoundTripAndOutOfOrderLatency
+- + (mode_lib->vba.TotalActiveDPP * mode_lib->vba.PixelChunkSizeInKByte
+- + mode_lib->vba.TotalDCCActiveDPP
+- * mode_lib->vba.MetaChunkSize) * 1024.0
+- / mode_lib->vba.ReturnBW;
+-
+- if (mode_lib->vba.VirtualMemoryEnable)
+- mode_lib->vba.UrgentExtraLatency += mode_lib->vba.TotalActiveDPP
+- * mode_lib->vba.PTEChunkSize * 1024.0 / mode_lib->vba.ReturnBW;
+-
+- mode_lib->vba.UrgentWatermark = mode_lib->vba.UrgentLatency
+- + mode_lib->vba.LastPixelOfLineExtraWatermark
+- + mode_lib->vba.UrgentExtraLatency;
+-
+- DTRACE(" urgent_extra_latency = %fus", mode_lib->vba.UrgentExtraLatency);
+- DTRACE(" wm_urgent = %fus", mode_lib->vba.UrgentWatermark);
+-
+- mode_lib->vba.MemoryTripWatermark = mode_lib->vba.UrgentLatency;
+-
+- mode_lib->vba.TotalActiveWriteback = 0;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.WritebackEnable[k])
+- mode_lib->vba.TotalActiveWriteback = mode_lib->vba.TotalActiveWriteback + 1;
+- }
+-
+- if (mode_lib->vba.TotalActiveWriteback <= 1)
+- mode_lib->vba.WritebackUrgentWatermark = mode_lib->vba.WritebackLatency;
+- else
+- mode_lib->vba.WritebackUrgentWatermark = mode_lib->vba.WritebackLatency
+- + mode_lib->vba.WritebackChunkSize * 1024.0 / 32
+- / mode_lib->vba.SOCCLK;
+-
+- DTRACE(" wm_wb_urgent = %fus", mode_lib->vba.WritebackUrgentWatermark);
+-
+- // NB P-State/DRAM Clock Change Watermark
+- mode_lib->vba.DRAMClockChangeWatermark = mode_lib->vba.DRAMClockChangeLatency
+- + mode_lib->vba.UrgentWatermark;
+-
+- DTRACE(" wm_pstate_change = %fus", mode_lib->vba.DRAMClockChangeWatermark);
+-
+- DTRACE(" calculating wb pstate watermark");
+- DTRACE(" total wb outputs %d", mode_lib->vba.TotalActiveWriteback);
+- DTRACE(" socclk frequency %f Mhz", mode_lib->vba.SOCCLK);
+-
+- if (mode_lib->vba.TotalActiveWriteback <= 1)
+- mode_lib->vba.WritebackDRAMClockChangeWatermark =
+- mode_lib->vba.DRAMClockChangeLatency
+- + mode_lib->vba.WritebackLatency;
+- else
+- mode_lib->vba.WritebackDRAMClockChangeWatermark =
+- mode_lib->vba.DRAMClockChangeLatency
+- + mode_lib->vba.WritebackLatency
+- + mode_lib->vba.WritebackChunkSize * 1024.0 / 32
+- / mode_lib->vba.SOCCLK;
+-
+- DTRACE(" wm_wb_pstate %fus", mode_lib->vba.WritebackDRAMClockChangeWatermark);
+-
+- // Stutter Efficiency
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- mode_lib->vba.LinesInDETY[k] = mode_lib->vba.DETBufferSizeY[k]
+- / mode_lib->vba.BytePerPixelDETY[k] / mode_lib->vba.SwathWidthY[k];
+- mode_lib->vba.LinesInDETYRoundedDownToSwath[k] = dml_floor(
+- mode_lib->vba.LinesInDETY[k],
+- mode_lib->vba.SwathHeightY[k]);
+- mode_lib->vba.FullDETBufferingTimeY[k] =
+- mode_lib->vba.LinesInDETYRoundedDownToSwath[k]
+- * (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k])
+- / mode_lib->vba.VRatio[k];
+- if (mode_lib->vba.BytePerPixelDETC[k] > 0) {
+- mode_lib->vba.LinesInDETC[k] = mode_lib->vba.DETBufferSizeC[k]
+- / mode_lib->vba.BytePerPixelDETC[k]
+- / (mode_lib->vba.SwathWidthY[k] / 2);
+- mode_lib->vba.LinesInDETCRoundedDownToSwath[k] = dml_floor(
+- mode_lib->vba.LinesInDETC[k],
+- mode_lib->vba.SwathHeightC[k]);
+- mode_lib->vba.FullDETBufferingTimeC[k] =
+- mode_lib->vba.LinesInDETCRoundedDownToSwath[k]
+- * (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k])
+- / (mode_lib->vba.VRatio[k] / 2);
+- } else {
+- mode_lib->vba.LinesInDETC[k] = 0;
+- mode_lib->vba.LinesInDETCRoundedDownToSwath[k] = 0;
+- mode_lib->vba.FullDETBufferingTimeC[k] = 999999;
+- }
+- }
+-
+- mode_lib->vba.MinFullDETBufferingTime = 999999.0;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.FullDETBufferingTimeY[k]
+- < mode_lib->vba.MinFullDETBufferingTime) {
+- mode_lib->vba.MinFullDETBufferingTime =
+- mode_lib->vba.FullDETBufferingTimeY[k];
+- mode_lib->vba.FrameTimeForMinFullDETBufferingTime =
+- (double) mode_lib->vba.VTotal[k] * mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k];
+- }
+- if (mode_lib->vba.FullDETBufferingTimeC[k]
+- < mode_lib->vba.MinFullDETBufferingTime) {
+- mode_lib->vba.MinFullDETBufferingTime =
+- mode_lib->vba.FullDETBufferingTimeC[k];
+- mode_lib->vba.FrameTimeForMinFullDETBufferingTime =
+- (double) mode_lib->vba.VTotal[k] * mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k];
+- }
+- }
+-
+- mode_lib->vba.AverageReadBandwidthGBytePerSecond = 0.0;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.DCCEnable[k]) {
+- mode_lib->vba.AverageReadBandwidthGBytePerSecond =
+- mode_lib->vba.AverageReadBandwidthGBytePerSecond
+- + mode_lib->vba.ReadBandwidthPlaneLuma[k]
+- / mode_lib->vba.DCCRate[k]
+- / 1000
+- + mode_lib->vba.ReadBandwidthPlaneChroma[k]
+- / mode_lib->vba.DCCRate[k]
+- / 1000;
+- } else {
+- mode_lib->vba.AverageReadBandwidthGBytePerSecond =
+- mode_lib->vba.AverageReadBandwidthGBytePerSecond
+- + mode_lib->vba.ReadBandwidthPlaneLuma[k]
+- / 1000
+- + mode_lib->vba.ReadBandwidthPlaneChroma[k]
+- / 1000;
+- }
+- if (mode_lib->vba.DCCEnable[k]) {
+- mode_lib->vba.AverageReadBandwidthGBytePerSecond =
+- mode_lib->vba.AverageReadBandwidthGBytePerSecond
+- + mode_lib->vba.ReadBandwidthPlaneLuma[k]
+- / 1000 / 256
+- + mode_lib->vba.ReadBandwidthPlaneChroma[k]
+- / 1000 / 256;
+- }
+- if (mode_lib->vba.VirtualMemoryEnable) {
+- mode_lib->vba.AverageReadBandwidthGBytePerSecond =
+- mode_lib->vba.AverageReadBandwidthGBytePerSecond
+- + mode_lib->vba.ReadBandwidthPlaneLuma[k]
+- / 1000 / 512
+- + mode_lib->vba.ReadBandwidthPlaneChroma[k]
+- / 1000 / 512;
+- }
+- }
+-
+- mode_lib->vba.PartOfBurstThatFitsInROB =
+- dml_min(
+- mode_lib->vba.MinFullDETBufferingTime
+- * mode_lib->vba.TotalDataReadBandwidth,
+- mode_lib->vba.ROBBufferSizeInKByte * 1024
+- * mode_lib->vba.TotalDataReadBandwidth
+- / (mode_lib->vba.AverageReadBandwidthGBytePerSecond
+- * 1000));
+- mode_lib->vba.StutterBurstTime = mode_lib->vba.PartOfBurstThatFitsInROB
+- * (mode_lib->vba.AverageReadBandwidthGBytePerSecond * 1000)
+- / mode_lib->vba.TotalDataReadBandwidth / mode_lib->vba.ReturnBW
+- + (mode_lib->vba.MinFullDETBufferingTime
+- * mode_lib->vba.TotalDataReadBandwidth
+- - mode_lib->vba.PartOfBurstThatFitsInROB)
+- / (mode_lib->vba.DCFCLK * 64);
+- if (mode_lib->vba.TotalActiveWriteback == 0) {
+- mode_lib->vba.StutterEfficiencyNotIncludingVBlank = (1
+- - (mode_lib->vba.SRExitTime + mode_lib->vba.StutterBurstTime)
+- / mode_lib->vba.MinFullDETBufferingTime) * 100;
+- } else {
+- mode_lib->vba.StutterEfficiencyNotIncludingVBlank = 0;
+- }
+-
+- mode_lib->vba.SmallestVBlank = 999999;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.SynchronizedVBlank || mode_lib->vba.NumberOfActivePlanes == 1) {
+- mode_lib->vba.VBlankTime = (double) (mode_lib->vba.VTotal[k]
+- - mode_lib->vba.VActive[k]) * mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k];
+- } else {
+- mode_lib->vba.VBlankTime = 0;
+- }
+- mode_lib->vba.SmallestVBlank = dml_min(
+- mode_lib->vba.SmallestVBlank,
+- mode_lib->vba.VBlankTime);
+- }
+-
+- mode_lib->vba.StutterEfficiency = (mode_lib->vba.StutterEfficiencyNotIncludingVBlank / 100
+- * (mode_lib->vba.FrameTimeForMinFullDETBufferingTime
+- - mode_lib->vba.SmallestVBlank)
+- + mode_lib->vba.SmallestVBlank)
+- / mode_lib->vba.FrameTimeForMinFullDETBufferingTime * 100;
+-
+- // dml_ml->vba.DCFCLK Deep Sleep
+- mode_lib->vba.DCFClkDeepSleep = 8.0;
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; k++) {
+- if (mode_lib->vba.BytePerPixelDETC[k] > 0) {
+- mode_lib->vba.DCFCLKDeepSleepPerPlane =
+- dml_max(
+- 1.1 * mode_lib->vba.SwathWidthY[k]
+- * dml_ceil(
+- mode_lib->vba.BytePerPixelDETY[k],
+- 1) / 32
+- / mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k],
+- 1.1 * mode_lib->vba.SwathWidthY[k] / 2.0
+- * dml_ceil(
+- mode_lib->vba.BytePerPixelDETC[k],
+- 2) / 32
+- / mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k]);
+- } else
+- mode_lib->vba.DCFCLKDeepSleepPerPlane = 1.1 * mode_lib->vba.SwathWidthY[k]
+- * dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1) / 64.0
+- / mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k];
+- mode_lib->vba.DCFCLKDeepSleepPerPlane = dml_max(
+- mode_lib->vba.DCFCLKDeepSleepPerPlane,
+- mode_lib->vba.PixelClock[k] / 16.0);
+- mode_lib->vba.DCFClkDeepSleep = dml_max(
+- mode_lib->vba.DCFClkDeepSleep,
+- mode_lib->vba.DCFCLKDeepSleepPerPlane);
+-
+- DTRACE(
+- " dcfclk_deepsleep_per_plane[%i] = %fMHz",
+- k,
+- mode_lib->vba.DCFCLKDeepSleepPerPlane);
+- }
+-
+- DTRACE(" dcfclk_deepsleep_mhz = %fMHz", mode_lib->vba.DCFClkDeepSleep);
+-
+- // Stutter Watermark
+- mode_lib->vba.StutterExitWatermark = mode_lib->vba.SRExitTime
+- + mode_lib->vba.LastPixelOfLineExtraWatermark
+- + mode_lib->vba.UrgentExtraLatency + 10 / mode_lib->vba.DCFClkDeepSleep;
+- mode_lib->vba.StutterEnterPlusExitWatermark = mode_lib->vba.SREnterPlusExitTime
+- + mode_lib->vba.LastPixelOfLineExtraWatermark
+- + mode_lib->vba.UrgentExtraLatency;
+-
+- DTRACE(" wm_cstate_exit = %fus", mode_lib->vba.StutterExitWatermark);
+- DTRACE(" wm_cstate_enter_exit = %fus", mode_lib->vba.StutterEnterPlusExitWatermark);
+-
+- // Urgent Latency Supported
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- mode_lib->vba.EffectiveDETPlusLBLinesLuma =
+- dml_floor(
+- mode_lib->vba.LinesInDETY[k]
+- + dml_min(
+- mode_lib->vba.LinesInDETY[k]
+- * mode_lib->vba.DPPCLK[k]
+- * mode_lib->vba.BytePerPixelDETY[k]
+- * mode_lib->vba.PSCL_THROUGHPUT_LUMA[k]
+- / (mode_lib->vba.ReturnBW
+- / mode_lib->vba.DPPPerPlane[k]),
+- (double) mode_lib->vba.EffectiveLBLatencyHidingSourceLinesLuma),
+- mode_lib->vba.SwathHeightY[k]);
+-
+- mode_lib->vba.UrgentLatencySupportUsLuma = mode_lib->vba.EffectiveDETPlusLBLinesLuma
+- * (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
+- / mode_lib->vba.VRatio[k]
+- - mode_lib->vba.EffectiveDETPlusLBLinesLuma
+- * mode_lib->vba.SwathWidthY[k]
+- * mode_lib->vba.BytePerPixelDETY[k]
+- / (mode_lib->vba.ReturnBW
+- / mode_lib->vba.DPPPerPlane[k]);
+-
+- if (mode_lib->vba.BytePerPixelDETC[k] > 0) {
+- mode_lib->vba.EffectiveDETPlusLBLinesChroma =
+- dml_floor(
+- mode_lib->vba.LinesInDETC[k]
+- + dml_min(
+- mode_lib->vba.LinesInDETC[k]
+- * mode_lib->vba.DPPCLK[k]
+- * mode_lib->vba.BytePerPixelDETC[k]
+- * mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k]
+- / (mode_lib->vba.ReturnBW
+- / mode_lib->vba.DPPPerPlane[k]),
+- (double) mode_lib->vba.EffectiveLBLatencyHidingSourceLinesChroma),
+- mode_lib->vba.SwathHeightC[k]);
+- mode_lib->vba.UrgentLatencySupportUsChroma =
+- mode_lib->vba.EffectiveDETPlusLBLinesChroma
+- * (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k])
+- / (mode_lib->vba.VRatio[k] / 2)
+- - mode_lib->vba.EffectiveDETPlusLBLinesChroma
+- * (mode_lib->vba.SwathWidthY[k]
+- / 2)
+- * mode_lib->vba.BytePerPixelDETC[k]
+- / (mode_lib->vba.ReturnBW
+- / mode_lib->vba.DPPPerPlane[k]);
+- mode_lib->vba.UrgentLatencySupportUs[k] = dml_min(
+- mode_lib->vba.UrgentLatencySupportUsLuma,
+- mode_lib->vba.UrgentLatencySupportUsChroma);
+- } else {
+- mode_lib->vba.UrgentLatencySupportUs[k] =
+- mode_lib->vba.UrgentLatencySupportUsLuma;
+- }
+- }
+-
+- mode_lib->vba.MinUrgentLatencySupportUs = 999999;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- mode_lib->vba.MinUrgentLatencySupportUs = dml_min(
+- mode_lib->vba.MinUrgentLatencySupportUs,
+- mode_lib->vba.UrgentLatencySupportUs[k]);
+- }
+-
+- // Non-Urgent Latency Tolerance
+- mode_lib->vba.NonUrgentLatencyTolerance = mode_lib->vba.MinUrgentLatencySupportUs
+- - mode_lib->vba.UrgentWatermark;
+-
+- // DSCCLK
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if ((mode_lib->vba.BlendingAndTiming[k] != k) || !mode_lib->vba.DSCEnabled[k]) {
+- mode_lib->vba.DSCCLK_calculated[k] = 0.0;
+- } else {
+- if (mode_lib->vba.OutputFormat[k] == dm_420
+- || mode_lib->vba.OutputFormat[k] == dm_n422)
+- mode_lib->vba.DSCFormatFactor = 2;
+- else
+- mode_lib->vba.DSCFormatFactor = 1;
+- if (mode_lib->vba.ODMCombineEnabled[k])
+- mode_lib->vba.DSCCLK_calculated[k] =
+- mode_lib->vba.PixelClockBackEnd[k] / 6
+- / mode_lib->vba.DSCFormatFactor
+- / (1
+- - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100);
+- else
+- mode_lib->vba.DSCCLK_calculated[k] =
+- mode_lib->vba.PixelClockBackEnd[k] / 3
+- / mode_lib->vba.DSCFormatFactor
+- / (1
+- - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100);
+- }
+- }
+-
+- // DSC Delay
+- // TODO
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- double bpp = mode_lib->vba.OutputBpp[k];
+- unsigned int slices = mode_lib->vba.NumberOfDSCSlices[k];
+-
+- if (mode_lib->vba.DSCEnabled[k] && bpp != 0) {
+- if (!mode_lib->vba.ODMCombineEnabled[k]) {
+- mode_lib->vba.DSCDelay[k] =
+- dscceComputeDelay(
+- mode_lib->vba.DSCInputBitPerComponent[k],
+- bpp,
+- dml_ceil(
+- (double) mode_lib->vba.HActive[k]
+- / mode_lib->vba.NumberOfDSCSlices[k],
+- 1),
+- slices,
+- mode_lib->vba.OutputFormat[k])
+- + dscComputeDelay(
+- mode_lib->vba.OutputFormat[k]);
+- } else {
+- mode_lib->vba.DSCDelay[k] =
+- 2
+- * (dscceComputeDelay(
+- mode_lib->vba.DSCInputBitPerComponent[k],
+- bpp,
+- dml_ceil(
+- (double) mode_lib->vba.HActive[k]
+- / mode_lib->vba.NumberOfDSCSlices[k],
+- 1),
+- slices / 2.0,
+- mode_lib->vba.OutputFormat[k])
+- + dscComputeDelay(
+- mode_lib->vba.OutputFormat[k]));
+- }
+- mode_lib->vba.DSCDelay[k] = mode_lib->vba.DSCDelay[k]
+- * mode_lib->vba.PixelClock[k]
+- / mode_lib->vba.PixelClockBackEnd[k];
+- } else {
+- mode_lib->vba.DSCDelay[k] = 0;
+- }
+- }
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k)
+- for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) // NumberOfPlanes
+- if (j != k && mode_lib->vba.BlendingAndTiming[k] == j
+- && mode_lib->vba.DSCEnabled[j])
+- mode_lib->vba.DSCDelay[k] = mode_lib->vba.DSCDelay[j];
+-
+- // Prefetch
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- unsigned int PDEAndMetaPTEBytesFrameY;
+- unsigned int PixelPTEBytesPerRowY;
+- unsigned int MetaRowByteY;
+- unsigned int MetaRowByteC;
+- unsigned int PDEAndMetaPTEBytesFrameC;
+- unsigned int PixelPTEBytesPerRowC;
+-
+- Calculate256BBlockSizes(
+- mode_lib->vba.SourcePixelFormat[k],
+- mode_lib->vba.SurfaceTiling[k],
+- dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1),
+- dml_ceil(mode_lib->vba.BytePerPixelDETC[k], 2),
+- &mode_lib->vba.BlockHeight256BytesY[k],
+- &mode_lib->vba.BlockHeight256BytesC[k],
+- &mode_lib->vba.BlockWidth256BytesY[k],
+- &mode_lib->vba.BlockWidth256BytesC[k]);
+- PDEAndMetaPTEBytesFrameY = CalculateVMAndRowBytes(
+- mode_lib,
+- mode_lib->vba.DCCEnable[k],
+- mode_lib->vba.BlockHeight256BytesY[k],
+- mode_lib->vba.BlockWidth256BytesY[k],
+- mode_lib->vba.SourcePixelFormat[k],
+- mode_lib->vba.SurfaceTiling[k],
+- dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1),
+- mode_lib->vba.SourceScan[k],
+- mode_lib->vba.ViewportWidth[k],
+- mode_lib->vba.ViewportHeight[k],
+- mode_lib->vba.SwathWidthY[k],
+- mode_lib->vba.VirtualMemoryEnable,
+- mode_lib->vba.VMMPageSize,
+- mode_lib->vba.PTEBufferSizeInRequests,
+- mode_lib->vba.PDEProcessingBufIn64KBReqs,
+- mode_lib->vba.PitchY[k],
+- mode_lib->vba.DCCMetaPitchY[k],
+- &mode_lib->vba.MacroTileWidthY[k],
+- &MetaRowByteY,
+- &PixelPTEBytesPerRowY,
+- &mode_lib->vba.PTEBufferSizeNotExceeded[mode_lib->vba.VoltageLevel],
+- &mode_lib->vba.dpte_row_height[k],
+- &mode_lib->vba.meta_row_height[k]);
+- mode_lib->vba.PrefetchSourceLinesY[k] = CalculatePrefetchSourceLines(
+- mode_lib,
+- mode_lib->vba.VRatio[k],
+- mode_lib->vba.vtaps[k],
+- mode_lib->vba.Interlace[k],
+- mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
+- mode_lib->vba.SwathHeightY[k],
+- mode_lib->vba.ViewportYStartY[k],
+- &mode_lib->vba.VInitPreFillY[k],
+- &mode_lib->vba.MaxNumSwathY[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_444_8)) {
+- PDEAndMetaPTEBytesFrameC =
+- CalculateVMAndRowBytes(
+- mode_lib,
+- mode_lib->vba.DCCEnable[k],
+- mode_lib->vba.BlockHeight256BytesC[k],
+- mode_lib->vba.BlockWidth256BytesC[k],
+- mode_lib->vba.SourcePixelFormat[k],
+- mode_lib->vba.SurfaceTiling[k],
+- dml_ceil(
+- mode_lib->vba.BytePerPixelDETC[k],
+- 2),
+- mode_lib->vba.SourceScan[k],
+- mode_lib->vba.ViewportWidth[k] / 2,
+- mode_lib->vba.ViewportHeight[k] / 2,
+- mode_lib->vba.SwathWidthY[k] / 2,
+- mode_lib->vba.VirtualMemoryEnable,
+- mode_lib->vba.VMMPageSize,
+- mode_lib->vba.PTEBufferSizeInRequests,
+- mode_lib->vba.PDEProcessingBufIn64KBReqs,
+- mode_lib->vba.PitchC[k],
+- 0,
+- &mode_lib->vba.MacroTileWidthC[k],
+- &MetaRowByteC,
+- &PixelPTEBytesPerRowC,
+- &mode_lib->vba.PTEBufferSizeNotExceeded[mode_lib->vba.VoltageLevel],
+- &mode_lib->vba.dpte_row_height_chroma[k],
+- &mode_lib->vba.meta_row_height_chroma[k]);
+- mode_lib->vba.PrefetchSourceLinesC[k] = CalculatePrefetchSourceLines(
+- mode_lib,
+- mode_lib->vba.VRatio[k] / 2,
+- mode_lib->vba.VTAPsChroma[k],
+- mode_lib->vba.Interlace[k],
+- mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
+- mode_lib->vba.SwathHeightC[k],
+- mode_lib->vba.ViewportYStartC[k],
+- &mode_lib->vba.VInitPreFillC[k],
+- &mode_lib->vba.MaxNumSwathC[k]);
+- } else {
+- PixelPTEBytesPerRowC = 0;
+- PDEAndMetaPTEBytesFrameC = 0;
+- MetaRowByteC = 0;
+- mode_lib->vba.MaxNumSwathC[k] = 0;
+- mode_lib->vba.PrefetchSourceLinesC[k] = 0;
+- }
+-
+- mode_lib->vba.PixelPTEBytesPerRow[k] = PixelPTEBytesPerRowY + PixelPTEBytesPerRowC;
+- mode_lib->vba.PDEAndMetaPTEBytesFrame[k] = PDEAndMetaPTEBytesFrameY
+- + PDEAndMetaPTEBytesFrameC;
+- mode_lib->vba.MetaRowByte[k] = MetaRowByteY + MetaRowByteC;
+-
+- CalculateActiveRowBandwidth(
+- mode_lib->vba.VirtualMemoryEnable,
+- mode_lib->vba.SourcePixelFormat[k],
+- mode_lib->vba.VRatio[k],
+- mode_lib->vba.DCCEnable[k],
+- mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
+- MetaRowByteY,
+- MetaRowByteC,
+- mode_lib->vba.meta_row_height[k],
+- mode_lib->vba.meta_row_height_chroma[k],
+- PixelPTEBytesPerRowY,
+- PixelPTEBytesPerRowC,
+- mode_lib->vba.dpte_row_height[k],
+- mode_lib->vba.dpte_row_height_chroma[k],
+- &mode_lib->vba.meta_row_bw[k],
+- &mode_lib->vba.dpte_row_bw[k],
+- &mode_lib->vba.qual_row_bw[k]);
+- }
+-
+- mode_lib->vba.TCalc = 24.0 / mode_lib->vba.DCFClkDeepSleep;
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.BlendingAndTiming[k] == k) {
+- if (mode_lib->vba.WritebackEnable[k] == true) {
+- mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k] =
+- mode_lib->vba.WritebackLatency
+- + CalculateWriteBackDelay(
+- mode_lib->vba.WritebackPixelFormat[k],
+- mode_lib->vba.WritebackHRatio[k],
+- mode_lib->vba.WritebackVRatio[k],
+- mode_lib->vba.WritebackLumaHTaps[k],
+- mode_lib->vba.WritebackLumaVTaps[k],
+- mode_lib->vba.WritebackChromaHTaps[k],
+- mode_lib->vba.WritebackChromaVTaps[k],
+- mode_lib->vba.WritebackDestinationWidth[k])
+- / mode_lib->vba.DISPCLK;
+- } else
+- mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k] = 0;
+- for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) {
+- if (mode_lib->vba.BlendingAndTiming[j] == k
+- && mode_lib->vba.WritebackEnable[j] == true) {
+- mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k] =
+- dml_max(
+- mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k],
+- mode_lib->vba.WritebackLatency
+- + CalculateWriteBackDelay(
+- mode_lib->vba.WritebackPixelFormat[j],
+- mode_lib->vba.WritebackHRatio[j],
+- mode_lib->vba.WritebackVRatio[j],
+- mode_lib->vba.WritebackLumaHTaps[j],
+- mode_lib->vba.WritebackLumaVTaps[j],
+- mode_lib->vba.WritebackChromaHTaps[j],
+- mode_lib->vba.WritebackChromaVTaps[j],
+- mode_lib->vba.WritebackDestinationWidth[j])
+- / mode_lib->vba.DISPCLK);
+- }
+- }
+- }
+- }
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k)
+- for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j)
+- if (mode_lib->vba.BlendingAndTiming[k] == j)
+- mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k] =
+- mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][j];
+-
+- mode_lib->vba.VStartupLines = 13;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- mode_lib->vba.MaxVStartupLines[k] =
+- mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]
+- - dml_max(
+- 1.0,
+- dml_ceil(
+- mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k]
+- / (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]),
+- 1));
+- }
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k)
+- mode_lib->vba.MaximumMaxVStartupLines = dml_max(
+- mode_lib->vba.MaximumMaxVStartupLines,
+- mode_lib->vba.MaxVStartupLines[k]);
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- mode_lib->vba.cursor_bw[k] = 0.0;
+- for (j = 0; j < mode_lib->vba.NumberOfCursors[k]; ++j)
+- mode_lib->vba.cursor_bw[k] += mode_lib->vba.CursorWidth[k][j]
+- * mode_lib->vba.CursorBPP[k][j] / 8.0
+- / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
+- * mode_lib->vba.VRatio[k];
+- }
+-
+- do {
+- double MaxTotalRDBandwidth = 0;
+- bool DestinationLineTimesForPrefetchLessThan2 = false;
+- bool VRatioPrefetchMoreThan4 = false;
+- bool prefetch_vm_bw_valid = true;
+- bool prefetch_row_bw_valid = true;
+- double TWait = CalculateTWait(
+- mode_lib->vba.PrefetchMode,
+- mode_lib->vba.DRAMClockChangeLatency,
+- mode_lib->vba.UrgentLatency,
+- mode_lib->vba.SREnterPlusExitTime);
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.XFCEnabled[k] == true) {
+- mode_lib->vba.XFCRemoteSurfaceFlipDelay =
+- CalculateRemoteSurfaceFlipDelay(
+- mode_lib,
+- mode_lib->vba.VRatio[k],
+- mode_lib->vba.SwathWidthY[k],
+- dml_ceil(
+- mode_lib->vba.BytePerPixelDETY[k],
+- 1),
+- mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k],
+- mode_lib->vba.XFCTSlvVupdateOffset,
+- mode_lib->vba.XFCTSlvVupdateWidth,
+- mode_lib->vba.XFCTSlvVreadyOffset,
+- mode_lib->vba.XFCXBUFLatencyTolerance,
+- mode_lib->vba.XFCFillBWOverhead,
+- mode_lib->vba.XFCSlvChunkSize,
+- mode_lib->vba.XFCBusTransportTime,
+- mode_lib->vba.TCalc,
+- TWait,
+- &mode_lib->vba.SrcActiveDrainRate,
+- &mode_lib->vba.TInitXFill,
+- &mode_lib->vba.TslvChk);
+- } else {
+- mode_lib->vba.XFCRemoteSurfaceFlipDelay = 0;
+- }
+- mode_lib->vba.ErrorResult[k] =
+- CalculatePrefetchSchedule(
+- mode_lib,
+- mode_lib->vba.DPPCLK[k],
+- mode_lib->vba.DISPCLK,
+- mode_lib->vba.PixelClock[k],
+- mode_lib->vba.DCFClkDeepSleep,
+- mode_lib->vba.DSCDelay[k],
+- mode_lib->vba.DPPPerPlane[k],
+- mode_lib->vba.ScalerEnabled[k],
+- mode_lib->vba.NumberOfCursors[k],
+- mode_lib->vba.DPPCLKDelaySubtotal,
+- mode_lib->vba.DPPCLKDelaySCL,
+- mode_lib->vba.DPPCLKDelaySCLLBOnly,
+- mode_lib->vba.DPPCLKDelayCNVCFormater,
+- mode_lib->vba.DPPCLKDelayCNVCCursor,
+- mode_lib->vba.DISPCLKDelaySubtotal,
+- (unsigned int) (mode_lib->vba.SwathWidthY[k]
+- / mode_lib->vba.HRatio[k]),
+- mode_lib->vba.OutputFormat[k],
+- mode_lib->vba.VTotal[k]
+- - mode_lib->vba.VActive[k],
+- mode_lib->vba.HTotal[k],
+- mode_lib->vba.MaxInterDCNTileRepeaters,
+- dml_min(
+- mode_lib->vba.VStartupLines,
+- mode_lib->vba.MaxVStartupLines[k]),
+- mode_lib->vba.MaxPageTableLevels,
+- mode_lib->vba.VirtualMemoryEnable,
+- mode_lib->vba.DynamicMetadataEnable[k],
+- mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired[k],
+- mode_lib->vba.DynamicMetadataTransmittedBytes[k],
+- mode_lib->vba.DCCEnable[k],
+- mode_lib->vba.UrgentLatency,
+- mode_lib->vba.UrgentExtraLatency,
+- mode_lib->vba.TCalc,
+- mode_lib->vba.PDEAndMetaPTEBytesFrame[k],
+- mode_lib->vba.MetaRowByte[k],
+- mode_lib->vba.PixelPTEBytesPerRow[k],
+- mode_lib->vba.PrefetchSourceLinesY[k],
+- mode_lib->vba.SwathWidthY[k],
+- mode_lib->vba.BytePerPixelDETY[k],
+- mode_lib->vba.VInitPreFillY[k],
+- mode_lib->vba.MaxNumSwathY[k],
+- mode_lib->vba.PrefetchSourceLinesC[k],
+- mode_lib->vba.BytePerPixelDETC[k],
+- mode_lib->vba.VInitPreFillC[k],
+- mode_lib->vba.MaxNumSwathC[k],
+- mode_lib->vba.SwathHeightY[k],
+- mode_lib->vba.SwathHeightC[k],
+- TWait,
+- mode_lib->vba.XFCEnabled[k],
+- mode_lib->vba.XFCRemoteSurfaceFlipDelay,
+- mode_lib->vba.Interlace[k],
+- mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
+- &mode_lib->vba.DSTXAfterScaler[k],
+- &mode_lib->vba.DSTYAfterScaler[k],
+- &mode_lib->vba.DestinationLinesForPrefetch[k],
+- &mode_lib->vba.PrefetchBandwidth[k],
+- &mode_lib->vba.DestinationLinesToRequestVMInVBlank[k],
+- &mode_lib->vba.DestinationLinesToRequestRowInVBlank[k],
+- &mode_lib->vba.VRatioPrefetchY[k],
+- &mode_lib->vba.VRatioPrefetchC[k],
+- &mode_lib->vba.RequiredPrefetchPixDataBW[k],
+- &mode_lib->vba.VStartupRequiredWhenNotEnoughTimeForDynamicMetadata,
+- &mode_lib->vba.Tno_bw[k],
+- &mode_lib->vba.VUpdateOffsetPix[k],
+- &mode_lib->vba.VUpdateWidthPix[k],
+- &mode_lib->vba.VReadyOffsetPix[k]);
+- if (mode_lib->vba.BlendingAndTiming[k] == k) {
+- mode_lib->vba.VStartup[k] = dml_min(
+- mode_lib->vba.VStartupLines,
+- mode_lib->vba.MaxVStartupLines[k]);
+- if (mode_lib->vba.VStartupRequiredWhenNotEnoughTimeForDynamicMetadata
+- != 0) {
+- mode_lib->vba.VStartup[k] =
+- mode_lib->vba.VStartupRequiredWhenNotEnoughTimeForDynamicMetadata;
+- }
+- } else {
+- mode_lib->vba.VStartup[k] =
+- dml_min(
+- mode_lib->vba.VStartupLines,
+- mode_lib->vba.MaxVStartupLines[mode_lib->vba.BlendingAndTiming[k]]);
+- }
+- }
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+-
+- if (mode_lib->vba.PDEAndMetaPTEBytesFrame[k] == 0)
+- mode_lib->vba.prefetch_vm_bw[k] = 0;
+- else if (mode_lib->vba.DestinationLinesToRequestVMInVBlank[k] > 0) {
+- mode_lib->vba.prefetch_vm_bw[k] =
+- (double) mode_lib->vba.PDEAndMetaPTEBytesFrame[k]
+- / (mode_lib->vba.DestinationLinesToRequestVMInVBlank[k]
+- * mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]);
+- } else {
+- mode_lib->vba.prefetch_vm_bw[k] = 0;
+- prefetch_vm_bw_valid = false;
+- }
+- if (mode_lib->vba.MetaRowByte[k] + mode_lib->vba.PixelPTEBytesPerRow[k]
+- == 0)
+- mode_lib->vba.prefetch_row_bw[k] = 0;
+- else if (mode_lib->vba.DestinationLinesToRequestRowInVBlank[k] > 0) {
+- mode_lib->vba.prefetch_row_bw[k] =
+- (double) (mode_lib->vba.MetaRowByte[k]
+- + mode_lib->vba.PixelPTEBytesPerRow[k])
+- / (mode_lib->vba.DestinationLinesToRequestRowInVBlank[k]
+- * mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]);
+- } else {
+- mode_lib->vba.prefetch_row_bw[k] = 0;
+- prefetch_row_bw_valid = false;
+- }
+-
+- MaxTotalRDBandwidth =
+- MaxTotalRDBandwidth + mode_lib->vba.cursor_bw[k]
+- + dml_max(
+- mode_lib->vba.prefetch_vm_bw[k],
+- dml_max(
+- mode_lib->vba.prefetch_row_bw[k],
+- dml_max(
+- mode_lib->vba.ReadBandwidthPlaneLuma[k]
+- + mode_lib->vba.ReadBandwidthPlaneChroma[k],
+- mode_lib->vba.RequiredPrefetchPixDataBW[k])
+- + mode_lib->vba.meta_row_bw[k]
+- + mode_lib->vba.dpte_row_bw[k]));
+-
+- if (mode_lib->vba.DestinationLinesForPrefetch[k] < 2)
+- DestinationLineTimesForPrefetchLessThan2 = true;
+- if (mode_lib->vba.VRatioPrefetchY[k] > 4
+- || mode_lib->vba.VRatioPrefetchC[k] > 4)
+- VRatioPrefetchMoreThan4 = true;
+- }
+-
+- if (MaxTotalRDBandwidth <= mode_lib->vba.ReturnBW && prefetch_vm_bw_valid
+- && prefetch_row_bw_valid && !VRatioPrefetchMoreThan4
+- && !DestinationLineTimesForPrefetchLessThan2)
+- mode_lib->vba.PrefetchModeSupported = true;
+- else {
+- mode_lib->vba.PrefetchModeSupported = false;
+- dml_print(
+- "DML: CalculatePrefetchSchedule ***failed***. Bandwidth violation. Results are NOT valid\n");
+- }
+-
+- if (mode_lib->vba.PrefetchModeSupported == true) {
+- double final_flip_bw[DC__NUM_DPP__MAX];
+- unsigned int ImmediateFlipBytes[DC__NUM_DPP__MAX];
+- double total_dcn_read_bw_with_flip = 0;
+-
+- mode_lib->vba.BandwidthAvailableForImmediateFlip = mode_lib->vba.ReturnBW;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- mode_lib->vba.BandwidthAvailableForImmediateFlip =
+- mode_lib->vba.BandwidthAvailableForImmediateFlip
+- - mode_lib->vba.cursor_bw[k]
+- - dml_max(
+- mode_lib->vba.ReadBandwidthPlaneLuma[k]
+- + mode_lib->vba.ReadBandwidthPlaneChroma[k]
+- + mode_lib->vba.qual_row_bw[k],
+- mode_lib->vba.PrefetchBandwidth[k]);
+- }
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- ImmediateFlipBytes[k] = 0;
+- if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8
+- && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) {
+- ImmediateFlipBytes[k] =
+- mode_lib->vba.PDEAndMetaPTEBytesFrame[k]
+- + mode_lib->vba.MetaRowByte[k]
+- + mode_lib->vba.PixelPTEBytesPerRow[k];
+- }
+- }
+- mode_lib->vba.TotImmediateFlipBytes = 0;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8
+- && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) {
+- mode_lib->vba.TotImmediateFlipBytes =
+- mode_lib->vba.TotImmediateFlipBytes
+- + ImmediateFlipBytes[k];
+- }
+- }
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- CalculateFlipSchedule(
+- mode_lib,
+- mode_lib->vba.UrgentExtraLatency,
+- mode_lib->vba.UrgentLatency,
+- mode_lib->vba.MaxPageTableLevels,
+- mode_lib->vba.VirtualMemoryEnable,
+- mode_lib->vba.BandwidthAvailableForImmediateFlip,
+- mode_lib->vba.TotImmediateFlipBytes,
+- mode_lib->vba.SourcePixelFormat[k],
+- ImmediateFlipBytes[k],
+- mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k],
+- mode_lib->vba.VRatio[k],
+- mode_lib->vba.Tno_bw[k],
+- mode_lib->vba.PDEAndMetaPTEBytesFrame[k],
+- mode_lib->vba.MetaRowByte[k],
+- mode_lib->vba.PixelPTEBytesPerRow[k],
+- mode_lib->vba.DCCEnable[k],
+- mode_lib->vba.dpte_row_height[k],
+- mode_lib->vba.meta_row_height[k],
+- mode_lib->vba.qual_row_bw[k],
+- &mode_lib->vba.DestinationLinesToRequestVMInImmediateFlip[k],
+- &mode_lib->vba.DestinationLinesToRequestRowInImmediateFlip[k],
+- &final_flip_bw[k],
+- &mode_lib->vba.ImmediateFlipSupportedForPipe[k]);
+- }
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- total_dcn_read_bw_with_flip =
+- total_dcn_read_bw_with_flip
+- + mode_lib->vba.cursor_bw[k]
+- + dml_max(
+- mode_lib->vba.prefetch_vm_bw[k],
+- dml_max(
+- mode_lib->vba.prefetch_row_bw[k],
+- final_flip_bw[k]
+- + dml_max(
+- mode_lib->vba.ReadBandwidthPlaneLuma[k]
+- + mode_lib->vba.ReadBandwidthPlaneChroma[k],
+- mode_lib->vba.RequiredPrefetchPixDataBW[k])));
+- }
+- mode_lib->vba.ImmediateFlipSupported = true;
+- if (total_dcn_read_bw_with_flip > mode_lib->vba.ReturnBW) {
+- mode_lib->vba.ImmediateFlipSupported = false;
+- }
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.ImmediateFlipSupportedForPipe[k] == false) {
+- mode_lib->vba.ImmediateFlipSupported = false;
+- }
+- }
+- } else {
+- mode_lib->vba.ImmediateFlipSupported = false;
+- }
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.ErrorResult[k]) {
+- mode_lib->vba.PrefetchModeSupported = false;
+- dml_print(
+- "DML: CalculatePrefetchSchedule ***failed***. Prefetch schedule violation. Results are NOT valid\n");
+- }
+- }
+-
+- mode_lib->vba.VStartupLines = mode_lib->vba.VStartupLines + 1;
+- } while (!((mode_lib->vba.PrefetchModeSupported
+- && (!mode_lib->vba.ImmediateFlipSupport
+- || mode_lib->vba.ImmediateFlipSupported))
+- || mode_lib->vba.MaximumMaxVStartupLines < mode_lib->vba.VStartupLines));
+-
+- //Display Pipeline Delivery Time in Prefetch
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.VRatioPrefetchY[k] <= 1) {
+- mode_lib->vba.DisplayPipeLineDeliveryTimeLumaPrefetch[k] =
+- mode_lib->vba.SwathWidthY[k] * mode_lib->vba.DPPPerPlane[k]
+- / mode_lib->vba.HRatio[k]
+- / mode_lib->vba.PixelClock[k];
+- } else {
+- mode_lib->vba.DisplayPipeLineDeliveryTimeLumaPrefetch[k] =
+- mode_lib->vba.SwathWidthY[k]
+- / mode_lib->vba.PSCL_THROUGHPUT_LUMA[k]
+- / mode_lib->vba.DPPCLK[k];
+- }
+- if (mode_lib->vba.BytePerPixelDETC[k] == 0) {
+- mode_lib->vba.DisplayPipeLineDeliveryTimeChromaPrefetch[k] = 0;
+- } else {
+- if (mode_lib->vba.VRatioPrefetchC[k] <= 1) {
+- mode_lib->vba.DisplayPipeLineDeliveryTimeChromaPrefetch[k] =
+- mode_lib->vba.SwathWidthY[k]
+- * mode_lib->vba.DPPPerPlane[k]
+- / mode_lib->vba.HRatio[k]
+- / mode_lib->vba.PixelClock[k];
+- } else {
+- mode_lib->vba.DisplayPipeLineDeliveryTimeChromaPrefetch[k] =
+- mode_lib->vba.SwathWidthY[k]
+- / mode_lib->vba.PSCL_THROUGHPUT_LUMA[k]
+- / mode_lib->vba.DPPCLK[k];
+- }
+- }
+- }
+-
+- // Min TTUVBlank
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.PrefetchMode == 0) {
+- mode_lib->vba.AllowDRAMClockChangeDuringVBlank[k] = true;
+- mode_lib->vba.AllowDRAMSelfRefreshDuringVBlank[k] = true;
+- mode_lib->vba.MinTTUVBlank[k] = dml_max(
+- mode_lib->vba.DRAMClockChangeWatermark,
+- dml_max(
+- mode_lib->vba.StutterEnterPlusExitWatermark,
+- mode_lib->vba.UrgentWatermark));
+- } else if (mode_lib->vba.PrefetchMode == 1) {
+- mode_lib->vba.AllowDRAMClockChangeDuringVBlank[k] = false;
+- mode_lib->vba.AllowDRAMSelfRefreshDuringVBlank[k] = true;
+- mode_lib->vba.MinTTUVBlank[k] = dml_max(
+- mode_lib->vba.StutterEnterPlusExitWatermark,
+- mode_lib->vba.UrgentWatermark);
+- } else {
+- mode_lib->vba.AllowDRAMClockChangeDuringVBlank[k] = false;
+- mode_lib->vba.AllowDRAMSelfRefreshDuringVBlank[k] = false;
+- mode_lib->vba.MinTTUVBlank[k] = mode_lib->vba.UrgentWatermark;
+- }
+- if (!mode_lib->vba.DynamicMetadataEnable[k])
+- mode_lib->vba.MinTTUVBlank[k] = mode_lib->vba.TCalc
+- + mode_lib->vba.MinTTUVBlank[k];
+- }
+-
+- // DCC Configuration
+- mode_lib->vba.ActiveDPPs = 0;
+- // NB P-State/DRAM Clock Change Support
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- mode_lib->vba.ActiveDPPs = mode_lib->vba.ActiveDPPs + mode_lib->vba.DPPPerPlane[k];
+- }
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- double EffectiveLBLatencyHidingY;
+- double EffectiveLBLatencyHidingC;
+- double DPPOutputBufferLinesY;
+- double DPPOutputBufferLinesC;
+- double DPPOPPBufferingY;
+- double MaxDETBufferingTimeY;
+- double ActiveDRAMClockChangeLatencyMarginY;
+-
+- mode_lib->vba.LBLatencyHidingSourceLinesY =
+- dml_min(
+- mode_lib->vba.MaxLineBufferLines,
+- (unsigned int) dml_floor(
+- (double) mode_lib->vba.LineBufferSize
+- / mode_lib->vba.LBBitPerPixel[k]
+- / (mode_lib->vba.SwathWidthY[k]
+- / dml_max(
+- mode_lib->vba.HRatio[k],
+- 1.0)),
+- 1)) - (mode_lib->vba.vtaps[k] - 1);
+-
+- mode_lib->vba.LBLatencyHidingSourceLinesC =
+- dml_min(
+- mode_lib->vba.MaxLineBufferLines,
+- (unsigned int) dml_floor(
+- (double) mode_lib->vba.LineBufferSize
+- / mode_lib->vba.LBBitPerPixel[k]
+- / (mode_lib->vba.SwathWidthY[k]
+- / 2.0
+- / dml_max(
+- mode_lib->vba.HRatio[k]
+- / 2,
+- 1.0)),
+- 1))
+- - (mode_lib->vba.VTAPsChroma[k] - 1);
+-
+- EffectiveLBLatencyHidingY = mode_lib->vba.LBLatencyHidingSourceLinesY
+- / mode_lib->vba.VRatio[k]
+- * (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]);
+-
+- EffectiveLBLatencyHidingC = mode_lib->vba.LBLatencyHidingSourceLinesC
+- / (mode_lib->vba.VRatio[k] / 2)
+- * (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]);
+-
+- if (mode_lib->vba.SwathWidthY[k] > 2 * mode_lib->vba.DPPOutputBufferPixels) {
+- DPPOutputBufferLinesY = mode_lib->vba.DPPOutputBufferPixels
+- / mode_lib->vba.SwathWidthY[k];
+- } else if (mode_lib->vba.SwathWidthY[k] > mode_lib->vba.DPPOutputBufferPixels) {
+- DPPOutputBufferLinesY = 0.5;
+- } else {
+- DPPOutputBufferLinesY = 1;
+- }
+-
+- if (mode_lib->vba.SwathWidthY[k] / 2 > 2 * mode_lib->vba.DPPOutputBufferPixels) {
+- DPPOutputBufferLinesC = mode_lib->vba.DPPOutputBufferPixels
+- / (mode_lib->vba.SwathWidthY[k] / 2);
+- } else if (mode_lib->vba.SwathWidthY[k] / 2 > mode_lib->vba.DPPOutputBufferPixels) {
+- DPPOutputBufferLinesC = 0.5;
+- } else {
+- DPPOutputBufferLinesC = 1;
+- }
+-
+- DPPOPPBufferingY = (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
+- * (DPPOutputBufferLinesY + mode_lib->vba.OPPOutputBufferLines);
+- MaxDETBufferingTimeY = mode_lib->vba.FullDETBufferingTimeY[k]
+- + (mode_lib->vba.LinesInDETY[k]
+- - mode_lib->vba.LinesInDETYRoundedDownToSwath[k])
+- / mode_lib->vba.SwathHeightY[k]
+- * (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]);
+-
+- ActiveDRAMClockChangeLatencyMarginY = DPPOPPBufferingY + EffectiveLBLatencyHidingY
+- + MaxDETBufferingTimeY - mode_lib->vba.DRAMClockChangeWatermark;
+-
+- if (mode_lib->vba.ActiveDPPs > 1) {
+- ActiveDRAMClockChangeLatencyMarginY =
+- ActiveDRAMClockChangeLatencyMarginY
+- - (1 - 1 / (mode_lib->vba.ActiveDPPs - 1))
+- * mode_lib->vba.SwathHeightY[k]
+- * (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]);
+- }
+-
+- if (mode_lib->vba.BytePerPixelDETC[k] > 0) {
+- double DPPOPPBufferingC = (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k])
+- * (DPPOutputBufferLinesC
+- + mode_lib->vba.OPPOutputBufferLines);
+- double MaxDETBufferingTimeC =
+- mode_lib->vba.FullDETBufferingTimeC[k]
+- + (mode_lib->vba.LinesInDETC[k]
+- - mode_lib->vba.LinesInDETCRoundedDownToSwath[k])
+- / mode_lib->vba.SwathHeightC[k]
+- * (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]);
+- double ActiveDRAMClockChangeLatencyMarginC = DPPOPPBufferingC
+- + EffectiveLBLatencyHidingC + MaxDETBufferingTimeC
+- - mode_lib->vba.DRAMClockChangeWatermark;
+-
+- if (mode_lib->vba.ActiveDPPs > 1) {
+- ActiveDRAMClockChangeLatencyMarginC =
+- ActiveDRAMClockChangeLatencyMarginC
+- - (1
+- - 1
+- / (mode_lib->vba.ActiveDPPs
+- - 1))
+- * mode_lib->vba.SwathHeightC[k]
+- * (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]);
+- }
+- mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] = dml_min(
+- ActiveDRAMClockChangeLatencyMarginY,
+- ActiveDRAMClockChangeLatencyMarginC);
+- } else {
+- mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] =
+- ActiveDRAMClockChangeLatencyMarginY;
+- }
+-
+- if (mode_lib->vba.WritebackEnable[k]) {
+- double WritebackDRAMClockChangeLatencyMargin;
+-
+- if (mode_lib->vba.WritebackPixelFormat[k] == dm_444_32) {
+- WritebackDRAMClockChangeLatencyMargin =
+- (double) (mode_lib->vba.WritebackInterfaceLumaBufferSize
+- + mode_lib->vba.WritebackInterfaceChromaBufferSize)
+- / (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)
+- - mode_lib->vba.WritebackDRAMClockChangeWatermark;
+- } else if (mode_lib->vba.WritebackPixelFormat[k] == dm_420_10) {
+- WritebackDRAMClockChangeLatencyMargin =
+- dml_min(
+- (double) mode_lib->vba.WritebackInterfaceLumaBufferSize
+- * 8.0 / 10,
+- 2.0
+- * mode_lib->vba.WritebackInterfaceChromaBufferSize
+- * 8 / 10)
+- / (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]))
+- - mode_lib->vba.WritebackDRAMClockChangeWatermark;
+- } else {
+- WritebackDRAMClockChangeLatencyMargin =
+- dml_min(
+- (double) mode_lib->vba.WritebackInterfaceLumaBufferSize,
+- 2.0
+- * mode_lib->vba.WritebackInterfaceChromaBufferSize)
+- / (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]))
+- - mode_lib->vba.WritebackDRAMClockChangeWatermark;
+- }
+- mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] = dml_min(
+- mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k],
+- WritebackDRAMClockChangeLatencyMargin);
+- }
+- }
+-
+- mode_lib->vba.MinActiveDRAMClockChangeMargin = 999999;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k]
+- < mode_lib->vba.MinActiveDRAMClockChangeMargin) {
+- mode_lib->vba.MinActiveDRAMClockChangeMargin =
+- mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k];
+- }
+- }
+-
+- mode_lib->vba.MinActiveDRAMClockChangeLatencySupported =
+- mode_lib->vba.MinActiveDRAMClockChangeMargin
+- + mode_lib->vba.DRAMClockChangeLatency;
+-
+- if (mode_lib->vba.MinActiveDRAMClockChangeMargin > 0) {
+- mode_lib->vba.DRAMClockChangeSupport = dm_dram_clock_change_vactive;
+- } else {
+- if (mode_lib->vba.SynchronizedVBlank || mode_lib->vba.NumberOfActivePlanes == 1) {
+- mode_lib->vba.DRAMClockChangeSupport = dm_dram_clock_change_vblank;
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (!mode_lib->vba.AllowDRAMClockChangeDuringVBlank[k]) {
+- mode_lib->vba.DRAMClockChangeSupport =
+- dm_dram_clock_change_unsupported;
+- }
+- }
+- } else {
+- mode_lib->vba.DRAMClockChangeSupport = dm_dram_clock_change_unsupported;
+- }
+- }
+-
+- //XFC Parameters:
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- if (mode_lib->vba.XFCEnabled[k] == true) {
+- double TWait;
+-
+- mode_lib->vba.XFCSlaveVUpdateOffset[k] = mode_lib->vba.XFCTSlvVupdateOffset;
+- mode_lib->vba.XFCSlaveVupdateWidth[k] = mode_lib->vba.XFCTSlvVupdateWidth;
+- mode_lib->vba.XFCSlaveVReadyOffset[k] = mode_lib->vba.XFCTSlvVreadyOffset;
+- TWait = CalculateTWait(
+- mode_lib->vba.PrefetchMode,
+- mode_lib->vba.DRAMClockChangeLatency,
+- mode_lib->vba.UrgentLatency,
+- mode_lib->vba.SREnterPlusExitTime);
+- mode_lib->vba.XFCRemoteSurfaceFlipDelay = CalculateRemoteSurfaceFlipDelay(
+- mode_lib,
+- mode_lib->vba.VRatio[k],
+- mode_lib->vba.SwathWidthY[k],
+- dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1),
+- mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k],
+- mode_lib->vba.XFCTSlvVupdateOffset,
+- mode_lib->vba.XFCTSlvVupdateWidth,
+- mode_lib->vba.XFCTSlvVreadyOffset,
+- mode_lib->vba.XFCXBUFLatencyTolerance,
+- mode_lib->vba.XFCFillBWOverhead,
+- mode_lib->vba.XFCSlvChunkSize,
+- mode_lib->vba.XFCBusTransportTime,
+- mode_lib->vba.TCalc,
+- TWait,
+- &mode_lib->vba.SrcActiveDrainRate,
+- &mode_lib->vba.TInitXFill,
+- &mode_lib->vba.TslvChk);
+- mode_lib->vba.XFCRemoteSurfaceFlipLatency[k] =
+- dml_floor(
+- mode_lib->vba.XFCRemoteSurfaceFlipDelay
+- / (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]),
+- 1);
+- mode_lib->vba.XFCTransferDelay[k] =
+- dml_ceil(
+- mode_lib->vba.XFCBusTransportTime
+- / (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]),
+- 1);
+- mode_lib->vba.XFCPrechargeDelay[k] =
+- dml_ceil(
+- (mode_lib->vba.XFCBusTransportTime
+- + mode_lib->vba.TInitXFill
+- + mode_lib->vba.TslvChk)
+- / (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]),
+- 1);
+- mode_lib->vba.InitFillLevel = mode_lib->vba.XFCXBUFLatencyTolerance
+- * mode_lib->vba.SrcActiveDrainRate;
+- mode_lib->vba.FinalFillMargin =
+- (mode_lib->vba.DestinationLinesToRequestVMInVBlank[k]
+- + mode_lib->vba.DestinationLinesToRequestRowInVBlank[k])
+- * mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]
+- * mode_lib->vba.SrcActiveDrainRate
+- + mode_lib->vba.XFCFillConstant;
+- mode_lib->vba.FinalFillLevel = mode_lib->vba.XFCRemoteSurfaceFlipDelay
+- * mode_lib->vba.SrcActiveDrainRate
+- + mode_lib->vba.FinalFillMargin;
+- mode_lib->vba.RemainingFillLevel = dml_max(
+- 0.0,
+- mode_lib->vba.FinalFillLevel - mode_lib->vba.InitFillLevel);
+- mode_lib->vba.TFinalxFill = mode_lib->vba.RemainingFillLevel
+- / (mode_lib->vba.SrcActiveDrainRate
+- * mode_lib->vba.XFCFillBWOverhead / 100);
+- mode_lib->vba.XFCPrefetchMargin[k] =
+- mode_lib->vba.XFCRemoteSurfaceFlipDelay
+- + mode_lib->vba.TFinalxFill
+- + (mode_lib->vba.DestinationLinesToRequestVMInVBlank[k]
+- + mode_lib->vba.DestinationLinesToRequestRowInVBlank[k])
+- * mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k];
+- } else {
+- mode_lib->vba.XFCSlaveVUpdateOffset[k] = 0;
+- mode_lib->vba.XFCSlaveVupdateWidth[k] = 0;
+- mode_lib->vba.XFCSlaveVReadyOffset[k] = 0;
+- mode_lib->vba.XFCRemoteSurfaceFlipLatency[k] = 0;
+- mode_lib->vba.XFCPrechargeDelay[k] = 0;
+- mode_lib->vba.XFCTransferDelay[k] = 0;
+- mode_lib->vba.XFCPrefetchMargin[k] = 0;
+- }
+- }
+-}
+-
+-static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib)
+-{
+- double BytePerPixDETY;
+- double BytePerPixDETC;
+- double Read256BytesBlockHeightY;
+- double Read256BytesBlockHeightC;
+- double Read256BytesBlockWidthY;
+- double Read256BytesBlockWidthC;
+- double MaximumSwathHeightY;
+- double MaximumSwathHeightC;
+- double MinimumSwathHeightY;
+- double MinimumSwathHeightC;
+- double SwathWidth;
+- double SwathWidthGranularityY;
+- double SwathWidthGranularityC;
+- double RoundedUpMaxSwathSizeBytesY;
+- double RoundedUpMaxSwathSizeBytesC;
+- unsigned int j, k;
+-
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- bool MainPlaneDoesODMCombine = false;
+-
+- if (mode_lib->vba.SourcePixelFormat[k] == dm_444_64) {
+- BytePerPixDETY = 8;
+- BytePerPixDETC = 0;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_32) {
+- BytePerPixDETY = 4;
+- BytePerPixDETC = 0;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_16) {
+- BytePerPixDETY = 2;
+- BytePerPixDETC = 0;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_8) {
+- BytePerPixDETY = 1;
+- BytePerPixDETC = 0;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8) {
+- BytePerPixDETY = 1;
+- BytePerPixDETC = 2;
+- } else {
+- BytePerPixDETY = 4.0 / 3.0;
+- BytePerPixDETC = 8.0 / 3.0;
+- }
+-
+- 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)) {
+- if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) {
+- Read256BytesBlockHeightY = 1;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_64) {
+- Read256BytesBlockHeightY = 4;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_32
+- || mode_lib->vba.SourcePixelFormat[k] == dm_444_16) {
+- Read256BytesBlockHeightY = 8;
+- } else {
+- Read256BytesBlockHeightY = 16;
+- }
+- Read256BytesBlockWidthY = 256 / dml_ceil(BytePerPixDETY, 1)
+- / Read256BytesBlockHeightY;
+- Read256BytesBlockHeightC = 0;
+- Read256BytesBlockWidthC = 0;
+- } else {
+- if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) {
+- Read256BytesBlockHeightY = 1;
+- Read256BytesBlockHeightC = 1;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8) {
+- Read256BytesBlockHeightY = 16;
+- Read256BytesBlockHeightC = 8;
+- } else {
+- Read256BytesBlockHeightY = 8;
+- Read256BytesBlockHeightC = 8;
+- }
+- Read256BytesBlockWidthY = 256 / dml_ceil(BytePerPixDETY, 1)
+- / Read256BytesBlockHeightY;
+- Read256BytesBlockWidthC = 256 / dml_ceil(BytePerPixDETC, 2)
+- / Read256BytesBlockHeightC;
+- }
+-
+- if (mode_lib->vba.SourceScan[k] == dm_horz) {
+- MaximumSwathHeightY = Read256BytesBlockHeightY;
+- MaximumSwathHeightC = Read256BytesBlockHeightC;
+- } else {
+- MaximumSwathHeightY = Read256BytesBlockWidthY;
+- MaximumSwathHeightC = Read256BytesBlockWidthC;
+- }
+-
+- 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)) {
+- if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear
+- || (mode_lib->vba.SourcePixelFormat[k] == dm_444_64
+- && (mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_4kb_s
+- || mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_4kb_s_x
+- || mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_64kb_s
+- || mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_64kb_s_t
+- || mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_64kb_s_x
+- || mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_var_s
+- || mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_var_s_x)
+- && mode_lib->vba.SourceScan[k] == dm_horz)) {
+- MinimumSwathHeightY = MaximumSwathHeightY;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_8
+- && mode_lib->vba.SourceScan[k] != dm_horz) {
+- MinimumSwathHeightY = MaximumSwathHeightY;
+- } else {
+- MinimumSwathHeightY = MaximumSwathHeightY / 2.0;
+- }
+- MinimumSwathHeightC = MaximumSwathHeightC;
+- } else {
+- if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) {
+- MinimumSwathHeightY = MaximumSwathHeightY;
+- MinimumSwathHeightC = MaximumSwathHeightC;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8
+- && mode_lib->vba.SourceScan[k] == dm_horz) {
+- MinimumSwathHeightY = MaximumSwathHeightY / 2.0;
+- MinimumSwathHeightC = MaximumSwathHeightC;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10
+- && mode_lib->vba.SourceScan[k] == dm_horz) {
+- MinimumSwathHeightC = MaximumSwathHeightC / 2.0;
+- MinimumSwathHeightY = MaximumSwathHeightY;
+- } else {
+- MinimumSwathHeightY = MaximumSwathHeightY;
+- MinimumSwathHeightC = MaximumSwathHeightC;
+- }
+- }
+-
+- if (mode_lib->vba.SourceScan[k] == dm_horz) {
+- SwathWidth = mode_lib->vba.ViewportWidth[k];
+- } else {
+- SwathWidth = mode_lib->vba.ViewportHeight[k];
+- }
+-
+- if (mode_lib->vba.ODMCombineEnabled[k] == true) {
+- MainPlaneDoesODMCombine = true;
+- }
+- for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) {
+- if (mode_lib->vba.BlendingAndTiming[k] == j
+- && mode_lib->vba.ODMCombineEnabled[j] == true) {
+- MainPlaneDoesODMCombine = true;
+- }
+- }
+-
+- if (MainPlaneDoesODMCombine == true) {
+- SwathWidth = dml_min(
+- SwathWidth,
+- mode_lib->vba.HActive[k] / 2.0 * mode_lib->vba.HRatio[k]);
+- } else {
+- SwathWidth = SwathWidth / mode_lib->vba.DPPPerPlane[k];
+- }
+-
+- SwathWidthGranularityY = 256 / dml_ceil(BytePerPixDETY, 1) / MaximumSwathHeightY;
+- RoundedUpMaxSwathSizeBytesY = (dml_ceil(
+- (double) (SwathWidth - 1),
+- SwathWidthGranularityY) + SwathWidthGranularityY) * BytePerPixDETY
+- * MaximumSwathHeightY;
+- if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10) {
+- RoundedUpMaxSwathSizeBytesY = dml_ceil(RoundedUpMaxSwathSizeBytesY, 256)
+- + 256;
+- }
+- if (MaximumSwathHeightC > 0) {
+- SwathWidthGranularityC = 256.0 / dml_ceil(BytePerPixDETC, 2)
+- / MaximumSwathHeightC;
+- RoundedUpMaxSwathSizeBytesC = (dml_ceil(
+- (double) (SwathWidth / 2.0 - 1),
+- SwathWidthGranularityC) + SwathWidthGranularityC)
+- * BytePerPixDETC * MaximumSwathHeightC;
+- if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10) {
+- RoundedUpMaxSwathSizeBytesC = dml_ceil(
+- RoundedUpMaxSwathSizeBytesC,
+- 256) + 256;
+- }
+- } else
+- RoundedUpMaxSwathSizeBytesC = 0.0;
+-
+- if (RoundedUpMaxSwathSizeBytesY + RoundedUpMaxSwathSizeBytesC
+- <= mode_lib->vba.DETBufferSizeInKByte * 1024.0 / 2.0) {
+- mode_lib->vba.SwathHeightY[k] = MaximumSwathHeightY;
+- mode_lib->vba.SwathHeightC[k] = MaximumSwathHeightC;
+- } else {
+- mode_lib->vba.SwathHeightY[k] = MinimumSwathHeightY;
+- mode_lib->vba.SwathHeightC[k] = MinimumSwathHeightC;
+- }
+-
+- if (mode_lib->vba.SwathHeightC[k] == 0) {
+- mode_lib->vba.DETBufferSizeY[k] = mode_lib->vba.DETBufferSizeInKByte * 1024;
+- mode_lib->vba.DETBufferSizeC[k] = 0;
+- } else if (mode_lib->vba.SwathHeightY[k] <= mode_lib->vba.SwathHeightC[k]) {
+- mode_lib->vba.DETBufferSizeY[k] = mode_lib->vba.DETBufferSizeInKByte
+- * 1024.0 / 2;
+- mode_lib->vba.DETBufferSizeC[k] = mode_lib->vba.DETBufferSizeInKByte
+- * 1024.0 / 2;
+- } else {
+- mode_lib->vba.DETBufferSizeY[k] = mode_lib->vba.DETBufferSizeInKByte
+- * 1024.0 * 2 / 3;
+- mode_lib->vba.DETBufferSizeC[k] = mode_lib->vba.DETBufferSizeInKByte
+- * 1024.0 / 3;
+- }
+- }
+-}
+-
+-bool Calculate256BBlockSizes(
+- enum source_format_class SourcePixelFormat,
+- enum dm_swizzle_mode SurfaceTiling,
+- unsigned int BytePerPixelY,
+- unsigned int BytePerPixelC,
+- unsigned int *BlockHeight256BytesY,
+- unsigned int *BlockHeight256BytesC,
+- unsigned int *BlockWidth256BytesY,
+- unsigned int *BlockWidth256BytesC)
+-{
+- if ((SourcePixelFormat == dm_444_64 || SourcePixelFormat == dm_444_32
+- || SourcePixelFormat == dm_444_16
+- || SourcePixelFormat == dm_444_8)) {
+- if (SurfaceTiling == dm_sw_linear) {
+- *BlockHeight256BytesY = 1;
+- } else if (SourcePixelFormat == dm_444_64) {
+- *BlockHeight256BytesY = 4;
+- } else if (SourcePixelFormat == dm_444_8) {
+- *BlockHeight256BytesY = 16;
+- } else {
+- *BlockHeight256BytesY = 8;
+- }
+- *BlockWidth256BytesY = 256 / BytePerPixelY / *BlockHeight256BytesY;
+- *BlockHeight256BytesC = 0;
+- *BlockWidth256BytesC = 0;
+- } else {
+- if (SurfaceTiling == dm_sw_linear) {
+- *BlockHeight256BytesY = 1;
+- *BlockHeight256BytesC = 1;
+- } else if (SourcePixelFormat == dm_420_8) {
+- *BlockHeight256BytesY = 16;
+- *BlockHeight256BytesC = 8;
+- } else {
+- *BlockHeight256BytesY = 8;
+- *BlockHeight256BytesC = 8;
+- }
+- *BlockWidth256BytesY = 256 / BytePerPixelY / *BlockHeight256BytesY;
+- *BlockWidth256BytesC = 256 / BytePerPixelC / *BlockHeight256BytesC;
+- }
+- return true;
+-}
+-
+-static double CalculateTWait(
+- unsigned int PrefetchMode,
+- double DRAMClockChangeLatency,
+- double UrgentLatency,
+- double SREnterPlusExitTime)
+-{
+- if (PrefetchMode == 0) {
+- return dml_max(
+- DRAMClockChangeLatency + UrgentLatency,
+- dml_max(SREnterPlusExitTime, UrgentLatency));
+- } else if (PrefetchMode == 1) {
+- return dml_max(SREnterPlusExitTime, UrgentLatency);
+- } else {
+- return UrgentLatency;
+- }
+-}
+-
+-static double CalculateRemoteSurfaceFlipDelay(
+- struct display_mode_lib *mode_lib,
+- double VRatio,
+- double SwathWidth,
+- double Bpp,
+- double LineTime,
+- double XFCTSlvVupdateOffset,
+- double XFCTSlvVupdateWidth,
+- double XFCTSlvVreadyOffset,
+- double XFCXBUFLatencyTolerance,
+- double XFCFillBWOverhead,
+- double XFCSlvChunkSize,
+- double XFCBusTransportTime,
+- double TCalc,
+- double TWait,
+- double *SrcActiveDrainRate,
+- double *TInitXFill,
+- double *TslvChk)
+-{
+- double TSlvSetup, AvgfillRate, result;
+-
+- *SrcActiveDrainRate = VRatio * SwathWidth * Bpp / LineTime;
+- TSlvSetup = XFCTSlvVupdateOffset + XFCTSlvVupdateWidth + XFCTSlvVreadyOffset;
+- *TInitXFill = XFCXBUFLatencyTolerance / (1 + XFCFillBWOverhead / 100);
+- AvgfillRate = *SrcActiveDrainRate * (1 + XFCFillBWOverhead / 100);
+- *TslvChk = XFCSlvChunkSize / AvgfillRate;
+- dml_print(
+- "DML::CalculateRemoteSurfaceFlipDelay: SrcActiveDrainRate: %f\n",
+- *SrcActiveDrainRate);
+- dml_print("DML::CalculateRemoteSurfaceFlipDelay: TSlvSetup: %f\n", TSlvSetup);
+- dml_print("DML::CalculateRemoteSurfaceFlipDelay: TInitXFill: %f\n", *TInitXFill);
+- dml_print("DML::CalculateRemoteSurfaceFlipDelay: AvgfillRate: %f\n", AvgfillRate);
+- dml_print("DML::CalculateRemoteSurfaceFlipDelay: TslvChk: %f\n", *TslvChk);
+- result = 2 * XFCBusTransportTime + TSlvSetup + TCalc + TWait + *TslvChk + *TInitXFill; // TODO: This doesn't seem to match programming guide
+- dml_print("DML::CalculateRemoteSurfaceFlipDelay: RemoteSurfaceFlipDelay: %f\n", result);
+- return result;
+-}
+-
+-static double CalculateWriteBackDISPCLK(
+- enum source_format_class WritebackPixelFormat,
+- double PixelClock,
+- double WritebackHRatio,
+- double WritebackVRatio,
+- unsigned int WritebackLumaHTaps,
+- unsigned int WritebackLumaVTaps,
+- unsigned int WritebackChromaHTaps,
+- unsigned int WritebackChromaVTaps,
+- double WritebackDestinationWidth,
+- unsigned int HTotal,
+- unsigned int WritebackChromaLineBufferWidth)
+-{
+- double CalculateWriteBackDISPCLK =
+- 1.01 * PixelClock
+- * dml_max(
+- dml_ceil(WritebackLumaHTaps / 4.0, 1)
+- / WritebackHRatio,
+- dml_max(
+- (WritebackLumaVTaps
+- * dml_ceil(
+- 1.0
+- / WritebackVRatio,
+- 1)
+- * dml_ceil(
+- WritebackDestinationWidth
+- / 4.0,
+- 1)
+- + dml_ceil(
+- WritebackDestinationWidth
+- / 4.0,
+- 1))
+- / (double) HTotal
+- + dml_ceil(
+- 1.0
+- / WritebackVRatio,
+- 1)
+- * (dml_ceil(
+- WritebackLumaVTaps
+- / 4.0,
+- 1)
+- + 4.0)
+- / (double) HTotal,
+- dml_ceil(
+- 1.0
+- / WritebackVRatio,
+- 1)
+- * WritebackDestinationWidth
+- / (double) HTotal));
+- if (WritebackPixelFormat != dm_444_32) {
+- CalculateWriteBackDISPCLK =
+- dml_max(
+- CalculateWriteBackDISPCLK,
+- 1.01 * PixelClock
+- * dml_max(
+- dml_ceil(
+- WritebackChromaHTaps
+- / 2.0,
+- 1)
+- / (2
+- * WritebackHRatio),
+- dml_max(
+- (WritebackChromaVTaps
+- * dml_ceil(
+- 1
+- / (2
+- * WritebackVRatio),
+- 1)
+- * dml_ceil(
+- WritebackDestinationWidth
+- / 2.0
+- / 2.0,
+- 1)
+- + dml_ceil(
+- WritebackDestinationWidth
+- / 2.0
+- / WritebackChromaLineBufferWidth,
+- 1))
+- / HTotal
+- + dml_ceil(
+- 1
+- / (2
+- * WritebackVRatio),
+- 1)
+- * (dml_ceil(
+- WritebackChromaVTaps
+- / 4.0,
+- 1)
+- + 4)
+- / HTotal,
+- dml_ceil(
+- 1.0
+- / (2
+- * WritebackVRatio),
+- 1)
+- * WritebackDestinationWidth
+- / 2.0
+- / HTotal)));
+- }
+- return CalculateWriteBackDISPCLK;
+-}
+-
+-static double CalculateWriteBackDelay(
+- enum source_format_class WritebackPixelFormat,
+- double WritebackHRatio,
+- double WritebackVRatio,
+- unsigned int WritebackLumaHTaps,
+- unsigned int WritebackLumaVTaps,
+- unsigned int WritebackChromaHTaps,
+- unsigned int WritebackChromaVTaps,
+- unsigned int WritebackDestinationWidth)
+-{
+- double CalculateWriteBackDelay =
+- dml_max(
+- dml_ceil(WritebackLumaHTaps / 4.0, 1) / WritebackHRatio,
+- WritebackLumaVTaps * dml_ceil(1.0 / WritebackVRatio, 1)
+- * dml_ceil(
+- WritebackDestinationWidth
+- / 4.0,
+- 1)
+- + dml_ceil(1.0 / WritebackVRatio, 1)
+- * (dml_ceil(
+- WritebackLumaVTaps
+- / 4.0,
+- 1) + 4));
+-
+- if (WritebackPixelFormat != dm_444_32) {
+- CalculateWriteBackDelay =
+- dml_max(
+- CalculateWriteBackDelay,
+- dml_max(
+- dml_ceil(
+- WritebackChromaHTaps
+- / 2.0,
+- 1)
+- / (2
+- * WritebackHRatio),
+- WritebackChromaVTaps
+- * dml_ceil(
+- 1
+- / (2
+- * WritebackVRatio),
+- 1)
+- * dml_ceil(
+- WritebackDestinationWidth
+- / 2.0
+- / 2.0,
+- 1)
+- + dml_ceil(
+- 1
+- / (2
+- * WritebackVRatio),
+- 1)
+- * (dml_ceil(
+- WritebackChromaVTaps
+- / 4.0,
+- 1)
+- + 4)));
+- }
+- return CalculateWriteBackDelay;
+-}
+-
+-static void CalculateActiveRowBandwidth(
+- bool VirtualMemoryEnable,
+- enum source_format_class SourcePixelFormat,
+- double VRatio,
+- bool DCCEnable,
+- double LineTime,
+- unsigned int MetaRowByteLuma,
+- unsigned int MetaRowByteChroma,
+- unsigned int meta_row_height_luma,
+- unsigned int meta_row_height_chroma,
+- unsigned int PixelPTEBytesPerRowLuma,
+- unsigned int PixelPTEBytesPerRowChroma,
+- unsigned int dpte_row_height_luma,
+- unsigned int dpte_row_height_chroma,
+- double *meta_row_bw,
+- double *dpte_row_bw,
+- double *qual_row_bw)
+-{
+- if (DCCEnable != true) {
+- *meta_row_bw = 0;
+- } else if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10) {
+- *meta_row_bw = VRatio * MetaRowByteLuma / (meta_row_height_luma * LineTime)
+- + VRatio / 2 * MetaRowByteChroma
+- / (meta_row_height_chroma * LineTime);
+- } else {
+- *meta_row_bw = VRatio * MetaRowByteLuma / (meta_row_height_luma * LineTime);
+- }
+-
+- if (VirtualMemoryEnable != true) {
+- *dpte_row_bw = 0;
+- } else if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10) {
+- *dpte_row_bw = VRatio * PixelPTEBytesPerRowLuma / (dpte_row_height_luma * LineTime)
+- + VRatio / 2 * PixelPTEBytesPerRowChroma
+- / (dpte_row_height_chroma * LineTime);
+- } else {
+- *dpte_row_bw = VRatio * PixelPTEBytesPerRowLuma / (dpte_row_height_luma * LineTime);
+- }
+-
+- if ((SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10)) {
+- *qual_row_bw = *meta_row_bw + *dpte_row_bw;
+- } else {
+- *qual_row_bw = 0;
+- }
+-}
+-
+-static void CalculateFlipSchedule(
+- struct display_mode_lib *mode_lib,
+- double UrgentExtraLatency,
+- double UrgentLatency,
+- unsigned int MaxPageTableLevels,
+- bool VirtualMemoryEnable,
+- double BandwidthAvailableForImmediateFlip,
+- unsigned int TotImmediateFlipBytes,
+- enum source_format_class SourcePixelFormat,
+- unsigned int ImmediateFlipBytes,
+- double LineTime,
+- double Tno_bw,
+- double VRatio,
+- double PDEAndMetaPTEBytesFrame,
+- unsigned int MetaRowByte,
+- unsigned int PixelPTEBytesPerRow,
+- bool DCCEnable,
+- unsigned int dpte_row_height,
+- unsigned int meta_row_height,
+- double qual_row_bw,
+- double *DestinationLinesToRequestVMInImmediateFlip,
+- double *DestinationLinesToRequestRowInImmediateFlip,
+- double *final_flip_bw,
+- bool *ImmediateFlipSupportedForPipe)
+-{
+- double min_row_time = 0.0;
+-
+- if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10) {
+- *DestinationLinesToRequestVMInImmediateFlip = 0.0;
+- *DestinationLinesToRequestRowInImmediateFlip = 0.0;
+- *final_flip_bw = qual_row_bw;
+- *ImmediateFlipSupportedForPipe = true;
+- } else {
+- double TimeForFetchingMetaPTEImmediateFlip;
+- double TimeForFetchingRowInVBlankImmediateFlip;
+-
+- if (VirtualMemoryEnable == true) {
+- mode_lib->vba.ImmediateFlipBW = BandwidthAvailableForImmediateFlip
+- * ImmediateFlipBytes / TotImmediateFlipBytes;
+- TimeForFetchingMetaPTEImmediateFlip =
+- dml_max(
+- Tno_bw
+- + PDEAndMetaPTEBytesFrame
+- / mode_lib->vba.ImmediateFlipBW,
+- dml_max(
+- UrgentExtraLatency
+- + UrgentLatency
+- * (MaxPageTableLevels
+- - 1),
+- LineTime / 4.0));
+- } else {
+- TimeForFetchingMetaPTEImmediateFlip = 0;
+- }
+-
+- *DestinationLinesToRequestVMInImmediateFlip = dml_floor(
+- 4.0 * (TimeForFetchingMetaPTEImmediateFlip / LineTime + 0.125),
+- 1) / 4.0;
+-
+- if ((VirtualMemoryEnable == true || DCCEnable == true)) {
+- mode_lib->vba.ImmediateFlipBW = BandwidthAvailableForImmediateFlip
+- * ImmediateFlipBytes / TotImmediateFlipBytes;
+- TimeForFetchingRowInVBlankImmediateFlip = dml_max(
+- (MetaRowByte + PixelPTEBytesPerRow)
+- / mode_lib->vba.ImmediateFlipBW,
+- dml_max(UrgentLatency, LineTime / 4.0));
+- } else {
+- TimeForFetchingRowInVBlankImmediateFlip = 0;
+- }
+-
+- *DestinationLinesToRequestRowInImmediateFlip = dml_floor(
+- 4.0 * (TimeForFetchingRowInVBlankImmediateFlip / LineTime + 0.125),
+- 1) / 4.0;
+-
+- if (VirtualMemoryEnable == true) {
+- *final_flip_bw =
+- dml_max(
+- PDEAndMetaPTEBytesFrame
+- / (*DestinationLinesToRequestVMInImmediateFlip
+- * LineTime),
+- (MetaRowByte + PixelPTEBytesPerRow)
+- / (TimeForFetchingRowInVBlankImmediateFlip
+- * LineTime));
+- } else if (MetaRowByte + PixelPTEBytesPerRow > 0) {
+- *final_flip_bw = (MetaRowByte + PixelPTEBytesPerRow)
+- / (TimeForFetchingRowInVBlankImmediateFlip * LineTime);
+- } else {
+- *final_flip_bw = 0;
+- }
+-
+- if (VirtualMemoryEnable && !DCCEnable)
+- min_row_time = dpte_row_height * LineTime / VRatio;
+- else if (!VirtualMemoryEnable && DCCEnable)
+- min_row_time = meta_row_height * LineTime / VRatio;
+- else
+- min_row_time = dml_min(dpte_row_height, meta_row_height) * LineTime
+- / VRatio;
+-
+- if (*DestinationLinesToRequestVMInImmediateFlip >= 8
+- || *DestinationLinesToRequestRowInImmediateFlip >= 16
+- || TimeForFetchingMetaPTEImmediateFlip
+- + 2 * TimeForFetchingRowInVBlankImmediateFlip
+- > min_row_time)
+- *ImmediateFlipSupportedForPipe = false;
+- else
+- *ImmediateFlipSupportedForPipe = true;
+- }
+-}
+-
+-static void PixelClockAdjustmentForProgressiveToInterlaceUnit(struct display_mode_lib *mode_lib)
+-{
+- unsigned int k;
+-
+- //Progressive To dml_ml->vba.Interlace Unit Effect
+- for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+- mode_lib->vba.PixelClockBackEnd[k] = mode_lib->vba.PixelClock[k];
+- if (mode_lib->vba.Interlace[k] == 1
+- && mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true) {
+- mode_lib->vba.PixelClock[k] = 2 * mode_lib->vba.PixelClock[k];
+- }
+- }
+-}
+-
+-static unsigned int CursorBppEnumToBits(enum cursor_bpp ebpp)
+-{
+- switch (ebpp) {
+- case dm_cur_2bit:
+- return 2;
+- case dm_cur_32bit:
+- return 32;
+- case dm_cur_64bit:
+- return 64;
+- default:
+- return 0;
+- }
+-}
+-
+-static unsigned int TruncToValidBPP(
+- double DecimalBPP,
+- bool DSCEnabled,
+- enum output_encoder_class Output,
+- enum output_format_class Format,
+- unsigned int DSCInputBitPerComponent)
+-{
+- if (Output == dm_hdmi) {
+- if (Format == dm_420) {
+- if (DecimalBPP >= 18)
+- return 18;
+- else if (DecimalBPP >= 15)
+- return 15;
+- else if (DecimalBPP >= 12)
+- return 12;
+- else
+- return BPP_INVALID;
+- } else if (Format == dm_444) {
+- if (DecimalBPP >= 36)
+- return 36;
+- else if (DecimalBPP >= 30)
+- return 30;
+- else if (DecimalBPP >= 24)
+- return 24;
+- else
+- return BPP_INVALID;
+- } else {
+- if (DecimalBPP / 1.5 >= 24)
+- return 24;
+- else if (DecimalBPP / 1.5 >= 20)
+- return 20;
+- else if (DecimalBPP / 1.5 >= 16)
+- return 16;
+- else
+- return BPP_INVALID;
+- }
+- } else {
+- if (DSCEnabled) {
+- if (Format == dm_420) {
+- if (DecimalBPP < 6)
+- return BPP_INVALID;
+- else if (DecimalBPP >= 1.5 * DSCInputBitPerComponent - 1 / 16)
+- return 1.5 * DSCInputBitPerComponent - 1 / 16;
+- else
+- return dml_floor(16 * DecimalBPP, 1) / 16;
+- } else if (Format == dm_n422) {
+- if (DecimalBPP < 7)
+- return BPP_INVALID;
+- else if (DecimalBPP >= 2 * DSCInputBitPerComponent - 1 / 16)
+- return 2 * DSCInputBitPerComponent - 1 / 16;
+- else
+- return dml_floor(16 * DecimalBPP, 1) / 16;
+- } else {
+- if (DecimalBPP < 8)
+- return BPP_INVALID;
+- else if (DecimalBPP >= 3 * DSCInputBitPerComponent - 1 / 16)
+- return 3 * DSCInputBitPerComponent - 1 / 16;
+- else
+- return dml_floor(16 * DecimalBPP, 1) / 16;
+- }
+- } else if (Format == dm_420) {
+- if (DecimalBPP >= 18)
+- return 18;
+- else if (DecimalBPP >= 15)
+- return 15;
+- else if (DecimalBPP >= 12)
+- return 12;
+- else
+- return BPP_INVALID;
+- } else if (Format == dm_s422 || Format == dm_n422) {
+- if (DecimalBPP >= 24)
+- return 24;
+- else if (DecimalBPP >= 20)
+- return 20;
+- else if (DecimalBPP >= 16)
+- return 16;
+- else
+- return BPP_INVALID;
+- } else {
+- if (DecimalBPP >= 36)
+- return 36;
+- else if (DecimalBPP >= 30)
+- return 30;
+- else if (DecimalBPP >= 24)
+- return 24;
+- else
+- return BPP_INVALID;
+- }
+- }
+-}
+-
+-static void ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib)
+-{
+- int i;
+- unsigned int j, k;
+- /*MODE SUPPORT, VOLTAGE STATE AND SOC CONFIGURATION*/
+-
+- /*Scale Ratio, taps Support Check*/
+-
+- mode_lib->vba.ScaleRatioAndTapsSupport = true;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 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.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.HRatio[k] / 2.0
+- > mode_lib->vba.HTAPsChroma[k]
+- || mode_lib->vba.VRatio[k] / 2.0
+- > 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.NumberOfActivePlanes - 1; k++) {
+- if ((mode_lib->vba.SurfaceTiling[k] == dm_sw_linear
+- && mode_lib->vba.SourceScan[k] != dm_horz)
+- || ((mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_d
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_d_x
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d_t
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d_x
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_var_d
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_var_d_x)
+- && mode_lib->vba.SourcePixelFormat[k] != dm_444_64)
+- || (mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_r_x
+- && (mode_lib->vba.SourcePixelFormat[k] == dm_mono_8
+- || mode_lib->vba.SourcePixelFormat[k]
+- == dm_420_8
+- || mode_lib->vba.SourcePixelFormat[k]
+- == dm_420_10))
+- || (((mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_gfx7_2d_thin_gl
+- || mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_gfx7_2d_thin_lvp)
+- && !((mode_lib->vba.SourcePixelFormat[k]
+- == dm_444_64
+- || mode_lib->vba.SourcePixelFormat[k]
+- == dm_444_32)
+- && mode_lib->vba.SourceScan[k]
+- == dm_horz
+- && mode_lib->vba.SupportGFX7CompatibleTilingIn32bppAnd64bpp
+- == true
+- && mode_lib->vba.DCCEnable[k]
+- == false))
+- || (mode_lib->vba.DCCEnable[k] == true
+- && (mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_linear
+- || mode_lib->vba.SourcePixelFormat[k]
+- == dm_420_8
+- || mode_lib->vba.SourcePixelFormat[k]
+- == dm_420_10)))) {
+- mode_lib->vba.SourceFormatPixelAndScanSupport = false;
+- }
+- }
+- /*Bandwidth Support Check*/
+-
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.SourceScan[k] == dm_horz) {
+- mode_lib->vba.SwathWidthYSingleDPP[k] = mode_lib->vba.ViewportWidth[k];
+- } else {
+- mode_lib->vba.SwathWidthYSingleDPP[k] = mode_lib->vba.ViewportHeight[k];
+- }
+- if (mode_lib->vba.SourcePixelFormat[k] == dm_444_64) {
+- mode_lib->vba.BytePerPixelInDETY[k] = 8.0;
+- mode_lib->vba.BytePerPixelInDETC[k] = 0.0;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_32) {
+- mode_lib->vba.BytePerPixelInDETY[k] = 4.0;
+- mode_lib->vba.BytePerPixelInDETC[k] = 0.0;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_16
+- || mode_lib->vba.SourcePixelFormat[k] == dm_mono_16) {
+- mode_lib->vba.BytePerPixelInDETY[k] = 2.0;
+- mode_lib->vba.BytePerPixelInDETC[k] = 0.0;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_mono_8) {
+- mode_lib->vba.BytePerPixelInDETY[k] = 1.0;
+- mode_lib->vba.BytePerPixelInDETC[k] = 0.0;
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8) {
+- mode_lib->vba.BytePerPixelInDETY[k] = 1.0;
+- mode_lib->vba.BytePerPixelInDETC[k] = 2.0;
+- } else {
+- mode_lib->vba.BytePerPixelInDETY[k] = 4.0 / 3;
+- mode_lib->vba.BytePerPixelInDETC[k] = 8.0 / 3;
+- }
+- }
+- mode_lib->vba.TotalReadBandwidthConsumedGBytePerSecond = 0.0;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.ReadBandwidth[k] = mode_lib->vba.SwathWidthYSingleDPP[k]
+- * (dml_ceil(mode_lib->vba.BytePerPixelInDETY[k], 1.0)
+- * mode_lib->vba.VRatio[k]
+- + dml_ceil(mode_lib->vba.BytePerPixelInDETC[k], 2.0)
+- / 2.0 * mode_lib->vba.VRatio[k] / 2)
+- / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]);
+- if (mode_lib->vba.DCCEnable[k] == true) {
+- mode_lib->vba.ReadBandwidth[k] = mode_lib->vba.ReadBandwidth[k]
+- * (1 + 1 / 256);
+- }
+- if (mode_lib->vba.VirtualMemoryEnable == true
+- && mode_lib->vba.SourceScan[k] != dm_horz
+- && (mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_s
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_s_x
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_d
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_d_x)) {
+- mode_lib->vba.ReadBandwidth[k] = mode_lib->vba.ReadBandwidth[k]
+- * (1 + 1 / 64);
+- } else if (mode_lib->vba.VirtualMemoryEnable == true
+- && mode_lib->vba.SourceScan[k] == dm_horz
+- && (mode_lib->vba.SourcePixelFormat[k] == dm_444_64
+- || mode_lib->vba.SourcePixelFormat[k] == dm_444_32)
+- && (mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_s
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_s_t
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_s_x
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d_t
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d_x
+- || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_r_x)) {
+- mode_lib->vba.ReadBandwidth[k] = mode_lib->vba.ReadBandwidth[k]
+- * (1 + 1 / 256);
+- } else if (mode_lib->vba.VirtualMemoryEnable == true) {
+- mode_lib->vba.ReadBandwidth[k] = mode_lib->vba.ReadBandwidth[k]
+- * (1 + 1 / 512);
+- }
+- mode_lib->vba.TotalReadBandwidthConsumedGBytePerSecond =
+- mode_lib->vba.TotalReadBandwidthConsumedGBytePerSecond
+- + mode_lib->vba.ReadBandwidth[k] / 1000.0;
+- }
+- mode_lib->vba.TotalWriteBandwidthConsumedGBytePerSecond = 0.0;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.WritebackEnable[k] == true
+- && mode_lib->vba.WritebackPixelFormat[k] == dm_444_32) {
+- mode_lib->vba.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 if (mode_lib->vba.WritebackEnable[k] == true
+- && mode_lib->vba.WritebackPixelFormat[k] == dm_420_10) {
+- mode_lib->vba.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]) * 3.0;
+- } else if (mode_lib->vba.WritebackEnable[k] == true) {
+- mode_lib->vba.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]) * 1.5;
+- } else {
+- mode_lib->vba.WriteBandwidth[k] = 0.0;
+- }
+- mode_lib->vba.TotalWriteBandwidthConsumedGBytePerSecond =
+- mode_lib->vba.TotalWriteBandwidthConsumedGBytePerSecond
+- + mode_lib->vba.WriteBandwidth[k] / 1000.0;
+- }
+- mode_lib->vba.TotalBandwidthConsumedGBytePerSecond =
+- mode_lib->vba.TotalReadBandwidthConsumedGBytePerSecond
+- + mode_lib->vba.TotalWriteBandwidthConsumedGBytePerSecond;
+- mode_lib->vba.DCCEnabledInAnyPlane = false;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.DCCEnable[k] == true) {
+- mode_lib->vba.DCCEnabledInAnyPlane = true;
+- }
+- }
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- mode_lib->vba.FabricAndDRAMBandwidthPerState[i] = dml_min(
+- mode_lib->vba.DRAMSpeedPerState[i] * mode_lib->vba.NumberOfChannels
+- * mode_lib->vba.DRAMChannelWidth,
+- mode_lib->vba.FabricClockPerState[i]
+- * mode_lib->vba.FabricDatapathToDCNDataReturn)
+- / 1000;
+- mode_lib->vba.ReturnBWToDCNPerState = dml_min(
+- mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLKPerState[i],
+- mode_lib->vba.FabricAndDRAMBandwidthPerState[i] * 1000.0)
+- * mode_lib->vba.PercentOfIdealDRAMAndFabricBWReceivedAfterUrgLatency
+- / 100;
+- mode_lib->vba.ReturnBWPerState[i] = mode_lib->vba.ReturnBWToDCNPerState;
+- if (mode_lib->vba.DCCEnabledInAnyPlane == true
+- && mode_lib->vba.ReturnBWToDCNPerState
+- > mode_lib->vba.DCFCLKPerState[i]
+- * mode_lib->vba.ReturnBusWidth
+- / 4.0) {
+- mode_lib->vba.ReturnBWPerState[i] =
+- dml_min(
+- mode_lib->vba.ReturnBWPerState[i],
+- mode_lib->vba.ReturnBWToDCNPerState * 4.0
+- * (1.0
+- - mode_lib->vba.UrgentLatency
+- / ((mode_lib->vba.ROBBufferSizeInKByte
+- - mode_lib->vba.PixelChunkSizeInKByte)
+- * 1024.0
+- / (mode_lib->vba.ReturnBWToDCNPerState
+- - mode_lib->vba.DCFCLKPerState[i]
+- * mode_lib->vba.ReturnBusWidth
+- / 4.0)
+- + mode_lib->vba.UrgentLatency)));
+- }
+- mode_lib->vba.CriticalPoint =
+- 2.0 * mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLKPerState[i]
+- * mode_lib->vba.UrgentLatency
+- / (mode_lib->vba.ReturnBWToDCNPerState
+- * mode_lib->vba.UrgentLatency
+- + (mode_lib->vba.ROBBufferSizeInKByte
+- - mode_lib->vba.PixelChunkSizeInKByte)
+- * 1024.0);
+- if (mode_lib->vba.DCCEnabledInAnyPlane == true && mode_lib->vba.CriticalPoint > 1.0
+- && mode_lib->vba.CriticalPoint < 4.0) {
+- mode_lib->vba.ReturnBWPerState[i] =
+- dml_min(
+- mode_lib->vba.ReturnBWPerState[i],
+- dml_pow(
+- 4.0
+- * mode_lib->vba.ReturnBWToDCNPerState
+- * (mode_lib->vba.ROBBufferSizeInKByte
+- - mode_lib->vba.PixelChunkSizeInKByte)
+- * 1024.0
+- * mode_lib->vba.ReturnBusWidth
+- * mode_lib->vba.DCFCLKPerState[i]
+- * mode_lib->vba.UrgentLatency
+- / (mode_lib->vba.ReturnBWToDCNPerState
+- * mode_lib->vba.UrgentLatency
+- + (mode_lib->vba.ROBBufferSizeInKByte
+- - mode_lib->vba.PixelChunkSizeInKByte)
+- * 1024.0),
+- 2));
+- }
+- mode_lib->vba.ReturnBWToDCNPerState = dml_min(
+- mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLKPerState[i],
+- mode_lib->vba.FabricAndDRAMBandwidthPerState[i] * 1000.0);
+- if (mode_lib->vba.DCCEnabledInAnyPlane == true
+- && mode_lib->vba.ReturnBWToDCNPerState
+- > mode_lib->vba.DCFCLKPerState[i]
+- * mode_lib->vba.ReturnBusWidth
+- / 4.0) {
+- mode_lib->vba.ReturnBWPerState[i] =
+- dml_min(
+- mode_lib->vba.ReturnBWPerState[i],
+- mode_lib->vba.ReturnBWToDCNPerState * 4.0
+- * (1.0
+- - mode_lib->vba.UrgentLatency
+- / ((mode_lib->vba.ROBBufferSizeInKByte
+- - mode_lib->vba.PixelChunkSizeInKByte)
+- * 1024.0
+- / (mode_lib->vba.ReturnBWToDCNPerState
+- - mode_lib->vba.DCFCLKPerState[i]
+- * mode_lib->vba.ReturnBusWidth
+- / 4.0)
+- + mode_lib->vba.UrgentLatency)));
+- }
+- mode_lib->vba.CriticalPoint =
+- 2.0 * mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLKPerState[i]
+- * mode_lib->vba.UrgentLatency
+- / (mode_lib->vba.ReturnBWToDCNPerState
+- * mode_lib->vba.UrgentLatency
+- + (mode_lib->vba.ROBBufferSizeInKByte
+- - mode_lib->vba.PixelChunkSizeInKByte)
+- * 1024.0);
+- if (mode_lib->vba.DCCEnabledInAnyPlane == true && mode_lib->vba.CriticalPoint > 1.0
+- && mode_lib->vba.CriticalPoint < 4.0) {
+- mode_lib->vba.ReturnBWPerState[i] =
+- dml_min(
+- mode_lib->vba.ReturnBWPerState[i],
+- dml_pow(
+- 4.0
+- * mode_lib->vba.ReturnBWToDCNPerState
+- * (mode_lib->vba.ROBBufferSizeInKByte
+- - mode_lib->vba.PixelChunkSizeInKByte)
+- * 1024.0
+- * mode_lib->vba.ReturnBusWidth
+- * mode_lib->vba.DCFCLKPerState[i]
+- * mode_lib->vba.UrgentLatency
+- / (mode_lib->vba.ReturnBWToDCNPerState
+- * mode_lib->vba.UrgentLatency
+- + (mode_lib->vba.ROBBufferSizeInKByte
+- - mode_lib->vba.PixelChunkSizeInKByte)
+- * 1024.0),
+- 2));
+- }
+- }
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- if ((mode_lib->vba.TotalReadBandwidthConsumedGBytePerSecond * 1000.0
+- <= mode_lib->vba.ReturnBWPerState[i])
+- && (mode_lib->vba.TotalBandwidthConsumedGBytePerSecond * 1000.0
+- <= mode_lib->vba.FabricAndDRAMBandwidthPerState[i]
+- * 1000.0
+- * mode_lib->vba.PercentOfIdealDRAMAndFabricBWReceivedAfterUrgLatency
+- / 100.0)) {
+- mode_lib->vba.BandwidthSupport[i] = true;
+- } else {
+- mode_lib->vba.BandwidthSupport[i] = false;
+- }
+- }
+- /*Writeback Latency support check*/
+-
+- mode_lib->vba.WritebackLatencySupport = true;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.WritebackEnable[k] == true) {
+- if (mode_lib->vba.WritebackPixelFormat[k] == dm_444_32) {
+- if (mode_lib->vba.WriteBandwidth[k]
+- > (mode_lib->vba.WritebackInterfaceLumaBufferSize
+- + mode_lib->vba.WritebackInterfaceChromaBufferSize)
+- / mode_lib->vba.WritebackLatency) {
+- mode_lib->vba.WritebackLatencySupport = false;
+- }
+- } else {
+- if (mode_lib->vba.WriteBandwidth[k]
+- > 1.5
+- * dml_min(
+- mode_lib->vba.WritebackInterfaceLumaBufferSize,
+- 2.0
+- * mode_lib->vba.WritebackInterfaceChromaBufferSize)
+- / mode_lib->vba.WritebackLatency) {
+- mode_lib->vba.WritebackLatencySupport = false;
+- }
+- }
+- }
+- }
+- /*Re-ordering Buffer Support Check*/
+-
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- mode_lib->vba.UrgentRoundTripAndOutOfOrderLatencyPerState[i] =
+- (mode_lib->vba.RoundTripPingLatencyCycles + 32.0)
+- / mode_lib->vba.DCFCLKPerState[i]
+- + mode_lib->vba.UrgentOutOfOrderReturnPerChannel
+- * mode_lib->vba.NumberOfChannels
+- / mode_lib->vba.ReturnBWPerState[i];
+- if ((mode_lib->vba.ROBBufferSizeInKByte - mode_lib->vba.PixelChunkSizeInKByte)
+- * 1024.0 / mode_lib->vba.ReturnBWPerState[i]
+- > mode_lib->vba.UrgentRoundTripAndOutOfOrderLatencyPerState[i]) {
+- mode_lib->vba.ROBSupport[i] = true;
+- } else {
+- mode_lib->vba.ROBSupport[i] = false;
+- }
+- }
+- /*Writeback Mode Support Check*/
+-
+- mode_lib->vba.TotalNumberOfActiveWriteback = 0;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.WritebackEnable[k] == true) {
+- mode_lib->vba.TotalNumberOfActiveWriteback =
+- mode_lib->vba.TotalNumberOfActiveWriteback + 1;
+- }
+- }
+- mode_lib->vba.WritebackModeSupport = true;
+- if (mode_lib->vba.TotalNumberOfActiveWriteback > mode_lib->vba.MaxNumWriteback) {
+- mode_lib->vba.WritebackModeSupport = false;
+- }
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.WritebackEnable[k] == true
+- && mode_lib->vba.Writeback10bpc420Supported != true
+- && mode_lib->vba.WritebackPixelFormat[k] == dm_420_10) {
+- mode_lib->vba.WritebackModeSupport = false;
+- }
+- }
+- /*Writeback Scale Ratio and Taps Support Check*/
+-
+- mode_lib->vba.WritebackScaleRatioAndTapsSupport = true;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.WritebackEnable[k] == true) {
+- if (mode_lib->vba.WritebackLumaAndChromaScalingSupported == false
+- && (mode_lib->vba.WritebackHRatio[k] != 1.0
+- || mode_lib->vba.WritebackVRatio[k] != 1.0)) {
+- mode_lib->vba.WritebackScaleRatioAndTapsSupport = false;
+- }
+- 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.WritebackLumaHTaps[k]
+- > mode_lib->vba.WritebackMaxHSCLTaps
+- || mode_lib->vba.WritebackLumaVTaps[k]
+- > mode_lib->vba.WritebackMaxVSCLTaps
+- || mode_lib->vba.WritebackHRatio[k]
+- > mode_lib->vba.WritebackLumaHTaps[k]
+- || mode_lib->vba.WritebackVRatio[k]
+- > mode_lib->vba.WritebackLumaVTaps[k]
+- || (mode_lib->vba.WritebackLumaHTaps[k] > 2.0
+- && ((mode_lib->vba.WritebackLumaHTaps[k] % 2)
+- == 1))
+- || (mode_lib->vba.WritebackPixelFormat[k] != dm_444_32
+- && (mode_lib->vba.WritebackChromaHTaps[k]
+- > mode_lib->vba.WritebackMaxHSCLTaps
+- || mode_lib->vba.WritebackChromaVTaps[k]
+- > mode_lib->vba.WritebackMaxVSCLTaps
+- || 2.0
+- * mode_lib->vba.WritebackHRatio[k]
+- > mode_lib->vba.WritebackChromaHTaps[k]
+- || 2.0
+- * mode_lib->vba.WritebackVRatio[k]
+- > mode_lib->vba.WritebackChromaVTaps[k]
+- || (mode_lib->vba.WritebackChromaHTaps[k] > 2.0
+- && ((mode_lib->vba.WritebackChromaHTaps[k] % 2) == 1))))) {
+- mode_lib->vba.WritebackScaleRatioAndTapsSupport = false;
+- }
+- if (mode_lib->vba.WritebackVRatio[k] < 1.0) {
+- mode_lib->vba.WritebackLumaVExtra =
+- dml_max(1.0 - 2.0 / dml_ceil(1.0 / mode_lib->vba.WritebackVRatio[k], 1.0), 0.0);
+- } else {
+- mode_lib->vba.WritebackLumaVExtra = -1;
+- }
+- if ((mode_lib->vba.WritebackPixelFormat[k] == dm_444_32
+- && mode_lib->vba.WritebackLumaVTaps[k]
+- > (mode_lib->vba.WritebackLineBufferLumaBufferSize
+- + mode_lib->vba.WritebackLineBufferChromaBufferSize)
+- / 3.0
+- / mode_lib->vba.WritebackDestinationWidth[k]
+- - mode_lib->vba.WritebackLumaVExtra)
+- || (mode_lib->vba.WritebackPixelFormat[k] == dm_420_8
+- && mode_lib->vba.WritebackLumaVTaps[k]
+- > mode_lib->vba.WritebackLineBufferLumaBufferSize
+- / mode_lib->vba.WritebackDestinationWidth[k]
+- - mode_lib->vba.WritebackLumaVExtra)
+- || (mode_lib->vba.WritebackPixelFormat[k] == dm_420_10
+- && mode_lib->vba.WritebackLumaVTaps[k]
+- > mode_lib->vba.WritebackLineBufferLumaBufferSize
+- * 8.0 / 10.0
+- / mode_lib->vba.WritebackDestinationWidth[k]
+- - mode_lib->vba.WritebackLumaVExtra)) {
+- mode_lib->vba.WritebackScaleRatioAndTapsSupport = false;
+- }
+- if (2.0 * mode_lib->vba.WritebackVRatio[k] < 1) {
+- mode_lib->vba.WritebackChromaVExtra = 0.0;
+- } else {
+- mode_lib->vba.WritebackChromaVExtra = -1;
+- }
+- if ((mode_lib->vba.WritebackPixelFormat[k] == dm_420_8
+- && mode_lib->vba.WritebackChromaVTaps[k]
+- > mode_lib->vba.WritebackLineBufferChromaBufferSize
+- / mode_lib->vba.WritebackDestinationWidth[k]
+- - mode_lib->vba.WritebackChromaVExtra)
+- || (mode_lib->vba.WritebackPixelFormat[k] == dm_420_10
+- && mode_lib->vba.WritebackChromaVTaps[k]
+- > mode_lib->vba.WritebackLineBufferChromaBufferSize
+- * 8.0 / 10.0
+- / mode_lib->vba.WritebackDestinationWidth[k]
+- - mode_lib->vba.WritebackChromaVExtra)) {
+- mode_lib->vba.WritebackScaleRatioAndTapsSupport = false;
+- }
+- }
+- }
+- /*Maximum DISPCLK/DPPCLK Support check*/
+-
+- mode_lib->vba.WritebackRequiredDISPCLK = 0.0;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.WritebackEnable[k] == true) {
+- mode_lib->vba.WritebackRequiredDISPCLK =
+- dml_max(
+- mode_lib->vba.WritebackRequiredDISPCLK,
+- CalculateWriteBackDISPCLK(
+- mode_lib->vba.WritebackPixelFormat[k],
+- mode_lib->vba.PixelClock[k],
+- mode_lib->vba.WritebackHRatio[k],
+- mode_lib->vba.WritebackVRatio[k],
+- mode_lib->vba.WritebackLumaHTaps[k],
+- mode_lib->vba.WritebackLumaVTaps[k],
+- mode_lib->vba.WritebackChromaHTaps[k],
+- mode_lib->vba.WritebackChromaVTaps[k],
+- mode_lib->vba.WritebackDestinationWidth[k],
+- mode_lib->vba.HTotal[k],
+- mode_lib->vba.WritebackChromaLineBufferWidth));
+- }
+- }
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.HRatio[k] > 1.0) {
+- mode_lib->vba.PSCL_FACTOR[k] = dml_min(
+- mode_lib->vba.MaxDCHUBToPSCLThroughput,
+- mode_lib->vba.MaxPSCLToLBThroughput
+- * mode_lib->vba.HRatio[k]
+- / dml_ceil(
+- mode_lib->vba.htaps[k]
+- / 6.0,
+- 1.0));
+- } else {
+- mode_lib->vba.PSCL_FACTOR[k] = dml_min(
+- mode_lib->vba.MaxDCHUBToPSCLThroughput,
+- mode_lib->vba.MaxPSCLToLBThroughput);
+- }
+- if (mode_lib->vba.BytePerPixelInDETC[k] == 0.0) {
+- mode_lib->vba.PSCL_FACTOR_CHROMA[k] = 0.0;
+- mode_lib->vba.MinDPPCLKUsingSingleDPP[k] =
+- mode_lib->vba.PixelClock[k]
+- * dml_max3(
+- mode_lib->vba.vtaps[k] / 6.0
+- * dml_min(
+- 1.0,
+- mode_lib->vba.HRatio[k]),
+- mode_lib->vba.HRatio[k]
+- * mode_lib->vba.VRatio[k]
+- / mode_lib->vba.PSCL_FACTOR[k],
+- 1.0);
+- if ((mode_lib->vba.htaps[k] > 6.0 || mode_lib->vba.vtaps[k] > 6.0)
+- && mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
+- < 2.0 * mode_lib->vba.PixelClock[k]) {
+- mode_lib->vba.MinDPPCLKUsingSingleDPP[k] = 2.0
+- * mode_lib->vba.PixelClock[k];
+- }
+- } else {
+- if (mode_lib->vba.HRatio[k] / 2.0 > 1.0) {
+- mode_lib->vba.PSCL_FACTOR_CHROMA[k] =
+- dml_min(
+- mode_lib->vba.MaxDCHUBToPSCLThroughput,
+- mode_lib->vba.MaxPSCLToLBThroughput
+- * mode_lib->vba.HRatio[k]
+- / 2.0
+- / dml_ceil(
+- mode_lib->vba.HTAPsChroma[k]
+- / 6.0,
+- 1.0));
+- } else {
+- mode_lib->vba.PSCL_FACTOR_CHROMA[k] = dml_min(
+- mode_lib->vba.MaxDCHUBToPSCLThroughput,
+- mode_lib->vba.MaxPSCLToLBThroughput);
+- }
+- mode_lib->vba.MinDPPCLKUsingSingleDPP[k] =
+- mode_lib->vba.PixelClock[k]
+- * dml_max5(
+- mode_lib->vba.vtaps[k] / 6.0
+- * dml_min(
+- 1.0,
+- mode_lib->vba.HRatio[k]),
+- mode_lib->vba.HRatio[k]
+- * mode_lib->vba.VRatio[k]
+- / mode_lib->vba.PSCL_FACTOR[k],
+- mode_lib->vba.VTAPsChroma[k]
+- / 6.0
+- * dml_min(
+- 1.0,
+- mode_lib->vba.HRatio[k]
+- / 2.0),
+- mode_lib->vba.HRatio[k]
+- * mode_lib->vba.VRatio[k]
+- / 4.0
+- / mode_lib->vba.PSCL_FACTOR_CHROMA[k],
+- 1.0);
+- if ((mode_lib->vba.htaps[k] > 6.0 || mode_lib->vba.vtaps[k] > 6.0
+- || mode_lib->vba.HTAPsChroma[k] > 6.0
+- || mode_lib->vba.VTAPsChroma[k] > 6.0)
+- && mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
+- < 2.0 * mode_lib->vba.PixelClock[k]) {
+- mode_lib->vba.MinDPPCLKUsingSingleDPP[k] = 2.0
+- * mode_lib->vba.PixelClock[k];
+- }
+- }
+- }
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- Calculate256BBlockSizes(
+- mode_lib->vba.SourcePixelFormat[k],
+- mode_lib->vba.SurfaceTiling[k],
+- dml_ceil(mode_lib->vba.BytePerPixelInDETY[k], 1.0),
+- dml_ceil(mode_lib->vba.BytePerPixelInDETC[k], 2.0),
+- &mode_lib->vba.Read256BlockHeightY[k],
+- &mode_lib->vba.Read256BlockHeightC[k],
+- &mode_lib->vba.Read256BlockWidthY[k],
+- &mode_lib->vba.Read256BlockWidthC[k]);
+- if (mode_lib->vba.SourceScan[k] == dm_horz) {
+- mode_lib->vba.MaxSwathHeightY[k] = mode_lib->vba.Read256BlockHeightY[k];
+- mode_lib->vba.MaxSwathHeightC[k] = mode_lib->vba.Read256BlockHeightC[k];
+- } else {
+- mode_lib->vba.MaxSwathHeightY[k] = mode_lib->vba.Read256BlockWidthY[k];
+- mode_lib->vba.MaxSwathHeightC[k] = mode_lib->vba.Read256BlockWidthC[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_mono_8)) {
+- if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear
+- || (mode_lib->vba.SourcePixelFormat[k] == dm_444_64
+- && (mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_4kb_s
+- || mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_4kb_s_x
+- || mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_64kb_s
+- || mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_64kb_s_t
+- || mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_64kb_s_x
+- || mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_var_s
+- || mode_lib->vba.SurfaceTiling[k]
+- == dm_sw_var_s_x)
+- && mode_lib->vba.SourceScan[k] == dm_horz)) {
+- mode_lib->vba.MinSwathHeightY[k] = mode_lib->vba.MaxSwathHeightY[k];
+- } else {
+- mode_lib->vba.MinSwathHeightY[k] = mode_lib->vba.MaxSwathHeightY[k]
+- / 2.0;
+- }
+- mode_lib->vba.MinSwathHeightC[k] = mode_lib->vba.MaxSwathHeightC[k];
+- } else {
+- if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) {
+- mode_lib->vba.MinSwathHeightY[k] = mode_lib->vba.MaxSwathHeightY[k];
+- mode_lib->vba.MinSwathHeightC[k] = mode_lib->vba.MaxSwathHeightC[k];
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8
+- && mode_lib->vba.SourceScan[k] == dm_horz) {
+- mode_lib->vba.MinSwathHeightY[k] = mode_lib->vba.MaxSwathHeightY[k]
+- / 2.0;
+- mode_lib->vba.MinSwathHeightC[k] = mode_lib->vba.MaxSwathHeightC[k];
+- } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10
+- && mode_lib->vba.SourceScan[k] == dm_horz) {
+- mode_lib->vba.MinSwathHeightC[k] = mode_lib->vba.MaxSwathHeightC[k]
+- / 2.0;
+- mode_lib->vba.MinSwathHeightY[k] = mode_lib->vba.MaxSwathHeightY[k];
+- } else {
+- mode_lib->vba.MinSwathHeightY[k] = mode_lib->vba.MaxSwathHeightY[k];
+- mode_lib->vba.MinSwathHeightC[k] = mode_lib->vba.MaxSwathHeightC[k];
+- }
+- }
+- if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) {
+- mode_lib->vba.MaximumSwathWidthSupport = 8192.0;
+- } else {
+- mode_lib->vba.MaximumSwathWidthSupport = 5120.0;
+- }
+- mode_lib->vba.MaximumSwathWidthInDETBuffer =
+- dml_min(
+- mode_lib->vba.MaximumSwathWidthSupport,
+- mode_lib->vba.DETBufferSizeInKByte * 1024.0 / 2.0
+- / (mode_lib->vba.BytePerPixelInDETY[k]
+- * mode_lib->vba.MinSwathHeightY[k]
+- + mode_lib->vba.BytePerPixelInDETC[k]
+- / 2.0
+- * mode_lib->vba.MinSwathHeightC[k]));
+- if (mode_lib->vba.BytePerPixelInDETC[k] == 0.0) {
+- mode_lib->vba.MaximumSwathWidthInLineBuffer =
+- mode_lib->vba.LineBufferSize
+- * 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));
+- } else {
+- mode_lib->vba.MaximumSwathWidthInLineBuffer =
+- dml_min(
+- mode_lib->vba.LineBufferSize
+- * 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)),
+- 2.0 * mode_lib->vba.LineBufferSize
+- * dml_max(
+- mode_lib->vba.HRatio[k]
+- / 2.0,
+- 1.0)
+- / mode_lib->vba.LBBitPerPixel[k]
+- / (mode_lib->vba.VTAPsChroma[k]
+- + dml_max(
+- dml_ceil(
+- mode_lib->vba.VRatio[k]
+- / 2.0,
+- 1.0)
+- - 2,
+- 0.0)));
+- }
+- mode_lib->vba.MaximumSwathWidth[k] = dml_min(
+- mode_lib->vba.MaximumSwathWidthInDETBuffer,
+- mode_lib->vba.MaximumSwathWidthInLineBuffer);
+- }
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity = RoundToDFSGranularityDown(
+- mode_lib->vba.MaxDispclk[i],
+- mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
+- mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity = RoundToDFSGranularityDown(
+- mode_lib->vba.MaxDppclk[i],
+- mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
+- mode_lib->vba.RequiredDISPCLK[i] = 0.0;
+- mode_lib->vba.DISPCLK_DPPCLK_Support[i] = true;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine =
+- mode_lib->vba.PixelClock[k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0)
+- * (1.0
+- + mode_lib->vba.DISPCLKRampingMargin
+- / 100.0);
+- if (mode_lib->vba.ODMCapability == true
+- && mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine
+- > mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity) {
+- mode_lib->vba.ODMCombineEnablePerState[i][k] = true;
+- mode_lib->vba.PlaneRequiredDISPCLK =
+- mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine
+- / 2.0;
+- } else {
+- mode_lib->vba.ODMCombineEnablePerState[i][k] = false;
+- mode_lib->vba.PlaneRequiredDISPCLK =
+- mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine;
+- }
+- if (mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0)
+- <= mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity
+- && mode_lib->vba.SwathWidthYSingleDPP[k]
+- <= mode_lib->vba.MaximumSwathWidth[k]
+- && mode_lib->vba.ODMCombineEnablePerState[i][k] == false) {
+- mode_lib->vba.NoOfDPP[i][k] = 1;
+- mode_lib->vba.RequiredDPPCLK[i][k] =
+- mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0);
+- } else {
+- mode_lib->vba.NoOfDPP[i][k] = 2;
+- mode_lib->vba.RequiredDPPCLK[i][k] =
+- mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0)
+- / 2.0;
+- }
+- mode_lib->vba.RequiredDISPCLK[i] = dml_max(
+- mode_lib->vba.RequiredDISPCLK[i],
+- mode_lib->vba.PlaneRequiredDISPCLK);
+- if ((mode_lib->vba.MinDPPCLKUsingSingleDPP[k] / mode_lib->vba.NoOfDPP[i][k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0)
+- > mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity)
+- || (mode_lib->vba.PlaneRequiredDISPCLK
+- > mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity)) {
+- mode_lib->vba.DISPCLK_DPPCLK_Support[i] = false;
+- }
+- }
+- mode_lib->vba.TotalNumberOfActiveDPP[i] = 0.0;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.TotalNumberOfActiveDPP[i] =
+- mode_lib->vba.TotalNumberOfActiveDPP[i]
+- + mode_lib->vba.NoOfDPP[i][k];
+- }
+- if ((mode_lib->vba.MaxDispclk[i] == mode_lib->vba.MaxDispclk[DC__VOLTAGE_STATES]
+- && mode_lib->vba.MaxDppclk[i]
+- == mode_lib->vba.MaxDppclk[DC__VOLTAGE_STATES])
+- && (mode_lib->vba.TotalNumberOfActiveDPP[i]
+- > mode_lib->vba.MaxNumDPP
+- || mode_lib->vba.DISPCLK_DPPCLK_Support[i] == false)) {
+- mode_lib->vba.RequiredDISPCLK[i] = 0.0;
+- mode_lib->vba.DISPCLK_DPPCLK_Support[i] = true;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine =
+- mode_lib->vba.PixelClock[k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0);
+- if (mode_lib->vba.ODMCapability == true
+- && mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine
+- > mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity) {
+- mode_lib->vba.ODMCombineEnablePerState[i][k] = true;
+- mode_lib->vba.PlaneRequiredDISPCLK =
+- mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine
+- / 2.0;
+- } else {
+- mode_lib->vba.ODMCombineEnablePerState[i][k] = false;
+- mode_lib->vba.PlaneRequiredDISPCLK =
+- mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine;
+- }
+- if (mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0)
+- <= mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity
+- && mode_lib->vba.SwathWidthYSingleDPP[k]
+- <= mode_lib->vba.MaximumSwathWidth[k]
+- && mode_lib->vba.ODMCombineEnablePerState[i][k]
+- == false) {
+- mode_lib->vba.NoOfDPP[i][k] = 1;
+- mode_lib->vba.RequiredDPPCLK[i][k] =
+- mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0);
+- } else {
+- mode_lib->vba.NoOfDPP[i][k] = 2;
+- mode_lib->vba.RequiredDPPCLK[i][k] =
+- mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0)
+- / 2.0;
+- }
+- mode_lib->vba.RequiredDISPCLK[i] = dml_max(
+- mode_lib->vba.RequiredDISPCLK[i],
+- mode_lib->vba.PlaneRequiredDISPCLK);
+- if ((mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
+- / mode_lib->vba.NoOfDPP[i][k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0)
+- > mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity)
+- || (mode_lib->vba.PlaneRequiredDISPCLK
+- > mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity)) {
+- mode_lib->vba.DISPCLK_DPPCLK_Support[i] = false;
+- }
+- }
+- mode_lib->vba.TotalNumberOfActiveDPP[i] = 0.0;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.TotalNumberOfActiveDPP[i] =
+- mode_lib->vba.TotalNumberOfActiveDPP[i]
+- + mode_lib->vba.NoOfDPP[i][k];
+- }
+- }
+- if (mode_lib->vba.TotalNumberOfActiveDPP[i] > mode_lib->vba.MaxNumDPP) {
+- mode_lib->vba.RequiredDISPCLK[i] = 0.0;
+- mode_lib->vba.DISPCLK_DPPCLK_Support[i] = true;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.ODMCombineEnablePerState[i][k] = false;
+- if (mode_lib->vba.SwathWidthYSingleDPP[k]
+- <= mode_lib->vba.MaximumSwathWidth[k]) {
+- mode_lib->vba.NoOfDPP[i][k] = 1;
+- mode_lib->vba.RequiredDPPCLK[i][k] =
+- mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0);
+- } else {
+- mode_lib->vba.NoOfDPP[i][k] = 2;
+- mode_lib->vba.RequiredDPPCLK[i][k] =
+- mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0)
+- / 2.0;
+- }
+- if (!(mode_lib->vba.MaxDispclk[i]
+- == mode_lib->vba.MaxDispclk[DC__VOLTAGE_STATES]
+- && mode_lib->vba.MaxDppclk[i]
+- == mode_lib->vba.MaxDppclk[DC__VOLTAGE_STATES])) {
+- mode_lib->vba.PlaneRequiredDISPCLK =
+- mode_lib->vba.PixelClock[k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0)
+- * (1.0
+- + mode_lib->vba.DISPCLKRampingMargin
+- / 100.0);
+- } else {
+- mode_lib->vba.PlaneRequiredDISPCLK =
+- mode_lib->vba.PixelClock[k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0);
+- }
+- mode_lib->vba.RequiredDISPCLK[i] = dml_max(
+- mode_lib->vba.RequiredDISPCLK[i],
+- mode_lib->vba.PlaneRequiredDISPCLK);
+- if ((mode_lib->vba.MinDPPCLKUsingSingleDPP[k]
+- / mode_lib->vba.NoOfDPP[i][k]
+- * (1.0
+- + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
+- / 100.0)
+- > mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity)
+- || (mode_lib->vba.PlaneRequiredDISPCLK
+- > mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity)) {
+- mode_lib->vba.DISPCLK_DPPCLK_Support[i] = false;
+- }
+- }
+- mode_lib->vba.TotalNumberOfActiveDPP[i] = 0.0;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.TotalNumberOfActiveDPP[i] =
+- mode_lib->vba.TotalNumberOfActiveDPP[i]
+- + mode_lib->vba.NoOfDPP[i][k];
+- }
+- }
+- mode_lib->vba.RequiredDISPCLK[i] = dml_max(
+- mode_lib->vba.RequiredDISPCLK[i],
+- mode_lib->vba.WritebackRequiredDISPCLK);
+- if (mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity
+- < mode_lib->vba.WritebackRequiredDISPCLK) {
+- mode_lib->vba.DISPCLK_DPPCLK_Support[i] = false;
+- }
+- }
+- /*Viewport Size Check*/
+-
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- mode_lib->vba.ViewportSizeSupport[i] = true;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.ODMCombineEnablePerState[i][k] == true) {
+- if (dml_min(mode_lib->vba.SwathWidthYSingleDPP[k], dml_round(mode_lib->vba.HActive[k] / 2.0 * mode_lib->vba.HRatio[k]))
+- > mode_lib->vba.MaximumSwathWidth[k]) {
+- mode_lib->vba.ViewportSizeSupport[i] = false;
+- }
+- } else {
+- if (mode_lib->vba.SwathWidthYSingleDPP[k] / 2.0
+- > mode_lib->vba.MaximumSwathWidth[k]) {
+- mode_lib->vba.ViewportSizeSupport[i] = false;
+- }
+- }
+- }
+- }
+- /*Total Available Pipes Support Check*/
+-
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- if (mode_lib->vba.TotalNumberOfActiveDPP[i] <= mode_lib->vba.MaxNumDPP) {
+- mode_lib->vba.TotalAvailablePipesSupport[i] = true;
+- } else {
+- mode_lib->vba.TotalAvailablePipesSupport[i] = false;
+- }
+- }
+- /*Total Available OTG Support Check*/
+-
+- mode_lib->vba.TotalNumberOfActiveOTG = 0.0;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.BlendingAndTiming[k] == k) {
+- mode_lib->vba.TotalNumberOfActiveOTG = mode_lib->vba.TotalNumberOfActiveOTG
+- + 1.0;
+- }
+- }
+- if (mode_lib->vba.TotalNumberOfActiveOTG <= mode_lib->vba.MaxNumOTG) {
+- mode_lib->vba.NumberOfOTGSupport = true;
+- } else {
+- mode_lib->vba.NumberOfOTGSupport = false;
+- }
+- /*Display IO and DSC Support Check*/
+-
+- mode_lib->vba.NonsupportedDSCInputBPC = false;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 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.NonsupportedDSCInputBPC = true;
+- }
+- }
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.RequiresDSC[i][k] = 0;
+- mode_lib->vba.RequiresFEC[i][k] = 0;
+- if (mode_lib->vba.BlendingAndTiming[k] == k) {
+- if (mode_lib->vba.Output[k] == dm_hdmi) {
+- mode_lib->vba.RequiresDSC[i][k] = 0;
+- mode_lib->vba.RequiresFEC[i][k] = 0;
+- mode_lib->vba.OutputBppPerState[i][k] =
+- TruncToValidBPP(dml_min(600.0, mode_lib->vba.PHYCLKPerState[i])
+- / mode_lib->vba.PixelClockBackEnd[k] * 24,
+- false,
+- mode_lib->vba.Output[k],
+- mode_lib->vba.OutputFormat[k],
+- mode_lib->vba.DSCInputBitPerComponent[k]);
+- } else if (mode_lib->vba.Output[k] == dm_dp
+- || mode_lib->vba.Output[k] == dm_edp) {
+- if (mode_lib->vba.Output[k] == dm_edp) {
+- mode_lib->vba.EffectiveFECOverhead = 0.0;
+- } else {
+- mode_lib->vba.EffectiveFECOverhead =
+- mode_lib->vba.FECOverhead;
+- }
+- if (mode_lib->vba.PHYCLKPerState[i] >= 270.0) {
+- mode_lib->vba.Outbpp =
+- TruncToValidBPP((1.0 - mode_lib->vba.Downspreading / 100.0) * 270.0
+- * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
+- false,
+- mode_lib->vba.Output[k],
+- mode_lib->vba.OutputFormat[k],
+- mode_lib->vba.DSCInputBitPerComponent[k]);
+- mode_lib->vba.OutbppDSC =
+- TruncToValidBPP((1.0 - mode_lib->vba.Downspreading / 100.0)
+- * (1.0 - mode_lib->vba.EffectiveFECOverhead / 100.0) * 270.0
+- * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
+- true,
+- mode_lib->vba.Output[k],
+- mode_lib->vba.OutputFormat[k],
+- mode_lib->vba.DSCInputBitPerComponent[k]);
+- if (mode_lib->vba.DSCEnabled[k] == true) {
+- mode_lib->vba.RequiresDSC[i][k] = true;
+- if (mode_lib->vba.Output[k] == dm_dp) {
+- mode_lib->vba.RequiresFEC[i][k] =
+- true;
+- } else {
+- mode_lib->vba.RequiresFEC[i][k] =
+- false;
+- }
+- mode_lib->vba.Outbpp =
+- mode_lib->vba.OutbppDSC;
+- } else {
+- mode_lib->vba.RequiresDSC[i][k] = false;
+- mode_lib->vba.RequiresFEC[i][k] = false;
+- }
+- mode_lib->vba.OutputBppPerState[i][k] =
+- mode_lib->vba.Outbpp;
+- }
+- if (mode_lib->vba.Outbpp == BPP_INVALID) {
+- mode_lib->vba.Outbpp =
+- TruncToValidBPP((1.0 - mode_lib->vba.Downspreading / 100.0) * 540.0
+- * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
+- false,
+- mode_lib->vba.Output[k],
+- mode_lib->vba.OutputFormat[k],
+- mode_lib->vba.DSCInputBitPerComponent[k]);
+- mode_lib->vba.OutbppDSC =
+- TruncToValidBPP((1.0 - mode_lib->vba.Downspreading / 100.0)
+- * (1.0 - mode_lib->vba.EffectiveFECOverhead / 100.0) * 540.0
+- * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
+- true,
+- mode_lib->vba.Output[k],
+- mode_lib->vba.OutputFormat[k],
+- mode_lib->vba.DSCInputBitPerComponent[k]);
+- if (mode_lib->vba.DSCEnabled[k] == true) {
+- mode_lib->vba.RequiresDSC[i][k] = true;
+- if (mode_lib->vba.Output[k] == dm_dp) {
+- mode_lib->vba.RequiresFEC[i][k] =
+- true;
+- } else {
+- mode_lib->vba.RequiresFEC[i][k] =
+- false;
+- }
+- mode_lib->vba.Outbpp =
+- mode_lib->vba.OutbppDSC;
+- } else {
+- mode_lib->vba.RequiresDSC[i][k] = false;
+- mode_lib->vba.RequiresFEC[i][k] = false;
+- }
+- mode_lib->vba.OutputBppPerState[i][k] =
+- mode_lib->vba.Outbpp;
+- }
+- if (mode_lib->vba.Outbpp == BPP_INVALID
+- && mode_lib->vba.PHYCLKPerState[i]
+- >= 810.0) {
+- mode_lib->vba.Outbpp =
+- TruncToValidBPP((1.0 - mode_lib->vba.Downspreading / 100.0) * 810.0
+- * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
+- false,
+- mode_lib->vba.Output[k],
+- mode_lib->vba.OutputFormat[k],
+- mode_lib->vba.DSCInputBitPerComponent[k]);
+- mode_lib->vba.OutbppDSC =
+- TruncToValidBPP((1.0 - mode_lib->vba.Downspreading / 100.0)
+- * (1.0 - mode_lib->vba.EffectiveFECOverhead / 100.0) * 810.0
+- * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
+- true,
+- mode_lib->vba.Output[k],
+- mode_lib->vba.OutputFormat[k],
+- mode_lib->vba.DSCInputBitPerComponent[k]);
+- if (mode_lib->vba.DSCEnabled[k] == true
+- || mode_lib->vba.Outbpp == BPP_INVALID) {
+- mode_lib->vba.RequiresDSC[i][k] = true;
+- if (mode_lib->vba.Output[k] == dm_dp) {
+- mode_lib->vba.RequiresFEC[i][k] =
+- true;
+- } else {
+- mode_lib->vba.RequiresFEC[i][k] =
+- false;
+- }
+- mode_lib->vba.Outbpp =
+- mode_lib->vba.OutbppDSC;
+- } else {
+- mode_lib->vba.RequiresDSC[i][k] = false;
+- mode_lib->vba.RequiresFEC[i][k] = false;
+- }
+- mode_lib->vba.OutputBppPerState[i][k] =
+- mode_lib->vba.Outbpp;
+- }
+- }
+- } else {
+- mode_lib->vba.OutputBppPerState[i][k] = BPP_BLENDED_PIPE;
+- }
+- }
+- }
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- mode_lib->vba.DIOSupport[i] = true;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.OutputBppPerState[i][k] == BPP_INVALID
+- || (mode_lib->vba.OutputFormat[k] == dm_420
+- && mode_lib->vba.ProgressiveToInterlaceUnitInOPP
+- == true)) {
+- mode_lib->vba.DIOSupport[i] = false;
+- }
+- }
+- }
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = false;
+- if (mode_lib->vba.BlendingAndTiming[k] == k) {
+- if ((mode_lib->vba.Output[k] == dm_dp
+- || mode_lib->vba.Output[k] == dm_edp)) {
+- if (mode_lib->vba.OutputFormat[k] == dm_420
+- || 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]
+- == true) {
+- 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;
+- }
+- }
+- }
+- }
+- }
+- }
+- }
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- mode_lib->vba.NotEnoughDSCUnits[i] = false;
+- mode_lib->vba.TotalDSCUnitsRequired = 0.0;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.RequiresDSC[i][k] == true) {
+- if (mode_lib->vba.ODMCombineEnablePerState[i][k] == true) {
+- mode_lib->vba.TotalDSCUnitsRequired =
+- mode_lib->vba.TotalDSCUnitsRequired + 2.0;
+- } else {
+- mode_lib->vba.TotalDSCUnitsRequired =
+- mode_lib->vba.TotalDSCUnitsRequired + 1.0;
+- }
+- }
+- }
+- if (mode_lib->vba.TotalDSCUnitsRequired > mode_lib->vba.NumberOfDSC) {
+- mode_lib->vba.NotEnoughDSCUnits[i] = true;
+- }
+- }
+- /*DSC Delay per state*/
+-
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.BlendingAndTiming[k] != k) {
+- mode_lib->vba.slices = 0;
+- } else if (mode_lib->vba.RequiresDSC[i][k] == 0
+- || mode_lib->vba.RequiresDSC[i][k] == false) {
+- mode_lib->vba.slices = 0;
+- } else if (mode_lib->vba.PixelClockBackEnd[k] > 3200.0) {
+- mode_lib->vba.slices = dml_ceil(
+- mode_lib->vba.PixelClockBackEnd[k] / 400.0,
+- 4.0);
+- } else if (mode_lib->vba.PixelClockBackEnd[k] > 1360.0) {
+- mode_lib->vba.slices = 8.0;
+- } else if (mode_lib->vba.PixelClockBackEnd[k] > 680.0) {
+- mode_lib->vba.slices = 4.0;
+- } else if (mode_lib->vba.PixelClockBackEnd[k] > 340.0) {
+- mode_lib->vba.slices = 2.0;
+- } else {
+- mode_lib->vba.slices = 1.0;
+- }
+- if (mode_lib->vba.OutputBppPerState[i][k] == BPP_BLENDED_PIPE
+- || mode_lib->vba.OutputBppPerState[i][k] == BPP_INVALID) {
+- mode_lib->vba.bpp = 0.0;
+- } else {
+- mode_lib->vba.bpp = mode_lib->vba.OutputBppPerState[i][k];
+- }
+- if (mode_lib->vba.RequiresDSC[i][k] == true && mode_lib->vba.bpp != 0.0) {
+- if (mode_lib->vba.ODMCombineEnablePerState[i][k] == false) {
+- mode_lib->vba.DSCDelayPerState[i][k] =
+- dscceComputeDelay(
+- mode_lib->vba.DSCInputBitPerComponent[k],
+- mode_lib->vba.bpp,
+- dml_ceil(
+- mode_lib->vba.HActive[k]
+- / mode_lib->vba.slices,
+- 1.0),
+- mode_lib->vba.slices,
+- mode_lib->vba.OutputFormat[k])
+- + dscComputeDelay(
+- mode_lib->vba.OutputFormat[k]);
+- } else {
+- mode_lib->vba.DSCDelayPerState[i][k] =
+- 2.0
+- * (dscceComputeDelay(
+- mode_lib->vba.DSCInputBitPerComponent[k],
+- mode_lib->vba.bpp,
+- dml_ceil(
+- mode_lib->vba.HActive[k]
+- / mode_lib->vba.slices,
+- 1.0),
+- mode_lib->vba.slices
+- / 2,
+- mode_lib->vba.OutputFormat[k])
+- + dscComputeDelay(
+- mode_lib->vba.OutputFormat[k]));
+- }
+- mode_lib->vba.DSCDelayPerState[i][k] =
+- mode_lib->vba.DSCDelayPerState[i][k]
+- * mode_lib->vba.PixelClock[k]
+- / mode_lib->vba.PixelClockBackEnd[k];
+- } else {
+- mode_lib->vba.DSCDelayPerState[i][k] = 0.0;
+- }
+- }
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- for (j = 0; j <= mode_lib->vba.NumberOfActivePlanes - 1; j++) {
+- if (mode_lib->vba.BlendingAndTiming[k] == j
+- && mode_lib->vba.RequiresDSC[i][j] == true) {
+- mode_lib->vba.DSCDelayPerState[i][k] =
+- mode_lib->vba.DSCDelayPerState[i][j];
+- }
+- }
+- }
+- }
+- /*Urgent Latency Support Check*/
+-
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- if (mode_lib->vba.ODMCombineEnablePerState[i][k] == true) {
+- mode_lib->vba.SwathWidthYPerState[i][k] =
+- dml_min(
+- mode_lib->vba.SwathWidthYSingleDPP[k],
+- dml_round(
+- mode_lib->vba.HActive[k]
+- / 2.0
+- * mode_lib->vba.HRatio[k]));
+- } else {
+- mode_lib->vba.SwathWidthYPerState[i][k] =
+- mode_lib->vba.SwathWidthYSingleDPP[k]
+- / mode_lib->vba.NoOfDPP[i][k];
+- }
+- mode_lib->vba.SwathWidthGranularityY = 256.0
+- / dml_ceil(mode_lib->vba.BytePerPixelInDETY[k], 1.0)
+- / mode_lib->vba.MaxSwathHeightY[k];
+- mode_lib->vba.RoundedUpMaxSwathSizeBytesY = (dml_ceil(
+- mode_lib->vba.SwathWidthYPerState[i][k] - 1.0,
+- mode_lib->vba.SwathWidthGranularityY)
+- + mode_lib->vba.SwathWidthGranularityY)
+- * mode_lib->vba.BytePerPixelInDETY[k]
+- * mode_lib->vba.MaxSwathHeightY[k];
+- if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10) {
+- mode_lib->vba.RoundedUpMaxSwathSizeBytesY = dml_ceil(
+- mode_lib->vba.RoundedUpMaxSwathSizeBytesY,
+- 256.0) + 256;
+- }
+- if (mode_lib->vba.MaxSwathHeightC[k] > 0.0) {
+- mode_lib->vba.SwathWidthGranularityC = 256.0
+- / dml_ceil(mode_lib->vba.BytePerPixelInDETC[k], 2.0)
+- / mode_lib->vba.MaxSwathHeightC[k];
+- mode_lib->vba.RoundedUpMaxSwathSizeBytesC = (dml_ceil(
+- mode_lib->vba.SwathWidthYPerState[i][k] / 2.0 - 1.0,
+- mode_lib->vba.SwathWidthGranularityC)
+- + mode_lib->vba.SwathWidthGranularityC)
+- * mode_lib->vba.BytePerPixelInDETC[k]
+- * mode_lib->vba.MaxSwathHeightC[k];
+- if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10) {
+- mode_lib->vba.RoundedUpMaxSwathSizeBytesC = dml_ceil(
+- mode_lib->vba.RoundedUpMaxSwathSizeBytesC,
+- 256.0) + 256;
+- }
+- } else {
+- mode_lib->vba.RoundedUpMaxSwathSizeBytesC = 0.0;
+- }
+- if (mode_lib->vba.RoundedUpMaxSwathSizeBytesY
+- + mode_lib->vba.RoundedUpMaxSwathSizeBytesC
+- <= mode_lib->vba.DETBufferSizeInKByte * 1024.0 / 2.0) {
+- mode_lib->vba.SwathHeightYPerState[i][k] =
+- mode_lib->vba.MaxSwathHeightY[k];
+- mode_lib->vba.SwathHeightCPerState[i][k] =
+- mode_lib->vba.MaxSwathHeightC[k];
+- } else {
+- mode_lib->vba.SwathHeightYPerState[i][k] =
+- mode_lib->vba.MinSwathHeightY[k];
+- mode_lib->vba.SwathHeightCPerState[i][k] =
+- mode_lib->vba.MinSwathHeightC[k];
+- }
+- if (mode_lib->vba.BytePerPixelInDETC[k] == 0.0) {
+- mode_lib->vba.LinesInDETLuma = mode_lib->vba.DETBufferSizeInKByte
+- * 1024.0 / mode_lib->vba.BytePerPixelInDETY[k]
+- / mode_lib->vba.SwathWidthYPerState[i][k];
+- mode_lib->vba.LinesInDETChroma = 0.0;
+- } else if (mode_lib->vba.SwathHeightYPerState[i][k]
+- <= mode_lib->vba.SwathHeightCPerState[i][k]) {
+- mode_lib->vba.LinesInDETLuma = mode_lib->vba.DETBufferSizeInKByte
+- * 1024.0 / 2.0 / mode_lib->vba.BytePerPixelInDETY[k]
+- / mode_lib->vba.SwathWidthYPerState[i][k];
+- mode_lib->vba.LinesInDETChroma = mode_lib->vba.DETBufferSizeInKByte
+- * 1024.0 / 2.0 / mode_lib->vba.BytePerPixelInDETC[k]
+- / (mode_lib->vba.SwathWidthYPerState[i][k] / 2.0);
+- } else {
+- mode_lib->vba.LinesInDETLuma = mode_lib->vba.DETBufferSizeInKByte
+- * 1024.0 * 2.0 / 3.0
+- / mode_lib->vba.BytePerPixelInDETY[k]
+- / mode_lib->vba.SwathWidthYPerState[i][k];
+- mode_lib->vba.LinesInDETChroma = mode_lib->vba.DETBufferSizeInKByte
+- * 1024.0 / 3.0 / mode_lib->vba.BytePerPixelInDETY[k]
+- / (mode_lib->vba.SwathWidthYPerState[i][k] / 2.0);
+- }
+- mode_lib->vba.EffectiveLBLatencyHidingSourceLinesLuma =
+- dml_min(
+- mode_lib->vba.MaxLineBufferLines,
+- dml_floor(
+- mode_lib->vba.LineBufferSize
+- / mode_lib->vba.LBBitPerPixel[k]
+- / (mode_lib->vba.SwathWidthYPerState[i][k]
+- / dml_max(
+- mode_lib->vba.HRatio[k],
+- 1.0)),
+- 1.0))
+- - (mode_lib->vba.vtaps[k] - 1.0);
+- mode_lib->vba.EffectiveLBLatencyHidingSourceLinesChroma =
+- dml_min(
+- mode_lib->vba.MaxLineBufferLines,
+- dml_floor(
+- mode_lib->vba.LineBufferSize
+- / mode_lib->vba.LBBitPerPixel[k]
+- / (mode_lib->vba.SwathWidthYPerState[i][k]
+- / 2.0
+- / dml_max(
+- mode_lib->vba.HRatio[k]
+- / 2.0,
+- 1.0)),
+- 1.0))
+- - (mode_lib->vba.VTAPsChroma[k] - 1.0);
+- mode_lib->vba.EffectiveDETLBLinesLuma =
+- dml_floor(
+- mode_lib->vba.LinesInDETLuma
+- + dml_min(
+- mode_lib->vba.LinesInDETLuma
+- * mode_lib->vba.RequiredDISPCLK[i]
+- * mode_lib->vba.BytePerPixelInDETY[k]
+- * mode_lib->vba.PSCL_FACTOR[k]
+- / mode_lib->vba.ReturnBWPerState[i],
+- mode_lib->vba.EffectiveLBLatencyHidingSourceLinesLuma),
+- mode_lib->vba.SwathHeightYPerState[i][k]);
+- mode_lib->vba.EffectiveDETLBLinesChroma =
+- dml_floor(
+- mode_lib->vba.LinesInDETChroma
+- + dml_min(
+- mode_lib->vba.LinesInDETChroma
+- * mode_lib->vba.RequiredDISPCLK[i]
+- * mode_lib->vba.BytePerPixelInDETC[k]
+- * mode_lib->vba.PSCL_FACTOR_CHROMA[k]
+- / mode_lib->vba.ReturnBWPerState[i],
+- mode_lib->vba.EffectiveLBLatencyHidingSourceLinesChroma),
+- mode_lib->vba.SwathHeightCPerState[i][k]);
+- if (mode_lib->vba.BytePerPixelInDETC[k] == 0.0) {
+- mode_lib->vba.UrgentLatencySupportUsPerState[i][k] =
+- mode_lib->vba.EffectiveDETLBLinesLuma
+- * (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k])
+- / mode_lib->vba.VRatio[k]
+- - mode_lib->vba.EffectiveDETLBLinesLuma
+- * mode_lib->vba.SwathWidthYPerState[i][k]
+- * dml_ceil(
+- mode_lib->vba.BytePerPixelInDETY[k],
+- 1.0)
+- / (mode_lib->vba.ReturnBWPerState[i]
+- / mode_lib->vba.NoOfDPP[i][k]);
+- } else {
+- mode_lib->vba.UrgentLatencySupportUsPerState[i][k] =
+- dml_min(
+- mode_lib->vba.EffectiveDETLBLinesLuma
+- * (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k])
+- / mode_lib->vba.VRatio[k]
+- - mode_lib->vba.EffectiveDETLBLinesLuma
+- * mode_lib->vba.SwathWidthYPerState[i][k]
+- * dml_ceil(
+- mode_lib->vba.BytePerPixelInDETY[k],
+- 1.0)
+- / (mode_lib->vba.ReturnBWPerState[i]
+- / mode_lib->vba.NoOfDPP[i][k]),
+- mode_lib->vba.EffectiveDETLBLinesChroma
+- * (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k])
+- / (mode_lib->vba.VRatio[k]
+- / 2.0)
+- - mode_lib->vba.EffectiveDETLBLinesChroma
+- * mode_lib->vba.SwathWidthYPerState[i][k]
+- / 2.0
+- * dml_ceil(
+- mode_lib->vba.BytePerPixelInDETC[k],
+- 2.0)
+- / (mode_lib->vba.ReturnBWPerState[i]
+- / mode_lib->vba.NoOfDPP[i][k]));
+- }
+- }
+- }
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- mode_lib->vba.UrgentLatencySupport[i] = true;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.UrgentLatencySupportUsPerState[i][k]
+- < mode_lib->vba.UrgentLatency / 1.0) {
+- mode_lib->vba.UrgentLatencySupport[i] = false;
+- }
+- }
+- }
+- /*Prefetch Check*/
+-
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- mode_lib->vba.TotalNumberOfDCCActiveDPP[i] = 0.0;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.DCCEnable[k] == true) {
+- mode_lib->vba.TotalNumberOfDCCActiveDPP[i] =
+- mode_lib->vba.TotalNumberOfDCCActiveDPP[i]
+- + mode_lib->vba.NoOfDPP[i][k];
+- }
+- }
+- }
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- mode_lib->vba.ProjectedDCFCLKDeepSleep = 8.0;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.ProjectedDCFCLKDeepSleep = dml_max(
+- mode_lib->vba.ProjectedDCFCLKDeepSleep,
+- mode_lib->vba.PixelClock[k] / 16.0);
+- if (mode_lib->vba.BytePerPixelInDETC[k] == 0.0) {
+- if (mode_lib->vba.VRatio[k] <= 1.0) {
+- mode_lib->vba.ProjectedDCFCLKDeepSleep =
+- dml_max(
+- mode_lib->vba.ProjectedDCFCLKDeepSleep,
+- 1.1
+- * dml_ceil(
+- mode_lib->vba.BytePerPixelInDETY[k],
+- 1.0)
+- / 64.0
+- * mode_lib->vba.HRatio[k]
+- * mode_lib->vba.PixelClock[k]
+- / mode_lib->vba.NoOfDPP[i][k]);
+- } else {
+- mode_lib->vba.ProjectedDCFCLKDeepSleep =
+- dml_max(
+- mode_lib->vba.ProjectedDCFCLKDeepSleep,
+- 1.1
+- * dml_ceil(
+- mode_lib->vba.BytePerPixelInDETY[k],
+- 1.0)
+- / 64.0
+- * mode_lib->vba.PSCL_FACTOR[k]
+- * mode_lib->vba.RequiredDPPCLK[i][k]);
+- }
+- } else {
+- if (mode_lib->vba.VRatio[k] <= 1.0) {
+- mode_lib->vba.ProjectedDCFCLKDeepSleep =
+- dml_max(
+- mode_lib->vba.ProjectedDCFCLKDeepSleep,
+- 1.1
+- * dml_ceil(
+- mode_lib->vba.BytePerPixelInDETY[k],
+- 1.0)
+- / 32.0
+- * mode_lib->vba.HRatio[k]
+- * mode_lib->vba.PixelClock[k]
+- / mode_lib->vba.NoOfDPP[i][k]);
+- } else {
+- mode_lib->vba.ProjectedDCFCLKDeepSleep =
+- dml_max(
+- mode_lib->vba.ProjectedDCFCLKDeepSleep,
+- 1.1
+- * dml_ceil(
+- mode_lib->vba.BytePerPixelInDETY[k],
+- 1.0)
+- / 32.0
+- * mode_lib->vba.PSCL_FACTOR[k]
+- * mode_lib->vba.RequiredDPPCLK[i][k]);
+- }
+- if (mode_lib->vba.VRatio[k] / 2.0 <= 1.0) {
+- mode_lib->vba.ProjectedDCFCLKDeepSleep =
+- dml_max(
+- mode_lib->vba.ProjectedDCFCLKDeepSleep,
+- 1.1
+- * dml_ceil(
+- mode_lib->vba.BytePerPixelInDETC[k],
+- 2.0)
+- / 32.0
+- * mode_lib->vba.HRatio[k]
+- / 2.0
+- * mode_lib->vba.PixelClock[k]
+- / mode_lib->vba.NoOfDPP[i][k]);
+- } else {
+- mode_lib->vba.ProjectedDCFCLKDeepSleep =
+- dml_max(
+- mode_lib->vba.ProjectedDCFCLKDeepSleep,
+- 1.1
+- * dml_ceil(
+- mode_lib->vba.BytePerPixelInDETC[k],
+- 2.0)
+- / 32.0
+- * mode_lib->vba.PSCL_FACTOR_CHROMA[k]
+- * mode_lib->vba.RequiredDPPCLK[i][k]);
+- }
+- }
+- }
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.PDEAndMetaPTEBytesPerFrameY = CalculateVMAndRowBytes(
+- mode_lib,
+- mode_lib->vba.DCCEnable[k],
+- mode_lib->vba.Read256BlockHeightY[k],
+- mode_lib->vba.Read256BlockWidthY[k],
+- mode_lib->vba.SourcePixelFormat[k],
+- mode_lib->vba.SurfaceTiling[k],
+- dml_ceil(mode_lib->vba.BytePerPixelInDETY[k], 1.0),
+- mode_lib->vba.SourceScan[k],
+- mode_lib->vba.ViewportWidth[k],
+- mode_lib->vba.ViewportHeight[k],
+- mode_lib->vba.SwathWidthYPerState[i][k],
+- mode_lib->vba.VirtualMemoryEnable,
+- mode_lib->vba.VMMPageSize,
+- mode_lib->vba.PTEBufferSizeInRequests,
+- mode_lib->vba.PDEProcessingBufIn64KBReqs,
+- mode_lib->vba.PitchY[k],
+- mode_lib->vba.DCCMetaPitchY[k],
+- &mode_lib->vba.MacroTileWidthY[k],
+- &mode_lib->vba.MetaRowBytesY,
+- &mode_lib->vba.DPTEBytesPerRowY,
+- &mode_lib->vba.PTEBufferSizeNotExceededY[i][k],
+- &mode_lib->vba.dpte_row_height[k],
+- &mode_lib->vba.meta_row_height[k]);
+- mode_lib->vba.PrefetchLinesY[k] = CalculatePrefetchSourceLines(
+- mode_lib,
+- mode_lib->vba.VRatio[k],
+- mode_lib->vba.vtaps[k],
+- mode_lib->vba.Interlace[k],
+- mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
+- mode_lib->vba.SwathHeightYPerState[i][k],
+- mode_lib->vba.ViewportYStartY[k],
+- &mode_lib->vba.PrefillY[k],
+- &mode_lib->vba.MaxNumSwY[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_mono_8)) {
+- mode_lib->vba.PDEAndMetaPTEBytesPerFrameC = CalculateVMAndRowBytes(
+- mode_lib,
+- mode_lib->vba.DCCEnable[k],
+- mode_lib->vba.Read256BlockHeightY[k],
+- mode_lib->vba.Read256BlockWidthY[k],
+- mode_lib->vba.SourcePixelFormat[k],
+- mode_lib->vba.SurfaceTiling[k],
+- dml_ceil(mode_lib->vba.BytePerPixelInDETC[k], 2.0),
+- mode_lib->vba.SourceScan[k],
+- mode_lib->vba.ViewportWidth[k] / 2.0,
+- mode_lib->vba.ViewportHeight[k] / 2.0,
+- mode_lib->vba.SwathWidthYPerState[i][k] / 2.0,
+- mode_lib->vba.VirtualMemoryEnable,
+- mode_lib->vba.VMMPageSize,
+- mode_lib->vba.PTEBufferSizeInRequests,
+- mode_lib->vba.PDEProcessingBufIn64KBReqs,
+- mode_lib->vba.PitchC[k],
+- 0.0,
+- &mode_lib->vba.MacroTileWidthC[k],
+- &mode_lib->vba.MetaRowBytesC,
+- &mode_lib->vba.DPTEBytesPerRowC,
+- &mode_lib->vba.PTEBufferSizeNotExceededC[i][k],
+- &mode_lib->vba.dpte_row_height_chroma[k],
+- &mode_lib->vba.meta_row_height_chroma[k]);
+- mode_lib->vba.PrefetchLinesC[k] = CalculatePrefetchSourceLines(
+- mode_lib,
+- mode_lib->vba.VRatio[k] / 2.0,
+- mode_lib->vba.VTAPsChroma[k],
+- mode_lib->vba.Interlace[k],
+- mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
+- mode_lib->vba.SwathHeightCPerState[i][k],
+- mode_lib->vba.ViewportYStartC[k],
+- &mode_lib->vba.PrefillC[k],
+- &mode_lib->vba.MaxNumSwC[k]);
+- } else {
+- mode_lib->vba.PDEAndMetaPTEBytesPerFrameC = 0.0;
+- mode_lib->vba.MetaRowBytesC = 0.0;
+- mode_lib->vba.DPTEBytesPerRowC = 0.0;
+- mode_lib->vba.PrefetchLinesC[k] = 0.0;
+- mode_lib->vba.PTEBufferSizeNotExceededC[i][k] = true;
+- }
+- mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k] =
+- mode_lib->vba.PDEAndMetaPTEBytesPerFrameY
+- + mode_lib->vba.PDEAndMetaPTEBytesPerFrameC;
+- mode_lib->vba.MetaRowBytes[k] = mode_lib->vba.MetaRowBytesY
+- + mode_lib->vba.MetaRowBytesC;
+- mode_lib->vba.DPTEBytesPerRow[k] = mode_lib->vba.DPTEBytesPerRowY
+- + mode_lib->vba.DPTEBytesPerRowC;
+- }
+- mode_lib->vba.ExtraLatency =
+- mode_lib->vba.UrgentRoundTripAndOutOfOrderLatencyPerState[i]
+- + (mode_lib->vba.TotalNumberOfActiveDPP[i]
+- * mode_lib->vba.PixelChunkSizeInKByte
+- + mode_lib->vba.TotalNumberOfDCCActiveDPP[i]
+- * mode_lib->vba.MetaChunkSize)
+- * 1024.0
+- / mode_lib->vba.ReturnBWPerState[i];
+- if (mode_lib->vba.VirtualMemoryEnable == true) {
+- mode_lib->vba.ExtraLatency = mode_lib->vba.ExtraLatency
+- + mode_lib->vba.TotalNumberOfActiveDPP[i]
+- * mode_lib->vba.PTEChunkSize * 1024.0
+- / mode_lib->vba.ReturnBWPerState[i];
+- }
+- mode_lib->vba.TimeCalc = 24.0 / mode_lib->vba.ProjectedDCFCLKDeepSleep;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.BlendingAndTiming[k] == k) {
+- if (mode_lib->vba.WritebackEnable[k] == true) {
+- mode_lib->vba.WritebackDelay[i][k] =
+- mode_lib->vba.WritebackLatency
+- + CalculateWriteBackDelay(
+- mode_lib->vba.WritebackPixelFormat[k],
+- mode_lib->vba.WritebackHRatio[k],
+- mode_lib->vba.WritebackVRatio[k],
+- mode_lib->vba.WritebackLumaHTaps[k],
+- mode_lib->vba.WritebackLumaVTaps[k],
+- mode_lib->vba.WritebackChromaHTaps[k],
+- mode_lib->vba.WritebackChromaVTaps[k],
+- mode_lib->vba.WritebackDestinationWidth[k])
+- / mode_lib->vba.RequiredDISPCLK[i];
+- } else {
+- mode_lib->vba.WritebackDelay[i][k] = 0.0;
+- }
+- for (j = 0; j <= mode_lib->vba.NumberOfActivePlanes - 1; j++) {
+- if (mode_lib->vba.BlendingAndTiming[j] == k
+- && mode_lib->vba.WritebackEnable[j]
+- == true) {
+- mode_lib->vba.WritebackDelay[i][k] =
+- dml_max(
+- mode_lib->vba.WritebackDelay[i][k],
+- mode_lib->vba.WritebackLatency
+- + CalculateWriteBackDelay(
+- mode_lib->vba.WritebackPixelFormat[j],
+- mode_lib->vba.WritebackHRatio[j],
+- mode_lib->vba.WritebackVRatio[j],
+- mode_lib->vba.WritebackLumaHTaps[j],
+- mode_lib->vba.WritebackLumaVTaps[j],
+- mode_lib->vba.WritebackChromaHTaps[j],
+- mode_lib->vba.WritebackChromaVTaps[j],
+- mode_lib->vba.WritebackDestinationWidth[j])
+- / mode_lib->vba.RequiredDISPCLK[i]);
+- }
+- }
+- }
+- }
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- for (j = 0; j <= mode_lib->vba.NumberOfActivePlanes - 1; j++) {
+- if (mode_lib->vba.BlendingAndTiming[k] == j) {
+- mode_lib->vba.WritebackDelay[i][k] =
+- mode_lib->vba.WritebackDelay[i][j];
+- }
+- }
+- }
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.MaximumVStartup[k] =
+- mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]
+- - dml_max(
+- 1.0,
+- dml_ceil(
+- mode_lib->vba.WritebackDelay[i][k]
+- / (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]),
+- 1.0));
+- }
+- mode_lib->vba.TWait = CalculateTWait(
+- mode_lib->vba.PrefetchMode,
+- mode_lib->vba.DRAMClockChangeLatency,
+- mode_lib->vba.UrgentLatency,
+- mode_lib->vba.SREnterPlusExitTime);
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.XFCEnabled[k] == true) {
+- mode_lib->vba.XFCRemoteSurfaceFlipDelay =
+- CalculateRemoteSurfaceFlipDelay(
+- mode_lib,
+- mode_lib->vba.VRatio[k],
+- mode_lib->vba.SwathWidthYPerState[i][k],
+- dml_ceil(
+- mode_lib->vba.BytePerPixelInDETY[k],
+- 1.0),
+- mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k],
+- mode_lib->vba.XFCTSlvVupdateOffset,
+- mode_lib->vba.XFCTSlvVupdateWidth,
+- mode_lib->vba.XFCTSlvVreadyOffset,
+- mode_lib->vba.XFCXBUFLatencyTolerance,
+- mode_lib->vba.XFCFillBWOverhead,
+- mode_lib->vba.XFCSlvChunkSize,
+- mode_lib->vba.XFCBusTransportTime,
+- mode_lib->vba.TimeCalc,
+- mode_lib->vba.TWait,
+- &mode_lib->vba.SrcActiveDrainRate,
+- &mode_lib->vba.TInitXFill,
+- &mode_lib->vba.TslvChk);
+- } else {
+- mode_lib->vba.XFCRemoteSurfaceFlipDelay = 0.0;
+- }
+- mode_lib->vba.IsErrorResult[i][k] =
+- CalculatePrefetchSchedule(
+- mode_lib,
+- mode_lib->vba.RequiredDPPCLK[i][k],
+- mode_lib->vba.RequiredDISPCLK[i],
+- mode_lib->vba.PixelClock[k],
+- mode_lib->vba.ProjectedDCFCLKDeepSleep,
+- mode_lib->vba.DSCDelayPerState[i][k],
+- mode_lib->vba.NoOfDPP[i][k],
+- mode_lib->vba.ScalerEnabled[k],
+- mode_lib->vba.NumberOfCursors[k],
+- mode_lib->vba.DPPCLKDelaySubtotal,
+- mode_lib->vba.DPPCLKDelaySCL,
+- mode_lib->vba.DPPCLKDelaySCLLBOnly,
+- mode_lib->vba.DPPCLKDelayCNVCFormater,
+- mode_lib->vba.DPPCLKDelayCNVCCursor,
+- mode_lib->vba.DISPCLKDelaySubtotal,
+- mode_lib->vba.SwathWidthYPerState[i][k]
+- / mode_lib->vba.HRatio[k],
+- mode_lib->vba.OutputFormat[k],
+- mode_lib->vba.VTotal[k]
+- - mode_lib->vba.VActive[k],
+- mode_lib->vba.HTotal[k],
+- mode_lib->vba.MaxInterDCNTileRepeaters,
+- mode_lib->vba.MaximumVStartup[k],
+- mode_lib->vba.MaxPageTableLevels,
+- mode_lib->vba.VirtualMemoryEnable,
+- mode_lib->vba.DynamicMetadataEnable[k],
+- mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired[k],
+- mode_lib->vba.DynamicMetadataTransmittedBytes[k],
+- mode_lib->vba.DCCEnable[k],
+- mode_lib->vba.UrgentLatency,
+- mode_lib->vba.ExtraLatency,
+- mode_lib->vba.TimeCalc,
+- mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k],
+- mode_lib->vba.MetaRowBytes[k],
+- mode_lib->vba.DPTEBytesPerRow[k],
+- mode_lib->vba.PrefetchLinesY[k],
+- mode_lib->vba.SwathWidthYPerState[i][k],
+- mode_lib->vba.BytePerPixelInDETY[k],
+- mode_lib->vba.PrefillY[k],
+- mode_lib->vba.MaxNumSwY[k],
+- mode_lib->vba.PrefetchLinesC[k],
+- mode_lib->vba.BytePerPixelInDETC[k],
+- mode_lib->vba.PrefillC[k],
+- mode_lib->vba.MaxNumSwC[k],
+- mode_lib->vba.SwathHeightYPerState[i][k],
+- mode_lib->vba.SwathHeightCPerState[i][k],
+- mode_lib->vba.TWait,
+- mode_lib->vba.XFCEnabled[k],
+- mode_lib->vba.XFCRemoteSurfaceFlipDelay,
+- mode_lib->vba.Interlace[k],
+- mode_lib->vba.ProgressiveToInterlaceUnitInOPP,
+- mode_lib->vba.DSTXAfterScaler,
+- mode_lib->vba.DSTYAfterScaler,
+- &mode_lib->vba.LineTimesForPrefetch[k],
+- &mode_lib->vba.PrefetchBW[k],
+- &mode_lib->vba.LinesForMetaPTE[k],
+- &mode_lib->vba.LinesForMetaAndDPTERow[k],
+- &mode_lib->vba.VRatioPreY[i][k],
+- &mode_lib->vba.VRatioPreC[i][k],
+- &mode_lib->vba.RequiredPrefetchPixelDataBW[i][k],
+- &mode_lib->vba.VStartupRequiredWhenNotEnoughTimeForDynamicMetadata,
+- &mode_lib->vba.Tno_bw[k],
+- &mode_lib->vba.VUpdateOffsetPix[k],
+- &mode_lib->vba.VUpdateWidthPix[k],
+- &mode_lib->vba.VReadyOffsetPix[k]);
+- }
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; 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];
+- }
+- mode_lib->vba.MaximumReadBandwidthWithPrefetch = 0.0;
+- mode_lib->vba.prefetch_vm_bw_valid = true;
+- mode_lib->vba.prefetch_row_bw_valid = true;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k] == 0.0) {
+- mode_lib->vba.prefetch_vm_bw[k] = 0.0;
+- } else if (mode_lib->vba.LinesForMetaPTE[k] > 0.0) {
+- mode_lib->vba.prefetch_vm_bw[k] =
+- mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k]
+- / (mode_lib->vba.LinesForMetaPTE[k]
+- * mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]);
+- } else {
+- mode_lib->vba.prefetch_vm_bw[k] = 0.0;
+- mode_lib->vba.prefetch_vm_bw_valid = false;
+- }
+- if (mode_lib->vba.MetaRowBytes[k] + mode_lib->vba.DPTEBytesPerRow[k]
+- == 0.0) {
+- mode_lib->vba.prefetch_row_bw[k] = 0.0;
+- } else if (mode_lib->vba.LinesForMetaAndDPTERow[k] > 0.0) {
+- mode_lib->vba.prefetch_row_bw[k] = (mode_lib->vba.MetaRowBytes[k]
+- + mode_lib->vba.DPTEBytesPerRow[k])
+- / (mode_lib->vba.LinesForMetaAndDPTERow[k]
+- * mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]);
+- } else {
+- mode_lib->vba.prefetch_row_bw[k] = 0.0;
+- mode_lib->vba.prefetch_row_bw_valid = false;
+- }
+- mode_lib->vba.MaximumReadBandwidthWithPrefetch =
+- mode_lib->vba.MaximumReadBandwidthWithPrefetch
+- + mode_lib->vba.cursor_bw[k]
+- + dml_max4(
+- mode_lib->vba.prefetch_vm_bw[k],
+- mode_lib->vba.prefetch_row_bw[k],
+- mode_lib->vba.ReadBandwidth[k],
+- mode_lib->vba.RequiredPrefetchPixelDataBW[i][k]);
+- }
+- mode_lib->vba.PrefetchSupported[i] = true;
+- if (mode_lib->vba.MaximumReadBandwidthWithPrefetch
+- > mode_lib->vba.ReturnBWPerState[i]
+- || mode_lib->vba.prefetch_vm_bw_valid == false
+- || mode_lib->vba.prefetch_row_bw_valid == false) {
+- mode_lib->vba.PrefetchSupported[i] = false;
+- }
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.LineTimesForPrefetch[k] < 2.0
+- || mode_lib->vba.LinesForMetaPTE[k] >= 8.0
+- || mode_lib->vba.LinesForMetaAndDPTERow[k] >= 16.0
+- || mode_lib->vba.IsErrorResult[i][k] == true) {
+- mode_lib->vba.PrefetchSupported[i] = false;
+- }
+- }
+- mode_lib->vba.VRatioInPrefetchSupported[i] = true;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.VRatioPreY[i][k] > 4.0
+- || mode_lib->vba.VRatioPreC[i][k] > 4.0
+- || mode_lib->vba.IsErrorResult[i][k] == true) {
+- mode_lib->vba.VRatioInPrefetchSupported[i] = false;
+- }
+- }
+- if (mode_lib->vba.PrefetchSupported[i] == true
+- && mode_lib->vba.VRatioInPrefetchSupported[i] == true) {
+- mode_lib->vba.BandwidthAvailableForImmediateFlip =
+- mode_lib->vba.ReturnBWPerState[i];
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.BandwidthAvailableForImmediateFlip =
+- mode_lib->vba.BandwidthAvailableForImmediateFlip
+- - mode_lib->vba.cursor_bw[k]
+- - dml_max(
+- mode_lib->vba.ReadBandwidth[k],
+- mode_lib->vba.PrefetchBW[k]);
+- }
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.ImmediateFlipBytes[k] = 0.0;
+- if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8
+- && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) {
+- mode_lib->vba.ImmediateFlipBytes[k] =
+- mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k]
+- + mode_lib->vba.MetaRowBytes[k]
+- + mode_lib->vba.DPTEBytesPerRow[k];
+- }
+- }
+- mode_lib->vba.TotImmediateFlipBytes = 0.0;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8
+- && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) {
+- mode_lib->vba.TotImmediateFlipBytes =
+- mode_lib->vba.TotImmediateFlipBytes
+- + mode_lib->vba.ImmediateFlipBytes[k];
+- }
+- }
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- CalculateFlipSchedule(
+- mode_lib,
+- mode_lib->vba.ExtraLatency,
+- mode_lib->vba.UrgentLatency,
+- mode_lib->vba.MaxPageTableLevels,
+- mode_lib->vba.VirtualMemoryEnable,
+- mode_lib->vba.BandwidthAvailableForImmediateFlip,
+- mode_lib->vba.TotImmediateFlipBytes,
+- mode_lib->vba.SourcePixelFormat[k],
+- mode_lib->vba.ImmediateFlipBytes[k],
+- mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k],
+- mode_lib->vba.VRatio[k],
+- mode_lib->vba.Tno_bw[k],
+- mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k],
+- mode_lib->vba.MetaRowBytes[k],
+- mode_lib->vba.DPTEBytesPerRow[k],
+- mode_lib->vba.DCCEnable[k],
+- mode_lib->vba.dpte_row_height[k],
+- mode_lib->vba.meta_row_height[k],
+- mode_lib->vba.qual_row_bw[k],
+- &mode_lib->vba.DestinationLinesToRequestVMInImmediateFlip[k],
+- &mode_lib->vba.DestinationLinesToRequestRowInImmediateFlip[k],
+- &mode_lib->vba.final_flip_bw[k],
+- &mode_lib->vba.ImmediateFlipSupportedForPipe[k]);
+- }
+- mode_lib->vba.total_dcn_read_bw_with_flip = 0.0;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.total_dcn_read_bw_with_flip =
+- mode_lib->vba.total_dcn_read_bw_with_flip
+- + mode_lib->vba.cursor_bw[k]
+- + dml_max3(
+- mode_lib->vba.prefetch_vm_bw[k],
+- mode_lib->vba.prefetch_row_bw[k],
+- mode_lib->vba.final_flip_bw[k]
+- + dml_max(
+- mode_lib->vba.ReadBandwidth[k],
+- mode_lib->vba.RequiredPrefetchPixelDataBW[i][k]));
+- }
+- mode_lib->vba.ImmediateFlipSupportedForState[i] = true;
+- if (mode_lib->vba.total_dcn_read_bw_with_flip
+- > mode_lib->vba.ReturnBWPerState[i]) {
+- mode_lib->vba.ImmediateFlipSupportedForState[i] = false;
+- }
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.ImmediateFlipSupportedForPipe[k] == false) {
+- mode_lib->vba.ImmediateFlipSupportedForState[i] = false;
+- }
+- }
+- } else {
+- mode_lib->vba.ImmediateFlipSupportedForState[i] = false;
+- }
+- }
+- /*PTE Buffer Size Check*/
+-
+- for (i = 0; i <= DC__VOLTAGE_STATES; i++) {
+- mode_lib->vba.PTEBufferSizeNotExceeded[i] = true;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.PTEBufferSizeNotExceededY[i][k] == false
+- || mode_lib->vba.PTEBufferSizeNotExceededC[i][k] == false) {
+- mode_lib->vba.PTEBufferSizeNotExceeded[i] = false;
+- }
+- }
+- }
+- /*Cursor Support Check*/
+-
+- mode_lib->vba.CursorSupport = true;
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- if (mode_lib->vba.CursorWidth[k][0] > 0.0) {
+- if (dml_floor(
+- dml_floor(
+- mode_lib->vba.CursorBufferSize
+- - mode_lib->vba.CursorChunkSize,
+- mode_lib->vba.CursorChunkSize) * 1024.0
+- / (mode_lib->vba.CursorWidth[k][0]
+- * mode_lib->vba.CursorBPP[k][0]
+- / 8.0),
+- 1.0)
+- * (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
+- / mode_lib->vba.VRatio[k] < mode_lib->vba.UrgentLatency
+- || (mode_lib->vba.CursorBPP[k][0] == 64.0
+- && 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.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.AlignedYPitch[k] = dml_ceil(
+- dml_max(mode_lib->vba.PitchY[k], mode_lib->vba.ViewportWidth[k]),
+- mode_lib->vba.MacroTileWidthY[k]);
+- if (mode_lib->vba.AlignedYPitch[k] > mode_lib->vba.PitchY[k]) {
+- mode_lib->vba.PitchSupport = false;
+- }
+- if (mode_lib->vba.DCCEnable[k] == true) {
+- mode_lib->vba.AlignedDCCMetaPitch[k] = dml_ceil(
+- dml_max(
+- mode_lib->vba.DCCMetaPitchY[k],
+- mode_lib->vba.ViewportWidth[k]),
+- 64.0 * mode_lib->vba.Read256BlockWidthY[k]);
+- } else {
+- mode_lib->vba.AlignedDCCMetaPitch[k] = mode_lib->vba.DCCMetaPitchY[k];
+- }
+- if (mode_lib->vba.AlignedDCCMetaPitch[k] > mode_lib->vba.DCCMetaPitchY[k]) {
+- mode_lib->vba.PitchSupport = false;
+- }
+- 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_mono_8) {
+- mode_lib->vba.AlignedCPitch[k] = dml_ceil(
+- dml_max(
+- mode_lib->vba.PitchC[k],
+- mode_lib->vba.ViewportWidth[k] / 2.0),
+- mode_lib->vba.MacroTileWidthC[k]);
+- } else {
+- mode_lib->vba.AlignedCPitch[k] = mode_lib->vba.PitchC[k];
+- }
+- if (mode_lib->vba.AlignedCPitch[k] > mode_lib->vba.PitchC[k]) {
+- mode_lib->vba.PitchSupport = false;
+- }
+- }
+- /*Mode Support, Voltage State and SOC Configuration*/
+-
+- for (i = DC__VOLTAGE_STATES; i >= 0; i--) {
+- if (mode_lib->vba.ScaleRatioAndTapsSupport == true
+- && mode_lib->vba.SourceFormatPixelAndScanSupport == true
+- && mode_lib->vba.ViewportSizeSupport[i] == true
+- && mode_lib->vba.BandwidthSupport[i] == true
+- && mode_lib->vba.DIOSupport[i] == true
+- && mode_lib->vba.NotEnoughDSCUnits[i] == false
+- && mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] == false
+- && mode_lib->vba.UrgentLatencySupport[i] == true
+- && mode_lib->vba.ROBSupport[i] == true
+- && mode_lib->vba.DISPCLK_DPPCLK_Support[i] == true
+- && mode_lib->vba.TotalAvailablePipesSupport[i] == true
+- && mode_lib->vba.NumberOfOTGSupport == true
+- && mode_lib->vba.WritebackModeSupport == true
+- && mode_lib->vba.WritebackLatencySupport == true
+- && mode_lib->vba.WritebackScaleRatioAndTapsSupport == true
+- && mode_lib->vba.CursorSupport == true
+- && mode_lib->vba.PitchSupport == true
+- && mode_lib->vba.PrefetchSupported[i] == true
+- && mode_lib->vba.VRatioInPrefetchSupported[i] == true
+- && mode_lib->vba.PTEBufferSizeNotExceeded[i] == true
+- && mode_lib->vba.NonsupportedDSCInputBPC == false) {
+- mode_lib->vba.ModeSupport[i] = true;
+- } else {
+- mode_lib->vba.ModeSupport[i] = false;
+- }
+- }
+- for (i = DC__VOLTAGE_STATES; i >= 0; i--) {
+- if (i == DC__VOLTAGE_STATES || mode_lib->vba.ModeSupport[i] == true) {
+- mode_lib->vba.VoltageLevel = i;
+- }
+- }
+- mode_lib->vba.DCFCLK = mode_lib->vba.DCFCLKPerState[mode_lib->vba.VoltageLevel];
+- 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.FabricAndDRAMBandwidth =
+- mode_lib->vba.FabricAndDRAMBandwidthPerState[mode_lib->vba.VoltageLevel];
+- mode_lib->vba.ImmediateFlipSupport =
+- mode_lib->vba.ImmediateFlipSupportedForState[mode_lib->vba.VoltageLevel];
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
+- mode_lib->vba.DPPPerPlane[k] = mode_lib->vba.NoOfDPP[mode_lib->vba.VoltageLevel][k];
+- }
+- for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 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] = 0;
+- }
+- mode_lib->vba.DSCEnabled[k] =
+- mode_lib->vba.RequiresDSC[mode_lib->vba.VoltageLevel][k];
+- mode_lib->vba.OutputBpp[k] =
+- mode_lib->vba.OutputBppPerState[mode_lib->vba.VoltageLevel][k];
+- }
+-}
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.h b/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.h
+deleted file mode 100644
+index 4112409..0000000
+--- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.h
++++ /dev/null
+@@ -1,598 +0,0 @@
+-/*
+- * Copyright 2017 Advanced Micro Devices, Inc.
+- *
+- * 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
+- *
+- */
+-
+-#ifndef __DML2_DISPLAY_MODE_VBA_H__
+-#define __DML2_DISPLAY_MODE_VBA_H__
+-
+-#include "dml_common_defs.h"
+-
+-struct display_mode_lib;
+-
+-void set_prefetch_mode(struct display_mode_lib *mode_lib,
+- bool cstate_en,
+- bool pstate_en,
+- bool ignore_viewport_pos,
+- bool immediate_flip_support);
+-
+-#define dml_get_attr_decl(attr) double get_##attr(struct display_mode_lib *mode_lib, const display_e2e_pipe_params_st *pipes, unsigned int num_pipes)
+-
+-dml_get_attr_decl(clk_dcf_deepsleep);
+-dml_get_attr_decl(wm_urgent);
+-dml_get_attr_decl(wm_memory_trip);
+-dml_get_attr_decl(wm_writeback_urgent);
+-dml_get_attr_decl(wm_stutter_exit);
+-dml_get_attr_decl(wm_stutter_enter_exit);
+-dml_get_attr_decl(wm_dram_clock_change);
+-dml_get_attr_decl(wm_writeback_dram_clock_change);
+-dml_get_attr_decl(wm_xfc_underflow);
+-dml_get_attr_decl(stutter_efficiency_no_vblank);
+-dml_get_attr_decl(stutter_efficiency);
+-dml_get_attr_decl(urgent_latency);
+-dml_get_attr_decl(urgent_extra_latency);
+-dml_get_attr_decl(nonurgent_latency);
+-dml_get_attr_decl(dram_clock_change_latency);
+-dml_get_attr_decl(dispclk_calculated);
+-dml_get_attr_decl(total_data_read_bw);
+-dml_get_attr_decl(return_bw);
+-dml_get_attr_decl(tcalc);
+-
+-#define dml_get_pipe_attr_decl(attr) double get_##attr(struct display_mode_lib *mode_lib, const display_e2e_pipe_params_st *pipes, unsigned int num_pipes, unsigned int which_pipe)
+-
+-dml_get_pipe_attr_decl(dsc_delay);
+-dml_get_pipe_attr_decl(dppclk_calculated);
+-dml_get_pipe_attr_decl(dscclk_calculated);
+-dml_get_pipe_attr_decl(min_ttu_vblank);
+-dml_get_pipe_attr_decl(vratio_prefetch_l);
+-dml_get_pipe_attr_decl(vratio_prefetch_c);
+-dml_get_pipe_attr_decl(dst_x_after_scaler);
+-dml_get_pipe_attr_decl(dst_y_after_scaler);
+-dml_get_pipe_attr_decl(dst_y_per_vm_vblank);
+-dml_get_pipe_attr_decl(dst_y_per_row_vblank);
+-dml_get_pipe_attr_decl(dst_y_prefetch);
+-dml_get_pipe_attr_decl(dst_y_per_vm_flip);
+-dml_get_pipe_attr_decl(dst_y_per_row_flip);
+-dml_get_pipe_attr_decl(xfc_transfer_delay);
+-dml_get_pipe_attr_decl(xfc_precharge_delay);
+-dml_get_pipe_attr_decl(xfc_remote_surface_flip_latency);
+-dml_get_pipe_attr_decl(xfc_prefetch_margin);
+-
+-unsigned int get_vstartup_calculated(
+- struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *pipes,
+- unsigned int num_pipes,
+- unsigned int which_pipe);
+-
+-double get_total_immediate_flip_bytes(
+- struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *pipes,
+- unsigned int num_pipes);
+-double get_total_immediate_flip_bw(
+- struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *pipes,
+- unsigned int num_pipes);
+-double get_total_prefetch_bw(
+- struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *pipes,
+- unsigned int num_pipes);
+-
+-unsigned int dml_get_voltage_level(
+- struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *pipes,
+- unsigned int num_pipes);
+-
+-bool Calculate256BBlockSizes(
+- enum source_format_class SourcePixelFormat,
+- enum dm_swizzle_mode SurfaceTiling,
+- unsigned int BytePerPixelY,
+- unsigned int BytePerPixelC,
+- unsigned int *BlockHeight256BytesY,
+- unsigned int *BlockHeight256BytesC,
+- unsigned int *BlockWidth256BytesY,
+- unsigned int *BlockWidth256BytesC);
+-
+-
+-struct vba_vars_st {
+- ip_params_st ip;
+- soc_bounding_box_st soc;
+-
+- unsigned int MaximumMaxVStartupLines;
+- double cursor_bw[DC__NUM_DPP__MAX];
+- double meta_row_bw[DC__NUM_DPP__MAX];
+- double dpte_row_bw[DC__NUM_DPP__MAX];
+- double qual_row_bw[DC__NUM_DPP__MAX];
+- double WritebackDISPCLK;
+- double PSCL_THROUGHPUT_LUMA[DC__NUM_DPP__MAX];
+- double PSCL_THROUGHPUT_CHROMA[DC__NUM_DPP__MAX];
+- double DPPCLKUsingSingleDPPLuma;
+- double DPPCLKUsingSingleDPPChroma;
+- double DPPCLKUsingSingleDPP[DC__NUM_DPP__MAX];
+- double DISPCLKWithRamping;
+- double DISPCLKWithoutRamping;
+- double GlobalDPPCLK;
+- double DISPCLKWithRampingRoundedToDFSGranularity;
+- double DISPCLKWithoutRampingRoundedToDFSGranularity;
+- double MaxDispclkRoundedToDFSGranularity;
+- bool DCCEnabledAnyPlane;
+- double ReturnBandwidthToDCN;
+- unsigned int SwathWidthY[DC__NUM_DPP__MAX];
+- unsigned int SwathWidthSingleDPPY[DC__NUM_DPP__MAX];
+- double BytePerPixelDETY[DC__NUM_DPP__MAX];
+- double BytePerPixelDETC[DC__NUM_DPP__MAX];
+- double ReadBandwidthPlaneLuma[DC__NUM_DPP__MAX];
+- double ReadBandwidthPlaneChroma[DC__NUM_DPP__MAX];
+- unsigned int TotalActiveDPP;
+- unsigned int TotalDCCActiveDPP;
+- double UrgentRoundTripAndOutOfOrderLatency;
+- double DisplayPipeLineDeliveryTimeLuma[DC__NUM_DPP__MAX]; // WM
+- double DisplayPipeLineDeliveryTimeChroma[DC__NUM_DPP__MAX]; // WM
+- double LinesInDETY[DC__NUM_DPP__MAX]; // WM
+- double LinesInDETC[DC__NUM_DPP__MAX]; // WM
+- unsigned int LinesInDETYRoundedDownToSwath[DC__NUM_DPP__MAX]; // WM
+- unsigned int LinesInDETCRoundedDownToSwath[DC__NUM_DPP__MAX]; // WM
+- double FullDETBufferingTimeY[DC__NUM_DPP__MAX]; // WM
+- double FullDETBufferingTimeC[DC__NUM_DPP__MAX]; // WM
+- double MinFullDETBufferingTime;
+- double FrameTimeForMinFullDETBufferingTime;
+- double AverageReadBandwidthGBytePerSecond;
+- double PartOfBurstThatFitsInROB;
+- double StutterBurstTime;
+- //unsigned int NextPrefetchMode;
+- double VBlankTime;
+- double SmallestVBlank;
+- double DCFCLKDeepSleepPerPlane;
+- double EffectiveDETPlusLBLinesLuma;
+- double EffectiveDETPlusLBLinesChroma;
+- double UrgentLatencySupportUsLuma;
+- double UrgentLatencySupportUsChroma;
+- double UrgentLatencySupportUs[DC__NUM_DPP__MAX];
+- unsigned int DSCFormatFactor;
+- unsigned int BlockHeight256BytesY[DC__NUM_DPP__MAX];
+- unsigned int BlockHeight256BytesC[DC__NUM_DPP__MAX];
+- unsigned int BlockWidth256BytesY[DC__NUM_DPP__MAX];
+- unsigned int BlockWidth256BytesC[DC__NUM_DPP__MAX];
+- double VInitPreFillY[DC__NUM_DPP__MAX];
+- double VInitPreFillC[DC__NUM_DPP__MAX];
+- unsigned int MaxNumSwathY[DC__NUM_DPP__MAX];
+- unsigned int MaxNumSwathC[DC__NUM_DPP__MAX];
+- double PrefetchSourceLinesY[DC__NUM_DPP__MAX];
+- double PrefetchSourceLinesC[DC__NUM_DPP__MAX];
+- double PixelPTEBytesPerRow[DC__NUM_DPP__MAX];
+- double MetaRowByte[DC__NUM_DPP__MAX];
+- unsigned int dpte_row_height[DC__NUM_DPP__MAX];
+- unsigned int dpte_row_height_chroma[DC__NUM_DPP__MAX];
+- unsigned int meta_row_height[DC__NUM_DPP__MAX];
+- unsigned int meta_row_height_chroma[DC__NUM_DPP__MAX];
+-
+- unsigned int MacroTileWidthY[DC__NUM_DPP__MAX];
+- unsigned int MacroTileWidthC[DC__NUM_DPP__MAX];
+- unsigned int MaxVStartupLines[DC__NUM_DPP__MAX];
+- double WritebackDelay[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- bool PrefetchModeSupported;
+- bool AllowDRAMClockChangeDuringVBlank[DC__NUM_DPP__MAX];
+- bool AllowDRAMSelfRefreshDuringVBlank[DC__NUM_DPP__MAX];
+- double RequiredPrefetchPixDataBW[DC__NUM_DPP__MAX];
+- double XFCRemoteSurfaceFlipDelay;
+- double TInitXFill;
+- double TslvChk;
+- double SrcActiveDrainRate;
+- double Tno_bw[DC__NUM_DPP__MAX];
+- bool ImmediateFlipSupported;
+-
+- double prefetch_vm_bw[DC__NUM_DPP__MAX];
+- double prefetch_row_bw[DC__NUM_DPP__MAX];
+- bool ImmediateFlipSupportedForPipe[DC__NUM_DPP__MAX];
+- unsigned int VStartupLines;
+- double DisplayPipeLineDeliveryTimeLumaPrefetch[DC__NUM_DPP__MAX];
+- double DisplayPipeLineDeliveryTimeChromaPrefetch[DC__NUM_DPP__MAX];
+- unsigned int ActiveDPPs;
+- unsigned int LBLatencyHidingSourceLinesY;
+- unsigned int LBLatencyHidingSourceLinesC;
+- double ActiveDRAMClockChangeLatencyMargin[DC__NUM_DPP__MAX];
+- double MinActiveDRAMClockChangeMargin;
+- double XFCSlaveVUpdateOffset[DC__NUM_DPP__MAX];
+- double XFCSlaveVupdateWidth[DC__NUM_DPP__MAX];
+- double XFCSlaveVReadyOffset[DC__NUM_DPP__MAX];
+- double InitFillLevel;
+- double FinalFillMargin;
+- double FinalFillLevel;
+- double RemainingFillLevel;
+- double TFinalxFill;
+-
+-
+- //
+- // SOC Bounding Box Parameters
+- //
+- double SRExitTime;
+- double SREnterPlusExitTime;
+- double UrgentLatency;
+- double WritebackLatency;
+- double PercentOfIdealDRAMAndFabricBWReceivedAfterUrgLatency;
+- double NumberOfChannels;
+- double DRAMChannelWidth;
+- double FabricDatapathToDCNDataReturn;
+- double ReturnBusWidth;
+- double Downspreading;
+- double DISPCLKDPPCLKDSCCLKDownSpreading;
+- double DISPCLKDPPCLKVCOSpeed;
+- double RoundTripPingLatencyCycles;
+- double UrgentOutOfOrderReturnPerChannel;
+- unsigned int VMMPageSize;
+- double DRAMClockChangeLatency;
+- double XFCBusTransportTime;
+- double XFCXBUFLatencyTolerance;
+-
+- //
+- // IP Parameters
+- //
+- unsigned int ROBBufferSizeInKByte;
+- double DETBufferSizeInKByte;
+- unsigned int DPPOutputBufferPixels;
+- unsigned int OPPOutputBufferLines;
+- unsigned int PixelChunkSizeInKByte;
+- double ReturnBW;
+- bool VirtualMemoryEnable;
+- unsigned int MaxPageTableLevels;
+- unsigned int OverridePageTableLevels;
+- unsigned int PTEChunkSize;
+- unsigned int MetaChunkSize;
+- unsigned int WritebackChunkSize;
+- bool ODMCapability;
+- unsigned int NumberOfDSC;
+- unsigned int LineBufferSize;
+- unsigned int MaxLineBufferLines;
+- unsigned int WritebackInterfaceLumaBufferSize;
+- unsigned int WritebackInterfaceChromaBufferSize;
+- unsigned int WritebackChromaLineBufferWidth;
+- double MaxDCHUBToPSCLThroughput;
+- double MaxPSCLToLBThroughput;
+- unsigned int PTEBufferSizeInRequests;
+- double DISPCLKRampingMargin;
+- unsigned int MaxInterDCNTileRepeaters;
+- bool XFCSupported;
+- double XFCSlvChunkSize;
+- double XFCFillBWOverhead;
+- double XFCFillConstant;
+- double XFCTSlvVupdateOffset;
+- double XFCTSlvVupdateWidth;
+- double XFCTSlvVreadyOffset;
+- double DPPCLKDelaySubtotal;
+- double DPPCLKDelaySCL;
+- double DPPCLKDelaySCLLBOnly;
+- double DPPCLKDelayCNVCFormater;
+- double DPPCLKDelayCNVCCursor;
+- double DISPCLKDelaySubtotal;
+- bool ProgressiveToInterlaceUnitInOPP;
+- unsigned int PDEProcessingBufIn64KBReqs;
+-
+- // Pipe/Plane Parameters
+- int VoltageLevel;
+- double FabricAndDRAMBandwidth;
+- double FabricClock;
+- double DRAMSpeed;
+- double DISPCLK;
+- double SOCCLK;
+- double DCFCLK;
+-
+- unsigned int NumberOfActivePlanes;
+- unsigned int ViewportWidth[DC__NUM_DPP__MAX];
+- unsigned int ViewportHeight[DC__NUM_DPP__MAX];
+- unsigned int ViewportYStartY[DC__NUM_DPP__MAX];
+- unsigned int ViewportYStartC[DC__NUM_DPP__MAX];
+- unsigned int PitchY[DC__NUM_DPP__MAX];
+- unsigned int PitchC[DC__NUM_DPP__MAX];
+- double HRatio[DC__NUM_DPP__MAX];
+- double VRatio[DC__NUM_DPP__MAX];
+- unsigned int htaps[DC__NUM_DPP__MAX];
+- unsigned int vtaps[DC__NUM_DPP__MAX];
+- unsigned int HTAPsChroma[DC__NUM_DPP__MAX];
+- unsigned int VTAPsChroma[DC__NUM_DPP__MAX];
+- unsigned int HTotal[DC__NUM_DPP__MAX];
+- unsigned int VTotal[DC__NUM_DPP__MAX];
+- unsigned int DPPPerPlane[DC__NUM_DPP__MAX];
+- double PixelClock[DC__NUM_DPP__MAX];
+- double PixelClockBackEnd[DC__NUM_DPP__MAX];
+- double DPPCLK[DC__NUM_DPP__MAX];
+- bool DCCEnable[DC__NUM_DPP__MAX];
+- unsigned int DCCMetaPitchY[DC__NUM_DPP__MAX];
+- enum scan_direction_class SourceScan[DC__NUM_DPP__MAX];
+- enum source_format_class SourcePixelFormat[DC__NUM_DPP__MAX];
+- bool WritebackEnable[DC__NUM_DPP__MAX];
+- double WritebackDestinationWidth[DC__NUM_DPP__MAX];
+- double WritebackDestinationHeight[DC__NUM_DPP__MAX];
+- double WritebackSourceHeight[DC__NUM_DPP__MAX];
+- enum source_format_class WritebackPixelFormat[DC__NUM_DPP__MAX];
+- unsigned int WritebackLumaHTaps[DC__NUM_DPP__MAX];
+- unsigned int WritebackLumaVTaps[DC__NUM_DPP__MAX];
+- unsigned int WritebackChromaHTaps[DC__NUM_DPP__MAX];
+- unsigned int WritebackChromaVTaps[DC__NUM_DPP__MAX];
+- double WritebackHRatio[DC__NUM_DPP__MAX];
+- double WritebackVRatio[DC__NUM_DPP__MAX];
+- unsigned int HActive[DC__NUM_DPP__MAX];
+- unsigned int VActive[DC__NUM_DPP__MAX];
+- bool Interlace[DC__NUM_DPP__MAX];
+- enum dm_swizzle_mode SurfaceTiling[DC__NUM_DPP__MAX];
+- unsigned int ScalerRecoutWidth[DC__NUM_DPP__MAX];
+- bool DynamicMetadataEnable[DC__NUM_DPP__MAX];
+- unsigned int DynamicMetadataLinesBeforeActiveRequired[DC__NUM_DPP__MAX];
+- unsigned int DynamicMetadataTransmittedBytes[DC__NUM_DPP__MAX];
+- double DCCRate[DC__NUM_DPP__MAX];
+- bool ODMCombineEnabled[DC__NUM_DPP__MAX];
+- double OutputBpp[DC__NUM_DPP__MAX];
+- unsigned int NumberOfDSCSlices[DC__NUM_DPP__MAX];
+- bool DSCEnabled[DC__NUM_DPP__MAX];
+- unsigned int DSCDelay[DC__NUM_DPP__MAX];
+- unsigned int DSCInputBitPerComponent[DC__NUM_DPP__MAX];
+- enum output_format_class OutputFormat[DC__NUM_DPP__MAX];
+- enum output_encoder_class Output[DC__NUM_DPP__MAX];
+- unsigned int BlendingAndTiming[DC__NUM_DPP__MAX];
+- bool SynchronizedVBlank;
+- unsigned int NumberOfCursors[DC__NUM_DPP__MAX];
+- unsigned int CursorWidth[DC__NUM_DPP__MAX][DC__NUM_CURSOR__MAX];
+- unsigned int CursorBPP[DC__NUM_DPP__MAX][DC__NUM_CURSOR__MAX];
+- bool XFCEnabled[DC__NUM_DPP__MAX];
+- bool ScalerEnabled[DC__NUM_DPP__MAX];
+-
+- // Intermediates/Informational
+- bool ImmediateFlipSupport;
+- unsigned int SwathHeightY[DC__NUM_DPP__MAX];
+- unsigned int SwathHeightC[DC__NUM_DPP__MAX];
+- unsigned int DETBufferSizeY[DC__NUM_DPP__MAX];
+- unsigned int DETBufferSizeC[DC__NUM_DPP__MAX];
+- unsigned int LBBitPerPixel[DC__NUM_DPP__MAX];
+- double LastPixelOfLineExtraWatermark;
+- double TotalDataReadBandwidth;
+- unsigned int TotalActiveWriteback;
+- unsigned int EffectiveLBLatencyHidingSourceLinesLuma;
+- unsigned int EffectiveLBLatencyHidingSourceLinesChroma;
+- double BandwidthAvailableForImmediateFlip;
+- unsigned int PrefetchMode;
+- bool IgnoreViewportPositioning;
+- double PrefetchBandwidth[DC__NUM_DPP__MAX];
+- bool ErrorResult[DC__NUM_DPP__MAX];
+- double PDEAndMetaPTEBytesFrame[DC__NUM_DPP__MAX];
+-
+- //
+- // Calculated dml_ml->vba.Outputs
+- //
+- double DCFClkDeepSleep;
+- double UrgentWatermark;
+- double UrgentExtraLatency;
+- double MemoryTripWatermark;
+- double WritebackUrgentWatermark;
+- double StutterExitWatermark;
+- double StutterEnterPlusExitWatermark;
+- double DRAMClockChangeWatermark;
+- double WritebackDRAMClockChangeWatermark;
+- double StutterEfficiency;
+- double StutterEfficiencyNotIncludingVBlank;
+- double MinUrgentLatencySupportUs;
+- double NonUrgentLatencyTolerance;
+- double MinActiveDRAMClockChangeLatencySupported;
+- enum clock_change_support DRAMClockChangeSupport;
+-
+- // These are the clocks calcuated by the library but they are not actually
+- // used explicitly. They are fetched by tests and then possibly used. The
+- // ultimate values to use are the ones specified by the parameters to DML
+- double DISPCLK_calculated;
+- double DSCCLK_calculated[DC__NUM_DPP__MAX];
+- double DPPCLK_calculated[DC__NUM_DPP__MAX];
+-
+- unsigned int VStartup[DC__NUM_DPP__MAX];
+- unsigned int VUpdateOffsetPix[DC__NUM_DPP__MAX];
+- unsigned int VUpdateWidthPix[DC__NUM_DPP__MAX];
+- unsigned int VReadyOffsetPix[DC__NUM_DPP__MAX];
+- unsigned int VStartupRequiredWhenNotEnoughTimeForDynamicMetadata;
+-
+- double ImmediateFlipBW;
+- unsigned int TotImmediateFlipBytes;
+- double TCalc;
+- double MinTTUVBlank[DC__NUM_DPP__MAX];
+- double VRatioPrefetchY[DC__NUM_DPP__MAX];
+- double VRatioPrefetchC[DC__NUM_DPP__MAX];
+- double DSTXAfterScaler[DC__NUM_DPP__MAX];
+- double DSTYAfterScaler[DC__NUM_DPP__MAX];
+-
+- double DestinationLinesToRequestVMInVBlank[DC__NUM_DPP__MAX];
+- double DestinationLinesToRequestRowInVBlank[DC__NUM_DPP__MAX];
+- double DestinationLinesForPrefetch[DC__NUM_DPP__MAX];
+- double DestinationLinesToRequestRowInImmediateFlip[DC__NUM_DPP__MAX];
+- double DestinationLinesToRequestVMInImmediateFlip[DC__NUM_DPP__MAX];
+-
+- double XFCTransferDelay[DC__NUM_DPP__MAX];
+- double XFCPrechargeDelay[DC__NUM_DPP__MAX];
+- double XFCRemoteSurfaceFlipLatency[DC__NUM_DPP__MAX];
+- double XFCPrefetchMargin[DC__NUM_DPP__MAX];
+-
+- display_e2e_pipe_params_st cache_pipes[DC__NUM_DPP__MAX];
+- unsigned int cache_num_pipes;
+- unsigned int pipe_plane[DC__NUM_DPP__MAX];
+-
+- /* vba mode support */
+- /*inputs*/
+- bool SupportGFX7CompatibleTilingIn32bppAnd64bpp;
+- double MaxHSCLRatio;
+- double MaxVSCLRatio;
+- unsigned int MaxNumWriteback;
+- bool WritebackLumaAndChromaScalingSupported;
+- bool Cursor64BppSupport;
+- double DCFCLKPerState[DC__VOLTAGE_STATES + 1];
+- double FabricClockPerState[DC__VOLTAGE_STATES + 1];
+- double SOCCLKPerState[DC__VOLTAGE_STATES + 1];
+- double PHYCLKPerState[DC__VOLTAGE_STATES + 1];
+- double MaxDppclk[DC__VOLTAGE_STATES + 1];
+- double MaxDSCCLK[DC__VOLTAGE_STATES + 1];
+- double DRAMSpeedPerState[DC__VOLTAGE_STATES + 1];
+- double MaxDispclk[DC__VOLTAGE_STATES + 1];
+-
+- /*outputs*/
+- bool ScaleRatioAndTapsSupport;
+- bool SourceFormatPixelAndScanSupport;
+- unsigned int SwathWidthYSingleDPP[DC__NUM_DPP__MAX];
+- double BytePerPixelInDETY[DC__NUM_DPP__MAX];
+- double BytePerPixelInDETC[DC__NUM_DPP__MAX];
+- double TotalReadBandwidthConsumedGBytePerSecond;
+- double ReadBandwidth[DC__NUM_DPP__MAX];
+- double TotalWriteBandwidthConsumedGBytePerSecond;
+- double WriteBandwidth[DC__NUM_DPP__MAX];
+- double TotalBandwidthConsumedGBytePerSecond;
+- bool DCCEnabledInAnyPlane;
+- bool WritebackLatencySupport;
+- bool WritebackModeSupport;
+- bool Writeback10bpc420Supported;
+- bool BandwidthSupport[DC__VOLTAGE_STATES + 1];
+- unsigned int TotalNumberOfActiveWriteback;
+- double CriticalPoint;
+- double ReturnBWToDCNPerState;
+- double FabricAndDRAMBandwidthPerState[DC__VOLTAGE_STATES + 1];
+- double ReturnBWPerState[DC__VOLTAGE_STATES + 1];
+- double UrgentRoundTripAndOutOfOrderLatencyPerState[DC__VOLTAGE_STATES + 1];
+- bool ODMCombineEnablePerState[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- bool PTEBufferSizeNotExceededY[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- bool PTEBufferSizeNotExceededC[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- bool PrefetchSupported[DC__VOLTAGE_STATES + 1];
+- bool VRatioInPrefetchSupported[DC__VOLTAGE_STATES + 1];
+- bool DISPCLK_DPPCLK_Support[DC__VOLTAGE_STATES + 1];
+- bool TotalAvailablePipesSupport[DC__VOLTAGE_STATES + 1];
+- bool UrgentLatencySupport[DC__VOLTAGE_STATES + 1];
+- bool ModeSupport[DC__VOLTAGE_STATES + 1];
+- bool DIOSupport[DC__VOLTAGE_STATES + 1];
+- bool NotEnoughDSCUnits[DC__VOLTAGE_STATES + 1];
+- bool DSCCLKRequiredMoreThanSupported[DC__VOLTAGE_STATES + 1];
+- bool ROBSupport[DC__VOLTAGE_STATES + 1];
+- bool PTEBufferSizeNotExceeded[DC__VOLTAGE_STATES + 1];
+- bool RequiresDSC[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- bool IsErrorResult[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- bool ViewportSizeSupport[DC__VOLTAGE_STATES + 1];
+- bool prefetch_vm_bw_valid;
+- bool prefetch_row_bw_valid;
+- bool NumberOfOTGSupport;
+- bool NonsupportedDSCInputBPC;
+- bool WritebackScaleRatioAndTapsSupport;
+- bool CursorSupport;
+- bool PitchSupport;
+-
+- double WritebackLineBufferLumaBufferSize;
+- double WritebackLineBufferChromaBufferSize;
+- double WritebackMinHSCLRatio;
+- double WritebackMinVSCLRatio;
+- double WritebackMaxHSCLRatio;
+- double WritebackMaxVSCLRatio;
+- double WritebackMaxHSCLTaps;
+- double WritebackMaxVSCLTaps;
+- unsigned int MaxNumDPP;
+- unsigned int MaxNumOTG;
+- double CursorBufferSize;
+- double CursorChunkSize;
+- unsigned int Mode;
+- unsigned int NoOfDPP[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- double OutputLinkDPLanes[DC__NUM_DPP__MAX];
+- double SwathWidthYPerState[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- double SwathHeightYPerState[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- double SwathHeightCPerState[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- double UrgentLatencySupportUsPerState[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- double VRatioPreY[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- double VRatioPreC[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- double RequiredPrefetchPixelDataBW[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- double RequiredDPPCLK[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- double RequiredDISPCLK[DC__VOLTAGE_STATES + 1];
+- double TotalNumberOfActiveDPP[DC__VOLTAGE_STATES + 1];
+- double TotalNumberOfDCCActiveDPP[DC__VOLTAGE_STATES + 1];
+- double PrefetchBW[DC__NUM_DPP__MAX];
+- double PDEAndMetaPTEBytesPerFrame[DC__NUM_DPP__MAX];
+- double MetaRowBytes[DC__NUM_DPP__MAX];
+- double DPTEBytesPerRow[DC__NUM_DPP__MAX];
+- double PrefetchLinesY[DC__NUM_DPP__MAX];
+- double PrefetchLinesC[DC__NUM_DPP__MAX];
+- unsigned int MaxNumSwY[DC__NUM_DPP__MAX];
+- unsigned int MaxNumSwC[DC__NUM_DPP__MAX];
+- double PrefillY[DC__NUM_DPP__MAX];
+- double PrefillC[DC__NUM_DPP__MAX];
+- double LineTimesForPrefetch[DC__NUM_DPP__MAX];
+- double LinesForMetaPTE[DC__NUM_DPP__MAX];
+- double LinesForMetaAndDPTERow[DC__NUM_DPP__MAX];
+- double MinDPPCLKUsingSingleDPP[DC__NUM_DPP__MAX];
+- double RequiresFEC[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- unsigned int OutputBppPerState[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- double DSCDelayPerState[DC__VOLTAGE_STATES + 1][DC__NUM_DPP__MAX];
+- unsigned int Read256BlockHeightY[DC__NUM_DPP__MAX];
+- unsigned int Read256BlockWidthY[DC__NUM_DPP__MAX];
+- unsigned int Read256BlockHeightC[DC__NUM_DPP__MAX];
+- unsigned int Read256BlockWidthC[DC__NUM_DPP__MAX];
+- unsigned int ImmediateFlipBytes[DC__NUM_DPP__MAX];
+- double MaxSwathHeightY[DC__NUM_DPP__MAX];
+- double MaxSwathHeightC[DC__NUM_DPP__MAX];
+- double MinSwathHeightY[DC__NUM_DPP__MAX];
+- double MinSwathHeightC[DC__NUM_DPP__MAX];
+- double PSCL_FACTOR[DC__NUM_DPP__MAX];
+- double PSCL_FACTOR_CHROMA[DC__NUM_DPP__MAX];
+- double MaximumVStartup[DC__NUM_DPP__MAX];
+- double AlignedDCCMetaPitch[DC__NUM_DPP__MAX];
+- double AlignedYPitch[DC__NUM_DPP__MAX];
+- double AlignedCPitch[DC__NUM_DPP__MAX];
+- double MaximumSwathWidth[DC__NUM_DPP__MAX];
+- double final_flip_bw[DC__NUM_DPP__MAX];
+- double ImmediateFlipSupportedForState[DC__VOLTAGE_STATES + 1];
+-
+- double WritebackLumaVExtra;
+- double WritebackChromaVExtra;
+- double WritebackRequiredDISPCLK;
+- double MaximumSwathWidthSupport;
+- double MaximumSwathWidthInDETBuffer;
+- double MaximumSwathWidthInLineBuffer;
+- double MaxDispclkRoundedDownToDFSGranularity;
+- double MaxDppclkRoundedDownToDFSGranularity;
+- double PlaneRequiredDISPCLKWithoutODMCombine;
+- double PlaneRequiredDISPCLK;
+- double TotalNumberOfActiveOTG;
+- double FECOverhead;
+- double EffectiveFECOverhead;
+- unsigned int Outbpp;
+- unsigned int OutbppDSC;
+- double TotalDSCUnitsRequired;
+- double bpp;
+- unsigned int slices;
+- double SwathWidthGranularityY;
+- double RoundedUpMaxSwathSizeBytesY;
+- double SwathWidthGranularityC;
+- double RoundedUpMaxSwathSizeBytesC;
+- double LinesInDETLuma;
+- double LinesInDETChroma;
+- double EffectiveDETLBLinesLuma;
+- double EffectiveDETLBLinesChroma;
+- double ProjectedDCFCLKDeepSleep;
+- double PDEAndMetaPTEBytesPerFrameY;
+- double PDEAndMetaPTEBytesPerFrameC;
+- unsigned int MetaRowBytesY;
+- unsigned int MetaRowBytesC;
+- unsigned int DPTEBytesPerRowC;
+- unsigned int DPTEBytesPerRowY;
+- double ExtraLatency;
+- double TimeCalc;
+- double TWait;
+- double MaximumReadBandwidthWithPrefetch;
+- double total_dcn_read_bw_with_flip;
+-};
+-
+-#endif /* _DML2_DISPLAY_MODE_VBA_H_ */
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_rq_dlg_calc.c b/drivers/gpu/drm/amd/display/dc/dml/display_rq_dlg_calc.c
+deleted file mode 100644
+index 325dd2b..0000000
+--- a/drivers/gpu/drm/amd/display/dc/dml/display_rq_dlg_calc.c
++++ /dev/null
+@@ -1,1772 +0,0 @@
+-/*
+- * Copyright 2017 Advanced Micro Devices, Inc.
+- *
+- * 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 "display_mode_lib.h"
+-#include "display_mode_vba.h"
+-#include "display_rq_dlg_calc.h"
+-
+-/*
+- * NOTE:
+- * This file is gcc-parseable HW gospel, coming straight from HW engineers.
+- *
+- * It doesn't adhere to Linux kernel style and sometimes will do things in odd
+- * ways. Unless there is something clearly wrong with it the code should
+- * remain as-is as it provides us with a guarantee from HW that it is correct.
+- */
+-
+-static void calculate_ttu_cursor(struct display_mode_lib *mode_lib,
+- double *refcyc_per_req_delivery_pre_cur,
+- double *refcyc_per_req_delivery_cur,
+- double refclk_freq_in_mhz,
+- double ref_freq_to_pix_freq,
+- double hscale_pixel_rate_l,
+- double hscl_ratio,
+- double vratio_pre_l,
+- double vratio_l,
+- unsigned int cur_width,
+- enum cursor_bpp cur_bpp);
+-
+-#include "dml_inline_defs.h"
+-
+-static unsigned int get_bytes_per_element(enum source_format_class source_format, bool is_chroma)
+-{
+- unsigned int ret_val = 0;
+-
+- if (source_format == dm_444_16) {
+- if (!is_chroma)
+- ret_val = 2;
+- } else if (source_format == dm_444_32) {
+- if (!is_chroma)
+- ret_val = 4;
+- } else if (source_format == dm_444_64) {
+- if (!is_chroma)
+- ret_val = 8;
+- } else if (source_format == dm_420_8) {
+- if (is_chroma)
+- ret_val = 2;
+- else
+- ret_val = 1;
+- } else if (source_format == dm_420_10) {
+- if (is_chroma)
+- ret_val = 4;
+- else
+- ret_val = 2;
+- } else if (source_format == dm_444_8) {
+- ret_val = 1;
+- }
+- return ret_val;
+-}
+-
+-static bool is_dual_plane(enum source_format_class source_format)
+-{
+- bool ret_val = 0;
+-
+- if ((source_format == dm_420_8) || (source_format == dm_420_10))
+- ret_val = 1;
+-
+- return ret_val;
+-}
+-
+-static double get_refcyc_per_delivery(struct display_mode_lib *mode_lib,
+- double refclk_freq_in_mhz,
+- double pclk_freq_in_mhz,
+- bool odm_combine,
+- unsigned int recout_width,
+- unsigned int hactive,
+- double vratio,
+- double hscale_pixel_rate,
+- unsigned int delivery_width,
+- unsigned int req_per_swath_ub)
+-{
+- double refcyc_per_delivery = 0.0;
+-
+- if (vratio <= 1.0) {
+- if (odm_combine)
+- refcyc_per_delivery = (double) refclk_freq_in_mhz
+- * dml_min((double) recout_width, (double) hactive / 2.0)
+- / pclk_freq_in_mhz / (double) req_per_swath_ub;
+- else
+- refcyc_per_delivery = (double) refclk_freq_in_mhz * (double) recout_width
+- / pclk_freq_in_mhz / (double) req_per_swath_ub;
+- } else {
+- refcyc_per_delivery = (double) refclk_freq_in_mhz * (double) delivery_width
+- / (double) hscale_pixel_rate / (double) req_per_swath_ub;
+- }
+-
+- dml_print("DML_DLG: %s: refclk_freq_in_mhz = %3.2f\n", __func__, refclk_freq_in_mhz);
+- dml_print("DML_DLG: %s: pclk_freq_in_mhz = %3.2f\n", __func__, pclk_freq_in_mhz);
+- dml_print("DML_DLG: %s: recout_width = %d\n", __func__, recout_width);
+- dml_print("DML_DLG: %s: vratio = %3.2f\n", __func__, vratio);
+- dml_print("DML_DLG: %s: req_per_swath_ub = %d\n", __func__, req_per_swath_ub);
+- dml_print("DML_DLG: %s: refcyc_per_delivery= %3.2f\n", __func__, refcyc_per_delivery);
+-
+- return refcyc_per_delivery;
+-
+-}
+-
+-static unsigned int get_blk_size_bytes(const enum source_macro_tile_size tile_size)
+-{
+- if (tile_size == dm_256k_tile)
+- return (256 * 1024);
+- else if (tile_size == dm_64k_tile)
+- return (64 * 1024);
+- else
+- return (4 * 1024);
+-}
+-
+-static void extract_rq_sizing_regs(struct display_mode_lib *mode_lib,
+- display_data_rq_regs_st *rq_regs,
+- const display_data_rq_sizing_params_st rq_sizing)
+-{
+- dml_print("DML_DLG: %s: rq_sizing param\n", __func__);
+- print__data_rq_sizing_params_st(mode_lib, rq_sizing);
+-
+- rq_regs->chunk_size = dml_log2(rq_sizing.chunk_bytes) - 10;
+-
+- if (rq_sizing.min_chunk_bytes == 0)
+- rq_regs->min_chunk_size = 0;
+- else
+- rq_regs->min_chunk_size = dml_log2(rq_sizing.min_chunk_bytes) - 8 + 1;
+-
+- rq_regs->meta_chunk_size = dml_log2(rq_sizing.meta_chunk_bytes) - 10;
+- if (rq_sizing.min_meta_chunk_bytes == 0)
+- rq_regs->min_meta_chunk_size = 0;
+- else
+- rq_regs->min_meta_chunk_size = dml_log2(rq_sizing.min_meta_chunk_bytes) - 6 + 1;
+-
+- rq_regs->dpte_group_size = dml_log2(rq_sizing.dpte_group_bytes) - 6;
+- rq_regs->mpte_group_size = dml_log2(rq_sizing.mpte_group_bytes) - 6;
+-}
+-
+-static void extract_rq_regs(struct display_mode_lib *mode_lib,
+- display_rq_regs_st *rq_regs,
+- const display_rq_params_st rq_param)
+-{
+- unsigned int detile_buf_size_in_bytes = mode_lib->ip.det_buffer_size_kbytes * 1024;
+- unsigned int detile_buf_plane1_addr = 0;
+-
+- extract_rq_sizing_regs(mode_lib, &(rq_regs->rq_regs_l), rq_param.sizing.rq_l);
+-
+- rq_regs->rq_regs_l.pte_row_height_linear = dml_floor(dml_log2(rq_param.dlg.rq_l.dpte_row_height),
+- 1) - 3;
+-
+- if (rq_param.yuv420) {
+- extract_rq_sizing_regs(mode_lib, &(rq_regs->rq_regs_c), rq_param.sizing.rq_c);
+- rq_regs->rq_regs_c.pte_row_height_linear = dml_floor(dml_log2(rq_param.dlg.rq_c.dpte_row_height),
+- 1) - 3;
+- }
+-
+- rq_regs->rq_regs_l.swath_height = dml_log2(rq_param.dlg.rq_l.swath_height);
+- rq_regs->rq_regs_c.swath_height = dml_log2(rq_param.dlg.rq_c.swath_height);
+-
+- // FIXME: take the max between luma, chroma chunk size?
+- // okay for now, as we are setting chunk_bytes to 8kb anyways
+- if (rq_param.sizing.rq_l.chunk_bytes >= 32 * 1024) { //32kb
+- rq_regs->drq_expansion_mode = 0;
+- } else {
+- rq_regs->drq_expansion_mode = 2;
+- }
+- rq_regs->prq_expansion_mode = 1;
+- rq_regs->mrq_expansion_mode = 1;
+- rq_regs->crq_expansion_mode = 1;
+-
+- if (rq_param.yuv420) {
+- if ((double) rq_param.misc.rq_l.stored_swath_bytes
+- / (double) rq_param.misc.rq_c.stored_swath_bytes <= 1.5) {
+- detile_buf_plane1_addr = (detile_buf_size_in_bytes / 2.0 / 64.0); // half to chroma
+- } else {
+- detile_buf_plane1_addr = dml_round_to_multiple((unsigned int) ((2.0 * detile_buf_size_in_bytes) / 3.0),
+- 256,
+- 0) / 64.0; // 2/3 to chroma
+- }
+- }
+- rq_regs->plane1_base_address = detile_buf_plane1_addr;
+-}
+-
+-static void handle_det_buf_split(struct display_mode_lib *mode_lib,
+- display_rq_params_st *rq_param,
+- const display_pipe_source_params_st pipe_src_param)
+-{
+- unsigned int total_swath_bytes = 0;
+- unsigned int swath_bytes_l = 0;
+- unsigned int swath_bytes_c = 0;
+- unsigned int full_swath_bytes_packed_l = 0;
+- unsigned int full_swath_bytes_packed_c = 0;
+- bool req128_l = 0;
+- bool req128_c = 0;
+- bool surf_linear = (pipe_src_param.sw_mode == dm_sw_linear);
+- bool surf_vert = (pipe_src_param.source_scan == dm_vert);
+- unsigned int log2_swath_height_l = 0;
+- unsigned int log2_swath_height_c = 0;
+- unsigned int detile_buf_size_in_bytes = mode_lib->ip.det_buffer_size_kbytes * 1024;
+-
+- full_swath_bytes_packed_l = rq_param->misc.rq_l.full_swath_bytes;
+- full_swath_bytes_packed_c = rq_param->misc.rq_c.full_swath_bytes;
+-
+- if (rq_param->yuv420_10bpc) {
+- full_swath_bytes_packed_l = dml_round_to_multiple(rq_param->misc.rq_l.full_swath_bytes * 2 / 3,
+- 256,
+- 1) + 256;
+- full_swath_bytes_packed_c = dml_round_to_multiple(rq_param->misc.rq_c.full_swath_bytes * 2 / 3,
+- 256,
+- 1) + 256;
+- }
+-
+- if (rq_param->yuv420) {
+- total_swath_bytes = 2 * full_swath_bytes_packed_l + 2 * full_swath_bytes_packed_c;
+-
+- if (total_swath_bytes <= detile_buf_size_in_bytes) { //full 256b request
+- req128_l = 0;
+- req128_c = 0;
+- swath_bytes_l = full_swath_bytes_packed_l;
+- swath_bytes_c = full_swath_bytes_packed_c;
+- } else { //128b request (for luma only for yuv420 8bpc)
+- req128_l = 1;
+- req128_c = 0;
+- swath_bytes_l = full_swath_bytes_packed_l / 2;
+- swath_bytes_c = full_swath_bytes_packed_c;
+- }
+- // Note: assumption, the config that pass in will fit into
+- // the detiled buffer.
+- } else {
+- total_swath_bytes = 2 * full_swath_bytes_packed_l;
+-
+- if (total_swath_bytes <= detile_buf_size_in_bytes)
+- req128_l = 0;
+- else
+- req128_l = 1;
+-
+- swath_bytes_l = total_swath_bytes;
+- swath_bytes_c = 0;
+- }
+- rq_param->misc.rq_l.stored_swath_bytes = swath_bytes_l;
+- rq_param->misc.rq_c.stored_swath_bytes = swath_bytes_c;
+-
+- if (surf_linear) {
+- log2_swath_height_l = 0;
+- log2_swath_height_c = 0;
+- } else if (!surf_vert) {
+- log2_swath_height_l = dml_log2(rq_param->misc.rq_l.blk256_height) - req128_l;
+- log2_swath_height_c = dml_log2(rq_param->misc.rq_c.blk256_height) - req128_c;
+- } else {
+- log2_swath_height_l = dml_log2(rq_param->misc.rq_l.blk256_width) - req128_l;
+- log2_swath_height_c = dml_log2(rq_param->misc.rq_c.blk256_width) - req128_c;
+- }
+- rq_param->dlg.rq_l.swath_height = 1 << log2_swath_height_l;
+- rq_param->dlg.rq_c.swath_height = 1 << log2_swath_height_c;
+-
+- dml_print("DML_DLG: %s: req128_l = %0d\n", __func__, req128_l);
+- dml_print("DML_DLG: %s: req128_c = %0d\n", __func__, req128_c);
+- dml_print("DML_DLG: %s: full_swath_bytes_packed_l = %0d\n",
+- __func__,
+- full_swath_bytes_packed_l);
+- dml_print("DML_DLG: %s: full_swath_bytes_packed_c = %0d\n",
+- __func__,
+- full_swath_bytes_packed_c);
+-}
+-
+-static void get_meta_and_pte_attr(struct display_mode_lib *mode_lib,
+- display_data_rq_dlg_params_st *rq_dlg_param,
+- display_data_rq_misc_params_st *rq_misc_param,
+- display_data_rq_sizing_params_st *rq_sizing_param,
+- unsigned int vp_width,
+- unsigned int vp_height,
+- unsigned int data_pitch,
+- unsigned int meta_pitch,
+- unsigned int source_format,
+- unsigned int tiling,
+- unsigned int macro_tile_size,
+- unsigned int source_scan,
+- unsigned int is_chroma)
+-{
+- bool surf_linear = (tiling == dm_sw_linear);
+- bool surf_vert = (source_scan == dm_vert);
+-
+- unsigned int bytes_per_element;
+- unsigned int bytes_per_element_y = get_bytes_per_element((enum source_format_class)(source_format),
+- false);
+- unsigned int bytes_per_element_c = get_bytes_per_element((enum source_format_class)(source_format),
+- true);
+-
+- unsigned int blk256_width = 0;
+- unsigned int blk256_height = 0;
+-
+- unsigned int blk256_width_y = 0;
+- unsigned int blk256_height_y = 0;
+- unsigned int blk256_width_c = 0;
+- unsigned int blk256_height_c = 0;
+- unsigned int log2_bytes_per_element;
+- unsigned int log2_blk256_width;
+- unsigned int log2_blk256_height;
+- unsigned int blk_bytes;
+- unsigned int log2_blk_bytes;
+- unsigned int log2_blk_height;
+- unsigned int log2_blk_width;
+- unsigned int log2_meta_req_bytes;
+- unsigned int log2_meta_req_height;
+- unsigned int log2_meta_req_width;
+- unsigned int meta_req_width;
+- unsigned int meta_req_height;
+- unsigned int log2_meta_row_height;
+- unsigned int meta_row_width_ub;
+- unsigned int log2_meta_chunk_bytes;
+- unsigned int log2_meta_chunk_height;
+-
+- //full sized meta chunk width in unit of data elements
+- unsigned int log2_meta_chunk_width;
+- unsigned int log2_min_meta_chunk_bytes;
+- unsigned int min_meta_chunk_width;
+- unsigned int meta_chunk_width;
+- unsigned int meta_chunk_per_row_int;
+- unsigned int meta_row_remainder;
+- unsigned int meta_chunk_threshold;
+- unsigned int meta_blk_bytes;
+- unsigned int meta_blk_height;
+- unsigned int meta_blk_width;
+- unsigned int meta_surface_bytes;
+- unsigned int vmpg_bytes;
+- unsigned int meta_pte_req_per_frame_ub;
+- unsigned int meta_pte_bytes_per_frame_ub;
+- const unsigned int log2_vmpg_bytes = dml_log2(mode_lib->soc.vmm_page_size_bytes);
+- const unsigned int dpte_buf_in_pte_reqs = mode_lib->ip.dpte_buffer_size_in_pte_reqs;
+- const unsigned int pde_proc_buffer_size_64k_reqs =
+- mode_lib->ip.pde_proc_buffer_size_64k_reqs;
+-
+- unsigned int log2_vmpg_height = 0;
+- unsigned int log2_vmpg_width = 0;
+- unsigned int log2_dpte_req_height_ptes = 0;
+- unsigned int log2_dpte_req_height = 0;
+- unsigned int log2_dpte_req_width = 0;
+- unsigned int log2_dpte_row_height_linear = 0;
+- unsigned int log2_dpte_row_height = 0;
+- unsigned int log2_dpte_group_width = 0;
+- unsigned int dpte_row_width_ub = 0;
+- unsigned int dpte_req_height = 0;
+- unsigned int dpte_req_width = 0;
+- unsigned int dpte_group_width = 0;
+- unsigned int log2_dpte_group_bytes = 0;
+- unsigned int log2_dpte_group_length = 0;
+- unsigned int pde_buf_entries;
+- bool yuv420 = (source_format == dm_420_8 || source_format == dm_420_10);
+-
+- Calculate256BBlockSizes((enum source_format_class)(source_format),
+- (enum dm_swizzle_mode)(tiling),
+- bytes_per_element_y,
+- bytes_per_element_c,
+- &blk256_height_y,
+- &blk256_height_c,
+- &blk256_width_y,
+- &blk256_width_c);
+-
+- if (!is_chroma) {
+- blk256_width = blk256_width_y;
+- blk256_height = blk256_height_y;
+- bytes_per_element = bytes_per_element_y;
+- } else {
+- blk256_width = blk256_width_c;
+- blk256_height = blk256_height_c;
+- bytes_per_element = bytes_per_element_c;
+- }
+-
+- log2_bytes_per_element = dml_log2(bytes_per_element);
+-
+- dml_print("DML_DLG: %s: surf_linear = %d\n", __func__, surf_linear);
+- dml_print("DML_DLG: %s: surf_vert = %d\n", __func__, surf_vert);
+- dml_print("DML_DLG: %s: blk256_width = %d\n", __func__, blk256_width);
+- dml_print("DML_DLG: %s: blk256_height = %d\n", __func__, blk256_height);
+-
+- log2_blk256_width = dml_log2((double) blk256_width);
+- log2_blk256_height = dml_log2((double) blk256_height);
+- blk_bytes = surf_linear ?
+- 256 : get_blk_size_bytes((enum source_macro_tile_size) macro_tile_size);
+- log2_blk_bytes = dml_log2((double) blk_bytes);
+- log2_blk_height = 0;
+- log2_blk_width = 0;
+-
+- // remember log rule
+- // "+" in log is multiply
+- // "-" in log is divide
+- // "/2" is like square root
+- // blk is vertical biased
+- if (tiling != dm_sw_linear)
+- log2_blk_height = log2_blk256_height
+- + dml_ceil((double) (log2_blk_bytes - 8) / 2.0, 1);
+- else
+- log2_blk_height = 0; // blk height of 1
+-
+- log2_blk_width = log2_blk_bytes - log2_bytes_per_element - log2_blk_height;
+-
+- if (!surf_vert) {
+- rq_dlg_param->swath_width_ub = dml_round_to_multiple(vp_width - 1, blk256_width, 1)
+- + blk256_width;
+- rq_dlg_param->req_per_swath_ub = rq_dlg_param->swath_width_ub >> log2_blk256_width;
+- } else {
+- rq_dlg_param->swath_width_ub = dml_round_to_multiple(vp_height - 1, blk256_height, 1)
+- + blk256_height;
+- rq_dlg_param->req_per_swath_ub = rq_dlg_param->swath_width_ub >> log2_blk256_height;
+- }
+-
+- if (!surf_vert)
+- rq_misc_param->full_swath_bytes = rq_dlg_param->swath_width_ub * blk256_height
+- * bytes_per_element;
+- else
+- rq_misc_param->full_swath_bytes = rq_dlg_param->swath_width_ub * blk256_width
+- * bytes_per_element;
+-
+- rq_misc_param->blk256_height = blk256_height;
+- rq_misc_param->blk256_width = blk256_width;
+-
+- // -------
+- // meta
+- // -------
+- log2_meta_req_bytes = 6; // meta request is 64b and is 8x8byte meta element
+-
+- // each 64b meta request for dcn is 8x8 meta elements and
+- // a meta element covers one 256b block of the the data surface.
+- log2_meta_req_height = log2_blk256_height + 3; // meta req is 8x8 byte, each byte represent 1 blk256
+- log2_meta_req_width = log2_meta_req_bytes + 8 - log2_bytes_per_element
+- - log2_meta_req_height;
+- meta_req_width = 1 << log2_meta_req_width;
+- meta_req_height = 1 << log2_meta_req_height;
+- log2_meta_row_height = 0;
+- meta_row_width_ub = 0;
+-
+- // the dimensions of a meta row are meta_row_width x meta_row_height in elements.
+- // calculate upper bound of the meta_row_width
+- if (!surf_vert) {
+- log2_meta_row_height = log2_meta_req_height;
+- meta_row_width_ub = dml_round_to_multiple(vp_width - 1, meta_req_width, 1)
+- + meta_req_width;
+- rq_dlg_param->meta_req_per_row_ub = meta_row_width_ub / meta_req_width;
+- } else {
+- log2_meta_row_height = log2_meta_req_width;
+- meta_row_width_ub = dml_round_to_multiple(vp_height - 1, meta_req_height, 1)
+- + meta_req_height;
+- rq_dlg_param->meta_req_per_row_ub = meta_row_width_ub / meta_req_height;
+- }
+- rq_dlg_param->meta_bytes_per_row_ub = rq_dlg_param->meta_req_per_row_ub * 64;
+-
+- rq_dlg_param->meta_row_height = 1 << log2_meta_row_height;
+-
+- log2_meta_chunk_bytes = dml_log2(rq_sizing_param->meta_chunk_bytes);
+- log2_meta_chunk_height = log2_meta_row_height;
+-
+- //full sized meta chunk width in unit of data elements
+- log2_meta_chunk_width = log2_meta_chunk_bytes + 8 - log2_bytes_per_element
+- - log2_meta_chunk_height;
+- log2_min_meta_chunk_bytes = dml_log2(rq_sizing_param->min_meta_chunk_bytes);
+- min_meta_chunk_width = 1
+- << (log2_min_meta_chunk_bytes + 8 - log2_bytes_per_element
+- - log2_meta_chunk_height);
+- meta_chunk_width = 1 << log2_meta_chunk_width;
+- meta_chunk_per_row_int = (unsigned int) (meta_row_width_ub / meta_chunk_width);
+- meta_row_remainder = meta_row_width_ub % meta_chunk_width;
+- meta_chunk_threshold = 0;
+- meta_blk_bytes = 4096;
+- meta_blk_height = blk256_height * 64;
+- meta_blk_width = meta_blk_bytes * 256 / bytes_per_element / meta_blk_height;
+- meta_surface_bytes = meta_pitch
+- * (dml_round_to_multiple(vp_height - 1, meta_blk_height, 1) + meta_blk_height)
+- * bytes_per_element / 256;
+- vmpg_bytes = mode_lib->soc.vmm_page_size_bytes;
+- meta_pte_req_per_frame_ub = (dml_round_to_multiple(meta_surface_bytes - vmpg_bytes,
+- 8 * vmpg_bytes,
+- 1) + 8 * vmpg_bytes) / (8 * vmpg_bytes);
+- meta_pte_bytes_per_frame_ub = meta_pte_req_per_frame_ub * 64; //64B mpte request
+- rq_dlg_param->meta_pte_bytes_per_frame_ub = meta_pte_bytes_per_frame_ub;
+-
+- dml_print("DML_DLG: %s: meta_blk_height = %d\n", __func__, meta_blk_height);
+- dml_print("DML_DLG: %s: meta_blk_width = %d\n", __func__, meta_blk_width);
+- dml_print("DML_DLG: %s: meta_surface_bytes = %d\n", __func__, meta_surface_bytes);
+- dml_print("DML_DLG: %s: meta_pte_req_per_frame_ub = %d\n",
+- __func__,
+- meta_pte_req_per_frame_ub);
+- dml_print("DML_DLG: %s: meta_pte_bytes_per_frame_ub = %d\n",
+- __func__,
+- meta_pte_bytes_per_frame_ub);
+-
+- if (!surf_vert)
+- meta_chunk_threshold = 2 * min_meta_chunk_width - meta_req_width;
+- else
+- meta_chunk_threshold = 2 * min_meta_chunk_width - meta_req_height;
+-
+- if (meta_row_remainder <= meta_chunk_threshold)
+- rq_dlg_param->meta_chunks_per_row_ub = meta_chunk_per_row_int + 1;
+- else
+- rq_dlg_param->meta_chunks_per_row_ub = meta_chunk_per_row_int + 2;
+-
+- // ------
+- // dpte
+- // ------
+- if (surf_linear) {
+- log2_vmpg_height = 0; // one line high
+- } else {
+- log2_vmpg_height = (log2_vmpg_bytes - 8) / 2 + log2_blk256_height;
+- }
+- log2_vmpg_width = log2_vmpg_bytes - log2_bytes_per_element - log2_vmpg_height;
+-
+- // only 3 possible shapes for dpte request in dimensions of ptes: 8x1, 4x2, 2x4.
+- if (surf_linear) { //one 64B PTE request returns 8 PTEs
+- log2_dpte_req_height_ptes = 0;
+- log2_dpte_req_width = log2_vmpg_width + 3;
+- log2_dpte_req_height = 0;
+- } else if (log2_blk_bytes == 12) { //4KB tile means 4kB page size
+- //one 64B req gives 8x1 PTEs for 4KB tile
+- log2_dpte_req_height_ptes = 0;
+- log2_dpte_req_width = log2_blk_width + 3;
+- log2_dpte_req_height = log2_blk_height + 0;
+- } else if ((log2_blk_bytes >= 16) && (log2_vmpg_bytes == 12)) { // tile block >= 64KB
+- //two 64B reqs of 2x4 PTEs give 16 PTEs to cover 64KB
+- log2_dpte_req_height_ptes = 4;
+- log2_dpte_req_width = log2_blk256_width + 4; // log2_64KB_width
+- log2_dpte_req_height = log2_blk256_height + 4; // log2_64KB_height
+- } else { //64KB page size and must 64KB tile block
+- //one 64B req gives 8x1 PTEs for 64KB tile
+- log2_dpte_req_height_ptes = 0;
+- log2_dpte_req_width = log2_blk_width + 3;
+- log2_dpte_req_height = log2_blk_height + 0;
+- }
+-
+- // The dpte request dimensions in data elements is dpte_req_width x dpte_req_height
+- // log2_vmpg_width is how much 1 pte represent, now calculating how much a 64b pte req represent
+- // That depends on the pte shape (i.e. 8x1, 4x2, 2x4)
+- //log2_dpte_req_height = log2_vmpg_height + log2_dpte_req_height_ptes;
+- //log2_dpte_req_width = log2_vmpg_width + log2_dpte_req_width_ptes;
+- dpte_req_height = 1 << log2_dpte_req_height;
+- dpte_req_width = 1 << log2_dpte_req_width;
+-
+- // calculate pitch dpte row buffer can hold
+- // round the result down to a power of two.
+- pde_buf_entries = yuv420 ? (pde_proc_buffer_size_64k_reqs >> 1) : pde_proc_buffer_size_64k_reqs;
+- if (surf_linear) {
+- unsigned int dpte_row_height;
+-
+- log2_dpte_row_height_linear = dml_floor(dml_log2(dml_min(64 * 1024 * pde_buf_entries
+- / bytes_per_element,
+- dpte_buf_in_pte_reqs
+- * dpte_req_width)
+- / data_pitch),
+- 1);
+-
+- ASSERT(log2_dpte_row_height_linear >= 3);
+-
+- if (log2_dpte_row_height_linear > 7)
+- log2_dpte_row_height_linear = 7;
+-
+- log2_dpte_row_height = log2_dpte_row_height_linear;
+- // For linear, the dpte row is pitch dependent and the pte requests wrap at the pitch boundary.
+- // the dpte_row_width_ub is the upper bound of data_pitch*dpte_row_height in elements with this unique buffering.
+- dpte_row_height = 1 << log2_dpte_row_height;
+- dpte_row_width_ub = dml_round_to_multiple(data_pitch * dpte_row_height - 1,
+- dpte_req_width,
+- 1) + dpte_req_width;
+- rq_dlg_param->dpte_req_per_row_ub = dpte_row_width_ub / dpte_req_width;
+- } else {
+- // the upper bound of the dpte_row_width without dependency on viewport position follows.
+- // for tiled mode, row height is the same as req height and row store up to vp size upper bound
+- if (!surf_vert) {
+- log2_dpte_row_height = log2_dpte_req_height;
+- dpte_row_width_ub = dml_round_to_multiple(vp_width - 1, dpte_req_width, 1)
+- + dpte_req_width;
+- rq_dlg_param->dpte_req_per_row_ub = dpte_row_width_ub / dpte_req_width;
+- } else {
+- log2_dpte_row_height =
+- (log2_blk_width < log2_dpte_req_width) ?
+- log2_blk_width : log2_dpte_req_width;
+- dpte_row_width_ub = dml_round_to_multiple(vp_height - 1, dpte_req_height, 1)
+- + dpte_req_height;
+- rq_dlg_param->dpte_req_per_row_ub = dpte_row_width_ub / dpte_req_height;
+- }
+- }
+- if (log2_blk_bytes >= 16 && log2_vmpg_bytes == 12) // tile block >= 64KB
+- rq_dlg_param->dpte_bytes_per_row_ub = rq_dlg_param->dpte_req_per_row_ub * 128; //2*64B dpte request
+- else
+- rq_dlg_param->dpte_bytes_per_row_ub = rq_dlg_param->dpte_req_per_row_ub * 64; //64B dpte request
+-
+- rq_dlg_param->dpte_row_height = 1 << log2_dpte_row_height;
+-
+- // the dpte_group_bytes is reduced for the specific case of vertical
+- // access of a tile surface that has dpte request of 8x1 ptes.
+- if (!surf_linear & (log2_dpte_req_height_ptes == 0) & surf_vert) //reduced, in this case, will have page fault within a group
+- rq_sizing_param->dpte_group_bytes = 512;
+- else
+- //full size
+- rq_sizing_param->dpte_group_bytes = 2048;
+-
+- //since pte request size is 64byte, the number of data pte requests per full sized group is as follows.
+- log2_dpte_group_bytes = dml_log2(rq_sizing_param->dpte_group_bytes);
+- log2_dpte_group_length = log2_dpte_group_bytes - 6; //length in 64b requests
+-
+- // full sized data pte group width in elements
+- if (!surf_vert)
+- log2_dpte_group_width = log2_dpte_group_length + log2_dpte_req_width;
+- else
+- log2_dpte_group_width = log2_dpte_group_length + log2_dpte_req_height;
+-
+- //But if the tile block >=64KB and the page size is 4KB, then each dPTE request is 2*64B
+- if ((log2_blk_bytes >= 16) && (log2_vmpg_bytes == 12)) // tile block >= 64KB
+- log2_dpte_group_width = log2_dpte_group_width - 1;
+-
+- dpte_group_width = 1 << log2_dpte_group_width;
+-
+- // since dpte groups are only aligned to dpte_req_width and not dpte_group_width,
+- // the upper bound for the dpte groups per row is as follows.
+- rq_dlg_param->dpte_groups_per_row_ub = dml_ceil((double) dpte_row_width_ub / dpte_group_width,
+- 1);
+-}
+-
+-static void get_surf_rq_param(struct display_mode_lib *mode_lib,
+- display_data_rq_sizing_params_st *rq_sizing_param,
+- display_data_rq_dlg_params_st *rq_dlg_param,
+- display_data_rq_misc_params_st *rq_misc_param,
+- const display_pipe_source_params_st pipe_src_param,
+- bool is_chroma)
+-{
+- bool mode_422 = 0;
+- unsigned int vp_width = 0;
+- unsigned int vp_height = 0;
+- unsigned int data_pitch = 0;
+- unsigned int meta_pitch = 0;
+- unsigned int ppe = mode_422 ? 2 : 1;
+-
+- // FIXME check if ppe apply for both luma and chroma in 422 case
+- if (is_chroma) {
+- vp_width = pipe_src_param.viewport_width_c / ppe;
+- vp_height = pipe_src_param.viewport_height_c;
+- data_pitch = pipe_src_param.data_pitch_c;
+- meta_pitch = pipe_src_param.meta_pitch_c;
+- } else {
+- vp_width = pipe_src_param.viewport_width / ppe;
+- vp_height = pipe_src_param.viewport_height;
+- data_pitch = pipe_src_param.data_pitch;
+- meta_pitch = pipe_src_param.meta_pitch;
+- }
+-
+- rq_sizing_param->chunk_bytes = 8192;
+-
+- if (rq_sizing_param->chunk_bytes == 64 * 1024)
+- rq_sizing_param->min_chunk_bytes = 0;
+- else
+- rq_sizing_param->min_chunk_bytes = 1024;
+-
+- rq_sizing_param->meta_chunk_bytes = 2048;
+- rq_sizing_param->min_meta_chunk_bytes = 256;
+-
+- rq_sizing_param->mpte_group_bytes = 2048;
+-
+- get_meta_and_pte_attr(mode_lib,
+- rq_dlg_param,
+- rq_misc_param,
+- rq_sizing_param,
+- vp_width,
+- vp_height,
+- data_pitch,
+- meta_pitch,
+- pipe_src_param.source_format,
+- pipe_src_param.sw_mode,
+- pipe_src_param.macro_tile_size,
+- pipe_src_param.source_scan,
+- is_chroma);
+-}
+-
+-void dml_rq_dlg_get_rq_params(struct display_mode_lib *mode_lib,
+- display_rq_params_st *rq_param,
+- const display_pipe_source_params_st pipe_src_param)
+-{
+- // get param for luma surface
+- rq_param->yuv420 = pipe_src_param.source_format == dm_420_8
+- || pipe_src_param.source_format == dm_420_10;
+- rq_param->yuv420_10bpc = pipe_src_param.source_format == dm_420_10;
+-
+- get_surf_rq_param(mode_lib,
+- &(rq_param->sizing.rq_l),
+- &(rq_param->dlg.rq_l),
+- &(rq_param->misc.rq_l),
+- pipe_src_param,
+- 0);
+-
+- if (is_dual_plane((enum source_format_class)(pipe_src_param.source_format))) {
+- // get param for chroma surface
+- get_surf_rq_param(mode_lib,
+- &(rq_param->sizing.rq_c),
+- &(rq_param->dlg.rq_c),
+- &(rq_param->misc.rq_c),
+- pipe_src_param,
+- 1);
+- }
+-
+- // calculate how to split the det buffer space between luma and chroma
+- handle_det_buf_split(mode_lib, rq_param, pipe_src_param);
+- print__rq_params_st(mode_lib, *rq_param);
+-}
+-
+-void dml_rq_dlg_get_rq_reg(struct display_mode_lib *mode_lib,
+- display_rq_regs_st *rq_regs,
+- const display_pipe_source_params_st pipe_src_param)
+-{
+- display_rq_params_st rq_param = {0};
+-
+- memset(rq_regs, 0, sizeof(*rq_regs));
+- dml_rq_dlg_get_rq_params(mode_lib, &rq_param, pipe_src_param);
+- extract_rq_regs(mode_lib, rq_regs, rq_param);
+-
+- print__rq_regs_st(mode_lib, *rq_regs);
+-}
+-
+-// Note: currently taken in as is.
+-// Nice to decouple code from hw register implement and extract code that are repeated for luma and chroma.
+-void dml_rq_dlg_get_dlg_params(struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *e2e_pipe_param,
+- const unsigned int num_pipes,
+- const unsigned int pipe_idx,
+- display_dlg_regs_st *disp_dlg_regs,
+- display_ttu_regs_st *disp_ttu_regs,
+- const display_rq_dlg_params_st rq_dlg_param,
+- const display_dlg_sys_params_st dlg_sys_param,
+- const bool cstate_en,
+- const bool pstate_en,
+- const bool vm_en,
+- const bool ignore_viewport_pos,
+- const bool immediate_flip_support)
+-{
+- const display_pipe_source_params_st *src = &e2e_pipe_param[pipe_idx].pipe.src;
+- const display_pipe_dest_params_st *dst = &e2e_pipe_param[pipe_idx].pipe.dest;
+- const display_output_params_st *dout = &e2e_pipe_param[pipe_idx].dout;
+- const display_clocks_and_cfg_st *clks = &e2e_pipe_param[pipe_idx].clks_cfg;
+- const scaler_ratio_depth_st *scl = &e2e_pipe_param[pipe_idx].pipe.scale_ratio_depth;
+- const scaler_taps_st *taps = &e2e_pipe_param[pipe_idx].pipe.scale_taps;
+-
+- // -------------------------
+- // Section 1.15.2.1: OTG dependent Params
+- // -------------------------
+- // Timing
+- unsigned int htotal = dst->htotal;
+-// unsigned int hblank_start = dst.hblank_start; // TODO: Remove
+- unsigned int hblank_end = dst->hblank_end;
+- unsigned int vblank_start = dst->vblank_start;
+- unsigned int vblank_end = dst->vblank_end;
+- unsigned int min_vblank = mode_lib->ip.min_vblank_lines;
+-
+- double dppclk_freq_in_mhz = clks->dppclk_mhz;
+- double dispclk_freq_in_mhz = clks->dispclk_mhz;
+- double refclk_freq_in_mhz = clks->refclk_mhz;
+- double pclk_freq_in_mhz = dst->pixel_rate_mhz;
+- bool interlaced = dst->interlaced;
+-
+- double ref_freq_to_pix_freq = refclk_freq_in_mhz / pclk_freq_in_mhz;
+-
+- double min_dcfclk_mhz;
+- double t_calc_us;
+- double min_ttu_vblank;
+-
+- double min_dst_y_ttu_vblank;
+- unsigned int dlg_vblank_start;
+- bool dual_plane;
+- bool mode_422;
+- unsigned int access_dir;
+- unsigned int vp_height_l;
+- unsigned int vp_width_l;
+- unsigned int vp_height_c;
+- unsigned int vp_width_c;
+-
+- // Scaling
+- unsigned int htaps_l;
+- unsigned int htaps_c;
+- double hratio_l;
+- double hratio_c;
+- double vratio_l;
+- double vratio_c;
+- bool scl_enable;
+-
+- double line_time_in_us;
+- // double vinit_l;
+- // double vinit_c;
+- // double vinit_bot_l;
+- // double vinit_bot_c;
+-
+- // unsigned int swath_height_l;
+- unsigned int swath_width_ub_l;
+- // unsigned int dpte_bytes_per_row_ub_l;
+- unsigned int dpte_groups_per_row_ub_l;
+- // unsigned int meta_pte_bytes_per_frame_ub_l;
+- // unsigned int meta_bytes_per_row_ub_l;
+-
+- // unsigned int swath_height_c;
+- unsigned int swath_width_ub_c;
+- // unsigned int dpte_bytes_per_row_ub_c;
+- unsigned int dpte_groups_per_row_ub_c;
+-
+- unsigned int meta_chunks_per_row_ub_l;
+- unsigned int meta_chunks_per_row_ub_c;
+- unsigned int vupdate_offset;
+- unsigned int vupdate_width;
+- unsigned int vready_offset;
+-
+- unsigned int dppclk_delay_subtotal;
+- unsigned int dispclk_delay_subtotal;
+- unsigned int pixel_rate_delay_subtotal;
+-
+- unsigned int vstartup_start;
+- unsigned int dst_x_after_scaler;
+- unsigned int dst_y_after_scaler;
+- double line_wait;
+- double dst_y_prefetch;
+- double dst_y_per_vm_vblank;
+- double dst_y_per_row_vblank;
+- double dst_y_per_vm_flip;
+- double dst_y_per_row_flip;
+- double min_dst_y_per_vm_vblank;
+- double min_dst_y_per_row_vblank;
+- double lsw;
+- double vratio_pre_l;
+- double vratio_pre_c;
+- unsigned int req_per_swath_ub_l;
+- unsigned int req_per_swath_ub_c;
+- unsigned int meta_row_height_l;
+- unsigned int meta_row_height_c;
+- unsigned int swath_width_pixels_ub_l;
+- unsigned int swath_width_pixels_ub_c;
+- unsigned int scaler_rec_in_width_l;
+- unsigned int scaler_rec_in_width_c;
+- unsigned int dpte_row_height_l;
+- unsigned int dpte_row_height_c;
+- double hscale_pixel_rate_l;
+- double hscale_pixel_rate_c;
+- double min_hratio_fact_l;
+- double min_hratio_fact_c;
+- double refcyc_per_line_delivery_pre_l;
+- double refcyc_per_line_delivery_pre_c;
+- double refcyc_per_line_delivery_l;
+- double refcyc_per_line_delivery_c;
+-
+- double refcyc_per_req_delivery_pre_l;
+- double refcyc_per_req_delivery_pre_c;
+- double refcyc_per_req_delivery_l;
+- double refcyc_per_req_delivery_c;
+-
+- unsigned int full_recout_width;
+- double xfc_transfer_delay;
+- double xfc_precharge_delay;
+- double xfc_remote_surface_flip_latency;
+- double xfc_dst_y_delta_drq_limit;
+- double xfc_prefetch_margin;
+- double refcyc_per_req_delivery_pre_cur0;
+- double refcyc_per_req_delivery_cur0;
+- double refcyc_per_req_delivery_pre_cur1;
+- double refcyc_per_req_delivery_cur1;
+-
+- memset(disp_dlg_regs, 0, sizeof(*disp_dlg_regs));
+- memset(disp_ttu_regs, 0, sizeof(*disp_ttu_regs));
+-
+- dml_print("DML_DLG: %s: cstate_en = %d\n", __func__, cstate_en);
+- dml_print("DML_DLG: %s: pstate_en = %d\n", __func__, pstate_en);
+- dml_print("DML_DLG: %s: vm_en = %d\n", __func__, vm_en);
+- dml_print("DML_DLG: %s: ignore_viewport_pos = %d\n", __func__, ignore_viewport_pos);
+- dml_print("DML_DLG: %s: immediate_flip_support = %d\n", __func__, immediate_flip_support);
+-
+- dml_print("DML_DLG: %s: dppclk_freq_in_mhz = %3.2f\n", __func__, dppclk_freq_in_mhz);
+- dml_print("DML_DLG: %s: dispclk_freq_in_mhz = %3.2f\n", __func__, dispclk_freq_in_mhz);
+- dml_print("DML_DLG: %s: refclk_freq_in_mhz = %3.2f\n", __func__, refclk_freq_in_mhz);
+- dml_print("DML_DLG: %s: pclk_freq_in_mhz = %3.2f\n", __func__, pclk_freq_in_mhz);
+- dml_print("DML_DLG: %s: interlaced = %d\n", __func__, interlaced);
+- ASSERT(ref_freq_to_pix_freq < 4.0);
+-
+- disp_dlg_regs->ref_freq_to_pix_freq =
+- (unsigned int) (ref_freq_to_pix_freq * dml_pow(2, 19));
+- disp_dlg_regs->refcyc_per_htotal = (unsigned int) (ref_freq_to_pix_freq * (double) htotal
+- * dml_pow(2, 8));
+- disp_dlg_regs->dlg_vblank_end = interlaced ? (vblank_end / 2) : vblank_end; // 15 bits
+- disp_dlg_regs->refcyc_h_blank_end = (unsigned int) ((double) hblank_end
+- * (double) ref_freq_to_pix_freq);
+- ASSERT(disp_dlg_regs->refcyc_h_blank_end < (unsigned int) dml_pow(2, 13));
+-
+- min_dcfclk_mhz = dlg_sys_param.deepsleep_dcfclk_mhz;
+- set_prefetch_mode(mode_lib, cstate_en, pstate_en, ignore_viewport_pos, immediate_flip_support);
+- t_calc_us = get_tcalc(mode_lib, e2e_pipe_param, num_pipes);
+- min_ttu_vblank = get_min_ttu_vblank(mode_lib, e2e_pipe_param, num_pipes, pipe_idx);
+-
+- min_dst_y_ttu_vblank = min_ttu_vblank * pclk_freq_in_mhz / (double) htotal;
+- dlg_vblank_start = interlaced ? (vblank_start / 2) : vblank_start;
+-
+- disp_dlg_regs->min_dst_y_next_start = (unsigned int) (((double) dlg_vblank_start
+- + min_dst_y_ttu_vblank) * dml_pow(2, 2));
+- ASSERT(disp_dlg_regs->min_dst_y_next_start < (unsigned int) dml_pow(2, 18));
+-
+- dml_print("DML_DLG: %s: min_dcfclk_mhz = %3.2f\n",
+- __func__,
+- min_dcfclk_mhz);
+- dml_print("DML_DLG: %s: min_ttu_vblank = %3.2f\n",
+- __func__,
+- min_ttu_vblank);
+- dml_print("DML_DLG: %s: min_dst_y_ttu_vblank = %3.2f\n",
+- __func__,
+- min_dst_y_ttu_vblank);
+- dml_print("DML_DLG: %s: t_calc_us = %3.2f\n",
+- __func__,
+- t_calc_us);
+- dml_print("DML_DLG: %s: disp_dlg_regs->min_dst_y_next_start = 0x%0x\n",
+- __func__,
+- disp_dlg_regs->min_dst_y_next_start);
+- dml_print("DML_DLG: %s: ref_freq_to_pix_freq = %3.2f\n",
+- __func__,
+- ref_freq_to_pix_freq);
+-
+- // -------------------------
+- // Section 1.15.2.2: Prefetch, Active and TTU
+- // -------------------------
+- // Prefetch Calc
+- // Source
+-// dcc_en = src.dcc;
+- dual_plane = is_dual_plane((enum source_format_class)(src->source_format));
+- mode_422 = 0; // FIXME
+- access_dir = (src->source_scan == dm_vert); // vp access direction: horizontal or vertical accessed
+-// bytes_per_element_l = get_bytes_per_element(source_format_class(src.source_format), 0);
+-// bytes_per_element_c = get_bytes_per_element(source_format_class(src.source_format), 1);
+- vp_height_l = src->viewport_height;
+- vp_width_l = src->viewport_width;
+- vp_height_c = src->viewport_height_c;
+- vp_width_c = src->viewport_width_c;
+-
+- // Scaling
+- htaps_l = taps->htaps;
+- htaps_c = taps->htaps_c;
+- hratio_l = scl->hscl_ratio;
+- hratio_c = scl->hscl_ratio_c;
+- vratio_l = scl->vscl_ratio;
+- vratio_c = scl->vscl_ratio_c;
+- scl_enable = scl->scl_enable;
+-
+- line_time_in_us = (htotal / pclk_freq_in_mhz);
+-// vinit_l = scl.vinit;
+-// vinit_c = scl.vinit_c;
+-// vinit_bot_l = scl.vinit_bot;
+-// vinit_bot_c = scl.vinit_bot_c;
+-
+-// unsigned int swath_height_l = rq_dlg_param.rq_l.swath_height;
+- swath_width_ub_l = rq_dlg_param.rq_l.swath_width_ub;
+-// unsigned int dpte_bytes_per_row_ub_l = rq_dlg_param.rq_l.dpte_bytes_per_row_ub;
+- dpte_groups_per_row_ub_l = rq_dlg_param.rq_l.dpte_groups_per_row_ub;
+-// unsigned int meta_pte_bytes_per_frame_ub_l = rq_dlg_param.rq_l.meta_pte_bytes_per_frame_ub;
+-// unsigned int meta_bytes_per_row_ub_l = rq_dlg_param.rq_l.meta_bytes_per_row_ub;
+-
+-// unsigned int swath_height_c = rq_dlg_param.rq_c.swath_height;
+- swath_width_ub_c = rq_dlg_param.rq_c.swath_width_ub;
+- // dpte_bytes_per_row_ub_c = rq_dlg_param.rq_c.dpte_bytes_per_row_ub;
+- dpte_groups_per_row_ub_c = rq_dlg_param.rq_c.dpte_groups_per_row_ub;
+-
+- meta_chunks_per_row_ub_l = rq_dlg_param.rq_l.meta_chunks_per_row_ub;
+- meta_chunks_per_row_ub_c = rq_dlg_param.rq_c.meta_chunks_per_row_ub;
+- vupdate_offset = dst->vupdate_offset;
+- vupdate_width = dst->vupdate_width;
+- vready_offset = dst->vready_offset;
+-
+- dppclk_delay_subtotal = mode_lib->ip.dppclk_delay_subtotal;
+- dispclk_delay_subtotal = mode_lib->ip.dispclk_delay_subtotal;
+-
+- if (scl_enable)
+- dppclk_delay_subtotal += mode_lib->ip.dppclk_delay_scl;
+- else
+- dppclk_delay_subtotal += mode_lib->ip.dppclk_delay_scl_lb_only;
+-
+- dppclk_delay_subtotal += mode_lib->ip.dppclk_delay_cnvc_formatter
+- + src->num_cursors * mode_lib->ip.dppclk_delay_cnvc_cursor;
+-
+- if (dout->dsc_enable) {
+- double dsc_delay = get_dsc_delay(mode_lib, e2e_pipe_param, num_pipes, pipe_idx);
+-
+- dispclk_delay_subtotal += dsc_delay;
+- }
+-
+- pixel_rate_delay_subtotal = dppclk_delay_subtotal * pclk_freq_in_mhz / dppclk_freq_in_mhz
+- + dispclk_delay_subtotal * pclk_freq_in_mhz / dispclk_freq_in_mhz;
+-
+- vstartup_start = dst->vstartup_start;
+- if (interlaced) {
+- if (vstartup_start / 2.0
+- - (double) (vready_offset + vupdate_width + vupdate_offset) / htotal
+- <= vblank_end / 2.0)
+- disp_dlg_regs->vready_after_vcount0 = 1;
+- else
+- disp_dlg_regs->vready_after_vcount0 = 0;
+- } else {
+- if (vstartup_start
+- - (double) (vready_offset + vupdate_width + vupdate_offset) / htotal
+- <= vblank_end)
+- disp_dlg_regs->vready_after_vcount0 = 1;
+- else
+- disp_dlg_regs->vready_after_vcount0 = 0;
+- }
+-
+- // TODO: Where is this coming from?
+- if (interlaced)
+- vstartup_start = vstartup_start / 2;
+-
+- // TODO: What if this min_vblank doesn't match the value in the dml_config_settings.cpp?
+- if (vstartup_start >= min_vblank) {
+- dml_print("WARNING: DML_DLG: %s: vblank_start=%d vblank_end=%d\n",
+- __func__,
+- vblank_start,
+- vblank_end);
+- dml_print("WARNING: DML_DLG: %s: vstartup_start=%d should be less than min_vblank=%d\n",
+- __func__,
+- vstartup_start,
+- min_vblank);
+- min_vblank = vstartup_start + 1;
+- dml_print("WARNING: DML_DLG: %s: vstartup_start=%d should be less than min_vblank=%d\n",
+- __func__,
+- vstartup_start,
+- min_vblank);
+- }
+-
+- dst_x_after_scaler = get_dst_x_after_scaler(mode_lib, e2e_pipe_param, num_pipes, pipe_idx);
+- dst_y_after_scaler = get_dst_y_after_scaler(mode_lib, e2e_pipe_param, num_pipes, pipe_idx);
+-
+- dml_print("DML_DLG: %s: htotal = %d\n", __func__, htotal);
+- dml_print("DML_DLG: %s: pixel_rate_delay_subtotal = %d\n",
+- __func__,
+- pixel_rate_delay_subtotal);
+- dml_print("DML_DLG: %s: dst_x_after_scaler = %d\n",
+- __func__,
+- dst_x_after_scaler);
+- dml_print("DML_DLG: %s: dst_y_after_scaler = %d\n",
+- __func__,
+- dst_y_after_scaler);
+-
+- // Lwait
+- line_wait = mode_lib->soc.urgent_latency_us;
+- if (cstate_en)
+- line_wait = dml_max(mode_lib->soc.sr_enter_plus_exit_time_us, line_wait);
+- if (pstate_en)
+- line_wait = dml_max(mode_lib->soc.dram_clock_change_latency_us
+- + mode_lib->soc.urgent_latency_us,
+- line_wait);
+- line_wait = line_wait / line_time_in_us;
+-
+- dst_y_prefetch = get_dst_y_prefetch(mode_lib, e2e_pipe_param, num_pipes, pipe_idx);
+- dml_print("DML_DLG: %s: dst_y_prefetch (after rnd) = %3.2f\n", __func__, dst_y_prefetch);
+-
+- dst_y_per_vm_vblank = get_dst_y_per_vm_vblank(mode_lib,
+- e2e_pipe_param,
+- num_pipes,
+- pipe_idx);
+- dst_y_per_row_vblank = get_dst_y_per_row_vblank(mode_lib,
+- e2e_pipe_param,
+- num_pipes,
+- pipe_idx);
+- dst_y_per_vm_flip = get_dst_y_per_vm_flip(mode_lib, e2e_pipe_param, num_pipes, pipe_idx);
+- dst_y_per_row_flip = get_dst_y_per_row_flip(mode_lib, e2e_pipe_param, num_pipes, pipe_idx);
+-
+- min_dst_y_per_vm_vblank = 8.0;
+- min_dst_y_per_row_vblank = 16.0;
+-
+- // magic!
+- if (htotal <= 75) {
+- min_vblank = 300;
+- min_dst_y_per_vm_vblank = 100.0;
+- min_dst_y_per_row_vblank = 100.0;
+- }
+-
+- dml_print("DML_DLG: %s: dst_y_per_vm_vblank = %3.2f\n", __func__, dst_y_per_vm_vblank);
+- dml_print("DML_DLG: %s: dst_y_per_row_vblank = %3.2f\n", __func__, dst_y_per_row_vblank);
+-
+- ASSERT(dst_y_per_vm_vblank < min_dst_y_per_vm_vblank);
+- ASSERT(dst_y_per_row_vblank < min_dst_y_per_row_vblank);
+-
+- ASSERT(dst_y_prefetch > (dst_y_per_vm_vblank + dst_y_per_row_vblank));
+- lsw = dst_y_prefetch - (dst_y_per_vm_vblank + dst_y_per_row_vblank);
+-
+- dml_print("DML_DLG: %s: lsw = %3.2f\n", __func__, lsw);
+-
+- vratio_pre_l = get_vratio_prefetch_l(mode_lib, e2e_pipe_param, num_pipes, pipe_idx);
+- vratio_pre_c = get_vratio_prefetch_c(mode_lib, e2e_pipe_param, num_pipes, pipe_idx);
+-
+- dml_print("DML_DLG: %s: vratio_pre_l=%3.2f\n", __func__, vratio_pre_l);
+- dml_print("DML_DLG: %s: vratio_pre_c=%3.2f\n", __func__, vratio_pre_c);
+-
+- // Active
+- req_per_swath_ub_l = rq_dlg_param.rq_l.req_per_swath_ub;
+- req_per_swath_ub_c = rq_dlg_param.rq_c.req_per_swath_ub;
+- meta_row_height_l = rq_dlg_param.rq_l.meta_row_height;
+- meta_row_height_c = rq_dlg_param.rq_c.meta_row_height;
+- swath_width_pixels_ub_l = 0;
+- swath_width_pixels_ub_c = 0;
+- scaler_rec_in_width_l = 0;
+- scaler_rec_in_width_c = 0;
+- dpte_row_height_l = rq_dlg_param.rq_l.dpte_row_height;
+- dpte_row_height_c = rq_dlg_param.rq_c.dpte_row_height;
+-
+- if (mode_422) {
+- swath_width_pixels_ub_l = swath_width_ub_l * 2; // *2 for 2 pixel per element
+- swath_width_pixels_ub_c = swath_width_ub_c * 2;
+- } else {
+- swath_width_pixels_ub_l = swath_width_ub_l * 1;
+- swath_width_pixels_ub_c = swath_width_ub_c * 1;
+- }
+-
+- hscale_pixel_rate_l = 0.;
+- hscale_pixel_rate_c = 0.;
+- min_hratio_fact_l = 1.0;
+- min_hratio_fact_c = 1.0;
+-
+- if (htaps_l <= 1)
+- min_hratio_fact_l = 2.0;
+- else if (htaps_l <= 6) {
+- if ((hratio_l * 2.0) > 4.0)
+- min_hratio_fact_l = 4.0;
+- else
+- min_hratio_fact_l = hratio_l * 2.0;
+- } else {
+- if (hratio_l > 4.0)
+- min_hratio_fact_l = 4.0;
+- else
+- min_hratio_fact_l = hratio_l;
+- }
+-
+- hscale_pixel_rate_l = min_hratio_fact_l * dppclk_freq_in_mhz;
+-
+- if (htaps_c <= 1)
+- min_hratio_fact_c = 2.0;
+- else if (htaps_c <= 6) {
+- if ((hratio_c * 2.0) > 4.0)
+- min_hratio_fact_c = 4.0;
+- else
+- min_hratio_fact_c = hratio_c * 2.0;
+- } else {
+- if (hratio_c > 4.0)
+- min_hratio_fact_c = 4.0;
+- else
+- min_hratio_fact_c = hratio_c;
+- }
+-
+- hscale_pixel_rate_c = min_hratio_fact_c * dppclk_freq_in_mhz;
+-
+- refcyc_per_line_delivery_pre_l = 0.;
+- refcyc_per_line_delivery_pre_c = 0.;
+- refcyc_per_line_delivery_l = 0.;
+- refcyc_per_line_delivery_c = 0.;
+-
+- refcyc_per_req_delivery_pre_l = 0.;
+- refcyc_per_req_delivery_pre_c = 0.;
+- refcyc_per_req_delivery_l = 0.;
+- refcyc_per_req_delivery_c = 0.;
+-
+- full_recout_width = 0;
+- // In ODM
+- if (src->is_hsplit) {
+- // This "hack" is only allowed (and valid) for MPC combine. In ODM
+- // combine, you MUST specify the full_recout_width...according to Oswin
+- if (dst->full_recout_width == 0 && !dst->odm_combine) {
+- dml_print("DML_DLG: %s: Warning: full_recout_width not set in hsplit mode\n",
+- __func__);
+- full_recout_width = dst->recout_width * 2; // assume half split for dcn1
+- } else
+- full_recout_width = dst->full_recout_width;
+- } else
+- full_recout_width = dst->recout_width;
+-
+- // mpc_combine and odm_combine are mutually exclusive
+- refcyc_per_line_delivery_pre_l = get_refcyc_per_delivery(mode_lib,
+- refclk_freq_in_mhz,
+- pclk_freq_in_mhz,
+- dst->odm_combine,
+- full_recout_width,
+- dst->hactive,
+- vratio_pre_l,
+- hscale_pixel_rate_l,
+- swath_width_pixels_ub_l,
+- 1); // per line
+-
+- refcyc_per_line_delivery_l = get_refcyc_per_delivery(mode_lib,
+- refclk_freq_in_mhz,
+- pclk_freq_in_mhz,
+- dst->odm_combine,
+- full_recout_width,
+- dst->hactive,
+- vratio_l,
+- hscale_pixel_rate_l,
+- swath_width_pixels_ub_l,
+- 1); // per line
+-
+- dml_print("DML_DLG: %s: full_recout_width = %d\n",
+- __func__,
+- full_recout_width);
+- dml_print("DML_DLG: %s: hscale_pixel_rate_l = %3.2f\n",
+- __func__,
+- hscale_pixel_rate_l);
+- dml_print("DML_DLG: %s: refcyc_per_line_delivery_pre_l = %3.2f\n",
+- __func__,
+- refcyc_per_line_delivery_pre_l);
+- dml_print("DML_DLG: %s: refcyc_per_line_delivery_l = %3.2f\n",
+- __func__,
+- refcyc_per_line_delivery_l);
+-
+- if (dual_plane) {
+- refcyc_per_line_delivery_pre_c = get_refcyc_per_delivery(mode_lib,
+- refclk_freq_in_mhz,
+- pclk_freq_in_mhz,
+- dst->odm_combine,
+- full_recout_width,
+- dst->hactive,
+- vratio_pre_c,
+- hscale_pixel_rate_c,
+- swath_width_pixels_ub_c,
+- 1); // per line
+-
+- refcyc_per_line_delivery_c = get_refcyc_per_delivery(mode_lib,
+- refclk_freq_in_mhz,
+- pclk_freq_in_mhz,
+- dst->odm_combine,
+- full_recout_width,
+- dst->hactive,
+- vratio_c,
+- hscale_pixel_rate_c,
+- swath_width_pixels_ub_c,
+- 1); // per line
+-
+- dml_print("DML_DLG: %s: refcyc_per_line_delivery_pre_c = %3.2f\n",
+- __func__,
+- refcyc_per_line_delivery_pre_c);
+- dml_print("DML_DLG: %s: refcyc_per_line_delivery_c = %3.2f\n",
+- __func__,
+- refcyc_per_line_delivery_c);
+- }
+-
+- // TTU - Luma / Chroma
+- if (access_dir) { // vertical access
+- scaler_rec_in_width_l = vp_height_l;
+- scaler_rec_in_width_c = vp_height_c;
+- } else {
+- scaler_rec_in_width_l = vp_width_l;
+- scaler_rec_in_width_c = vp_width_c;
+- }
+-
+- refcyc_per_req_delivery_pre_l = get_refcyc_per_delivery(mode_lib,
+- refclk_freq_in_mhz,
+- pclk_freq_in_mhz,
+- dst->odm_combine,
+- full_recout_width,
+- dst->hactive,
+- vratio_pre_l,
+- hscale_pixel_rate_l,
+- scaler_rec_in_width_l,
+- req_per_swath_ub_l); // per req
+- refcyc_per_req_delivery_l = get_refcyc_per_delivery(mode_lib,
+- refclk_freq_in_mhz,
+- pclk_freq_in_mhz,
+- dst->odm_combine,
+- full_recout_width,
+- dst->hactive,
+- vratio_l,
+- hscale_pixel_rate_l,
+- scaler_rec_in_width_l,
+- req_per_swath_ub_l); // per req
+-
+- dml_print("DML_DLG: %s: refcyc_per_req_delivery_pre_l = %3.2f\n",
+- __func__,
+- refcyc_per_req_delivery_pre_l);
+- dml_print("DML_DLG: %s: refcyc_per_req_delivery_l = %3.2f\n",
+- __func__,
+- refcyc_per_req_delivery_l);
+-
+- ASSERT(refcyc_per_req_delivery_pre_l < dml_pow(2, 13));
+- ASSERT(refcyc_per_req_delivery_l < dml_pow(2, 13));
+-
+- if (dual_plane) {
+- refcyc_per_req_delivery_pre_c = get_refcyc_per_delivery(mode_lib,
+- refclk_freq_in_mhz,
+- pclk_freq_in_mhz,
+- dst->odm_combine,
+- full_recout_width,
+- dst->hactive,
+- vratio_pre_c,
+- hscale_pixel_rate_c,
+- scaler_rec_in_width_c,
+- req_per_swath_ub_c); // per req
+- refcyc_per_req_delivery_c = get_refcyc_per_delivery(mode_lib,
+- refclk_freq_in_mhz,
+- pclk_freq_in_mhz,
+- dst->odm_combine,
+- full_recout_width,
+- dst->hactive,
+- vratio_c,
+- hscale_pixel_rate_c,
+- scaler_rec_in_width_c,
+- req_per_swath_ub_c); // per req
+-
+- dml_print("DML_DLG: %s: refcyc_per_req_delivery_pre_c = %3.2f\n",
+- __func__,
+- refcyc_per_req_delivery_pre_c);
+- dml_print("DML_DLG: %s: refcyc_per_req_delivery_c = %3.2f\n",
+- __func__,
+- refcyc_per_req_delivery_c);
+-
+- ASSERT(refcyc_per_req_delivery_pre_c < dml_pow(2, 13));
+- ASSERT(refcyc_per_req_delivery_c < dml_pow(2, 13));
+- }
+-
+- // XFC
+- xfc_transfer_delay = get_xfc_transfer_delay(mode_lib, e2e_pipe_param, num_pipes, pipe_idx);
+- xfc_precharge_delay = get_xfc_precharge_delay(mode_lib,
+- e2e_pipe_param,
+- num_pipes,
+- pipe_idx);
+- xfc_remote_surface_flip_latency = get_xfc_remote_surface_flip_latency(mode_lib,
+- e2e_pipe_param,
+- num_pipes,
+- pipe_idx);
+- xfc_dst_y_delta_drq_limit = xfc_remote_surface_flip_latency;
+- xfc_prefetch_margin = get_xfc_prefetch_margin(mode_lib,
+- e2e_pipe_param,
+- num_pipes,
+- pipe_idx);
+-
+- // TTU - Cursor
+- refcyc_per_req_delivery_pre_cur0 = 0.0;
+- refcyc_per_req_delivery_cur0 = 0.0;
+- if (src->num_cursors > 0) {
+- calculate_ttu_cursor(mode_lib,
+- &refcyc_per_req_delivery_pre_cur0,
+- &refcyc_per_req_delivery_cur0,
+- refclk_freq_in_mhz,
+- ref_freq_to_pix_freq,
+- hscale_pixel_rate_l,
+- scl->hscl_ratio,
+- vratio_pre_l,
+- vratio_l,
+- src->cur0_src_width,
+- (enum cursor_bpp)(src->cur0_bpp));
+- }
+-
+- refcyc_per_req_delivery_pre_cur1 = 0.0;
+- refcyc_per_req_delivery_cur1 = 0.0;
+- if (src->num_cursors > 1) {
+- calculate_ttu_cursor(mode_lib,
+- &refcyc_per_req_delivery_pre_cur1,
+- &refcyc_per_req_delivery_cur1,
+- refclk_freq_in_mhz,
+- ref_freq_to_pix_freq,
+- hscale_pixel_rate_l,
+- scl->hscl_ratio,
+- vratio_pre_l,
+- vratio_l,
+- src->cur1_src_width,
+- (enum cursor_bpp)(src->cur1_bpp));
+- }
+-
+- // TTU - Misc
+- // all hard-coded
+-
+- // Assignment to register structures
+- disp_dlg_regs->dst_y_after_scaler = dst_y_after_scaler; // in terms of line
+- disp_dlg_regs->refcyc_x_after_scaler = dst_x_after_scaler * ref_freq_to_pix_freq; // in terms of refclk
+- ASSERT(disp_dlg_regs->refcyc_x_after_scaler < (unsigned int) dml_pow(2, 13));
+- disp_dlg_regs->dst_y_prefetch = (unsigned int) (dst_y_prefetch * dml_pow(2, 2));
+- disp_dlg_regs->dst_y_per_vm_vblank = (unsigned int) (dst_y_per_vm_vblank * dml_pow(2, 2));
+- disp_dlg_regs->dst_y_per_row_vblank = (unsigned int) (dst_y_per_row_vblank * dml_pow(2, 2));
+- disp_dlg_regs->dst_y_per_vm_flip = (unsigned int) (dst_y_per_vm_flip * dml_pow(2, 2));
+- disp_dlg_regs->dst_y_per_row_flip = (unsigned int) (dst_y_per_row_flip * dml_pow(2, 2));
+-
+- disp_dlg_regs->vratio_prefetch = (unsigned int) (vratio_pre_l * dml_pow(2, 19));
+- disp_dlg_regs->vratio_prefetch_c = (unsigned int) (vratio_pre_c * dml_pow(2, 19));
+-
+- disp_dlg_regs->refcyc_per_pte_group_vblank_l =
+- (unsigned int) (dst_y_per_row_vblank * (double) htotal
+- * ref_freq_to_pix_freq / (double) dpte_groups_per_row_ub_l);
+- ASSERT(disp_dlg_regs->refcyc_per_pte_group_vblank_l < (unsigned int) dml_pow(2, 13));
+-
+- if (dual_plane) {
+- disp_dlg_regs->refcyc_per_pte_group_vblank_c = (unsigned int) (dst_y_per_row_vblank
+- * (double) htotal * ref_freq_to_pix_freq
+- / (double) dpte_groups_per_row_ub_c);
+- ASSERT(disp_dlg_regs->refcyc_per_pte_group_vblank_c
+- < (unsigned int) dml_pow(2, 13));
+- }
+-
+- disp_dlg_regs->refcyc_per_meta_chunk_vblank_l =
+- (unsigned int) (dst_y_per_row_vblank * (double) htotal
+- * ref_freq_to_pix_freq / (double) meta_chunks_per_row_ub_l);
+- ASSERT(disp_dlg_regs->refcyc_per_meta_chunk_vblank_l < (unsigned int) dml_pow(2, 13));
+-
+- disp_dlg_regs->refcyc_per_meta_chunk_vblank_c =
+- disp_dlg_regs->refcyc_per_meta_chunk_vblank_l; // dcc for 4:2:0 is not supported in dcn1.0. assigned to be the same as _l for now
+-
+- disp_dlg_regs->refcyc_per_pte_group_flip_l = (unsigned int) (dst_y_per_row_flip * htotal
+- * ref_freq_to_pix_freq) / dpte_groups_per_row_ub_l;
+- disp_dlg_regs->refcyc_per_meta_chunk_flip_l = (unsigned int) (dst_y_per_row_flip * htotal
+- * ref_freq_to_pix_freq) / meta_chunks_per_row_ub_l;
+-
+- if (dual_plane) {
+- disp_dlg_regs->refcyc_per_pte_group_flip_c = (unsigned int) (dst_y_per_row_flip
+- * htotal * ref_freq_to_pix_freq) / dpte_groups_per_row_ub_c;
+- disp_dlg_regs->refcyc_per_meta_chunk_flip_c = (unsigned int) (dst_y_per_row_flip
+- * htotal * ref_freq_to_pix_freq) / meta_chunks_per_row_ub_c;
+- }
+-
+- disp_dlg_regs->dst_y_per_pte_row_nom_l = (unsigned int) ((double) dpte_row_height_l
+- / (double) vratio_l * dml_pow(2, 2));
+- ASSERT(disp_dlg_regs->dst_y_per_pte_row_nom_l < (unsigned int) dml_pow(2, 17));
+-
+- if (dual_plane) {
+- disp_dlg_regs->dst_y_per_pte_row_nom_c = (unsigned int) ((double) dpte_row_height_c
+- / (double) vratio_c * dml_pow(2, 2));
+- if (disp_dlg_regs->dst_y_per_pte_row_nom_c >= (unsigned int) dml_pow(2, 17)) {
+- dml_print("DML_DLG: %s: Warning dst_y_per_pte_row_nom_c %u larger than supported by register format U15.2 %u\n",
+- __func__,
+- disp_dlg_regs->dst_y_per_pte_row_nom_c,
+- (unsigned int) dml_pow(2, 17) - 1);
+- }
+- }
+-
+- disp_dlg_regs->dst_y_per_meta_row_nom_l = (unsigned int) ((double) meta_row_height_l
+- / (double) vratio_l * dml_pow(2, 2));
+- ASSERT(disp_dlg_regs->dst_y_per_meta_row_nom_l < (unsigned int) dml_pow(2, 17));
+-
+- disp_dlg_regs->dst_y_per_meta_row_nom_c = disp_dlg_regs->dst_y_per_meta_row_nom_l; // TODO: dcc for 4:2:0 is not supported in dcn1.0. assigned to be the same as _l for now
+-
+- disp_dlg_regs->refcyc_per_pte_group_nom_l = (unsigned int) ((double) dpte_row_height_l
+- / (double) vratio_l * (double) htotal * ref_freq_to_pix_freq
+- / (double) dpte_groups_per_row_ub_l);
+- if (disp_dlg_regs->refcyc_per_pte_group_nom_l >= (unsigned int) dml_pow(2, 23))
+- disp_dlg_regs->refcyc_per_pte_group_nom_l = dml_pow(2, 23) - 1;
+- disp_dlg_regs->refcyc_per_meta_chunk_nom_l = (unsigned int) ((double) meta_row_height_l
+- / (double) vratio_l * (double) htotal * ref_freq_to_pix_freq
+- / (double) meta_chunks_per_row_ub_l);
+- if (disp_dlg_regs->refcyc_per_meta_chunk_nom_l >= (unsigned int) dml_pow(2, 23))
+- disp_dlg_regs->refcyc_per_meta_chunk_nom_l = dml_pow(2, 23) - 1;
+-
+- if (dual_plane) {
+- disp_dlg_regs->refcyc_per_pte_group_nom_c =
+- (unsigned int) ((double) dpte_row_height_c / (double) vratio_c
+- * (double) htotal * ref_freq_to_pix_freq
+- / (double) dpte_groups_per_row_ub_c);
+- if (disp_dlg_regs->refcyc_per_pte_group_nom_c >= (unsigned int) dml_pow(2, 23))
+- disp_dlg_regs->refcyc_per_pte_group_nom_c = dml_pow(2, 23) - 1;
+-
+- // TODO: Is this the right calculation? Does htotal need to be halved?
+- disp_dlg_regs->refcyc_per_meta_chunk_nom_c =
+- (unsigned int) ((double) meta_row_height_c / (double) vratio_c
+- * (double) htotal * ref_freq_to_pix_freq
+- / (double) meta_chunks_per_row_ub_c);
+- if (disp_dlg_regs->refcyc_per_meta_chunk_nom_c >= (unsigned int) dml_pow(2, 23))
+- disp_dlg_regs->refcyc_per_meta_chunk_nom_c = dml_pow(2, 23) - 1;
+- }
+-
+- disp_dlg_regs->refcyc_per_line_delivery_pre_l = (unsigned int) dml_floor(refcyc_per_line_delivery_pre_l,
+- 1);
+- disp_dlg_regs->refcyc_per_line_delivery_l = (unsigned int) dml_floor(refcyc_per_line_delivery_l,
+- 1);
+- ASSERT(disp_dlg_regs->refcyc_per_line_delivery_pre_l < (unsigned int) dml_pow(2, 13));
+- ASSERT(disp_dlg_regs->refcyc_per_line_delivery_l < (unsigned int) dml_pow(2, 13));
+-
+- disp_dlg_regs->refcyc_per_line_delivery_pre_c = (unsigned int) dml_floor(refcyc_per_line_delivery_pre_c,
+- 1);
+- disp_dlg_regs->refcyc_per_line_delivery_c = (unsigned int) dml_floor(refcyc_per_line_delivery_c,
+- 1);
+- ASSERT(disp_dlg_regs->refcyc_per_line_delivery_pre_c < (unsigned int) dml_pow(2, 13));
+- ASSERT(disp_dlg_regs->refcyc_per_line_delivery_c < (unsigned int) dml_pow(2, 13));
+-
+- disp_dlg_regs->chunk_hdl_adjust_cur0 = 3;
+- disp_dlg_regs->dst_y_offset_cur0 = 0;
+- disp_dlg_regs->chunk_hdl_adjust_cur1 = 3;
+- disp_dlg_regs->dst_y_offset_cur1 = 0;
+-
+- disp_dlg_regs->xfc_reg_transfer_delay = xfc_transfer_delay;
+- disp_dlg_regs->xfc_reg_precharge_delay = xfc_precharge_delay;
+- disp_dlg_regs->xfc_reg_remote_surface_flip_latency = xfc_remote_surface_flip_latency;
+- disp_dlg_regs->xfc_reg_prefetch_margin = dml_ceil(xfc_prefetch_margin * refclk_freq_in_mhz,
+- 1);
+-
+- // slave has to have this value also set to off
+- if (src->xfc_enable && !src->xfc_slave)
+- disp_dlg_regs->dst_y_delta_drq_limit = dml_ceil(xfc_dst_y_delta_drq_limit, 1);
+- else
+- disp_dlg_regs->dst_y_delta_drq_limit = 0x7fff; // off
+-
+- disp_ttu_regs->refcyc_per_req_delivery_pre_l = (unsigned int) (refcyc_per_req_delivery_pre_l
+- * dml_pow(2, 10));
+- disp_ttu_regs->refcyc_per_req_delivery_l = (unsigned int) (refcyc_per_req_delivery_l
+- * dml_pow(2, 10));
+- disp_ttu_regs->refcyc_per_req_delivery_pre_c = (unsigned int) (refcyc_per_req_delivery_pre_c
+- * dml_pow(2, 10));
+- disp_ttu_regs->refcyc_per_req_delivery_c = (unsigned int) (refcyc_per_req_delivery_c
+- * dml_pow(2, 10));
+- disp_ttu_regs->refcyc_per_req_delivery_pre_cur0 =
+- (unsigned int) (refcyc_per_req_delivery_pre_cur0 * dml_pow(2, 10));
+- disp_ttu_regs->refcyc_per_req_delivery_cur0 = (unsigned int) (refcyc_per_req_delivery_cur0
+- * dml_pow(2, 10));
+- disp_ttu_regs->refcyc_per_req_delivery_pre_cur1 =
+- (unsigned int) (refcyc_per_req_delivery_pre_cur1 * dml_pow(2, 10));
+- disp_ttu_regs->refcyc_per_req_delivery_cur1 = (unsigned int) (refcyc_per_req_delivery_cur1
+- * dml_pow(2, 10));
+- disp_ttu_regs->qos_level_low_wm = 0;
+- ASSERT(disp_ttu_regs->qos_level_low_wm < dml_pow(2, 14));
+- disp_ttu_regs->qos_level_high_wm = (unsigned int) (4.0 * (double) htotal
+- * ref_freq_to_pix_freq);
+- ASSERT(disp_ttu_regs->qos_level_high_wm < dml_pow(2, 14));
+-
+- disp_ttu_regs->qos_level_flip = 14;
+- disp_ttu_regs->qos_level_fixed_l = 8;
+- disp_ttu_regs->qos_level_fixed_c = 8;
+- disp_ttu_regs->qos_level_fixed_cur0 = 8;
+- disp_ttu_regs->qos_ramp_disable_l = 0;
+- disp_ttu_regs->qos_ramp_disable_c = 0;
+- disp_ttu_regs->qos_ramp_disable_cur0 = 0;
+-
+- disp_ttu_regs->min_ttu_vblank = min_ttu_vblank * refclk_freq_in_mhz;
+- ASSERT(disp_ttu_regs->min_ttu_vblank < dml_pow(2, 24));
+-
+- print__ttu_regs_st(mode_lib, *disp_ttu_regs);
+- print__dlg_regs_st(mode_lib, *disp_dlg_regs);
+-}
+-
+-void dml_rq_dlg_get_dlg_reg(struct display_mode_lib *mode_lib,
+- display_dlg_regs_st *dlg_regs,
+- display_ttu_regs_st *ttu_regs,
+- display_e2e_pipe_params_st *e2e_pipe_param,
+- const unsigned int num_pipes,
+- const unsigned int pipe_idx,
+- const bool cstate_en,
+- const bool pstate_en,
+- const bool vm_en,
+- const bool ignore_viewport_pos,
+- const bool immediate_flip_support)
+-{
+- display_rq_params_st rq_param = {0};
+- display_dlg_sys_params_st dlg_sys_param = {0};
+-
+- // Get watermark and Tex.
+- dlg_sys_param.t_urg_wm_us = get_wm_urgent(mode_lib, e2e_pipe_param, num_pipes);
+- dlg_sys_param.deepsleep_dcfclk_mhz = get_clk_dcf_deepsleep(mode_lib,
+- e2e_pipe_param,
+- num_pipes);
+- dlg_sys_param.t_extra_us = get_urgent_extra_latency(mode_lib, e2e_pipe_param, num_pipes);
+- dlg_sys_param.mem_trip_us = get_wm_memory_trip(mode_lib, e2e_pipe_param, num_pipes);
+- dlg_sys_param.t_mclk_wm_us = get_wm_dram_clock_change(mode_lib, e2e_pipe_param, num_pipes);
+- dlg_sys_param.t_sr_wm_us = get_wm_stutter_enter_exit(mode_lib, e2e_pipe_param, num_pipes);
+- dlg_sys_param.total_flip_bw = get_total_immediate_flip_bw(mode_lib,
+- e2e_pipe_param,
+- num_pipes);
+- dlg_sys_param.total_flip_bytes = get_total_immediate_flip_bytes(mode_lib,
+- e2e_pipe_param,
+- num_pipes);
+- dlg_sys_param.t_srx_delay_us = mode_lib->ip.dcfclk_cstate_latency
+- / dlg_sys_param.deepsleep_dcfclk_mhz; // TODO: Deprecated
+-
+- print__dlg_sys_params_st(mode_lib, dlg_sys_param);
+-
+- // system parameter calculation done
+-
+- dml_print("DML_DLG: Calculation for pipe[%d] start\n\n", pipe_idx);
+- dml_rq_dlg_get_rq_params(mode_lib, &rq_param, e2e_pipe_param[pipe_idx].pipe.src);
+- dml_rq_dlg_get_dlg_params(mode_lib,
+- e2e_pipe_param,
+- num_pipes,
+- pipe_idx,
+- dlg_regs,
+- ttu_regs,
+- rq_param.dlg,
+- dlg_sys_param,
+- cstate_en,
+- pstate_en,
+- vm_en,
+- ignore_viewport_pos,
+- immediate_flip_support);
+- dml_print("DML_DLG: Calculation for pipe[%d] end\n", pipe_idx);
+-}
+-
+-void dml_rq_dlg_get_arb_params(struct display_mode_lib *mode_lib, display_arb_params_st *arb_param)
+-{
+- memset(arb_param, 0, sizeof(*arb_param));
+- arb_param->max_req_outstanding = 256;
+- arb_param->min_req_outstanding = 68;
+- arb_param->sat_level_us = 60;
+-}
+-
+-void calculate_ttu_cursor(struct display_mode_lib *mode_lib,
+- double *refcyc_per_req_delivery_pre_cur,
+- double *refcyc_per_req_delivery_cur,
+- double refclk_freq_in_mhz,
+- double ref_freq_to_pix_freq,
+- double hscale_pixel_rate_l,
+- double hscl_ratio,
+- double vratio_pre_l,
+- double vratio_l,
+- unsigned int cur_width,
+- enum cursor_bpp cur_bpp)
+-{
+- unsigned int cur_src_width = cur_width;
+- unsigned int cur_req_size = 0;
+- unsigned int cur_req_width = 0;
+- double cur_width_ub = 0.0;
+- double cur_req_per_width = 0.0;
+- double hactive_cur = 0.0;
+-
+- ASSERT(cur_src_width <= 256);
+-
+- *refcyc_per_req_delivery_pre_cur = 0.0;
+- *refcyc_per_req_delivery_cur = 0.0;
+- if (cur_src_width > 0) {
+- unsigned int cur_bit_per_pixel = 0;
+-
+- if (cur_bpp == dm_cur_2bit) {
+- cur_req_size = 64; // byte
+- cur_bit_per_pixel = 2;
+- } else { // 32bit
+- cur_bit_per_pixel = 32;
+- if (cur_src_width >= 1 && cur_src_width <= 16)
+- cur_req_size = 64;
+- else if (cur_src_width >= 17 && cur_src_width <= 31)
+- cur_req_size = 128;
+- else
+- cur_req_size = 256;
+- }
+-
+- cur_req_width = (double) cur_req_size / ((double) cur_bit_per_pixel / 8.0);
+- cur_width_ub = dml_ceil((double) cur_src_width / (double) cur_req_width, 1)
+- * (double) cur_req_width;
+- cur_req_per_width = cur_width_ub / (double) cur_req_width;
+- hactive_cur = (double) cur_src_width / hscl_ratio; // FIXME: oswin to think about what to do for cursor
+-
+- if (vratio_pre_l <= 1.0) {
+- *refcyc_per_req_delivery_pre_cur = hactive_cur * ref_freq_to_pix_freq
+- / (double) cur_req_per_width;
+- } else {
+- *refcyc_per_req_delivery_pre_cur = (double) refclk_freq_in_mhz
+- * (double) cur_src_width / hscale_pixel_rate_l
+- / (double) cur_req_per_width;
+- }
+-
+- ASSERT(*refcyc_per_req_delivery_pre_cur < dml_pow(2, 13));
+-
+- if (vratio_l <= 1.0) {
+- *refcyc_per_req_delivery_cur = hactive_cur * ref_freq_to_pix_freq
+- / (double) cur_req_per_width;
+- } else {
+- *refcyc_per_req_delivery_cur = (double) refclk_freq_in_mhz
+- * (double) cur_src_width / hscale_pixel_rate_l
+- / (double) cur_req_per_width;
+- }
+-
+- dml_print("DML_DLG: %s: cur_req_width = %d\n",
+- __func__,
+- cur_req_width);
+- dml_print("DML_DLG: %s: cur_width_ub = %3.2f\n",
+- __func__,
+- cur_width_ub);
+- dml_print("DML_DLG: %s: cur_req_per_width = %3.2f\n",
+- __func__,
+- cur_req_per_width);
+- dml_print("DML_DLG: %s: hactive_cur = %3.2f\n",
+- __func__,
+- hactive_cur);
+- dml_print("DML_DLG: %s: refcyc_per_req_delivery_pre_cur = %3.2f\n",
+- __func__,
+- *refcyc_per_req_delivery_pre_cur);
+- dml_print("DML_DLG: %s: refcyc_per_req_delivery_cur = %3.2f\n",
+- __func__,
+- *refcyc_per_req_delivery_cur);
+-
+- ASSERT(*refcyc_per_req_delivery_cur < dml_pow(2, 13));
+- }
+-}
+-
+-unsigned int dml_rq_dlg_get_calculated_vstartup(struct display_mode_lib *mode_lib,
+- display_e2e_pipe_params_st *e2e_pipe_param,
+- const unsigned int num_pipes,
+- const unsigned int pipe_idx)
+-{
+- unsigned int vstartup_pipe[DC__NUM_PIPES__MAX];
+- bool visited[DC__NUM_PIPES__MAX];
+- unsigned int pipe_inst = 0;
+- unsigned int i, j, k;
+-
+- for (k = 0; k < num_pipes; ++k)
+- visited[k] = false;
+-
+- for (i = 0; i < num_pipes; i++) {
+- if (e2e_pipe_param[i].pipe.src.is_hsplit && !visited[i]) {
+- unsigned int grp = e2e_pipe_param[i].pipe.src.hsplit_grp;
+-
+- for (j = i; j < num_pipes; j++) {
+- if (e2e_pipe_param[j].pipe.src.hsplit_grp == grp
+- && e2e_pipe_param[j].pipe.src.is_hsplit
+- && !visited[j]) {
+- vstartup_pipe[j] = get_vstartup_calculated(mode_lib,
+- e2e_pipe_param,
+- num_pipes,
+- pipe_inst);
+- visited[j] = true;
+- }
+- }
+-
+- pipe_inst++;
+- }
+-
+- if (!visited[i]) {
+- vstartup_pipe[i] = get_vstartup_calculated(mode_lib,
+- e2e_pipe_param,
+- num_pipes,
+- pipe_inst);
+- visited[i] = true;
+- pipe_inst++;
+- }
+- }
+-
+- return vstartup_pipe[pipe_idx];
+-
+-}
+-
+-void dml_rq_dlg_get_row_heights(struct display_mode_lib *mode_lib,
+- unsigned int *o_dpte_row_height,
+- unsigned int *o_meta_row_height,
+- unsigned int vp_width,
+- unsigned int data_pitch,
+- int source_format,
+- int tiling,
+- int macro_tile_size,
+- int source_scan,
+- int is_chroma)
+-{
+- display_data_rq_dlg_params_st rq_dlg_param;
+- display_data_rq_misc_params_st rq_misc_param;
+- display_data_rq_sizing_params_st rq_sizing_param;
+-
+- get_meta_and_pte_attr(mode_lib,
+- &rq_dlg_param,
+- &rq_misc_param,
+- &rq_sizing_param,
+- vp_width,
+- 0, // dummy
+- data_pitch,
+- 0, // dummy
+- source_format,
+- tiling,
+- macro_tile_size,
+- source_scan,
+- is_chroma);
+-
+- *o_dpte_row_height = rq_dlg_param.dpte_row_height;
+- *o_meta_row_height = rq_dlg_param.meta_row_height;
+-}
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_rq_dlg_calc.h b/drivers/gpu/drm/amd/display/dc/dml/display_rq_dlg_calc.h
+deleted file mode 100644
+index efdd4c7..0000000
+--- a/drivers/gpu/drm/amd/display/dc/dml/display_rq_dlg_calc.h
++++ /dev/null
+@@ -1,148 +0,0 @@
+-/*
+- * Copyright 2017 Advanced Micro Devices, Inc.
+- *
+- * 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
+- *
+- */
+-
+-#ifndef __DML2_DISPLAY_RQ_DLG_CALC_H__
+-#define __DML2_DISPLAY_RQ_DLG_CALC_H__
+-
+-#include "dml_common_defs.h"
+-#include "display_rq_dlg_helpers.h"
+-
+-struct display_mode_lib;
+-
+-// Function: dml_rq_dlg_get_rq_params
+-// Calculate requestor related parameters that register definition agnostic
+-// (i.e. this layer does try to separate real values from register definition)
+-// Input:
+-// pipe_src_param - pipe source configuration (e.g. vp, pitch, etc.)
+-// Output:
+-// rq_param - values that can be used to setup RQ (e.g. swath_height, plane1_addr, etc.)
+-//
+-void dml_rq_dlg_get_rq_params(
+- struct display_mode_lib *mode_lib,
+- display_rq_params_st *rq_param,
+- const display_pipe_source_params_st pipe_src_param);
+-
+-// Function: dml_rq_dlg_get_rq_reg
+-// Main entry point for test to get the register values out of this DML class.
+-// This function calls <get_rq_param> and <extract_rq_regs> fucntions to calculate
+-// and then populate the rq_regs struct
+-// Input:
+-// pipe_src_param - pipe source configuration (e.g. vp, pitch, etc.)
+-// Output:
+-// rq_regs - struct that holds all the RQ registers field value.
+-// See also: <display_rq_regs_st>
+-void dml_rq_dlg_get_rq_reg(
+- struct display_mode_lib *mode_lib,
+- display_rq_regs_st *rq_regs,
+- const display_pipe_source_params_st pipe_src_param);
+-
+-// Function: dml_rq_dlg_get_dlg_params
+-// Calculate deadline related parameters
+-//
+-void dml_rq_dlg_get_dlg_params(struct display_mode_lib *mode_lib,
+- const display_e2e_pipe_params_st *e2e_pipe_param,
+- const unsigned int num_pipes,
+- const unsigned int pipe_idx,
+- display_dlg_regs_st *disp_dlg_regs,
+- display_ttu_regs_st *disp_ttu_regs,
+- const display_rq_dlg_params_st rq_dlg_param,
+- const display_dlg_sys_params_st dlg_sys_param,
+- const bool cstate_en,
+- const bool pstate_en,
+- const bool vm_en,
+- const bool ignore_viewport_pos,
+- const bool immediate_flip_support);
+-
+-// Function: dml_rq_dlg_get_dlg_param_prefetch
+-// For flip_bw programming guide change, now dml needs to calculate the flip_bytes and prefetch_bw
+-// for ALL pipes and use this info to calculate the prefetch programming.
+-// Output: prefetch_param.prefetch_bw and flip_bytes
+-void dml_rq_dlg_get_dlg_params_prefetch(
+- struct display_mode_lib *mode_lib,
+- display_dlg_prefetch_param_st *prefetch_param,
+- display_rq_dlg_params_st rq_dlg_param,
+- display_dlg_sys_params_st dlg_sys_param,
+- display_e2e_pipe_params_st e2e_pipe_param,
+- const bool cstate_en,
+- const bool pstate_en,
+- const bool vm_en);
+-
+-// Function: dml_rq_dlg_get_dlg_reg
+-// Calculate and return DLG and TTU register struct given the system setting
+-// Output:
+-// dlg_regs - output DLG register struct
+-// ttu_regs - output DLG TTU register struct
+-// Input:
+-// e2e_pipe_param - "compacted" array of e2e pipe param struct
+-// num_pipes - num of active "pipe" or "route"
+-// pipe_idx - index that identifies the e2e_pipe_param that corresponding to this dlg
+-// cstate - 0: when calculate min_ttu_vblank it is assumed cstate is not required. 1: Normal mode, cstate is considered.
+-// Added for legacy or unrealistic timing tests.
+-void dml_rq_dlg_get_dlg_reg(
+- struct display_mode_lib *mode_lib,
+- display_dlg_regs_st *dlg_regs,
+- display_ttu_regs_st *ttu_regs,
+- display_e2e_pipe_params_st *e2e_pipe_param,
+- const unsigned int num_pipes,
+- const unsigned int pipe_idx,
+- const bool cstate_en,
+- const bool pstate_en,
+- const bool vm_en,
+- const bool ignore_viewport_pos,
+- const bool immediate_flip_support);
+-
+-// Function: dml_rq_dlg_get_calculated_vstartup
+-// Calculate and return vstartup
+-// Output:
+-// unsigned int vstartup
+-// Input:
+-// e2e_pipe_param - "compacted" array of e2e pipe param struct
+-// num_pipes - num of active "pipe" or "route"
+-// pipe_idx - index that identifies the e2e_pipe_param that corresponding to this dlg
+-// NOTE: this MUST be called after setting the prefetch mode!
+-unsigned int dml_rq_dlg_get_calculated_vstartup(
+- struct display_mode_lib *mode_lib,
+- display_e2e_pipe_params_st *e2e_pipe_param,
+- const unsigned int num_pipes,
+- const unsigned int pipe_idx);
+-
+-// Function: dml_rq_dlg_get_row_heights
+-// Calculate dpte and meta row heights
+-void dml_rq_dlg_get_row_heights(
+- struct display_mode_lib *mode_lib,
+- unsigned int *o_dpte_row_height,
+- unsigned int *o_meta_row_height,
+- unsigned int vp_width,
+- unsigned int data_pitch,
+- int source_format,
+- int tiling,
+- int macro_tile_size,
+- int source_scan,
+- int is_chroma);
+-
+-// Function: dml_rq_dlg_get_arb_params
+-void dml_rq_dlg_get_arb_params(struct display_mode_lib *mode_lib, display_arb_params_st *arb_param);
+-
+-#endif
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/dml1_display_rq_dlg_calc.h b/drivers/gpu/drm/amd/display/dc/dml/dml1_display_rq_dlg_calc.h
+index 987d767..3041649 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/dml1_display_rq_dlg_calc.h
++++ b/drivers/gpu/drm/amd/display/dc/dml/dml1_display_rq_dlg_calc.h
+@@ -27,10 +27,11 @@
+ #define __DISPLAY_RQ_DLG_CALC_H__
+
+ #include "dml_common_defs.h"
+-#include "display_rq_dlg_helpers.h"
+
+ struct display_mode_lib;
+
++#include "display_rq_dlg_helpers.h"
++
+ void dml1_extract_rq_regs(
+ struct display_mode_lib *mode_lib,
+ struct _vcs_dpi_display_rq_regs_st *rq_regs,
+--
+2.7.4
+