1 /*
2  * Copyright 2017 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * 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 OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * Authors: AMD
23  *
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 odd
36  * ways. Unless there is something clearly wrong with it the code should
37  * remain as-is as it provides us with a guarantee from HW that it is correct.
38  */
39 
40 
41 static void fetch_socbb_params(struct display_mode_lib *mode_lib);
42 static void fetch_ip_params(struct display_mode_lib *mode_lib);
43 static void fetch_pipe_params(struct display_mode_lib *mode_lib);
44 static void recalculate_params(
45 		struct display_mode_lib *mode_lib,
46 		const display_e2e_pipe_params_st *pipes,
47 		unsigned int num_pipes);
48 
49 static unsigned int CursorBppEnumToBits(enum cursor_bpp ebpp);
50 static void cache_debug_params(struct display_mode_lib *mode_lib);
51 
dml_get_voltage_level(struct display_mode_lib * mode_lib,const display_e2e_pipe_params_st * pipes,unsigned int num_pipes)52 unsigned 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)) != 0
58 			|| memcmp(&mode_lib->ip, &mode_lib->vba.ip, sizeof(mode_lib->vba.ip)) != 0
59 			|| num_pipes != mode_lib->vba.cache_num_pipes
60 			|| 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 
88 dml_get_attr_func(clk_dcf_deepsleep, mode_lib->vba.DCFCLKDeepSleep);
89 dml_get_attr_func(wm_urgent, mode_lib->vba.UrgentWatermark);
90 dml_get_attr_func(wm_memory_trip, mode_lib->vba.UrgentLatency);
91 dml_get_attr_func(wm_writeback_urgent, mode_lib->vba.WritebackUrgentWatermark);
92 dml_get_attr_func(wm_stutter_exit, mode_lib->vba.StutterExitWatermark);
93 dml_get_attr_func(wm_stutter_enter_exit, mode_lib->vba.StutterEnterPlusExitWatermark);
94 dml_get_attr_func(wm_z8_stutter_exit, mode_lib->vba.Z8StutterExitWatermark);
95 dml_get_attr_func(wm_z8_stutter_enter_exit, mode_lib->vba.Z8StutterEnterPlusExitWatermark);
96 dml_get_attr_func(stutter_efficiency_z8, mode_lib->vba.Z8StutterEfficiency);
97 dml_get_attr_func(stutter_num_bursts_z8, mode_lib->vba.Z8NumberOfStutterBurstsPerFrame);
98 dml_get_attr_func(wm_dram_clock_change, mode_lib->vba.DRAMClockChangeWatermark);
99 dml_get_attr_func(wm_writeback_dram_clock_change, mode_lib->vba.WritebackDRAMClockChangeWatermark);
100 dml_get_attr_func(stutter_efficiency, mode_lib->vba.StutterEfficiency);
101 dml_get_attr_func(stutter_efficiency_no_vblank, mode_lib->vba.StutterEfficiencyNotIncludingVBlank);
102 dml_get_attr_func(stutter_period, mode_lib->vba.StutterPeriod);
103 dml_get_attr_func(urgent_latency, mode_lib->vba.UrgentLatency);
104 dml_get_attr_func(urgent_extra_latency, mode_lib->vba.UrgentExtraLatency);
105 dml_get_attr_func(nonurgent_latency, mode_lib->vba.NonUrgentLatencyTolerance);
106 dml_get_attr_func(dram_clock_change_latency, mode_lib->vba.MinActiveDRAMClockChangeLatencySupported);
107 dml_get_attr_func(dispclk_calculated, mode_lib->vba.DISPCLK_calculated);
108 dml_get_attr_func(total_data_read_bw, mode_lib->vba.TotalDataReadBandwidth);
109 dml_get_attr_func(return_bw, mode_lib->vba.ReturnBW);
110 dml_get_attr_func(tcalc, mode_lib->vba.TCalc);
111 dml_get_attr_func(fraction_of_urgent_bandwidth, mode_lib->vba.FractionOfUrgentBandwidth);
112 dml_get_attr_func(fraction_of_urgent_bandwidth_imm_flip, mode_lib->vba.FractionOfUrgentBandwidthImmediateFlip);
113 
114 
115 dml_get_attr_func(cstate_max_cap_mode, mode_lib->vba.DCHUBBUB_ARB_CSTATE_MAX_CAP_MODE);
116 dml_get_attr_func(comp_buffer_size_kbytes, mode_lib->vba.CompressedBufferSizeInkByte);
117 dml_get_attr_func(pixel_chunk_size_in_kbyte, mode_lib->vba.PixelChunkSizeInKByte);
118 dml_get_attr_func(alpha_pixel_chunk_size_in_kbyte, mode_lib->vba.AlphaPixelChunkSizeInKByte);
119 dml_get_attr_func(meta_chunk_size_in_kbyte, mode_lib->vba.MetaChunkSize);
120 dml_get_attr_func(min_pixel_chunk_size_in_byte, mode_lib->vba.MinPixelChunkSizeBytes);
121 dml_get_attr_func(min_meta_chunk_size_in_byte, mode_lib->vba.MinMetaChunkSizeBytes);
122 dml_get_attr_func(fclk_watermark, mode_lib->vba.Watermark.FCLKChangeWatermark);
123 dml_get_attr_func(usr_retraining_watermark, mode_lib->vba.Watermark.USRRetrainingWatermark);
124 
125 dml_get_attr_func(comp_buffer_reserved_space_kbytes, mode_lib->vba.CompBufReservedSpaceKBytes);
126 dml_get_attr_func(comp_buffer_reserved_space_64bytes, mode_lib->vba.CompBufReservedSpace64B);
127 dml_get_attr_func(comp_buffer_reserved_space_zs, mode_lib->vba.CompBufReservedSpaceZs);
128 dml_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 
138 dml_get_pipe_attr_func(dsc_delay, mode_lib->vba.DSCDelay);
139 dml_get_pipe_attr_func(dppclk_calculated, mode_lib->vba.DPPCLK_calculated);
140 dml_get_pipe_attr_func(dscclk_calculated, mode_lib->vba.DSCCLK_calculated);
141 dml_get_pipe_attr_func(min_ttu_vblank, mode_lib->vba.MinTTUVBlank);
142 dml_get_pipe_attr_func(min_ttu_vblank_in_us, mode_lib->vba.MinTTUVBlank);
143 dml_get_pipe_attr_func(vratio_prefetch_l, mode_lib->vba.VRatioPrefetchY);
144 dml_get_pipe_attr_func(vratio_prefetch_c, mode_lib->vba.VRatioPrefetchC);
145 dml_get_pipe_attr_func(dst_x_after_scaler, mode_lib->vba.DSTXAfterScaler);
146 dml_get_pipe_attr_func(dst_y_after_scaler, mode_lib->vba.DSTYAfterScaler);
147 dml_get_pipe_attr_func(dst_y_per_vm_vblank, mode_lib->vba.DestinationLinesToRequestVMInVBlank);
148 dml_get_pipe_attr_func(dst_y_per_row_vblank, mode_lib->vba.DestinationLinesToRequestRowInVBlank);
149 dml_get_pipe_attr_func(dst_y_prefetch, mode_lib->vba.DestinationLinesForPrefetch);
150 dml_get_pipe_attr_func(dst_y_per_vm_flip, mode_lib->vba.DestinationLinesToRequestVMInImmediateFlip);
151 dml_get_pipe_attr_func(dst_y_per_row_flip, mode_lib->vba.DestinationLinesToRequestRowInImmediateFlip);
152 dml_get_pipe_attr_func(refcyc_per_vm_group_vblank, mode_lib->vba.TimePerVMGroupVBlank);
153 dml_get_pipe_attr_func(refcyc_per_vm_group_flip, mode_lib->vba.TimePerVMGroupFlip);
154 dml_get_pipe_attr_func(refcyc_per_vm_req_vblank, mode_lib->vba.TimePerVMRequestVBlank);
155 dml_get_pipe_attr_func(refcyc_per_vm_req_flip, mode_lib->vba.TimePerVMRequestFlip);
156 dml_get_pipe_attr_func(refcyc_per_vm_group_vblank_in_us, mode_lib->vba.TimePerVMGroupVBlank);
157 dml_get_pipe_attr_func(refcyc_per_vm_group_flip_in_us, mode_lib->vba.TimePerVMGroupFlip);
158 dml_get_pipe_attr_func(refcyc_per_vm_req_vblank_in_us, mode_lib->vba.TimePerVMRequestVBlank);
159 dml_get_pipe_attr_func(refcyc_per_vm_req_flip_in_us, mode_lib->vba.TimePerVMRequestFlip);
160 dml_get_pipe_attr_func(refcyc_per_vm_dmdata_in_us, mode_lib->vba.Tdmdl_vm);
161 dml_get_pipe_attr_func(dmdata_dl_delta_in_us, mode_lib->vba.Tdmdl);
162 dml_get_pipe_attr_func(refcyc_per_line_delivery_l_in_us, mode_lib->vba.DisplayPipeLineDeliveryTimeLuma);
163 dml_get_pipe_attr_func(refcyc_per_line_delivery_c_in_us, mode_lib->vba.DisplayPipeLineDeliveryTimeChroma);
164 dml_get_pipe_attr_func(refcyc_per_line_delivery_pre_l_in_us, mode_lib->vba.DisplayPipeLineDeliveryTimeLumaPrefetch);
165 dml_get_pipe_attr_func(refcyc_per_line_delivery_pre_c_in_us, mode_lib->vba.DisplayPipeLineDeliveryTimeChromaPrefetch);
166 dml_get_pipe_attr_func(refcyc_per_req_delivery_l_in_us, mode_lib->vba.DisplayPipeRequestDeliveryTimeLuma);
167 dml_get_pipe_attr_func(refcyc_per_req_delivery_c_in_us, mode_lib->vba.DisplayPipeRequestDeliveryTimeChroma);
168 dml_get_pipe_attr_func(refcyc_per_req_delivery_pre_l_in_us, mode_lib->vba.DisplayPipeRequestDeliveryTimeLumaPrefetch);
169 dml_get_pipe_attr_func(refcyc_per_req_delivery_pre_c_in_us, mode_lib->vba.DisplayPipeRequestDeliveryTimeChromaPrefetch);
170 dml_get_pipe_attr_func(refcyc_per_cursor_req_delivery_in_us, mode_lib->vba.CursorRequestDeliveryTime);
171 dml_get_pipe_attr_func(refcyc_per_cursor_req_delivery_pre_in_us, mode_lib->vba.CursorRequestDeliveryTimePrefetch);
172 dml_get_pipe_attr_func(refcyc_per_meta_chunk_nom_l_in_us, mode_lib->vba.TimePerMetaChunkNominal);
173 dml_get_pipe_attr_func(refcyc_per_meta_chunk_nom_c_in_us, mode_lib->vba.TimePerChromaMetaChunkNominal);
174 dml_get_pipe_attr_func(refcyc_per_meta_chunk_vblank_l_in_us, mode_lib->vba.TimePerMetaChunkVBlank);
175 dml_get_pipe_attr_func(refcyc_per_meta_chunk_vblank_c_in_us, mode_lib->vba.TimePerChromaMetaChunkVBlank);
176 dml_get_pipe_attr_func(refcyc_per_meta_chunk_flip_l_in_us, mode_lib->vba.TimePerMetaChunkFlip);
177 dml_get_pipe_attr_func(refcyc_per_meta_chunk_flip_c_in_us, mode_lib->vba.TimePerChromaMetaChunkFlip);
178 dml_get_pipe_attr_func(vstartup, mode_lib->vba.VStartup);
179 dml_get_pipe_attr_func(vupdate_offset, mode_lib->vba.VUpdateOffsetPix);
180 dml_get_pipe_attr_func(vupdate_width, mode_lib->vba.VUpdateWidthPix);
181 dml_get_pipe_attr_func(vready_offset, mode_lib->vba.VReadyOffsetPix);
182 dml_get_pipe_attr_func(vready_at_or_after_vsync, mode_lib->vba.VREADY_AT_OR_AFTER_VSYNC);
183 dml_get_pipe_attr_func(min_dst_y_next_start, mode_lib->vba.MIN_DST_Y_NEXT_START);
184 dml_get_pipe_attr_func(dst_y_per_pte_row_nom_l, mode_lib->vba.DST_Y_PER_PTE_ROW_NOM_L);
185 dml_get_pipe_attr_func(dst_y_per_pte_row_nom_c, mode_lib->vba.DST_Y_PER_PTE_ROW_NOM_C);
186 dml_get_pipe_attr_func(dst_y_per_meta_row_nom_l, mode_lib->vba.DST_Y_PER_META_ROW_NOM_L);
187 dml_get_pipe_attr_func(dst_y_per_meta_row_nom_c, mode_lib->vba.DST_Y_PER_META_ROW_NOM_C);
188 dml_get_pipe_attr_func(refcyc_per_pte_group_nom_l_in_us, mode_lib->vba.time_per_pte_group_nom_luma);
189 dml_get_pipe_attr_func(refcyc_per_pte_group_nom_c_in_us, mode_lib->vba.time_per_pte_group_nom_chroma);
190 dml_get_pipe_attr_func(refcyc_per_pte_group_vblank_l_in_us, mode_lib->vba.time_per_pte_group_vblank_luma);
191 dml_get_pipe_attr_func(refcyc_per_pte_group_vblank_c_in_us, mode_lib->vba.time_per_pte_group_vblank_chroma);
192 dml_get_pipe_attr_func(refcyc_per_pte_group_flip_l_in_us, mode_lib->vba.time_per_pte_group_flip_luma);
193 dml_get_pipe_attr_func(refcyc_per_pte_group_flip_c_in_us, mode_lib->vba.time_per_pte_group_flip_chroma);
194 dml_get_pipe_attr_func(vstartup_calculated, mode_lib->vba.VStartup);
195 dml_get_pipe_attr_func(dpte_row_height_linear_c, mode_lib->vba.dpte_row_height_linear_chroma);
196 dml_get_pipe_attr_func(swath_height_l, mode_lib->vba.SwathHeightY);
197 dml_get_pipe_attr_func(swath_height_c, mode_lib->vba.SwathHeightC);
198 dml_get_pipe_attr_func(det_stored_buffer_size_l_bytes, mode_lib->vba.DETBufferSizeY);
199 dml_get_pipe_attr_func(det_stored_buffer_size_c_bytes, mode_lib->vba.DETBufferSizeC);
200 dml_get_pipe_attr_func(dpte_group_size_in_bytes, mode_lib->vba.dpte_group_bytes);
201 dml_get_pipe_attr_func(vm_group_size_in_bytes, mode_lib->vba.vm_group_bytes);
202 dml_get_pipe_attr_func(dpte_row_height_linear_l, mode_lib->vba.dpte_row_height_linear);
203 dml_get_pipe_attr_func(pte_buffer_mode, mode_lib->vba.PTE_BUFFER_MODE);
204 dml_get_pipe_attr_func(subviewport_lines_needed_in_mall, mode_lib->vba.SubViewportLinesNeededInMALL);
205 dml_get_pipe_attr_func(surface_size_in_mall, mode_lib->vba.SurfaceSizeInMALL)
206 
get_total_immediate_flip_bytes(struct display_mode_lib * mode_lib,const display_e2e_pipe_params_st * pipes,unsigned int num_pipes)207 double 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 
get_total_immediate_flip_bw(struct display_mode_lib * mode_lib,const display_e2e_pipe_params_st * pipes,unsigned int num_pipes)216 double 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 
get_total_prefetch_bw(struct display_mode_lib * mode_lib,const display_e2e_pipe_params_st * pipes,unsigned int num_pipes)229 double 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 
get_total_surface_size_in_mall_bytes(struct display_mode_lib * mode_lib,const display_e2e_pipe_params_st * pipes,unsigned int num_pipes)243 unsigned 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 
get_pipe_idx(struct display_mode_lib * mode_lib,unsigned int plane_idx)256 static 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 
get_det_buffer_size_kbytes(struct display_mode_lib * mode_lib,const display_e2e_pipe_params_st * pipes,unsigned int num_pipes,unsigned int pipe_idx)275 double 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 size
286 
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 
get_is_phantom_pipe(struct display_mode_lib * mode_lib,const display_e2e_pipe_params_st * pipes,unsigned int num_pipes,unsigned int pipe_idx)292 bool 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 
fetch_socbb_params(struct display_mode_lib * mode_lib)304 static 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 Parameters
310 	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;   // new
370 	mode_lib->vba.DISPCLKDPPCLKVCOSpeed = soc->dispclk_dppclk_vco_speed_mhz;   // new
371 	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 will
375 	// be set to different values by the test
376 	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 
fetch_ip_params(struct display_mode_lib * mode_lib)418 static void fetch_ip_params(struct display_mode_lib *mode_lib)
419 {
420 	ip_params_st *ip = &mode_lib->vba.ip;
421 
422 	// IP Parameters
423 	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 ysed
451 	mode_lib->vba.MinPixelChunkSizeBytes = ip->min_pixel_chunk_size_bytes; // not used
452 	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 
fetch_pipe_params(struct display_mode_lib * mode_lib)515 static 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 Planes
526 	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_stationary
565 		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 this
571 		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 		else
577 			mode_lib->vba.DETBufferSizeInKByte[mode_lib->vba.NumberOfActivePlanes] = ip->det_buffer_size_kbytes;
578 		//TODO: Need to assign correct values to dp_multistream vars
579 		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 		else
637 			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_enable
700 				&& 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'll
741 		// calculate things a little more accurately
742 		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 		else
774 			mode_lib->vba.UseMaximumVStartup = mode_lib->vba.UseMaximumVStartup
775 									|| 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 BlendingAndTiming
837 	// 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 one
846 				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 specified
870 	// Do we want the dscclk to automatically be halved? Guess not since the value is specified
871 	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_en
885 						&& mode_lib->vba.OverrideGPUVMPageTableLevels
886 								< 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_en
893 						&& mode_lib->vba.OverrideHostVMPageTableLevels
894 								< 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 #endif
929 				ASSERT(0);
930 			}
931 		}
932 	}
933 }
934 
935 /**
936  * cache_debug_params: Cache any params that needed to be maintained from the initial validation
937  * for debug purposes.
938  *
939  * The DML getters can modify some of the VBA params that we are interested in (for example when
940  * calculating with dummy p-state latency), so cache any params here that we want for debugging
941  *
942  * @mode_lib: mode_lib input/output of validate call
943  *
944  * Return: void
945  *
946  */
cache_debug_params(struct display_mode_lib * mode_lib)947 static 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 structs
956 // rather than working them out as in recalculate_ms
recalculate_params(struct display_mode_lib * mode_lib,const display_e2e_pipe_params_st * pipes,unsigned int num_pipes)957 static 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_lib
963 	if (memcmp(&mode_lib->soc, &mode_lib->vba.soc, sizeof(mode_lib->vba.soc)) != 0
964 			|| memcmp(&mode_lib->ip, &mode_lib->vba.ip, sizeof(mode_lib->vba.ip)) != 0
965 			|| num_pipes != mode_lib->vba.cache_num_pipes
966 			|| 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 
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)978 void 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_32
989 			|| 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 
CalculateMinAndMaxPrefetchMode(enum self_refresh_affinity AllowDRAMSelfRefreshOrDRAMClockChangeInVblank,unsigned int * MinPrefetchMode,unsigned int * MaxPrefetchMode)1018 bool CalculateMinAndMaxPrefetchMode(
1019 		enum self_refresh_affinity AllowDRAMSelfRefreshOrDRAMClockChangeInVblank,
1020 		unsigned int *MinPrefetchMode,
1021 		unsigned int *MaxPrefetchMode)
1022 {
1023 	if (AllowDRAMSelfRefreshOrDRAMClockChangeInVblank
1024 			== 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 (AllowDRAMSelfRefreshOrDRAMClockChangeInVblank
1033 			== dm_allow_self_refresh_and_mclk_switch) {
1034 		*MinPrefetchMode = 0;
1035 		*MaxPrefetchMode = 0;
1036 		return false;
1037 	} else if (AllowDRAMSelfRefreshOrDRAMClockChangeInVblank
1038 			== 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 
PixelClockAdjustmentForProgressiveToInterlaceUnit(struct display_mode_lib * mode_lib)1048 void PixelClockAdjustmentForProgressiveToInterlaceUnit(struct display_mode_lib *mode_lib)
1049 {
1050 	unsigned int k;
1051 
1052 	//Progressive To Interlace Unit Effect
1053 	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] == 1
1056 				&& mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true) {
1057 			mode_lib->vba.PixelClock[k] = 2 * mode_lib->vba.PixelClock[k];
1058 		}
1059 	}
1060 }
1061 
CursorBppEnumToBits(enum cursor_bpp ebpp)1062 static 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 
ModeSupportAndSystemConfiguration(struct display_mode_lib * mode_lib)1076 void 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 	else
1098 		mode_lib->vba.DISPCLK = soc->clock_limits[mode_lib->vba.VoltageLevel].dispclk_mhz;
1099 
1100 	// Total Available Pipes Support Check
1101 	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 planes
1106 		}
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 		else
1112 			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 
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)1117 double 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)) / HTotal
1141 				+ 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