aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2514-drm-amd-display-add-mode-support-check-to-dml-vba-co.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2514-drm-amd-display-add-mode-support-check-to-dml-vba-co.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2514-drm-amd-display-add-mode-support-check-to-dml-vba-co.patch7506
1 files changed, 7506 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2514-drm-amd-display-add-mode-support-check-to-dml-vba-co.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2514-drm-amd-display-add-mode-support-check-to-dml-vba-co.patch
new file mode 100644
index 00000000..421eb69b
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2514-drm-amd-display-add-mode-support-check-to-dml-vba-co.patch
@@ -0,0 +1,7506 @@
+From 01d4ec839c188de78fa624db8f486791bcdbc0ea Mon Sep 17 00:00:00 2001
+From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Date: Fri, 15 Sep 2017 16:03:09 -0400
+Subject: [PATCH 2514/4131] drm/amd/display: add mode support check to dml vba
+ code
+
+Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Acked-by: Harry Wentland <Harry.Wentland@amd.com>
+---
+ .../drm/amd/display/dc/dml/display_mode_enums.h | 10 +-
+ .../drm/amd/display/dc/dml/display_mode_structs.h | 5 +
+ .../gpu/drm/amd/display/dc/dml/display_mode_vba.c | 5701 +++++++++++++++-----
+ .../gpu/drm/amd/display/dc/dml/display_mode_vba.h | 456 +-
+ .../gpu/drm/amd/display/dc/dml/dml_common_defs.c | 12 +
+ .../gpu/drm/amd/display/dc/dml/dml_common_defs.h | 3 +
+ 6 files changed, 4604 insertions(+), 1583 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_mode_enums.h b/drivers/gpu/drm/amd/display/dc/dml/display_mode_enums.h
+index eebaeb1..b1ad355 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_enums.h
++++ b/drivers/gpu/drm/amd/display/dc/dml/display_mode_enums.h
+@@ -26,7 +26,7 @@
+ #define __DISPLAY_MODE_ENUMS_H__
+
+ enum output_encoder_class {
+- dm_dp = 0, dm_hdmi = 1, dm_wb = 2
++ dm_dp = 0, dm_hdmi = 1, dm_wb = 2, dm_edp
+ };
+ enum output_format_class {
+ dm_444 = 0, dm_420 = 1, dm_n422, dm_s422
+@@ -39,7 +39,9 @@ enum source_format_class {
+ dm_420_10 = 4,
+ dm_422_8 = 5,
+ dm_422_10 = 6,
+- dm_444_8 = 7
++ dm_444_8 = 7,
++ dm_mono_8,
++ dm_mono_16
+ };
+ enum output_bpc_class {
+ dm_out_6 = 0, dm_out_8 = 1, dm_out_10 = 2, dm_out_12 = 3, dm_out_16 = 4
+@@ -79,7 +81,9 @@ enum dm_swizzle_mode {
+ dm_sw_SPARE_15 = 28,
+ dm_sw_var_s_x = 29,
+ dm_sw_var_d_x = 30,
+- dm_sw_64kb_r_x
++ dm_sw_64kb_r_x,
++ dm_sw_gfx7_2d_thin_lvp,
++ dm_sw_gfx7_2d_thin_gl
+ };
+ enum lb_depth {
+ dm_lb_10 = 0, dm_lb_8 = 1, dm_lb_6 = 2, dm_lb_12 = 3, dm_lb_16
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h b/drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h
+index e5b7f70..27e2046 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h
++++ b/drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h
+@@ -66,6 +66,7 @@ struct _vcs_dpi_mode_evaluation_st {
+
+ struct _vcs_dpi_voltage_scaling_st {
+ int state;
++ double dscclk_mhz;
+ double dcfclk_mhz;
+ double socclk_mhz;
+ double dram_speed_mhz;
+@@ -131,6 +132,9 @@ struct _vcs_dpi_ip_params_st {
+ unsigned int writeback_chroma_line_buffer_width_pixels;
+ unsigned int max_page_table_levels;
+ unsigned int max_num_dpp;
++ unsigned int max_num_otg;
++ unsigned int cursor_chunk_size;
++ unsigned int cursor_buffer_size;
+ unsigned int max_num_wb;
+ unsigned int max_dchub_pscl_bw_pix_per_clk;
+ unsigned int max_pscl_lb_bw_pix_per_clk;
+@@ -224,6 +228,7 @@ struct writeback_st {
+ };
+
+ struct _vcs_dpi_display_output_params_st {
++ int dp_lanes;
+ int output_bpp;
+ int dsc_enable;
+ int wb_enable;
+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
+index ada0eee..e1a3182 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c
++++ b/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c
+@@ -6,202 +6,220 @@ 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_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 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 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);
+-static double CeilToDFSGranularity(double Clock, double VCOSpeed);
+-static double FloorToDFSGranularity(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 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);
++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);
+-
+-void set_prefetch_mode(struct display_mode_lib *mode_lib,
+- bool cstate_en,
+- bool pstate_en,
+- bool ignore_viewport_pos,
+- bool immediate_flip_support)
++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;
+
+@@ -211,11 +229,13 @@ void set_prefetch_mode(struct display_mode_lib *mode_lib,
+ 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);
++ 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;
+@@ -223,6 +243,39 @@ void set_prefetch_mode(struct display_mode_lib *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
++ || memcmp(&mode_lib->me, &mode_lib->vba.me, sizeof(mode_lib->vba.me)) != 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;
++ mode_lib->vba.me = mode_lib->me;
++ memcpy(mode_lib->vba.cache_pipes, pipes, sizeof(*pipes) * num_pipes);
++ mode_lib->vba.cache_num_pipes = num_pipes;
++
++ if (need_recalculate)
++ 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); \
+@@ -243,7 +296,9 @@ dml_get_attr_func(stutter_efficiency_no_vblank, mode_lib->vba.StutterEfficiencyN
+ 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(
++ 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);
+@@ -269,17 +324,20 @@ dml_get_pipe_attr_func(dst_y_per_vm_vblank, mode_lib->vba.DestinationLinesToRequ
+ 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(
++ 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 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;
+
+@@ -288,25 +346,28 @@ unsigned int get_vstartup_calculated(struct display_mode_lib *mode_lib,
+ 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)
++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)
++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)
++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;
+@@ -326,10 +387,11 @@ static void fetch_socbb_params(struct display_mode_lib *mode_lib)
+ 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!
++ 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.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;
+@@ -342,7 +404,7 @@ static void fetch_socbb_params(struct display_mode_lib *mode_lib)
+ 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)
++ for (i = 0; i < DC__VOLTAGE_STATES; i++)
+ if (soc->clock_limits[i].state == mode_lib->vba.VoltageLevel)
+ break;
+
+@@ -353,6 +415,23 @@ static void fetch_socbb_params(struct display_mode_lib *mode_lib)
+
+ 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)
+@@ -360,6 +439,11 @@ 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;
+@@ -375,7 +459,8 @@ static void fetch_ip_params(struct display_mode_lib *mode_lib)
+ 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.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;
+@@ -402,10 +487,10 @@ 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];
++ unsigned int OTGInstPlane[DC__NUM_DPP__MAX];
+ unsigned int j, k;
+- bool PlaneVisited[DC__NUM_DPP];
+- bool visited[DC__NUM_PIPES__MAX];
++ 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)
+@@ -427,11 +512,16 @@ static void fetch_pipe_params(struct display_mode_lib *mode_lib)
+ 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.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;
+@@ -448,40 +538,62 @@ static void fetch_pipe_params(struct display_mode_lib *mode_lib)
+ 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;
++ 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.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.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.NumberOfDSCSlices[mode_lib->vba.NumberOfActivePlanes] =
++ dout->dsc_slices;
+ mode_lib->vba.DSCInputBitPerComponent[mode_lib->vba.NumberOfActivePlanes] =
+- dout->output_bpc == 0 ? 12 : dout->output_bpc;
++ dout->output_bpc == 0 ? 12 : dout->output_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.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;
++ src->dynamic_metadata_lines_before_active;
+ mode_lib->vba.DynamicMetadataTransmittedBytes[mode_lib->vba.NumberOfActivePlanes] =
+- src->dynamic_metadata_xmit_bytes;
++ src->dynamic_metadata_xmit_bytes;
+
+- mode_lib->vba.XFCEnabled[mode_lib->vba.NumberOfActivePlanes] = src->xfc_enable && ip->xfc_supported;
++ 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;
+@@ -489,7 +601,8 @@ static void fetch_pipe_params(struct display_mode_lib *mode_lib)
+ 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;
++ mode_lib->vba.LBBitPerPixel[mode_lib->vba.NumberOfActivePlanes] =
++ ip->line_buffer_fixed_bpp;
+ else {
+ unsigned int lb_depth;
+
+@@ -520,27 +633,36 @@ static void fetch_pipe_params(struct display_mode_lib *mode_lib)
+ for (k = 0; k < DC__NUM_CURSOR; ++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;
++ 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;
++ 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");
++ 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);
++ 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) {
+@@ -548,18 +670,20 @@ static void fetch_pipe_params(struct display_mode_lib *mode_lib)
+ 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;
++ && 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)
++ if (mode_lib->vba.SourceScan[mode_lib->vba.NumberOfActivePlanes]
++ == dm_horz)
+ mode_lib->vba.ViewportWidth[mode_lib->vba.NumberOfActivePlanes] +=
+- src_k->viewport_width;
++ src_k->viewport_width;
+ else
+ mode_lib->vba.ViewportHeight[mode_lib->vba.NumberOfActivePlanes] +=
+- src_k->viewport_height;
++ src_k->viewport_height;
+
+ mode_lib->vba.NumberOfDSCSlices[mode_lib->vba.NumberOfActivePlanes] +=
+- dout_k->dsc_slices;
++ dout_k->dsc_slices;
+ visited[k] = true;
+ }
+ }
+@@ -598,26 +722,30 @@ static void fetch_pipe_params(struct display_mode_lib *mode_lib)
+ 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 = 0;
++ 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 |= pipes[k].pipe.src.vm;
++ 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;
++ (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 &= ip->pte_enable;
++ 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;
++ 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;
+@@ -633,16 +761,20 @@ static void recalculate(struct display_mode_lib *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)
++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
+ || memcmp(&mode_lib->me, &mode_lib->vba.me, sizeof(mode_lib->vba.me)) != 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) {
++ || 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;
+ mode_lib->vba.me = mode_lib->me;
+@@ -677,55 +809,70 @@ static void ModeSupportAndSystemConfiguration(struct display_mode_lib *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);
++ ASSERT(total_pipes <= DC__NUM_DPP__MAX);
+ }
+
+-static double adjust_ReturnBW(struct display_mode_lib *mode_lib, double ReturnBW, bool DCCEnabledAnyPlane, double ReturnBandwidthToDCN)
++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)
++ 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);
++ 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));
++ 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)
++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
+@@ -739,12 +886,12 @@ static unsigned int dscceComputeDelay(unsigned int bpc,
+ 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;
++ 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
++ // #all other modes operate at 1 pixel per clock
+ else
+ pixelsPerClock = 1;
+
+@@ -859,66 +1006,67 @@ static unsigned int dscComputeDelay(enum output_format_class pixelFormat)
+ 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)
++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)
+ {
+ bool MyError = false;
+ unsigned int DPPCycles, DISPCLKCycles, VUpdateOffsetPix, VUpdateWidthPix, VReadyOffsetPix;
+@@ -948,7 +1096,7 @@ static bool CalculatePrefetchSchedule(struct display_mode_lib *mode_lib,
+ return true;
+
+ *DSTXAfterScaler = DPPCycles * PixelClock / DPPCLK + DISPCLKCycles * PixelClock / DISPCLK
+- + DSCDelay;
++ + DSCDelay;
+
+ if (DPPPerPlane > 1)
+ *DSTXAfterScaler = *DSTXAfterScaler + ScalerRecoutWidth;
+@@ -958,22 +1106,23 @@ static bool CalculatePrefetchSchedule(struct display_mode_lib *mode_lib,
+ else
+ *DSTYAfterScaler = 0;
+
+- DSTTotalPixelsAfterScaler = ((double)(*DSTYAfterScaler * HTotal)) + *DSTXAfterScaler;
++ DSTTotalPixelsAfterScaler = ((double) (*DSTYAfterScaler * HTotal)) + *DSTXAfterScaler;
+ *DSTYAfterScaler = dml_floor(DSTTotalPixelsAfterScaler / HTotal, 1);
+- *DSTXAfterScaler = DSTTotalPixelsAfterScaler - ((double)(*DSTYAfterScaler * HTotal));
++ *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;
++ * PixelClock;
+
+- VReadyOffsetPix = dml_max(150.0 / DPPCLK,
+- TotalRepeaterDelayTime + 20.0 / DCFClkDeepSleep + 10.0 / DPPCLK)
+- * PixelClock;
++ VReadyOffsetPix = dml_max(
++ 150.0 / DPPCLK,
++ TotalRepeaterDelayTime + 20.0 / DCFClkDeepSleep + 10.0 / DPPCLK)
++ * PixelClock;
+
+- Tsetup = (double)(VUpdateOffsetPix + VUpdateWidthPix + VReadyOffsetPix) / PixelClock;
++ Tsetup = (double) (VUpdateOffsetPix + VUpdateWidthPix + VReadyOffsetPix) / PixelClock;
+
+- LineTime = (double)HTotal / PixelClock;
++ LineTime = (double) HTotal / PixelClock;
+
+ if (DynamicMetadataEnable) {
+ double Tdmbf, Tdmec, Tdmsks;
+@@ -988,10 +1137,10 @@ static bool CalculatePrefetchSchedule(struct display_mode_lib *mode_lib,
+ if (InterlaceEnable && !ProgressiveToInterlaceUnitInOPP)
+ Tdmsks = Tdmsks / 2;
+ if (VStartup * LineTime
+- < Tsetup + TWait + UrgentExtraLatency + Tdmbf + Tdmec + Tdmsks) {
++ < Tsetup + TWait + UrgentExtraLatency + Tdmbf + Tdmec + Tdmsks) {
+ MyError = true;
+ *VStartupRequiredWhenNotEnoughTimeForDynamicMetadata = (Tsetup + TWait
+- + UrgentExtraLatency + Tdmbf + Tdmec + Tdmsks) / LineTime;
++ + UrgentExtraLatency + Tdmbf + Tdmec + Tdmsks) / LineTime;
+ } else
+ *VStartupRequiredWhenNotEnoughTimeForDynamicMetadata = 0.0;
+ } else
+@@ -1010,30 +1159,33 @@ static bool CalculatePrefetchSchedule(struct display_mode_lib *mode_lib,
+ *Tno_bw = LineTime / 4;
+
+ dst_y_prefetch_equ = VStartup - dml_max(TCalc + TWait, XFCRemoteSurfaceFlipDelay) / LineTime
+- - (Tsetup + Tdm) / LineTime
+- - (*DSTYAfterScaler + *DSTXAfterScaler / HTotal);
++ - (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;
++ + 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));
++ 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)));
++ 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;
+
+@@ -1046,7 +1198,8 @@ static bool CalculatePrefetchSchedule(struct display_mode_lib *mode_lib,
+ else
+ *DestinationLinesForPrefetch = dst_y_prefetch_equ;
+
+- *DestinationLinesForPrefetch = dml_floor(4.0 * (*DestinationLinesForPrefetch + 0.125), 1) / 4;
++ *DestinationLinesForPrefetch = dml_floor(4.0 * (*DestinationLinesForPrefetch + 0.125), 1)
++ / 4;
+
+ dml_print("DML: VStartup: %d\n", VStartup);
+ dml_print("DML: TCalc: %f\n", TCalc);
+@@ -1067,21 +1220,23 @@ static bool CalculatePrefetchSchedule(struct display_mode_lib *mode_lib,
+ *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);
++ + 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));
++ dml_max(
++ *Tno_bw
++ + (double) PDEAndMetaPTEBytesFrame
++ / *PrefetchBandwidth,
++ dml_max(
++ UrgentExtraLatency
++ + UrgentLatency
++ * (PageTableLevels
++ - 1),
++ LineTime / 4));
+ } else {
+ if (NumberOfCursors > 0 || XFCEnabled)
+ TimeForFetchingMetaPTE = LineTime / 4;
+@@ -1091,13 +1246,16 @@ static bool CalculatePrefetchSchedule(struct display_mode_lib *mode_lib,
+
+ if ((VirtualMemoryEnable == true || DCCEnable == true)) {
+ TimeForFetchingRowInVBlank =
+- dml_max((MetaRowByte + PixelPTEBytesPerRow)
+- / *PrefetchBandwidth,
+- dml_max(UrgentLatency,
+- dml_max(LineTime
+- - TimeForFetchingMetaPTE,
+- LineTime
+- / 4.0)));
++ dml_max(
++ (MetaRowByte + PixelPTEBytesPerRow)
++ / *PrefetchBandwidth,
++ dml_max(
++ UrgentLatency,
++ dml_max(
++ LineTime
++ - TimeForFetchingMetaPTE,
++ LineTime
++ / 4.0)));
+ } else {
+ if (NumberOfCursors > 0 || XFCEnabled)
+ TimeForFetchingRowInVBlank = LineTime - TimeForFetchingMetaPTE;
+@@ -1105,36 +1263,39 @@ static bool CalculatePrefetchSchedule(struct display_mode_lib *mode_lib,
+ TimeForFetchingRowInVBlank = 0.0;
+ }
+
+- *DestinationLinesToRequestVMInVBlank = dml_floor(4.0 * (TimeForFetchingMetaPTE / LineTime + 0.125),
+- 1) / 4.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;
++ *DestinationLinesToRequestRowInVBlank = dml_floor(
++ 4.0 * (TimeForFetchingRowInVBlank / LineTime + 0.125),
++ 1) / 4.0;
+
+ LinesToRequestPrefetchPixelData =
+- *DestinationLinesForPrefetch
+- - ((NumberOfCursors > 0 || VirtualMemoryEnable
+- || DCCEnable) ?
+- (*DestinationLinesToRequestVMInVBlank
+- + *DestinationLinesToRequestRowInVBlank) :
+- 0.0);
++ *DestinationLinesForPrefetch
++ - ((NumberOfCursors > 0 || VirtualMemoryEnable
++ || DCCEnable) ?
++ (*DestinationLinesToRequestVMInVBlank
++ + *DestinationLinesToRequestRowInVBlank) :
++ 0.0);
+
+ if (LinesToRequestPrefetchPixelData > 0) {
+
+- *VRatioPrefetchY = (double)PrefetchSourceLinesY
+- / LinesToRequestPrefetchPixelData;
++ *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));
++ dml_max(
++ (double) PrefetchSourceLinesY
++ / LinesToRequestPrefetchPixelData,
++ (double) MaxNumSwathY
++ * SwathHeightY
++ / (LinesToRequestPrefetchPixelData
++ - (VInitPreFillY
++ - 3.0)
++ / 2.0));
+ *VRatioPrefetchY = dml_max(*VRatioPrefetchY, 1.0);
+ } else {
+ MyError = true;
+@@ -1142,20 +1303,21 @@ static bool CalculatePrefetchSchedule(struct display_mode_lib *mode_lib,
+ }
+ }
+
+- *VRatioPrefetchC = (double)PrefetchSourceLinesC
+- / LinesToRequestPrefetchPixelData;
++ *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));
++ dml_max(
++ *VRatioPrefetchC,
++ (double) MaxNumSwathC
++ * SwathHeightC
++ / (LinesToRequestPrefetchPixelData
++ - (VInitPreFillC
++ - 3.0)
++ / 2.0));
+ *VRatioPrefetchC = dml_max(*VRatioPrefetchC, 1.0);
+ } else {
+ MyError = true;
+@@ -1164,17 +1326,19 @@ static bool CalculatePrefetchSchedule(struct display_mode_lib *mode_lib,
+ }
+
+ *RequiredPrefetchPixDataBW =
+- DPPPerPlane
+- * ((double)PrefetchSourceLinesY
+- / LinesToRequestPrefetchPixelData
+- * dml_ceil(BytePerPixelDETY,
+- 1)
+- + (double)PrefetchSourceLinesC
+- / LinesToRequestPrefetchPixelData
+- * dml_ceil(BytePerPixelDETC,
+- 2)
+- / 2)
+- * SwathWidthY / LineTime;
++ DPPPerPlane
++ * ((double) PrefetchSourceLinesY
++ / LinesToRequestPrefetchPixelData
++ * dml_ceil(
++ BytePerPixelDETY,
++ 1)
++ + (double) PrefetchSourceLinesC
++ / LinesToRequestPrefetchPixelData
++ * dml_ceil(
++ BytePerPixelDETC,
++ 2)
++ / 2)
++ * SwathWidthY / LineTime;
+ } else {
+ MyError = true;
+ *VRatioPrefetchY = 0;
+@@ -1202,25 +1366,26 @@ static bool CalculatePrefetchSchedule(struct display_mode_lib *mode_lib,
+ return MyError;
+ }
+
+-static double CeilToDFSGranularity(double Clock, double VCOSpeed)
++static double RoundToDFSGranularityUp(double Clock, double VCOSpeed)
+ {
+ return VCOSpeed * 4 / dml_floor(VCOSpeed * 4 / Clock, 1);
+ }
+
+-static double FloorToDFSGranularity(double Clock, double VCOSpeed)
++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)
++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;
+
+@@ -1234,50 +1399,54 @@ static double CalculatePrefetchSourceLines(struct display_mode_lib *mode_lib,
+ *MaxNumSwath = dml_ceil((*VInitPreFill - 1.0) / SwathHeight, 1) + 1.0;
+
+ if (*VInitPreFill > 1.0)
+- MaxPartialSwath = (unsigned int)(*VInitPreFill - 2) % SwathHeight;
++ MaxPartialSwath = (unsigned int) (*VInitPreFill - 2) % SwathHeight;
+ else
+- MaxPartialSwath = (unsigned int)(*VInitPreFill + SwathHeight - 2) % SwathHeight;
++ 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");
++ 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;
++ MaxPartialSwath = (unsigned int) (*VInitPreFill - 1) % SwathHeight;
+ else
+- MaxPartialSwath = (unsigned int)(*VInitPreFill + SwathHeight - 1) % SwathHeight;
++ 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)
++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;
+@@ -1298,31 +1467,33 @@ static unsigned int CalculateVMAndRowBytes(struct display_mode_lib *mode_lib,
+ MetaRequestWidth = 8 * BlockWidth256Bytes;
+ if (ScanDirection == dm_horz) {
+ *meta_row_height = MetaRequestHeight;
+- MetaSurfWidth = dml_ceil((double)SwathWidth - 1, MetaRequestWidth)
+- + MetaRequestWidth;
++ 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;
++ 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;
++ * (dml_ceil(ViewportHeight - 1, 64 * BlockHeight256Bytes)
++ + 64 * BlockHeight256Bytes) * BytePerPixel
++ / 256;
+ } else {
+ DCCMetaSurfaceBytes = DCCMetaPitch
+- * (dml_ceil((double)ViewportHeight - 1,
+- 64 * BlockHeight256Bytes)
+- + 64 * BlockHeight256Bytes) * BytePerPixel
+- / 256;
++ * (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;
++ MetaPTEBytesFrame = (dml_ceil(
++ (double) (DCCMetaSurfaceBytes - VMMPageSize)
++ / (8 * VMMPageSize),
++ 1) + 1) * 64;
+ MPDEBytesFrame = 128 * (mode_lib->vba.MaxPageTableLevels - 1);
+ } else {
+ MetaPTEBytesFrame = 0;
+@@ -1338,13 +1509,13 @@ static unsigned int CalculateVMAndRowBytes(struct display_mode_lib *mode_lib,
+ 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) {
++ || 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) {
++ || 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 {
+@@ -1356,30 +1527,34 @@ static unsigned int CalculateVMAndRowBytes(struct display_mode_lib *mode_lib,
+ 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);
++ 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);
++ 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 {
+@@ -1388,7 +1563,7 @@ static unsigned int CalculateVMAndRowBytes(struct display_mode_lib *mode_lib,
+ }
+
+ PDEAndMetaPTEBytesFrame = MetaPTEBytesFrame + MPDEBytesFrame + DPDE0BytesFrame
+- + ExtraDPDEBytesFrame;
++ + ExtraDPDEBytesFrame;
+
+ if (VirtualMemoryEnable == true) {
+ unsigned int PTERequestSize;
+@@ -1429,33 +1604,39 @@ static unsigned int CalculateVMAndRowBytes(struct display_mode_lib *mode_lib,
+
+ 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));
++ 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);
++ * (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);
++ * (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);
++ * (dml_ceil(
++ ((double) SwathWidth - 1)
++ / PixelPTEReqHeight,
++ 1) + 1);
+ }
+ if (*PixelPTEBytesPerRow * (1 - FractionOfPTEReturnDrop)
+- <= 64 * PTEBufferSizeInRequests) {
++ <= 64 * PTEBufferSizeInRequests) {
+ *PTEBufferSizeNotExceeded = true;
+ } else {
+ *PTEBufferSizeNotExceeded = false;
+@@ -1468,7 +1649,8 @@ static unsigned int CalculateVMAndRowBytes(struct display_mode_lib *mode_lib,
+ return PDEAndMetaPTEBytesFrame;
+ }
+
+-static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(struct display_mode_lib *mode_lib)
++static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(
++ struct display_mode_lib *mode_lib)
+ {
+ unsigned int j, k;
+
+@@ -1481,81 +1663,107 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ //
+ 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));
++ 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));
++ 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.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));
++ 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]) {
+ 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)) {
++ 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;
++ 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));
++ 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.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));
++ 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.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);
++ mode_lib->vba.DPPCLKUsingSingleDPP[k] = dml_max(
++ mode_lib->vba.DPPCLKUsingSingleDPPLuma,
++ mode_lib->vba.DPPCLKUsingSingleDPPChroma);
+ }
+ }
+
+@@ -1564,67 +1772,90 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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));
++ 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));
++ 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.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));
++ 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);
++ 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);
+
+- mode_lib->vba.MaxDispclk = mode_lib->vba.soc.clock_limits[NumberOfStates - 1].dispclk_mhz;
+ ASSERT(mode_lib->vba.DISPCLKDPPCLKVCOSpeed != 0);
+- mode_lib->vba.DISPCLKWithRampingRoundedToDFSGranularity = CeilToDFSGranularity(
++ mode_lib->vba.DISPCLKWithRampingRoundedToDFSGranularity = RoundToDFSGranularityUp(
+ mode_lib->vba.DISPCLKWithRamping,
+ mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
+- mode_lib->vba.DISPCLKWithoutRampingRoundedToDFSGranularity = CeilToDFSGranularity(
++ mode_lib->vba.DISPCLKWithoutRampingRoundedToDFSGranularity = RoundToDFSGranularityUp(
+ mode_lib->vba.DISPCLKWithoutRamping,
+ mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
+- mode_lib->vba.MaxDispclkRoundedToDFSGranularity = FloorToDFSGranularity(
+- mode_lib->vba.MaxDispclk,
++ 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;
++ > 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.MaxDispclkRoundedToDFSGranularity) {
+ mode_lib->vba.DISPCLK_calculated = mode_lib->vba.MaxDispclkRoundedToDFSGranularity;
+ } else {
+- mode_lib->vba.DISPCLK_calculated = mode_lib->vba.DISPCLKWithRampingRoundedToDFSGranularity;
++ 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.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 = CeilToDFSGranularity(mode_lib->vba.GlobalDPPCLK, mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
++ 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);
++ * 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]);
+ }
+
+@@ -1634,15 +1865,27 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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.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);
++ 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);
++ 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);
+@@ -1659,14 +1902,19 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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)
++ 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]));
++ 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];
++ mode_lib->vba.SwathWidthY[k] = mode_lib->vba.SwathWidthSingleDPPY[k]
++ / mode_lib->vba.DPPPerPlane[k];
+ }
+
+ for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
+@@ -1694,76 +1942,104 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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]);
++ * 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.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];
++ 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.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.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];
++ 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]);
++ 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];
++ 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];
++ 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.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;
++ + (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.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;
++ 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);
+@@ -1780,12 +2056,14 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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;
++ + 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;
++ mode_lib->vba.DRAMClockChangeWatermark = mode_lib->vba.DRAMClockChangeLatency
++ + mode_lib->vba.UrgentWatermark;
+
+ DTRACE(" wm_pstate_change = %fus", mode_lib->vba.DRAMClockChangeWatermark);
+
+@@ -1794,28 +2072,42 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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;
++ 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;
++ 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];
++ 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);
++ 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;
+@@ -1825,15 +2117,21 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+
+ 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.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];
++ 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];
+ }
+ }
+
+@@ -1841,45 +2139,58 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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;
++ 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;
++ 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;
++ 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.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.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);
++ * (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;
++ - (mode_lib->vba.SRExitTime + mode_lib->vba.StutterBurstTime)
++ / mode_lib->vba.MinFullDETBufferingTime) * 100;
+ } else {
+ mode_lib->vba.StutterEfficiencyNotIncludingVBlank = 0;
+ }
+@@ -1887,47 +2198,66 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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];
++ 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.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;
++ * (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]);
++ 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);
++ * 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_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;
++ 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);
+@@ -1935,72 +2265,95 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ // 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]);
++ 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]);
++ * (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);
++ 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.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]);
++ 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;
++ 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)
++ 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);
++ 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);
++ mode_lib->vba.DSCCLK_calculated[k] =
++ mode_lib->vba.PixelClockBackEnd[k] / 3
++ / mode_lib->vba.DSCFormatFactor
++ / (1
++ - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading
++ / 100);
+ }
+ }
+
+@@ -2013,27 +2366,35 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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]);
++ 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];
++ 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;
+ }
+@@ -2041,7 +2402,8 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+
+ 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])
++ 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
+@@ -2053,82 +2415,91 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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,
+- &MetaRowByteY,
+- &PixelPTEBytesPerRowY,
+- &mode_lib->vba.PTEBufferSizeNotExceeded,
+- &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],
++ 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] / 2,
+- mode_lib->vba.ViewportHeight[k] / 2,
+- mode_lib->vba.SwathWidthY[k] / 2,
++ 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.PitchC[k],
+- 0,
+- &mode_lib->vba.MacroTileWidthC,
+- &MetaRowByteC,
+- &PixelPTEBytesPerRowC,
+- &mode_lib->vba.PTEBufferSizeNotExceeded,
+- &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.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.SwathHeightC[k],
+- mode_lib->vba.ViewportYStartC[k],
+- &mode_lib->vba.VInitPreFillC[k],
+- &mode_lib->vba.MaxNumSwathC[k]);
++ 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;
+@@ -2138,25 +2509,27 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ }
+
+ mode_lib->vba.PixelPTEBytesPerRow[k] = PixelPTEBytesPerRowY + PixelPTEBytesPerRowC;
+- mode_lib->vba.PDEAndMetaPTEBytesFrame[k] = PDEAndMetaPTEBytesFrameY + PDEAndMetaPTEBytesFrameC;
++ 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]);
++ 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;
+@@ -2164,32 +2537,37 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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[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;
++ 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[k] = 0;
++ 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[k] =
+- dml_max(mode_lib->vba.WritebackDelay[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);
++ 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);
+ }
+ }
+ }
+@@ -2198,27 +2576,34 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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[k] = mode_lib->vba.WritebackDelay[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[k]
+- / (mode_lib->vba.HTotal[k]
+- / mode_lib->vba.PixelClock[k]),
+- 1));
++ 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]);
++ 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];
++ 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 {
+@@ -2227,102 +2612,119 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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);
++ 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);
++ 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.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]);
+ 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] = 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;
++ 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]]);
++ mode_lib->vba.VStartup[k] =
++ dml_min(
++ mode_lib->vba.VStartupLines,
++ mode_lib->vba.MaxVStartupLines[mode_lib->vba.BlendingAndTiming[k]]);
+ }
+ }
+
+@@ -2331,116 +2733,136 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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]);
++ 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)
++ 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]);
++ 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]));
++ 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)
++ 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
++ 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");
++ dml_print(
++ "DML: CalculatePrefetchSchedule ***failed***. Bandwidth violation. Results are NOT valid\n");
+ }
+
+ if (mode_lib->vba.PrefetchModeSupported == true) {
+- double final_flip_bw[DC__NUM_PIPES__MAX];
+- unsigned int ImmediateFlipBytes[DC__NUM_PIPES__MAX];
++ 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]);
++ 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.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];
++ && 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]);
++ 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])));
++ 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) {
+@@ -2458,35 +2880,44 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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");
++ 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));
++ && (!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];
++ 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];
++ 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];
++ 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];
++ mode_lib->vba.SwathWidthY[k]
++ / mode_lib->vba.PSCL_THROUGHPUT_LUMA[k]
++ / mode_lib->vba.DPPCLK[k];
+ }
+ }
+ }
+@@ -2496,19 +2927,25 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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));
++ 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);
++ 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];
++ mode_lib->vba.MinTTUVBlank[k] = mode_lib->vba.TCalc
++ + mode_lib->vba.MinTTUVBlank[k];
+ }
+
+ // DCC Configuration
+@@ -2528,33 +2965,43 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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);
++ 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]);
++ 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];
++ 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 {
+@@ -2562,7 +3009,8 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ }
+
+ if (mode_lib->vba.SwathWidthY[k] / 2 > 2 * mode_lib->vba.DPPOutputBufferPixels) {
+- DPPOutputBufferLinesC = mode_lib->vba.DPPOutputBufferPixels / (mode_lib->vba.SwathWidthY[k] / 2);
++ 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 {
+@@ -2570,46 +3018,59 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ }
+
+ DPPOPPBufferingY = (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k])
+- * (DPPOutputBufferLinesY + mode_lib->vba.OPPOutputBufferLines);
++ * (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]);
++ + (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;
++ + 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]);
++ 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 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]);
++ 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;
++ + 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);
++ 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;
++ ActiveDRAMClockChangeLatencyMarginY;
+ }
+
+ if (mode_lib->vba.WritebackEnable[k]) {
+@@ -2617,51 +3078,60 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+
+ 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;
++ (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;
++ 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;
++ 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.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.MinActiveDRAMClockChangeMargin =
+- mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k];
++ mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k];
+ }
+ }
+
+- mode_lib->vba.MinActiveDRAMClockChangeLatencySupported = mode_lib->vba.MinActiveDRAMClockChangeMargin
+- + mode_lib->vba.DRAMClockChangeLatency;
++ 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;
+@@ -2670,7 +3140,8 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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;
++ mode_lib->vba.DRAMClockChangeSupport =
++ dm_dram_clock_change_unsupported;
+ }
+ }
+ } else {
+@@ -2686,48 +3157,74 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+ 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);
++ 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];
++ / (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;
+@@ -2782,21 +3279,22 @@ static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib)
+ 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.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) {
++ || mode_lib->vba.SourcePixelFormat[k] == dm_444_16) {
+ Read256BytesBlockHeightY = 8;
+ } else {
+ Read256BytesBlockHeightY = 16;
+ }
+ Read256BytesBlockWidthY = 256 / dml_ceil(BytePerPixDETY, 1)
+- / Read256BytesBlockHeightY;
++ / Read256BytesBlockHeightY;
+ Read256BytesBlockHeightC = 0;
+ Read256BytesBlockWidthC = 0;
+ } else {
+@@ -2811,9 +3309,9 @@ static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib)
+ Read256BytesBlockHeightC = 8;
+ }
+ Read256BytesBlockWidthY = 256 / dml_ceil(BytePerPixDETY, 1)
+- / Read256BytesBlockHeightY;
++ / Read256BytesBlockHeightY;
+ Read256BytesBlockWidthC = 256 / dml_ceil(BytePerPixDETC, 2)
+- / Read256BytesBlockHeightC;
++ / Read256BytesBlockHeightC;
+ }
+
+ if (mode_lib->vba.SourceScan[k] == dm_horz) {
+@@ -2824,27 +3322,30 @@ static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib)
+ 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.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)) {
++ || (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) {
++ } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_8
++ && mode_lib->vba.SourceScan[k] != dm_horz) {
+ MinimumSwathHeightY = MaximumSwathHeightY;
+ } else {
+ MinimumSwathHeightY = MaximumSwathHeightY / 2.0;
+@@ -2854,10 +3355,12 @@ static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib)
+ 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) {
++ } 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) {
++ } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10
++ && mode_lib->vba.SourceScan[k] == dm_horz) {
+ MinimumSwathHeightC = MaximumSwathHeightC / 2.0;
+ MinimumSwathHeightY = MaximumSwathHeightY;
+ } else {
+@@ -2876,40 +3379,46 @@ static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib)
+ MainPlaneDoesODMCombine = true;
+ }
+ for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) {
+- if (mode_lib->vba.BlendingAndTiming[k] == j && mode_lib->vba.ODMCombineEnabled[j] == true) {
++ 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]);
++ 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;
++ 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;
++ + 256;
+ }
+ if (MaximumSwathHeightC > 0) {
+ SwathWidthGranularityC = 256.0 / dml_ceil(BytePerPixDETC, 2)
+- / MaximumSwathHeightC;
+- RoundedUpMaxSwathSizeBytesC = (dml_ceil((double)(SwathWidth / 2.0 - 1),
+- SwathWidthGranularityC) + SwathWidthGranularityC)
+- * BytePerPixDETC * MaximumSwathHeightC;
++ / 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;
++ RoundedUpMaxSwathSizeBytesC = dml_ceil(
++ RoundedUpMaxSwathSizeBytesC,
++ 256) + 256;
+ }
+ } else
+ RoundedUpMaxSwathSizeBytesC = 0.0;
+
+ if (RoundedUpMaxSwathSizeBytesY + RoundedUpMaxSwathSizeBytesC
+- <= mode_lib->vba.DETBufferSizeInKByte * 1024.0 / 2.0) {
++ <= mode_lib->vba.DETBufferSizeInKByte * 1024.0 / 2.0) {
+ mode_lib->vba.SwathHeightY[k] = MaximumSwathHeightY;
+ mode_lib->vba.SwathHeightC[k] = MaximumSwathHeightC;
+ } else {
+@@ -2921,27 +3430,32 @@ static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib)
+ 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;
++ 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;
++ 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)
++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_16
+- || SourcePixelFormat == dm_444_8)) {
++ || SourcePixelFormat == dm_444_16 || SourcePixelFormat == dm_444_16
++ || SourcePixelFormat == dm_444_8)) {
+ if (SurfaceTiling == dm_sw_linear) {
+ *BlockHeight256BytesY = 1;
+ } else if (SourcePixelFormat == dm_444_64) {
+@@ -2971,14 +3485,16 @@ bool Calculate256BBlockSizes(enum source_format_class SourcePixelFormat,
+ return true;
+ }
+
+-static double CalculateTWait(unsigned int PrefetchMode,
+- double DRAMClockChangeLatency,
+- double UrgentLatency,
+- double SREnterPlusExitTime)
++static double CalculateTWait(
++ unsigned int PrefetchMode,
++ double DRAMClockChangeLatency,
++ double UrgentLatency,
++ double SREnterPlusExitTime)
+ {
+ if (PrefetchMode == 0) {
+- return dml_max(DRAMClockChangeLatency + UrgentLatency,
+- dml_max(SREnterPlusExitTime, UrgentLatency));
++ return dml_max(
++ DRAMClockChangeLatency + UrgentLatency,
++ dml_max(SREnterPlusExitTime, UrgentLatency));
+ } else if (PrefetchMode == 1) {
+ return dml_max(SREnterPlusExitTime, UrgentLatency);
+ } else {
+@@ -2986,23 +3502,24 @@ static double CalculateTWait(unsigned int PrefetchMode,
+ }
+ }
+
+-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 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;
+
+@@ -3011,8 +3528,9 @@ static double CalculateRemoteSurfaceFlipDelay(struct display_mode_lib *mode_lib,
+ *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: 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);
+@@ -3022,99 +3540,192 @@ static double CalculateRemoteSurfaceFlipDelay(struct display_mode_lib *mode_lib,
+ 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)
++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,
++ double CalculateWriteBackDISPCLK =
+ 1.01 * PixelClock
+- * dml_max(
+- dml_ceil(WritebackChromaHTaps / 2.0, 1) / (2 * WritebackHRatio),
++ * 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(
+- (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)));
++ 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)
++ 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));
++ 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)));
++ 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)
++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);
++ + VRatio / 2 * MetaRowByteChroma
++ / (meta_row_height_chroma * LineTime);
+ } else {
+ *meta_row_bw = VRatio * MetaRowByteLuma / (meta_row_height_luma * LineTime);
+ }
+@@ -3123,8 +3734,8 @@ static void CalculateActiveRowBandwidth(bool VirtualMemoryEnable,
+ *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);
++ + VRatio / 2 * PixelPTEBytesPerRowChroma
++ / (dpte_row_height_chroma * LineTime);
+ } else {
+ *dpte_row_bw = VRatio * PixelPTEBytesPerRowLuma / (dpte_row_height_luma * LineTime);
+ }
+@@ -3136,29 +3747,30 @@ static void CalculateActiveRowBandwidth(bool VirtualMemoryEnable,
+ }
+ }
+
+-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 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;
+
+@@ -3172,47 +3784,54 @@ static void CalculateFlipSchedule(struct display_mode_lib *mode_lib,
+ double TimeForFetchingRowInVBlankImmediateFlip;
+
+ if (VirtualMemoryEnable == true) {
+- mode_lib->vba.ImmediateFlipBW = BandwidthAvailableForImmediateFlip * ImmediateFlipBytes
+- / TotImmediateFlipBytes;
++ 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));
++ 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;
++ *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));
++ 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;
++ *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));
++ dml_max(
++ PDEAndMetaPTEBytesFrame
++ / (*DestinationLinesToRequestVMInImmediateFlip
++ * LineTime),
++ (MetaRowByte + PixelPTEBytesPerRow)
++ / (TimeForFetchingRowInVBlankImmediateFlip
++ * LineTime));
+ } else if (MetaRowByte + PixelPTEBytesPerRow > 0) {
+ *final_flip_bw = (MetaRowByte + PixelPTEBytesPerRow)
+- / (TimeForFetchingRowInVBlankImmediateFlip * LineTime);
++ / (TimeForFetchingRowInVBlankImmediateFlip * LineTime);
+ } else {
+ *final_flip_bw = 0;
+ }
+@@ -3223,12 +3842,13 @@ static void CalculateFlipSchedule(struct display_mode_lib *mode_lib,
+ min_row_time = meta_row_height * LineTime / VRatio;
+ else
+ min_row_time = dml_min(dpte_row_height, meta_row_height) * LineTime
+- / VRatio;
++ / VRatio;
+
+ if (*DestinationLinesToRequestVMInImmediateFlip >= 8
+ || *DestinationLinesToRequestRowInImmediateFlip >= 16
+ || TimeForFetchingMetaPTEImmediateFlip
+- + 2 * TimeForFetchingRowInVBlankImmediateFlip > min_row_time)
++ + 2 * TimeForFetchingRowInVBlankImmediateFlip
++ > min_row_time)
+ *ImmediateFlipSupportedForPipe = false;
+ else
+ *ImmediateFlipSupportedForPipe = true;
+@@ -3242,7 +3862,8 @@ static void PixelClockAdjustmentForProgressiveToInterlaceUnit(struct display_mod
+ //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) {
++ if (mode_lib->vba.Interlace[k] == 1
++ && mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true) {
+ mode_lib->vba.PixelClock[k] = 2 * mode_lib->vba.PixelClock[k];
+ }
+ }
+@@ -3261,3 +3882,2211 @@ static unsigned int CursorBppEnumToBits(enum cursor_bpp ebpp)
+ 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 0;
++ } else if (Format == dm_444) {
++ if (DecimalBPP >= 36)
++ return 36;
++ else if (DecimalBPP >= 30)
++ return 30;
++ else if (DecimalBPP >= 24)
++ return 24;
++ else
++ return 0;
++ } 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 0;
++ }
++ } else {
++ if (DSCEnabled) {
++ if (Format == dm_420) {
++ if (DecimalBPP < 6)
++ return 0;
++ 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 0;
++ 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 0;
++ 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 0;
++ } 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 0;
++ } else {
++ if (DecimalBPP >= 36)
++ return 36;
++ else if (DecimalBPP >= 30)
++ return 30;
++ else if (DecimalBPP >= 24)
++ return 24;
++ else
++ return 0;
++ }
++ }
++}
++
++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.0;
++ 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.0;
++ 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.0;
++ 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.0;
++ 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.0;
++ 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.0;
++ 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 == 0) {
++ 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 == 0
++ && 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 == 0) {
++ 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] = 0;
++ }
++ }
++ }
++ 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] == 0
++ || (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] == 0
++ || mode_lib->vba.OutputBppPerState[i][k] == 0) {
++ 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]);
++ }
++ 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
+index a24fe9a..346ffea 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.h
++++ b/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.h
+@@ -79,6 +79,11 @@ double get_total_prefetch_bw(
+ 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,
+@@ -96,42 +101,41 @@ struct vba_vars_st {
+ mode_evaluation_st me;
+
+ unsigned int MaximumMaxVStartupLines;
+- double cursor_bw[DC__NUM_PIPES__MAX];
+- double meta_row_bw[DC__NUM_PIPES__MAX];
+- double dpte_row_bw[DC__NUM_PIPES__MAX];
+- double qual_row_bw[DC__NUM_PIPES__MAX];
++ 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_PIPES__MAX];
+- double PSCL_THROUGHPUT_CHROMA[DC__NUM_PIPES__MAX];
++ double PSCL_THROUGHPUT_LUMA[DC__NUM_DPP__MAX];
++ double PSCL_THROUGHPUT_CHROMA[DC__NUM_DPP__MAX];
+ double DPPCLKUsingSingleDPPLuma;
+ double DPPCLKUsingSingleDPPChroma;
+- double DPPCLKUsingSingleDPP[DC__NUM_PIPES__MAX];
++ double DPPCLKUsingSingleDPP[DC__NUM_DPP__MAX];
+ double DISPCLKWithRamping;
+ double DISPCLKWithoutRamping;
+ double GlobalDPPCLK;
+- double MaxDispclk;
+ double DISPCLKWithRampingRoundedToDFSGranularity;
+ double DISPCLKWithoutRampingRoundedToDFSGranularity;
+ double MaxDispclkRoundedToDFSGranularity;
+ bool DCCEnabledAnyPlane;
+ double ReturnBandwidthToDCN;
+- unsigned int SwathWidthY[DC__NUM_PIPES__MAX];
+- unsigned int SwathWidthSingleDPPY[DC__NUM_PIPES__MAX];
+- double BytePerPixelDETY[DC__NUM_PIPES__MAX];
+- double BytePerPixelDETC[DC__NUM_PIPES__MAX];
+- double ReadBandwidthPlaneLuma[DC__NUM_PIPES__MAX];
+- double ReadBandwidthPlaneChroma[DC__NUM_PIPES__MAX];
++ 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_PIPES__MAX]; // WM
+- double DisplayPipeLineDeliveryTimeChroma[DC__NUM_PIPES__MAX]; // WM
+- double LinesInDETY[DC__NUM_PIPES__MAX]; // WM
+- double LinesInDETC[DC__NUM_PIPES__MAX]; // WM
+- unsigned int LinesInDETYRoundedDownToSwath[DC__NUM_PIPES__MAX]; // WM
+- unsigned int LinesInDETCRoundedDownToSwath[DC__NUM_PIPES__MAX]; // WM
+- double FullDETBufferingTimeY[DC__NUM_PIPES__MAX]; // WM
+- double FullDETBufferingTimeC[DC__NUM_PIPES__MAX]; // WM
++ 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;
+@@ -145,55 +149,54 @@ struct vba_vars_st {
+ double EffectiveDETPlusLBLinesChroma;
+ double UrgentLatencySupportUsLuma;
+ double UrgentLatencySupportUsChroma;
+- double UrgentLatencySupportUs[DC__NUM_PIPES__MAX];
++ double UrgentLatencySupportUs[DC__NUM_DPP__MAX];
+ unsigned int DSCFormatFactor;
+- unsigned int BlockHeight256BytesY[DC__NUM_PIPES__MAX];
+- unsigned int BlockHeight256BytesC[DC__NUM_PIPES__MAX];
+- unsigned int BlockWidth256BytesY[DC__NUM_PIPES__MAX];
+- unsigned int BlockWidth256BytesC[DC__NUM_PIPES__MAX];
+- double VInitPreFillY[DC__NUM_PIPES__MAX];
+- double VInitPreFillC[DC__NUM_PIPES__MAX];
+- unsigned int MaxNumSwathY[DC__NUM_PIPES__MAX];
+- unsigned int MaxNumSwathC[DC__NUM_PIPES__MAX];
+- double PrefetchSourceLinesY[DC__NUM_PIPES__MAX];
+- double PrefetchSourceLinesC[DC__NUM_PIPES__MAX];
+- double PixelPTEBytesPerRow[DC__NUM_PIPES__MAX];
+- double MetaRowByte[DC__NUM_PIPES__MAX];
+- bool PTEBufferSizeNotExceeded; // not used
+- unsigned int dpte_row_height[DC__NUM_PIPES__MAX];
+- unsigned int dpte_row_height_chroma[DC__NUM_PIPES__MAX];
+- unsigned int meta_row_height[DC__NUM_PIPES__MAX];
+- unsigned int meta_row_height_chroma[DC__NUM_PIPES__MAX];
+-
+- unsigned int MacroTileWidthY;
+- unsigned int MacroTileWidthC;
+- unsigned int MaxVStartupLines[DC__NUM_PIPES__MAX];
+- double WritebackDelay[DC__NUM_PIPES__MAX];
++ 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_PIPES__MAX];
+- bool AllowDRAMSelfRefreshDuringVBlank[DC__NUM_PIPES__MAX];
+- double RequiredPrefetchPixDataBW[DC__NUM_PIPES__MAX];
++ 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_PIPES__MAX];
++ double Tno_bw[DC__NUM_DPP__MAX];
+ bool ImmediateFlipSupported;
+
+- double prefetch_vm_bw[DC__NUM_PIPES__MAX];
+- double prefetch_row_bw[DC__NUM_PIPES__MAX];
+- bool ImmediateFlipSupportedForPipe[DC__NUM_PIPES__MAX];
++ 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_PIPES__MAX];
+- double DisplayPipeLineDeliveryTimeChromaPrefetch[DC__NUM_PIPES__MAX];
++ 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_PIPES__MAX];
++ double ActiveDRAMClockChangeLatencyMargin[DC__NUM_DPP__MAX];
+ double MinActiveDRAMClockChangeMargin;
+- double XFCSlaveVUpdateOffset[DC__NUM_PIPES__MAX];
+- double XFCSlaveVupdateWidth[DC__NUM_PIPES__MAX];
+- double XFCSlaveVReadyOffset[DC__NUM_PIPES__MAX];
++ double XFCSlaveVUpdateOffset[DC__NUM_DPP__MAX];
++ double XFCSlaveVupdateWidth[DC__NUM_DPP__MAX];
++ double XFCSlaveVReadyOffset[DC__NUM_DPP__MAX];
+ double InitFillLevel;
+ double FinalFillMargin;
+ double FinalFillLevel;
+@@ -276,71 +279,71 @@ struct vba_vars_st {
+ double DCFCLK;
+
+ unsigned int NumberOfActivePlanes;
+- unsigned int ViewportWidth[DC__NUM_DPP];
+- unsigned int ViewportHeight[DC__NUM_DPP];
+- unsigned int ViewportYStartY[DC__NUM_DPP];
+- unsigned int ViewportYStartC[DC__NUM_DPP];
+- unsigned int PitchY[DC__NUM_DPP];
+- unsigned int PitchC[DC__NUM_DPP];
+- double HRatio[DC__NUM_DPP];
+- double VRatio[DC__NUM_DPP];
+- unsigned int htaps[DC__NUM_DPP];
+- unsigned int vtaps[DC__NUM_DPP];
+- unsigned int HTAPsChroma[DC__NUM_DPP];
+- unsigned int VTAPsChroma[DC__NUM_DPP];
+- unsigned int HTotal[DC__NUM_DPP];
+- unsigned int VTotal[DC__NUM_DPP];
+- unsigned int DPPPerPlane[DC__NUM_DPP];
+- double PixelClock[DC__NUM_DPP];
+- double PixelClockBackEnd[DC__NUM_DPP];
+- double DPPCLK[DC__NUM_DPP];
+- bool DCCEnable[DC__NUM_DPP];
+- unsigned int DCCMetaPitchY[DC__NUM_DPP];
+- enum scan_direction_class SourceScan[DC__NUM_DPP];
+- enum source_format_class SourcePixelFormat[DC__NUM_DPP];
+- bool WritebackEnable[DC__NUM_DPP];
+- double WritebackDestinationWidth[DC__NUM_DPP];
+- double WritebackDestinationHeight[DC__NUM_DPP];
+- double WritebackSourceHeight[DC__NUM_DPP];
+- enum source_format_class WritebackPixelFormat[DC__NUM_DPP];
+- unsigned int WritebackLumaHTaps[DC__NUM_DPP];
+- unsigned int WritebackLumaVTaps[DC__NUM_DPP];
+- unsigned int WritebackChromaHTaps[DC__NUM_DPP];
+- unsigned int WritebackChromaVTaps[DC__NUM_DPP];
+- double WritebackHRatio[DC__NUM_DPP];
+- double WritebackVRatio[DC__NUM_DPP];
+- unsigned int HActive[DC__NUM_DPP];
+- unsigned int VActive[DC__NUM_DPP];
+- bool Interlace[DC__NUM_DPP];
+- enum dm_swizzle_mode SurfaceTiling[DC__NUM_DPP];
+- unsigned int ScalerRecoutWidth[DC__NUM_DPP];
+- bool DynamicMetadataEnable[DC__NUM_DPP];
+- unsigned int DynamicMetadataLinesBeforeActiveRequired[DC__NUM_DPP];
+- unsigned int DynamicMetadataTransmittedBytes[DC__NUM_DPP];
+- double DCCRate[DC__NUM_DPP];
+- bool ODMCombineEnabled[DC__NUM_DPP];
+- double OutputBpp[DC__NUM_DPP];
+- unsigned int NumberOfDSCSlices[DC__NUM_DPP];
+- bool DSCEnabled[DC__NUM_DPP];
+- unsigned int DSCDelay[DC__NUM_DPP];
+- unsigned int DSCInputBitPerComponent[DC__NUM_DPP];
+- enum output_format_class OutputFormat[DC__NUM_DPP];
+- enum output_encoder_class Output[DC__NUM_DPP];
+- unsigned int BlendingAndTiming[DC__NUM_DPP];
++ 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];
+- unsigned int CursorWidth[DC__NUM_DPP][DC__NUM_CURSOR];
+- unsigned int CursorBPP[DC__NUM_DPP][DC__NUM_CURSOR];
+- bool XFCEnabled[DC__NUM_DPP];
+- bool ScalerEnabled[DC__NUM_DPP];
++ unsigned int NumberOfCursors[DC__NUM_DPP__MAX];
++ unsigned int CursorWidth[DC__NUM_DPP__MAX][DC__NUM_CURSOR];
++ unsigned int CursorBPP[DC__NUM_DPP__MAX][DC__NUM_CURSOR];
++ bool XFCEnabled[DC__NUM_DPP__MAX];
++ bool ScalerEnabled[DC__NUM_DPP__MAX];
+
+ // Intermediates/Informational
+ bool ImmediateFlipSupport;
+- unsigned int SwathHeightY[DC__NUM_DPP];
+- unsigned int SwathHeightC[DC__NUM_DPP];
+- unsigned int DETBufferSizeY[DC__NUM_DPP];
+- unsigned int DETBufferSizeC[DC__NUM_DPP];
+- unsigned int LBBitPerPixel[DC__NUM_DPP];
++ 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;
+@@ -349,9 +352,9 @@ struct vba_vars_st {
+ double BandwidthAvailableForImmediateFlip;
+ unsigned int PrefetchMode;
+ bool IgnoreViewportPositioning;
+- double PrefetchBandwidth[DC__NUM_DPP];
+- bool ErrorResult[DC__NUM_DPP];
+- double PDEAndMetaPTEBytesFrame[DC__NUM_DPP];
++ double PrefetchBandwidth[DC__NUM_DPP__MAX];
++ bool ErrorResult[DC__NUM_DPP__MAX];
++ double PDEAndMetaPTEBytesFrame[DC__NUM_DPP__MAX];
+
+ //
+ // Calculated dml_ml->vba.Outputs
+@@ -376,35 +379,200 @@ struct vba_vars_st {
+ // 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];
+- double DPPCLK_calculated[DC__NUM_DPP];
++ double DSCCLK_calculated[DC__NUM_DPP__MAX];
++ double DPPCLK_calculated[DC__NUM_DPP__MAX];
+
+- unsigned int VStartup[DC__NUM_DPP];
++ unsigned int VStartup[DC__NUM_DPP__MAX];
+ unsigned int VStartupRequiredWhenNotEnoughTimeForDynamicMetadata;
+
+ double ImmediateFlipBW;
+ unsigned int TotImmediateFlipBytes;
+ double TCalc;
+- double MinTTUVBlank[DC__NUM_DPP];
+- double VRatioPrefetchY[DC__NUM_DPP];
+- double VRatioPrefetchC[DC__NUM_DPP];
+- double DSTXAfterScaler[DC__NUM_DPP];
+- double DSTYAfterScaler[DC__NUM_DPP];
+-
+- double DestinationLinesToRequestVMInVBlank[DC__NUM_DPP];
+- double DestinationLinesToRequestRowInVBlank[DC__NUM_DPP];
+- double DestinationLinesForPrefetch[DC__NUM_DPP];
+- double DestinationLinesToRequestRowInImmediateFlip[DC__NUM_DPP];
+- double DestinationLinesToRequestVMInImmediateFlip[DC__NUM_DPP];
+-
+- double XFCTransferDelay[DC__NUM_DPP];
+- double XFCPrechargeDelay[DC__NUM_DPP];
+- double XFCRemoteSurfaceFlipLatency[DC__NUM_DPP];
+- double XFCPrefetchMargin[DC__NUM_DPP];
+-
+- display_e2e_pipe_params_st cache_pipes[DC__NUM_DPP];
++ 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_PIPES__MAX];
++ 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;
++ double 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/dml_common_defs.c b/drivers/gpu/drm/amd/display/dc/dml/dml_common_defs.c
+index 9cbd415..2af6d15 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/dml_common_defs.c
++++ b/drivers/gpu/drm/amd/display/dc/dml/dml_common_defs.c
+@@ -35,6 +35,18 @@ double dml_max(double a, double b)
+ {
+ return (double) dcn_bw_max2(a, b);
+ }
++double dml_max3(double a, double b, double c)
++{
++ return dml_max(dml_max(a, b), c);
++}
++double dml_max4(double a, double b, double c, double d)
++{
++ return dml_max(dml_max(a, b), dml_max(c, d));
++}
++double dml_max5(double a, double b, double c, double d, double e)
++{
++ return dml_max(dml_max4(a, b, c, d), e);
++}
+
+ double dml_ceil(double a, double granularity)
+ {
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/dml_common_defs.h b/drivers/gpu/drm/amd/display/dc/dml/dml_common_defs.h
+index 19271e7..ba01bbb 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/dml_common_defs.h
++++ b/drivers/gpu/drm/amd/display/dc/dml/dml_common_defs.h
+@@ -36,6 +36,9 @@
+
+ double dml_min(double a, double b);
+ double dml_max(double a, double b);
++double dml_max3(double a, double b, double c);
++double dml_max4(double a, double b, double c, double d);
++double dml_max5(double a, double b, double c, double d, double e);
+ bool dml_util_is_420(enum source_format_class sorce_format);
+ double dml_ceil_ex(double x, double granularity);
+ double dml_floor_ex(double x, double granularity);
+--
+2.7.4
+