Acked-by: Andrey Grodzovsky <andrey.grodzovsky at amd.com> Thanks, Andrey On 01/18/2018 04:03 PM, Harry Wentland wrote: > We're currently not using this. > > Signed-off-by: Harry Wentland <harry.wentland at amd.com> > --- > .../gpu/drm/amd/display/dc/dml/display_mode_vba.c | 6085 -------------------- > 1 file changed, 6085 deletions(-) > delete mode 100644 drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c > > diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c b/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c > deleted file mode 100644 > index 260e113fcc02..000000000000 > --- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c > +++ /dev/null > @@ -1,6085 +0,0 @@ > -/* > - * Copyright 2017 Advanced Micro Devices, Inc. > - * > - * Permission is hereby granted, free of charge, to any person obtaining a > - * copy of this software and associated documentation files (the "Software"), > - * to deal in the Software without restriction, including without limitation > - * the rights to use, copy, modify, merge, publish, distribute, sublicense, > - * and/or sell copies of the Software, and to permit persons to whom the > - * Software is furnished to do so, subject to the following conditions: > - * > - * The above copyright notice and this permission notice shall be included in > - * all copies or substantial portions of the Software. > - * > - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > - * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR > - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > - * OTHER DEALINGS IN THE SOFTWARE. > - * > - * Authors: AMD > - * > - */ > - > -#include "display_mode_lib.h" > -#include "display_mode_vba.h" > - > -#include "dml_inline_defs.h" > - > -/* > - * NOTE: > - * This file is gcc-parseable HW gospel, coming straight from HW engineers. > - * > - * It doesn't adhere to Linux kernel style and sometimes will do things in odd > - * ways. Unless there is something clearly wrong with it the code should > - * remain as-is as it provides us with a guarantee from HW that it is correct. > - */ > - > -#define BPP_INVALID 0 > -#define BPP_BLENDED_PIPE 0xffffffff > -static const unsigned int NumberOfStates = DC__VOLTAGE_STATES; > - > -static void fetch_socbb_params(struct display_mode_lib *mode_lib); > -static void fetch_ip_params(struct display_mode_lib *mode_lib); > -static void fetch_pipe_params(struct display_mode_lib *mode_lib); > -static void recalculate_params( > - struct display_mode_lib *mode_lib, > - const display_e2e_pipe_params_st *pipes, > - unsigned int num_pipes); > -static void recalculate(struct display_mode_lib *mode_lib); > -static double adjust_ReturnBW( > - struct display_mode_lib *mode_lib, > - double ReturnBW, > - bool DCCEnabledAnyPlane, > - double ReturnBandwidthToDCN); > -static void ModeSupportAndSystemConfiguration(struct display_mode_lib *mode_lib); > -static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib); > -static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation( > - struct display_mode_lib *mode_lib); > -static unsigned int dscceComputeDelay( > - unsigned int bpc, > - double bpp, > - unsigned int sliceWidth, > - unsigned int numSlices, > - enum output_format_class pixelFormat); > -static unsigned int dscComputeDelay(enum output_format_class pixelFormat); > -// Super monster function with some 45 argument > -static bool CalculatePrefetchSchedule( > - struct display_mode_lib *mode_lib, > - double DPPCLK, > - double DISPCLK, > - double PixelClock, > - double DCFClkDeepSleep, > - unsigned int DSCDelay, > - unsigned int DPPPerPlane, > - bool ScalerEnabled, > - unsigned int NumberOfCursors, > - double DPPCLKDelaySubtotal, > - double DPPCLKDelaySCL, > - double DPPCLKDelaySCLLBOnly, > - double DPPCLKDelayCNVCFormater, > - double DPPCLKDelayCNVCCursor, > - double DISPCLKDelaySubtotal, > - unsigned int ScalerRecoutWidth, > - enum output_format_class OutputFormat, > - unsigned int VBlank, > - unsigned int HTotal, > - unsigned int MaxInterDCNTileRepeaters, > - unsigned int VStartup, > - unsigned int PageTableLevels, > - bool VirtualMemoryEnable, > - bool DynamicMetadataEnable, > - unsigned int DynamicMetadataLinesBeforeActiveRequired, > - unsigned int DynamicMetadataTransmittedBytes, > - bool DCCEnable, > - double UrgentLatency, > - double UrgentExtraLatency, > - double TCalc, > - unsigned int PDEAndMetaPTEBytesFrame, > - unsigned int MetaRowByte, > - unsigned int PixelPTEBytesPerRow, > - double PrefetchSourceLinesY, > - unsigned int SwathWidthY, > - double BytePerPixelDETY, > - double VInitPreFillY, > - unsigned int MaxNumSwathY, > - double PrefetchSourceLinesC, > - double BytePerPixelDETC, > - double VInitPreFillC, > - unsigned int MaxNumSwathC, > - unsigned int SwathHeightY, > - unsigned int SwathHeightC, > - double TWait, > - bool XFCEnabled, > - double XFCRemoteSurfaceFlipDelay, > - bool InterlaceEnable, > - bool ProgressiveToInterlaceUnitInOPP, > - double *DSTXAfterScaler, > - double *DSTYAfterScaler, > - double *DestinationLinesForPrefetch, > - double *PrefetchBandwidth, > - double *DestinationLinesToRequestVMInVBlank, > - double *DestinationLinesToRequestRowInVBlank, > - double *VRatioPrefetchY, > - double *VRatioPrefetchC, > - double *RequiredPrefetchPixDataBW, > - unsigned int *VStartupRequiredWhenNotEnoughTimeForDynamicMetadata, > - double *Tno_bw, > - unsigned int *VUpdateOffsetPix, > - unsigned int *VUpdateWidthPix, > - unsigned int *VReadyOffsetPix); > -static double RoundToDFSGranularityUp(double Clock, double VCOSpeed); > -static double RoundToDFSGranularityDown(double Clock, double VCOSpeed); > -static double CalculatePrefetchSourceLines( > - struct display_mode_lib *mode_lib, > - double VRatio, > - double vtaps, > - bool Interlace, > - bool ProgressiveToInterlaceUnitInOPP, > - unsigned int SwathHeight, > - unsigned int ViewportYStart, > - double *VInitPreFill, > - unsigned int *MaxNumSwath); > -static unsigned int CalculateVMAndRowBytes( > - struct display_mode_lib *mode_lib, > - bool DCCEnable, > - unsigned int BlockHeight256Bytes, > - unsigned int BlockWidth256Bytes, > - enum source_format_class SourcePixelFormat, > - unsigned int SurfaceTiling, > - unsigned int BytePerPixel, > - enum scan_direction_class ScanDirection, > - unsigned int ViewportWidth, > - unsigned int ViewportHeight, > - unsigned int SwathWidthY, > - bool VirtualMemoryEnable, > - unsigned int VMMPageSize, > - unsigned int PTEBufferSizeInRequests, > - unsigned int PDEProcessingBufIn64KBReqs, > - unsigned int Pitch, > - unsigned int DCCMetaPitch, > - unsigned int *MacroTileWidth, > - unsigned int *MetaRowByte, > - unsigned int *PixelPTEBytesPerRow, > - bool *PTEBufferSizeNotExceeded, > - unsigned int *dpte_row_height, > - unsigned int *meta_row_height); > -static double CalculateTWait( > - unsigned int PrefetchMode, > - double DRAMClockChangeLatency, > - double UrgentLatency, > - double SREnterPlusExitTime); > -static double CalculateRemoteSurfaceFlipDelay( > - struct display_mode_lib *mode_lib, > - double VRatio, > - double SwathWidth, > - double Bpp, > - double LineTime, > - double XFCTSlvVupdateOffset, > - double XFCTSlvVupdateWidth, > - double XFCTSlvVreadyOffset, > - double XFCXBUFLatencyTolerance, > - double XFCFillBWOverhead, > - double XFCSlvChunkSize, > - double XFCBusTransportTime, > - double TCalc, > - double TWait, > - double *SrcActiveDrainRate, > - double *TInitXFill, > - double *TslvChk); > -static double CalculateWriteBackDISPCLK( > - enum source_format_class WritebackPixelFormat, > - double PixelClock, > - double WritebackHRatio, > - double WritebackVRatio, > - unsigned int WritebackLumaHTaps, > - unsigned int WritebackLumaVTaps, > - unsigned int WritebackChromaHTaps, > - unsigned int WritebackChromaVTaps, > - double WritebackDestinationWidth, > - unsigned int HTotal, > - unsigned int WritebackChromaLineBufferWidth); > -static void CalculateActiveRowBandwidth( > - bool VirtualMemoryEnable, > - enum source_format_class SourcePixelFormat, > - double VRatio, > - bool DCCEnable, > - double LineTime, > - unsigned int MetaRowByteLuma, > - unsigned int MetaRowByteChroma, > - unsigned int meta_row_height_luma, > - unsigned int meta_row_height_chroma, > - unsigned int PixelPTEBytesPerRowLuma, > - unsigned int PixelPTEBytesPerRowChroma, > - unsigned int dpte_row_height_luma, > - unsigned int dpte_row_height_chroma, > - double *meta_row_bw, > - double *dpte_row_bw, > - double *qual_row_bw); > -static void CalculateFlipSchedule( > - struct display_mode_lib *mode_lib, > - double UrgentExtraLatency, > - double UrgentLatency, > - unsigned int MaxPageTableLevels, > - bool VirtualMemoryEnable, > - double BandwidthAvailableForImmediateFlip, > - unsigned int TotImmediateFlipBytes, > - enum source_format_class SourcePixelFormat, > - unsigned int ImmediateFlipBytes, > - double LineTime, > - double Tno_bw, > - double VRatio, > - double PDEAndMetaPTEBytesFrame, > - unsigned int MetaRowByte, > - unsigned int PixelPTEBytesPerRow, > - bool DCCEnable, > - unsigned int dpte_row_height, > - unsigned int meta_row_height, > - double qual_row_bw, > - double *DestinationLinesToRequestVMInImmediateFlip, > - double *DestinationLinesToRequestRowInImmediateFlip, > - double *final_flip_bw, > - bool *ImmediateFlipSupportedForPipe); > -static double CalculateWriteBackDelay( > - enum source_format_class WritebackPixelFormat, > - double WritebackHRatio, > - double WritebackVRatio, > - unsigned int WritebackLumaHTaps, > - unsigned int WritebackLumaVTaps, > - unsigned int WritebackChromaHTaps, > - unsigned int WritebackChromaVTaps, > - unsigned int WritebackDestinationWidth); > -static void PixelClockAdjustmentForProgressiveToInterlaceUnit(struct display_mode_lib *mode_lib); > -static unsigned int CursorBppEnumToBits(enum cursor_bpp ebpp); > -static void ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib); > - > -void set_prefetch_mode( > - struct display_mode_lib *mode_lib, > - bool cstate_en, > - bool pstate_en, > - bool ignore_viewport_pos, > - bool immediate_flip_support) > -{ > - unsigned int prefetch_mode; > - > - if (cstate_en && pstate_en) > - prefetch_mode = 0; > - else if (cstate_en) > - prefetch_mode = 1; > - else > - prefetch_mode = 2; > - if (prefetch_mode != mode_lib->vba.PrefetchMode > - || ignore_viewport_pos != mode_lib->vba.IgnoreViewportPositioning > - || immediate_flip_support != mode_lib->vba.ImmediateFlipSupport) { > - DTRACE( > - " Prefetch mode has changed from %i to %i. Recalculating.", > - prefetch_mode, > - mode_lib->vba.PrefetchMode); > - mode_lib->vba.PrefetchMode = prefetch_mode; > - mode_lib->vba.IgnoreViewportPositioning = ignore_viewport_pos; > - mode_lib->vba.ImmediateFlipSupport = immediate_flip_support; > - recalculate(mode_lib); > - } > -} > - > -unsigned int dml_get_voltage_level( > - struct display_mode_lib *mode_lib, > - const display_e2e_pipe_params_st *pipes, > - unsigned int num_pipes) > -{ > - bool need_recalculate = memcmp(&mode_lib->soc, &mode_lib->vba.soc, sizeof(mode_lib->vba.soc)) != 0 > - || memcmp(&mode_lib->ip, &mode_lib->vba.ip, sizeof(mode_lib->vba.ip)) != 0 > - || num_pipes != mode_lib->vba.cache_num_pipes > - || memcmp(pipes, mode_lib->vba.cache_pipes, > - sizeof(display_e2e_pipe_params_st) * num_pipes) != 0; > - > - mode_lib->vba.soc = mode_lib->soc; > - mode_lib->vba.ip = mode_lib->ip; > - memcpy(mode_lib->vba.cache_pipes, pipes, sizeof(*pipes) * num_pipes); > - mode_lib->vba.cache_num_pipes = num_pipes; > - > - if (need_recalculate && pipes[0].clks_cfg.dppclk_mhz != 0) > - recalculate(mode_lib); > - else { > - fetch_socbb_params(mode_lib); > - fetch_ip_params(mode_lib); > - fetch_pipe_params(mode_lib); > - } > - ModeSupportAndSystemConfigurationFull(mode_lib); > - > - return mode_lib->vba.VoltageLevel; > -} > - > -#define dml_get_attr_func(attr, var) double get_##attr(struct display_mode_lib *mode_lib, const display_e2e_pipe_params_st *pipes, unsigned int num_pipes) \ > -{ \ > - recalculate_params(mode_lib, pipes, num_pipes); \ > - return var; \ > -} > - > -dml_get_attr_func(clk_dcf_deepsleep, mode_lib->vba.DCFClkDeepSleep); > -dml_get_attr_func(wm_urgent, mode_lib->vba.UrgentWatermark); > -dml_get_attr_func(wm_memory_trip, mode_lib->vba.MemoryTripWatermark); > -dml_get_attr_func(wm_writeback_urgent, mode_lib->vba.WritebackUrgentWatermark); > -dml_get_attr_func(wm_stutter_exit, mode_lib->vba.StutterExitWatermark); > -dml_get_attr_func(wm_stutter_enter_exit, mode_lib->vba.StutterEnterPlusExitWatermark); > -dml_get_attr_func(wm_dram_clock_change, mode_lib->vba.DRAMClockChangeWatermark); > -dml_get_attr_func(wm_writeback_dram_clock_change, mode_lib->vba.WritebackDRAMClockChangeWatermark); > -dml_get_attr_func(wm_xfc_underflow, mode_lib->vba.UrgentWatermark); // xfc_underflow maps to urgent > -dml_get_attr_func(stutter_efficiency, mode_lib->vba.StutterEfficiency); > -dml_get_attr_func(stutter_efficiency_no_vblank, mode_lib->vba.StutterEfficiencyNotIncludingVBlank); > -dml_get_attr_func(urgent_latency, mode_lib->vba.MinUrgentLatencySupportUs); > -dml_get_attr_func(urgent_extra_latency, mode_lib->vba.UrgentExtraLatency); > -dml_get_attr_func(nonurgent_latency, mode_lib->vba.NonUrgentLatencyTolerance); > -dml_get_attr_func( > - dram_clock_change_latency, > - mode_lib->vba.MinActiveDRAMClockChangeLatencySupported); > -dml_get_attr_func(dispclk_calculated, mode_lib->vba.DISPCLK_calculated); > -dml_get_attr_func(total_data_read_bw, mode_lib->vba.TotalDataReadBandwidth); > -dml_get_attr_func(return_bw, mode_lib->vba.ReturnBW); > -dml_get_attr_func(tcalc, mode_lib->vba.TCalc); > - > -#define dml_get_pipe_attr_func(attr, var) double get_##attr(struct display_mode_lib *mode_lib, const display_e2e_pipe_params_st *pipes, unsigned int num_pipes, unsigned int which_pipe) \ > -{\ > - unsigned int which_plane; \ > - recalculate_params(mode_lib, pipes, num_pipes); \ > - which_plane = mode_lib->vba.pipe_plane[which_pipe]; \ > - return var[which_plane]; \ > -} > - > -dml_get_pipe_attr_func(dsc_delay, mode_lib->vba.DSCDelay); > -dml_get_pipe_attr_func(dppclk_calculated, mode_lib->vba.DPPCLK_calculated); > -dml_get_pipe_attr_func(dscclk_calculated, mode_lib->vba.DSCCLK_calculated); > -dml_get_pipe_attr_func(min_ttu_vblank, mode_lib->vba.MinTTUVBlank); > -dml_get_pipe_attr_func(vratio_prefetch_l, mode_lib->vba.VRatioPrefetchY); > -dml_get_pipe_attr_func(vratio_prefetch_c, mode_lib->vba.VRatioPrefetchC); > -dml_get_pipe_attr_func(dst_x_after_scaler, mode_lib->vba.DSTXAfterScaler); > -dml_get_pipe_attr_func(dst_y_after_scaler, mode_lib->vba.DSTYAfterScaler); > -dml_get_pipe_attr_func(dst_y_per_vm_vblank, mode_lib->vba.DestinationLinesToRequestVMInVBlank); > -dml_get_pipe_attr_func(dst_y_per_row_vblank, mode_lib->vba.DestinationLinesToRequestRowInVBlank); > -dml_get_pipe_attr_func(dst_y_prefetch, mode_lib->vba.DestinationLinesForPrefetch); > -dml_get_pipe_attr_func(dst_y_per_vm_flip, mode_lib->vba.DestinationLinesToRequestVMInImmediateFlip); > -dml_get_pipe_attr_func( > - dst_y_per_row_flip, > - mode_lib->vba.DestinationLinesToRequestRowInImmediateFlip); > - > -dml_get_pipe_attr_func(xfc_transfer_delay, mode_lib->vba.XFCTransferDelay); > -dml_get_pipe_attr_func(xfc_precharge_delay, mode_lib->vba.XFCPrechargeDelay); > -dml_get_pipe_attr_func(xfc_remote_surface_flip_latency, mode_lib->vba.XFCRemoteSurfaceFlipLatency); > -dml_get_pipe_attr_func(xfc_prefetch_margin, mode_lib->vba.XFCPrefetchMargin); > - > -unsigned int get_vstartup_calculated( > - struct display_mode_lib *mode_lib, > - const display_e2e_pipe_params_st *pipes, > - unsigned int num_pipes, > - unsigned int which_pipe) > -{ > - unsigned int which_plane; > - > - recalculate_params(mode_lib, pipes, num_pipes); > - which_plane = mode_lib->vba.pipe_plane[which_pipe]; > - return mode_lib->vba.VStartup[which_plane]; > -} > - > -double get_total_immediate_flip_bytes( > - struct display_mode_lib *mode_lib, > - const display_e2e_pipe_params_st *pipes, > - unsigned int num_pipes) > -{ > - recalculate_params(mode_lib, pipes, num_pipes); > - return mode_lib->vba.TotImmediateFlipBytes; > -} > - > -double get_total_immediate_flip_bw( > - struct display_mode_lib *mode_lib, > - const display_e2e_pipe_params_st *pipes, > - unsigned int num_pipes) > -{ > - recalculate_params(mode_lib, pipes, num_pipes); > - return mode_lib->vba.ImmediateFlipBW; > -} > - > -double get_total_prefetch_bw( > - struct display_mode_lib *mode_lib, > - const display_e2e_pipe_params_st *pipes, > - unsigned int num_pipes) > -{ > - unsigned int k; > - double total_prefetch_bw = 0.0; > - > - recalculate_params(mode_lib, pipes, num_pipes); > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) > - total_prefetch_bw += mode_lib->vba.PrefetchBandwidth[k]; > - return total_prefetch_bw; > -} > - > -static void fetch_socbb_params(struct display_mode_lib *mode_lib) > -{ > - soc_bounding_box_st *soc = &mode_lib->vba.soc; > - unsigned int i; > - > - // SOC Bounding Box Parameters > - mode_lib->vba.ReturnBusWidth = soc->return_bus_width_bytes; > - mode_lib->vba.NumberOfChannels = soc->num_chans; > - mode_lib->vba.PercentOfIdealDRAMAndFabricBWReceivedAfterUrgLatency = > - soc->ideal_dram_bw_after_urgent_percent; // there's always that one bastard variable that's so long it throws everything out of alignment! > - mode_lib->vba.UrgentLatency = soc->urgent_latency_us; > - mode_lib->vba.RoundTripPingLatencyCycles = soc->round_trip_ping_latency_dcfclk_cycles; > - mode_lib->vba.UrgentOutOfOrderReturnPerChannel = > - soc->urgent_out_of_order_return_per_channel_bytes; > - mode_lib->vba.WritebackLatency = soc->writeback_latency_us; > - mode_lib->vba.SRExitTime = soc->sr_exit_time_us; > - mode_lib->vba.SREnterPlusExitTime = soc->sr_enter_plus_exit_time_us; > - mode_lib->vba.DRAMClockChangeLatency = soc->dram_clock_change_latency_us; > - mode_lib->vba.Downspreading = soc->downspread_percent; > - mode_lib->vba.DRAMChannelWidth = soc->dram_channel_width_bytes; // new! > - mode_lib->vba.FabricDatapathToDCNDataReturn = soc->fabric_datapath_to_dcn_data_return_bytes; // new! > - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading = soc->dcn_downspread_percent; // new > - mode_lib->vba.DISPCLKDPPCLKVCOSpeed = soc->dispclk_dppclk_vco_speed_mhz; // new > - mode_lib->vba.VMMPageSize = soc->vmm_page_size_bytes; > - // Set the voltage scaling clocks as the defaults. Most of these will > - // be set to different values by the test > - for (i = 0; i < DC__VOLTAGE_STATES; i++) > - if (soc->clock_limits[i].state == mode_lib->vba.VoltageLevel) > - break; > - > - mode_lib->vba.DCFCLK = soc->clock_limits[i].dcfclk_mhz; > - mode_lib->vba.SOCCLK = soc->clock_limits[i].socclk_mhz; > - mode_lib->vba.DRAMSpeed = soc->clock_limits[i].dram_speed_mhz; > - mode_lib->vba.FabricClock = soc->clock_limits[i].fabricclk_mhz; > - > - mode_lib->vba.XFCBusTransportTime = soc->xfc_bus_transport_time_us; > - mode_lib->vba.XFCXBUFLatencyTolerance = soc->xfc_xbuf_latency_tolerance_us; > - > - mode_lib->vba.SupportGFX7CompatibleTilingIn32bppAnd64bpp = false; > - mode_lib->vba.MaxHSCLRatio = 4; > - mode_lib->vba.MaxVSCLRatio = 4; > - mode_lib->vba.MaxNumWriteback = 0; /*TODO*/ > - mode_lib->vba.WritebackLumaAndChromaScalingSupported = true; > - mode_lib->vba.Cursor64BppSupport = true; > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - mode_lib->vba.DCFCLKPerState[i] = soc->clock_limits[i].dcfclk_mhz; > - mode_lib->vba.FabricClockPerState[i] = soc->clock_limits[i].fabricclk_mhz; > - mode_lib->vba.SOCCLKPerState[i] = soc->clock_limits[i].socclk_mhz; > - mode_lib->vba.PHYCLKPerState[i] = soc->clock_limits[i].phyclk_mhz; > - mode_lib->vba.MaxDppclk[i] = soc->clock_limits[i].dppclk_mhz; > - mode_lib->vba.MaxDSCCLK[i] = soc->clock_limits[i].dscclk_mhz; > - mode_lib->vba.DRAMSpeedPerState[i] = soc->clock_limits[i].dram_speed_mhz; > - mode_lib->vba.MaxDispclk[i] = soc->clock_limits[i].dispclk_mhz; > - } > -} > - > -static void fetch_ip_params(struct display_mode_lib *mode_lib) > -{ > - ip_params_st *ip = &mode_lib->vba.ip; > - > - // IP Parameters > - mode_lib->vba.MaxNumDPP = ip->max_num_dpp; > - mode_lib->vba.MaxNumOTG = ip->max_num_otg; > - mode_lib->vba.CursorChunkSize = ip->cursor_chunk_size; > - mode_lib->vba.CursorBufferSize = ip->cursor_buffer_size; > - > - mode_lib->vba.MaxDCHUBToPSCLThroughput = ip->max_dchub_pscl_bw_pix_per_clk; > - mode_lib->vba.MaxPSCLToLBThroughput = ip->max_pscl_lb_bw_pix_per_clk; > - mode_lib->vba.ROBBufferSizeInKByte = ip->rob_buffer_size_kbytes; > - mode_lib->vba.DETBufferSizeInKByte = ip->det_buffer_size_kbytes; > - mode_lib->vba.PixelChunkSizeInKByte = ip->pixel_chunk_size_kbytes; > - mode_lib->vba.MetaChunkSize = ip->meta_chunk_size_kbytes; > - mode_lib->vba.PTEChunkSize = ip->pte_chunk_size_kbytes; > - mode_lib->vba.WritebackChunkSize = ip->writeback_chunk_size_kbytes; > - mode_lib->vba.LineBufferSize = ip->line_buffer_size_bits; > - mode_lib->vba.MaxLineBufferLines = ip->max_line_buffer_lines; > - mode_lib->vba.PTEBufferSizeInRequests = ip->dpte_buffer_size_in_pte_reqs; > - mode_lib->vba.DPPOutputBufferPixels = ip->dpp_output_buffer_pixels; > - mode_lib->vba.OPPOutputBufferLines = ip->opp_output_buffer_lines; > - mode_lib->vba.WritebackInterfaceLumaBufferSize = ip->writeback_luma_buffer_size_kbytes; > - mode_lib->vba.WritebackInterfaceChromaBufferSize = ip->writeback_chroma_buffer_size_kbytes; > - mode_lib->vba.WritebackChromaLineBufferWidth = > - ip->writeback_chroma_line_buffer_width_pixels; > - mode_lib->vba.MaxPageTableLevels = ip->max_page_table_levels; > - mode_lib->vba.MaxInterDCNTileRepeaters = ip->max_inter_dcn_tile_repeaters; > - mode_lib->vba.NumberOfDSC = ip->num_dsc; > - mode_lib->vba.ODMCapability = ip->odm_capable; > - mode_lib->vba.DISPCLKRampingMargin = ip->dispclk_ramp_margin_percent; > - > - mode_lib->vba.XFCSupported = ip->xfc_supported; > - mode_lib->vba.XFCFillBWOverhead = ip->xfc_fill_bw_overhead_percent; > - mode_lib->vba.XFCFillConstant = ip->xfc_fill_constant_bytes; > - mode_lib->vba.DPPCLKDelaySubtotal = ip->dppclk_delay_subtotal; > - mode_lib->vba.DPPCLKDelaySCL = ip->dppclk_delay_scl; > - mode_lib->vba.DPPCLKDelaySCLLBOnly = ip->dppclk_delay_scl_lb_only; > - mode_lib->vba.DPPCLKDelayCNVCFormater = ip->dppclk_delay_cnvc_formatter; > - mode_lib->vba.DPPCLKDelayCNVCCursor = ip->dppclk_delay_cnvc_cursor; > - mode_lib->vba.DISPCLKDelaySubtotal = ip->dispclk_delay_subtotal; > - > - mode_lib->vba.ProgressiveToInterlaceUnitInOPP = ip->ptoi_supported; > - > - mode_lib->vba.PDEProcessingBufIn64KBReqs = ip->pde_proc_buffer_size_64k_reqs; > -} > - > -static void fetch_pipe_params(struct display_mode_lib *mode_lib) > -{ > - display_e2e_pipe_params_st *pipes = mode_lib->vba.cache_pipes; > - ip_params_st *ip = &mode_lib->vba.ip; > - > - unsigned int OTGInstPlane[DC__NUM_DPP__MAX]; > - unsigned int j, k; > - bool PlaneVisited[DC__NUM_DPP__MAX]; > - bool visited[DC__NUM_DPP__MAX]; > - > - // Convert Pipes to Planes > - for (k = 0; k < mode_lib->vba.cache_num_pipes; ++k) > - visited[k] = false; > - > - mode_lib->vba.NumberOfActivePlanes = 0; > - for (j = 0; j < mode_lib->vba.cache_num_pipes; ++j) { > - display_pipe_source_params_st *src = &pipes[j].pipe.src; > - display_pipe_dest_params_st *dst = &pipes[j].pipe.dest; > - scaler_ratio_depth_st *scl = &pipes[j].pipe.scale_ratio_depth; > - scaler_taps_st *taps = &pipes[j].pipe.scale_taps; > - display_output_params_st *dout = &pipes[j].dout; > - display_clocks_and_cfg_st *clks = &pipes[j].clks_cfg; > - > - if (visited[j]) > - continue; > - visited[j] = true; > - > - mode_lib->vba.pipe_plane[j] = mode_lib->vba.NumberOfActivePlanes; > - > - mode_lib->vba.DPPPerPlane[mode_lib->vba.NumberOfActivePlanes] = 1; > - mode_lib->vba.SourceScan[mode_lib->vba.NumberOfActivePlanes] = > - (enum scan_direction_class) (src->source_scan); > - mode_lib->vba.ViewportWidth[mode_lib->vba.NumberOfActivePlanes] = > - src->viewport_width; > - mode_lib->vba.ViewportHeight[mode_lib->vba.NumberOfActivePlanes] = > - src->viewport_height; > - mode_lib->vba.ViewportYStartY[mode_lib->vba.NumberOfActivePlanes] = > - src->viewport_y_y; > - mode_lib->vba.ViewportYStartC[mode_lib->vba.NumberOfActivePlanes] = > - src->viewport_y_c; > - mode_lib->vba.PitchY[mode_lib->vba.NumberOfActivePlanes] = src->data_pitch; > - mode_lib->vba.PitchC[mode_lib->vba.NumberOfActivePlanes] = src->data_pitch_c; > - mode_lib->vba.DCCMetaPitchY[mode_lib->vba.NumberOfActivePlanes] = src->meta_pitch; > - mode_lib->vba.HRatio[mode_lib->vba.NumberOfActivePlanes] = scl->hscl_ratio; > - mode_lib->vba.VRatio[mode_lib->vba.NumberOfActivePlanes] = scl->vscl_ratio; > - mode_lib->vba.ScalerEnabled[mode_lib->vba.NumberOfActivePlanes] = scl->scl_enable; > - mode_lib->vba.Interlace[mode_lib->vba.NumberOfActivePlanes] = dst->interlaced; > - if (mode_lib->vba.Interlace[mode_lib->vba.NumberOfActivePlanes]) > - mode_lib->vba.VRatio[mode_lib->vba.NumberOfActivePlanes] *= 2.0; > - mode_lib->vba.htaps[mode_lib->vba.NumberOfActivePlanes] = taps->htaps; > - mode_lib->vba.vtaps[mode_lib->vba.NumberOfActivePlanes] = taps->vtaps; > - mode_lib->vba.HTAPsChroma[mode_lib->vba.NumberOfActivePlanes] = taps->htaps_c; > - mode_lib->vba.VTAPsChroma[mode_lib->vba.NumberOfActivePlanes] = taps->vtaps_c; > - mode_lib->vba.HTotal[mode_lib->vba.NumberOfActivePlanes] = dst->htotal; > - mode_lib->vba.VTotal[mode_lib->vba.NumberOfActivePlanes] = dst->vtotal; > - mode_lib->vba.DCCEnable[mode_lib->vba.NumberOfActivePlanes] = > - src->dcc_use_global ? > - ip->dcc_supported : src->dcc && ip->dcc_supported; > - mode_lib->vba.DCCRate[mode_lib->vba.NumberOfActivePlanes] = src->dcc_rate; > - mode_lib->vba.SourcePixelFormat[mode_lib->vba.NumberOfActivePlanes] = > - (enum source_format_class) (src->source_format); > - mode_lib->vba.HActive[mode_lib->vba.NumberOfActivePlanes] = dst->hactive; > - mode_lib->vba.VActive[mode_lib->vba.NumberOfActivePlanes] = dst->vactive; > - mode_lib->vba.SurfaceTiling[mode_lib->vba.NumberOfActivePlanes] = > - (enum dm_swizzle_mode) (src->sw_mode); > - mode_lib->vba.ScalerRecoutWidth[mode_lib->vba.NumberOfActivePlanes] = > - dst->recout_width; // TODO: or should this be full_recout_width???...maybe only when in hsplit mode? > - mode_lib->vba.ODMCombineEnabled[mode_lib->vba.NumberOfActivePlanes] = > - dst->odm_combine; > - mode_lib->vba.OutputFormat[mode_lib->vba.NumberOfActivePlanes] = > - (enum output_format_class) (dout->output_format); > - mode_lib->vba.Output[mode_lib->vba.NumberOfActivePlanes] = > - (enum output_encoder_class) (dout->output_type); > - mode_lib->vba.OutputBpp[mode_lib->vba.NumberOfActivePlanes] = dout->output_bpp; > - mode_lib->vba.OutputLinkDPLanes[mode_lib->vba.NumberOfActivePlanes] = > - dout->dp_lanes; > - mode_lib->vba.DSCEnabled[mode_lib->vba.NumberOfActivePlanes] = dout->dsc_enable; > - mode_lib->vba.NumberOfDSCSlices[mode_lib->vba.NumberOfActivePlanes] = > - dout->dsc_slices; > - mode_lib->vba.DSCInputBitPerComponent[mode_lib->vba.NumberOfActivePlanes] = > - dout->opp_input_bpc == 0 ? 12 : dout->opp_input_bpc; > - mode_lib->vba.WritebackEnable[mode_lib->vba.NumberOfActivePlanes] = dout->wb_enable; > - mode_lib->vba.WritebackSourceHeight[mode_lib->vba.NumberOfActivePlanes] = > - dout->wb.wb_src_height; > - mode_lib->vba.WritebackDestinationWidth[mode_lib->vba.NumberOfActivePlanes] = > - dout->wb.wb_dst_width; > - mode_lib->vba.WritebackDestinationHeight[mode_lib->vba.NumberOfActivePlanes] = > - dout->wb.wb_dst_height; > - mode_lib->vba.WritebackPixelFormat[mode_lib->vba.NumberOfActivePlanes] = > - (enum source_format_class) (dout->wb.wb_pixel_format); > - mode_lib->vba.WritebackLumaHTaps[mode_lib->vba.NumberOfActivePlanes] = > - dout->wb.wb_htaps_luma; > - mode_lib->vba.WritebackLumaVTaps[mode_lib->vba.NumberOfActivePlanes] = > - dout->wb.wb_vtaps_luma; > - mode_lib->vba.WritebackChromaHTaps[mode_lib->vba.NumberOfActivePlanes] = > - dout->wb.wb_htaps_chroma; > - mode_lib->vba.WritebackChromaVTaps[mode_lib->vba.NumberOfActivePlanes] = > - dout->wb.wb_vtaps_chroma; > - mode_lib->vba.WritebackHRatio[mode_lib->vba.NumberOfActivePlanes] = > - dout->wb.wb_hratio; > - mode_lib->vba.WritebackVRatio[mode_lib->vba.NumberOfActivePlanes] = > - dout->wb.wb_vratio; > - > - mode_lib->vba.DynamicMetadataEnable[mode_lib->vba.NumberOfActivePlanes] = > - src->dynamic_metadata_enable; > - mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired[mode_lib->vba.NumberOfActivePlanes] = > - src->dynamic_metadata_lines_before_active; > - mode_lib->vba.DynamicMetadataTransmittedBytes[mode_lib->vba.NumberOfActivePlanes] = > - src->dynamic_metadata_xmit_bytes; > - > - mode_lib->vba.XFCEnabled[mode_lib->vba.NumberOfActivePlanes] = src->xfc_enable > - && ip->xfc_supported; > - mode_lib->vba.XFCSlvChunkSize = src->xfc_params.xfc_slv_chunk_size_bytes; > - mode_lib->vba.XFCTSlvVupdateOffset = src->xfc_params.xfc_tslv_vupdate_offset_us; > - mode_lib->vba.XFCTSlvVupdateWidth = src->xfc_params.xfc_tslv_vupdate_width_us; > - mode_lib->vba.XFCTSlvVreadyOffset = src->xfc_params.xfc_tslv_vready_offset_us; > - mode_lib->vba.PixelClock[mode_lib->vba.NumberOfActivePlanes] = dst->pixel_rate_mhz; > - mode_lib->vba.DPPCLK[mode_lib->vba.NumberOfActivePlanes] = clks->dppclk_mhz; > - if (ip->is_line_buffer_bpp_fixed) > - mode_lib->vba.LBBitPerPixel[mode_lib->vba.NumberOfActivePlanes] = > - ip->line_buffer_fixed_bpp; > - else { > - unsigned int lb_depth; > - > - switch (scl->lb_depth) { > - case dm_lb_6: > - lb_depth = 18; > - break; > - case dm_lb_8: > - lb_depth = 24; > - break; > - case dm_lb_10: > - lb_depth = 30; > - break; > - case dm_lb_12: > - lb_depth = 36; > - break; > - case dm_lb_16: > - lb_depth = 48; > - break; > - default: > - lb_depth = 36; > - } > - mode_lib->vba.LBBitPerPixel[mode_lib->vba.NumberOfActivePlanes] = lb_depth; > - } > - mode_lib->vba.NumberOfCursors[mode_lib->vba.NumberOfActivePlanes] = 0; > - // The DML spreadsheet assumes that the two cursors utilize the same amount of bandwidth. We'll > - // calculate things a little more accurately > - for (k = 0; k < DC__NUM_CURSOR__MAX; ++k) { > - switch (k) { > - case 0: > - mode_lib->vba.CursorBPP[mode_lib->vba.NumberOfActivePlanes][0] = > - CursorBppEnumToBits( > - (enum cursor_bpp) (src->cur0_bpp)); > - mode_lib->vba.CursorWidth[mode_lib->vba.NumberOfActivePlanes][0] = > - src->cur0_src_width; > - if (src->cur0_src_width > 0) > - mode_lib->vba.NumberOfCursors[mode_lib->vba.NumberOfActivePlanes]++; > - break; > - case 1: > - mode_lib->vba.CursorBPP[mode_lib->vba.NumberOfActivePlanes][1] = > - CursorBppEnumToBits( > - (enum cursor_bpp) (src->cur1_bpp)); > - mode_lib->vba.CursorWidth[mode_lib->vba.NumberOfActivePlanes][1] = > - src->cur1_src_width; > - if (src->cur1_src_width > 0) > - mode_lib->vba.NumberOfCursors[mode_lib->vba.NumberOfActivePlanes]++; > - break; > - default: > - dml_print( > - "ERROR: Number of cursors specified exceeds supported maximum\n") > - ; > - } > - } > - > - OTGInstPlane[mode_lib->vba.NumberOfActivePlanes] = dst->otg_inst; > - > - if (dst->odm_combine && !src->is_hsplit) > - dml_print( > - "ERROR: ODM Combine is specified but is_hsplit has not be specified for pipe %i\n", > - j); > - > - if (src->is_hsplit) { > - for (k = j + 1; k < mode_lib->vba.cache_num_pipes; ++k) { > - display_pipe_source_params_st *src_k = &pipes[k].pipe.src; > - display_output_params_st *dout_k = &pipes[k].dout; > - > - if (src_k->is_hsplit && !visited[k] > - && src->hsplit_grp == src_k->hsplit_grp) { > - mode_lib->vba.pipe_plane[k] = > - mode_lib->vba.NumberOfActivePlanes; > - mode_lib->vba.DPPPerPlane[mode_lib->vba.NumberOfActivePlanes]++; > - if (mode_lib->vba.SourceScan[mode_lib->vba.NumberOfActivePlanes] > - == dm_horz) > - mode_lib->vba.ViewportWidth[mode_lib->vba.NumberOfActivePlanes] += > - src_k->viewport_width; > - else > - mode_lib->vba.ViewportHeight[mode_lib->vba.NumberOfActivePlanes] += > - src_k->viewport_height; > - > - mode_lib->vba.NumberOfDSCSlices[mode_lib->vba.NumberOfActivePlanes] += > - dout_k->dsc_slices; > - visited[k] = true; > - } > - } > - } > - > - mode_lib->vba.NumberOfActivePlanes++; > - } > - > - // handle overlays through dml_ml->vba.BlendingAndTiming > - // dml_ml->vba.BlendingAndTiming tells you which instance to look at to get timing, the so called 'master' > - > - for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) > - PlaneVisited[j] = false; > - > - for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) { > - for (k = j + 1; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (!PlaneVisited[k] && OTGInstPlane[j] == OTGInstPlane[k]) { > - // doesn't matter, so choose the smaller one > - mode_lib->vba.BlendingAndTiming[j] = j; > - PlaneVisited[j] = true; > - mode_lib->vba.BlendingAndTiming[k] = j; > - PlaneVisited[k] = true; > - } > - } > - > - if (!PlaneVisited[j]) { > - mode_lib->vba.BlendingAndTiming[j] = j; > - PlaneVisited[j] = true; > - } > - } > - > - // TODO: dml_ml->vba.ODMCombineEnabled => 2 * dml_ml->vba.DPPPerPlane...actually maybe not since all pipes are specified > - // Do we want the dscclk to automatically be halved? Guess not since the value is specified > - > - mode_lib->vba.SynchronizedVBlank = pipes[0].pipe.dest.synchronized_vblank_all_planes; > - for (k = 1; k < mode_lib->vba.cache_num_pipes; ++k) > - ASSERT(mode_lib->vba.SynchronizedVBlank == pipes[k].pipe.dest.synchronized_vblank_all_planes); > - > - mode_lib->vba.VirtualMemoryEnable = false; > - mode_lib->vba.OverridePageTableLevels = 0; > - > - for (k = 0; k < mode_lib->vba.cache_num_pipes; ++k) { > - mode_lib->vba.VirtualMemoryEnable = mode_lib->vba.VirtualMemoryEnable > - || !!pipes[k].pipe.src.vm; > - mode_lib->vba.OverridePageTableLevels = > - (pipes[k].pipe.src.vm_levels_force_en > - && mode_lib->vba.OverridePageTableLevels > - < pipes[k].pipe.src.vm_levels_force) ? > - pipes[k].pipe.src.vm_levels_force : > - mode_lib->vba.OverridePageTableLevels; > - } > - > - if (mode_lib->vba.OverridePageTableLevels) > - mode_lib->vba.MaxPageTableLevels = mode_lib->vba.OverridePageTableLevels; > - > - mode_lib->vba.VirtualMemoryEnable = mode_lib->vba.VirtualMemoryEnable && !!ip->pte_enable; > - > - mode_lib->vba.FabricAndDRAMBandwidth = dml_min( > - mode_lib->vba.DRAMSpeed * mode_lib->vba.NumberOfChannels > - * mode_lib->vba.DRAMChannelWidth, > - mode_lib->vba.FabricClock * mode_lib->vba.FabricDatapathToDCNDataReturn) > - / 1000.0; > - > - // TODO: Must be consistent across all pipes > - // DCCProgrammingAssumesScanDirectionUnknown = src.dcc_scan_dir_unknown; > -} > - > -static void recalculate(struct display_mode_lib *mode_lib) > -{ > - ModeSupportAndSystemConfiguration(mode_lib); > - PixelClockAdjustmentForProgressiveToInterlaceUnit(mode_lib); > - DisplayPipeConfiguration(mode_lib); > - DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(mode_lib); > -} > - > -// in wm mode we pull the parameters needed from the display_e2e_pipe_params_st structs > -// rather than working them out as in recalculate_ms > -static void recalculate_params( > - struct display_mode_lib *mode_lib, > - const display_e2e_pipe_params_st *pipes, > - unsigned int num_pipes) > -{ > - // This is only safe to use memcmp because there are non-POD types in struct display_mode_lib > - if (memcmp(&mode_lib->soc, &mode_lib->vba.soc, sizeof(mode_lib->vba.soc)) != 0 > - || memcmp(&mode_lib->ip, &mode_lib->vba.ip, sizeof(mode_lib->vba.ip)) != 0 > - || num_pipes != mode_lib->vba.cache_num_pipes > - || memcmp( > - pipes, > - mode_lib->vba.cache_pipes, > - sizeof(display_e2e_pipe_params_st) * num_pipes) != 0) { > - mode_lib->vba.soc = mode_lib->soc; > - mode_lib->vba.ip = mode_lib->ip; > - memcpy(mode_lib->vba.cache_pipes, pipes, sizeof(*pipes) * num_pipes); > - mode_lib->vba.cache_num_pipes = num_pipes; > - recalculate(mode_lib); > - } > -} > - > -static void ModeSupportAndSystemConfiguration(struct display_mode_lib *mode_lib) > -{ > - soc_bounding_box_st *soc = &mode_lib->vba.soc; > - unsigned int i, k; > - unsigned int total_pipes = 0; > - > - mode_lib->vba.VoltageLevel = mode_lib->vba.cache_pipes[0].clks_cfg.voltage; > - for (i = 1; i < mode_lib->vba.cache_num_pipes; ++i) > - ASSERT(mode_lib->vba.VoltageLevel == -1 || mode_lib->vba.VoltageLevel == mode_lib->vba.cache_pipes[i].clks_cfg.voltage); > - > - mode_lib->vba.DCFCLK = mode_lib->vba.cache_pipes[0].clks_cfg.dcfclk_mhz; > - mode_lib->vba.SOCCLK = mode_lib->vba.cache_pipes[0].clks_cfg.socclk_mhz; > - > - if (mode_lib->vba.cache_pipes[0].clks_cfg.dispclk_mhz > 0.0) > - mode_lib->vba.DISPCLK = mode_lib->vba.cache_pipes[0].clks_cfg.dispclk_mhz; > - else > - mode_lib->vba.DISPCLK = soc->clock_limits[mode_lib->vba.VoltageLevel].dispclk_mhz; > - > - fetch_socbb_params(mode_lib); > - fetch_ip_params(mode_lib); > - fetch_pipe_params(mode_lib); > - > - // Total Available Pipes Support Check > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) > - total_pipes += mode_lib->vba.DPPPerPlane[k]; > - ASSERT(total_pipes <= DC__NUM_DPP__MAX); > -} > - > -static double adjust_ReturnBW( > - struct display_mode_lib *mode_lib, > - double ReturnBW, > - bool DCCEnabledAnyPlane, > - double ReturnBandwidthToDCN) > -{ > - double CriticalCompression; > - > - if (DCCEnabledAnyPlane > - && ReturnBandwidthToDCN > - > mode_lib->vba.DCFCLK * mode_lib->vba.ReturnBusWidth / 4.0) > - ReturnBW = > - dml_min( > - ReturnBW, > - ReturnBandwidthToDCN * 4 > - * (1.0 > - - mode_lib->vba.UrgentLatency > - / ((mode_lib->vba.ROBBufferSizeInKByte > - - mode_lib->vba.PixelChunkSizeInKByte) > - * 1024 > - / ReturnBandwidthToDCN > - - mode_lib->vba.DCFCLK > - * mode_lib->vba.ReturnBusWidth > - / 4) > - + mode_lib->vba.UrgentLatency)); > - > - CriticalCompression = 2.0 * mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLK > - * mode_lib->vba.UrgentLatency > - / (ReturnBandwidthToDCN * mode_lib->vba.UrgentLatency > - + (mode_lib->vba.ROBBufferSizeInKByte > - - mode_lib->vba.PixelChunkSizeInKByte) > - * 1024); > - > - if (DCCEnabledAnyPlane && CriticalCompression > 1.0 && CriticalCompression < 4.0) > - ReturnBW = > - dml_min( > - ReturnBW, > - 4.0 * ReturnBandwidthToDCN > - * (mode_lib->vba.ROBBufferSizeInKByte > - - mode_lib->vba.PixelChunkSizeInKByte) > - * 1024 > - * mode_lib->vba.ReturnBusWidth > - * mode_lib->vba.DCFCLK > - * mode_lib->vba.UrgentLatency > - / dml_pow( > - (ReturnBandwidthToDCN > - * mode_lib->vba.UrgentLatency > - + (mode_lib->vba.ROBBufferSizeInKByte > - - mode_lib->vba.PixelChunkSizeInKByte) > - * 1024), > - 2)); > - > - return ReturnBW; > -} > - > -static unsigned int dscceComputeDelay( > - unsigned int bpc, > - double bpp, > - unsigned int sliceWidth, > - unsigned int numSlices, > - enum output_format_class pixelFormat) > -{ > - // valid bpc = source bits per component in the set of {8, 10, 12} > - // valid bpp = increments of 1/16 of a bit > - // min = 6/7/8 in N420/N422/444, respectively > - // max = such that compression is 1:1 > - //valid sliceWidth = number of pixels per slice line, must be less than or equal to 5184/numSlices (or 4096/numSlices in 420 mode) > - //valid numSlices = number of slices in the horiziontal direction per DSC engine in the set of {1, 2, 3, 4} > - //valid pixelFormat = pixel/color format in the set of {:N444_RGB, :S422, :N422, :N420} > - > - // fixed value > - unsigned int rcModelSize = 8192; > - > - // N422/N420 operate at 2 pixels per clock > - unsigned int pixelsPerClock, lstall, D, initalXmitDelay, w, s, ix, wx, p, l0, a, ax, l, > - Delay, pixels; > - > - if (pixelFormat == dm_n422 || pixelFormat == dm_420) > - pixelsPerClock = 2; > - // #all other modes operate at 1 pixel per clock > - else > - pixelsPerClock = 1; > - > - //initial transmit delay as per PPS > - initalXmitDelay = dml_round(rcModelSize / 2.0 / bpp / pixelsPerClock); > - > - //compute ssm delay > - if (bpc == 8) > - D = 81; > - else if (bpc == 10) > - D = 89; > - else > - D = 113; > - > - //divide by pixel per cycle to compute slice width as seen by DSC > - w = sliceWidth / pixelsPerClock; > - > - //422 mode has an additional cycle of delay > - if (pixelFormat == dm_s422) > - s = 1; > - else > - s = 0; > - > - //main calculation for the dscce > - ix = initalXmitDelay + 45; > - wx = (w + 2) / 3; > - p = 3 * wx - w; > - l0 = ix / w; > - a = ix + p * l0; > - ax = (a + 2) / 3 + D + 6 + 1; > - l = (ax + wx - 1) / wx; > - if ((ix % w) == 0 && p != 0) > - lstall = 1; > - else > - lstall = 0; > - Delay = l * wx * (numSlices - 1) + ax + s + lstall + 22; > - > - //dsc processes 3 pixel containers per cycle and a container can contain 1 or 2 pixels > - pixels = Delay * 3 * pixelsPerClock; > - return pixels; > -} > - > -static unsigned int dscComputeDelay(enum output_format_class pixelFormat) > -{ > - unsigned int Delay = 0; > - > - if (pixelFormat == dm_420) { > - // sfr > - Delay = Delay + 2; > - // dsccif > - Delay = Delay + 0; > - // dscc - input deserializer > - Delay = Delay + 3; > - // dscc gets pixels every other cycle > - Delay = Delay + 2; > - // dscc - input cdc fifo > - Delay = Delay + 12; > - // dscc gets pixels every other cycle > - Delay = Delay + 13; > - // dscc - cdc uncertainty > - Delay = Delay + 2; > - // dscc - output cdc fifo > - Delay = Delay + 7; > - // dscc gets pixels every other cycle > - Delay = Delay + 3; > - // dscc - cdc uncertainty > - Delay = Delay + 2; > - // dscc - output serializer > - Delay = Delay + 1; > - // sft > - Delay = Delay + 1; > - } else if (pixelFormat == dm_n422) { > - // sfr > - Delay = Delay + 2; > - // dsccif > - Delay = Delay + 1; > - // dscc - input deserializer > - Delay = Delay + 5; > - // dscc - input cdc fifo > - Delay = Delay + 25; > - // dscc - cdc uncertainty > - Delay = Delay + 2; > - // dscc - output cdc fifo > - Delay = Delay + 10; > - // dscc - cdc uncertainty > - Delay = Delay + 2; > - // dscc - output serializer > - Delay = Delay + 1; > - // sft > - Delay = Delay + 1; > - } else { > - // sfr > - Delay = Delay + 2; > - // dsccif > - Delay = Delay + 0; > - // dscc - input deserializer > - Delay = Delay + 3; > - // dscc - input cdc fifo > - Delay = Delay + 12; > - // dscc - cdc uncertainty > - Delay = Delay + 2; > - // dscc - output cdc fifo > - Delay = Delay + 7; > - // dscc - output serializer > - Delay = Delay + 1; > - // dscc - cdc uncertainty > - Delay = Delay + 2; > - // sft > - Delay = Delay + 1; > - } > - > - return Delay; > -} > - > -static bool CalculatePrefetchSchedule( > - struct display_mode_lib *mode_lib, > - double DPPCLK, > - double DISPCLK, > - double PixelClock, > - double DCFClkDeepSleep, > - unsigned int DSCDelay, > - unsigned int DPPPerPlane, > - bool ScalerEnabled, > - unsigned int NumberOfCursors, > - double DPPCLKDelaySubtotal, > - double DPPCLKDelaySCL, > - double DPPCLKDelaySCLLBOnly, > - double DPPCLKDelayCNVCFormater, > - double DPPCLKDelayCNVCCursor, > - double DISPCLKDelaySubtotal, > - unsigned int ScalerRecoutWidth, > - enum output_format_class OutputFormat, > - unsigned int VBlank, > - unsigned int HTotal, > - unsigned int MaxInterDCNTileRepeaters, > - unsigned int VStartup, > - unsigned int PageTableLevels, > - bool VirtualMemoryEnable, > - bool DynamicMetadataEnable, > - unsigned int DynamicMetadataLinesBeforeActiveRequired, > - unsigned int DynamicMetadataTransmittedBytes, > - bool DCCEnable, > - double UrgentLatency, > - double UrgentExtraLatency, > - double TCalc, > - unsigned int PDEAndMetaPTEBytesFrame, > - unsigned int MetaRowByte, > - unsigned int PixelPTEBytesPerRow, > - double PrefetchSourceLinesY, > - unsigned int SwathWidthY, > - double BytePerPixelDETY, > - double VInitPreFillY, > - unsigned int MaxNumSwathY, > - double PrefetchSourceLinesC, > - double BytePerPixelDETC, > - double VInitPreFillC, > - unsigned int MaxNumSwathC, > - unsigned int SwathHeightY, > - unsigned int SwathHeightC, > - double TWait, > - bool XFCEnabled, > - double XFCRemoteSurfaceFlipDelay, > - bool InterlaceEnable, > - bool ProgressiveToInterlaceUnitInOPP, > - double *DSTXAfterScaler, > - double *DSTYAfterScaler, > - double *DestinationLinesForPrefetch, > - double *PrefetchBandwidth, > - double *DestinationLinesToRequestVMInVBlank, > - double *DestinationLinesToRequestRowInVBlank, > - double *VRatioPrefetchY, > - double *VRatioPrefetchC, > - double *RequiredPrefetchPixDataBW, > - unsigned int *VStartupRequiredWhenNotEnoughTimeForDynamicMetadata, > - double *Tno_bw, > - unsigned int *VUpdateOffsetPix, > - unsigned int *VUpdateWidthPix, > - unsigned int *VReadyOffsetPix) > -{ > - bool MyError = false; > - unsigned int DPPCycles, DISPCLKCycles; > - double DSTTotalPixelsAfterScaler, TotalRepeaterDelayTime; > - double Tdm, LineTime, Tsetup; > - double dst_y_prefetch_equ; > - double Tsw_oto; > - double prefetch_bw_oto; > - double Tvm_oto; > - double Tr0_oto; > - double Tpre_oto; > - double dst_y_prefetch_oto; > - double TimeForFetchingMetaPTE = 0; > - double TimeForFetchingRowInVBlank = 0; > - double LinesToRequestPrefetchPixelData = 0; > - > - if (ScalerEnabled) > - DPPCycles = DPPCLKDelaySubtotal + DPPCLKDelaySCL; > - else > - DPPCycles = DPPCLKDelaySubtotal + DPPCLKDelaySCLLBOnly; > - > - DPPCycles = DPPCycles + DPPCLKDelayCNVCFormater + NumberOfCursors * DPPCLKDelayCNVCCursor; > - > - DISPCLKCycles = DISPCLKDelaySubtotal; > - > - if (DPPCLK == 0.0 || DISPCLK == 0.0) > - return true; > - > - *DSTXAfterScaler = DPPCycles * PixelClock / DPPCLK + DISPCLKCycles * PixelClock / DISPCLK > - + DSCDelay; > - > - if (DPPPerPlane > 1) > - *DSTXAfterScaler = *DSTXAfterScaler + ScalerRecoutWidth; > - > - if (OutputFormat == dm_420 || (InterlaceEnable && ProgressiveToInterlaceUnitInOPP)) > - *DSTYAfterScaler = 1; > - else > - *DSTYAfterScaler = 0; > - > - DSTTotalPixelsAfterScaler = ((double) (*DSTYAfterScaler * HTotal)) + *DSTXAfterScaler; > - *DSTYAfterScaler = dml_floor(DSTTotalPixelsAfterScaler / HTotal, 1); > - *DSTXAfterScaler = DSTTotalPixelsAfterScaler - ((double) (*DSTYAfterScaler * HTotal)); > - > - *VUpdateOffsetPix = dml_ceil(HTotal / 4.0, 1); > - TotalRepeaterDelayTime = MaxInterDCNTileRepeaters * (2.0 / DPPCLK + 3.0 / DISPCLK); > - *VUpdateWidthPix = (14.0 / DCFClkDeepSleep + 12.0 / DPPCLK + TotalRepeaterDelayTime) > - * PixelClock; > - > - *VReadyOffsetPix = dml_max( > - 150.0 / DPPCLK, > - TotalRepeaterDelayTime + 20.0 / DCFClkDeepSleep + 10.0 / DPPCLK) > - * PixelClock; > - > - Tsetup = (double) (*VUpdateOffsetPix + *VUpdateWidthPix + *VReadyOffsetPix) / PixelClock; > - > - LineTime = (double) HTotal / PixelClock; > - > - if (DynamicMetadataEnable) { > - double Tdmbf, Tdmec, Tdmsks; > - > - Tdm = dml_max(0.0, UrgentExtraLatency - TCalc); > - Tdmbf = DynamicMetadataTransmittedBytes / 4.0 / DISPCLK; > - Tdmec = LineTime; > - if (DynamicMetadataLinesBeforeActiveRequired == 0) > - Tdmsks = VBlank * LineTime / 2.0; > - else > - Tdmsks = DynamicMetadataLinesBeforeActiveRequired * LineTime; > - if (InterlaceEnable && !ProgressiveToInterlaceUnitInOPP) > - Tdmsks = Tdmsks / 2; > - if (VStartup * LineTime > - < Tsetup + TWait + UrgentExtraLatency + Tdmbf + Tdmec + Tdmsks) { > - MyError = true; > - *VStartupRequiredWhenNotEnoughTimeForDynamicMetadata = (Tsetup + TWait > - + UrgentExtraLatency + Tdmbf + Tdmec + Tdmsks) / LineTime; > - } else > - *VStartupRequiredWhenNotEnoughTimeForDynamicMetadata = 0.0; > - } else > - Tdm = 0; > - > - if (VirtualMemoryEnable) { > - if (PageTableLevels == 4) > - *Tno_bw = UrgentExtraLatency + UrgentLatency; > - else if (PageTableLevels == 3) > - *Tno_bw = UrgentExtraLatency; > - else > - *Tno_bw = 0; > - } else if (DCCEnable) > - *Tno_bw = LineTime; > - else > - *Tno_bw = LineTime / 4; > - > - dst_y_prefetch_equ = VStartup - dml_max(TCalc + TWait, XFCRemoteSurfaceFlipDelay) / LineTime > - - (Tsetup + Tdm) / LineTime > - - (*DSTYAfterScaler + *DSTXAfterScaler / HTotal); > - > - Tsw_oto = dml_max(PrefetchSourceLinesY, PrefetchSourceLinesC) * LineTime; > - > - prefetch_bw_oto = (MetaRowByte + PixelPTEBytesPerRow > - + PrefetchSourceLinesY * SwathWidthY * dml_ceil(BytePerPixelDETY, 1) > - + PrefetchSourceLinesC * SwathWidthY / 2 * dml_ceil(BytePerPixelDETC, 2)) > - / Tsw_oto; > - > - if (VirtualMemoryEnable == true) { > - Tvm_oto = > - dml_max( > - *Tno_bw + PDEAndMetaPTEBytesFrame / prefetch_bw_oto, > - dml_max( > - UrgentExtraLatency > - + UrgentLatency > - * (PageTableLevels > - - 1), > - LineTime / 4.0)); > - } else > - Tvm_oto = LineTime / 4.0; > - > - if ((VirtualMemoryEnable == true || DCCEnable == true)) { > - Tr0_oto = dml_max( > - (MetaRowByte + PixelPTEBytesPerRow) / prefetch_bw_oto, > - dml_max(UrgentLatency, dml_max(LineTime - Tvm_oto, LineTime / 4))); > - } else > - Tr0_oto = LineTime - Tvm_oto; > - > - Tpre_oto = Tvm_oto + Tr0_oto + Tsw_oto; > - > - dst_y_prefetch_oto = Tpre_oto / LineTime; > - > - if (dst_y_prefetch_oto < dst_y_prefetch_equ) > - *DestinationLinesForPrefetch = dst_y_prefetch_oto; > - else > - *DestinationLinesForPrefetch = dst_y_prefetch_equ; > - > - *DestinationLinesForPrefetch = dml_floor(4.0 * (*DestinationLinesForPrefetch + 0.125), 1) > - / 4; > - > - dml_print("DML: VStartup: %d\n", VStartup); > - dml_print("DML: TCalc: %f\n", TCalc); > - dml_print("DML: TWait: %f\n", TWait); > - dml_print("DML: XFCRemoteSurfaceFlipDelay: %f\n", XFCRemoteSurfaceFlipDelay); > - dml_print("DML: LineTime: %f\n", LineTime); > - dml_print("DML: Tsetup: %f\n", Tsetup); > - dml_print("DML: Tdm: %f\n", Tdm); > - dml_print("DML: DSTYAfterScaler: %f\n", *DSTYAfterScaler); > - dml_print("DML: DSTXAfterScaler: %f\n", *DSTXAfterScaler); > - dml_print("DML: HTotal: %d\n", HTotal); > - > - *PrefetchBandwidth = 0; > - *DestinationLinesToRequestVMInVBlank = 0; > - *DestinationLinesToRequestRowInVBlank = 0; > - *VRatioPrefetchY = 0; > - *VRatioPrefetchC = 0; > - *RequiredPrefetchPixDataBW = 0; > - if (*DestinationLinesForPrefetch > 1) { > - *PrefetchBandwidth = (PDEAndMetaPTEBytesFrame + 2 * MetaRowByte > - + 2 * PixelPTEBytesPerRow > - + PrefetchSourceLinesY * SwathWidthY * dml_ceil(BytePerPixelDETY, 1) > - + PrefetchSourceLinesC * SwathWidthY / 2 > - * dml_ceil(BytePerPixelDETC, 2)) > - / (*DestinationLinesForPrefetch * LineTime - *Tno_bw); > - if (VirtualMemoryEnable) { > - TimeForFetchingMetaPTE = > - dml_max( > - *Tno_bw > - + (double) PDEAndMetaPTEBytesFrame > - / *PrefetchBandwidth, > - dml_max( > - UrgentExtraLatency > - + UrgentLatency > - * (PageTableLevels > - - 1), > - LineTime / 4)); > - } else { > - if (NumberOfCursors > 0 || XFCEnabled) > - TimeForFetchingMetaPTE = LineTime / 4; > - else > - TimeForFetchingMetaPTE = 0.0; > - } > - > - if ((VirtualMemoryEnable == true || DCCEnable == true)) { > - TimeForFetchingRowInVBlank = > - dml_max( > - (MetaRowByte + PixelPTEBytesPerRow) > - / *PrefetchBandwidth, > - dml_max( > - UrgentLatency, > - dml_max( > - LineTime > - - TimeForFetchingMetaPTE, > - LineTime > - / 4.0))); > - } else { > - if (NumberOfCursors > 0 || XFCEnabled) > - TimeForFetchingRowInVBlank = LineTime - TimeForFetchingMetaPTE; > - else > - TimeForFetchingRowInVBlank = 0.0; > - } > - > - *DestinationLinesToRequestVMInVBlank = dml_floor( > - 4.0 * (TimeForFetchingMetaPTE / LineTime + 0.125), > - 1) / 4.0; > - > - *DestinationLinesToRequestRowInVBlank = dml_floor( > - 4.0 * (TimeForFetchingRowInVBlank / LineTime + 0.125), > - 1) / 4.0; > - > - LinesToRequestPrefetchPixelData = > - *DestinationLinesForPrefetch > - - ((NumberOfCursors > 0 || VirtualMemoryEnable > - || DCCEnable) ? > - (*DestinationLinesToRequestVMInVBlank > - + *DestinationLinesToRequestRowInVBlank) : > - 0.0); > - > - if (LinesToRequestPrefetchPixelData > 0) { > - > - *VRatioPrefetchY = (double) PrefetchSourceLinesY > - / LinesToRequestPrefetchPixelData; > - *VRatioPrefetchY = dml_max(*VRatioPrefetchY, 1.0); > - if ((SwathHeightY > 4) && (VInitPreFillY > 3)) { > - if (LinesToRequestPrefetchPixelData > (VInitPreFillY - 3.0) / 2.0) { > - *VRatioPrefetchY = > - dml_max( > - (double) PrefetchSourceLinesY > - / LinesToRequestPrefetchPixelData, > - (double) MaxNumSwathY > - * SwathHeightY > - / (LinesToRequestPrefetchPixelData > - - (VInitPreFillY > - - 3.0) > - / 2.0)); > - *VRatioPrefetchY = dml_max(*VRatioPrefetchY, 1.0); > - } else { > - MyError = true; > - *VRatioPrefetchY = 0; > - } > - } > - > - *VRatioPrefetchC = (double) PrefetchSourceLinesC > - / LinesToRequestPrefetchPixelData; > - *VRatioPrefetchC = dml_max(*VRatioPrefetchC, 1.0); > - > - if ((SwathHeightC > 4)) { > - if (LinesToRequestPrefetchPixelData > (VInitPreFillC - 3.0) / 2.0) { > - *VRatioPrefetchC = > - dml_max( > - *VRatioPrefetchC, > - (double) MaxNumSwathC > - * SwathHeightC > - / (LinesToRequestPrefetchPixelData > - - (VInitPreFillC > - - 3.0) > - / 2.0)); > - *VRatioPrefetchC = dml_max(*VRatioPrefetchC, 1.0); > - } else { > - MyError = true; > - *VRatioPrefetchC = 0; > - } > - } > - > - *RequiredPrefetchPixDataBW = > - DPPPerPlane > - * ((double) PrefetchSourceLinesY > - / LinesToRequestPrefetchPixelData > - * dml_ceil( > - BytePerPixelDETY, > - 1) > - + (double) PrefetchSourceLinesC > - / LinesToRequestPrefetchPixelData > - * dml_ceil( > - BytePerPixelDETC, > - 2) > - / 2) > - * SwathWidthY / LineTime; > - } else { > - MyError = true; > - *VRatioPrefetchY = 0; > - *VRatioPrefetchC = 0; > - *RequiredPrefetchPixDataBW = 0; > - } > - > - } else { > - MyError = true; > - } > - > - if (MyError) { > - *PrefetchBandwidth = 0; > - TimeForFetchingMetaPTE = 0; > - TimeForFetchingRowInVBlank = 0; > - *DestinationLinesToRequestVMInVBlank = 0; > - *DestinationLinesToRequestRowInVBlank = 0; > - *DestinationLinesForPrefetch = 0; > - LinesToRequestPrefetchPixelData = 0; > - *VRatioPrefetchY = 0; > - *VRatioPrefetchC = 0; > - *RequiredPrefetchPixDataBW = 0; > - } > - > - return MyError; > -} > - > -static double RoundToDFSGranularityUp(double Clock, double VCOSpeed) > -{ > - return VCOSpeed * 4 / dml_floor(VCOSpeed * 4 / Clock, 1); > -} > - > -static double RoundToDFSGranularityDown(double Clock, double VCOSpeed) > -{ > - return VCOSpeed * 4 / dml_ceil(VCOSpeed * 4 / Clock, 1); > -} > - > -static double CalculatePrefetchSourceLines( > - struct display_mode_lib *mode_lib, > - double VRatio, > - double vtaps, > - bool Interlace, > - bool ProgressiveToInterlaceUnitInOPP, > - unsigned int SwathHeight, > - unsigned int ViewportYStart, > - double *VInitPreFill, > - unsigned int *MaxNumSwath) > -{ > - unsigned int MaxPartialSwath; > - > - if (ProgressiveToInterlaceUnitInOPP) > - *VInitPreFill = dml_floor((VRatio + vtaps + 1) / 2.0, 1); > - else > - *VInitPreFill = dml_floor((VRatio + vtaps + 1 + Interlace * 0.5 * VRatio) / 2.0, 1); > - > - if (!mode_lib->vba.IgnoreViewportPositioning) { > - > - *MaxNumSwath = dml_ceil((*VInitPreFill - 1.0) / SwathHeight, 1) + 1.0; > - > - if (*VInitPreFill > 1.0) > - MaxPartialSwath = (unsigned int) (*VInitPreFill - 2) % SwathHeight; > - else > - MaxPartialSwath = (unsigned int) (*VInitPreFill + SwathHeight - 2) > - % SwathHeight; > - MaxPartialSwath = dml_max(1U, MaxPartialSwath); > - > - } else { > - > - if (ViewportYStart != 0) > - dml_print( > - "WARNING DML: using viewport y position of 0 even though actual viewport y position is non-zero in prefetch source lines calculation\n"); > - > - *MaxNumSwath = dml_ceil(*VInitPreFill / SwathHeight, 1); > - > - if (*VInitPreFill > 1.0) > - MaxPartialSwath = (unsigned int) (*VInitPreFill - 1) % SwathHeight; > - else > - MaxPartialSwath = (unsigned int) (*VInitPreFill + SwathHeight - 1) > - % SwathHeight; > - } > - > - return *MaxNumSwath * SwathHeight + MaxPartialSwath; > -} > - > -static unsigned int CalculateVMAndRowBytes( > - struct display_mode_lib *mode_lib, > - bool DCCEnable, > - unsigned int BlockHeight256Bytes, > - unsigned int BlockWidth256Bytes, > - enum source_format_class SourcePixelFormat, > - unsigned int SurfaceTiling, > - unsigned int BytePerPixel, > - enum scan_direction_class ScanDirection, > - unsigned int ViewportWidth, > - unsigned int ViewportHeight, > - unsigned int SwathWidth, > - bool VirtualMemoryEnable, > - unsigned int VMMPageSize, > - unsigned int PTEBufferSizeInRequests, > - unsigned int PDEProcessingBufIn64KBReqs, > - unsigned int Pitch, > - unsigned int DCCMetaPitch, > - unsigned int *MacroTileWidth, > - unsigned int *MetaRowByte, > - unsigned int *PixelPTEBytesPerRow, > - bool *PTEBufferSizeNotExceeded, > - unsigned int *dpte_row_height, > - unsigned int *meta_row_height) > -{ > - unsigned int MetaRequestHeight; > - unsigned int MetaRequestWidth; > - unsigned int MetaSurfWidth; > - unsigned int MetaSurfHeight; > - unsigned int MPDEBytesFrame; > - unsigned int MetaPTEBytesFrame; > - unsigned int DCCMetaSurfaceBytes; > - > - unsigned int MacroTileSizeBytes; > - unsigned int MacroTileHeight; > - unsigned int DPDE0BytesFrame; > - unsigned int ExtraDPDEBytesFrame; > - unsigned int PDEAndMetaPTEBytesFrame; > - > - if (DCCEnable == true) { > - MetaRequestHeight = 8 * BlockHeight256Bytes; > - MetaRequestWidth = 8 * BlockWidth256Bytes; > - if (ScanDirection == dm_horz) { > - *meta_row_height = MetaRequestHeight; > - MetaSurfWidth = dml_ceil((double) SwathWidth - 1, MetaRequestWidth) > - + MetaRequestWidth; > - *MetaRowByte = MetaSurfWidth * MetaRequestHeight * BytePerPixel / 256.0; > - } else { > - *meta_row_height = MetaRequestWidth; > - MetaSurfHeight = dml_ceil((double) SwathWidth - 1, MetaRequestHeight) > - + MetaRequestHeight; > - *MetaRowByte = MetaSurfHeight * MetaRequestWidth * BytePerPixel / 256.0; > - } > - if (ScanDirection == dm_horz) { > - DCCMetaSurfaceBytes = DCCMetaPitch > - * (dml_ceil(ViewportHeight - 1, 64 * BlockHeight256Bytes) > - + 64 * BlockHeight256Bytes) * BytePerPixel > - / 256; > - } else { > - DCCMetaSurfaceBytes = DCCMetaPitch > - * (dml_ceil( > - (double) ViewportHeight - 1, > - 64 * BlockHeight256Bytes) > - + 64 * BlockHeight256Bytes) * BytePerPixel > - / 256; > - } > - if (VirtualMemoryEnable == true) { > - MetaPTEBytesFrame = (dml_ceil( > - (double) (DCCMetaSurfaceBytes - VMMPageSize) > - / (8 * VMMPageSize), > - 1) + 1) * 64; > - MPDEBytesFrame = 128 * (mode_lib->vba.MaxPageTableLevels - 1); > - } else { > - MetaPTEBytesFrame = 0; > - MPDEBytesFrame = 0; > - } > - } else { > - MetaPTEBytesFrame = 0; > - MPDEBytesFrame = 0; > - *MetaRowByte = 0; > - } > - > - if (SurfaceTiling == dm_sw_linear) { > - MacroTileSizeBytes = 256; > - MacroTileHeight = 1; > - } else if (SurfaceTiling == dm_sw_4kb_s || SurfaceTiling == dm_sw_4kb_s_x > - || SurfaceTiling == dm_sw_4kb_d || SurfaceTiling == dm_sw_4kb_d_x) { > - MacroTileSizeBytes = 4096; > - MacroTileHeight = 4 * BlockHeight256Bytes; > - } else if (SurfaceTiling == dm_sw_64kb_s || SurfaceTiling == dm_sw_64kb_s_t > - || SurfaceTiling == dm_sw_64kb_s_x || SurfaceTiling == dm_sw_64kb_d > - || SurfaceTiling == dm_sw_64kb_d_t || SurfaceTiling == dm_sw_64kb_d_x > - || SurfaceTiling == dm_sw_64kb_r_x) { > - MacroTileSizeBytes = 65536; > - MacroTileHeight = 16 * BlockHeight256Bytes; > - } else { > - MacroTileSizeBytes = 262144; > - MacroTileHeight = 32 * BlockHeight256Bytes; > - } > - *MacroTileWidth = MacroTileSizeBytes / BytePerPixel / MacroTileHeight; > - > - if (VirtualMemoryEnable == true && mode_lib->vba.MaxPageTableLevels > 1) { > - if (ScanDirection == dm_horz) { > - DPDE0BytesFrame = > - 64 > - * (dml_ceil( > - ((Pitch > - * (dml_ceil( > - ViewportHeight > - - 1, > - MacroTileHeight) > - + MacroTileHeight) > - * BytePerPixel) > - - MacroTileSizeBytes) > - / (8 > - * 2097152), > - 1) + 1); > - } else { > - DPDE0BytesFrame = > - 64 > - * (dml_ceil( > - ((Pitch > - * (dml_ceil( > - (double) SwathWidth > - - 1, > - MacroTileHeight) > - + MacroTileHeight) > - * BytePerPixel) > - - MacroTileSizeBytes) > - / (8 > - * 2097152), > - 1) + 1); > - } > - ExtraDPDEBytesFrame = 128 * (mode_lib->vba.MaxPageTableLevels - 2); > - } else { > - DPDE0BytesFrame = 0; > - ExtraDPDEBytesFrame = 0; > - } > - > - PDEAndMetaPTEBytesFrame = MetaPTEBytesFrame + MPDEBytesFrame + DPDE0BytesFrame > - + ExtraDPDEBytesFrame; > - > - if (VirtualMemoryEnable == true) { > - unsigned int PTERequestSize; > - unsigned int PixelPTEReqHeight; > - unsigned int PixelPTEReqWidth; > - double FractionOfPTEReturnDrop; > - unsigned int EffectivePDEProcessingBufIn64KBReqs; > - > - if (SurfaceTiling == dm_sw_linear) { > - PixelPTEReqHeight = 1; > - PixelPTEReqWidth = 8.0 * VMMPageSize / BytePerPixel; > - PTERequestSize = 64; > - FractionOfPTEReturnDrop = 0; > - } else if (MacroTileSizeBytes == 4096) { > - PixelPTEReqHeight = MacroTileHeight; > - PixelPTEReqWidth = 8 * *MacroTileWidth; > - PTERequestSize = 64; > - if (ScanDirection == dm_horz) > - FractionOfPTEReturnDrop = 0; > - else > - FractionOfPTEReturnDrop = 7 / 8; > - } else if (VMMPageSize == 4096 && MacroTileSizeBytes > 4096) { > - PixelPTEReqHeight = 16 * BlockHeight256Bytes; > - PixelPTEReqWidth = 16 * BlockWidth256Bytes; > - PTERequestSize = 128; > - FractionOfPTEReturnDrop = 0; > - } else { > - PixelPTEReqHeight = MacroTileHeight; > - PixelPTEReqWidth = 8 * *MacroTileWidth; > - PTERequestSize = 64; > - FractionOfPTEReturnDrop = 0; > - } > - > - if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10) > - EffectivePDEProcessingBufIn64KBReqs = PDEProcessingBufIn64KBReqs / 2; > - else > - EffectivePDEProcessingBufIn64KBReqs = PDEProcessingBufIn64KBReqs; > - > - if (SurfaceTiling == dm_sw_linear) { > - *dpte_row_height = > - dml_min( > - 128, > - 1 > - << (unsigned int) dml_floor( > - dml_log2( > - dml_min( > - (double) PTEBufferSizeInRequests > - * PixelPTEReqWidth, > - EffectivePDEProcessingBufIn64KBReqs > - * 65536.0 > - / BytePerPixel) > - / Pitch), > - 1)); > - *PixelPTEBytesPerRow = PTERequestSize > - * (dml_ceil( > - (double) (Pitch * *dpte_row_height - 1) > - / PixelPTEReqWidth, > - 1) + 1); > - } else if (ScanDirection == dm_horz) { > - *dpte_row_height = PixelPTEReqHeight; > - *PixelPTEBytesPerRow = PTERequestSize > - * (dml_ceil(((double) SwathWidth - 1) / PixelPTEReqWidth, 1) > - + 1); > - } else { > - *dpte_row_height = dml_min(PixelPTEReqWidth, *MacroTileWidth); > - *PixelPTEBytesPerRow = PTERequestSize > - * (dml_ceil( > - ((double) SwathWidth - 1) > - / PixelPTEReqHeight, > - 1) + 1); > - } > - if (*PixelPTEBytesPerRow * (1 - FractionOfPTEReturnDrop) > - <= 64 * PTEBufferSizeInRequests) { > - *PTEBufferSizeNotExceeded = true; > - } else { > - *PTEBufferSizeNotExceeded = false; > - } > - } else { > - *PixelPTEBytesPerRow = 0; > - *PTEBufferSizeNotExceeded = true; > - } > - > - return PDEAndMetaPTEBytesFrame; > -} > - > -static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation( > - struct display_mode_lib *mode_lib) > -{ > - unsigned int j, k; > - > - mode_lib->vba.WritebackDISPCLK = 0.0; > - mode_lib->vba.DISPCLKWithRamping = 0; > - mode_lib->vba.DISPCLKWithoutRamping = 0; > - mode_lib->vba.GlobalDPPCLK = 0.0; > - > - // dml_ml->vba.DISPCLK and dml_ml->vba.DPPCLK Calculation > - // > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.WritebackEnable[k]) { > - mode_lib->vba.WritebackDISPCLK = > - dml_max( > - mode_lib->vba.WritebackDISPCLK, > - CalculateWriteBackDISPCLK( > - mode_lib->vba.WritebackPixelFormat[k], > - mode_lib->vba.PixelClock[k], > - mode_lib->vba.WritebackHRatio[k], > - mode_lib->vba.WritebackVRatio[k], > - mode_lib->vba.WritebackLumaHTaps[k], > - mode_lib->vba.WritebackLumaVTaps[k], > - mode_lib->vba.WritebackChromaHTaps[k], > - mode_lib->vba.WritebackChromaVTaps[k], > - mode_lib->vba.WritebackDestinationWidth[k], > - mode_lib->vba.HTotal[k], > - mode_lib->vba.WritebackChromaLineBufferWidth)); > - } > - } > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.HRatio[k] > 1) { > - mode_lib->vba.PSCL_THROUGHPUT_LUMA[k] = dml_min( > - mode_lib->vba.MaxDCHUBToPSCLThroughput, > - mode_lib->vba.MaxPSCLToLBThroughput > - * mode_lib->vba.HRatio[k] > - / dml_ceil( > - mode_lib->vba.htaps[k] > - / 6.0, > - 1)); > - } else { > - mode_lib->vba.PSCL_THROUGHPUT_LUMA[k] = dml_min( > - mode_lib->vba.MaxDCHUBToPSCLThroughput, > - mode_lib->vba.MaxPSCLToLBThroughput); > - } > - > - mode_lib->vba.DPPCLKUsingSingleDPPLuma = > - mode_lib->vba.PixelClock[k] > - * dml_max( > - mode_lib->vba.vtaps[k] / 6.0 > - * dml_min( > - 1.0, > - mode_lib->vba.HRatio[k]), > - dml_max( > - mode_lib->vba.HRatio[k] > - * mode_lib->vba.VRatio[k] > - / mode_lib->vba.PSCL_THROUGHPUT_LUMA[k], > - 1.0)); > - > - if ((mode_lib->vba.htaps[k] > 6 || mode_lib->vba.vtaps[k] > 6) > - && mode_lib->vba.DPPCLKUsingSingleDPPLuma > - < 2 * mode_lib->vba.PixelClock[k]) { > - mode_lib->vba.DPPCLKUsingSingleDPPLuma = 2 * mode_lib->vba.PixelClock[k]; > - } > - > - if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8 > - && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) { > - mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k] = 0.0; > - mode_lib->vba.DPPCLKUsingSingleDPP[k] = > - mode_lib->vba.DPPCLKUsingSingleDPPLuma; > - } else { > - if (mode_lib->vba.HRatio[k] > 1) { > - mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k] = > - dml_min( > - mode_lib->vba.MaxDCHUBToPSCLThroughput, > - mode_lib->vba.MaxPSCLToLBThroughput > - * mode_lib->vba.HRatio[k] > - / 2 > - / dml_ceil( > - mode_lib->vba.HTAPsChroma[k] > - / 6.0, > - 1.0)); > - } else { > - mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k] = dml_min( > - mode_lib->vba.MaxDCHUBToPSCLThroughput, > - mode_lib->vba.MaxPSCLToLBThroughput); > - } > - mode_lib->vba.DPPCLKUsingSingleDPPChroma = > - mode_lib->vba.PixelClock[k] > - * dml_max( > - mode_lib->vba.VTAPsChroma[k] > - / 6.0 > - * dml_min( > - 1.0, > - mode_lib->vba.HRatio[k] > - / 2), > - dml_max( > - mode_lib->vba.HRatio[k] > - * mode_lib->vba.VRatio[k] > - / 4 > - / mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k], > - 1.0)); > - > - if ((mode_lib->vba.HTAPsChroma[k] > 6 || mode_lib->vba.VTAPsChroma[k] > 6) > - && mode_lib->vba.DPPCLKUsingSingleDPPChroma > - < 2 * mode_lib->vba.PixelClock[k]) { > - mode_lib->vba.DPPCLKUsingSingleDPPChroma = 2 > - * mode_lib->vba.PixelClock[k]; > - } > - > - mode_lib->vba.DPPCLKUsingSingleDPP[k] = dml_max( > - mode_lib->vba.DPPCLKUsingSingleDPPLuma, > - mode_lib->vba.DPPCLKUsingSingleDPPChroma); > - } > - } > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.BlendingAndTiming[k] != k) > - continue; > - if (mode_lib->vba.ODMCombineEnabled[k]) { > - mode_lib->vba.DISPCLKWithRamping = > - dml_max( > - mode_lib->vba.DISPCLKWithRamping, > - mode_lib->vba.PixelClock[k] / 2 > - * (1 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100) > - * (1 > - + mode_lib->vba.DISPCLKRampingMargin > - / 100)); > - mode_lib->vba.DISPCLKWithoutRamping = > - dml_max( > - mode_lib->vba.DISPCLKWithoutRamping, > - mode_lib->vba.PixelClock[k] / 2 > - * (1 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100)); > - } else if (!mode_lib->vba.ODMCombineEnabled[k]) { > - mode_lib->vba.DISPCLKWithRamping = > - dml_max( > - mode_lib->vba.DISPCLKWithRamping, > - mode_lib->vba.PixelClock[k] > - * (1 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100) > - * (1 > - + mode_lib->vba.DISPCLKRampingMargin > - / 100)); > - mode_lib->vba.DISPCLKWithoutRamping = > - dml_max( > - mode_lib->vba.DISPCLKWithoutRamping, > - mode_lib->vba.PixelClock[k] > - * (1 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100)); > - } > - } > - > - mode_lib->vba.DISPCLKWithRamping = dml_max( > - mode_lib->vba.DISPCLKWithRamping, > - mode_lib->vba.WritebackDISPCLK); > - mode_lib->vba.DISPCLKWithoutRamping = dml_max( > - mode_lib->vba.DISPCLKWithoutRamping, > - mode_lib->vba.WritebackDISPCLK); > - > - ASSERT(mode_lib->vba.DISPCLKDPPCLKVCOSpeed != 0); > - mode_lib->vba.DISPCLKWithRampingRoundedToDFSGranularity = RoundToDFSGranularityUp( > - mode_lib->vba.DISPCLKWithRamping, > - mode_lib->vba.DISPCLKDPPCLKVCOSpeed); > - mode_lib->vba.DISPCLKWithoutRampingRoundedToDFSGranularity = RoundToDFSGranularityUp( > - mode_lib->vba.DISPCLKWithoutRamping, > - mode_lib->vba.DISPCLKDPPCLKVCOSpeed); > - mode_lib->vba.MaxDispclkRoundedToDFSGranularity = RoundToDFSGranularityDown( > - mode_lib->vba.soc.clock_limits[NumberOfStates - 1].dispclk_mhz, > - mode_lib->vba.DISPCLKDPPCLKVCOSpeed); > - if (mode_lib->vba.DISPCLKWithoutRampingRoundedToDFSGranularity > - > mode_lib->vba.MaxDispclkRoundedToDFSGranularity) { > - mode_lib->vba.DISPCLK_calculated = > - mode_lib->vba.DISPCLKWithoutRampingRoundedToDFSGranularity; > - } else if (mode_lib->vba.DISPCLKWithRampingRoundedToDFSGranularity > - > mode_lib->vba.MaxDispclkRoundedToDFSGranularity) { > - mode_lib->vba.DISPCLK_calculated = mode_lib->vba.MaxDispclkRoundedToDFSGranularity; > - } else { > - mode_lib->vba.DISPCLK_calculated = > - mode_lib->vba.DISPCLKWithRampingRoundedToDFSGranularity; > - } > - DTRACE(" dispclk_mhz (calculated) = %f", mode_lib->vba.DISPCLK_calculated); > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - mode_lib->vba.DPPCLK_calculated[k] = mode_lib->vba.DPPCLKUsingSingleDPP[k] > - / mode_lib->vba.DPPPerPlane[k] > - * (1 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100); > - mode_lib->vba.GlobalDPPCLK = dml_max( > - mode_lib->vba.GlobalDPPCLK, > - mode_lib->vba.DPPCLK_calculated[k]); > - } > - mode_lib->vba.GlobalDPPCLK = RoundToDFSGranularityUp( > - mode_lib->vba.GlobalDPPCLK, > - mode_lib->vba.DISPCLKDPPCLKVCOSpeed); > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - mode_lib->vba.DPPCLK_calculated[k] = mode_lib->vba.GlobalDPPCLK / 255 > - * dml_ceil( > - mode_lib->vba.DPPCLK_calculated[k] * 255 > - / mode_lib->vba.GlobalDPPCLK, > - 1); > - DTRACE(" dppclk_mhz[%i] (calculated) = %f", k, mode_lib->vba.DPPCLK_calculated[k]); > - } > - > - // Urgent Watermark > - mode_lib->vba.DCCEnabledAnyPlane = false; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) > - if (mode_lib->vba.DCCEnable[k]) > - mode_lib->vba.DCCEnabledAnyPlane = true; > - > - mode_lib->vba.ReturnBandwidthToDCN = dml_min( > - mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLK, > - mode_lib->vba.FabricAndDRAMBandwidth * 1000) > - * mode_lib->vba.PercentOfIdealDRAMAndFabricBWReceivedAfterUrgLatency / 100; > - > - mode_lib->vba.ReturnBW = mode_lib->vba.ReturnBandwidthToDCN; > - mode_lib->vba.ReturnBW = adjust_ReturnBW( > - mode_lib, > - mode_lib->vba.ReturnBW, > - mode_lib->vba.DCCEnabledAnyPlane, > - mode_lib->vba.ReturnBandwidthToDCN); > - > - // Let's do this calculation again?? > - mode_lib->vba.ReturnBandwidthToDCN = dml_min( > - mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLK, > - mode_lib->vba.FabricAndDRAMBandwidth * 1000); > - mode_lib->vba.ReturnBW = adjust_ReturnBW( > - mode_lib, > - mode_lib->vba.ReturnBW, > - mode_lib->vba.DCCEnabledAnyPlane, > - mode_lib->vba.ReturnBandwidthToDCN); > - > - DTRACE(" dcfclk_mhz = %f", mode_lib->vba.DCFCLK); > - DTRACE(" return_bw_to_dcn = %f", mode_lib->vba.ReturnBandwidthToDCN); > - DTRACE(" return_bus_bw = %f", mode_lib->vba.ReturnBW); > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - bool MainPlaneDoesODMCombine = false; > - > - if (mode_lib->vba.SourceScan[k] == dm_horz) > - mode_lib->vba.SwathWidthSingleDPPY[k] = mode_lib->vba.ViewportWidth[k]; > - else > - mode_lib->vba.SwathWidthSingleDPPY[k] = mode_lib->vba.ViewportHeight[k]; > - > - if (mode_lib->vba.ODMCombineEnabled[k] == true) > - MainPlaneDoesODMCombine = true; > - for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) > - if (mode_lib->vba.BlendingAndTiming[k] == j > - && mode_lib->vba.ODMCombineEnabled[j] == true) > - MainPlaneDoesODMCombine = true; > - > - if (MainPlaneDoesODMCombine == true) > - mode_lib->vba.SwathWidthY[k] = dml_min( > - (double) mode_lib->vba.SwathWidthSingleDPPY[k], > - dml_round( > - mode_lib->vba.HActive[k] / 2.0 > - * mode_lib->vba.HRatio[k])); > - else > - mode_lib->vba.SwathWidthY[k] = mode_lib->vba.SwathWidthSingleDPPY[k] > - / mode_lib->vba.DPPPerPlane[k]; > - } > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.SourcePixelFormat[k] == dm_444_64) { > - mode_lib->vba.BytePerPixelDETY[k] = 8; > - mode_lib->vba.BytePerPixelDETC[k] = 0; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_32) { > - mode_lib->vba.BytePerPixelDETY[k] = 4; > - mode_lib->vba.BytePerPixelDETC[k] = 0; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_16) { > - mode_lib->vba.BytePerPixelDETY[k] = 2; > - mode_lib->vba.BytePerPixelDETC[k] = 0; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_8) { > - mode_lib->vba.BytePerPixelDETY[k] = 1; > - mode_lib->vba.BytePerPixelDETC[k] = 0; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8) { > - mode_lib->vba.BytePerPixelDETY[k] = 1; > - mode_lib->vba.BytePerPixelDETC[k] = 2; > - } else { // dm_420_10 > - mode_lib->vba.BytePerPixelDETY[k] = 4.0 / 3.0; > - mode_lib->vba.BytePerPixelDETC[k] = 8.0 / 3.0; > - } > - } > - > - mode_lib->vba.TotalDataReadBandwidth = 0.0; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - mode_lib->vba.ReadBandwidthPlaneLuma[k] = mode_lib->vba.SwathWidthSingleDPPY[k] > - * dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1) > - / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) > - * mode_lib->vba.VRatio[k]; > - mode_lib->vba.ReadBandwidthPlaneChroma[k] = mode_lib->vba.SwathWidthSingleDPPY[k] > - / 2 * dml_ceil(mode_lib->vba.BytePerPixelDETC[k], 2) > - / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) > - * mode_lib->vba.VRatio[k] / 2; > - DTRACE( > - " read_bw[%i] = %fBps", > - k, > - mode_lib->vba.ReadBandwidthPlaneLuma[k] > - + mode_lib->vba.ReadBandwidthPlaneChroma[k]); > - mode_lib->vba.TotalDataReadBandwidth += mode_lib->vba.ReadBandwidthPlaneLuma[k] > - + mode_lib->vba.ReadBandwidthPlaneChroma[k]; > - } > - > - mode_lib->vba.TotalDCCActiveDPP = 0; > - mode_lib->vba.TotalActiveDPP = 0; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - mode_lib->vba.TotalActiveDPP = mode_lib->vba.TotalActiveDPP > - + mode_lib->vba.DPPPerPlane[k]; > - if (mode_lib->vba.DCCEnable[k]) > - mode_lib->vba.TotalDCCActiveDPP = mode_lib->vba.TotalDCCActiveDPP > - + mode_lib->vba.DPPPerPlane[k]; > - } > - > - mode_lib->vba.UrgentRoundTripAndOutOfOrderLatency = > - (mode_lib->vba.RoundTripPingLatencyCycles + 32) / mode_lib->vba.DCFCLK > - + mode_lib->vba.UrgentOutOfOrderReturnPerChannel > - * mode_lib->vba.NumberOfChannels > - / mode_lib->vba.ReturnBW; > - > - mode_lib->vba.LastPixelOfLineExtraWatermark = 0; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - double DataFabricLineDeliveryTimeLuma, DataFabricLineDeliveryTimeChroma; > - > - if (mode_lib->vba.VRatio[k] <= 1.0) > - mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k] = > - (double) mode_lib->vba.SwathWidthY[k] > - * mode_lib->vba.DPPPerPlane[k] > - / mode_lib->vba.HRatio[k] > - / mode_lib->vba.PixelClock[k]; > - else > - mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k] = > - (double) mode_lib->vba.SwathWidthY[k] > - / mode_lib->vba.PSCL_THROUGHPUT_LUMA[k] > - / mode_lib->vba.DPPCLK[k]; > - > - DataFabricLineDeliveryTimeLuma = mode_lib->vba.SwathWidthSingleDPPY[k] > - * mode_lib->vba.SwathHeightY[k] > - * dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1) > - / (mode_lib->vba.ReturnBW * mode_lib->vba.ReadBandwidthPlaneLuma[k] > - / mode_lib->vba.TotalDataReadBandwidth); > - mode_lib->vba.LastPixelOfLineExtraWatermark = dml_max( > - mode_lib->vba.LastPixelOfLineExtraWatermark, > - DataFabricLineDeliveryTimeLuma > - - mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k]); > - > - if (mode_lib->vba.BytePerPixelDETC[k] == 0) > - mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k] = 0.0; > - else if (mode_lib->vba.VRatio[k] / 2.0 <= 1.0) > - mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k] = > - mode_lib->vba.SwathWidthY[k] / 2.0 > - * mode_lib->vba.DPPPerPlane[k] > - / (mode_lib->vba.HRatio[k] / 2.0) > - / mode_lib->vba.PixelClock[k]; > - else > - mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k] = > - mode_lib->vba.SwathWidthY[k] / 2.0 > - / mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k] > - / mode_lib->vba.DPPCLK[k]; > - > - DataFabricLineDeliveryTimeChroma = mode_lib->vba.SwathWidthSingleDPPY[k] / 2.0 > - * mode_lib->vba.SwathHeightC[k] > - * dml_ceil(mode_lib->vba.BytePerPixelDETC[k], 2) > - / (mode_lib->vba.ReturnBW > - * mode_lib->vba.ReadBandwidthPlaneChroma[k] > - / mode_lib->vba.TotalDataReadBandwidth); > - mode_lib->vba.LastPixelOfLineExtraWatermark = > - dml_max( > - mode_lib->vba.LastPixelOfLineExtraWatermark, > - DataFabricLineDeliveryTimeChroma > - - mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k]); > - } > - > - mode_lib->vba.UrgentExtraLatency = mode_lib->vba.UrgentRoundTripAndOutOfOrderLatency > - + (mode_lib->vba.TotalActiveDPP * mode_lib->vba.PixelChunkSizeInKByte > - + mode_lib->vba.TotalDCCActiveDPP > - * mode_lib->vba.MetaChunkSize) * 1024.0 > - / mode_lib->vba.ReturnBW; > - > - if (mode_lib->vba.VirtualMemoryEnable) > - mode_lib->vba.UrgentExtraLatency += mode_lib->vba.TotalActiveDPP > - * mode_lib->vba.PTEChunkSize * 1024.0 / mode_lib->vba.ReturnBW; > - > - mode_lib->vba.UrgentWatermark = mode_lib->vba.UrgentLatency > - + mode_lib->vba.LastPixelOfLineExtraWatermark > - + mode_lib->vba.UrgentExtraLatency; > - > - DTRACE(" urgent_extra_latency = %fus", mode_lib->vba.UrgentExtraLatency); > - DTRACE(" wm_urgent = %fus", mode_lib->vba.UrgentWatermark); > - > - mode_lib->vba.MemoryTripWatermark = mode_lib->vba.UrgentLatency; > - > - mode_lib->vba.TotalActiveWriteback = 0; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.WritebackEnable[k]) > - mode_lib->vba.TotalActiveWriteback = mode_lib->vba.TotalActiveWriteback + 1; > - } > - > - if (mode_lib->vba.TotalActiveWriteback <= 1) > - mode_lib->vba.WritebackUrgentWatermark = mode_lib->vba.WritebackLatency; > - else > - mode_lib->vba.WritebackUrgentWatermark = mode_lib->vba.WritebackLatency > - + mode_lib->vba.WritebackChunkSize * 1024.0 / 32 > - / mode_lib->vba.SOCCLK; > - > - DTRACE(" wm_wb_urgent = %fus", mode_lib->vba.WritebackUrgentWatermark); > - > - // NB P-State/DRAM Clock Change Watermark > - mode_lib->vba.DRAMClockChangeWatermark = mode_lib->vba.DRAMClockChangeLatency > - + mode_lib->vba.UrgentWatermark; > - > - DTRACE(" wm_pstate_change = %fus", mode_lib->vba.DRAMClockChangeWatermark); > - > - DTRACE(" calculating wb pstate watermark"); > - DTRACE(" total wb outputs %d", mode_lib->vba.TotalActiveWriteback); > - DTRACE(" socclk frequency %f Mhz", mode_lib->vba.SOCCLK); > - > - if (mode_lib->vba.TotalActiveWriteback <= 1) > - mode_lib->vba.WritebackDRAMClockChangeWatermark = > - mode_lib->vba.DRAMClockChangeLatency > - + mode_lib->vba.WritebackLatency; > - else > - mode_lib->vba.WritebackDRAMClockChangeWatermark = > - mode_lib->vba.DRAMClockChangeLatency > - + mode_lib->vba.WritebackLatency > - + mode_lib->vba.WritebackChunkSize * 1024.0 / 32 > - / mode_lib->vba.SOCCLK; > - > - DTRACE(" wm_wb_pstate %fus", mode_lib->vba.WritebackDRAMClockChangeWatermark); > - > - // Stutter Efficiency > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - mode_lib->vba.LinesInDETY[k] = mode_lib->vba.DETBufferSizeY[k] > - / mode_lib->vba.BytePerPixelDETY[k] / mode_lib->vba.SwathWidthY[k]; > - mode_lib->vba.LinesInDETYRoundedDownToSwath[k] = dml_floor( > - mode_lib->vba.LinesInDETY[k], > - mode_lib->vba.SwathHeightY[k]); > - mode_lib->vba.FullDETBufferingTimeY[k] = > - mode_lib->vba.LinesInDETYRoundedDownToSwath[k] > - * (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]) > - / mode_lib->vba.VRatio[k]; > - if (mode_lib->vba.BytePerPixelDETC[k] > 0) { > - mode_lib->vba.LinesInDETC[k] = mode_lib->vba.DETBufferSizeC[k] > - / mode_lib->vba.BytePerPixelDETC[k] > - / (mode_lib->vba.SwathWidthY[k] / 2); > - mode_lib->vba.LinesInDETCRoundedDownToSwath[k] = dml_floor( > - mode_lib->vba.LinesInDETC[k], > - mode_lib->vba.SwathHeightC[k]); > - mode_lib->vba.FullDETBufferingTimeC[k] = > - mode_lib->vba.LinesInDETCRoundedDownToSwath[k] > - * (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]) > - / (mode_lib->vba.VRatio[k] / 2); > - } else { > - mode_lib->vba.LinesInDETC[k] = 0; > - mode_lib->vba.LinesInDETCRoundedDownToSwath[k] = 0; > - mode_lib->vba.FullDETBufferingTimeC[k] = 999999; > - } > - } > - > - mode_lib->vba.MinFullDETBufferingTime = 999999.0; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.FullDETBufferingTimeY[k] > - < mode_lib->vba.MinFullDETBufferingTime) { > - mode_lib->vba.MinFullDETBufferingTime = > - mode_lib->vba.FullDETBufferingTimeY[k]; > - mode_lib->vba.FrameTimeForMinFullDETBufferingTime = > - (double) mode_lib->vba.VTotal[k] * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]; > - } > - if (mode_lib->vba.FullDETBufferingTimeC[k] > - < mode_lib->vba.MinFullDETBufferingTime) { > - mode_lib->vba.MinFullDETBufferingTime = > - mode_lib->vba.FullDETBufferingTimeC[k]; > - mode_lib->vba.FrameTimeForMinFullDETBufferingTime = > - (double) mode_lib->vba.VTotal[k] * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]; > - } > - } > - > - mode_lib->vba.AverageReadBandwidthGBytePerSecond = 0.0; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.DCCEnable[k]) { > - mode_lib->vba.AverageReadBandwidthGBytePerSecond = > - mode_lib->vba.AverageReadBandwidthGBytePerSecond > - + mode_lib->vba.ReadBandwidthPlaneLuma[k] > - / mode_lib->vba.DCCRate[k] > - / 1000 > - + mode_lib->vba.ReadBandwidthPlaneChroma[k] > - / mode_lib->vba.DCCRate[k] > - / 1000; > - } else { > - mode_lib->vba.AverageReadBandwidthGBytePerSecond = > - mode_lib->vba.AverageReadBandwidthGBytePerSecond > - + mode_lib->vba.ReadBandwidthPlaneLuma[k] > - / 1000 > - + mode_lib->vba.ReadBandwidthPlaneChroma[k] > - / 1000; > - } > - if (mode_lib->vba.DCCEnable[k]) { > - mode_lib->vba.AverageReadBandwidthGBytePerSecond = > - mode_lib->vba.AverageReadBandwidthGBytePerSecond > - + mode_lib->vba.ReadBandwidthPlaneLuma[k] > - / 1000 / 256 > - + mode_lib->vba.ReadBandwidthPlaneChroma[k] > - / 1000 / 256; > - } > - if (mode_lib->vba.VirtualMemoryEnable) { > - mode_lib->vba.AverageReadBandwidthGBytePerSecond = > - mode_lib->vba.AverageReadBandwidthGBytePerSecond > - + mode_lib->vba.ReadBandwidthPlaneLuma[k] > - / 1000 / 512 > - + mode_lib->vba.ReadBandwidthPlaneChroma[k] > - / 1000 / 512; > - } > - } > - > - mode_lib->vba.PartOfBurstThatFitsInROB = > - dml_min( > - mode_lib->vba.MinFullDETBufferingTime > - * mode_lib->vba.TotalDataReadBandwidth, > - mode_lib->vba.ROBBufferSizeInKByte * 1024 > - * mode_lib->vba.TotalDataReadBandwidth > - / (mode_lib->vba.AverageReadBandwidthGBytePerSecond > - * 1000)); > - mode_lib->vba.StutterBurstTime = mode_lib->vba.PartOfBurstThatFitsInROB > - * (mode_lib->vba.AverageReadBandwidthGBytePerSecond * 1000) > - / mode_lib->vba.TotalDataReadBandwidth / mode_lib->vba.ReturnBW > - + (mode_lib->vba.MinFullDETBufferingTime > - * mode_lib->vba.TotalDataReadBandwidth > - - mode_lib->vba.PartOfBurstThatFitsInROB) > - / (mode_lib->vba.DCFCLK * 64); > - if (mode_lib->vba.TotalActiveWriteback == 0) { > - mode_lib->vba.StutterEfficiencyNotIncludingVBlank = (1 > - - (mode_lib->vba.SRExitTime + mode_lib->vba.StutterBurstTime) > - / mode_lib->vba.MinFullDETBufferingTime) * 100; > - } else { > - mode_lib->vba.StutterEfficiencyNotIncludingVBlank = 0; > - } > - > - mode_lib->vba.SmallestVBlank = 999999; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.SynchronizedVBlank || mode_lib->vba.NumberOfActivePlanes == 1) { > - mode_lib->vba.VBlankTime = (double) (mode_lib->vba.VTotal[k] > - - mode_lib->vba.VActive[k]) * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]; > - } else { > - mode_lib->vba.VBlankTime = 0; > - } > - mode_lib->vba.SmallestVBlank = dml_min( > - mode_lib->vba.SmallestVBlank, > - mode_lib->vba.VBlankTime); > - } > - > - mode_lib->vba.StutterEfficiency = (mode_lib->vba.StutterEfficiencyNotIncludingVBlank / 100 > - * (mode_lib->vba.FrameTimeForMinFullDETBufferingTime > - - mode_lib->vba.SmallestVBlank) > - + mode_lib->vba.SmallestVBlank) > - / mode_lib->vba.FrameTimeForMinFullDETBufferingTime * 100; > - > - // dml_ml->vba.DCFCLK Deep Sleep > - mode_lib->vba.DCFClkDeepSleep = 8.0; > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; k++) { > - if (mode_lib->vba.BytePerPixelDETC[k] > 0) { > - mode_lib->vba.DCFCLKDeepSleepPerPlane = > - dml_max( > - 1.1 * mode_lib->vba.SwathWidthY[k] > - * dml_ceil( > - mode_lib->vba.BytePerPixelDETY[k], > - 1) / 32 > - / mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k], > - 1.1 * mode_lib->vba.SwathWidthY[k] / 2.0 > - * dml_ceil( > - mode_lib->vba.BytePerPixelDETC[k], > - 2) / 32 > - / mode_lib->vba.DisplayPipeLineDeliveryTimeChroma[k]); > - } else > - mode_lib->vba.DCFCLKDeepSleepPerPlane = 1.1 * mode_lib->vba.SwathWidthY[k] > - * dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1) / 64.0 > - / mode_lib->vba.DisplayPipeLineDeliveryTimeLuma[k]; > - mode_lib->vba.DCFCLKDeepSleepPerPlane = dml_max( > - mode_lib->vba.DCFCLKDeepSleepPerPlane, > - mode_lib->vba.PixelClock[k] / 16.0); > - mode_lib->vba.DCFClkDeepSleep = dml_max( > - mode_lib->vba.DCFClkDeepSleep, > - mode_lib->vba.DCFCLKDeepSleepPerPlane); > - > - DTRACE( > - " dcfclk_deepsleep_per_plane[%i] = %fMHz", > - k, > - mode_lib->vba.DCFCLKDeepSleepPerPlane); > - } > - > - DTRACE(" dcfclk_deepsleep_mhz = %fMHz", mode_lib->vba.DCFClkDeepSleep); > - > - // Stutter Watermark > - mode_lib->vba.StutterExitWatermark = mode_lib->vba.SRExitTime > - + mode_lib->vba.LastPixelOfLineExtraWatermark > - + mode_lib->vba.UrgentExtraLatency + 10 / mode_lib->vba.DCFClkDeepSleep; > - mode_lib->vba.StutterEnterPlusExitWatermark = mode_lib->vba.SREnterPlusExitTime > - + mode_lib->vba.LastPixelOfLineExtraWatermark > - + mode_lib->vba.UrgentExtraLatency; > - > - DTRACE(" wm_cstate_exit = %fus", mode_lib->vba.StutterExitWatermark); > - DTRACE(" wm_cstate_enter_exit = %fus", mode_lib->vba.StutterEnterPlusExitWatermark); > - > - // Urgent Latency Supported > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - mode_lib->vba.EffectiveDETPlusLBLinesLuma = > - dml_floor( > - mode_lib->vba.LinesInDETY[k] > - + dml_min( > - mode_lib->vba.LinesInDETY[k] > - * mode_lib->vba.DPPCLK[k] > - * mode_lib->vba.BytePerPixelDETY[k] > - * mode_lib->vba.PSCL_THROUGHPUT_LUMA[k] > - / (mode_lib->vba.ReturnBW > - / mode_lib->vba.DPPPerPlane[k]), > - (double) mode_lib->vba.EffectiveLBLatencyHidingSourceLinesLuma), > - mode_lib->vba.SwathHeightY[k]); > - > - mode_lib->vba.UrgentLatencySupportUsLuma = mode_lib->vba.EffectiveDETPlusLBLinesLuma > - * (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) > - / mode_lib->vba.VRatio[k] > - - mode_lib->vba.EffectiveDETPlusLBLinesLuma > - * mode_lib->vba.SwathWidthY[k] > - * mode_lib->vba.BytePerPixelDETY[k] > - / (mode_lib->vba.ReturnBW > - / mode_lib->vba.DPPPerPlane[k]); > - > - if (mode_lib->vba.BytePerPixelDETC[k] > 0) { > - mode_lib->vba.EffectiveDETPlusLBLinesChroma = > - dml_floor( > - mode_lib->vba.LinesInDETC[k] > - + dml_min( > - mode_lib->vba.LinesInDETC[k] > - * mode_lib->vba.DPPCLK[k] > - * mode_lib->vba.BytePerPixelDETC[k] > - * mode_lib->vba.PSCL_THROUGHPUT_CHROMA[k] > - / (mode_lib->vba.ReturnBW > - / mode_lib->vba.DPPPerPlane[k]), > - (double) mode_lib->vba.EffectiveLBLatencyHidingSourceLinesChroma), > - mode_lib->vba.SwathHeightC[k]); > - mode_lib->vba.UrgentLatencySupportUsChroma = > - mode_lib->vba.EffectiveDETPlusLBLinesChroma > - * (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]) > - / (mode_lib->vba.VRatio[k] / 2) > - - mode_lib->vba.EffectiveDETPlusLBLinesChroma > - * (mode_lib->vba.SwathWidthY[k] > - / 2) > - * mode_lib->vba.BytePerPixelDETC[k] > - / (mode_lib->vba.ReturnBW > - / mode_lib->vba.DPPPerPlane[k]); > - mode_lib->vba.UrgentLatencySupportUs[k] = dml_min( > - mode_lib->vba.UrgentLatencySupportUsLuma, > - mode_lib->vba.UrgentLatencySupportUsChroma); > - } else { > - mode_lib->vba.UrgentLatencySupportUs[k] = > - mode_lib->vba.UrgentLatencySupportUsLuma; > - } > - } > - > - mode_lib->vba.MinUrgentLatencySupportUs = 999999; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - mode_lib->vba.MinUrgentLatencySupportUs = dml_min( > - mode_lib->vba.MinUrgentLatencySupportUs, > - mode_lib->vba.UrgentLatencySupportUs[k]); > - } > - > - // Non-Urgent Latency Tolerance > - mode_lib->vba.NonUrgentLatencyTolerance = mode_lib->vba.MinUrgentLatencySupportUs > - - mode_lib->vba.UrgentWatermark; > - > - // DSCCLK > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if ((mode_lib->vba.BlendingAndTiming[k] != k) || !mode_lib->vba.DSCEnabled[k]) { > - mode_lib->vba.DSCCLK_calculated[k] = 0.0; > - } else { > - if (mode_lib->vba.OutputFormat[k] == dm_420 > - || mode_lib->vba.OutputFormat[k] == dm_n422) > - mode_lib->vba.DSCFormatFactor = 2; > - else > - mode_lib->vba.DSCFormatFactor = 1; > - if (mode_lib->vba.ODMCombineEnabled[k]) > - mode_lib->vba.DSCCLK_calculated[k] = > - mode_lib->vba.PixelClockBackEnd[k] / 6 > - / mode_lib->vba.DSCFormatFactor > - / (1 > - - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100); > - else > - mode_lib->vba.DSCCLK_calculated[k] = > - mode_lib->vba.PixelClockBackEnd[k] / 3 > - / mode_lib->vba.DSCFormatFactor > - / (1 > - - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100); > - } > - } > - > - // DSC Delay > - // TODO > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - double bpp = mode_lib->vba.OutputBpp[k]; > - unsigned int slices = mode_lib->vba.NumberOfDSCSlices[k]; > - > - if (mode_lib->vba.DSCEnabled[k] && bpp != 0) { > - if (!mode_lib->vba.ODMCombineEnabled[k]) { > - mode_lib->vba.DSCDelay[k] = > - dscceComputeDelay( > - mode_lib->vba.DSCInputBitPerComponent[k], > - bpp, > - dml_ceil( > - (double) mode_lib->vba.HActive[k] > - / mode_lib->vba.NumberOfDSCSlices[k], > - 1), > - slices, > - mode_lib->vba.OutputFormat[k]) > - + dscComputeDelay( > - mode_lib->vba.OutputFormat[k]); > - } else { > - mode_lib->vba.DSCDelay[k] = > - 2 > - * (dscceComputeDelay( > - mode_lib->vba.DSCInputBitPerComponent[k], > - bpp, > - dml_ceil( > - (double) mode_lib->vba.HActive[k] > - / mode_lib->vba.NumberOfDSCSlices[k], > - 1), > - slices / 2.0, > - mode_lib->vba.OutputFormat[k]) > - + dscComputeDelay( > - mode_lib->vba.OutputFormat[k])); > - } > - mode_lib->vba.DSCDelay[k] = mode_lib->vba.DSCDelay[k] > - * mode_lib->vba.PixelClock[k] > - / mode_lib->vba.PixelClockBackEnd[k]; > - } else { > - mode_lib->vba.DSCDelay[k] = 0; > - } > - } > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) > - for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) // NumberOfPlanes > - if (j != k && mode_lib->vba.BlendingAndTiming[k] == j > - && mode_lib->vba.DSCEnabled[j]) > - mode_lib->vba.DSCDelay[k] = mode_lib->vba.DSCDelay[j]; > - > - // Prefetch > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - unsigned int PDEAndMetaPTEBytesFrameY; > - unsigned int PixelPTEBytesPerRowY; > - unsigned int MetaRowByteY; > - unsigned int MetaRowByteC; > - unsigned int PDEAndMetaPTEBytesFrameC; > - unsigned int PixelPTEBytesPerRowC; > - > - Calculate256BBlockSizes( > - mode_lib->vba.SourcePixelFormat[k], > - mode_lib->vba.SurfaceTiling[k], > - dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1), > - dml_ceil(mode_lib->vba.BytePerPixelDETC[k], 2), > - &mode_lib->vba.BlockHeight256BytesY[k], > - &mode_lib->vba.BlockHeight256BytesC[k], > - &mode_lib->vba.BlockWidth256BytesY[k], > - &mode_lib->vba.BlockWidth256BytesC[k]); > - PDEAndMetaPTEBytesFrameY = CalculateVMAndRowBytes( > - mode_lib, > - mode_lib->vba.DCCEnable[k], > - mode_lib->vba.BlockHeight256BytesY[k], > - mode_lib->vba.BlockWidth256BytesY[k], > - mode_lib->vba.SourcePixelFormat[k], > - mode_lib->vba.SurfaceTiling[k], > - dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1), > - mode_lib->vba.SourceScan[k], > - mode_lib->vba.ViewportWidth[k], > - mode_lib->vba.ViewportHeight[k], > - mode_lib->vba.SwathWidthY[k], > - mode_lib->vba.VirtualMemoryEnable, > - mode_lib->vba.VMMPageSize, > - mode_lib->vba.PTEBufferSizeInRequests, > - mode_lib->vba.PDEProcessingBufIn64KBReqs, > - mode_lib->vba.PitchY[k], > - mode_lib->vba.DCCMetaPitchY[k], > - &mode_lib->vba.MacroTileWidthY[k], > - &MetaRowByteY, > - &PixelPTEBytesPerRowY, > - &mode_lib->vba.PTEBufferSizeNotExceeded[mode_lib->vba.VoltageLevel], > - &mode_lib->vba.dpte_row_height[k], > - &mode_lib->vba.meta_row_height[k]); > - mode_lib->vba.PrefetchSourceLinesY[k] = CalculatePrefetchSourceLines( > - mode_lib, > - mode_lib->vba.VRatio[k], > - mode_lib->vba.vtaps[k], > - mode_lib->vba.Interlace[k], > - mode_lib->vba.ProgressiveToInterlaceUnitInOPP, > - mode_lib->vba.SwathHeightY[k], > - mode_lib->vba.ViewportYStartY[k], > - &mode_lib->vba.VInitPreFillY[k], > - &mode_lib->vba.MaxNumSwathY[k]); > - > - if ((mode_lib->vba.SourcePixelFormat[k] != dm_444_64 > - && mode_lib->vba.SourcePixelFormat[k] != dm_444_32 > - && mode_lib->vba.SourcePixelFormat[k] != dm_444_16 > - && mode_lib->vba.SourcePixelFormat[k] != dm_444_8)) { > - PDEAndMetaPTEBytesFrameC = > - CalculateVMAndRowBytes( > - mode_lib, > - mode_lib->vba.DCCEnable[k], > - mode_lib->vba.BlockHeight256BytesC[k], > - mode_lib->vba.BlockWidth256BytesC[k], > - mode_lib->vba.SourcePixelFormat[k], > - mode_lib->vba.SurfaceTiling[k], > - dml_ceil( > - mode_lib->vba.BytePerPixelDETC[k], > - 2), > - mode_lib->vba.SourceScan[k], > - mode_lib->vba.ViewportWidth[k] / 2, > - mode_lib->vba.ViewportHeight[k] / 2, > - mode_lib->vba.SwathWidthY[k] / 2, > - mode_lib->vba.VirtualMemoryEnable, > - mode_lib->vba.VMMPageSize, > - mode_lib->vba.PTEBufferSizeInRequests, > - mode_lib->vba.PDEProcessingBufIn64KBReqs, > - mode_lib->vba.PitchC[k], > - 0, > - &mode_lib->vba.MacroTileWidthC[k], > - &MetaRowByteC, > - &PixelPTEBytesPerRowC, > - &mode_lib->vba.PTEBufferSizeNotExceeded[mode_lib->vba.VoltageLevel], > - &mode_lib->vba.dpte_row_height_chroma[k], > - &mode_lib->vba.meta_row_height_chroma[k]); > - mode_lib->vba.PrefetchSourceLinesC[k] = CalculatePrefetchSourceLines( > - mode_lib, > - mode_lib->vba.VRatio[k] / 2, > - mode_lib->vba.VTAPsChroma[k], > - mode_lib->vba.Interlace[k], > - mode_lib->vba.ProgressiveToInterlaceUnitInOPP, > - mode_lib->vba.SwathHeightC[k], > - mode_lib->vba.ViewportYStartC[k], > - &mode_lib->vba.VInitPreFillC[k], > - &mode_lib->vba.MaxNumSwathC[k]); > - } else { > - PixelPTEBytesPerRowC = 0; > - PDEAndMetaPTEBytesFrameC = 0; > - MetaRowByteC = 0; > - mode_lib->vba.MaxNumSwathC[k] = 0; > - mode_lib->vba.PrefetchSourceLinesC[k] = 0; > - } > - > - mode_lib->vba.PixelPTEBytesPerRow[k] = PixelPTEBytesPerRowY + PixelPTEBytesPerRowC; > - mode_lib->vba.PDEAndMetaPTEBytesFrame[k] = PDEAndMetaPTEBytesFrameY > - + PDEAndMetaPTEBytesFrameC; > - mode_lib->vba.MetaRowByte[k] = MetaRowByteY + MetaRowByteC; > - > - CalculateActiveRowBandwidth( > - mode_lib->vba.VirtualMemoryEnable, > - mode_lib->vba.SourcePixelFormat[k], > - mode_lib->vba.VRatio[k], > - mode_lib->vba.DCCEnable[k], > - mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k], > - MetaRowByteY, > - MetaRowByteC, > - mode_lib->vba.meta_row_height[k], > - mode_lib->vba.meta_row_height_chroma[k], > - PixelPTEBytesPerRowY, > - PixelPTEBytesPerRowC, > - mode_lib->vba.dpte_row_height[k], > - mode_lib->vba.dpte_row_height_chroma[k], > - &mode_lib->vba.meta_row_bw[k], > - &mode_lib->vba.dpte_row_bw[k], > - &mode_lib->vba.qual_row_bw[k]); > - } > - > - mode_lib->vba.TCalc = 24.0 / mode_lib->vba.DCFClkDeepSleep; > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.BlendingAndTiming[k] == k) { > - if (mode_lib->vba.WritebackEnable[k] == true) { > - mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k] = > - mode_lib->vba.WritebackLatency > - + CalculateWriteBackDelay( > - mode_lib->vba.WritebackPixelFormat[k], > - mode_lib->vba.WritebackHRatio[k], > - mode_lib->vba.WritebackVRatio[k], > - mode_lib->vba.WritebackLumaHTaps[k], > - mode_lib->vba.WritebackLumaVTaps[k], > - mode_lib->vba.WritebackChromaHTaps[k], > - mode_lib->vba.WritebackChromaVTaps[k], > - mode_lib->vba.WritebackDestinationWidth[k]) > - / mode_lib->vba.DISPCLK; > - } else > - mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k] = 0; > - for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) { > - if (mode_lib->vba.BlendingAndTiming[j] == k > - && mode_lib->vba.WritebackEnable[j] == true) { > - mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k] = > - dml_max( > - mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k], > - mode_lib->vba.WritebackLatency > - + CalculateWriteBackDelay( > - mode_lib->vba.WritebackPixelFormat[j], > - mode_lib->vba.WritebackHRatio[j], > - mode_lib->vba.WritebackVRatio[j], > - mode_lib->vba.WritebackLumaHTaps[j], > - mode_lib->vba.WritebackLumaVTaps[j], > - mode_lib->vba.WritebackChromaHTaps[j], > - mode_lib->vba.WritebackChromaVTaps[j], > - mode_lib->vba.WritebackDestinationWidth[j]) > - / mode_lib->vba.DISPCLK); > - } > - } > - } > - } > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) > - for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) > - if (mode_lib->vba.BlendingAndTiming[k] == j) > - mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k] = > - mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][j]; > - > - mode_lib->vba.VStartupLines = 13; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - mode_lib->vba.MaxVStartupLines[k] = > - mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k] > - - dml_max( > - 1.0, > - dml_ceil( > - mode_lib->vba.WritebackDelay[mode_lib->vba.VoltageLevel][k] > - / (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]), > - 1)); > - } > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) > - mode_lib->vba.MaximumMaxVStartupLines = dml_max( > - mode_lib->vba.MaximumMaxVStartupLines, > - mode_lib->vba.MaxVStartupLines[k]); > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - mode_lib->vba.cursor_bw[k] = 0.0; > - for (j = 0; j < mode_lib->vba.NumberOfCursors[k]; ++j) > - mode_lib->vba.cursor_bw[k] += mode_lib->vba.CursorWidth[k][j] > - * mode_lib->vba.CursorBPP[k][j] / 8.0 > - / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) > - * mode_lib->vba.VRatio[k]; > - } > - > - do { > - double MaxTotalRDBandwidth = 0; > - bool DestinationLineTimesForPrefetchLessThan2 = false; > - bool VRatioPrefetchMoreThan4 = false; > - bool prefetch_vm_bw_valid = true; > - bool prefetch_row_bw_valid = true; > - double TWait = CalculateTWait( > - mode_lib->vba.PrefetchMode, > - mode_lib->vba.DRAMClockChangeLatency, > - mode_lib->vba.UrgentLatency, > - mode_lib->vba.SREnterPlusExitTime); > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.XFCEnabled[k] == true) { > - mode_lib->vba.XFCRemoteSurfaceFlipDelay = > - CalculateRemoteSurfaceFlipDelay( > - mode_lib, > - mode_lib->vba.VRatio[k], > - mode_lib->vba.SwathWidthY[k], > - dml_ceil( > - mode_lib->vba.BytePerPixelDETY[k], > - 1), > - mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k], > - mode_lib->vba.XFCTSlvVupdateOffset, > - mode_lib->vba.XFCTSlvVupdateWidth, > - mode_lib->vba.XFCTSlvVreadyOffset, > - mode_lib->vba.XFCXBUFLatencyTolerance, > - mode_lib->vba.XFCFillBWOverhead, > - mode_lib->vba.XFCSlvChunkSize, > - mode_lib->vba.XFCBusTransportTime, > - mode_lib->vba.TCalc, > - TWait, > - &mode_lib->vba.SrcActiveDrainRate, > - &mode_lib->vba.TInitXFill, > - &mode_lib->vba.TslvChk); > - } else { > - mode_lib->vba.XFCRemoteSurfaceFlipDelay = 0; > - } > - mode_lib->vba.ErrorResult[k] = > - CalculatePrefetchSchedule( > - mode_lib, > - mode_lib->vba.DPPCLK[k], > - mode_lib->vba.DISPCLK, > - mode_lib->vba.PixelClock[k], > - mode_lib->vba.DCFClkDeepSleep, > - mode_lib->vba.DSCDelay[k], > - mode_lib->vba.DPPPerPlane[k], > - mode_lib->vba.ScalerEnabled[k], > - mode_lib->vba.NumberOfCursors[k], > - mode_lib->vba.DPPCLKDelaySubtotal, > - mode_lib->vba.DPPCLKDelaySCL, > - mode_lib->vba.DPPCLKDelaySCLLBOnly, > - mode_lib->vba.DPPCLKDelayCNVCFormater, > - mode_lib->vba.DPPCLKDelayCNVCCursor, > - mode_lib->vba.DISPCLKDelaySubtotal, > - (unsigned int) (mode_lib->vba.SwathWidthY[k] > - / mode_lib->vba.HRatio[k]), > - mode_lib->vba.OutputFormat[k], > - mode_lib->vba.VTotal[k] > - - mode_lib->vba.VActive[k], > - mode_lib->vba.HTotal[k], > - mode_lib->vba.MaxInterDCNTileRepeaters, > - dml_min( > - mode_lib->vba.VStartupLines, > - mode_lib->vba.MaxVStartupLines[k]), > - mode_lib->vba.MaxPageTableLevels, > - mode_lib->vba.VirtualMemoryEnable, > - mode_lib->vba.DynamicMetadataEnable[k], > - mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired[k], > - mode_lib->vba.DynamicMetadataTransmittedBytes[k], > - mode_lib->vba.DCCEnable[k], > - mode_lib->vba.UrgentLatency, > - mode_lib->vba.UrgentExtraLatency, > - mode_lib->vba.TCalc, > - mode_lib->vba.PDEAndMetaPTEBytesFrame[k], > - mode_lib->vba.MetaRowByte[k], > - mode_lib->vba.PixelPTEBytesPerRow[k], > - mode_lib->vba.PrefetchSourceLinesY[k], > - mode_lib->vba.SwathWidthY[k], > - mode_lib->vba.BytePerPixelDETY[k], > - mode_lib->vba.VInitPreFillY[k], > - mode_lib->vba.MaxNumSwathY[k], > - mode_lib->vba.PrefetchSourceLinesC[k], > - mode_lib->vba.BytePerPixelDETC[k], > - mode_lib->vba.VInitPreFillC[k], > - mode_lib->vba.MaxNumSwathC[k], > - mode_lib->vba.SwathHeightY[k], > - mode_lib->vba.SwathHeightC[k], > - TWait, > - mode_lib->vba.XFCEnabled[k], > - mode_lib->vba.XFCRemoteSurfaceFlipDelay, > - mode_lib->vba.Interlace[k], > - mode_lib->vba.ProgressiveToInterlaceUnitInOPP, > - &mode_lib->vba.DSTXAfterScaler[k], > - &mode_lib->vba.DSTYAfterScaler[k], > - &mode_lib->vba.DestinationLinesForPrefetch[k], > - &mode_lib->vba.PrefetchBandwidth[k], > - &mode_lib->vba.DestinationLinesToRequestVMInVBlank[k], > - &mode_lib->vba.DestinationLinesToRequestRowInVBlank[k], > - &mode_lib->vba.VRatioPrefetchY[k], > - &mode_lib->vba.VRatioPrefetchC[k], > - &mode_lib->vba.RequiredPrefetchPixDataBW[k], > - &mode_lib->vba.VStartupRequiredWhenNotEnoughTimeForDynamicMetadata, > - &mode_lib->vba.Tno_bw[k], > - &mode_lib->vba.VUpdateOffsetPix[k], > - &mode_lib->vba.VUpdateWidthPix[k], > - &mode_lib->vba.VReadyOffsetPix[k]); > - if (mode_lib->vba.BlendingAndTiming[k] == k) { > - mode_lib->vba.VStartup[k] = dml_min( > - mode_lib->vba.VStartupLines, > - mode_lib->vba.MaxVStartupLines[k]); > - if (mode_lib->vba.VStartupRequiredWhenNotEnoughTimeForDynamicMetadata > - != 0) { > - mode_lib->vba.VStartup[k] = > - mode_lib->vba.VStartupRequiredWhenNotEnoughTimeForDynamicMetadata; > - } > - } else { > - mode_lib->vba.VStartup[k] = > - dml_min( > - mode_lib->vba.VStartupLines, > - mode_lib->vba.MaxVStartupLines[mode_lib->vba.BlendingAndTiming[k]]); > - } > - } > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - > - if (mode_lib->vba.PDEAndMetaPTEBytesFrame[k] == 0) > - mode_lib->vba.prefetch_vm_bw[k] = 0; > - else if (mode_lib->vba.DestinationLinesToRequestVMInVBlank[k] > 0) { > - mode_lib->vba.prefetch_vm_bw[k] = > - (double) mode_lib->vba.PDEAndMetaPTEBytesFrame[k] > - / (mode_lib->vba.DestinationLinesToRequestVMInVBlank[k] > - * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]); > - } else { > - mode_lib->vba.prefetch_vm_bw[k] = 0; > - prefetch_vm_bw_valid = false; > - } > - if (mode_lib->vba.MetaRowByte[k] + mode_lib->vba.PixelPTEBytesPerRow[k] > - == 0) > - mode_lib->vba.prefetch_row_bw[k] = 0; > - else if (mode_lib->vba.DestinationLinesToRequestRowInVBlank[k] > 0) { > - mode_lib->vba.prefetch_row_bw[k] = > - (double) (mode_lib->vba.MetaRowByte[k] > - + mode_lib->vba.PixelPTEBytesPerRow[k]) > - / (mode_lib->vba.DestinationLinesToRequestRowInVBlank[k] > - * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]); > - } else { > - mode_lib->vba.prefetch_row_bw[k] = 0; > - prefetch_row_bw_valid = false; > - } > - > - MaxTotalRDBandwidth = > - MaxTotalRDBandwidth + mode_lib->vba.cursor_bw[k] > - + dml_max( > - mode_lib->vba.prefetch_vm_bw[k], > - dml_max( > - mode_lib->vba.prefetch_row_bw[k], > - dml_max( > - mode_lib->vba.ReadBandwidthPlaneLuma[k] > - + mode_lib->vba.ReadBandwidthPlaneChroma[k], > - mode_lib->vba.RequiredPrefetchPixDataBW[k]) > - + mode_lib->vba.meta_row_bw[k] > - + mode_lib->vba.dpte_row_bw[k])); > - > - if (mode_lib->vba.DestinationLinesForPrefetch[k] < 2) > - DestinationLineTimesForPrefetchLessThan2 = true; > - if (mode_lib->vba.VRatioPrefetchY[k] > 4 > - || mode_lib->vba.VRatioPrefetchC[k] > 4) > - VRatioPrefetchMoreThan4 = true; > - } > - > - if (MaxTotalRDBandwidth <= mode_lib->vba.ReturnBW && prefetch_vm_bw_valid > - && prefetch_row_bw_valid && !VRatioPrefetchMoreThan4 > - && !DestinationLineTimesForPrefetchLessThan2) > - mode_lib->vba.PrefetchModeSupported = true; > - else { > - mode_lib->vba.PrefetchModeSupported = false; > - dml_print( > - "DML: CalculatePrefetchSchedule ***failed***. Bandwidth violation. Results are NOT valid\n"); > - } > - > - if (mode_lib->vba.PrefetchModeSupported == true) { > - double final_flip_bw[DC__NUM_DPP__MAX]; > - unsigned int ImmediateFlipBytes[DC__NUM_DPP__MAX]; > - double total_dcn_read_bw_with_flip = 0; > - > - mode_lib->vba.BandwidthAvailableForImmediateFlip = mode_lib->vba.ReturnBW; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - mode_lib->vba.BandwidthAvailableForImmediateFlip = > - mode_lib->vba.BandwidthAvailableForImmediateFlip > - - mode_lib->vba.cursor_bw[k] > - - dml_max( > - mode_lib->vba.ReadBandwidthPlaneLuma[k] > - + mode_lib->vba.ReadBandwidthPlaneChroma[k] > - + mode_lib->vba.qual_row_bw[k], > - mode_lib->vba.PrefetchBandwidth[k]); > - } > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - ImmediateFlipBytes[k] = 0; > - if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8 > - && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) { > - ImmediateFlipBytes[k] = > - mode_lib->vba.PDEAndMetaPTEBytesFrame[k] > - + mode_lib->vba.MetaRowByte[k] > - + mode_lib->vba.PixelPTEBytesPerRow[k]; > - } > - } > - mode_lib->vba.TotImmediateFlipBytes = 0; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8 > - && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) { > - mode_lib->vba.TotImmediateFlipBytes = > - mode_lib->vba.TotImmediateFlipBytes > - + ImmediateFlipBytes[k]; > - } > - } > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - CalculateFlipSchedule( > - mode_lib, > - mode_lib->vba.UrgentExtraLatency, > - mode_lib->vba.UrgentLatency, > - mode_lib->vba.MaxPageTableLevels, > - mode_lib->vba.VirtualMemoryEnable, > - mode_lib->vba.BandwidthAvailableForImmediateFlip, > - mode_lib->vba.TotImmediateFlipBytes, > - mode_lib->vba.SourcePixelFormat[k], > - ImmediateFlipBytes[k], > - mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k], > - mode_lib->vba.VRatio[k], > - mode_lib->vba.Tno_bw[k], > - mode_lib->vba.PDEAndMetaPTEBytesFrame[k], > - mode_lib->vba.MetaRowByte[k], > - mode_lib->vba.PixelPTEBytesPerRow[k], > - mode_lib->vba.DCCEnable[k], > - mode_lib->vba.dpte_row_height[k], > - mode_lib->vba.meta_row_height[k], > - mode_lib->vba.qual_row_bw[k], > - &mode_lib->vba.DestinationLinesToRequestVMInImmediateFlip[k], > - &mode_lib->vba.DestinationLinesToRequestRowInImmediateFlip[k], > - &final_flip_bw[k], > - &mode_lib->vba.ImmediateFlipSupportedForPipe[k]); > - } > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - total_dcn_read_bw_with_flip = > - total_dcn_read_bw_with_flip > - + mode_lib->vba.cursor_bw[k] > - + dml_max( > - mode_lib->vba.prefetch_vm_bw[k], > - dml_max( > - mode_lib->vba.prefetch_row_bw[k], > - final_flip_bw[k] > - + dml_max( > - mode_lib->vba.ReadBandwidthPlaneLuma[k] > - + mode_lib->vba.ReadBandwidthPlaneChroma[k], > - mode_lib->vba.RequiredPrefetchPixDataBW[k]))); > - } > - mode_lib->vba.ImmediateFlipSupported = true; > - if (total_dcn_read_bw_with_flip > mode_lib->vba.ReturnBW) { > - mode_lib->vba.ImmediateFlipSupported = false; > - } > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.ImmediateFlipSupportedForPipe[k] == false) { > - mode_lib->vba.ImmediateFlipSupported = false; > - } > - } > - } else { > - mode_lib->vba.ImmediateFlipSupported = false; > - } > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.ErrorResult[k]) { > - mode_lib->vba.PrefetchModeSupported = false; > - dml_print( > - "DML: CalculatePrefetchSchedule ***failed***. Prefetch schedule violation. Results are NOT valid\n"); > - } > - } > - > - mode_lib->vba.VStartupLines = mode_lib->vba.VStartupLines + 1; > - } while (!((mode_lib->vba.PrefetchModeSupported > - && (!mode_lib->vba.ImmediateFlipSupport > - || mode_lib->vba.ImmediateFlipSupported)) > - || mode_lib->vba.MaximumMaxVStartupLines < mode_lib->vba.VStartupLines)); > - > - //Display Pipeline Delivery Time in Prefetch > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.VRatioPrefetchY[k] <= 1) { > - mode_lib->vba.DisplayPipeLineDeliveryTimeLumaPrefetch[k] = > - mode_lib->vba.SwathWidthY[k] * mode_lib->vba.DPPPerPlane[k] > - / mode_lib->vba.HRatio[k] > - / mode_lib->vba.PixelClock[k]; > - } else { > - mode_lib->vba.DisplayPipeLineDeliveryTimeLumaPrefetch[k] = > - mode_lib->vba.SwathWidthY[k] > - / mode_lib->vba.PSCL_THROUGHPUT_LUMA[k] > - / mode_lib->vba.DPPCLK[k]; > - } > - if (mode_lib->vba.BytePerPixelDETC[k] == 0) { > - mode_lib->vba.DisplayPipeLineDeliveryTimeChromaPrefetch[k] = 0; > - } else { > - if (mode_lib->vba.VRatioPrefetchC[k] <= 1) { > - mode_lib->vba.DisplayPipeLineDeliveryTimeChromaPrefetch[k] = > - mode_lib->vba.SwathWidthY[k] > - * mode_lib->vba.DPPPerPlane[k] > - / mode_lib->vba.HRatio[k] > - / mode_lib->vba.PixelClock[k]; > - } else { > - mode_lib->vba.DisplayPipeLineDeliveryTimeChromaPrefetch[k] = > - mode_lib->vba.SwathWidthY[k] > - / mode_lib->vba.PSCL_THROUGHPUT_LUMA[k] > - / mode_lib->vba.DPPCLK[k]; > - } > - } > - } > - > - // Min TTUVBlank > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.PrefetchMode == 0) { > - mode_lib->vba.AllowDRAMClockChangeDuringVBlank[k] = true; > - mode_lib->vba.AllowDRAMSelfRefreshDuringVBlank[k] = true; > - mode_lib->vba.MinTTUVBlank[k] = dml_max( > - mode_lib->vba.DRAMClockChangeWatermark, > - dml_max( > - mode_lib->vba.StutterEnterPlusExitWatermark, > - mode_lib->vba.UrgentWatermark)); > - } else if (mode_lib->vba.PrefetchMode == 1) { > - mode_lib->vba.AllowDRAMClockChangeDuringVBlank[k] = false; > - mode_lib->vba.AllowDRAMSelfRefreshDuringVBlank[k] = true; > - mode_lib->vba.MinTTUVBlank[k] = dml_max( > - mode_lib->vba.StutterEnterPlusExitWatermark, > - mode_lib->vba.UrgentWatermark); > - } else { > - mode_lib->vba.AllowDRAMClockChangeDuringVBlank[k] = false; > - mode_lib->vba.AllowDRAMSelfRefreshDuringVBlank[k] = false; > - mode_lib->vba.MinTTUVBlank[k] = mode_lib->vba.UrgentWatermark; > - } > - if (!mode_lib->vba.DynamicMetadataEnable[k]) > - mode_lib->vba.MinTTUVBlank[k] = mode_lib->vba.TCalc > - + mode_lib->vba.MinTTUVBlank[k]; > - } > - > - // DCC Configuration > - mode_lib->vba.ActiveDPPs = 0; > - // NB P-State/DRAM Clock Change Support > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - mode_lib->vba.ActiveDPPs = mode_lib->vba.ActiveDPPs + mode_lib->vba.DPPPerPlane[k]; > - } > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - double EffectiveLBLatencyHidingY; > - double EffectiveLBLatencyHidingC; > - double DPPOutputBufferLinesY; > - double DPPOutputBufferLinesC; > - double DPPOPPBufferingY; > - double MaxDETBufferingTimeY; > - double ActiveDRAMClockChangeLatencyMarginY; > - > - mode_lib->vba.LBLatencyHidingSourceLinesY = > - dml_min( > - mode_lib->vba.MaxLineBufferLines, > - (unsigned int) dml_floor( > - (double) mode_lib->vba.LineBufferSize > - / mode_lib->vba.LBBitPerPixel[k] > - / (mode_lib->vba.SwathWidthY[k] > - / dml_max( > - mode_lib->vba.HRatio[k], > - 1.0)), > - 1)) - (mode_lib->vba.vtaps[k] - 1); > - > - mode_lib->vba.LBLatencyHidingSourceLinesC = > - dml_min( > - mode_lib->vba.MaxLineBufferLines, > - (unsigned int) dml_floor( > - (double) mode_lib->vba.LineBufferSize > - / mode_lib->vba.LBBitPerPixel[k] > - / (mode_lib->vba.SwathWidthY[k] > - / 2.0 > - / dml_max( > - mode_lib->vba.HRatio[k] > - / 2, > - 1.0)), > - 1)) > - - (mode_lib->vba.VTAPsChroma[k] - 1); > - > - EffectiveLBLatencyHidingY = mode_lib->vba.LBLatencyHidingSourceLinesY > - / mode_lib->vba.VRatio[k] > - * (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]); > - > - EffectiveLBLatencyHidingC = mode_lib->vba.LBLatencyHidingSourceLinesC > - / (mode_lib->vba.VRatio[k] / 2) > - * (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]); > - > - if (mode_lib->vba.SwathWidthY[k] > 2 * mode_lib->vba.DPPOutputBufferPixels) { > - DPPOutputBufferLinesY = mode_lib->vba.DPPOutputBufferPixels > - / mode_lib->vba.SwathWidthY[k]; > - } else if (mode_lib->vba.SwathWidthY[k] > mode_lib->vba.DPPOutputBufferPixels) { > - DPPOutputBufferLinesY = 0.5; > - } else { > - DPPOutputBufferLinesY = 1; > - } > - > - if (mode_lib->vba.SwathWidthY[k] / 2 > 2 * mode_lib->vba.DPPOutputBufferPixels) { > - DPPOutputBufferLinesC = mode_lib->vba.DPPOutputBufferPixels > - / (mode_lib->vba.SwathWidthY[k] / 2); > - } else if (mode_lib->vba.SwathWidthY[k] / 2 > mode_lib->vba.DPPOutputBufferPixels) { > - DPPOutputBufferLinesC = 0.5; > - } else { > - DPPOutputBufferLinesC = 1; > - } > - > - DPPOPPBufferingY = (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) > - * (DPPOutputBufferLinesY + mode_lib->vba.OPPOutputBufferLines); > - MaxDETBufferingTimeY = mode_lib->vba.FullDETBufferingTimeY[k] > - + (mode_lib->vba.LinesInDETY[k] > - - mode_lib->vba.LinesInDETYRoundedDownToSwath[k]) > - / mode_lib->vba.SwathHeightY[k] > - * (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]); > - > - ActiveDRAMClockChangeLatencyMarginY = DPPOPPBufferingY + EffectiveLBLatencyHidingY > - + MaxDETBufferingTimeY - mode_lib->vba.DRAMClockChangeWatermark; > - > - if (mode_lib->vba.ActiveDPPs > 1) { > - ActiveDRAMClockChangeLatencyMarginY = > - ActiveDRAMClockChangeLatencyMarginY > - - (1 - 1 / (mode_lib->vba.ActiveDPPs - 1)) > - * mode_lib->vba.SwathHeightY[k] > - * (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]); > - } > - > - if (mode_lib->vba.BytePerPixelDETC[k] > 0) { > - double DPPOPPBufferingC = (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]) > - * (DPPOutputBufferLinesC > - + mode_lib->vba.OPPOutputBufferLines); > - double MaxDETBufferingTimeC = > - mode_lib->vba.FullDETBufferingTimeC[k] > - + (mode_lib->vba.LinesInDETC[k] > - - mode_lib->vba.LinesInDETCRoundedDownToSwath[k]) > - / mode_lib->vba.SwathHeightC[k] > - * (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]); > - double ActiveDRAMClockChangeLatencyMarginC = DPPOPPBufferingC > - + EffectiveLBLatencyHidingC + MaxDETBufferingTimeC > - - mode_lib->vba.DRAMClockChangeWatermark; > - > - if (mode_lib->vba.ActiveDPPs > 1) { > - ActiveDRAMClockChangeLatencyMarginC = > - ActiveDRAMClockChangeLatencyMarginC > - - (1 > - - 1 > - / (mode_lib->vba.ActiveDPPs > - - 1)) > - * mode_lib->vba.SwathHeightC[k] > - * (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]); > - } > - mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] = dml_min( > - ActiveDRAMClockChangeLatencyMarginY, > - ActiveDRAMClockChangeLatencyMarginC); > - } else { > - mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] = > - ActiveDRAMClockChangeLatencyMarginY; > - } > - > - if (mode_lib->vba.WritebackEnable[k]) { > - double WritebackDRAMClockChangeLatencyMargin; > - > - if (mode_lib->vba.WritebackPixelFormat[k] == dm_444_32) { > - WritebackDRAMClockChangeLatencyMargin = > - (double) (mode_lib->vba.WritebackInterfaceLumaBufferSize > - + mode_lib->vba.WritebackInterfaceChromaBufferSize) > - / (mode_lib->vba.WritebackDestinationWidth[k] > - * mode_lib->vba.WritebackDestinationHeight[k] > - / (mode_lib->vba.WritebackSourceHeight[k] > - * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]) > - * 4) > - - mode_lib->vba.WritebackDRAMClockChangeWatermark; > - } else if (mode_lib->vba.WritebackPixelFormat[k] == dm_420_10) { > - WritebackDRAMClockChangeLatencyMargin = > - dml_min( > - (double) mode_lib->vba.WritebackInterfaceLumaBufferSize > - * 8.0 / 10, > - 2.0 > - * mode_lib->vba.WritebackInterfaceChromaBufferSize > - * 8 / 10) > - / (mode_lib->vba.WritebackDestinationWidth[k] > - * mode_lib->vba.WritebackDestinationHeight[k] > - / (mode_lib->vba.WritebackSourceHeight[k] > - * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k])) > - - mode_lib->vba.WritebackDRAMClockChangeWatermark; > - } else { > - WritebackDRAMClockChangeLatencyMargin = > - dml_min( > - (double) mode_lib->vba.WritebackInterfaceLumaBufferSize, > - 2.0 > - * mode_lib->vba.WritebackInterfaceChromaBufferSize) > - / (mode_lib->vba.WritebackDestinationWidth[k] > - * mode_lib->vba.WritebackDestinationHeight[k] > - / (mode_lib->vba.WritebackSourceHeight[k] > - * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k])) > - - mode_lib->vba.WritebackDRAMClockChangeWatermark; > - } > - mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] = dml_min( > - mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k], > - WritebackDRAMClockChangeLatencyMargin); > - } > - } > - > - mode_lib->vba.MinActiveDRAMClockChangeMargin = 999999; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k] > - < mode_lib->vba.MinActiveDRAMClockChangeMargin) { > - mode_lib->vba.MinActiveDRAMClockChangeMargin = > - mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k]; > - } > - } > - > - mode_lib->vba.MinActiveDRAMClockChangeLatencySupported = > - mode_lib->vba.MinActiveDRAMClockChangeMargin > - + mode_lib->vba.DRAMClockChangeLatency; > - > - if (mode_lib->vba.MinActiveDRAMClockChangeMargin > 0) { > - mode_lib->vba.DRAMClockChangeSupport = dm_dram_clock_change_vactive; > - } else { > - if (mode_lib->vba.SynchronizedVBlank || mode_lib->vba.NumberOfActivePlanes == 1) { > - mode_lib->vba.DRAMClockChangeSupport = dm_dram_clock_change_vblank; > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (!mode_lib->vba.AllowDRAMClockChangeDuringVBlank[k]) { > - mode_lib->vba.DRAMClockChangeSupport = > - dm_dram_clock_change_unsupported; > - } > - } > - } else { > - mode_lib->vba.DRAMClockChangeSupport = dm_dram_clock_change_unsupported; > - } > - } > - > - //XFC Parameters: > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - if (mode_lib->vba.XFCEnabled[k] == true) { > - double TWait; > - > - mode_lib->vba.XFCSlaveVUpdateOffset[k] = mode_lib->vba.XFCTSlvVupdateOffset; > - mode_lib->vba.XFCSlaveVupdateWidth[k] = mode_lib->vba.XFCTSlvVupdateWidth; > - mode_lib->vba.XFCSlaveVReadyOffset[k] = mode_lib->vba.XFCTSlvVreadyOffset; > - TWait = CalculateTWait( > - mode_lib->vba.PrefetchMode, > - mode_lib->vba.DRAMClockChangeLatency, > - mode_lib->vba.UrgentLatency, > - mode_lib->vba.SREnterPlusExitTime); > - mode_lib->vba.XFCRemoteSurfaceFlipDelay = CalculateRemoteSurfaceFlipDelay( > - mode_lib, > - mode_lib->vba.VRatio[k], > - mode_lib->vba.SwathWidthY[k], > - dml_ceil(mode_lib->vba.BytePerPixelDETY[k], 1), > - mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k], > - mode_lib->vba.XFCTSlvVupdateOffset, > - mode_lib->vba.XFCTSlvVupdateWidth, > - mode_lib->vba.XFCTSlvVreadyOffset, > - mode_lib->vba.XFCXBUFLatencyTolerance, > - mode_lib->vba.XFCFillBWOverhead, > - mode_lib->vba.XFCSlvChunkSize, > - mode_lib->vba.XFCBusTransportTime, > - mode_lib->vba.TCalc, > - TWait, > - &mode_lib->vba.SrcActiveDrainRate, > - &mode_lib->vba.TInitXFill, > - &mode_lib->vba.TslvChk); > - mode_lib->vba.XFCRemoteSurfaceFlipLatency[k] = > - dml_floor( > - mode_lib->vba.XFCRemoteSurfaceFlipDelay > - / (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]), > - 1); > - mode_lib->vba.XFCTransferDelay[k] = > - dml_ceil( > - mode_lib->vba.XFCBusTransportTime > - / (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]), > - 1); > - mode_lib->vba.XFCPrechargeDelay[k] = > - dml_ceil( > - (mode_lib->vba.XFCBusTransportTime > - + mode_lib->vba.TInitXFill > - + mode_lib->vba.TslvChk) > - / (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]), > - 1); > - mode_lib->vba.InitFillLevel = mode_lib->vba.XFCXBUFLatencyTolerance > - * mode_lib->vba.SrcActiveDrainRate; > - mode_lib->vba.FinalFillMargin = > - (mode_lib->vba.DestinationLinesToRequestVMInVBlank[k] > - + mode_lib->vba.DestinationLinesToRequestRowInVBlank[k]) > - * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k] > - * mode_lib->vba.SrcActiveDrainRate > - + mode_lib->vba.XFCFillConstant; > - mode_lib->vba.FinalFillLevel = mode_lib->vba.XFCRemoteSurfaceFlipDelay > - * mode_lib->vba.SrcActiveDrainRate > - + mode_lib->vba.FinalFillMargin; > - mode_lib->vba.RemainingFillLevel = dml_max( > - 0.0, > - mode_lib->vba.FinalFillLevel - mode_lib->vba.InitFillLevel); > - mode_lib->vba.TFinalxFill = mode_lib->vba.RemainingFillLevel > - / (mode_lib->vba.SrcActiveDrainRate > - * mode_lib->vba.XFCFillBWOverhead / 100); > - mode_lib->vba.XFCPrefetchMargin[k] = > - mode_lib->vba.XFCRemoteSurfaceFlipDelay > - + mode_lib->vba.TFinalxFill > - + (mode_lib->vba.DestinationLinesToRequestVMInVBlank[k] > - + mode_lib->vba.DestinationLinesToRequestRowInVBlank[k]) > - * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]; > - } else { > - mode_lib->vba.XFCSlaveVUpdateOffset[k] = 0; > - mode_lib->vba.XFCSlaveVupdateWidth[k] = 0; > - mode_lib->vba.XFCSlaveVReadyOffset[k] = 0; > - mode_lib->vba.XFCRemoteSurfaceFlipLatency[k] = 0; > - mode_lib->vba.XFCPrechargeDelay[k] = 0; > - mode_lib->vba.XFCTransferDelay[k] = 0; > - mode_lib->vba.XFCPrefetchMargin[k] = 0; > - } > - } > -} > - > -static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib) > -{ > - double BytePerPixDETY; > - double BytePerPixDETC; > - double Read256BytesBlockHeightY; > - double Read256BytesBlockHeightC; > - double Read256BytesBlockWidthY; > - double Read256BytesBlockWidthC; > - double MaximumSwathHeightY; > - double MaximumSwathHeightC; > - double MinimumSwathHeightY; > - double MinimumSwathHeightC; > - double SwathWidth; > - double SwathWidthGranularityY; > - double SwathWidthGranularityC; > - double RoundedUpMaxSwathSizeBytesY; > - double RoundedUpMaxSwathSizeBytesC; > - unsigned int j, k; > - > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - bool MainPlaneDoesODMCombine = false; > - > - if (mode_lib->vba.SourcePixelFormat[k] == dm_444_64) { > - BytePerPixDETY = 8; > - BytePerPixDETC = 0; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_32) { > - BytePerPixDETY = 4; > - BytePerPixDETC = 0; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_16) { > - BytePerPixDETY = 2; > - BytePerPixDETC = 0; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_8) { > - BytePerPixDETY = 1; > - BytePerPixDETC = 0; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8) { > - BytePerPixDETY = 1; > - BytePerPixDETC = 2; > - } else { > - BytePerPixDETY = 4.0 / 3.0; > - BytePerPixDETC = 8.0 / 3.0; > - } > - > - if ((mode_lib->vba.SourcePixelFormat[k] == dm_444_64 > - || mode_lib->vba.SourcePixelFormat[k] == dm_444_32 > - || mode_lib->vba.SourcePixelFormat[k] == dm_444_16 > - || mode_lib->vba.SourcePixelFormat[k] == dm_444_8)) { > - if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) { > - Read256BytesBlockHeightY = 1; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_64) { > - Read256BytesBlockHeightY = 4; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_32 > - || mode_lib->vba.SourcePixelFormat[k] == dm_444_16) { > - Read256BytesBlockHeightY = 8; > - } else { > - Read256BytesBlockHeightY = 16; > - } > - Read256BytesBlockWidthY = 256 / dml_ceil(BytePerPixDETY, 1) > - / Read256BytesBlockHeightY; > - Read256BytesBlockHeightC = 0; > - Read256BytesBlockWidthC = 0; > - } else { > - if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) { > - Read256BytesBlockHeightY = 1; > - Read256BytesBlockHeightC = 1; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8) { > - Read256BytesBlockHeightY = 16; > - Read256BytesBlockHeightC = 8; > - } else { > - Read256BytesBlockHeightY = 8; > - Read256BytesBlockHeightC = 8; > - } > - Read256BytesBlockWidthY = 256 / dml_ceil(BytePerPixDETY, 1) > - / Read256BytesBlockHeightY; > - Read256BytesBlockWidthC = 256 / dml_ceil(BytePerPixDETC, 2) > - / Read256BytesBlockHeightC; > - } > - > - if (mode_lib->vba.SourceScan[k] == dm_horz) { > - MaximumSwathHeightY = Read256BytesBlockHeightY; > - MaximumSwathHeightC = Read256BytesBlockHeightC; > - } else { > - MaximumSwathHeightY = Read256BytesBlockWidthY; > - MaximumSwathHeightC = Read256BytesBlockWidthC; > - } > - > - if ((mode_lib->vba.SourcePixelFormat[k] == dm_444_64 > - || mode_lib->vba.SourcePixelFormat[k] == dm_444_32 > - || mode_lib->vba.SourcePixelFormat[k] == dm_444_16 > - || mode_lib->vba.SourcePixelFormat[k] == dm_444_8)) { > - if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear > - || (mode_lib->vba.SourcePixelFormat[k] == dm_444_64 > - && (mode_lib->vba.SurfaceTiling[k] > - == dm_sw_4kb_s > - || mode_lib->vba.SurfaceTiling[k] > - == dm_sw_4kb_s_x > - || mode_lib->vba.SurfaceTiling[k] > - == dm_sw_64kb_s > - || mode_lib->vba.SurfaceTiling[k] > - == dm_sw_64kb_s_t > - || mode_lib->vba.SurfaceTiling[k] > - == dm_sw_64kb_s_x > - || mode_lib->vba.SurfaceTiling[k] > - == dm_sw_var_s > - || mode_lib->vba.SurfaceTiling[k] > - == dm_sw_var_s_x) > - && mode_lib->vba.SourceScan[k] == dm_horz)) { > - MinimumSwathHeightY = MaximumSwathHeightY; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_8 > - && mode_lib->vba.SourceScan[k] != dm_horz) { > - MinimumSwathHeightY = MaximumSwathHeightY; > - } else { > - MinimumSwathHeightY = MaximumSwathHeightY / 2.0; > - } > - MinimumSwathHeightC = MaximumSwathHeightC; > - } else { > - if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) { > - MinimumSwathHeightY = MaximumSwathHeightY; > - MinimumSwathHeightC = MaximumSwathHeightC; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8 > - && mode_lib->vba.SourceScan[k] == dm_horz) { > - MinimumSwathHeightY = MaximumSwathHeightY / 2.0; > - MinimumSwathHeightC = MaximumSwathHeightC; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10 > - && mode_lib->vba.SourceScan[k] == dm_horz) { > - MinimumSwathHeightC = MaximumSwathHeightC / 2.0; > - MinimumSwathHeightY = MaximumSwathHeightY; > - } else { > - MinimumSwathHeightY = MaximumSwathHeightY; > - MinimumSwathHeightC = MaximumSwathHeightC; > - } > - } > - > - if (mode_lib->vba.SourceScan[k] == dm_horz) { > - SwathWidth = mode_lib->vba.ViewportWidth[k]; > - } else { > - SwathWidth = mode_lib->vba.ViewportHeight[k]; > - } > - > - if (mode_lib->vba.ODMCombineEnabled[k] == true) { > - MainPlaneDoesODMCombine = true; > - } > - for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) { > - if (mode_lib->vba.BlendingAndTiming[k] == j > - && mode_lib->vba.ODMCombineEnabled[j] == true) { > - MainPlaneDoesODMCombine = true; > - } > - } > - > - if (MainPlaneDoesODMCombine == true) { > - SwathWidth = dml_min( > - SwathWidth, > - mode_lib->vba.HActive[k] / 2.0 * mode_lib->vba.HRatio[k]); > - } else { > - SwathWidth = SwathWidth / mode_lib->vba.DPPPerPlane[k]; > - } > - > - SwathWidthGranularityY = 256 / dml_ceil(BytePerPixDETY, 1) / MaximumSwathHeightY; > - RoundedUpMaxSwathSizeBytesY = (dml_ceil( > - (double) (SwathWidth - 1), > - SwathWidthGranularityY) + SwathWidthGranularityY) * BytePerPixDETY > - * MaximumSwathHeightY; > - if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10) { > - RoundedUpMaxSwathSizeBytesY = dml_ceil(RoundedUpMaxSwathSizeBytesY, 256) > - + 256; > - } > - if (MaximumSwathHeightC > 0) { > - SwathWidthGranularityC = 256.0 / dml_ceil(BytePerPixDETC, 2) > - / MaximumSwathHeightC; > - RoundedUpMaxSwathSizeBytesC = (dml_ceil( > - (double) (SwathWidth / 2.0 - 1), > - SwathWidthGranularityC) + SwathWidthGranularityC) > - * BytePerPixDETC * MaximumSwathHeightC; > - if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10) { > - RoundedUpMaxSwathSizeBytesC = dml_ceil( > - RoundedUpMaxSwathSizeBytesC, > - 256) + 256; > - } > - } else > - RoundedUpMaxSwathSizeBytesC = 0.0; > - > - if (RoundedUpMaxSwathSizeBytesY + RoundedUpMaxSwathSizeBytesC > - <= mode_lib->vba.DETBufferSizeInKByte * 1024.0 / 2.0) { > - mode_lib->vba.SwathHeightY[k] = MaximumSwathHeightY; > - mode_lib->vba.SwathHeightC[k] = MaximumSwathHeightC; > - } else { > - mode_lib->vba.SwathHeightY[k] = MinimumSwathHeightY; > - mode_lib->vba.SwathHeightC[k] = MinimumSwathHeightC; > - } > - > - if (mode_lib->vba.SwathHeightC[k] == 0) { > - mode_lib->vba.DETBufferSizeY[k] = mode_lib->vba.DETBufferSizeInKByte * 1024; > - mode_lib->vba.DETBufferSizeC[k] = 0; > - } else if (mode_lib->vba.SwathHeightY[k] <= mode_lib->vba.SwathHeightC[k]) { > - mode_lib->vba.DETBufferSizeY[k] = mode_lib->vba.DETBufferSizeInKByte > - * 1024.0 / 2; > - mode_lib->vba.DETBufferSizeC[k] = mode_lib->vba.DETBufferSizeInKByte > - * 1024.0 / 2; > - } else { > - mode_lib->vba.DETBufferSizeY[k] = mode_lib->vba.DETBufferSizeInKByte > - * 1024.0 * 2 / 3; > - mode_lib->vba.DETBufferSizeC[k] = mode_lib->vba.DETBufferSizeInKByte > - * 1024.0 / 3; > - } > - } > -} > - > -bool Calculate256BBlockSizes( > - enum source_format_class SourcePixelFormat, > - enum dm_swizzle_mode SurfaceTiling, > - unsigned int BytePerPixelY, > - unsigned int BytePerPixelC, > - unsigned int *BlockHeight256BytesY, > - unsigned int *BlockHeight256BytesC, > - unsigned int *BlockWidth256BytesY, > - unsigned int *BlockWidth256BytesC) > -{ > - if ((SourcePixelFormat == dm_444_64 || SourcePixelFormat == dm_444_32 > - || SourcePixelFormat == dm_444_16 > - || SourcePixelFormat == dm_444_8)) { > - if (SurfaceTiling == dm_sw_linear) { > - *BlockHeight256BytesY = 1; > - } else if (SourcePixelFormat == dm_444_64) { > - *BlockHeight256BytesY = 4; > - } else if (SourcePixelFormat == dm_444_8) { > - *BlockHeight256BytesY = 16; > - } else { > - *BlockHeight256BytesY = 8; > - } > - *BlockWidth256BytesY = 256 / BytePerPixelY / *BlockHeight256BytesY; > - *BlockHeight256BytesC = 0; > - *BlockWidth256BytesC = 0; > - } else { > - if (SurfaceTiling == dm_sw_linear) { > - *BlockHeight256BytesY = 1; > - *BlockHeight256BytesC = 1; > - } else if (SourcePixelFormat == dm_420_8) { > - *BlockHeight256BytesY = 16; > - *BlockHeight256BytesC = 8; > - } else { > - *BlockHeight256BytesY = 8; > - *BlockHeight256BytesC = 8; > - } > - *BlockWidth256BytesY = 256 / BytePerPixelY / *BlockHeight256BytesY; > - *BlockWidth256BytesC = 256 / BytePerPixelC / *BlockHeight256BytesC; > - } > - return true; > -} > - > -static double CalculateTWait( > - unsigned int PrefetchMode, > - double DRAMClockChangeLatency, > - double UrgentLatency, > - double SREnterPlusExitTime) > -{ > - if (PrefetchMode == 0) { > - return dml_max( > - DRAMClockChangeLatency + UrgentLatency, > - dml_max(SREnterPlusExitTime, UrgentLatency)); > - } else if (PrefetchMode == 1) { > - return dml_max(SREnterPlusExitTime, UrgentLatency); > - } else { > - return UrgentLatency; > - } > -} > - > -static double CalculateRemoteSurfaceFlipDelay( > - struct display_mode_lib *mode_lib, > - double VRatio, > - double SwathWidth, > - double Bpp, > - double LineTime, > - double XFCTSlvVupdateOffset, > - double XFCTSlvVupdateWidth, > - double XFCTSlvVreadyOffset, > - double XFCXBUFLatencyTolerance, > - double XFCFillBWOverhead, > - double XFCSlvChunkSize, > - double XFCBusTransportTime, > - double TCalc, > - double TWait, > - double *SrcActiveDrainRate, > - double *TInitXFill, > - double *TslvChk) > -{ > - double TSlvSetup, AvgfillRate, result; > - > - *SrcActiveDrainRate = VRatio * SwathWidth * Bpp / LineTime; > - TSlvSetup = XFCTSlvVupdateOffset + XFCTSlvVupdateWidth + XFCTSlvVreadyOffset; > - *TInitXFill = XFCXBUFLatencyTolerance / (1 + XFCFillBWOverhead / 100); > - AvgfillRate = *SrcActiveDrainRate * (1 + XFCFillBWOverhead / 100); > - *TslvChk = XFCSlvChunkSize / AvgfillRate; > - dml_print( > - "DML::CalculateRemoteSurfaceFlipDelay: SrcActiveDrainRate: %f\n", > - *SrcActiveDrainRate); > - dml_print("DML::CalculateRemoteSurfaceFlipDelay: TSlvSetup: %f\n", TSlvSetup); > - dml_print("DML::CalculateRemoteSurfaceFlipDelay: TInitXFill: %f\n", *TInitXFill); > - dml_print("DML::CalculateRemoteSurfaceFlipDelay: AvgfillRate: %f\n", AvgfillRate); > - dml_print("DML::CalculateRemoteSurfaceFlipDelay: TslvChk: %f\n", *TslvChk); > - result = 2 * XFCBusTransportTime + TSlvSetup + TCalc + TWait + *TslvChk + *TInitXFill; // TODO: This doesn't seem to match programming guide > - dml_print("DML::CalculateRemoteSurfaceFlipDelay: RemoteSurfaceFlipDelay: %f\n", result); > - return result; > -} > - > -static double CalculateWriteBackDISPCLK( > - enum source_format_class WritebackPixelFormat, > - double PixelClock, > - double WritebackHRatio, > - double WritebackVRatio, > - unsigned int WritebackLumaHTaps, > - unsigned int WritebackLumaVTaps, > - unsigned int WritebackChromaHTaps, > - unsigned int WritebackChromaVTaps, > - double WritebackDestinationWidth, > - unsigned int HTotal, > - unsigned int WritebackChromaLineBufferWidth) > -{ > - double CalculateWriteBackDISPCLK = > - 1.01 * PixelClock > - * dml_max( > - dml_ceil(WritebackLumaHTaps / 4.0, 1) > - / WritebackHRatio, > - dml_max( > - (WritebackLumaVTaps > - * dml_ceil( > - 1.0 > - / WritebackVRatio, > - 1) > - * dml_ceil( > - WritebackDestinationWidth > - / 4.0, > - 1) > - + dml_ceil( > - WritebackDestinationWidth > - / 4.0, > - 1)) > - / (double) HTotal > - + dml_ceil( > - 1.0 > - / WritebackVRatio, > - 1) > - * (dml_ceil( > - WritebackLumaVTaps > - / 4.0, > - 1) > - + 4.0) > - / (double) HTotal, > - dml_ceil( > - 1.0 > - / WritebackVRatio, > - 1) > - * WritebackDestinationWidth > - / (double) HTotal)); > - if (WritebackPixelFormat != dm_444_32) { > - CalculateWriteBackDISPCLK = > - dml_max( > - CalculateWriteBackDISPCLK, > - 1.01 * PixelClock > - * dml_max( > - dml_ceil( > - WritebackChromaHTaps > - / 2.0, > - 1) > - / (2 > - * WritebackHRatio), > - dml_max( > - (WritebackChromaVTaps > - * dml_ceil( > - 1 > - / (2 > - * WritebackVRatio), > - 1) > - * dml_ceil( > - WritebackDestinationWidth > - / 2.0 > - / 2.0, > - 1) > - + dml_ceil( > - WritebackDestinationWidth > - / 2.0 > - / WritebackChromaLineBufferWidth, > - 1)) > - / HTotal > - + dml_ceil( > - 1 > - / (2 > - * WritebackVRatio), > - 1) > - * (dml_ceil( > - WritebackChromaVTaps > - / 4.0, > - 1) > - + 4) > - / HTotal, > - dml_ceil( > - 1.0 > - / (2 > - * WritebackVRatio), > - 1) > - * WritebackDestinationWidth > - / 2.0 > - / HTotal))); > - } > - return CalculateWriteBackDISPCLK; > -} > - > -static double CalculateWriteBackDelay( > - enum source_format_class WritebackPixelFormat, > - double WritebackHRatio, > - double WritebackVRatio, > - unsigned int WritebackLumaHTaps, > - unsigned int WritebackLumaVTaps, > - unsigned int WritebackChromaHTaps, > - unsigned int WritebackChromaVTaps, > - unsigned int WritebackDestinationWidth) > -{ > - double CalculateWriteBackDelay = > - dml_max( > - dml_ceil(WritebackLumaHTaps / 4.0, 1) / WritebackHRatio, > - WritebackLumaVTaps * dml_ceil(1.0 / WritebackVRatio, 1) > - * dml_ceil( > - WritebackDestinationWidth > - / 4.0, > - 1) > - + dml_ceil(1.0 / WritebackVRatio, 1) > - * (dml_ceil( > - WritebackLumaVTaps > - / 4.0, > - 1) + 4)); > - > - if (WritebackPixelFormat != dm_444_32) { > - CalculateWriteBackDelay = > - dml_max( > - CalculateWriteBackDelay, > - dml_max( > - dml_ceil( > - WritebackChromaHTaps > - / 2.0, > - 1) > - / (2 > - * WritebackHRatio), > - WritebackChromaVTaps > - * dml_ceil( > - 1 > - / (2 > - * WritebackVRatio), > - 1) > - * dml_ceil( > - WritebackDestinationWidth > - / 2.0 > - / 2.0, > - 1) > - + dml_ceil( > - 1 > - / (2 > - * WritebackVRatio), > - 1) > - * (dml_ceil( > - WritebackChromaVTaps > - / 4.0, > - 1) > - + 4))); > - } > - return CalculateWriteBackDelay; > -} > - > -static void CalculateActiveRowBandwidth( > - bool VirtualMemoryEnable, > - enum source_format_class SourcePixelFormat, > - double VRatio, > - bool DCCEnable, > - double LineTime, > - unsigned int MetaRowByteLuma, > - unsigned int MetaRowByteChroma, > - unsigned int meta_row_height_luma, > - unsigned int meta_row_height_chroma, > - unsigned int PixelPTEBytesPerRowLuma, > - unsigned int PixelPTEBytesPerRowChroma, > - unsigned int dpte_row_height_luma, > - unsigned int dpte_row_height_chroma, > - double *meta_row_bw, > - double *dpte_row_bw, > - double *qual_row_bw) > -{ > - if (DCCEnable != true) { > - *meta_row_bw = 0; > - } else if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10) { > - *meta_row_bw = VRatio * MetaRowByteLuma / (meta_row_height_luma * LineTime) > - + VRatio / 2 * MetaRowByteChroma > - / (meta_row_height_chroma * LineTime); > - } else { > - *meta_row_bw = VRatio * MetaRowByteLuma / (meta_row_height_luma * LineTime); > - } > - > - if (VirtualMemoryEnable != true) { > - *dpte_row_bw = 0; > - } else if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10) { > - *dpte_row_bw = VRatio * PixelPTEBytesPerRowLuma / (dpte_row_height_luma * LineTime) > - + VRatio / 2 * PixelPTEBytesPerRowChroma > - / (dpte_row_height_chroma * LineTime); > - } else { > - *dpte_row_bw = VRatio * PixelPTEBytesPerRowLuma / (dpte_row_height_luma * LineTime); > - } > - > - if ((SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10)) { > - *qual_row_bw = *meta_row_bw + *dpte_row_bw; > - } else { > - *qual_row_bw = 0; > - } > -} > - > -static void CalculateFlipSchedule( > - struct display_mode_lib *mode_lib, > - double UrgentExtraLatency, > - double UrgentLatency, > - unsigned int MaxPageTableLevels, > - bool VirtualMemoryEnable, > - double BandwidthAvailableForImmediateFlip, > - unsigned int TotImmediateFlipBytes, > - enum source_format_class SourcePixelFormat, > - unsigned int ImmediateFlipBytes, > - double LineTime, > - double Tno_bw, > - double VRatio, > - double PDEAndMetaPTEBytesFrame, > - unsigned int MetaRowByte, > - unsigned int PixelPTEBytesPerRow, > - bool DCCEnable, > - unsigned int dpte_row_height, > - unsigned int meta_row_height, > - double qual_row_bw, > - double *DestinationLinesToRequestVMInImmediateFlip, > - double *DestinationLinesToRequestRowInImmediateFlip, > - double *final_flip_bw, > - bool *ImmediateFlipSupportedForPipe) > -{ > - double min_row_time = 0.0; > - > - if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10) { > - *DestinationLinesToRequestVMInImmediateFlip = 0.0; > - *DestinationLinesToRequestRowInImmediateFlip = 0.0; > - *final_flip_bw = qual_row_bw; > - *ImmediateFlipSupportedForPipe = true; > - } else { > - double TimeForFetchingMetaPTEImmediateFlip; > - double TimeForFetchingRowInVBlankImmediateFlip; > - > - if (VirtualMemoryEnable == true) { > - mode_lib->vba.ImmediateFlipBW = BandwidthAvailableForImmediateFlip > - * ImmediateFlipBytes / TotImmediateFlipBytes; > - TimeForFetchingMetaPTEImmediateFlip = > - dml_max( > - Tno_bw > - + PDEAndMetaPTEBytesFrame > - / mode_lib->vba.ImmediateFlipBW, > - dml_max( > - UrgentExtraLatency > - + UrgentLatency > - * (MaxPageTableLevels > - - 1), > - LineTime / 4.0)); > - } else { > - TimeForFetchingMetaPTEImmediateFlip = 0; > - } > - > - *DestinationLinesToRequestVMInImmediateFlip = dml_floor( > - 4.0 * (TimeForFetchingMetaPTEImmediateFlip / LineTime + 0.125), > - 1) / 4.0; > - > - if ((VirtualMemoryEnable == true || DCCEnable == true)) { > - mode_lib->vba.ImmediateFlipBW = BandwidthAvailableForImmediateFlip > - * ImmediateFlipBytes / TotImmediateFlipBytes; > - TimeForFetchingRowInVBlankImmediateFlip = dml_max( > - (MetaRowByte + PixelPTEBytesPerRow) > - / mode_lib->vba.ImmediateFlipBW, > - dml_max(UrgentLatency, LineTime / 4.0)); > - } else { > - TimeForFetchingRowInVBlankImmediateFlip = 0; > - } > - > - *DestinationLinesToRequestRowInImmediateFlip = dml_floor( > - 4.0 * (TimeForFetchingRowInVBlankImmediateFlip / LineTime + 0.125), > - 1) / 4.0; > - > - if (VirtualMemoryEnable == true) { > - *final_flip_bw = > - dml_max( > - PDEAndMetaPTEBytesFrame > - / (*DestinationLinesToRequestVMInImmediateFlip > - * LineTime), > - (MetaRowByte + PixelPTEBytesPerRow) > - / (TimeForFetchingRowInVBlankImmediateFlip > - * LineTime)); > - } else if (MetaRowByte + PixelPTEBytesPerRow > 0) { > - *final_flip_bw = (MetaRowByte + PixelPTEBytesPerRow) > - / (TimeForFetchingRowInVBlankImmediateFlip * LineTime); > - } else { > - *final_flip_bw = 0; > - } > - > - if (VirtualMemoryEnable && !DCCEnable) > - min_row_time = dpte_row_height * LineTime / VRatio; > - else if (!VirtualMemoryEnable && DCCEnable) > - min_row_time = meta_row_height * LineTime / VRatio; > - else > - min_row_time = dml_min(dpte_row_height, meta_row_height) * LineTime > - / VRatio; > - > - if (*DestinationLinesToRequestVMInImmediateFlip >= 8 > - || *DestinationLinesToRequestRowInImmediateFlip >= 16 > - || TimeForFetchingMetaPTEImmediateFlip > - + 2 * TimeForFetchingRowInVBlankImmediateFlip > - > min_row_time) > - *ImmediateFlipSupportedForPipe = false; > - else > - *ImmediateFlipSupportedForPipe = true; > - } > -} > - > -static void PixelClockAdjustmentForProgressiveToInterlaceUnit(struct display_mode_lib *mode_lib) > -{ > - unsigned int k; > - > - //Progressive To dml_ml->vba.Interlace Unit Effect > - for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) { > - mode_lib->vba.PixelClockBackEnd[k] = mode_lib->vba.PixelClock[k]; > - if (mode_lib->vba.Interlace[k] == 1 > - && mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true) { > - mode_lib->vba.PixelClock[k] = 2 * mode_lib->vba.PixelClock[k]; > - } > - } > -} > - > -static unsigned int CursorBppEnumToBits(enum cursor_bpp ebpp) > -{ > - switch (ebpp) { > - case dm_cur_2bit: > - return 2; > - case dm_cur_32bit: > - return 32; > - case dm_cur_64bit: > - return 64; > - default: > - return 0; > - } > -} > - > -static unsigned int TruncToValidBPP( > - double DecimalBPP, > - bool DSCEnabled, > - enum output_encoder_class Output, > - enum output_format_class Format, > - unsigned int DSCInputBitPerComponent) > -{ > - if (Output == dm_hdmi) { > - if (Format == dm_420) { > - if (DecimalBPP >= 18) > - return 18; > - else if (DecimalBPP >= 15) > - return 15; > - else if (DecimalBPP >= 12) > - return 12; > - else > - return BPP_INVALID; > - } else if (Format == dm_444) { > - if (DecimalBPP >= 36) > - return 36; > - else if (DecimalBPP >= 30) > - return 30; > - else if (DecimalBPP >= 24) > - return 24; > - else > - return BPP_INVALID; > - } else { > - if (DecimalBPP / 1.5 >= 24) > - return 24; > - else if (DecimalBPP / 1.5 >= 20) > - return 20; > - else if (DecimalBPP / 1.5 >= 16) > - return 16; > - else > - return BPP_INVALID; > - } > - } else { > - if (DSCEnabled) { > - if (Format == dm_420) { > - if (DecimalBPP < 6) > - return BPP_INVALID; > - else if (DecimalBPP >= 1.5 * DSCInputBitPerComponent - 1 / 16) > - return 1.5 * DSCInputBitPerComponent - 1 / 16; > - else > - return dml_floor(16 * DecimalBPP, 1) / 16; > - } else if (Format == dm_n422) { > - if (DecimalBPP < 7) > - return BPP_INVALID; > - else if (DecimalBPP >= 2 * DSCInputBitPerComponent - 1 / 16) > - return 2 * DSCInputBitPerComponent - 1 / 16; > - else > - return dml_floor(16 * DecimalBPP, 1) / 16; > - } else { > - if (DecimalBPP < 8) > - return BPP_INVALID; > - else if (DecimalBPP >= 3 * DSCInputBitPerComponent - 1 / 16) > - return 3 * DSCInputBitPerComponent - 1 / 16; > - else > - return dml_floor(16 * DecimalBPP, 1) / 16; > - } > - } else if (Format == dm_420) { > - if (DecimalBPP >= 18) > - return 18; > - else if (DecimalBPP >= 15) > - return 15; > - else if (DecimalBPP >= 12) > - return 12; > - else > - return BPP_INVALID; > - } else if (Format == dm_s422 || Format == dm_n422) { > - if (DecimalBPP >= 24) > - return 24; > - else if (DecimalBPP >= 20) > - return 20; > - else if (DecimalBPP >= 16) > - return 16; > - else > - return BPP_INVALID; > - } else { > - if (DecimalBPP >= 36) > - return 36; > - else if (DecimalBPP >= 30) > - return 30; > - else if (DecimalBPP >= 24) > - return 24; > - else > - return BPP_INVALID; > - } > - } > -} > - > -static void ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib) > -{ > - int i; > - unsigned int j, k; > - /*MODE SUPPORT, VOLTAGE STATE AND SOC CONFIGURATION*/ > - > - /*Scale Ratio, taps Support Check*/ > - > - mode_lib->vba.ScaleRatioAndTapsSupport = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.ScalerEnabled[k] == false > - && ((mode_lib->vba.SourcePixelFormat[k] != dm_444_64 > - && mode_lib->vba.SourcePixelFormat[k] != dm_444_32 > - && mode_lib->vba.SourcePixelFormat[k] != dm_444_16 > - && mode_lib->vba.SourcePixelFormat[k] != dm_mono_16 > - && mode_lib->vba.SourcePixelFormat[k] != dm_mono_8) > - || mode_lib->vba.HRatio[k] != 1.0 > - || mode_lib->vba.htaps[k] != 1.0 > - || mode_lib->vba.VRatio[k] != 1.0 > - || mode_lib->vba.vtaps[k] != 1.0)) { > - mode_lib->vba.ScaleRatioAndTapsSupport = false; > - } else if (mode_lib->vba.vtaps[k] < 1.0 || mode_lib->vba.vtaps[k] > 8.0 > - || mode_lib->vba.htaps[k] < 1.0 || mode_lib->vba.htaps[k] > 8.0 > - || (mode_lib->vba.htaps[k] > 1.0 > - && (mode_lib->vba.htaps[k] % 2) == 1) > - || mode_lib->vba.HRatio[k] > mode_lib->vba.MaxHSCLRatio > - || mode_lib->vba.VRatio[k] > mode_lib->vba.MaxVSCLRatio > - || mode_lib->vba.HRatio[k] > mode_lib->vba.htaps[k] > - || mode_lib->vba.VRatio[k] > mode_lib->vba.vtaps[k] > - || (mode_lib->vba.SourcePixelFormat[k] != dm_444_64 > - && mode_lib->vba.SourcePixelFormat[k] != dm_444_32 > - && mode_lib->vba.SourcePixelFormat[k] != dm_444_16 > - && mode_lib->vba.SourcePixelFormat[k] != dm_mono_16 > - && mode_lib->vba.SourcePixelFormat[k] != dm_mono_8 > - && (mode_lib->vba.HRatio[k] / 2.0 > - > mode_lib->vba.HTAPsChroma[k] > - || mode_lib->vba.VRatio[k] / 2.0 > - > mode_lib->vba.VTAPsChroma[k]))) { > - mode_lib->vba.ScaleRatioAndTapsSupport = false; > - } > - } > - /*Source Format, Pixel Format and Scan Support Check*/ > - > - mode_lib->vba.SourceFormatPixelAndScanSupport = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if ((mode_lib->vba.SurfaceTiling[k] == dm_sw_linear > - && mode_lib->vba.SourceScan[k] != dm_horz) > - || ((mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_d > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_d_x > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d_t > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d_x > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_var_d > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_var_d_x) > - && mode_lib->vba.SourcePixelFormat[k] != dm_444_64) > - || (mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_r_x > - && (mode_lib->vba.SourcePixelFormat[k] == dm_mono_8 > - || mode_lib->vba.SourcePixelFormat[k] > - == dm_420_8 > - || mode_lib->vba.SourcePixelFormat[k] > - == dm_420_10)) > - || (((mode_lib->vba.SurfaceTiling[k] > - == dm_sw_gfx7_2d_thin_gl > - || mode_lib->vba.SurfaceTiling[k] > - == dm_sw_gfx7_2d_thin_lvp) > - && !((mode_lib->vba.SourcePixelFormat[k] > - == dm_444_64 > - || mode_lib->vba.SourcePixelFormat[k] > - == dm_444_32) > - && mode_lib->vba.SourceScan[k] > - == dm_horz > - && mode_lib->vba.SupportGFX7CompatibleTilingIn32bppAnd64bpp > - == true > - && mode_lib->vba.DCCEnable[k] > - == false)) > - || (mode_lib->vba.DCCEnable[k] == true > - && (mode_lib->vba.SurfaceTiling[k] > - == dm_sw_linear > - || mode_lib->vba.SourcePixelFormat[k] > - == dm_420_8 > - || mode_lib->vba.SourcePixelFormat[k] > - == dm_420_10)))) { > - mode_lib->vba.SourceFormatPixelAndScanSupport = false; > - } > - } > - /*Bandwidth Support Check*/ > - > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.SourceScan[k] == dm_horz) { > - mode_lib->vba.SwathWidthYSingleDPP[k] = mode_lib->vba.ViewportWidth[k]; > - } else { > - mode_lib->vba.SwathWidthYSingleDPP[k] = mode_lib->vba.ViewportHeight[k]; > - } > - if (mode_lib->vba.SourcePixelFormat[k] == dm_444_64) { > - mode_lib->vba.BytePerPixelInDETY[k] = 8.0; > - mode_lib->vba.BytePerPixelInDETC[k] = 0.0; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_32) { > - mode_lib->vba.BytePerPixelInDETY[k] = 4.0; > - mode_lib->vba.BytePerPixelInDETC[k] = 0.0; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_444_16 > - || mode_lib->vba.SourcePixelFormat[k] == dm_mono_16) { > - mode_lib->vba.BytePerPixelInDETY[k] = 2.0; > - mode_lib->vba.BytePerPixelInDETC[k] = 0.0; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_mono_8) { > - mode_lib->vba.BytePerPixelInDETY[k] = 1.0; > - mode_lib->vba.BytePerPixelInDETC[k] = 0.0; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8) { > - mode_lib->vba.BytePerPixelInDETY[k] = 1.0; > - mode_lib->vba.BytePerPixelInDETC[k] = 2.0; > - } else { > - mode_lib->vba.BytePerPixelInDETY[k] = 4.0 / 3; > - mode_lib->vba.BytePerPixelInDETC[k] = 8.0 / 3; > - } > - } > - mode_lib->vba.TotalReadBandwidthConsumedGBytePerSecond = 0.0; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.ReadBandwidth[k] = mode_lib->vba.SwathWidthYSingleDPP[k] > - * (dml_ceil(mode_lib->vba.BytePerPixelInDETY[k], 1.0) > - * mode_lib->vba.VRatio[k] > - + dml_ceil(mode_lib->vba.BytePerPixelInDETC[k], 2.0) > - / 2.0 * mode_lib->vba.VRatio[k] / 2) > - / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]); > - if (mode_lib->vba.DCCEnable[k] == true) { > - mode_lib->vba.ReadBandwidth[k] = mode_lib->vba.ReadBandwidth[k] > - * (1 + 1 / 256); > - } > - if (mode_lib->vba.VirtualMemoryEnable == true > - && mode_lib->vba.SourceScan[k] != dm_horz > - && (mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_s > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_s_x > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_d > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_4kb_d_x)) { > - mode_lib->vba.ReadBandwidth[k] = mode_lib->vba.ReadBandwidth[k] > - * (1 + 1 / 64); > - } else if (mode_lib->vba.VirtualMemoryEnable == true > - && mode_lib->vba.SourceScan[k] == dm_horz > - && (mode_lib->vba.SourcePixelFormat[k] == dm_444_64 > - || mode_lib->vba.SourcePixelFormat[k] == dm_444_32) > - && (mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_s > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_s_t > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_s_x > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d_t > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_d_x > - || mode_lib->vba.SurfaceTiling[k] == dm_sw_64kb_r_x)) { > - mode_lib->vba.ReadBandwidth[k] = mode_lib->vba.ReadBandwidth[k] > - * (1 + 1 / 256); > - } else if (mode_lib->vba.VirtualMemoryEnable == true) { > - mode_lib->vba.ReadBandwidth[k] = mode_lib->vba.ReadBandwidth[k] > - * (1 + 1 / 512); > - } > - mode_lib->vba.TotalReadBandwidthConsumedGBytePerSecond = > - mode_lib->vba.TotalReadBandwidthConsumedGBytePerSecond > - + mode_lib->vba.ReadBandwidth[k] / 1000.0; > - } > - mode_lib->vba.TotalWriteBandwidthConsumedGBytePerSecond = 0.0; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.WritebackEnable[k] == true > - && mode_lib->vba.WritebackPixelFormat[k] == dm_444_32) { > - mode_lib->vba.WriteBandwidth[k] = mode_lib->vba.WritebackDestinationWidth[k] > - * mode_lib->vba.WritebackDestinationHeight[k] > - / (mode_lib->vba.WritebackSourceHeight[k] > - * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]) * 4.0; > - } else if (mode_lib->vba.WritebackEnable[k] == true > - && mode_lib->vba.WritebackPixelFormat[k] == dm_420_10) { > - mode_lib->vba.WriteBandwidth[k] = mode_lib->vba.WritebackDestinationWidth[k] > - * mode_lib->vba.WritebackDestinationHeight[k] > - / (mode_lib->vba.WritebackSourceHeight[k] > - * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]) * 3.0; > - } else if (mode_lib->vba.WritebackEnable[k] == true) { > - mode_lib->vba.WriteBandwidth[k] = mode_lib->vba.WritebackDestinationWidth[k] > - * mode_lib->vba.WritebackDestinationHeight[k] > - / (mode_lib->vba.WritebackSourceHeight[k] > - * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]) * 1.5; > - } else { > - mode_lib->vba.WriteBandwidth[k] = 0.0; > - } > - mode_lib->vba.TotalWriteBandwidthConsumedGBytePerSecond = > - mode_lib->vba.TotalWriteBandwidthConsumedGBytePerSecond > - + mode_lib->vba.WriteBandwidth[k] / 1000.0; > - } > - mode_lib->vba.TotalBandwidthConsumedGBytePerSecond = > - mode_lib->vba.TotalReadBandwidthConsumedGBytePerSecond > - + mode_lib->vba.TotalWriteBandwidthConsumedGBytePerSecond; > - mode_lib->vba.DCCEnabledInAnyPlane = false; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.DCCEnable[k] == true) { > - mode_lib->vba.DCCEnabledInAnyPlane = true; > - } > - } > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - mode_lib->vba.FabricAndDRAMBandwidthPerState[i] = dml_min( > - mode_lib->vba.DRAMSpeedPerState[i] * mode_lib->vba.NumberOfChannels > - * mode_lib->vba.DRAMChannelWidth, > - mode_lib->vba.FabricClockPerState[i] > - * mode_lib->vba.FabricDatapathToDCNDataReturn) > - / 1000; > - mode_lib->vba.ReturnBWToDCNPerState = dml_min( > - mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLKPerState[i], > - mode_lib->vba.FabricAndDRAMBandwidthPerState[i] * 1000.0) > - * mode_lib->vba.PercentOfIdealDRAMAndFabricBWReceivedAfterUrgLatency > - / 100; > - mode_lib->vba.ReturnBWPerState[i] = mode_lib->vba.ReturnBWToDCNPerState; > - if (mode_lib->vba.DCCEnabledInAnyPlane == true > - && mode_lib->vba.ReturnBWToDCNPerState > - > mode_lib->vba.DCFCLKPerState[i] > - * mode_lib->vba.ReturnBusWidth > - / 4.0) { > - mode_lib->vba.ReturnBWPerState[i] = > - dml_min( > - mode_lib->vba.ReturnBWPerState[i], > - mode_lib->vba.ReturnBWToDCNPerState * 4.0 > - * (1.0 > - - mode_lib->vba.UrgentLatency > - / ((mode_lib->vba.ROBBufferSizeInKByte > - - mode_lib->vba.PixelChunkSizeInKByte) > - * 1024.0 > - / (mode_lib->vba.ReturnBWToDCNPerState > - - mode_lib->vba.DCFCLKPerState[i] > - * mode_lib->vba.ReturnBusWidth > - / 4.0) > - + mode_lib->vba.UrgentLatency))); > - } > - mode_lib->vba.CriticalPoint = > - 2.0 * mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLKPerState[i] > - * mode_lib->vba.UrgentLatency > - / (mode_lib->vba.ReturnBWToDCNPerState > - * mode_lib->vba.UrgentLatency > - + (mode_lib->vba.ROBBufferSizeInKByte > - - mode_lib->vba.PixelChunkSizeInKByte) > - * 1024.0); > - if (mode_lib->vba.DCCEnabledInAnyPlane == true && mode_lib->vba.CriticalPoint > 1.0 > - && mode_lib->vba.CriticalPoint < 4.0) { > - mode_lib->vba.ReturnBWPerState[i] = > - dml_min( > - mode_lib->vba.ReturnBWPerState[i], > - dml_pow( > - 4.0 > - * mode_lib->vba.ReturnBWToDCNPerState > - * (mode_lib->vba.ROBBufferSizeInKByte > - - mode_lib->vba.PixelChunkSizeInKByte) > - * 1024.0 > - * mode_lib->vba.ReturnBusWidth > - * mode_lib->vba.DCFCLKPerState[i] > - * mode_lib->vba.UrgentLatency > - / (mode_lib->vba.ReturnBWToDCNPerState > - * mode_lib->vba.UrgentLatency > - + (mode_lib->vba.ROBBufferSizeInKByte > - - mode_lib->vba.PixelChunkSizeInKByte) > - * 1024.0), > - 2)); > - } > - mode_lib->vba.ReturnBWToDCNPerState = dml_min( > - mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLKPerState[i], > - mode_lib->vba.FabricAndDRAMBandwidthPerState[i] * 1000.0); > - if (mode_lib->vba.DCCEnabledInAnyPlane == true > - && mode_lib->vba.ReturnBWToDCNPerState > - > mode_lib->vba.DCFCLKPerState[i] > - * mode_lib->vba.ReturnBusWidth > - / 4.0) { > - mode_lib->vba.ReturnBWPerState[i] = > - dml_min( > - mode_lib->vba.ReturnBWPerState[i], > - mode_lib->vba.ReturnBWToDCNPerState * 4.0 > - * (1.0 > - - mode_lib->vba.UrgentLatency > - / ((mode_lib->vba.ROBBufferSizeInKByte > - - mode_lib->vba.PixelChunkSizeInKByte) > - * 1024.0 > - / (mode_lib->vba.ReturnBWToDCNPerState > - - mode_lib->vba.DCFCLKPerState[i] > - * mode_lib->vba.ReturnBusWidth > - / 4.0) > - + mode_lib->vba.UrgentLatency))); > - } > - mode_lib->vba.CriticalPoint = > - 2.0 * mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLKPerState[i] > - * mode_lib->vba.UrgentLatency > - / (mode_lib->vba.ReturnBWToDCNPerState > - * mode_lib->vba.UrgentLatency > - + (mode_lib->vba.ROBBufferSizeInKByte > - - mode_lib->vba.PixelChunkSizeInKByte) > - * 1024.0); > - if (mode_lib->vba.DCCEnabledInAnyPlane == true && mode_lib->vba.CriticalPoint > 1.0 > - && mode_lib->vba.CriticalPoint < 4.0) { > - mode_lib->vba.ReturnBWPerState[i] = > - dml_min( > - mode_lib->vba.ReturnBWPerState[i], > - dml_pow( > - 4.0 > - * mode_lib->vba.ReturnBWToDCNPerState > - * (mode_lib->vba.ROBBufferSizeInKByte > - - mode_lib->vba.PixelChunkSizeInKByte) > - * 1024.0 > - * mode_lib->vba.ReturnBusWidth > - * mode_lib->vba.DCFCLKPerState[i] > - * mode_lib->vba.UrgentLatency > - / (mode_lib->vba.ReturnBWToDCNPerState > - * mode_lib->vba.UrgentLatency > - + (mode_lib->vba.ROBBufferSizeInKByte > - - mode_lib->vba.PixelChunkSizeInKByte) > - * 1024.0), > - 2)); > - } > - } > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - if ((mode_lib->vba.TotalReadBandwidthConsumedGBytePerSecond * 1000.0 > - <= mode_lib->vba.ReturnBWPerState[i]) > - && (mode_lib->vba.TotalBandwidthConsumedGBytePerSecond * 1000.0 > - <= mode_lib->vba.FabricAndDRAMBandwidthPerState[i] > - * 1000.0 > - * mode_lib->vba.PercentOfIdealDRAMAndFabricBWReceivedAfterUrgLatency > - / 100.0)) { > - mode_lib->vba.BandwidthSupport[i] = true; > - } else { > - mode_lib->vba.BandwidthSupport[i] = false; > - } > - } > - /*Writeback Latency support check*/ > - > - mode_lib->vba.WritebackLatencySupport = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.WritebackEnable[k] == true) { > - if (mode_lib->vba.WritebackPixelFormat[k] == dm_444_32) { > - if (mode_lib->vba.WriteBandwidth[k] > - > (mode_lib->vba.WritebackInterfaceLumaBufferSize > - + mode_lib->vba.WritebackInterfaceChromaBufferSize) > - / mode_lib->vba.WritebackLatency) { > - mode_lib->vba.WritebackLatencySupport = false; > - } > - } else { > - if (mode_lib->vba.WriteBandwidth[k] > - > 1.5 > - * dml_min( > - mode_lib->vba.WritebackInterfaceLumaBufferSize, > - 2.0 > - * mode_lib->vba.WritebackInterfaceChromaBufferSize) > - / mode_lib->vba.WritebackLatency) { > - mode_lib->vba.WritebackLatencySupport = false; > - } > - } > - } > - } > - /*Re-ordering Buffer Support Check*/ > - > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - mode_lib->vba.UrgentRoundTripAndOutOfOrderLatencyPerState[i] = > - (mode_lib->vba.RoundTripPingLatencyCycles + 32.0) > - / mode_lib->vba.DCFCLKPerState[i] > - + mode_lib->vba.UrgentOutOfOrderReturnPerChannel > - * mode_lib->vba.NumberOfChannels > - / mode_lib->vba.ReturnBWPerState[i]; > - if ((mode_lib->vba.ROBBufferSizeInKByte - mode_lib->vba.PixelChunkSizeInKByte) > - * 1024.0 / mode_lib->vba.ReturnBWPerState[i] > - > mode_lib->vba.UrgentRoundTripAndOutOfOrderLatencyPerState[i]) { > - mode_lib->vba.ROBSupport[i] = true; > - } else { > - mode_lib->vba.ROBSupport[i] = false; > - } > - } > - /*Writeback Mode Support Check*/ > - > - mode_lib->vba.TotalNumberOfActiveWriteback = 0; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.WritebackEnable[k] == true) { > - mode_lib->vba.TotalNumberOfActiveWriteback = > - mode_lib->vba.TotalNumberOfActiveWriteback + 1; > - } > - } > - mode_lib->vba.WritebackModeSupport = true; > - if (mode_lib->vba.TotalNumberOfActiveWriteback > mode_lib->vba.MaxNumWriteback) { > - mode_lib->vba.WritebackModeSupport = false; > - } > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.WritebackEnable[k] == true > - && mode_lib->vba.Writeback10bpc420Supported != true > - && mode_lib->vba.WritebackPixelFormat[k] == dm_420_10) { > - mode_lib->vba.WritebackModeSupport = false; > - } > - } > - /*Writeback Scale Ratio and Taps Support Check*/ > - > - mode_lib->vba.WritebackScaleRatioAndTapsSupport = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.WritebackEnable[k] == true) { > - if (mode_lib->vba.WritebackLumaAndChromaScalingSupported == false > - && (mode_lib->vba.WritebackHRatio[k] != 1.0 > - || mode_lib->vba.WritebackVRatio[k] != 1.0)) { > - mode_lib->vba.WritebackScaleRatioAndTapsSupport = false; > - } > - if (mode_lib->vba.WritebackHRatio[k] > mode_lib->vba.WritebackMaxHSCLRatio > - || mode_lib->vba.WritebackVRatio[k] > - > mode_lib->vba.WritebackMaxVSCLRatio > - || mode_lib->vba.WritebackHRatio[k] > - < mode_lib->vba.WritebackMinHSCLRatio > - || mode_lib->vba.WritebackVRatio[k] > - < mode_lib->vba.WritebackMinVSCLRatio > - || mode_lib->vba.WritebackLumaHTaps[k] > - > mode_lib->vba.WritebackMaxHSCLTaps > - || mode_lib->vba.WritebackLumaVTaps[k] > - > mode_lib->vba.WritebackMaxVSCLTaps > - || mode_lib->vba.WritebackHRatio[k] > - > mode_lib->vba.WritebackLumaHTaps[k] > - || mode_lib->vba.WritebackVRatio[k] > - > mode_lib->vba.WritebackLumaVTaps[k] > - || (mode_lib->vba.WritebackLumaHTaps[k] > 2.0 > - && ((mode_lib->vba.WritebackLumaHTaps[k] % 2) > - == 1)) > - || (mode_lib->vba.WritebackPixelFormat[k] != dm_444_32 > - && (mode_lib->vba.WritebackChromaHTaps[k] > - > mode_lib->vba.WritebackMaxHSCLTaps > - || mode_lib->vba.WritebackChromaVTaps[k] > - > mode_lib->vba.WritebackMaxVSCLTaps > - || 2.0 > - * mode_lib->vba.WritebackHRatio[k] > - > mode_lib->vba.WritebackChromaHTaps[k] > - || 2.0 > - * mode_lib->vba.WritebackVRatio[k] > - > mode_lib->vba.WritebackChromaVTaps[k] > - || (mode_lib->vba.WritebackChromaHTaps[k] > 2.0 > - && ((mode_lib->vba.WritebackChromaHTaps[k] % 2) == 1))))) { > - mode_lib->vba.WritebackScaleRatioAndTapsSupport = false; > - } > - if (mode_lib->vba.WritebackVRatio[k] < 1.0) { > - mode_lib->vba.WritebackLumaVExtra = > - dml_max(1.0 - 2.0 / dml_ceil(1.0 / mode_lib->vba.WritebackVRatio[k], 1.0), 0.0); > - } else { > - mode_lib->vba.WritebackLumaVExtra = -1; > - } > - if ((mode_lib->vba.WritebackPixelFormat[k] == dm_444_32 > - && mode_lib->vba.WritebackLumaVTaps[k] > - > (mode_lib->vba.WritebackLineBufferLumaBufferSize > - + mode_lib->vba.WritebackLineBufferChromaBufferSize) > - / 3.0 > - / mode_lib->vba.WritebackDestinationWidth[k] > - - mode_lib->vba.WritebackLumaVExtra) > - || (mode_lib->vba.WritebackPixelFormat[k] == dm_420_8 > - && mode_lib->vba.WritebackLumaVTaps[k] > - > mode_lib->vba.WritebackLineBufferLumaBufferSize > - / mode_lib->vba.WritebackDestinationWidth[k] > - - mode_lib->vba.WritebackLumaVExtra) > - || (mode_lib->vba.WritebackPixelFormat[k] == dm_420_10 > - && mode_lib->vba.WritebackLumaVTaps[k] > - > mode_lib->vba.WritebackLineBufferLumaBufferSize > - * 8.0 / 10.0 > - / mode_lib->vba.WritebackDestinationWidth[k] > - - mode_lib->vba.WritebackLumaVExtra)) { > - mode_lib->vba.WritebackScaleRatioAndTapsSupport = false; > - } > - if (2.0 * mode_lib->vba.WritebackVRatio[k] < 1) { > - mode_lib->vba.WritebackChromaVExtra = 0.0; > - } else { > - mode_lib->vba.WritebackChromaVExtra = -1; > - } > - if ((mode_lib->vba.WritebackPixelFormat[k] == dm_420_8 > - && mode_lib->vba.WritebackChromaVTaps[k] > - > mode_lib->vba.WritebackLineBufferChromaBufferSize > - / mode_lib->vba.WritebackDestinationWidth[k] > - - mode_lib->vba.WritebackChromaVExtra) > - || (mode_lib->vba.WritebackPixelFormat[k] == dm_420_10 > - && mode_lib->vba.WritebackChromaVTaps[k] > - > mode_lib->vba.WritebackLineBufferChromaBufferSize > - * 8.0 / 10.0 > - / mode_lib->vba.WritebackDestinationWidth[k] > - - mode_lib->vba.WritebackChromaVExtra)) { > - mode_lib->vba.WritebackScaleRatioAndTapsSupport = false; > - } > - } > - } > - /*Maximum DISPCLK/DPPCLK Support check*/ > - > - mode_lib->vba.WritebackRequiredDISPCLK = 0.0; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.WritebackEnable[k] == true) { > - mode_lib->vba.WritebackRequiredDISPCLK = > - dml_max( > - mode_lib->vba.WritebackRequiredDISPCLK, > - CalculateWriteBackDISPCLK( > - mode_lib->vba.WritebackPixelFormat[k], > - mode_lib->vba.PixelClock[k], > - mode_lib->vba.WritebackHRatio[k], > - mode_lib->vba.WritebackVRatio[k], > - mode_lib->vba.WritebackLumaHTaps[k], > - mode_lib->vba.WritebackLumaVTaps[k], > - mode_lib->vba.WritebackChromaHTaps[k], > - mode_lib->vba.WritebackChromaVTaps[k], > - mode_lib->vba.WritebackDestinationWidth[k], > - mode_lib->vba.HTotal[k], > - mode_lib->vba.WritebackChromaLineBufferWidth)); > - } > - } > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.HRatio[k] > 1.0) { > - mode_lib->vba.PSCL_FACTOR[k] = dml_min( > - mode_lib->vba.MaxDCHUBToPSCLThroughput, > - mode_lib->vba.MaxPSCLToLBThroughput > - * mode_lib->vba.HRatio[k] > - / dml_ceil( > - mode_lib->vba.htaps[k] > - / 6.0, > - 1.0)); > - } else { > - mode_lib->vba.PSCL_FACTOR[k] = dml_min( > - mode_lib->vba.MaxDCHUBToPSCLThroughput, > - mode_lib->vba.MaxPSCLToLBThroughput); > - } > - if (mode_lib->vba.BytePerPixelInDETC[k] == 0.0) { > - mode_lib->vba.PSCL_FACTOR_CHROMA[k] = 0.0; > - mode_lib->vba.MinDPPCLKUsingSingleDPP[k] = > - mode_lib->vba.PixelClock[k] > - * dml_max3( > - mode_lib->vba.vtaps[k] / 6.0 > - * dml_min( > - 1.0, > - mode_lib->vba.HRatio[k]), > - mode_lib->vba.HRatio[k] > - * mode_lib->vba.VRatio[k] > - / mode_lib->vba.PSCL_FACTOR[k], > - 1.0); > - if ((mode_lib->vba.htaps[k] > 6.0 || mode_lib->vba.vtaps[k] > 6.0) > - && mode_lib->vba.MinDPPCLKUsingSingleDPP[k] > - < 2.0 * mode_lib->vba.PixelClock[k]) { > - mode_lib->vba.MinDPPCLKUsingSingleDPP[k] = 2.0 > - * mode_lib->vba.PixelClock[k]; > - } > - } else { > - if (mode_lib->vba.HRatio[k] / 2.0 > 1.0) { > - mode_lib->vba.PSCL_FACTOR_CHROMA[k] = > - dml_min( > - mode_lib->vba.MaxDCHUBToPSCLThroughput, > - mode_lib->vba.MaxPSCLToLBThroughput > - * mode_lib->vba.HRatio[k] > - / 2.0 > - / dml_ceil( > - mode_lib->vba.HTAPsChroma[k] > - / 6.0, > - 1.0)); > - } else { > - mode_lib->vba.PSCL_FACTOR_CHROMA[k] = dml_min( > - mode_lib->vba.MaxDCHUBToPSCLThroughput, > - mode_lib->vba.MaxPSCLToLBThroughput); > - } > - mode_lib->vba.MinDPPCLKUsingSingleDPP[k] = > - mode_lib->vba.PixelClock[k] > - * dml_max5( > - mode_lib->vba.vtaps[k] / 6.0 > - * dml_min( > - 1.0, > - mode_lib->vba.HRatio[k]), > - mode_lib->vba.HRatio[k] > - * mode_lib->vba.VRatio[k] > - / mode_lib->vba.PSCL_FACTOR[k], > - mode_lib->vba.VTAPsChroma[k] > - / 6.0 > - * dml_min( > - 1.0, > - mode_lib->vba.HRatio[k] > - / 2.0), > - mode_lib->vba.HRatio[k] > - * mode_lib->vba.VRatio[k] > - / 4.0 > - / mode_lib->vba.PSCL_FACTOR_CHROMA[k], > - 1.0); > - if ((mode_lib->vba.htaps[k] > 6.0 || mode_lib->vba.vtaps[k] > 6.0 > - || mode_lib->vba.HTAPsChroma[k] > 6.0 > - || mode_lib->vba.VTAPsChroma[k] > 6.0) > - && mode_lib->vba.MinDPPCLKUsingSingleDPP[k] > - < 2.0 * mode_lib->vba.PixelClock[k]) { > - mode_lib->vba.MinDPPCLKUsingSingleDPP[k] = 2.0 > - * mode_lib->vba.PixelClock[k]; > - } > - } > - } > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - Calculate256BBlockSizes( > - mode_lib->vba.SourcePixelFormat[k], > - mode_lib->vba.SurfaceTiling[k], > - dml_ceil(mode_lib->vba.BytePerPixelInDETY[k], 1.0), > - dml_ceil(mode_lib->vba.BytePerPixelInDETC[k], 2.0), > - &mode_lib->vba.Read256BlockHeightY[k], > - &mode_lib->vba.Read256BlockHeightC[k], > - &mode_lib->vba.Read256BlockWidthY[k], > - &mode_lib->vba.Read256BlockWidthC[k]); > - if (mode_lib->vba.SourceScan[k] == dm_horz) { > - mode_lib->vba.MaxSwathHeightY[k] = mode_lib->vba.Read256BlockHeightY[k]; > - mode_lib->vba.MaxSwathHeightC[k] = mode_lib->vba.Read256BlockHeightC[k]; > - } else { > - mode_lib->vba.MaxSwathHeightY[k] = mode_lib->vba.Read256BlockWidthY[k]; > - mode_lib->vba.MaxSwathHeightC[k] = mode_lib->vba.Read256BlockWidthC[k]; > - } > - if ((mode_lib->vba.SourcePixelFormat[k] == dm_444_64 > - || mode_lib->vba.SourcePixelFormat[k] == dm_444_32 > - || mode_lib->vba.SourcePixelFormat[k] == dm_444_16 > - || mode_lib->vba.SourcePixelFormat[k] == dm_mono_16 > - || mode_lib->vba.SourcePixelFormat[k] == dm_mono_8)) { > - if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear > - || (mode_lib->vba.SourcePixelFormat[k] == dm_444_64 > - && (mode_lib->vba.SurfaceTiling[k] > - == dm_sw_4kb_s > - || mode_lib->vba.SurfaceTiling[k] > - == dm_sw_4kb_s_x > - || mode_lib->vba.SurfaceTiling[k] > - == dm_sw_64kb_s > - || mode_lib->vba.SurfaceTiling[k] > - == dm_sw_64kb_s_t > - || mode_lib->vba.SurfaceTiling[k] > - == dm_sw_64kb_s_x > - || mode_lib->vba.SurfaceTiling[k] > - == dm_sw_var_s > - || mode_lib->vba.SurfaceTiling[k] > - == dm_sw_var_s_x) > - && mode_lib->vba.SourceScan[k] == dm_horz)) { > - mode_lib->vba.MinSwathHeightY[k] = mode_lib->vba.MaxSwathHeightY[k]; > - } else { > - mode_lib->vba.MinSwathHeightY[k] = mode_lib->vba.MaxSwathHeightY[k] > - / 2.0; > - } > - mode_lib->vba.MinSwathHeightC[k] = mode_lib->vba.MaxSwathHeightC[k]; > - } else { > - if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) { > - mode_lib->vba.MinSwathHeightY[k] = mode_lib->vba.MaxSwathHeightY[k]; > - mode_lib->vba.MinSwathHeightC[k] = mode_lib->vba.MaxSwathHeightC[k]; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8 > - && mode_lib->vba.SourceScan[k] == dm_horz) { > - mode_lib->vba.MinSwathHeightY[k] = mode_lib->vba.MaxSwathHeightY[k] > - / 2.0; > - mode_lib->vba.MinSwathHeightC[k] = mode_lib->vba.MaxSwathHeightC[k]; > - } else if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10 > - && mode_lib->vba.SourceScan[k] == dm_horz) { > - mode_lib->vba.MinSwathHeightC[k] = mode_lib->vba.MaxSwathHeightC[k] > - / 2.0; > - mode_lib->vba.MinSwathHeightY[k] = mode_lib->vba.MaxSwathHeightY[k]; > - } else { > - mode_lib->vba.MinSwathHeightY[k] = mode_lib->vba.MaxSwathHeightY[k]; > - mode_lib->vba.MinSwathHeightC[k] = mode_lib->vba.MaxSwathHeightC[k]; > - } > - } > - if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) { > - mode_lib->vba.MaximumSwathWidthSupport = 8192.0; > - } else { > - mode_lib->vba.MaximumSwathWidthSupport = 5120.0; > - } > - mode_lib->vba.MaximumSwathWidthInDETBuffer = > - dml_min( > - mode_lib->vba.MaximumSwathWidthSupport, > - mode_lib->vba.DETBufferSizeInKByte * 1024.0 / 2.0 > - / (mode_lib->vba.BytePerPixelInDETY[k] > - * mode_lib->vba.MinSwathHeightY[k] > - + mode_lib->vba.BytePerPixelInDETC[k] > - / 2.0 > - * mode_lib->vba.MinSwathHeightC[k])); > - if (mode_lib->vba.BytePerPixelInDETC[k] == 0.0) { > - mode_lib->vba.MaximumSwathWidthInLineBuffer = > - mode_lib->vba.LineBufferSize > - * dml_max(mode_lib->vba.HRatio[k], 1.0) > - / mode_lib->vba.LBBitPerPixel[k] > - / (mode_lib->vba.vtaps[k] > - + dml_max( > - dml_ceil( > - mode_lib->vba.VRatio[k], > - 1.0) > - - 2, > - 0.0)); > - } else { > - mode_lib->vba.MaximumSwathWidthInLineBuffer = > - dml_min( > - mode_lib->vba.LineBufferSize > - * dml_max( > - mode_lib->vba.HRatio[k], > - 1.0) > - / mode_lib->vba.LBBitPerPixel[k] > - / (mode_lib->vba.vtaps[k] > - + dml_max( > - dml_ceil( > - mode_lib->vba.VRatio[k], > - 1.0) > - - 2, > - 0.0)), > - 2.0 * mode_lib->vba.LineBufferSize > - * dml_max( > - mode_lib->vba.HRatio[k] > - / 2.0, > - 1.0) > - / mode_lib->vba.LBBitPerPixel[k] > - / (mode_lib->vba.VTAPsChroma[k] > - + dml_max( > - dml_ceil( > - mode_lib->vba.VRatio[k] > - / 2.0, > - 1.0) > - - 2, > - 0.0))); > - } > - mode_lib->vba.MaximumSwathWidth[k] = dml_min( > - mode_lib->vba.MaximumSwathWidthInDETBuffer, > - mode_lib->vba.MaximumSwathWidthInLineBuffer); > - } > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity = RoundToDFSGranularityDown( > - mode_lib->vba.MaxDispclk[i], > - mode_lib->vba.DISPCLKDPPCLKVCOSpeed); > - mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity = RoundToDFSGranularityDown( > - mode_lib->vba.MaxDppclk[i], > - mode_lib->vba.DISPCLKDPPCLKVCOSpeed); > - mode_lib->vba.RequiredDISPCLK[i] = 0.0; > - mode_lib->vba.DISPCLK_DPPCLK_Support[i] = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine = > - mode_lib->vba.PixelClock[k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0) > - * (1.0 > - + mode_lib->vba.DISPCLKRampingMargin > - / 100.0); > - if (mode_lib->vba.ODMCapability == true > - && mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine > - > mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity) { > - mode_lib->vba.ODMCombineEnablePerState[i][k] = true; > - mode_lib->vba.PlaneRequiredDISPCLK = > - mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine > - / 2.0; > - } else { > - mode_lib->vba.ODMCombineEnablePerState[i][k] = false; > - mode_lib->vba.PlaneRequiredDISPCLK = > - mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine; > - } > - if (mode_lib->vba.MinDPPCLKUsingSingleDPP[k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0) > - <= mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity > - && mode_lib->vba.SwathWidthYSingleDPP[k] > - <= mode_lib->vba.MaximumSwathWidth[k] > - && mode_lib->vba.ODMCombineEnablePerState[i][k] == false) { > - mode_lib->vba.NoOfDPP[i][k] = 1; > - mode_lib->vba.RequiredDPPCLK[i][k] = > - mode_lib->vba.MinDPPCLKUsingSingleDPP[k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0); > - } else { > - mode_lib->vba.NoOfDPP[i][k] = 2; > - mode_lib->vba.RequiredDPPCLK[i][k] = > - mode_lib->vba.MinDPPCLKUsingSingleDPP[k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0) > - / 2.0; > - } > - mode_lib->vba.RequiredDISPCLK[i] = dml_max( > - mode_lib->vba.RequiredDISPCLK[i], > - mode_lib->vba.PlaneRequiredDISPCLK); > - if ((mode_lib->vba.MinDPPCLKUsingSingleDPP[k] / mode_lib->vba.NoOfDPP[i][k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0) > - > mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity) > - || (mode_lib->vba.PlaneRequiredDISPCLK > - > mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity)) { > - mode_lib->vba.DISPCLK_DPPCLK_Support[i] = false; > - } > - } > - mode_lib->vba.TotalNumberOfActiveDPP[i] = 0.0; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.TotalNumberOfActiveDPP[i] = > - mode_lib->vba.TotalNumberOfActiveDPP[i] > - + mode_lib->vba.NoOfDPP[i][k]; > - } > - if ((mode_lib->vba.MaxDispclk[i] == mode_lib->vba.MaxDispclk[DC__VOLTAGE_STATES] > - && mode_lib->vba.MaxDppclk[i] > - == mode_lib->vba.MaxDppclk[DC__VOLTAGE_STATES]) > - && (mode_lib->vba.TotalNumberOfActiveDPP[i] > - > mode_lib->vba.MaxNumDPP > - || mode_lib->vba.DISPCLK_DPPCLK_Support[i] == false)) { > - mode_lib->vba.RequiredDISPCLK[i] = 0.0; > - mode_lib->vba.DISPCLK_DPPCLK_Support[i] = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine = > - mode_lib->vba.PixelClock[k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0); > - if (mode_lib->vba.ODMCapability == true > - && mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine > - > mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity) { > - mode_lib->vba.ODMCombineEnablePerState[i][k] = true; > - mode_lib->vba.PlaneRequiredDISPCLK = > - mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine > - / 2.0; > - } else { > - mode_lib->vba.ODMCombineEnablePerState[i][k] = false; > - mode_lib->vba.PlaneRequiredDISPCLK = > - mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine; > - } > - if (mode_lib->vba.MinDPPCLKUsingSingleDPP[k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0) > - <= mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity > - && mode_lib->vba.SwathWidthYSingleDPP[k] > - <= mode_lib->vba.MaximumSwathWidth[k] > - && mode_lib->vba.ODMCombineEnablePerState[i][k] > - == false) { > - mode_lib->vba.NoOfDPP[i][k] = 1; > - mode_lib->vba.RequiredDPPCLK[i][k] = > - mode_lib->vba.MinDPPCLKUsingSingleDPP[k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0); > - } else { > - mode_lib->vba.NoOfDPP[i][k] = 2; > - mode_lib->vba.RequiredDPPCLK[i][k] = > - mode_lib->vba.MinDPPCLKUsingSingleDPP[k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0) > - / 2.0; > - } > - mode_lib->vba.RequiredDISPCLK[i] = dml_max( > - mode_lib->vba.RequiredDISPCLK[i], > - mode_lib->vba.PlaneRequiredDISPCLK); > - if ((mode_lib->vba.MinDPPCLKUsingSingleDPP[k] > - / mode_lib->vba.NoOfDPP[i][k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0) > - > mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity) > - || (mode_lib->vba.PlaneRequiredDISPCLK > - > mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity)) { > - mode_lib->vba.DISPCLK_DPPCLK_Support[i] = false; > - } > - } > - mode_lib->vba.TotalNumberOfActiveDPP[i] = 0.0; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.TotalNumberOfActiveDPP[i] = > - mode_lib->vba.TotalNumberOfActiveDPP[i] > - + mode_lib->vba.NoOfDPP[i][k]; > - } > - } > - if (mode_lib->vba.TotalNumberOfActiveDPP[i] > mode_lib->vba.MaxNumDPP) { > - mode_lib->vba.RequiredDISPCLK[i] = 0.0; > - mode_lib->vba.DISPCLK_DPPCLK_Support[i] = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.ODMCombineEnablePerState[i][k] = false; > - if (mode_lib->vba.SwathWidthYSingleDPP[k] > - <= mode_lib->vba.MaximumSwathWidth[k]) { > - mode_lib->vba.NoOfDPP[i][k] = 1; > - mode_lib->vba.RequiredDPPCLK[i][k] = > - mode_lib->vba.MinDPPCLKUsingSingleDPP[k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0); > - } else { > - mode_lib->vba.NoOfDPP[i][k] = 2; > - mode_lib->vba.RequiredDPPCLK[i][k] = > - mode_lib->vba.MinDPPCLKUsingSingleDPP[k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0) > - / 2.0; > - } > - if (!(mode_lib->vba.MaxDispclk[i] > - == mode_lib->vba.MaxDispclk[DC__VOLTAGE_STATES] > - && mode_lib->vba.MaxDppclk[i] > - == mode_lib->vba.MaxDppclk[DC__VOLTAGE_STATES])) { > - mode_lib->vba.PlaneRequiredDISPCLK = > - mode_lib->vba.PixelClock[k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0) > - * (1.0 > - + mode_lib->vba.DISPCLKRampingMargin > - / 100.0); > - } else { > - mode_lib->vba.PlaneRequiredDISPCLK = > - mode_lib->vba.PixelClock[k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0); > - } > - mode_lib->vba.RequiredDISPCLK[i] = dml_max( > - mode_lib->vba.RequiredDISPCLK[i], > - mode_lib->vba.PlaneRequiredDISPCLK); > - if ((mode_lib->vba.MinDPPCLKUsingSingleDPP[k] > - / mode_lib->vba.NoOfDPP[i][k] > - * (1.0 > - + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0) > - > mode_lib->vba.MaxDppclkRoundedDownToDFSGranularity) > - || (mode_lib->vba.PlaneRequiredDISPCLK > - > mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity)) { > - mode_lib->vba.DISPCLK_DPPCLK_Support[i] = false; > - } > - } > - mode_lib->vba.TotalNumberOfActiveDPP[i] = 0.0; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.TotalNumberOfActiveDPP[i] = > - mode_lib->vba.TotalNumberOfActiveDPP[i] > - + mode_lib->vba.NoOfDPP[i][k]; > - } > - } > - mode_lib->vba.RequiredDISPCLK[i] = dml_max( > - mode_lib->vba.RequiredDISPCLK[i], > - mode_lib->vba.WritebackRequiredDISPCLK); > - if (mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity > - < mode_lib->vba.WritebackRequiredDISPCLK) { > - mode_lib->vba.DISPCLK_DPPCLK_Support[i] = false; > - } > - } > - /*Viewport Size Check*/ > - > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - mode_lib->vba.ViewportSizeSupport[i] = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.ODMCombineEnablePerState[i][k] == true) { > - if (dml_min(mode_lib->vba.SwathWidthYSingleDPP[k], dml_round(mode_lib->vba.HActive[k] / 2.0 * mode_lib->vba.HRatio[k])) > - > mode_lib->vba.MaximumSwathWidth[k]) { > - mode_lib->vba.ViewportSizeSupport[i] = false; > - } > - } else { > - if (mode_lib->vba.SwathWidthYSingleDPP[k] / 2.0 > - > mode_lib->vba.MaximumSwathWidth[k]) { > - mode_lib->vba.ViewportSizeSupport[i] = false; > - } > - } > - } > - } > - /*Total Available Pipes Support Check*/ > - > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - if (mode_lib->vba.TotalNumberOfActiveDPP[i] <= mode_lib->vba.MaxNumDPP) { > - mode_lib->vba.TotalAvailablePipesSupport[i] = true; > - } else { > - mode_lib->vba.TotalAvailablePipesSupport[i] = false; > - } > - } > - /*Total Available OTG Support Check*/ > - > - mode_lib->vba.TotalNumberOfActiveOTG = 0.0; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.BlendingAndTiming[k] == k) { > - mode_lib->vba.TotalNumberOfActiveOTG = mode_lib->vba.TotalNumberOfActiveOTG > - + 1.0; > - } > - } > - if (mode_lib->vba.TotalNumberOfActiveOTG <= mode_lib->vba.MaxNumOTG) { > - mode_lib->vba.NumberOfOTGSupport = true; > - } else { > - mode_lib->vba.NumberOfOTGSupport = false; > - } > - /*Display IO and DSC Support Check*/ > - > - mode_lib->vba.NonsupportedDSCInputBPC = false; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (!(mode_lib->vba.DSCInputBitPerComponent[k] == 12.0 > - || mode_lib->vba.DSCInputBitPerComponent[k] == 10.0 > - || mode_lib->vba.DSCInputBitPerComponent[k] == 8.0)) { > - mode_lib->vba.NonsupportedDSCInputBPC = true; > - } > - } > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.RequiresDSC[i][k] = 0; > - mode_lib->vba.RequiresFEC[i][k] = 0; > - if (mode_lib->vba.BlendingAndTiming[k] == k) { > - if (mode_lib->vba.Output[k] == dm_hdmi) { > - mode_lib->vba.RequiresDSC[i][k] = 0; > - mode_lib->vba.RequiresFEC[i][k] = 0; > - mode_lib->vba.OutputBppPerState[i][k] = > - TruncToValidBPP(dml_min(600.0, mode_lib->vba.PHYCLKPerState[i]) > - / mode_lib->vba.PixelClockBackEnd[k] * 24, > - false, > - mode_lib->vba.Output[k], > - mode_lib->vba.OutputFormat[k], > - mode_lib->vba.DSCInputBitPerComponent[k]); > - } else if (mode_lib->vba.Output[k] == dm_dp > - || mode_lib->vba.Output[k] == dm_edp) { > - if (mode_lib->vba.Output[k] == dm_edp) { > - mode_lib->vba.EffectiveFECOverhead = 0.0; > - } else { > - mode_lib->vba.EffectiveFECOverhead = > - mode_lib->vba.FECOverhead; > - } > - if (mode_lib->vba.PHYCLKPerState[i] >= 270.0) { > - mode_lib->vba.Outbpp = > - TruncToValidBPP((1.0 - mode_lib->vba.Downspreading / 100.0) * 270.0 > - * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0, > - false, > - mode_lib->vba.Output[k], > - mode_lib->vba.OutputFormat[k], > - mode_lib->vba.DSCInputBitPerComponent[k]); > - mode_lib->vba.OutbppDSC = > - TruncToValidBPP((1.0 - mode_lib->vba.Downspreading / 100.0) > - * (1.0 - mode_lib->vba.EffectiveFECOverhead / 100.0) * 270.0 > - * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0, > - true, > - mode_lib->vba.Output[k], > - mode_lib->vba.OutputFormat[k], > - mode_lib->vba.DSCInputBitPerComponent[k]); > - if (mode_lib->vba.DSCEnabled[k] == true) { > - mode_lib->vba.RequiresDSC[i][k] = true; > - if (mode_lib->vba.Output[k] == dm_dp) { > - mode_lib->vba.RequiresFEC[i][k] = > - true; > - } else { > - mode_lib->vba.RequiresFEC[i][k] = > - false; > - } > - mode_lib->vba.Outbpp = > - mode_lib->vba.OutbppDSC; > - } else { > - mode_lib->vba.RequiresDSC[i][k] = false; > - mode_lib->vba.RequiresFEC[i][k] = false; > - } > - mode_lib->vba.OutputBppPerState[i][k] = > - mode_lib->vba.Outbpp; > - } > - if (mode_lib->vba.Outbpp == BPP_INVALID) { > - mode_lib->vba.Outbpp = > - TruncToValidBPP((1.0 - mode_lib->vba.Downspreading / 100.0) * 540.0 > - * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0, > - false, > - mode_lib->vba.Output[k], > - mode_lib->vba.OutputFormat[k], > - mode_lib->vba.DSCInputBitPerComponent[k]); > - mode_lib->vba.OutbppDSC = > - TruncToValidBPP((1.0 - mode_lib->vba.Downspreading / 100.0) > - * (1.0 - mode_lib->vba.EffectiveFECOverhead / 100.0) * 540.0 > - * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0, > - true, > - mode_lib->vba.Output[k], > - mode_lib->vba.OutputFormat[k], > - mode_lib->vba.DSCInputBitPerComponent[k]); > - if (mode_lib->vba.DSCEnabled[k] == true) { > - mode_lib->vba.RequiresDSC[i][k] = true; > - if (mode_lib->vba.Output[k] == dm_dp) { > - mode_lib->vba.RequiresFEC[i][k] = > - true; > - } else { > - mode_lib->vba.RequiresFEC[i][k] = > - false; > - } > - mode_lib->vba.Outbpp = > - mode_lib->vba.OutbppDSC; > - } else { > - mode_lib->vba.RequiresDSC[i][k] = false; > - mode_lib->vba.RequiresFEC[i][k] = false; > - } > - mode_lib->vba.OutputBppPerState[i][k] = > - mode_lib->vba.Outbpp; > - } > - if (mode_lib->vba.Outbpp == BPP_INVALID > - && mode_lib->vba.PHYCLKPerState[i] > - >= 810.0) { > - mode_lib->vba.Outbpp = > - TruncToValidBPP((1.0 - mode_lib->vba.Downspreading / 100.0) * 810.0 > - * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0, > - false, > - mode_lib->vba.Output[k], > - mode_lib->vba.OutputFormat[k], > - mode_lib->vba.DSCInputBitPerComponent[k]); > - mode_lib->vba.OutbppDSC = > - TruncToValidBPP((1.0 - mode_lib->vba.Downspreading / 100.0) > - * (1.0 - mode_lib->vba.EffectiveFECOverhead / 100.0) * 810.0 > - * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0, > - true, > - mode_lib->vba.Output[k], > - mode_lib->vba.OutputFormat[k], > - mode_lib->vba.DSCInputBitPerComponent[k]); > - if (mode_lib->vba.DSCEnabled[k] == true > - || mode_lib->vba.Outbpp == BPP_INVALID) { > - mode_lib->vba.RequiresDSC[i][k] = true; > - if (mode_lib->vba.Output[k] == dm_dp) { > - mode_lib->vba.RequiresFEC[i][k] = > - true; > - } else { > - mode_lib->vba.RequiresFEC[i][k] = > - false; > - } > - mode_lib->vba.Outbpp = > - mode_lib->vba.OutbppDSC; > - } else { > - mode_lib->vba.RequiresDSC[i][k] = false; > - mode_lib->vba.RequiresFEC[i][k] = false; > - } > - mode_lib->vba.OutputBppPerState[i][k] = > - mode_lib->vba.Outbpp; > - } > - } > - } else { > - mode_lib->vba.OutputBppPerState[i][k] = BPP_BLENDED_PIPE; > - } > - } > - } > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - mode_lib->vba.DIOSupport[i] = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.OutputBppPerState[i][k] == BPP_INVALID > - || (mode_lib->vba.OutputFormat[k] == dm_420 > - && mode_lib->vba.ProgressiveToInterlaceUnitInOPP > - == true)) { > - mode_lib->vba.DIOSupport[i] = false; > - } > - } > - } > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = false; > - if (mode_lib->vba.BlendingAndTiming[k] == k) { > - if ((mode_lib->vba.Output[k] == dm_dp > - || mode_lib->vba.Output[k] == dm_edp)) { > - if (mode_lib->vba.OutputFormat[k] == dm_420 > - || mode_lib->vba.OutputFormat[k] > - == dm_n422) { > - mode_lib->vba.DSCFormatFactor = 2; > - } else { > - mode_lib->vba.DSCFormatFactor = 1; > - } > - if (mode_lib->vba.RequiresDSC[i][k] == true) { > - if (mode_lib->vba.ODMCombineEnablePerState[i][k] > - == true) { > - if (mode_lib->vba.PixelClockBackEnd[k] / 6.0 > - / mode_lib->vba.DSCFormatFactor > - > (1.0 > - - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0) > - * mode_lib->vba.MaxDSCCLK[i]) { > - mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = > - true; > - } > - } else { > - if (mode_lib->vba.PixelClockBackEnd[k] / 3.0 > - / mode_lib->vba.DSCFormatFactor > - > (1.0 > - - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading > - / 100.0) > - * mode_lib->vba.MaxDSCCLK[i]) { > - mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = > - true; > - } > - } > - } > - } > - } > - } > - } > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - mode_lib->vba.NotEnoughDSCUnits[i] = false; > - mode_lib->vba.TotalDSCUnitsRequired = 0.0; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.RequiresDSC[i][k] == true) { > - if (mode_lib->vba.ODMCombineEnablePerState[i][k] == true) { > - mode_lib->vba.TotalDSCUnitsRequired = > - mode_lib->vba.TotalDSCUnitsRequired + 2.0; > - } else { > - mode_lib->vba.TotalDSCUnitsRequired = > - mode_lib->vba.TotalDSCUnitsRequired + 1.0; > - } > - } > - } > - if (mode_lib->vba.TotalDSCUnitsRequired > mode_lib->vba.NumberOfDSC) { > - mode_lib->vba.NotEnoughDSCUnits[i] = true; > - } > - } > - /*DSC Delay per state*/ > - > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.BlendingAndTiming[k] != k) { > - mode_lib->vba.slices = 0; > - } else if (mode_lib->vba.RequiresDSC[i][k] == 0 > - || mode_lib->vba.RequiresDSC[i][k] == false) { > - mode_lib->vba.slices = 0; > - } else if (mode_lib->vba.PixelClockBackEnd[k] > 3200.0) { > - mode_lib->vba.slices = dml_ceil( > - mode_lib->vba.PixelClockBackEnd[k] / 400.0, > - 4.0); > - } else if (mode_lib->vba.PixelClockBackEnd[k] > 1360.0) { > - mode_lib->vba.slices = 8.0; > - } else if (mode_lib->vba.PixelClockBackEnd[k] > 680.0) { > - mode_lib->vba.slices = 4.0; > - } else if (mode_lib->vba.PixelClockBackEnd[k] > 340.0) { > - mode_lib->vba.slices = 2.0; > - } else { > - mode_lib->vba.slices = 1.0; > - } > - if (mode_lib->vba.OutputBppPerState[i][k] == BPP_BLENDED_PIPE > - || mode_lib->vba.OutputBppPerState[i][k] == BPP_INVALID) { > - mode_lib->vba.bpp = 0.0; > - } else { > - mode_lib->vba.bpp = mode_lib->vba.OutputBppPerState[i][k]; > - } > - if (mode_lib->vba.RequiresDSC[i][k] == true && mode_lib->vba.bpp != 0.0) { > - if (mode_lib->vba.ODMCombineEnablePerState[i][k] == false) { > - mode_lib->vba.DSCDelayPerState[i][k] = > - dscceComputeDelay( > - mode_lib->vba.DSCInputBitPerComponent[k], > - mode_lib->vba.bpp, > - dml_ceil( > - mode_lib->vba.HActive[k] > - / mode_lib->vba.slices, > - 1.0), > - mode_lib->vba.slices, > - mode_lib->vba.OutputFormat[k]) > - + dscComputeDelay( > - mode_lib->vba.OutputFormat[k]); > - } else { > - mode_lib->vba.DSCDelayPerState[i][k] = > - 2.0 > - * (dscceComputeDelay( > - mode_lib->vba.DSCInputBitPerComponent[k], > - mode_lib->vba.bpp, > - dml_ceil( > - mode_lib->vba.HActive[k] > - / mode_lib->vba.slices, > - 1.0), > - mode_lib->vba.slices > - / 2, > - mode_lib->vba.OutputFormat[k]) > - + dscComputeDelay( > - mode_lib->vba.OutputFormat[k])); > - } > - mode_lib->vba.DSCDelayPerState[i][k] = > - mode_lib->vba.DSCDelayPerState[i][k] > - * mode_lib->vba.PixelClock[k] > - / mode_lib->vba.PixelClockBackEnd[k]; > - } else { > - mode_lib->vba.DSCDelayPerState[i][k] = 0.0; > - } > - } > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - for (j = 0; j <= mode_lib->vba.NumberOfActivePlanes - 1; j++) { > - if (mode_lib->vba.BlendingAndTiming[k] == j > - && mode_lib->vba.RequiresDSC[i][j] == true) { > - mode_lib->vba.DSCDelayPerState[i][k] = > - mode_lib->vba.DSCDelayPerState[i][j]; > - } > - } > - } > - } > - /*Urgent Latency Support Check*/ > - > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - if (mode_lib->vba.ODMCombineEnablePerState[i][k] == true) { > - mode_lib->vba.SwathWidthYPerState[i][k] = > - dml_min( > - mode_lib->vba.SwathWidthYSingleDPP[k], > - dml_round( > - mode_lib->vba.HActive[k] > - / 2.0 > - * mode_lib->vba.HRatio[k])); > - } else { > - mode_lib->vba.SwathWidthYPerState[i][k] = > - mode_lib->vba.SwathWidthYSingleDPP[k] > - / mode_lib->vba.NoOfDPP[i][k]; > - } > - mode_lib->vba.SwathWidthGranularityY = 256.0 > - / dml_ceil(mode_lib->vba.BytePerPixelInDETY[k], 1.0) > - / mode_lib->vba.MaxSwathHeightY[k]; > - mode_lib->vba.RoundedUpMaxSwathSizeBytesY = (dml_ceil( > - mode_lib->vba.SwathWidthYPerState[i][k] - 1.0, > - mode_lib->vba.SwathWidthGranularityY) > - + mode_lib->vba.SwathWidthGranularityY) > - * mode_lib->vba.BytePerPixelInDETY[k] > - * mode_lib->vba.MaxSwathHeightY[k]; > - if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10) { > - mode_lib->vba.RoundedUpMaxSwathSizeBytesY = dml_ceil( > - mode_lib->vba.RoundedUpMaxSwathSizeBytesY, > - 256.0) + 256; > - } > - if (mode_lib->vba.MaxSwathHeightC[k] > 0.0) { > - mode_lib->vba.SwathWidthGranularityC = 256.0 > - / dml_ceil(mode_lib->vba.BytePerPixelInDETC[k], 2.0) > - / mode_lib->vba.MaxSwathHeightC[k]; > - mode_lib->vba.RoundedUpMaxSwathSizeBytesC = (dml_ceil( > - mode_lib->vba.SwathWidthYPerState[i][k] / 2.0 - 1.0, > - mode_lib->vba.SwathWidthGranularityC) > - + mode_lib->vba.SwathWidthGranularityC) > - * mode_lib->vba.BytePerPixelInDETC[k] > - * mode_lib->vba.MaxSwathHeightC[k]; > - if (mode_lib->vba.SourcePixelFormat[k] == dm_420_10) { > - mode_lib->vba.RoundedUpMaxSwathSizeBytesC = dml_ceil( > - mode_lib->vba.RoundedUpMaxSwathSizeBytesC, > - 256.0) + 256; > - } > - } else { > - mode_lib->vba.RoundedUpMaxSwathSizeBytesC = 0.0; > - } > - if (mode_lib->vba.RoundedUpMaxSwathSizeBytesY > - + mode_lib->vba.RoundedUpMaxSwathSizeBytesC > - <= mode_lib->vba.DETBufferSizeInKByte * 1024.0 / 2.0) { > - mode_lib->vba.SwathHeightYPerState[i][k] = > - mode_lib->vba.MaxSwathHeightY[k]; > - mode_lib->vba.SwathHeightCPerState[i][k] = > - mode_lib->vba.MaxSwathHeightC[k]; > - } else { > - mode_lib->vba.SwathHeightYPerState[i][k] = > - mode_lib->vba.MinSwathHeightY[k]; > - mode_lib->vba.SwathHeightCPerState[i][k] = > - mode_lib->vba.MinSwathHeightC[k]; > - } > - if (mode_lib->vba.BytePerPixelInDETC[k] == 0.0) { > - mode_lib->vba.LinesInDETLuma = mode_lib->vba.DETBufferSizeInKByte > - * 1024.0 / mode_lib->vba.BytePerPixelInDETY[k] > - / mode_lib->vba.SwathWidthYPerState[i][k]; > - mode_lib->vba.LinesInDETChroma = 0.0; > - } else if (mode_lib->vba.SwathHeightYPerState[i][k] > - <= mode_lib->vba.SwathHeightCPerState[i][k]) { > - mode_lib->vba.LinesInDETLuma = mode_lib->vba.DETBufferSizeInKByte > - * 1024.0 / 2.0 / mode_lib->vba.BytePerPixelInDETY[k] > - / mode_lib->vba.SwathWidthYPerState[i][k]; > - mode_lib->vba.LinesInDETChroma = mode_lib->vba.DETBufferSizeInKByte > - * 1024.0 / 2.0 / mode_lib->vba.BytePerPixelInDETC[k] > - / (mode_lib->vba.SwathWidthYPerState[i][k] / 2.0); > - } else { > - mode_lib->vba.LinesInDETLuma = mode_lib->vba.DETBufferSizeInKByte > - * 1024.0 * 2.0 / 3.0 > - / mode_lib->vba.BytePerPixelInDETY[k] > - / mode_lib->vba.SwathWidthYPerState[i][k]; > - mode_lib->vba.LinesInDETChroma = mode_lib->vba.DETBufferSizeInKByte > - * 1024.0 / 3.0 / mode_lib->vba.BytePerPixelInDETY[k] > - / (mode_lib->vba.SwathWidthYPerState[i][k] / 2.0); > - } > - mode_lib->vba.EffectiveLBLatencyHidingSourceLinesLuma = > - dml_min( > - mode_lib->vba.MaxLineBufferLines, > - dml_floor( > - mode_lib->vba.LineBufferSize > - / mode_lib->vba.LBBitPerPixel[k] > - / (mode_lib->vba.SwathWidthYPerState[i][k] > - / dml_max( > - mode_lib->vba.HRatio[k], > - 1.0)), > - 1.0)) > - - (mode_lib->vba.vtaps[k] - 1.0); > - mode_lib->vba.EffectiveLBLatencyHidingSourceLinesChroma = > - dml_min( > - mode_lib->vba.MaxLineBufferLines, > - dml_floor( > - mode_lib->vba.LineBufferSize > - / mode_lib->vba.LBBitPerPixel[k] > - / (mode_lib->vba.SwathWidthYPerState[i][k] > - / 2.0 > - / dml_max( > - mode_lib->vba.HRatio[k] > - / 2.0, > - 1.0)), > - 1.0)) > - - (mode_lib->vba.VTAPsChroma[k] - 1.0); > - mode_lib->vba.EffectiveDETLBLinesLuma = > - dml_floor( > - mode_lib->vba.LinesInDETLuma > - + dml_min( > - mode_lib->vba.LinesInDETLuma > - * mode_lib->vba.RequiredDISPCLK[i] > - * mode_lib->vba.BytePerPixelInDETY[k] > - * mode_lib->vba.PSCL_FACTOR[k] > - / mode_lib->vba.ReturnBWPerState[i], > - mode_lib->vba.EffectiveLBLatencyHidingSourceLinesLuma), > - mode_lib->vba.SwathHeightYPerState[i][k]); > - mode_lib->vba.EffectiveDETLBLinesChroma = > - dml_floor( > - mode_lib->vba.LinesInDETChroma > - + dml_min( > - mode_lib->vba.LinesInDETChroma > - * mode_lib->vba.RequiredDISPCLK[i] > - * mode_lib->vba.BytePerPixelInDETC[k] > - * mode_lib->vba.PSCL_FACTOR_CHROMA[k] > - / mode_lib->vba.ReturnBWPerState[i], > - mode_lib->vba.EffectiveLBLatencyHidingSourceLinesChroma), > - mode_lib->vba.SwathHeightCPerState[i][k]); > - if (mode_lib->vba.BytePerPixelInDETC[k] == 0.0) { > - mode_lib->vba.UrgentLatencySupportUsPerState[i][k] = > - mode_lib->vba.EffectiveDETLBLinesLuma > - * (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]) > - / mode_lib->vba.VRatio[k] > - - mode_lib->vba.EffectiveDETLBLinesLuma > - * mode_lib->vba.SwathWidthYPerState[i][k] > - * dml_ceil( > - mode_lib->vba.BytePerPixelInDETY[k], > - 1.0) > - / (mode_lib->vba.ReturnBWPerState[i] > - / mode_lib->vba.NoOfDPP[i][k]); > - } else { > - mode_lib->vba.UrgentLatencySupportUsPerState[i][k] = > - dml_min( > - mode_lib->vba.EffectiveDETLBLinesLuma > - * (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]) > - / mode_lib->vba.VRatio[k] > - - mode_lib->vba.EffectiveDETLBLinesLuma > - * mode_lib->vba.SwathWidthYPerState[i][k] > - * dml_ceil( > - mode_lib->vba.BytePerPixelInDETY[k], > - 1.0) > - / (mode_lib->vba.ReturnBWPerState[i] > - / mode_lib->vba.NoOfDPP[i][k]), > - mode_lib->vba.EffectiveDETLBLinesChroma > - * (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]) > - / (mode_lib->vba.VRatio[k] > - / 2.0) > - - mode_lib->vba.EffectiveDETLBLinesChroma > - * mode_lib->vba.SwathWidthYPerState[i][k] > - / 2.0 > - * dml_ceil( > - mode_lib->vba.BytePerPixelInDETC[k], > - 2.0) > - / (mode_lib->vba.ReturnBWPerState[i] > - / mode_lib->vba.NoOfDPP[i][k])); > - } > - } > - } > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - mode_lib->vba.UrgentLatencySupport[i] = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.UrgentLatencySupportUsPerState[i][k] > - < mode_lib->vba.UrgentLatency / 1.0) { > - mode_lib->vba.UrgentLatencySupport[i] = false; > - } > - } > - } > - /*Prefetch Check*/ > - > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - mode_lib->vba.TotalNumberOfDCCActiveDPP[i] = 0.0; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.DCCEnable[k] == true) { > - mode_lib->vba.TotalNumberOfDCCActiveDPP[i] = > - mode_lib->vba.TotalNumberOfDCCActiveDPP[i] > - + mode_lib->vba.NoOfDPP[i][k]; > - } > - } > - } > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - mode_lib->vba.ProjectedDCFCLKDeepSleep = 8.0; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.ProjectedDCFCLKDeepSleep = dml_max( > - mode_lib->vba.ProjectedDCFCLKDeepSleep, > - mode_lib->vba.PixelClock[k] / 16.0); > - if (mode_lib->vba.BytePerPixelInDETC[k] == 0.0) { > - if (mode_lib->vba.VRatio[k] <= 1.0) { > - mode_lib->vba.ProjectedDCFCLKDeepSleep = > - dml_max( > - mode_lib->vba.ProjectedDCFCLKDeepSleep, > - 1.1 > - * dml_ceil( > - mode_lib->vba.BytePerPixelInDETY[k], > - 1.0) > - / 64.0 > - * mode_lib->vba.HRatio[k] > - * mode_lib->vba.PixelClock[k] > - / mode_lib->vba.NoOfDPP[i][k]); > - } else { > - mode_lib->vba.ProjectedDCFCLKDeepSleep = > - dml_max( > - mode_lib->vba.ProjectedDCFCLKDeepSleep, > - 1.1 > - * dml_ceil( > - mode_lib->vba.BytePerPixelInDETY[k], > - 1.0) > - / 64.0 > - * mode_lib->vba.PSCL_FACTOR[k] > - * mode_lib->vba.RequiredDPPCLK[i][k]); > - } > - } else { > - if (mode_lib->vba.VRatio[k] <= 1.0) { > - mode_lib->vba.ProjectedDCFCLKDeepSleep = > - dml_max( > - mode_lib->vba.ProjectedDCFCLKDeepSleep, > - 1.1 > - * dml_ceil( > - mode_lib->vba.BytePerPixelInDETY[k], > - 1.0) > - / 32.0 > - * mode_lib->vba.HRatio[k] > - * mode_lib->vba.PixelClock[k] > - / mode_lib->vba.NoOfDPP[i][k]); > - } else { > - mode_lib->vba.ProjectedDCFCLKDeepSleep = > - dml_max( > - mode_lib->vba.ProjectedDCFCLKDeepSleep, > - 1.1 > - * dml_ceil( > - mode_lib->vba.BytePerPixelInDETY[k], > - 1.0) > - / 32.0 > - * mode_lib->vba.PSCL_FACTOR[k] > - * mode_lib->vba.RequiredDPPCLK[i][k]); > - } > - if (mode_lib->vba.VRatio[k] / 2.0 <= 1.0) { > - mode_lib->vba.ProjectedDCFCLKDeepSleep = > - dml_max( > - mode_lib->vba.ProjectedDCFCLKDeepSleep, > - 1.1 > - * dml_ceil( > - mode_lib->vba.BytePerPixelInDETC[k], > - 2.0) > - / 32.0 > - * mode_lib->vba.HRatio[k] > - / 2.0 > - * mode_lib->vba.PixelClock[k] > - / mode_lib->vba.NoOfDPP[i][k]); > - } else { > - mode_lib->vba.ProjectedDCFCLKDeepSleep = > - dml_max( > - mode_lib->vba.ProjectedDCFCLKDeepSleep, > - 1.1 > - * dml_ceil( > - mode_lib->vba.BytePerPixelInDETC[k], > - 2.0) > - / 32.0 > - * mode_lib->vba.PSCL_FACTOR_CHROMA[k] > - * mode_lib->vba.RequiredDPPCLK[i][k]); > - } > - } > - } > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.PDEAndMetaPTEBytesPerFrameY = CalculateVMAndRowBytes( > - mode_lib, > - mode_lib->vba.DCCEnable[k], > - mode_lib->vba.Read256BlockHeightY[k], > - mode_lib->vba.Read256BlockWidthY[k], > - mode_lib->vba.SourcePixelFormat[k], > - mode_lib->vba.SurfaceTiling[k], > - dml_ceil(mode_lib->vba.BytePerPixelInDETY[k], 1.0), > - mode_lib->vba.SourceScan[k], > - mode_lib->vba.ViewportWidth[k], > - mode_lib->vba.ViewportHeight[k], > - mode_lib->vba.SwathWidthYPerState[i][k], > - mode_lib->vba.VirtualMemoryEnable, > - mode_lib->vba.VMMPageSize, > - mode_lib->vba.PTEBufferSizeInRequests, > - mode_lib->vba.PDEProcessingBufIn64KBReqs, > - mode_lib->vba.PitchY[k], > - mode_lib->vba.DCCMetaPitchY[k], > - &mode_lib->vba.MacroTileWidthY[k], > - &mode_lib->vba.MetaRowBytesY, > - &mode_lib->vba.DPTEBytesPerRowY, > - &mode_lib->vba.PTEBufferSizeNotExceededY[i][k], > - &mode_lib->vba.dpte_row_height[k], > - &mode_lib->vba.meta_row_height[k]); > - mode_lib->vba.PrefetchLinesY[k] = CalculatePrefetchSourceLines( > - mode_lib, > - mode_lib->vba.VRatio[k], > - mode_lib->vba.vtaps[k], > - mode_lib->vba.Interlace[k], > - mode_lib->vba.ProgressiveToInterlaceUnitInOPP, > - mode_lib->vba.SwathHeightYPerState[i][k], > - mode_lib->vba.ViewportYStartY[k], > - &mode_lib->vba.PrefillY[k], > - &mode_lib->vba.MaxNumSwY[k]); > - if ((mode_lib->vba.SourcePixelFormat[k] != dm_444_64 > - && mode_lib->vba.SourcePixelFormat[k] != dm_444_32 > - && mode_lib->vba.SourcePixelFormat[k] != dm_444_16 > - && mode_lib->vba.SourcePixelFormat[k] != dm_mono_16 > - && mode_lib->vba.SourcePixelFormat[k] != dm_mono_8)) { > - mode_lib->vba.PDEAndMetaPTEBytesPerFrameC = CalculateVMAndRowBytes( > - mode_lib, > - mode_lib->vba.DCCEnable[k], > - mode_lib->vba.Read256BlockHeightY[k], > - mode_lib->vba.Read256BlockWidthY[k], > - mode_lib->vba.SourcePixelFormat[k], > - mode_lib->vba.SurfaceTiling[k], > - dml_ceil(mode_lib->vba.BytePerPixelInDETC[k], 2.0), > - mode_lib->vba.SourceScan[k], > - mode_lib->vba.ViewportWidth[k] / 2.0, > - mode_lib->vba.ViewportHeight[k] / 2.0, > - mode_lib->vba.SwathWidthYPerState[i][k] / 2.0, > - mode_lib->vba.VirtualMemoryEnable, > - mode_lib->vba.VMMPageSize, > - mode_lib->vba.PTEBufferSizeInRequests, > - mode_lib->vba.PDEProcessingBufIn64KBReqs, > - mode_lib->vba.PitchC[k], > - 0.0, > - &mode_lib->vba.MacroTileWidthC[k], > - &mode_lib->vba.MetaRowBytesC, > - &mode_lib->vba.DPTEBytesPerRowC, > - &mode_lib->vba.PTEBufferSizeNotExceededC[i][k], > - &mode_lib->vba.dpte_row_height_chroma[k], > - &mode_lib->vba.meta_row_height_chroma[k]); > - mode_lib->vba.PrefetchLinesC[k] = CalculatePrefetchSourceLines( > - mode_lib, > - mode_lib->vba.VRatio[k] / 2.0, > - mode_lib->vba.VTAPsChroma[k], > - mode_lib->vba.Interlace[k], > - mode_lib->vba.ProgressiveToInterlaceUnitInOPP, > - mode_lib->vba.SwathHeightCPerState[i][k], > - mode_lib->vba.ViewportYStartC[k], > - &mode_lib->vba.PrefillC[k], > - &mode_lib->vba.MaxNumSwC[k]); > - } else { > - mode_lib->vba.PDEAndMetaPTEBytesPerFrameC = 0.0; > - mode_lib->vba.MetaRowBytesC = 0.0; > - mode_lib->vba.DPTEBytesPerRowC = 0.0; > - mode_lib->vba.PrefetchLinesC[k] = 0.0; > - mode_lib->vba.PTEBufferSizeNotExceededC[i][k] = true; > - } > - mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k] = > - mode_lib->vba.PDEAndMetaPTEBytesPerFrameY > - + mode_lib->vba.PDEAndMetaPTEBytesPerFrameC; > - mode_lib->vba.MetaRowBytes[k] = mode_lib->vba.MetaRowBytesY > - + mode_lib->vba.MetaRowBytesC; > - mode_lib->vba.DPTEBytesPerRow[k] = mode_lib->vba.DPTEBytesPerRowY > - + mode_lib->vba.DPTEBytesPerRowC; > - } > - mode_lib->vba.ExtraLatency = > - mode_lib->vba.UrgentRoundTripAndOutOfOrderLatencyPerState[i] > - + (mode_lib->vba.TotalNumberOfActiveDPP[i] > - * mode_lib->vba.PixelChunkSizeInKByte > - + mode_lib->vba.TotalNumberOfDCCActiveDPP[i] > - * mode_lib->vba.MetaChunkSize) > - * 1024.0 > - / mode_lib->vba.ReturnBWPerState[i]; > - if (mode_lib->vba.VirtualMemoryEnable == true) { > - mode_lib->vba.ExtraLatency = mode_lib->vba.ExtraLatency > - + mode_lib->vba.TotalNumberOfActiveDPP[i] > - * mode_lib->vba.PTEChunkSize * 1024.0 > - / mode_lib->vba.ReturnBWPerState[i]; > - } > - mode_lib->vba.TimeCalc = 24.0 / mode_lib->vba.ProjectedDCFCLKDeepSleep; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.BlendingAndTiming[k] == k) { > - if (mode_lib->vba.WritebackEnable[k] == true) { > - mode_lib->vba.WritebackDelay[i][k] = > - mode_lib->vba.WritebackLatency > - + CalculateWriteBackDelay( > - mode_lib->vba.WritebackPixelFormat[k], > - mode_lib->vba.WritebackHRatio[k], > - mode_lib->vba.WritebackVRatio[k], > - mode_lib->vba.WritebackLumaHTaps[k], > - mode_lib->vba.WritebackLumaVTaps[k], > - mode_lib->vba.WritebackChromaHTaps[k], > - mode_lib->vba.WritebackChromaVTaps[k], > - mode_lib->vba.WritebackDestinationWidth[k]) > - / mode_lib->vba.RequiredDISPCLK[i]; > - } else { > - mode_lib->vba.WritebackDelay[i][k] = 0.0; > - } > - for (j = 0; j <= mode_lib->vba.NumberOfActivePlanes - 1; j++) { > - if (mode_lib->vba.BlendingAndTiming[j] == k > - && mode_lib->vba.WritebackEnable[j] > - == true) { > - mode_lib->vba.WritebackDelay[i][k] = > - dml_max( > - mode_lib->vba.WritebackDelay[i][k], > - mode_lib->vba.WritebackLatency > - + CalculateWriteBackDelay( > - mode_lib->vba.WritebackPixelFormat[j], > - mode_lib->vba.WritebackHRatio[j], > - mode_lib->vba.WritebackVRatio[j], > - mode_lib->vba.WritebackLumaHTaps[j], > - mode_lib->vba.WritebackLumaVTaps[j], > - mode_lib->vba.WritebackChromaHTaps[j], > - mode_lib->vba.WritebackChromaVTaps[j], > - mode_lib->vba.WritebackDestinationWidth[j]) > - / mode_lib->vba.RequiredDISPCLK[i]); > - } > - } > - } > - } > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - for (j = 0; j <= mode_lib->vba.NumberOfActivePlanes - 1; j++) { > - if (mode_lib->vba.BlendingAndTiming[k] == j) { > - mode_lib->vba.WritebackDelay[i][k] = > - mode_lib->vba.WritebackDelay[i][j]; > - } > - } > - } > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.MaximumVStartup[k] = > - mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k] > - - dml_max( > - 1.0, > - dml_ceil( > - mode_lib->vba.WritebackDelay[i][k] > - / (mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]), > - 1.0)); > - } > - mode_lib->vba.TWait = CalculateTWait( > - mode_lib->vba.PrefetchMode, > - mode_lib->vba.DRAMClockChangeLatency, > - mode_lib->vba.UrgentLatency, > - mode_lib->vba.SREnterPlusExitTime); > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.XFCEnabled[k] == true) { > - mode_lib->vba.XFCRemoteSurfaceFlipDelay = > - CalculateRemoteSurfaceFlipDelay( > - mode_lib, > - mode_lib->vba.VRatio[k], > - mode_lib->vba.SwathWidthYPerState[i][k], > - dml_ceil( > - mode_lib->vba.BytePerPixelInDETY[k], > - 1.0), > - mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k], > - mode_lib->vba.XFCTSlvVupdateOffset, > - mode_lib->vba.XFCTSlvVupdateWidth, > - mode_lib->vba.XFCTSlvVreadyOffset, > - mode_lib->vba.XFCXBUFLatencyTolerance, > - mode_lib->vba.XFCFillBWOverhead, > - mode_lib->vba.XFCSlvChunkSize, > - mode_lib->vba.XFCBusTransportTime, > - mode_lib->vba.TimeCalc, > - mode_lib->vba.TWait, > - &mode_lib->vba.SrcActiveDrainRate, > - &mode_lib->vba.TInitXFill, > - &mode_lib->vba.TslvChk); > - } else { > - mode_lib->vba.XFCRemoteSurfaceFlipDelay = 0.0; > - } > - mode_lib->vba.IsErrorResult[i][k] = > - CalculatePrefetchSchedule( > - mode_lib, > - mode_lib->vba.RequiredDPPCLK[i][k], > - mode_lib->vba.RequiredDISPCLK[i], > - mode_lib->vba.PixelClock[k], > - mode_lib->vba.ProjectedDCFCLKDeepSleep, > - mode_lib->vba.DSCDelayPerState[i][k], > - mode_lib->vba.NoOfDPP[i][k], > - mode_lib->vba.ScalerEnabled[k], > - mode_lib->vba.NumberOfCursors[k], > - mode_lib->vba.DPPCLKDelaySubtotal, > - mode_lib->vba.DPPCLKDelaySCL, > - mode_lib->vba.DPPCLKDelaySCLLBOnly, > - mode_lib->vba.DPPCLKDelayCNVCFormater, > - mode_lib->vba.DPPCLKDelayCNVCCursor, > - mode_lib->vba.DISPCLKDelaySubtotal, > - mode_lib->vba.SwathWidthYPerState[i][k] > - / mode_lib->vba.HRatio[k], > - mode_lib->vba.OutputFormat[k], > - mode_lib->vba.VTotal[k] > - - mode_lib->vba.VActive[k], > - mode_lib->vba.HTotal[k], > - mode_lib->vba.MaxInterDCNTileRepeaters, > - mode_lib->vba.MaximumVStartup[k], > - mode_lib->vba.MaxPageTableLevels, > - mode_lib->vba.VirtualMemoryEnable, > - mode_lib->vba.DynamicMetadataEnable[k], > - mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired[k], > - mode_lib->vba.DynamicMetadataTransmittedBytes[k], > - mode_lib->vba.DCCEnable[k], > - mode_lib->vba.UrgentLatency, > - mode_lib->vba.ExtraLatency, > - mode_lib->vba.TimeCalc, > - mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k], > - mode_lib->vba.MetaRowBytes[k], > - mode_lib->vba.DPTEBytesPerRow[k], > - mode_lib->vba.PrefetchLinesY[k], > - mode_lib->vba.SwathWidthYPerState[i][k], > - mode_lib->vba.BytePerPixelInDETY[k], > - mode_lib->vba.PrefillY[k], > - mode_lib->vba.MaxNumSwY[k], > - mode_lib->vba.PrefetchLinesC[k], > - mode_lib->vba.BytePerPixelInDETC[k], > - mode_lib->vba.PrefillC[k], > - mode_lib->vba.MaxNumSwC[k], > - mode_lib->vba.SwathHeightYPerState[i][k], > - mode_lib->vba.SwathHeightCPerState[i][k], > - mode_lib->vba.TWait, > - mode_lib->vba.XFCEnabled[k], > - mode_lib->vba.XFCRemoteSurfaceFlipDelay, > - mode_lib->vba.Interlace[k], > - mode_lib->vba.ProgressiveToInterlaceUnitInOPP, > - mode_lib->vba.DSTXAfterScaler, > - mode_lib->vba.DSTYAfterScaler, > - &mode_lib->vba.LineTimesForPrefetch[k], > - &mode_lib->vba.PrefetchBW[k], > - &mode_lib->vba.LinesForMetaPTE[k], > - &mode_lib->vba.LinesForMetaAndDPTERow[k], > - &mode_lib->vba.VRatioPreY[i][k], > - &mode_lib->vba.VRatioPreC[i][k], > - &mode_lib->vba.RequiredPrefetchPixelDataBW[i][k], > - &mode_lib->vba.VStartupRequiredWhenNotEnoughTimeForDynamicMetadata, > - &mode_lib->vba.Tno_bw[k], > - &mode_lib->vba.VUpdateOffsetPix[k], > - &mode_lib->vba.VUpdateWidthPix[k], > - &mode_lib->vba.VReadyOffsetPix[k]); > - } > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.cursor_bw[k] = mode_lib->vba.NumberOfCursors[k] > - * mode_lib->vba.CursorWidth[k][0] > - * mode_lib->vba.CursorBPP[k][0] / 8.0 > - / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) > - * mode_lib->vba.VRatio[k]; > - } > - mode_lib->vba.MaximumReadBandwidthWithPrefetch = 0.0; > - mode_lib->vba.prefetch_vm_bw_valid = true; > - mode_lib->vba.prefetch_row_bw_valid = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k] == 0.0) { > - mode_lib->vba.prefetch_vm_bw[k] = 0.0; > - } else if (mode_lib->vba.LinesForMetaPTE[k] > 0.0) { > - mode_lib->vba.prefetch_vm_bw[k] = > - mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k] > - / (mode_lib->vba.LinesForMetaPTE[k] > - * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]); > - } else { > - mode_lib->vba.prefetch_vm_bw[k] = 0.0; > - mode_lib->vba.prefetch_vm_bw_valid = false; > - } > - if (mode_lib->vba.MetaRowBytes[k] + mode_lib->vba.DPTEBytesPerRow[k] > - == 0.0) { > - mode_lib->vba.prefetch_row_bw[k] = 0.0; > - } else if (mode_lib->vba.LinesForMetaAndDPTERow[k] > 0.0) { > - mode_lib->vba.prefetch_row_bw[k] = (mode_lib->vba.MetaRowBytes[k] > - + mode_lib->vba.DPTEBytesPerRow[k]) > - / (mode_lib->vba.LinesForMetaAndDPTERow[k] > - * mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k]); > - } else { > - mode_lib->vba.prefetch_row_bw[k] = 0.0; > - mode_lib->vba.prefetch_row_bw_valid = false; > - } > - mode_lib->vba.MaximumReadBandwidthWithPrefetch = > - mode_lib->vba.MaximumReadBandwidthWithPrefetch > - + mode_lib->vba.cursor_bw[k] > - + dml_max4( > - mode_lib->vba.prefetch_vm_bw[k], > - mode_lib->vba.prefetch_row_bw[k], > - mode_lib->vba.ReadBandwidth[k], > - mode_lib->vba.RequiredPrefetchPixelDataBW[i][k]); > - } > - mode_lib->vba.PrefetchSupported[i] = true; > - if (mode_lib->vba.MaximumReadBandwidthWithPrefetch > - > mode_lib->vba.ReturnBWPerState[i] > - || mode_lib->vba.prefetch_vm_bw_valid == false > - || mode_lib->vba.prefetch_row_bw_valid == false) { > - mode_lib->vba.PrefetchSupported[i] = false; > - } > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.LineTimesForPrefetch[k] < 2.0 > - || mode_lib->vba.LinesForMetaPTE[k] >= 8.0 > - || mode_lib->vba.LinesForMetaAndDPTERow[k] >= 16.0 > - || mode_lib->vba.IsErrorResult[i][k] == true) { > - mode_lib->vba.PrefetchSupported[i] = false; > - } > - } > - mode_lib->vba.VRatioInPrefetchSupported[i] = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.VRatioPreY[i][k] > 4.0 > - || mode_lib->vba.VRatioPreC[i][k] > 4.0 > - || mode_lib->vba.IsErrorResult[i][k] == true) { > - mode_lib->vba.VRatioInPrefetchSupported[i] = false; > - } > - } > - if (mode_lib->vba.PrefetchSupported[i] == true > - && mode_lib->vba.VRatioInPrefetchSupported[i] == true) { > - mode_lib->vba.BandwidthAvailableForImmediateFlip = > - mode_lib->vba.ReturnBWPerState[i]; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.BandwidthAvailableForImmediateFlip = > - mode_lib->vba.BandwidthAvailableForImmediateFlip > - - mode_lib->vba.cursor_bw[k] > - - dml_max( > - mode_lib->vba.ReadBandwidth[k], > - mode_lib->vba.PrefetchBW[k]); > - } > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.ImmediateFlipBytes[k] = 0.0; > - if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8 > - && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) { > - mode_lib->vba.ImmediateFlipBytes[k] = > - mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k] > - + mode_lib->vba.MetaRowBytes[k] > - + mode_lib->vba.DPTEBytesPerRow[k]; > - } > - } > - mode_lib->vba.TotImmediateFlipBytes = 0.0; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if ((mode_lib->vba.SourcePixelFormat[k] != dm_420_8 > - && mode_lib->vba.SourcePixelFormat[k] != dm_420_10)) { > - mode_lib->vba.TotImmediateFlipBytes = > - mode_lib->vba.TotImmediateFlipBytes > - + mode_lib->vba.ImmediateFlipBytes[k]; > - } > - } > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - CalculateFlipSchedule( > - mode_lib, > - mode_lib->vba.ExtraLatency, > - mode_lib->vba.UrgentLatency, > - mode_lib->vba.MaxPageTableLevels, > - mode_lib->vba.VirtualMemoryEnable, > - mode_lib->vba.BandwidthAvailableForImmediateFlip, > - mode_lib->vba.TotImmediateFlipBytes, > - mode_lib->vba.SourcePixelFormat[k], > - mode_lib->vba.ImmediateFlipBytes[k], > - mode_lib->vba.HTotal[k] > - / mode_lib->vba.PixelClock[k], > - mode_lib->vba.VRatio[k], > - mode_lib->vba.Tno_bw[k], > - mode_lib->vba.PDEAndMetaPTEBytesPerFrame[k], > - mode_lib->vba.MetaRowBytes[k], > - mode_lib->vba.DPTEBytesPerRow[k], > - mode_lib->vba.DCCEnable[k], > - mode_lib->vba.dpte_row_height[k], > - mode_lib->vba.meta_row_height[k], > - mode_lib->vba.qual_row_bw[k], > - &mode_lib->vba.DestinationLinesToRequestVMInImmediateFlip[k], > - &mode_lib->vba.DestinationLinesToRequestRowInImmediateFlip[k], > - &mode_lib->vba.final_flip_bw[k], > - &mode_lib->vba.ImmediateFlipSupportedForPipe[k]); > - } > - mode_lib->vba.total_dcn_read_bw_with_flip = 0.0; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.total_dcn_read_bw_with_flip = > - mode_lib->vba.total_dcn_read_bw_with_flip > - + mode_lib->vba.cursor_bw[k] > - + dml_max3( > - mode_lib->vba.prefetch_vm_bw[k], > - mode_lib->vba.prefetch_row_bw[k], > - mode_lib->vba.final_flip_bw[k] > - + dml_max( > - mode_lib->vba.ReadBandwidth[k], > - mode_lib->vba.RequiredPrefetchPixelDataBW[i][k])); > - } > - mode_lib->vba.ImmediateFlipSupportedForState[i] = true; > - if (mode_lib->vba.total_dcn_read_bw_with_flip > - > mode_lib->vba.ReturnBWPerState[i]) { > - mode_lib->vba.ImmediateFlipSupportedForState[i] = false; > - } > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.ImmediateFlipSupportedForPipe[k] == false) { > - mode_lib->vba.ImmediateFlipSupportedForState[i] = false; > - } > - } > - } else { > - mode_lib->vba.ImmediateFlipSupportedForState[i] = false; > - } > - } > - /*PTE Buffer Size Check*/ > - > - for (i = 0; i <= DC__VOLTAGE_STATES; i++) { > - mode_lib->vba.PTEBufferSizeNotExceeded[i] = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.PTEBufferSizeNotExceededY[i][k] == false > - || mode_lib->vba.PTEBufferSizeNotExceededC[i][k] == false) { > - mode_lib->vba.PTEBufferSizeNotExceeded[i] = false; > - } > - } > - } > - /*Cursor Support Check*/ > - > - mode_lib->vba.CursorSupport = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.CursorWidth[k][0] > 0.0) { > - if (dml_floor( > - dml_floor( > - mode_lib->vba.CursorBufferSize > - - mode_lib->vba.CursorChunkSize, > - mode_lib->vba.CursorChunkSize) * 1024.0 > - / (mode_lib->vba.CursorWidth[k][0] > - * mode_lib->vba.CursorBPP[k][0] > - / 8.0), > - 1.0) > - * (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) > - / mode_lib->vba.VRatio[k] < mode_lib->vba.UrgentLatency > - || (mode_lib->vba.CursorBPP[k][0] == 64.0 > - && mode_lib->vba.Cursor64BppSupport == false)) { > - mode_lib->vba.CursorSupport = false; > - } > - } > - } > - /*Valid Pitch Check*/ > - > - mode_lib->vba.PitchSupport = true; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.AlignedYPitch[k] = dml_ceil( > - dml_max(mode_lib->vba.PitchY[k], mode_lib->vba.ViewportWidth[k]), > - mode_lib->vba.MacroTileWidthY[k]); > - if (mode_lib->vba.AlignedYPitch[k] > mode_lib->vba.PitchY[k]) { > - mode_lib->vba.PitchSupport = false; > - } > - if (mode_lib->vba.DCCEnable[k] == true) { > - mode_lib->vba.AlignedDCCMetaPitch[k] = dml_ceil( > - dml_max( > - mode_lib->vba.DCCMetaPitchY[k], > - mode_lib->vba.ViewportWidth[k]), > - 64.0 * mode_lib->vba.Read256BlockWidthY[k]); > - } else { > - mode_lib->vba.AlignedDCCMetaPitch[k] = mode_lib->vba.DCCMetaPitchY[k]; > - } > - if (mode_lib->vba.AlignedDCCMetaPitch[k] > mode_lib->vba.DCCMetaPitchY[k]) { > - mode_lib->vba.PitchSupport = false; > - } > - if (mode_lib->vba.SourcePixelFormat[k] != dm_444_64 > - && mode_lib->vba.SourcePixelFormat[k] != dm_444_32 > - && mode_lib->vba.SourcePixelFormat[k] != dm_444_16 > - && mode_lib->vba.SourcePixelFormat[k] != dm_mono_16 > - && mode_lib->vba.SourcePixelFormat[k] != dm_mono_8) { > - mode_lib->vba.AlignedCPitch[k] = dml_ceil( > - dml_max( > - mode_lib->vba.PitchC[k], > - mode_lib->vba.ViewportWidth[k] / 2.0), > - mode_lib->vba.MacroTileWidthC[k]); > - } else { > - mode_lib->vba.AlignedCPitch[k] = mode_lib->vba.PitchC[k]; > - } > - if (mode_lib->vba.AlignedCPitch[k] > mode_lib->vba.PitchC[k]) { > - mode_lib->vba.PitchSupport = false; > - } > - } > - /*Mode Support, Voltage State and SOC Configuration*/ > - > - for (i = DC__VOLTAGE_STATES; i >= 0; i--) { > - if (mode_lib->vba.ScaleRatioAndTapsSupport == true > - && mode_lib->vba.SourceFormatPixelAndScanSupport == true > - && mode_lib->vba.ViewportSizeSupport[i] == true > - && mode_lib->vba.BandwidthSupport[i] == true > - && mode_lib->vba.DIOSupport[i] == true > - && mode_lib->vba.NotEnoughDSCUnits[i] == false > - && mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] == false > - && mode_lib->vba.UrgentLatencySupport[i] == true > - && mode_lib->vba.ROBSupport[i] == true > - && mode_lib->vba.DISPCLK_DPPCLK_Support[i] == true > - && mode_lib->vba.TotalAvailablePipesSupport[i] == true > - && mode_lib->vba.NumberOfOTGSupport == true > - && mode_lib->vba.WritebackModeSupport == true > - && mode_lib->vba.WritebackLatencySupport == true > - && mode_lib->vba.WritebackScaleRatioAndTapsSupport == true > - && mode_lib->vba.CursorSupport == true > - && mode_lib->vba.PitchSupport == true > - && mode_lib->vba.PrefetchSupported[i] == true > - && mode_lib->vba.VRatioInPrefetchSupported[i] == true > - && mode_lib->vba.PTEBufferSizeNotExceeded[i] == true > - && mode_lib->vba.NonsupportedDSCInputBPC == false) { > - mode_lib->vba.ModeSupport[i] = true; > - } else { > - mode_lib->vba.ModeSupport[i] = false; > - } > - } > - for (i = DC__VOLTAGE_STATES; i >= 0; i--) { > - if (i == DC__VOLTAGE_STATES || mode_lib->vba.ModeSupport[i] == true) { > - mode_lib->vba.VoltageLevel = i; > - } > - } > - mode_lib->vba.DCFCLK = mode_lib->vba.DCFCLKPerState[mode_lib->vba.VoltageLevel]; > - mode_lib->vba.DRAMSpeed = mode_lib->vba.DRAMSpeedPerState[mode_lib->vba.VoltageLevel]; > - mode_lib->vba.FabricClock = mode_lib->vba.FabricClockPerState[mode_lib->vba.VoltageLevel]; > - mode_lib->vba.SOCCLK = mode_lib->vba.SOCCLKPerState[mode_lib->vba.VoltageLevel]; > - mode_lib->vba.FabricAndDRAMBandwidth = > - mode_lib->vba.FabricAndDRAMBandwidthPerState[mode_lib->vba.VoltageLevel]; > - mode_lib->vba.ImmediateFlipSupport = > - mode_lib->vba.ImmediateFlipSupportedForState[mode_lib->vba.VoltageLevel]; > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - mode_lib->vba.DPPPerPlane[k] = mode_lib->vba.NoOfDPP[mode_lib->vba.VoltageLevel][k]; > - } > - for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) { > - if (mode_lib->vba.BlendingAndTiming[k] == k) { > - mode_lib->vba.ODMCombineEnabled[k] = > - mode_lib->vba.ODMCombineEnablePerState[mode_lib->vba.VoltageLevel][k]; > - } else { > - mode_lib->vba.ODMCombineEnabled[k] = 0; > - } > - mode_lib->vba.DSCEnabled[k] = > - mode_lib->vba.RequiresDSC[mode_lib->vba.VoltageLevel][k]; > - mode_lib->vba.OutputBpp[k] = > - mode_lib->vba.OutputBppPerState[mode_lib->vba.VoltageLevel][k]; > - } > -} -------------- next part -------------- An HTML attachment was scrubbed... URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20180122/c5b33392/attachment-0001.html>