brintos

brintos / linux-shallow public Read only

0
0
Text · 55.6 KiB · 85453bb Raw
1147 lines · c
1/*2 * Copyright 2017 Advanced Micro Devices, Inc.3 *4 * Permission is hereby granted, free of charge, to any person obtaining a5 * copy of this software and associated documentation files (the "Software"),6 * to deal in the Software without restriction, including without limitation7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,8 * and/or sell copies of the Software, and to permit persons to whom the9 * Software is furnished to do so, subject to the following conditions:10 *11 * The above copyright notice and this permission notice shall be included in12 * all copies or substantial portions of the Software.13 *14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR20 * OTHER DEALINGS IN THE SOFTWARE.21 *22 * Authors: AMD23 *24 */25 26 27#include "display_mode_lib.h"28#include "display_mode_vba.h"29#include "dml_inline_defs.h"30 31/*32 * NOTE:33 *   This file is gcc-parsable HW gospel, coming straight from HW engineers.34 *35 * It doesn't adhere to Linux kernel style and sometimes will do things in odd36 * ways. Unless there is something clearly wrong with it the code should37 * remain as-is as it provides us with a guarantee from HW that it is correct.38 */39 40 41static void fetch_socbb_params(struct display_mode_lib *mode_lib);42static void fetch_ip_params(struct display_mode_lib *mode_lib);43static void fetch_pipe_params(struct display_mode_lib *mode_lib);44static void recalculate_params(45		struct display_mode_lib *mode_lib,46		const display_e2e_pipe_params_st *pipes,47		unsigned int num_pipes);48 49static unsigned int CursorBppEnumToBits(enum cursor_bpp ebpp);50static void cache_debug_params(struct display_mode_lib *mode_lib);51 52unsigned int dml_get_voltage_level(53		struct display_mode_lib *mode_lib,54		const display_e2e_pipe_params_st *pipes,55		unsigned int num_pipes)56{57	bool need_recalculate = memcmp(&mode_lib->soc, &mode_lib->vba.soc, sizeof(mode_lib->vba.soc)) != 058			|| memcmp(&mode_lib->ip, &mode_lib->vba.ip, sizeof(mode_lib->vba.ip)) != 059			|| num_pipes != mode_lib->vba.cache_num_pipes60			|| memcmp(pipes, mode_lib->vba.cache_pipes,61					sizeof(display_e2e_pipe_params_st) * num_pipes) != 0;62 63	mode_lib->vba.soc = mode_lib->soc;64	mode_lib->vba.ip = mode_lib->ip;65	memcpy(mode_lib->vba.cache_pipes, pipes, sizeof(*pipes) * num_pipes);66	mode_lib->vba.cache_num_pipes = num_pipes;67 68	if (need_recalculate && pipes[0].clks_cfg.dppclk_mhz != 0)69		mode_lib->funcs.recalculate(mode_lib);70	else {71		fetch_socbb_params(mode_lib);72		fetch_ip_params(mode_lib);73		fetch_pipe_params(mode_lib);74		PixelClockAdjustmentForProgressiveToInterlaceUnit(mode_lib);75	}76	mode_lib->funcs.validate(mode_lib);77	cache_debug_params(mode_lib);78 79	return mode_lib->vba.VoltageLevel;80}81 82#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) \83{ \84	recalculate_params(mode_lib, pipes, num_pipes); \85	return var; \86}87 88dml_get_attr_func(clk_dcf_deepsleep, mode_lib->vba.DCFCLKDeepSleep);89dml_get_attr_func(wm_urgent, mode_lib->vba.UrgentWatermark);90dml_get_attr_func(wm_memory_trip, mode_lib->vba.UrgentLatency);91dml_get_attr_func(wm_writeback_urgent, mode_lib->vba.WritebackUrgentWatermark);92dml_get_attr_func(wm_stutter_exit, mode_lib->vba.StutterExitWatermark);93dml_get_attr_func(wm_stutter_enter_exit, mode_lib->vba.StutterEnterPlusExitWatermark);94dml_get_attr_func(wm_z8_stutter_exit, mode_lib->vba.Z8StutterExitWatermark);95dml_get_attr_func(wm_z8_stutter_enter_exit, mode_lib->vba.Z8StutterEnterPlusExitWatermark);96dml_get_attr_func(stutter_efficiency_z8, mode_lib->vba.Z8StutterEfficiency);97dml_get_attr_func(stutter_num_bursts_z8, mode_lib->vba.Z8NumberOfStutterBurstsPerFrame);98dml_get_attr_func(wm_dram_clock_change, mode_lib->vba.DRAMClockChangeWatermark);99dml_get_attr_func(wm_writeback_dram_clock_change, mode_lib->vba.WritebackDRAMClockChangeWatermark);100dml_get_attr_func(stutter_efficiency, mode_lib->vba.StutterEfficiency);101dml_get_attr_func(stutter_efficiency_no_vblank, mode_lib->vba.StutterEfficiencyNotIncludingVBlank);102dml_get_attr_func(stutter_period, mode_lib->vba.StutterPeriod);103dml_get_attr_func(urgent_latency, mode_lib->vba.UrgentLatency);104dml_get_attr_func(urgent_extra_latency, mode_lib->vba.UrgentExtraLatency);105dml_get_attr_func(nonurgent_latency, mode_lib->vba.NonUrgentLatencyTolerance);106dml_get_attr_func(dram_clock_change_latency, mode_lib->vba.MinActiveDRAMClockChangeLatencySupported);107dml_get_attr_func(dispclk_calculated, mode_lib->vba.DISPCLK_calculated);108dml_get_attr_func(total_data_read_bw, mode_lib->vba.TotalDataReadBandwidth);109dml_get_attr_func(return_bw, mode_lib->vba.ReturnBW);110dml_get_attr_func(tcalc, mode_lib->vba.TCalc);111dml_get_attr_func(fraction_of_urgent_bandwidth, mode_lib->vba.FractionOfUrgentBandwidth);112dml_get_attr_func(fraction_of_urgent_bandwidth_imm_flip, mode_lib->vba.FractionOfUrgentBandwidthImmediateFlip);113 114 115dml_get_attr_func(cstate_max_cap_mode, mode_lib->vba.DCHUBBUB_ARB_CSTATE_MAX_CAP_MODE);116dml_get_attr_func(comp_buffer_size_kbytes, mode_lib->vba.CompressedBufferSizeInkByte);117dml_get_attr_func(pixel_chunk_size_in_kbyte, mode_lib->vba.PixelChunkSizeInKByte);118dml_get_attr_func(alpha_pixel_chunk_size_in_kbyte, mode_lib->vba.AlphaPixelChunkSizeInKByte);119dml_get_attr_func(meta_chunk_size_in_kbyte, mode_lib->vba.MetaChunkSize);120dml_get_attr_func(min_pixel_chunk_size_in_byte, mode_lib->vba.MinPixelChunkSizeBytes);121dml_get_attr_func(min_meta_chunk_size_in_byte, mode_lib->vba.MinMetaChunkSizeBytes);122dml_get_attr_func(fclk_watermark, mode_lib->vba.Watermark.FCLKChangeWatermark);123dml_get_attr_func(usr_retraining_watermark, mode_lib->vba.Watermark.USRRetrainingWatermark);124 125dml_get_attr_func(comp_buffer_reserved_space_kbytes, mode_lib->vba.CompBufReservedSpaceKBytes);126dml_get_attr_func(comp_buffer_reserved_space_64bytes, mode_lib->vba.CompBufReservedSpace64B);127dml_get_attr_func(comp_buffer_reserved_space_zs, mode_lib->vba.CompBufReservedSpaceZs);128dml_get_attr_func(unbounded_request_enabled, mode_lib->vba.UnboundedRequestEnabled);129 130#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) \131{\132	unsigned int which_plane; \133	recalculate_params(mode_lib, pipes, num_pipes); \134	which_plane = mode_lib->vba.pipe_plane[which_pipe]; \135	return var[which_plane]; \136}137 138dml_get_pipe_attr_func(dsc_delay, mode_lib->vba.DSCDelay);139dml_get_pipe_attr_func(dppclk_calculated, mode_lib->vba.DPPCLK_calculated);140dml_get_pipe_attr_func(dscclk_calculated, mode_lib->vba.DSCCLK_calculated);141dml_get_pipe_attr_func(min_ttu_vblank, mode_lib->vba.MinTTUVBlank);142dml_get_pipe_attr_func(min_ttu_vblank_in_us, mode_lib->vba.MinTTUVBlank);143dml_get_pipe_attr_func(vratio_prefetch_l, mode_lib->vba.VRatioPrefetchY);144dml_get_pipe_attr_func(vratio_prefetch_c, mode_lib->vba.VRatioPrefetchC);145dml_get_pipe_attr_func(dst_x_after_scaler, mode_lib->vba.DSTXAfterScaler);146dml_get_pipe_attr_func(dst_y_after_scaler, mode_lib->vba.DSTYAfterScaler);147dml_get_pipe_attr_func(dst_y_per_vm_vblank, mode_lib->vba.DestinationLinesToRequestVMInVBlank);148dml_get_pipe_attr_func(dst_y_per_row_vblank, mode_lib->vba.DestinationLinesToRequestRowInVBlank);149dml_get_pipe_attr_func(dst_y_prefetch, mode_lib->vba.DestinationLinesForPrefetch);150dml_get_pipe_attr_func(dst_y_per_vm_flip, mode_lib->vba.DestinationLinesToRequestVMInImmediateFlip);151dml_get_pipe_attr_func(dst_y_per_row_flip, mode_lib->vba.DestinationLinesToRequestRowInImmediateFlip);152dml_get_pipe_attr_func(refcyc_per_vm_group_vblank, mode_lib->vba.TimePerVMGroupVBlank);153dml_get_pipe_attr_func(refcyc_per_vm_group_flip, mode_lib->vba.TimePerVMGroupFlip);154dml_get_pipe_attr_func(refcyc_per_vm_req_vblank, mode_lib->vba.TimePerVMRequestVBlank);155dml_get_pipe_attr_func(refcyc_per_vm_req_flip, mode_lib->vba.TimePerVMRequestFlip);156dml_get_pipe_attr_func(refcyc_per_vm_group_vblank_in_us, mode_lib->vba.TimePerVMGroupVBlank);157dml_get_pipe_attr_func(refcyc_per_vm_group_flip_in_us, mode_lib->vba.TimePerVMGroupFlip);158dml_get_pipe_attr_func(refcyc_per_vm_req_vblank_in_us, mode_lib->vba.TimePerVMRequestVBlank);159dml_get_pipe_attr_func(refcyc_per_vm_req_flip_in_us, mode_lib->vba.TimePerVMRequestFlip);160dml_get_pipe_attr_func(refcyc_per_vm_dmdata_in_us, mode_lib->vba.Tdmdl_vm);161dml_get_pipe_attr_func(dmdata_dl_delta_in_us, mode_lib->vba.Tdmdl);162dml_get_pipe_attr_func(refcyc_per_line_delivery_l_in_us, mode_lib->vba.DisplayPipeLineDeliveryTimeLuma);163dml_get_pipe_attr_func(refcyc_per_line_delivery_c_in_us, mode_lib->vba.DisplayPipeLineDeliveryTimeChroma);164dml_get_pipe_attr_func(refcyc_per_line_delivery_pre_l_in_us, mode_lib->vba.DisplayPipeLineDeliveryTimeLumaPrefetch);165dml_get_pipe_attr_func(refcyc_per_line_delivery_pre_c_in_us, mode_lib->vba.DisplayPipeLineDeliveryTimeChromaPrefetch);166dml_get_pipe_attr_func(refcyc_per_req_delivery_l_in_us, mode_lib->vba.DisplayPipeRequestDeliveryTimeLuma);167dml_get_pipe_attr_func(refcyc_per_req_delivery_c_in_us, mode_lib->vba.DisplayPipeRequestDeliveryTimeChroma);168dml_get_pipe_attr_func(refcyc_per_req_delivery_pre_l_in_us, mode_lib->vba.DisplayPipeRequestDeliveryTimeLumaPrefetch);169dml_get_pipe_attr_func(refcyc_per_req_delivery_pre_c_in_us, mode_lib->vba.DisplayPipeRequestDeliveryTimeChromaPrefetch);170dml_get_pipe_attr_func(refcyc_per_cursor_req_delivery_in_us, mode_lib->vba.CursorRequestDeliveryTime);171dml_get_pipe_attr_func(refcyc_per_cursor_req_delivery_pre_in_us, mode_lib->vba.CursorRequestDeliveryTimePrefetch);172dml_get_pipe_attr_func(refcyc_per_meta_chunk_nom_l_in_us, mode_lib->vba.TimePerMetaChunkNominal);173dml_get_pipe_attr_func(refcyc_per_meta_chunk_nom_c_in_us, mode_lib->vba.TimePerChromaMetaChunkNominal);174dml_get_pipe_attr_func(refcyc_per_meta_chunk_vblank_l_in_us, mode_lib->vba.TimePerMetaChunkVBlank);175dml_get_pipe_attr_func(refcyc_per_meta_chunk_vblank_c_in_us, mode_lib->vba.TimePerChromaMetaChunkVBlank);176dml_get_pipe_attr_func(refcyc_per_meta_chunk_flip_l_in_us, mode_lib->vba.TimePerMetaChunkFlip);177dml_get_pipe_attr_func(refcyc_per_meta_chunk_flip_c_in_us, mode_lib->vba.TimePerChromaMetaChunkFlip);178dml_get_pipe_attr_func(vstartup, mode_lib->vba.VStartup);179dml_get_pipe_attr_func(vupdate_offset, mode_lib->vba.VUpdateOffsetPix);180dml_get_pipe_attr_func(vupdate_width, mode_lib->vba.VUpdateWidthPix);181dml_get_pipe_attr_func(vready_offset, mode_lib->vba.VReadyOffsetPix);182dml_get_pipe_attr_func(vready_at_or_after_vsync, mode_lib->vba.VREADY_AT_OR_AFTER_VSYNC);183dml_get_pipe_attr_func(min_dst_y_next_start, mode_lib->vba.MIN_DST_Y_NEXT_START);184dml_get_pipe_attr_func(dst_y_per_pte_row_nom_l, mode_lib->vba.DST_Y_PER_PTE_ROW_NOM_L);185dml_get_pipe_attr_func(dst_y_per_pte_row_nom_c, mode_lib->vba.DST_Y_PER_PTE_ROW_NOM_C);186dml_get_pipe_attr_func(dst_y_per_meta_row_nom_l, mode_lib->vba.DST_Y_PER_META_ROW_NOM_L);187dml_get_pipe_attr_func(dst_y_per_meta_row_nom_c, mode_lib->vba.DST_Y_PER_META_ROW_NOM_C);188dml_get_pipe_attr_func(refcyc_per_pte_group_nom_l_in_us, mode_lib->vba.time_per_pte_group_nom_luma);189dml_get_pipe_attr_func(refcyc_per_pte_group_nom_c_in_us, mode_lib->vba.time_per_pte_group_nom_chroma);190dml_get_pipe_attr_func(refcyc_per_pte_group_vblank_l_in_us, mode_lib->vba.time_per_pte_group_vblank_luma);191dml_get_pipe_attr_func(refcyc_per_pte_group_vblank_c_in_us, mode_lib->vba.time_per_pte_group_vblank_chroma);192dml_get_pipe_attr_func(refcyc_per_pte_group_flip_l_in_us, mode_lib->vba.time_per_pte_group_flip_luma);193dml_get_pipe_attr_func(refcyc_per_pte_group_flip_c_in_us, mode_lib->vba.time_per_pte_group_flip_chroma);194dml_get_pipe_attr_func(vstartup_calculated, mode_lib->vba.VStartup);195dml_get_pipe_attr_func(dpte_row_height_linear_c, mode_lib->vba.dpte_row_height_linear_chroma);196dml_get_pipe_attr_func(swath_height_l, mode_lib->vba.SwathHeightY);197dml_get_pipe_attr_func(swath_height_c, mode_lib->vba.SwathHeightC);198dml_get_pipe_attr_func(det_stored_buffer_size_l_bytes, mode_lib->vba.DETBufferSizeY);199dml_get_pipe_attr_func(det_stored_buffer_size_c_bytes, mode_lib->vba.DETBufferSizeC);200dml_get_pipe_attr_func(dpte_group_size_in_bytes, mode_lib->vba.dpte_group_bytes);201dml_get_pipe_attr_func(vm_group_size_in_bytes, mode_lib->vba.vm_group_bytes);202dml_get_pipe_attr_func(dpte_row_height_linear_l, mode_lib->vba.dpte_row_height_linear);203dml_get_pipe_attr_func(pte_buffer_mode, mode_lib->vba.PTE_BUFFER_MODE);204dml_get_pipe_attr_func(subviewport_lines_needed_in_mall, mode_lib->vba.SubViewportLinesNeededInMALL);205dml_get_pipe_attr_func(surface_size_in_mall, mode_lib->vba.SurfaceSizeInMALL)206 207double get_total_immediate_flip_bytes(208		struct display_mode_lib *mode_lib,209		const display_e2e_pipe_params_st *pipes,210		unsigned int num_pipes)211{212	recalculate_params(mode_lib, pipes, num_pipes);213	return mode_lib->vba.TotImmediateFlipBytes;214}215 216double get_total_immediate_flip_bw(217		struct display_mode_lib *mode_lib,218		const display_e2e_pipe_params_st *pipes,219		unsigned int num_pipes)220{221	unsigned int k;222	double immediate_flip_bw = 0.0;223	recalculate_params(mode_lib, pipes, num_pipes);224	for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k)225		immediate_flip_bw += mode_lib->vba.ImmediateFlipBW[k];226	return immediate_flip_bw;227}228 229double get_total_prefetch_bw(230		struct display_mode_lib *mode_lib,231		const display_e2e_pipe_params_st *pipes,232		unsigned int num_pipes)233{234	unsigned int k;235	double total_prefetch_bw = 0.0;236 237	recalculate_params(mode_lib, pipes, num_pipes);238	for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k)239		total_prefetch_bw += mode_lib->vba.PrefetchBandwidth[k];240	return total_prefetch_bw;241}242 243unsigned int get_total_surface_size_in_mall_bytes(244		struct display_mode_lib *mode_lib,245		const display_e2e_pipe_params_st *pipes,246		unsigned int num_pipes)247{248	unsigned int k;249	unsigned int size = 0.0;250	recalculate_params(mode_lib, pipes, num_pipes);251	for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k)252		size += mode_lib->vba.SurfaceSizeInMALL[k];253	return size;254}255 256static unsigned int get_pipe_idx(struct display_mode_lib *mode_lib, unsigned int plane_idx)257{258	int pipe_idx = -1;259	int i;260 261	ASSERT(plane_idx < DC__NUM_DPP__MAX);262 263	for (i = 0; i < DC__NUM_DPP__MAX ; i++) {264		if (plane_idx == mode_lib->vba.pipe_plane[i]) {265			pipe_idx = i;266			break;267		}268	}269	ASSERT(pipe_idx >= 0);270 271	return pipe_idx;272}273 274 275double get_det_buffer_size_kbytes(struct display_mode_lib *mode_lib, const display_e2e_pipe_params_st *pipes,276		unsigned int num_pipes, unsigned int pipe_idx)277{278	unsigned int plane_idx;279	double det_buf_size_kbytes;280 281	recalculate_params(mode_lib, pipes, num_pipes);282	plane_idx = mode_lib->vba.pipe_plane[pipe_idx];283 284	dml_print("DML::%s: num_pipes=%d pipe_idx=%d plane_idx=%0d\n", __func__, num_pipes, pipe_idx, plane_idx);285	det_buf_size_kbytes = mode_lib->vba.DETBufferSizeInKByte[plane_idx]; // per hubp DET buffer size286 287	dml_print("DML::%s: det_buf_size_kbytes=%3.2f\n", __func__, det_buf_size_kbytes);288 289	return det_buf_size_kbytes;290}291 292bool get_is_phantom_pipe(struct display_mode_lib *mode_lib, const display_e2e_pipe_params_st *pipes,293		unsigned int num_pipes, unsigned int pipe_idx)294{295	unsigned int plane_idx;296 297	recalculate_params(mode_lib, pipes, num_pipes);298	plane_idx = mode_lib->vba.pipe_plane[pipe_idx];299	dml_print("DML::%s: num_pipes=%d pipe_idx=%d UseMALLForPStateChange=%0d\n", __func__, num_pipes, pipe_idx,300			mode_lib->vba.UsesMALLForPStateChange[plane_idx]);301	return (mode_lib->vba.UsesMALLForPStateChange[plane_idx] == dm_use_mall_pstate_change_phantom_pipe);302}303 304static void fetch_socbb_params(struct display_mode_lib *mode_lib)305{306	soc_bounding_box_st *soc = &mode_lib->vba.soc;307	int i;308 309	// SOC Bounding Box Parameters310	mode_lib->vba.ReturnBusWidth = soc->return_bus_width_bytes;311	mode_lib->vba.NumberOfChannels = soc->num_chans;312	mode_lib->vba.PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelDataOnly =313			soc->pct_ideal_dram_sdp_bw_after_urgent_pixel_only; // there's always that one bastard variable that's so long it throws everything out of alignment!314	mode_lib->vba.PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData =315			soc->pct_ideal_dram_sdp_bw_after_urgent_pixel_and_vm;316	mode_lib->vba.PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly =317			soc->pct_ideal_dram_sdp_bw_after_urgent_vm_only;318	mode_lib->vba.MaxAveragePercentOfIdealSDPPortBWDisplayCanUseInNormalSystemOperation =319			soc->max_avg_sdp_bw_use_normal_percent;320	mode_lib->vba.MaxAveragePercentOfIdealDRAMBWDisplayCanUseInNormalSystemOperation =321			soc->max_avg_dram_bw_use_normal_percent;322	mode_lib->vba.UrgentLatencyPixelDataOnly = soc->urgent_latency_pixel_data_only_us;323	mode_lib->vba.UrgentLatencyPixelMixedWithVMData = soc->urgent_latency_pixel_mixed_with_vm_data_us;324	mode_lib->vba.UrgentLatencyVMDataOnly = soc->urgent_latency_vm_data_only_us;325	mode_lib->vba.RoundTripPingLatencyCycles = soc->round_trip_ping_latency_dcfclk_cycles;326	mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelDataOnly =327			soc->urgent_out_of_order_return_per_channel_pixel_only_bytes;328	mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelMixedWithVMData =329			soc->urgent_out_of_order_return_per_channel_pixel_and_vm_bytes;330	mode_lib->vba.UrgentOutOfOrderReturnPerChannelVMDataOnly =331			soc->urgent_out_of_order_return_per_channel_vm_only_bytes;332	mode_lib->vba.WritebackLatency = soc->writeback_latency_us;333	mode_lib->vba.SRExitTime = soc->sr_exit_time_us;334	mode_lib->vba.SREnterPlusExitTime = soc->sr_enter_plus_exit_time_us;335	mode_lib->vba.PercentOfIdealFabricAndSDPPortBWReceivedAfterUrgLatency = soc->pct_ideal_sdp_bw_after_urgent;336	mode_lib->vba.PercentOfIdealDRAMBWReceivedAfterUrgLatencyPixelMixedWithVMData = soc->pct_ideal_dram_sdp_bw_after_urgent_pixel_and_vm;337	mode_lib->vba.PercentOfIdealDRAMBWReceivedAfterUrgLatencyPixelDataOnly = soc->pct_ideal_dram_sdp_bw_after_urgent_pixel_only;338	mode_lib->vba.PercentOfIdealDRAMBWReceivedAfterUrgLatencyVMDataOnly = soc->pct_ideal_dram_sdp_bw_after_urgent_vm_only;339	mode_lib->vba.MaxAveragePercentOfIdealFabricAndSDPPortBWDisplayCanUseInNormalSystemOperation =340			soc->max_avg_sdp_bw_use_normal_percent;341	mode_lib->vba.SRExitZ8Time = soc->sr_exit_z8_time_us;342	mode_lib->vba.SREnterPlusExitZ8Time = soc->sr_enter_plus_exit_z8_time_us;343	mode_lib->vba.FCLKChangeLatency = soc->fclk_change_latency_us;344	mode_lib->vba.USRRetrainingLatency = soc->usr_retraining_latency_us;345	mode_lib->vba.SMNLatency = soc->smn_latency_us;346	mode_lib->vba.MALLAllocatedForDCNFinal = soc->mall_allocated_for_dcn_mbytes;347 348	mode_lib->vba.PercentOfIdealDRAMBWReceivedAfterUrgLatencySTROBE = soc->pct_ideal_dram_bw_after_urgent_strobe;349	mode_lib->vba.MaxAveragePercentOfIdealFabricBWDisplayCanUseInNormalSystemOperation =350			soc->max_avg_fabric_bw_use_normal_percent;351	mode_lib->vba.MaxAveragePercentOfIdealDRAMBWDisplayCanUseInNormalSystemOperationSTROBE =352			soc->max_avg_dram_bw_use_normal_strobe_percent;353 354	mode_lib->vba.DRAMClockChangeRequirementFinal = soc->dram_clock_change_requirement_final;355	mode_lib->vba.FCLKChangeRequirementFinal = 1;356	mode_lib->vba.USRRetrainingRequiredFinal = 1;357	mode_lib->vba.AllowForPStateChangeOrStutterInVBlankFinal = soc->allow_for_pstate_or_stutter_in_vblank_final;358	mode_lib->vba.DRAMClockChangeLatency = soc->dram_clock_change_latency_us;359	mode_lib->vba.DummyPStateCheck = soc->dram_clock_change_latency_us == soc->dummy_pstate_latency_us;360	mode_lib->vba.DRAMClockChangeSupportsVActive = !soc->disable_dram_clock_change_vactive_support ||361			mode_lib->vba.DummyPStateCheck;362	mode_lib->vba.AllowDramClockChangeOneDisplayVactive = soc->allow_dram_clock_one_display_vactive;363	mode_lib->vba.AllowDRAMSelfRefreshOrDRAMClockChangeInVblank =364		soc->allow_dram_self_refresh_or_dram_clock_change_in_vblank;365 366	mode_lib->vba.Downspreading = soc->downspread_percent;367	mode_lib->vba.DRAMChannelWidth = soc->dram_channel_width_bytes;   // new!368	mode_lib->vba.FabricDatapathToDCNDataReturn = soc->fabric_datapath_to_dcn_data_return_bytes; // new!369	mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading = soc->dcn_downspread_percent;   // new370	mode_lib->vba.DISPCLKDPPCLKVCOSpeed = soc->dispclk_dppclk_vco_speed_mhz;   // new371	mode_lib->vba.VMMPageSize = soc->vmm_page_size_bytes;372	mode_lib->vba.GPUVMMinPageSize = soc->gpuvm_min_page_size_bytes / 1024;373	mode_lib->vba.HostVMMinPageSize = soc->hostvm_min_page_size_bytes / 1024;374	// Set the voltage scaling clocks as the defaults. Most of these will375	// be set to different values by the test376	for (i = 0; i < mode_lib->vba.soc.num_states; i++)377		if (soc->clock_limits[i].state == mode_lib->vba.VoltageLevel)378			break;379 380	mode_lib->vba.DCFCLK = soc->clock_limits[i].dcfclk_mhz;381	mode_lib->vba.SOCCLK = soc->clock_limits[i].socclk_mhz;382	mode_lib->vba.DRAMSpeed = soc->clock_limits[i].dram_speed_mts;383	mode_lib->vba.FabricClock = soc->clock_limits[i].fabricclk_mhz;384 385	mode_lib->vba.XFCBusTransportTime = soc->xfc_bus_transport_time_us;386	mode_lib->vba.XFCXBUFLatencyTolerance = soc->xfc_xbuf_latency_tolerance_us;387	mode_lib->vba.UseUrgentBurstBandwidth = soc->use_urgent_burst_bw;388 389	mode_lib->vba.SupportGFX7CompatibleTilingIn32bppAnd64bpp = false;390	mode_lib->vba.WritebackLumaAndChromaScalingSupported = true;391	mode_lib->vba.MaxHSCLRatio = 4;392	mode_lib->vba.MaxVSCLRatio = 4;393	mode_lib->vba.Cursor64BppSupport = true;394	for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {395		mode_lib->vba.DCFCLKPerState[i] = soc->clock_limits[i].dcfclk_mhz;396		mode_lib->vba.FabricClockPerState[i] = soc->clock_limits[i].fabricclk_mhz;397		mode_lib->vba.SOCCLKPerState[i] = soc->clock_limits[i].socclk_mhz;398		mode_lib->vba.PHYCLKPerState[i] = soc->clock_limits[i].phyclk_mhz;399		mode_lib->vba.PHYCLKD18PerState[i] = soc->clock_limits[i].phyclk_d18_mhz;400		mode_lib->vba.PHYCLKD32PerState[i] = soc->clock_limits[i].phyclk_d32_mhz;401		mode_lib->vba.MaxDppclk[i] = soc->clock_limits[i].dppclk_mhz;402		mode_lib->vba.MaxDSCCLK[i] = soc->clock_limits[i].dscclk_mhz;403		mode_lib->vba.DRAMSpeedPerState[i] = soc->clock_limits[i].dram_speed_mts;404		//mode_lib->vba.DRAMSpeedPerState[i] = soc->clock_limits[i].dram_speed_mhz;405		mode_lib->vba.MaxDispclk[i] = soc->clock_limits[i].dispclk_mhz;406		mode_lib->vba.DTBCLKPerState[i] = soc->clock_limits[i].dtbclk_mhz;407	}408 409	mode_lib->vba.DoUrgentLatencyAdjustment =410		soc->do_urgent_latency_adjustment;411	mode_lib->vba.UrgentLatencyAdjustmentFabricClockComponent =412		soc->urgent_latency_adjustment_fabric_clock_component_us;413	mode_lib->vba.UrgentLatencyAdjustmentFabricClockReference =414		soc->urgent_latency_adjustment_fabric_clock_reference_mhz;415	mode_lib->vba.MaxVRatioPre = soc->max_vratio_pre;416}417 418static void fetch_ip_params(struct display_mode_lib *mode_lib)419{420	ip_params_st *ip = &mode_lib->vba.ip;421 422	// IP Parameters423	mode_lib->vba.UseMinimumRequiredDCFCLK = ip->use_min_dcfclk;424	mode_lib->vba.ClampMinDCFCLK = ip->clamp_min_dcfclk;425	mode_lib->vba.MaxNumDPP = ip->max_num_dpp;426	mode_lib->vba.MaxNumOTG = ip->max_num_otg;427	mode_lib->vba.MaxNumHDMIFRLOutputs = ip->max_num_hdmi_frl_outputs;428	mode_lib->vba.MaxNumWriteback = ip->max_num_wb;429	mode_lib->vba.CursorChunkSize = ip->cursor_chunk_size;430	mode_lib->vba.CursorBufferSize = ip->cursor_buffer_size;431 432	mode_lib->vba.MaxDCHUBToPSCLThroughput = ip->max_dchub_pscl_bw_pix_per_clk;433	mode_lib->vba.MaxPSCLToLBThroughput = ip->max_pscl_lb_bw_pix_per_clk;434	mode_lib->vba.ROBBufferSizeInKByte = ip->rob_buffer_size_kbytes;435	mode_lib->vba.DETBufferSizeInKByte[0] = ip->det_buffer_size_kbytes;436	mode_lib->vba.ConfigReturnBufferSizeInKByte = ip->config_return_buffer_size_in_kbytes;437	mode_lib->vba.CompressedBufferSegmentSizeInkByte = ip->compressed_buffer_segment_size_in_kbytes;438	mode_lib->vba.MetaFIFOSizeInKEntries = ip->meta_fifo_size_in_kentries;439	mode_lib->vba.ZeroSizeBufferEntries = ip->zero_size_buffer_entries;440	mode_lib->vba.COMPBUF_RESERVED_SPACE_64B = ip->compbuf_reserved_space_64b;441	mode_lib->vba.COMPBUF_RESERVED_SPACE_ZS = ip->compbuf_reserved_space_zs;442	mode_lib->vba.MaximumDSCBitsPerComponent = ip->maximum_dsc_bits_per_component;443	mode_lib->vba.DSC422NativeSupport = ip->dsc422_native_support;444    /* In DCN3.2, nomDETInKByte should be initialized correctly. */445	mode_lib->vba.nomDETInKByte = ip->det_buffer_size_kbytes;446	mode_lib->vba.CompbufReservedSpace64B  = ip->compbuf_reserved_space_64b;447	mode_lib->vba.CompbufReservedSpaceZs = ip->compbuf_reserved_space_zs;448	mode_lib->vba.CompressedBufferSegmentSizeInkByteFinal = ip->compressed_buffer_segment_size_in_kbytes;449	mode_lib->vba.LineBufferSizeFinal = ip->line_buffer_size_bits;450	mode_lib->vba.AlphaPixelChunkSizeInKByte = ip->alpha_pixel_chunk_size_kbytes; // not ysed451	mode_lib->vba.MinPixelChunkSizeBytes = ip->min_pixel_chunk_size_bytes; // not used452	mode_lib->vba.MaximumPixelsPerLinePerDSCUnit = ip->maximum_pixels_per_line_per_dsc_unit;453	mode_lib->vba.MaxNumDP2p0Outputs = ip->max_num_dp2p0_outputs;454	mode_lib->vba.MaxNumDP2p0Streams = ip->max_num_dp2p0_streams;455	mode_lib->vba.DCCMetaBufferSizeBytes = ip->dcc_meta_buffer_size_bytes;456 457	mode_lib->vba.PixelChunkSizeInKByte = ip->pixel_chunk_size_kbytes;458	mode_lib->vba.MetaChunkSize = ip->meta_chunk_size_kbytes;459	mode_lib->vba.MinMetaChunkSizeBytes = ip->min_meta_chunk_size_bytes;460	mode_lib->vba.WritebackChunkSize = ip->writeback_chunk_size_kbytes;461	mode_lib->vba.LineBufferSize = ip->line_buffer_size_bits;462	mode_lib->vba.MaxLineBufferLines = ip->max_line_buffer_lines;463	mode_lib->vba.PTEBufferSizeInRequestsLuma = ip->dpte_buffer_size_in_pte_reqs_luma;464	mode_lib->vba.PTEBufferSizeInRequestsChroma = ip->dpte_buffer_size_in_pte_reqs_chroma;465	mode_lib->vba.DPPOutputBufferPixels = ip->dpp_output_buffer_pixels;466	mode_lib->vba.OPPOutputBufferLines = ip->opp_output_buffer_lines;467	mode_lib->vba.MaxHSCLRatio = ip->max_hscl_ratio;468	mode_lib->vba.MaxVSCLRatio = ip->max_vscl_ratio;469	mode_lib->vba.WritebackInterfaceLumaBufferSize = ip->writeback_luma_buffer_size_kbytes * 1024;470	mode_lib->vba.WritebackInterfaceChromaBufferSize = ip->writeback_chroma_buffer_size_kbytes * 1024;471 472	mode_lib->vba.WritebackInterfaceBufferSize = ip->writeback_interface_buffer_size_kbytes;473	mode_lib->vba.WritebackLineBufferSize = ip->writeback_line_buffer_buffer_size;474 475	mode_lib->vba.WritebackChromaLineBufferWidth =476			ip->writeback_chroma_line_buffer_width_pixels;477	mode_lib->vba.WritebackLineBufferLumaBufferSize =478			ip->writeback_line_buffer_luma_buffer_size;479	mode_lib->vba.WritebackLineBufferChromaBufferSize =480			ip->writeback_line_buffer_chroma_buffer_size;481	mode_lib->vba.Writeback10bpc420Supported = ip->writeback_10bpc420_supported;482	mode_lib->vba.WritebackMaxHSCLRatio = ip->writeback_max_hscl_ratio;483	mode_lib->vba.WritebackMaxVSCLRatio = ip->writeback_max_vscl_ratio;484	mode_lib->vba.WritebackMinHSCLRatio = ip->writeback_min_hscl_ratio;485	mode_lib->vba.WritebackMinVSCLRatio = ip->writeback_min_vscl_ratio;486	mode_lib->vba.WritebackMaxHSCLTaps = ip->writeback_max_hscl_taps;487	mode_lib->vba.WritebackMaxVSCLTaps = ip->writeback_max_vscl_taps;488	mode_lib->vba.WritebackConfiguration = dm_normal;489	mode_lib->vba.GPUVMMaxPageTableLevels = ip->gpuvm_max_page_table_levels;490	mode_lib->vba.HostVMMaxNonCachedPageTableLevels = ip->hostvm_max_page_table_levels;491	mode_lib->vba.HostVMMaxPageTableLevels = ip->hostvm_max_page_table_levels;492	mode_lib->vba.HostVMCachedPageTableLevels = ip->hostvm_cached_page_table_levels;493	mode_lib->vba.MaxInterDCNTileRepeaters = ip->max_inter_dcn_tile_repeaters;494	mode_lib->vba.NumberOfDSC = ip->num_dsc;495	mode_lib->vba.ODMCapability = ip->odm_capable;496	mode_lib->vba.DISPCLKRampingMargin = ip->dispclk_ramp_margin_percent;497 498	mode_lib->vba.XFCSupported = ip->xfc_supported;499	mode_lib->vba.XFCFillBWOverhead = ip->xfc_fill_bw_overhead_percent;500	mode_lib->vba.XFCFillConstant = ip->xfc_fill_constant_bytes;501	mode_lib->vba.DPPCLKDelaySubtotal = ip->dppclk_delay_subtotal;502	mode_lib->vba.DPPCLKDelaySCL = ip->dppclk_delay_scl;503	mode_lib->vba.DPPCLKDelaySCLLBOnly = ip->dppclk_delay_scl_lb_only;504	mode_lib->vba.DPPCLKDelayCNVCFormater = ip->dppclk_delay_cnvc_formatter;505	mode_lib->vba.DPPCLKDelayCNVCCursor = ip->dppclk_delay_cnvc_cursor;506	mode_lib->vba.DISPCLKDelaySubtotal = ip->dispclk_delay_subtotal;507	mode_lib->vba.DynamicMetadataVMEnabled = ip->dynamic_metadata_vm_enabled;508	mode_lib->vba.ODMCombine4To1Supported = ip->odm_combine_4to1_supported;509	mode_lib->vba.ProgressiveToInterlaceUnitInOPP = ip->ptoi_supported;510	mode_lib->vba.PDEProcessingBufIn64KBReqs = ip->pde_proc_buffer_size_64k_reqs;511	mode_lib->vba.PTEGroupSize = ip->pte_group_size_bytes;512	mode_lib->vba.SupportGFX7CompatibleTilingIn32bppAnd64bpp = ip->gfx7_compat_tiling_supported;513}514 515static void fetch_pipe_params(struct display_mode_lib *mode_lib)516{517	display_e2e_pipe_params_st *pipes = mode_lib->vba.cache_pipes;518	ip_params_st *ip = &mode_lib->vba.ip;519 520	unsigned int OTGInstPlane[DC__NUM_DPP__MAX];521	unsigned int j, k;522	bool PlaneVisited[DC__NUM_DPP__MAX];523	bool visited[DC__NUM_DPP__MAX];524 525	// Convert Pipes to Planes526	for (k = 0; k < mode_lib->vba.cache_num_pipes; ++k)527		visited[k] = false;528 529	mode_lib->vba.NumberOfActivePlanes = 0;530	mode_lib->vba.NumberOfActiveSurfaces = 0;531	mode_lib->vba.ImmediateFlipSupport = false;532	for (j = 0; j < mode_lib->vba.cache_num_pipes; ++j) {533		display_pipe_source_params_st *src = &pipes[j].pipe.src;534		display_pipe_dest_params_st *dst = &pipes[j].pipe.dest;535		scaler_ratio_depth_st *scl = &pipes[j].pipe.scale_ratio_depth;536		scaler_taps_st *taps = &pipes[j].pipe.scale_taps;537		display_output_params_st *dout = &pipes[j].dout;538		display_clocks_and_cfg_st *clks = &pipes[j].clks_cfg;539 540		if (visited[j])541			continue;542		visited[j] = true;543 544		mode_lib->vba.ImmediateFlipRequirement[j] = dm_immediate_flip_not_required;545		mode_lib->vba.pipe_plane[j] = mode_lib->vba.NumberOfActivePlanes;546		mode_lib->vba.DPPPerPlane[mode_lib->vba.NumberOfActivePlanes] = 1;547		mode_lib->vba.SourceScan[mode_lib->vba.NumberOfActivePlanes] =548				(enum scan_direction_class) (src->source_scan);549		mode_lib->vba.ViewportWidth[mode_lib->vba.NumberOfActivePlanes] =550				src->viewport_width;551		mode_lib->vba.ViewportWidthChroma[mode_lib->vba.NumberOfActivePlanes] =552				src->viewport_width_c;553		mode_lib->vba.ViewportHeight[mode_lib->vba.NumberOfActivePlanes] =554				src->viewport_height;555		mode_lib->vba.ViewportHeightChroma[mode_lib->vba.NumberOfActivePlanes] =556				src->viewport_height_c;557		mode_lib->vba.ViewportYStartY[mode_lib->vba.NumberOfActivePlanes] =558				src->viewport_y_y;559		mode_lib->vba.ViewportYStartC[mode_lib->vba.NumberOfActivePlanes] =560				src->viewport_y_c;561		mode_lib->vba.SourceRotation[mode_lib->vba.NumberOfActiveSurfaces] = src->source_rotation;562		mode_lib->vba.ViewportXStartY[mode_lib->vba.NumberOfActiveSurfaces] = src->viewport_x_y;563		mode_lib->vba.ViewportXStartC[mode_lib->vba.NumberOfActiveSurfaces] = src->viewport_x_c;564		// TODO: Assign correct value to viewport_stationary565		mode_lib->vba.ViewportStationary[mode_lib->vba.NumberOfActivePlanes] =566				src->viewport_stationary;567		mode_lib->vba.UsesMALLForPStateChange[mode_lib->vba.NumberOfActivePlanes] = src->use_mall_for_pstate_change;568		mode_lib->vba.UseMALLForStaticScreen[mode_lib->vba.NumberOfActivePlanes] = src->use_mall_for_static_screen;569		mode_lib->vba.GPUVMMinPageSizeKBytes[mode_lib->vba.NumberOfActivePlanes] = src->gpuvm_min_page_size_kbytes;570		mode_lib->vba.RefreshRate[mode_lib->vba.NumberOfActivePlanes] = dst->refresh_rate; //todo remove this571		mode_lib->vba.OutputLinkDPRate[mode_lib->vba.NumberOfActivePlanes] = dout->dp_rate;572		mode_lib->vba.ODMUse[mode_lib->vba.NumberOfActivePlanes] = dst->odm_combine_policy;573		mode_lib->vba.DETSizeOverride[mode_lib->vba.NumberOfActivePlanes] = src->det_size_override;574		if (src->det_size_override)575			mode_lib->vba.DETBufferSizeInKByte[mode_lib->vba.NumberOfActivePlanes] = src->det_size_override;576		else577			mode_lib->vba.DETBufferSizeInKByte[mode_lib->vba.NumberOfActivePlanes] = ip->det_buffer_size_kbytes;578		//TODO: Need to assign correct values to dp_multistream vars579		mode_lib->vba.OutputMultistreamEn[mode_lib->vba.NumberOfActiveSurfaces] = dout->dp_multistream_en;580		mode_lib->vba.OutputMultistreamId[mode_lib->vba.NumberOfActiveSurfaces] = dout->dp_multistream_id;581		mode_lib->vba.PitchY[mode_lib->vba.NumberOfActivePlanes] = src->data_pitch;582		mode_lib->vba.SurfaceWidthY[mode_lib->vba.NumberOfActivePlanes] = src->surface_width_y;583		mode_lib->vba.SurfaceHeightY[mode_lib->vba.NumberOfActivePlanes] = src->surface_height_y;584		mode_lib->vba.PitchC[mode_lib->vba.NumberOfActivePlanes] = src->data_pitch_c;585		mode_lib->vba.SurfaceHeightC[mode_lib->vba.NumberOfActivePlanes] = src->surface_height_c;586		mode_lib->vba.SurfaceWidthC[mode_lib->vba.NumberOfActivePlanes] = src->surface_width_c;587		mode_lib->vba.DCCMetaPitchY[mode_lib->vba.NumberOfActivePlanes] = src->meta_pitch;588		mode_lib->vba.DCCMetaPitchC[mode_lib->vba.NumberOfActivePlanes] = src->meta_pitch_c;589		mode_lib->vba.HRatio[mode_lib->vba.NumberOfActivePlanes] = scl->hscl_ratio;590		mode_lib->vba.HRatioChroma[mode_lib->vba.NumberOfActivePlanes] = scl->hscl_ratio_c;591		mode_lib->vba.VRatio[mode_lib->vba.NumberOfActivePlanes] = scl->vscl_ratio;592		mode_lib->vba.VRatioChroma[mode_lib->vba.NumberOfActivePlanes] = scl->vscl_ratio_c;593		mode_lib->vba.ScalerEnabled[mode_lib->vba.NumberOfActivePlanes] = scl->scl_enable;594		mode_lib->vba.Interlace[mode_lib->vba.NumberOfActivePlanes] = dst->interlaced;595		if (dst->interlaced && !ip->ptoi_supported) {596			mode_lib->vba.VRatio[mode_lib->vba.NumberOfActivePlanes] *= 2.0;597			mode_lib->vba.VRatioChroma[mode_lib->vba.NumberOfActivePlanes] *= 2.0;598		}599		mode_lib->vba.htaps[mode_lib->vba.NumberOfActivePlanes] = taps->htaps;600		mode_lib->vba.vtaps[mode_lib->vba.NumberOfActivePlanes] = taps->vtaps;601		mode_lib->vba.HTAPsChroma[mode_lib->vba.NumberOfActivePlanes] = taps->htaps_c;602		mode_lib->vba.VTAPsChroma[mode_lib->vba.NumberOfActivePlanes] = taps->vtaps_c;603		mode_lib->vba.HTotal[mode_lib->vba.NumberOfActivePlanes] = dst->htotal;604		mode_lib->vba.VTotal[mode_lib->vba.NumberOfActivePlanes] = dst->vtotal;605		mode_lib->vba.VFrontPorch[mode_lib->vba.NumberOfActivePlanes] = dst->vfront_porch;606		mode_lib->vba.VBlankNom[mode_lib->vba.NumberOfActivePlanes] = dst->vblank_nom;607		mode_lib->vba.DCCFractionOfZeroSizeRequestsLuma[mode_lib->vba.NumberOfActivePlanes] = src->dcc_fraction_of_zs_req_luma;608		mode_lib->vba.DCCFractionOfZeroSizeRequestsChroma[mode_lib->vba.NumberOfActivePlanes] = src->dcc_fraction_of_zs_req_chroma;609		mode_lib->vba.DCCEnable[mode_lib->vba.NumberOfActivePlanes] =610				src->dcc_use_global ?611						ip->dcc_supported : src->dcc && ip->dcc_supported;612		mode_lib->vba.DCCRate[mode_lib->vba.NumberOfActivePlanes] = src->dcc_rate;613		/* TODO: Needs to be set based on src->dcc_rate_luma/chroma */614		mode_lib->vba.DCCRateLuma[mode_lib->vba.NumberOfActivePlanes] = src->dcc_rate;615		mode_lib->vba.DCCRateChroma[mode_lib->vba.NumberOfActivePlanes] = src->dcc_rate_chroma;616		mode_lib->vba.SourcePixelFormat[mode_lib->vba.NumberOfActivePlanes] = (enum source_format_class) (src->source_format);617		mode_lib->vba.HActive[mode_lib->vba.NumberOfActivePlanes] = dst->hactive;618		mode_lib->vba.VActive[mode_lib->vba.NumberOfActivePlanes] = dst->vactive;619		mode_lib->vba.SurfaceTiling[mode_lib->vba.NumberOfActivePlanes] =620				(enum dm_swizzle_mode) (src->sw_mode);621		mode_lib->vba.ScalerRecoutWidth[mode_lib->vba.NumberOfActivePlanes] =622				dst->recout_width; // TODO: or should this be full_recout_width???...maybe only when in hsplit mode?623		mode_lib->vba.ODMCombineEnabled[mode_lib->vba.NumberOfActivePlanes] =624				dst->odm_combine;625		mode_lib->vba.OutputFormat[mode_lib->vba.NumberOfActivePlanes] =626				(enum output_format_class) (dout->output_format);627		mode_lib->vba.OutputBpp[mode_lib->vba.NumberOfActivePlanes] =628				dout->output_bpp;629		mode_lib->vba.Output[mode_lib->vba.NumberOfActivePlanes] =630				(enum output_encoder_class) (dout->output_type);631		mode_lib->vba.skip_dio_check[mode_lib->vba.NumberOfActivePlanes] =632				dout->is_virtual;633 634		if (dout->dsc_enable)635			mode_lib->vba.ForcedOutputLinkBPP[mode_lib->vba.NumberOfActivePlanes] = dout->output_bpp;636		else637			mode_lib->vba.ForcedOutputLinkBPP[mode_lib->vba.NumberOfActivePlanes] = 0.0;638 639		mode_lib->vba.OutputLinkDPLanes[mode_lib->vba.NumberOfActivePlanes] =640				dout->dp_lanes;641		/* TODO: Needs to be set based on dout->audio.audio_sample_rate_khz/sample_layout */642		mode_lib->vba.AudioSampleRate[mode_lib->vba.NumberOfActivePlanes] =643			dout->max_audio_sample_rate;644		mode_lib->vba.AudioSampleLayout[mode_lib->vba.NumberOfActivePlanes] =645			1;646		mode_lib->vba.DRAMClockChangeLatencyOverride = 0.0;647		mode_lib->vba.DSCEnabled[mode_lib->vba.NumberOfActivePlanes] = dout->dsc_enable;648		mode_lib->vba.DSCEnable[mode_lib->vba.NumberOfActivePlanes] = dout->dsc_enable;649		mode_lib->vba.NumberOfDSCSlices[mode_lib->vba.NumberOfActivePlanes] =650				dout->dsc_slices;651		if (!dout->dsc_input_bpc) {652			mode_lib->vba.DSCInputBitPerComponent[mode_lib->vba.NumberOfActivePlanes] =653				ip->maximum_dsc_bits_per_component;654		} else {655			mode_lib->vba.DSCInputBitPerComponent[mode_lib->vba.NumberOfActivePlanes] =656				dout->dsc_input_bpc;657		}658		mode_lib->vba.WritebackEnable[mode_lib->vba.NumberOfActivePlanes] = dout->wb_enable;659		mode_lib->vba.ActiveWritebacksPerPlane[mode_lib->vba.NumberOfActivePlanes] =660				dout->num_active_wb;661		mode_lib->vba.WritebackSourceHeight[mode_lib->vba.NumberOfActivePlanes] =662				dout->wb.wb_src_height;663		mode_lib->vba.WritebackSourceWidth[mode_lib->vba.NumberOfActivePlanes] =664				dout->wb.wb_src_width;665		mode_lib->vba.WritebackDestinationWidth[mode_lib->vba.NumberOfActivePlanes] =666				dout->wb.wb_dst_width;667		mode_lib->vba.WritebackDestinationHeight[mode_lib->vba.NumberOfActivePlanes] =668				dout->wb.wb_dst_height;669		mode_lib->vba.WritebackHRatio[mode_lib->vba.NumberOfActivePlanes] =670				dout->wb.wb_hratio;671		mode_lib->vba.WritebackVRatio[mode_lib->vba.NumberOfActivePlanes] =672				dout->wb.wb_vratio;673		mode_lib->vba.WritebackPixelFormat[mode_lib->vba.NumberOfActivePlanes] =674				(enum source_format_class) (dout->wb.wb_pixel_format);675		mode_lib->vba.WritebackHTaps[mode_lib->vba.NumberOfActivePlanes] =676				dout->wb.wb_htaps_luma;677		mode_lib->vba.WritebackVTaps[mode_lib->vba.NumberOfActivePlanes] =678				dout->wb.wb_vtaps_luma;679		mode_lib->vba.WritebackLumaHTaps[mode_lib->vba.NumberOfActivePlanes] =680				dout->wb.wb_htaps_luma;681		mode_lib->vba.WritebackLumaVTaps[mode_lib->vba.NumberOfActivePlanes] =682				dout->wb.wb_vtaps_luma;683		mode_lib->vba.WritebackChromaHTaps[mode_lib->vba.NumberOfActivePlanes] =684				dout->wb.wb_htaps_chroma;685		mode_lib->vba.WritebackChromaVTaps[mode_lib->vba.NumberOfActivePlanes] =686				dout->wb.wb_vtaps_chroma;687		mode_lib->vba.WritebackHRatio[mode_lib->vba.NumberOfActivePlanes] =688				dout->wb.wb_hratio;689		mode_lib->vba.WritebackVRatio[mode_lib->vba.NumberOfActivePlanes] =690				dout->wb.wb_vratio;691 692		mode_lib->vba.DynamicMetadataEnable[mode_lib->vba.NumberOfActivePlanes] =693				src->dynamic_metadata_enable;694		mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired[mode_lib->vba.NumberOfActivePlanes] =695				src->dynamic_metadata_lines_before_active;696		mode_lib->vba.DynamicMetadataTransmittedBytes[mode_lib->vba.NumberOfActivePlanes] =697				src->dynamic_metadata_xmit_bytes;698 699		mode_lib->vba.XFCEnabled[mode_lib->vba.NumberOfActivePlanes] = src->xfc_enable700				&& ip->xfc_supported;701		mode_lib->vba.XFCSlvChunkSize = src->xfc_params.xfc_slv_chunk_size_bytes;702		mode_lib->vba.XFCTSlvVupdateOffset = src->xfc_params.xfc_tslv_vupdate_offset_us;703		mode_lib->vba.XFCTSlvVupdateWidth = src->xfc_params.xfc_tslv_vupdate_width_us;704		mode_lib->vba.XFCTSlvVreadyOffset = src->xfc_params.xfc_tslv_vready_offset_us;705		mode_lib->vba.PixelClock[mode_lib->vba.NumberOfActivePlanes] = dst->pixel_rate_mhz;706		mode_lib->vba.PixelClockBackEnd[mode_lib->vba.NumberOfActivePlanes] = dst->pixel_rate_mhz;707		mode_lib->vba.DPPCLK[mode_lib->vba.NumberOfActivePlanes] = clks->dppclk_mhz;708		mode_lib->vba.DRRDisplay[mode_lib->vba.NumberOfActiveSurfaces] = dst->drr_display;709		if (ip->is_line_buffer_bpp_fixed)710			mode_lib->vba.LBBitPerPixel[mode_lib->vba.NumberOfActivePlanes] =711					ip->line_buffer_fixed_bpp;712		else {713			unsigned int lb_depth;714 715			switch (scl->lb_depth) {716			case dm_lb_6:717				lb_depth = 18;718				break;719			case dm_lb_8:720				lb_depth = 24;721				break;722			case dm_lb_10:723				lb_depth = 30;724				break;725			case dm_lb_12:726				lb_depth = 36;727				break;728			case dm_lb_16:729				lb_depth = 48;730				break;731			case dm_lb_19:732				lb_depth = 57;733				break;734			default:735				lb_depth = 36;736			}737			mode_lib->vba.LBBitPerPixel[mode_lib->vba.NumberOfActivePlanes] = lb_depth;738		}739		mode_lib->vba.NumberOfCursors[mode_lib->vba.NumberOfActivePlanes] = 0;740		// The DML spreadsheet assumes that the two cursors utilize the same amount of bandwidth. We'll741		// calculate things a little more accurately742		for (k = 0; k < DC__NUM_CURSOR__MAX; ++k) {743			switch (k) {744			case 0:745				mode_lib->vba.CursorBPP[mode_lib->vba.NumberOfActivePlanes][0] =746						CursorBppEnumToBits(747								(enum cursor_bpp) (src->cur0_bpp));748				mode_lib->vba.CursorWidth[mode_lib->vba.NumberOfActivePlanes][0] =749						src->cur0_src_width;750				if (src->cur0_src_width > 0)751					mode_lib->vba.NumberOfCursors[mode_lib->vba.NumberOfActivePlanes]++;752				break;753			case 1:754				mode_lib->vba.CursorBPP[mode_lib->vba.NumberOfActivePlanes][1] =755						CursorBppEnumToBits(756								(enum cursor_bpp) (src->cur1_bpp));757				mode_lib->vba.CursorWidth[mode_lib->vba.NumberOfActivePlanes][1] =758						src->cur1_src_width;759				if (src->cur1_src_width > 0)760					mode_lib->vba.NumberOfCursors[mode_lib->vba.NumberOfActivePlanes]++;761				break;762			default:763				dml_print(764						"ERROR: Number of cursors specified exceeds supported maximum\n")765				;766			}767		}768 769		OTGInstPlane[mode_lib->vba.NumberOfActivePlanes] = dst->otg_inst;770 771		if (j == 0)772			mode_lib->vba.UseMaximumVStartup = dst->use_maximum_vstartup;773		else774			mode_lib->vba.UseMaximumVStartup = mode_lib->vba.UseMaximumVStartup775									|| dst->use_maximum_vstartup;776 777		if (dst->odm_combine && !src->is_hsplit)778			dml_print(779					"ERROR: ODM Combine is specified but is_hsplit has not be specified for pipe %i\n",780					j);781 782		if (src->is_hsplit) {783			for (k = j + 1; k < mode_lib->vba.cache_num_pipes; ++k) {784				display_pipe_source_params_st *src_k = &pipes[k].pipe.src;785				display_pipe_dest_params_st *dst_k = &pipes[k].pipe.dest;786 787				if (src_k->is_hsplit && !visited[k]788						&& src->hsplit_grp == src_k->hsplit_grp) {789					mode_lib->vba.pipe_plane[k] =790							mode_lib->vba.NumberOfActivePlanes;791					mode_lib->vba.DPPPerPlane[mode_lib->vba.NumberOfActivePlanes]++;792					if (src_k->det_size_override)793						mode_lib->vba.DETBufferSizeInKByte[mode_lib->vba.NumberOfActivePlanes] = src_k->det_size_override;794					if (mode_lib->vba.SourceScan[mode_lib->vba.NumberOfActivePlanes]795							== dm_horz) {796						mode_lib->vba.ViewportWidth[mode_lib->vba.NumberOfActivePlanes] +=797								src_k->viewport_width;798						mode_lib->vba.ViewportWidthChroma[mode_lib->vba.NumberOfActivePlanes] +=799								src_k->viewport_width_c;800						mode_lib->vba.ScalerRecoutWidth[mode_lib->vba.NumberOfActivePlanes] +=801								dst_k->recout_width;802					} else {803						mode_lib->vba.ViewportHeight[mode_lib->vba.NumberOfActivePlanes] +=804								src_k->viewport_height;805						mode_lib->vba.ViewportHeightChroma[mode_lib->vba.NumberOfActivePlanes] +=806								src_k->viewport_height_c;807					}808 809					visited[k] = true;810				}811			}812		}813		if (src->viewport_width_max) {814			int hdiv_c = src->source_format >= dm_420_8 && src->source_format <= dm_422_10 ? 2 : 1;815			int vdiv_c = src->source_format >= dm_420_8 && src->source_format <= dm_420_12 ? 2 : 1;816 817			if (mode_lib->vba.ViewportWidth[mode_lib->vba.NumberOfActivePlanes] > src->viewport_width_max)818				mode_lib->vba.ViewportWidth[mode_lib->vba.NumberOfActivePlanes] = src->viewport_width_max;819			if (mode_lib->vba.ViewportHeight[mode_lib->vba.NumberOfActivePlanes] > src->viewport_height_max)820				mode_lib->vba.ViewportHeight[mode_lib->vba.NumberOfActivePlanes] = src->viewport_height_max;821			if (mode_lib->vba.ViewportWidthChroma[mode_lib->vba.NumberOfActivePlanes] > src->viewport_width_max / hdiv_c)822				mode_lib->vba.ViewportWidthChroma[mode_lib->vba.NumberOfActivePlanes] = src->viewport_width_max / hdiv_c;823			if (mode_lib->vba.ViewportHeightChroma[mode_lib->vba.NumberOfActivePlanes] > src->viewport_height_max / vdiv_c)824				mode_lib->vba.ViewportHeightChroma[mode_lib->vba.NumberOfActivePlanes] = src->viewport_height_max / vdiv_c;825		}826 827		if (pipes[j].pipe.src.immediate_flip) {828			mode_lib->vba.ImmediateFlipSupport = true;829			mode_lib->vba.ImmediateFlipRequirement[j] = dm_immediate_flip_required;830		}831 832		mode_lib->vba.NumberOfActivePlanes++;833		mode_lib->vba.NumberOfActiveSurfaces++;834	}835 836	// handle overlays through BlendingAndTiming837	// BlendingAndTiming tells you which instance to look at to get timing, the so called 'master'838 839	for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j)840		PlaneVisited[j] = false;841 842	for (j = 0; j < mode_lib->vba.NumberOfActivePlanes; ++j) {843		for (k = j + 1; k < mode_lib->vba.NumberOfActivePlanes; ++k) {844			if (!PlaneVisited[k] && OTGInstPlane[j] == OTGInstPlane[k]) {845				// doesn't matter, so choose the smaller one846				mode_lib->vba.BlendingAndTiming[j] = j;847				PlaneVisited[j] = true;848				mode_lib->vba.BlendingAndTiming[k] = j;849				PlaneVisited[k] = true;850			}851		}852 853		if (!PlaneVisited[j]) {854			mode_lib->vba.BlendingAndTiming[j] = j;855			PlaneVisited[j] = true;856		}857	}858 859	mode_lib->vba.SynchronizeTimingsFinal = pipes[0].pipe.dest.synchronize_timings;860	mode_lib->vba.DCCProgrammingAssumesScanDirectionUnknownFinal = false;861 862	mode_lib->vba.DisableUnboundRequestIfCompBufReservedSpaceNeedAdjustment = 0;863 864	mode_lib->vba.UseUnboundedRequesting = dm_unbounded_requesting;865	for (k = 0; k < mode_lib->vba.cache_num_pipes; ++k) {866		if (pipes[k].pipe.src.unbounded_req_mode == 0)867			mode_lib->vba.UseUnboundedRequesting = dm_unbounded_requesting_disable;868	}869	// TODO: ODMCombineEnabled => 2 * DPPPerPlane...actually maybe not since all pipes are specified870	// Do we want the dscclk to automatically be halved? Guess not since the value is specified871	mode_lib->vba.SynchronizedVBlank = pipes[0].pipe.dest.synchronized_vblank_all_planes;872	for (k = 1; k < mode_lib->vba.cache_num_pipes; ++k) {873		ASSERT(mode_lib->vba.SynchronizedVBlank == pipes[k].pipe.dest.synchronized_vblank_all_planes);874	}875 876	mode_lib->vba.GPUVMEnable = false;877	mode_lib->vba.HostVMEnable = false;878	mode_lib->vba.OverrideGPUVMPageTableLevels = 0;879	mode_lib->vba.OverrideHostVMPageTableLevels = 0;880 881	for (k = 0; k < mode_lib->vba.cache_num_pipes; ++k) {882		mode_lib->vba.GPUVMEnable = mode_lib->vba.GPUVMEnable || !!pipes[k].pipe.src.gpuvm || !!pipes[k].pipe.src.vm;883		mode_lib->vba.OverrideGPUVMPageTableLevels =884				(pipes[k].pipe.src.gpuvm_levels_force_en885						&& mode_lib->vba.OverrideGPUVMPageTableLevels886								< pipes[k].pipe.src.gpuvm_levels_force) ?887						pipes[k].pipe.src.gpuvm_levels_force :888						mode_lib->vba.OverrideGPUVMPageTableLevels;889 890		mode_lib->vba.HostVMEnable = mode_lib->vba.HostVMEnable || !!pipes[k].pipe.src.hostvm || !!pipes[k].pipe.src.vm;891		mode_lib->vba.OverrideHostVMPageTableLevels =892				(pipes[k].pipe.src.hostvm_levels_force_en893						&& mode_lib->vba.OverrideHostVMPageTableLevels894								< pipes[k].pipe.src.hostvm_levels_force) ?895						pipes[k].pipe.src.hostvm_levels_force :896						mode_lib->vba.OverrideHostVMPageTableLevels;897	}898 899	if (mode_lib->vba.OverrideGPUVMPageTableLevels)900		mode_lib->vba.GPUVMMaxPageTableLevels = mode_lib->vba.OverrideGPUVMPageTableLevels;901 902	if (mode_lib->vba.OverrideHostVMPageTableLevels)903		mode_lib->vba.HostVMMaxPageTableLevels = mode_lib->vba.OverrideHostVMPageTableLevels;904 905	mode_lib->vba.GPUVMEnable = mode_lib->vba.GPUVMEnable && !!ip->gpuvm_enable;906	mode_lib->vba.HostVMEnable = mode_lib->vba.HostVMEnable && !!ip->hostvm_enable;907 908	for (k = 0; k < mode_lib->vba.cache_num_pipes; ++k) {909		mode_lib->vba.ForceOneRowForFrame[k] = pipes[k].pipe.src.force_one_row_for_frame;910		mode_lib->vba.PteBufferMode[k] = pipes[k].pipe.src.pte_buffer_mode;911 912		if (mode_lib->vba.PteBufferMode[k] == 0 && mode_lib->vba.GPUVMEnable) {913			if (mode_lib->vba.ForceOneRowForFrame[k] ||914				(mode_lib->vba.GPUVMMinPageSizeKBytes[k] > 64*1024) ||915				(mode_lib->vba.UsesMALLForPStateChange[k] != dm_use_mall_pstate_change_disable) ||916				(mode_lib->vba.UseMALLForStaticScreen[k] != dm_use_mall_static_screen_disable)) {917#ifdef __DML_VBA_DEBUG__918				dml_print("DML::%s: ERROR: Invalid PteBufferMode=%d for plane %0d!\n",919						__func__, mode_lib->vba.PteBufferMode[k], k);920				dml_print("DML::%s:  -  ForceOneRowForFrame     = %d\n",921						__func__, mode_lib->vba.ForceOneRowForFrame[k]);922				dml_print("DML::%s:  -  GPUVMMinPageSizeKBytes  = %d\n",923						__func__, mode_lib->vba.GPUVMMinPageSizeKBytes[k]);924				dml_print("DML::%s:  -  UseMALLForPStateChange  = %d\n",925						__func__, (int) mode_lib->vba.UsesMALLForPStateChange[k]);926				dml_print("DML::%s:  -  UseMALLForStaticScreen  = %d\n",927						__func__, (int) mode_lib->vba.UseMALLForStaticScreen[k]);928#endif929				ASSERT(0);930			}931		}932	}933}934 935/**936 * cache_debug_params: Cache any params that needed to be maintained from the initial validation937 * for debug purposes.938 *939 * The DML getters can modify some of the VBA params that we are interested in (for example when940 * calculating with dummy p-state latency), so cache any params here that we want for debugging941 *942 * @mode_lib: mode_lib input/output of validate call943 *944 * Return: void945 *946 */947static void cache_debug_params(struct display_mode_lib *mode_lib)948{949	int k = 0;950 951	for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; k++)952		mode_lib->vba.CachedActiveDRAMClockChangeLatencyMargin[k] = mode_lib->vba.ActiveDRAMClockChangeLatencyMargin[k];953}954 955// in wm mode we pull the parameters needed from the display_e2e_pipe_params_st structs956// rather than working them out as in recalculate_ms957static void recalculate_params(958		struct display_mode_lib *mode_lib,959		const display_e2e_pipe_params_st *pipes,960		unsigned int num_pipes)961{962	// This is only safe to use memcmp because there are non-POD types in struct display_mode_lib963	if (memcmp(&mode_lib->soc, &mode_lib->vba.soc, sizeof(mode_lib->vba.soc)) != 0964			|| memcmp(&mode_lib->ip, &mode_lib->vba.ip, sizeof(mode_lib->vba.ip)) != 0965			|| num_pipes != mode_lib->vba.cache_num_pipes966			|| memcmp(967					pipes,968					mode_lib->vba.cache_pipes,969					sizeof(display_e2e_pipe_params_st) * num_pipes) != 0) {970		mode_lib->vba.soc = mode_lib->soc;971		mode_lib->vba.ip = mode_lib->ip;972		memcpy(mode_lib->vba.cache_pipes, pipes, sizeof(*pipes) * num_pipes);973		mode_lib->vba.cache_num_pipes = num_pipes;974		mode_lib->funcs.recalculate(mode_lib);975	}976}977 978void Calculate256BBlockSizes(979		enum source_format_class SourcePixelFormat,980		enum dm_swizzle_mode SurfaceTiling,981		unsigned int BytePerPixelY,982		unsigned int BytePerPixelC,983		unsigned int *BlockHeight256BytesY,984		unsigned int *BlockHeight256BytesC,985		unsigned int *BlockWidth256BytesY,986		unsigned int *BlockWidth256BytesC)987{988	if ((SourcePixelFormat == dm_444_64 || SourcePixelFormat == dm_444_32989			|| SourcePixelFormat == dm_444_16 || SourcePixelFormat == dm_444_8)) {990		if (SurfaceTiling == dm_sw_linear) {991			*BlockHeight256BytesY = 1;992		} else if (SourcePixelFormat == dm_444_64) {993			*BlockHeight256BytesY = 4;994		} else if (SourcePixelFormat == dm_444_8) {995			*BlockHeight256BytesY = 16;996		} else {997			*BlockHeight256BytesY = 8;998		}999		*BlockWidth256BytesY = 256 / BytePerPixelY / *BlockHeight256BytesY;1000		*BlockHeight256BytesC = 0;1001		*BlockWidth256BytesC = 0;1002	} else {1003		if (SurfaceTiling == dm_sw_linear) {1004			*BlockHeight256BytesY = 1;1005			*BlockHeight256BytesC = 1;1006		} else if (SourcePixelFormat == dm_420_8) {1007			*BlockHeight256BytesY = 16;1008			*BlockHeight256BytesC = 8;1009		} else {1010			*BlockHeight256BytesY = 8;1011			*BlockHeight256BytesC = 8;1012		}1013		*BlockWidth256BytesY = 256 / BytePerPixelY / *BlockHeight256BytesY;1014		*BlockWidth256BytesC = 256 / BytePerPixelC / *BlockHeight256BytesC;1015	}1016}1017 1018bool CalculateMinAndMaxPrefetchMode(1019		enum self_refresh_affinity AllowDRAMSelfRefreshOrDRAMClockChangeInVblank,1020		unsigned int *MinPrefetchMode,1021		unsigned int *MaxPrefetchMode)1022{1023	if (AllowDRAMSelfRefreshOrDRAMClockChangeInVblank1024			== dm_neither_self_refresh_nor_mclk_switch) {1025		*MinPrefetchMode = 2;1026		*MaxPrefetchMode = 2;1027		return false;1028	} else if (AllowDRAMSelfRefreshOrDRAMClockChangeInVblank == dm_allow_self_refresh) {1029		*MinPrefetchMode = 1;1030		*MaxPrefetchMode = 1;1031		return false;1032	} else if (AllowDRAMSelfRefreshOrDRAMClockChangeInVblank1033			== dm_allow_self_refresh_and_mclk_switch) {1034		*MinPrefetchMode = 0;1035		*MaxPrefetchMode = 0;1036		return false;1037	} else if (AllowDRAMSelfRefreshOrDRAMClockChangeInVblank1038			== dm_try_to_allow_self_refresh_and_mclk_switch) {1039		*MinPrefetchMode = 0;1040		*MaxPrefetchMode = 2;1041		return false;1042	}1043	*MinPrefetchMode = 0;1044	*MaxPrefetchMode = 2;1045	return true;1046}1047 1048void PixelClockAdjustmentForProgressiveToInterlaceUnit(struct display_mode_lib *mode_lib)1049{1050	unsigned int k;1051 1052	//Progressive To Interlace Unit Effect1053	for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {1054		mode_lib->vba.PixelClockBackEnd[k] = mode_lib->vba.PixelClock[k];1055		if (mode_lib->vba.Interlace[k] == 11056				&& mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true) {1057			mode_lib->vba.PixelClock[k] = 2 * mode_lib->vba.PixelClock[k];1058		}1059	}1060}1061 1062static unsigned int CursorBppEnumToBits(enum cursor_bpp ebpp)1063{1064	switch (ebpp) {1065	case dm_cur_2bit:1066		return 2;1067	case dm_cur_32bit:1068		return 32;1069	case dm_cur_64bit:1070		return 64;1071	default:1072		return 0;1073	}1074}1075 1076void ModeSupportAndSystemConfiguration(struct display_mode_lib *mode_lib)1077{1078	soc_bounding_box_st *soc = &mode_lib->vba.soc;1079	unsigned int k;1080	unsigned int total_pipes = 0;1081	unsigned int pipe_idx = 0;1082 1083	mode_lib->vba.VoltageLevel = mode_lib->vba.cache_pipes[0].clks_cfg.voltage;1084	mode_lib->vba.ReturnBW = mode_lib->vba.ReturnBWPerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb];1085	if (mode_lib->vba.ReturnBW == 0)1086		mode_lib->vba.ReturnBW = mode_lib->vba.ReturnBWPerState[mode_lib->vba.VoltageLevel][0];1087	mode_lib->vba.FabricAndDRAMBandwidth = mode_lib->vba.FabricAndDRAMBandwidthPerState[mode_lib->vba.VoltageLevel];1088 1089	fetch_socbb_params(mode_lib);1090	fetch_ip_params(mode_lib);1091	fetch_pipe_params(mode_lib);1092 1093	mode_lib->vba.DCFCLK = mode_lib->vba.cache_pipes[0].clks_cfg.dcfclk_mhz;1094	mode_lib->vba.SOCCLK = mode_lib->vba.cache_pipes[0].clks_cfg.socclk_mhz;1095	if (mode_lib->vba.cache_pipes[0].clks_cfg.dispclk_mhz > 0.0)1096		mode_lib->vba.DISPCLK = mode_lib->vba.cache_pipes[0].clks_cfg.dispclk_mhz;1097	else1098		mode_lib->vba.DISPCLK = soc->clock_limits[mode_lib->vba.VoltageLevel].dispclk_mhz;1099 1100	// Total Available Pipes Support Check1101	for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {1102		pipe_idx = get_pipe_idx(mode_lib, k);1103		if (pipe_idx == -1) {1104			ASSERT(0);1105			continue; // skip inactive planes1106		}1107		total_pipes += mode_lib->vba.DPPPerPlane[k];1108 1109		if (mode_lib->vba.cache_pipes[pipe_idx].clks_cfg.dppclk_mhz > 0.0)1110			mode_lib->vba.DPPCLK[k] = mode_lib->vba.cache_pipes[pipe_idx].clks_cfg.dppclk_mhz;1111		else1112			mode_lib->vba.DPPCLK[k] = soc->clock_limits[mode_lib->vba.VoltageLevel].dppclk_mhz;1113	}1114	ASSERT(total_pipes <= DC__NUM_DPP__MAX);1115}1116 1117double CalculateWriteBackDISPCLK(1118		enum source_format_class WritebackPixelFormat,1119		double PixelClock,1120		double WritebackHRatio,1121		double WritebackVRatio,1122		unsigned int WritebackLumaHTaps,1123		unsigned int WritebackLumaVTaps,1124		unsigned int WritebackChromaHTaps,1125		unsigned int WritebackChromaVTaps,1126		double WritebackDestinationWidth,1127		unsigned int HTotal,1128		unsigned int WritebackChromaLineBufferWidth)1129{1130	double CalculateWriteBackDISPCLK = 1.01 * PixelClock * dml_max(1131		dml_ceil(WritebackLumaHTaps / 4.0, 1) / WritebackHRatio,1132		dml_max((WritebackLumaVTaps * dml_ceil(1.0 / WritebackVRatio, 1) * dml_ceil(WritebackDestinationWidth / 4.0, 1)1133			+ dml_ceil(WritebackDestinationWidth / 4.0, 1)) / (double) HTotal + dml_ceil(1.0 / WritebackVRatio, 1)1134			* (dml_ceil(WritebackLumaVTaps / 4.0, 1) + 4.0) / (double) HTotal,1135			dml_ceil(1.0 / WritebackVRatio, 1) * WritebackDestinationWidth / (double) HTotal));1136	if (WritebackPixelFormat != dm_444_32) {1137		CalculateWriteBackDISPCLK = dml_max(CalculateWriteBackDISPCLK, 1.01 * PixelClock * dml_max(1138			dml_ceil(WritebackChromaHTaps / 2.0, 1) / (2 * WritebackHRatio),1139			dml_max((WritebackChromaVTaps * dml_ceil(1 / (2 * WritebackVRatio), 1) * dml_ceil(WritebackDestinationWidth / 2.0 / 2.0, 1)1140				+ dml_ceil(WritebackDestinationWidth / 2.0 / WritebackChromaLineBufferWidth, 1)) / HTotal1141				+ dml_ceil(1 / (2 * WritebackVRatio), 1) * (dml_ceil(WritebackChromaVTaps / 4.0, 1) + 4) / HTotal,1142				dml_ceil(1.0 / (2 * WritebackVRatio), 1) * WritebackDestinationWidth / 2.0 / HTotal)));1143	}1144	return CalculateWriteBackDISPCLK;1145}1146 1147