1  // SPDX-License-Identifier: MIT
2  //
3  // Copyright 2024 Advanced Micro Devices, Inc.
4  
5  #ifndef __DML_TOP_TYPES_H__
6  #define __DML_TOP_TYPES_H__
7  
8  #include "dml_top_display_cfg_types.h"
9  #include "dml_top_soc_parameter_types.h"
10  #include "dml_top_policy_types.h"
11  #include "dml_top_dchub_registers.h"
12  
13  #include "dmub_cmd.h"
14  
15  struct dml2_instance;
16  
17  enum dml2_status {
18  	dml2_success = 0,
19  	dml2_error_generic = 1
20  };
21  
22  enum dml2_project_id {
23  	dml2_project_invalid = 0,
24  	dml2_project_dcn4x_stage1 = 1,
25  	dml2_project_dcn4x_stage2 = 2,
26  	dml2_project_dcn4x_stage2_auto_drr_svp = 3,
27  };
28  
29  enum dml2_dram_clock_change_support {
30  	dml2_dram_clock_change_vactive = 0,
31  	dml2_dram_clock_change_vblank = 1,
32  	dml2_dram_clock_change_vblank_and_vactive = 2,
33  	dml2_dram_clock_change_drr = 3,
34  	dml2_dram_clock_change_mall_svp = 4,
35  	dml2_dram_clock_change_mall_full_frame = 6,
36  	dml2_dram_clock_change_unsupported = 7
37  };
38  
39  enum dml2_fclock_change_support {
40  	dml2_fclock_change_vactive = 0,
41  	dml2_fclock_change_vblank = 1,
42  	dml2_fclock_change_unsupported = 2
43  };
44  
45  enum dml2_output_type_and_rate__type {
46  	dml2_output_type_unknown = 0,
47  	dml2_output_type_dp = 1,
48  	dml2_output_type_edp = 2,
49  	dml2_output_type_dp2p0 = 3,
50  	dml2_output_type_hdmi = 4,
51  	dml2_output_type_hdmifrl = 5
52  };
53  
54  enum dml2_output_type_and_rate__rate {
55  	dml2_output_rate_unknown = 0,
56  	dml2_output_rate_dp_rate_hbr = 1,
57  	dml2_output_rate_dp_rate_hbr2 = 2,
58  	dml2_output_rate_dp_rate_hbr3 = 3,
59  	dml2_output_rate_dp_rate_uhbr10 = 4,
60  	dml2_output_rate_dp_rate_uhbr13p5 = 5,
61  	dml2_output_rate_dp_rate_uhbr20 = 6,
62  	dml2_output_rate_hdmi_rate_3x3 = 7,
63  	dml2_output_rate_hdmi_rate_6x3 = 8,
64  	dml2_output_rate_hdmi_rate_6x4 = 9,
65  	dml2_output_rate_hdmi_rate_8x4 = 10,
66  	dml2_output_rate_hdmi_rate_10x4 = 11,
67  	dml2_output_rate_hdmi_rate_12x4 = 12
68  };
69  
70  struct dml2_pmo_options {
71  	bool disable_vblank;
72  	bool disable_svp;
73  	bool disable_drr_var;
74  	bool disable_drr_clamped;
75  	bool disable_drr_var_when_var_active;
76  	bool disable_drr_clamped_when_var_active;
77  	bool disable_fams2;
78  	bool disable_vactive_det_fill_bw_pad; /* dml2_project_dcn4x_stage2_auto_drr_svp and above only */
79  	bool disable_dyn_odm;
80  	bool disable_dyn_odm_for_multi_stream;
81  	bool disable_dyn_odm_for_stream_with_svp;
82  };
83  
84  struct dml2_options {
85  	enum dml2_project_id project_id;
86  	struct dml2_pmo_options pmo_options;
87  };
88  
89  struct dml2_initialize_instance_in_out {
90  	struct dml2_instance *dml2_instance;
91  	struct dml2_options options;
92  	struct dml2_soc_bb soc_bb;
93  	struct dml2_ip_capabilities ip_caps;
94  
95  	struct {
96  		void *explicit_ip_bb;
97  		unsigned int explicit_ip_bb_size;
98  	} overrides;
99  };
100  
101  struct dml2_reset_instance_in_out {
102  	struct dml2_instance *dml2_instance;
103  };
104  
105  struct dml2_check_mode_supported_in_out {
106  	/*
107  	* Inputs
108  	*/
109  	struct dml2_instance *dml2_instance;
110  	const struct dml2_display_cfg *display_config;
111  
112  	/*
113  	* Outputs
114  	*/
115  	bool is_supported;
116  };
117  
118  struct dml2_mcache_surface_allocation {
119  	bool valid;
120  	/*
121  	* For iMALL, dedicated mall mcaches are required (sharing of last
122  	* slice possible), for legacy phantom or phantom without return
123  	* the only mall mcaches need to be valid.
124  	*/
125  	bool requires_dedicated_mall_mcache;
126  
127  	unsigned int num_mcaches_plane0;
128  	unsigned int num_mcaches_plane1;
129  	/*
130  	* A plane is divided into vertical slices of mcaches,
131  	* which wrap on the surface width.
132  	*
133  	* For example, if the surface width is 7680, and split into
134  	* three slices of equal width, the boundary array would contain
135  	* [2560, 5120, 7680]
136  	*
137  	* The assignments are
138  	* 0 = [0 .. 2559]
139  	* 1 = [2560 .. 5119]
140  	* 2 = [5120 .. 7679]
141  	* 0 = [7680 .. INF]
142  	* The final element implicitly is the same as the first, and
143  	* at first seems invalid since it is never referenced (since)
144  	* it is outside the surface. However, its useful when shifting
145  	* (see below).
146  	*
147  	* For any given valid mcache assignment, a shifted version, wrapped
148  	* on the surface width boundary is also assumed to be valid.
149  	*
150  	* For example, shifting [2560, 5120, 7680] by -50 results in
151  	* [2510, 5170, 7630].
152  	*
153  	* The assignments are now:
154  	* 0 = [0 .. 2509]
155  	* 1 = [2510 .. 5169]
156  	* 2 = [5170 .. 7629]
157  	* 0 = [7630 .. INF]
158  	*/
159  	int mcache_x_offsets_plane0[DML2_MAX_MCACHES + 1];
160  	int mcache_x_offsets_plane1[DML2_MAX_MCACHES + 1];
161  
162  	/*
163  	* Shift grainularity is not necessarily 1
164  	*/
165  	struct {
166  		int p0;
167  		int p1;
168  	} shift_granularity;
169  
170  	/*
171  	* MCacheIDs have global scope in the SoC, and they are stored here.
172  	* These IDs are generally not valid until all planes in a display
173  	* configuration have had their mcache requirements calculated.
174  	*/
175  	int global_mcache_ids_plane0[DML2_MAX_MCACHES + 1];
176  	int global_mcache_ids_plane1[DML2_MAX_MCACHES + 1];
177  	int global_mcache_ids_mall_plane0[DML2_MAX_MCACHES + 1];
178  	int global_mcache_ids_mall_plane1[DML2_MAX_MCACHES + 1];
179  
180  	/*
181  	* Generally, plane0/1 slices must use a disjoint set of caches
182  	* but in some cases the final segement of the two planes can
183  	* use the same cache. If plane0_plane1 is set, then this is
184  	* allowed.
185  	*
186  	* Similarly, the caches allocated to MALL prefetcher are generally
187  	* disjoint, but if mall_prefetch is set, then the final segment
188  	* between the main and the mall pixel requestor can use the same
189  	* cache.
190  	*
191  	* Note that both bits may be set at the same time.
192  	*/
193  	struct {
194  		bool mall_comb_mcache_p0;
195  		bool mall_comb_mcache_p1;
196  		bool plane0_plane1;
197  	} last_slice_sharing;
198  
199  	struct {
200  		int meta_row_bytes_plane0;
201  		int meta_row_bytes_plane1;
202  	} informative;
203  };
204  
205  enum dml2_uclk_pstate_support_method {
206  	dml2_uclk_pstate_support_method_not_supported = 0,
207  	/* hw */
208  	dml2_uclk_pstate_support_method_vactive = 1,
209  	dml2_uclk_pstate_support_method_vblank = 2,
210  	dml2_uclk_pstate_support_method_reserved_hw = 5,
211  	/* fw */
212  	dml2_uclk_pstate_support_method_fw_subvp_phantom = 6,
213  	dml2_uclk_pstate_support_method_reserved_fw = 10,
214  	/* fw w/drr */
215  	dml2_uclk_pstate_support_method_fw_vactive_drr = 11,
216  	dml2_uclk_pstate_support_method_fw_vblank_drr = 12,
217  	dml2_uclk_pstate_support_method_fw_subvp_phantom_drr = 13,
218  	dml2_uclk_pstate_support_method_reserved_fw_drr_fixed = 20,
219  	dml2_uclk_pstate_support_method_fw_drr = 21,
220  	dml2_uclk_pstate_support_method_reserved_fw_drr_var = 22,
221  
222  	dml2_uclk_pstate_support_method_count
223  };
224  
225  struct dml2_per_plane_programming {
226  	const struct dml2_plane_parameters *plane_descriptor;
227  
228  	union {
229  		struct {
230  			unsigned long dppclk_khz;
231  		} dcn4x;
232  	} min_clocks;
233  
234  	struct dml2_mcache_surface_allocation mcache_allocation;
235  
236  	// If a stream is using automatic or forced odm combine
237  	// and the stream for this plane has num_odms_required > 1
238  	// num_dpps_required is always equal to num_odms_required for
239  	// ALL planes of the stream
240  
241  	// If a stream is using odm split, then this value is always 1
242  	unsigned int num_dpps_required;
243  
244  	enum dml2_uclk_pstate_support_method uclk_pstate_support_method;
245  
246  	// MALL size requirements for MALL SS and SubVP
247  	unsigned int surface_size_mall_bytes;
248  	unsigned int svp_size_mall_bytes;
249  
250  	struct dml2_dchub_per_pipe_register_set *pipe_regs[DML2_MAX_PLANES];
251  
252  	struct {
253  		bool valid;
254  		struct dml2_plane_parameters descriptor;
255  		struct dml2_dchub_per_pipe_register_set *pipe_regs[DML2_MAX_PLANES];
256  	} phantom_plane;
257  };
258  
259  union dml2_global_sync_programming {
260  	struct {
261  		unsigned int vstartup_lines;
262  		unsigned int vupdate_offset_pixels;
263  		unsigned int vupdate_vupdate_width_pixels;
264  		unsigned int vready_offset_pixels;
265  		unsigned int pstate_keepout_start_lines;
266  	} dcn4x;
267  };
268  
269  struct dml2_per_stream_programming {
270  	const struct dml2_stream_parameters *stream_descriptor;
271  
272  	union {
273  		struct {
274  			unsigned long dscclk_khz;
275  			unsigned long dtbclk_khz;
276  			unsigned long phyclk_khz;
277  		} dcn4x;
278  	} min_clocks;
279  
280  	union dml2_global_sync_programming global_sync;
281  
282  	unsigned int num_odms_required;
283  
284  	enum dml2_uclk_pstate_support_method uclk_pstate_method;
285  
286  	struct {
287  		bool enabled;
288  		struct dml2_stream_parameters descriptor;
289  		union dml2_global_sync_programming global_sync;
290  	} phantom_stream;
291  
292  	struct dmub_fams2_stream_static_state fams2_params;
293  };
294  
295  //-----------------
296  // Mode Support Information
297  //-----------------
298  
299  struct dml2_mode_support_info {
300  	bool ModeIsSupported; //<brief Is the mode support any voltage and combine setting
301  	bool ImmediateFlipSupport; //<brief Means mode support immediate flip at the max combine setting; determine in mode support and used in mode programming
302  	// Mode Support Reason
303  	bool WritebackLatencySupport;
304  	bool ScaleRatioAndTapsSupport;
305  	bool SourceFormatPixelAndScanSupport;
306  	bool P2IWith420;
307  	bool DSCOnlyIfNecessaryWithBPP;
308  	bool DSC422NativeNotSupported;
309  	bool LinkRateDoesNotMatchDPVersion;
310  	bool LinkRateForMultistreamNotIndicated;
311  	bool BPPForMultistreamNotIndicated;
312  	bool MultistreamWithHDMIOreDP;
313  	bool MSOOrODMSplitWithNonDPLink;
314  	bool NotEnoughLanesForMSO;
315  	bool NumberOfOTGSupport;
316  	bool NumberOfHDMIFRLSupport;
317  	bool NumberOfDP2p0Support;
318  	bool WritebackScaleRatioAndTapsSupport;
319  	bool CursorSupport;
320  	bool PitchSupport;
321  	bool ViewportExceedsSurface;
322  	bool ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified;
323  	bool ImmediateFlipOrHostVMAndPStateWithMALLFullFrameOrPhantomPipe;
324  	bool InvalidCombinationOfMALLUseForPStateAndStaticScreen;
325  	bool InvalidCombinationOfMALLUseForPState;
326  	bool ExceededMALLSize;
327  	bool EnoughWritebackUnits;
328  	bool ExceededMultistreamSlots;
329  	bool NotEnoughDSCUnits;
330  	bool NotEnoughDSCSlices;
331  	bool PixelsPerLinePerDSCUnitSupport;
332  	bool DSCCLKRequiredMoreThanSupported;
333  	bool DTBCLKRequiredMoreThanSupported;
334  	bool LinkCapacitySupport;
335  	bool ROBSupport;
336  	bool OutstandingRequestsSupport;
337  	bool OutstandingRequestsUrgencyAvoidance;
338  	bool PTEBufferSizeNotExceeded;
339  	bool DCCMetaBufferSizeNotExceeded;
340  	bool TotalVerticalActiveBandwidthSupport;
341  	bool VActiveBandwidthSupport;
342  	enum dml2_fclock_change_support FCLKChangeSupport[DML2_MAX_PLANES];
343  	bool USRRetrainingSupport;
344  	bool PrefetchSupported;
345  	bool DynamicMetadataSupported;
346  	bool VRatioInPrefetchSupported;
347  	bool DISPCLK_DPPCLK_Support;
348  	bool TotalAvailablePipesSupport;
349  	bool ViewportSizeSupport;
350  	bool ImmediateFlipSupportedForState;
351  	double MaxTotalVerticalActiveAvailableBandwidth;
352  	bool MPCCombineEnable[DML2_MAX_PLANES]; /// <brief Indicate if the MPC Combine enable in the given state and optimize mpc combine setting
353  	enum dml2_odm_mode ODMMode[DML2_MAX_PLANES]; /// <brief ODM mode that is chosen in the mode check stage and will be used in mode programming stage
354  	unsigned int DPPPerSurface[DML2_MAX_PLANES]; /// <brief How many DPPs are needed drive the surface to output. If MPCC or ODMC could be 2 or 4.
355  	bool DSCEnabled[DML2_MAX_PLANES]; /// <brief Indicate if the DSC is actually required; used in mode_programming
356  	bool FECEnabled[DML2_MAX_PLANES]; /// <brief Indicate if the FEC is actually required
357  	unsigned int NumberOfDSCSlices[DML2_MAX_PLANES]; /// <brief Indicate how many slices needed to support the given mode
358  	double OutputBpp[DML2_MAX_PLANES];
359  	enum dml2_output_type_and_rate__type OutputType[DML2_MAX_PLANES];
360  	enum dml2_output_type_and_rate__rate OutputRate[DML2_MAX_PLANES];
361  	unsigned int AlignedYPitch[DML2_MAX_PLANES];
362  	unsigned int AlignedCPitch[DML2_MAX_PLANES];
363  	bool g6_temp_read_support;
364  }; // dml2_mode_support_info
365  
366  struct dml2_display_cfg_programming {
367  	struct dml2_display_cfg display_config;
368  
369  	union {
370  		struct {
371  			unsigned long dcfclk_khz;
372  			unsigned long fclk_khz;
373  			unsigned long uclk_khz;
374  			unsigned long socclk_khz;
375  			unsigned long dispclk_khz;
376  			unsigned long dcfclk_deepsleep_khz;
377  			unsigned long dpp_ref_khz;
378  		} dcn32x;
379  		struct {
380  			struct {
381  				unsigned long uclk_khz;
382  				unsigned long fclk_khz;
383  				unsigned long dcfclk_khz;
384  			} active;
385  			struct {
386  				unsigned long uclk_khz;
387  				unsigned long fclk_khz;
388  				unsigned long dcfclk_khz;
389  			} idle;
390  			struct {
391  				unsigned long uclk_khz;
392  				unsigned long fclk_khz;
393  				unsigned long dcfclk_khz;
394  			} svp_prefetch;
395  
396  			unsigned long deepsleep_dcfclk_khz;
397  			unsigned long dispclk_khz;
398  			unsigned long dpprefclk_khz;
399  			unsigned long dtbrefclk_khz;
400  			unsigned long socclk_khz;
401  
402  			struct {
403  				uint32_t dispclk_did;
404  				uint32_t dpprefclk_did;
405  				uint32_t dtbrefclk_did;
406  			} divider_ids;
407  		} dcn4x;
408  	} min_clocks;
409  
410  	bool uclk_pstate_supported;
411  	bool fclk_pstate_supported;
412  
413  	/* indicates this configuration requires FW to support */
414  	bool fams2_required;
415  	struct dmub_cmd_fams2_global_config fams2_global_config;
416  
417  	struct {
418  		bool supported_in_blank; // Changing to configurations where this is false requires stutter to be disabled during the transition
419  	} stutter;
420  
421  	struct {
422  		bool meets_eco; // Stutter cycles will meet Z8 ECO criteria
423  		bool supported_in_blank; // Changing to configurations where this is false requires Z8 to be disabled during the transition
424  	} z8_stutter;
425  
426  	struct dml2_dchub_global_register_set global_regs;
427  
428  	struct dml2_per_plane_programming plane_programming[DML2_MAX_PLANES];
429  	struct dml2_per_stream_programming stream_programming[DML2_MAX_PLANES];
430  
431  	// Don't access this structure directly, access it through plane_programming.pipe_regs
432  	struct dml2_dchub_per_pipe_register_set pipe_regs[DML2_MAX_PLANES];
433  
434  	struct {
435  		struct {
436  			double urgent_us;
437  			double writeback_urgent_us;
438  			double writeback_pstate_us;
439  			double writeback_fclk_pstate_us;
440  			double cstate_exit_us;
441  			double cstate_enter_plus_exit_us;
442  			double z8_cstate_exit_us;
443  			double z8_cstate_enter_plus_exit_us;
444  			double pstate_change_us;
445  			double fclk_pstate_change_us;
446  			double usr_retraining_us;
447  			double g6_temp_read_watermark_us;
448  		} watermarks;
449  
450  		struct {
451  			unsigned int swath_width_plane0;
452  			unsigned int swath_height_plane0;
453  			unsigned int swath_height_plane1;
454  			unsigned int dpte_row_height_plane0;
455  			unsigned int dpte_row_height_plane1;
456  			unsigned int meta_row_height_plane0;
457  			unsigned int meta_row_height_plane1;
458  		} plane_info[DML2_MAX_PLANES];
459  
460  		struct {
461  			unsigned long long total_surface_size_in_mall_bytes;
462  			unsigned int subviewport_lines_needed_in_mall[DML2_MAX_PLANES];
463  		} mall;
464  
465  		struct {
466  			double urgent_latency_us; // urgent ramp latency
467  			double max_non_urgent_latency_us;
468  			double max_urgent_latency_us;
469  			double avg_non_urgent_latency_us;
470  			double avg_urgent_latency_us;
471  			double wm_memory_trip_us;
472  			double meta_trip_memory_us;
473  			double fraction_of_urgent_bandwidth; // nom
474  			double fraction_of_urgent_bandwidth_immediate_flip;
475  			double fraction_of_urgent_bandwidth_mall;
476  			double max_active_fclk_change_latency_supported;
477  			unsigned int min_return_latency_in_dcfclk;
478  
479  			struct {
480  				struct {
481  					double sdp_bw_mbps;
482  					double dram_bw_mbps;
483  					double dram_vm_only_bw_mbps;
484  				} svp_prefetch;
485  
486  				struct {
487  					double sdp_bw_mbps;
488  					double dram_bw_mbps;
489  					double dram_vm_only_bw_mbps;
490  				} sys_active;
491  			} urg_bw_available;
492  
493  			struct {
494  				struct {
495  					double sdp_bw_mbps;
496  					double dram_bw_mbps;
497  				} svp_prefetch;
498  
499  				struct {
500  					double sdp_bw_mbps;
501  					double dram_bw_mbps;
502  				} sys_active;
503  			} avg_bw_available;
504  
505  			struct {
506  				struct {
507  					double sdp_bw_mbps;
508  					double dram_bw_mbps;
509  				} svp_prefetch;
510  
511  				struct {
512  					double sdp_bw_mbps;
513  					double dram_bw_mbps;
514  				} sys_active;
515  			} non_urg_bw_required;
516  
517  			struct {
518  				struct {
519  					double sdp_bw_mbps;
520  					double dram_bw_mbps;
521  				} svp_prefetch;
522  
523  				struct {
524  					double sdp_bw_mbps;
525  					double dram_bw_mbps;
526  				} sys_active;
527  			} non_urg_bw_required_with_flip;
528  
529  			struct {
530  				struct {
531  					double sdp_bw_mbps;
532  					double dram_bw_mbps;
533  				} svp_prefetch;
534  
535  				struct {
536  					double sdp_bw_mbps;
537  					double dram_bw_mbps;
538  				} sys_active;
539  
540  			} urg_bw_required;
541  
542  			struct {
543  				struct {
544  					double sdp_bw_mbps;
545  					double dram_bw_mbps;
546  				} svp_prefetch;
547  
548  				struct {
549  					double sdp_bw_mbps;
550  					double dram_bw_mbps;
551  				} sys_active;
552  			} urg_bw_required_with_flip;
553  
554  			struct {
555  				struct {
556  					double sdp_bw_mbps;
557  					double dram_bw_mbps;
558  				} svp_prefetch;
559  
560  				struct {
561  					double sdp_bw_mbps;
562  					double dram_bw_mbps;
563  				} sys_active;
564  			} avg_bw_required;
565  		} qos;
566  
567  		struct {
568  			unsigned long long det_size_in_kbytes[DML2_MAX_PLANES];
569  			unsigned long long DETBufferSizeY[DML2_MAX_PLANES];
570  			unsigned long long comp_buffer_size_kbytes;
571  			bool UnboundedRequestEnabled;
572  			unsigned int compbuf_reserved_space_64b;
573  		} crb;
574  
575  		struct {
576  			unsigned int max_uncompressed_block_plane0;
577  			unsigned int max_compressed_block_plane0;
578  			unsigned int independent_block_plane0;
579  			unsigned int max_uncompressed_block_plane1;
580  			unsigned int max_compressed_block_plane1;
581  			unsigned int independent_block_plane1;
582  		} dcc_control[DML2_MAX_PLANES];
583  
584  		struct {
585  			double stutter_efficiency;
586  			double stutter_efficiency_with_vblank;
587  			double stutter_num_bursts;
588  
589  			struct {
590  				double stutter_efficiency;
591  				double stutter_efficiency_with_vblank;
592  				double stutter_num_bursts;
593  				double stutter_period;
594  
595  				struct {
596  					double stutter_efficiency;
597  					double stutter_num_bursts;
598  					double stutter_period;
599  				} bestcase;
600  			} z8;
601  		} power_management;
602  
603  		struct {
604  			double min_ttu_vblank_us[DML2_MAX_PLANES];
605  			bool vready_at_or_after_vsync[DML2_MAX_PLANES];
606  			double min_dst_y_next_start[DML2_MAX_PLANES];
607  			bool cstate_max_cap_mode;
608  			bool hw_debug5;
609  			unsigned int dcfclk_deep_sleep_hysteresis;
610  			unsigned int dst_x_after_scaler[DML2_MAX_PLANES];
611  			unsigned int dst_y_after_scaler[DML2_MAX_PLANES];
612  			unsigned int prefetch_source_lines_plane0[DML2_MAX_PLANES];
613  			unsigned int prefetch_source_lines_plane1[DML2_MAX_PLANES];
614  			bool ImmediateFlipSupportedForPipe[DML2_MAX_PLANES];
615  			bool UsesMALLForStaticScreen[DML2_MAX_PLANES];
616  			unsigned int CursorDstXOffset[DML2_MAX_PLANES];
617  			unsigned int CursorDstYOffset[DML2_MAX_PLANES];
618  			unsigned int CursorChunkHDLAdjust[DML2_MAX_PLANES];
619  			unsigned int dpte_group_bytes[DML2_MAX_PLANES];
620  			unsigned int vm_group_bytes[DML2_MAX_PLANES];
621  			double DisplayPipeRequestDeliveryTimeLuma[DML2_MAX_PLANES];
622  			double DisplayPipeRequestDeliveryTimeChroma[DML2_MAX_PLANES];
623  			double DisplayPipeRequestDeliveryTimeLumaPrefetch[DML2_MAX_PLANES];
624  			double DisplayPipeRequestDeliveryTimeChromaPrefetch[DML2_MAX_PLANES];
625  			double TimePerVMGroupVBlank[DML2_MAX_PLANES];
626  			double TimePerVMGroupFlip[DML2_MAX_PLANES];
627  			double TimePerVMRequestVBlank[DML2_MAX_PLANES];
628  			double TimePerVMRequestFlip[DML2_MAX_PLANES];
629  			double Tdmdl_vm[DML2_MAX_PLANES];
630  			double Tdmdl[DML2_MAX_PLANES];
631  			unsigned int VStartup[DML2_MAX_PLANES];
632  			unsigned int VUpdateOffsetPix[DML2_MAX_PLANES];
633  			unsigned int VUpdateWidthPix[DML2_MAX_PLANES];
634  			unsigned int VReadyOffsetPix[DML2_MAX_PLANES];
635  
636  			double DST_Y_PER_PTE_ROW_NOM_L[DML2_MAX_PLANES];
637  			double DST_Y_PER_PTE_ROW_NOM_C[DML2_MAX_PLANES];
638  			double time_per_pte_group_nom_luma[DML2_MAX_PLANES];
639  			double time_per_pte_group_nom_chroma[DML2_MAX_PLANES];
640  			double time_per_pte_group_vblank_luma[DML2_MAX_PLANES];
641  			double time_per_pte_group_vblank_chroma[DML2_MAX_PLANES];
642  			double time_per_pte_group_flip_luma[DML2_MAX_PLANES];
643  			double time_per_pte_group_flip_chroma[DML2_MAX_PLANES];
644  			double VRatioPrefetchY[DML2_MAX_PLANES];
645  			double VRatioPrefetchC[DML2_MAX_PLANES];
646  			double DestinationLinesForPrefetch[DML2_MAX_PLANES];
647  			double DestinationLinesToRequestVMInVBlank[DML2_MAX_PLANES];
648  			double DestinationLinesToRequestRowInVBlank[DML2_MAX_PLANES];
649  			double DestinationLinesToRequestVMInImmediateFlip[DML2_MAX_PLANES];
650  			double DestinationLinesToRequestRowInImmediateFlip[DML2_MAX_PLANES];
651  			double DisplayPipeLineDeliveryTimeLuma[DML2_MAX_PLANES];
652  			double DisplayPipeLineDeliveryTimeChroma[DML2_MAX_PLANES];
653  			double DisplayPipeLineDeliveryTimeLumaPrefetch[DML2_MAX_PLANES];
654  			double DisplayPipeLineDeliveryTimeChromaPrefetch[DML2_MAX_PLANES];
655  
656  			double WritebackAllowDRAMClockChangeEndPosition[DML2_MAX_PLANES];
657  			double WritebackAllowFCLKChangeEndPosition[DML2_MAX_PLANES];
658  			double DSCCLK_calculated[DML2_MAX_PLANES];
659  			unsigned int BIGK_FRAGMENT_SIZE[DML2_MAX_PLANES];
660  			bool PTE_BUFFER_MODE[DML2_MAX_PLANES];
661  			double DSCDelay[DML2_MAX_PLANES];
662  			double MaxActiveDRAMClockChangeLatencySupported[DML2_MAX_PLANES];
663  			unsigned int PrefetchMode[DML2_MAX_PLANES]; // LEGACY_ONLY
664  			bool ROBUrgencyAvoidance;
665  		} misc;
666  
667  		struct dml2_mode_support_info mode_support_info;
668  		unsigned int voltage_level; // LEGACY_ONLY
669  
670  		// For DV only
671  		// This is what dml core calculated, only on the full_vp width and assume we have
672  		// unlimited # of mcache
673  		struct dml2_mcache_surface_allocation non_optimized_mcache_allocation[DML2_MAX_PLANES];
674  
675  		bool failed_mcache_validation;
676  		bool failed_dpmm;
677  		bool failed_mode_programming;
678  	} informative;
679  };
680  
681  struct dml2_build_mode_programming_in_out {
682  	/*
683  	* Inputs
684  	*/
685  	struct dml2_instance *dml2_instance;
686  	const struct dml2_display_cfg *display_config;
687  
688  	/*
689  	* Outputs
690  	*/
691  	struct dml2_display_cfg_programming *programming;
692  };
693  
694  struct dml2_build_mcache_programming_in_out {
695  	/*
696  	* Inputs
697  	*/
698  	struct dml2_instance *dml2_instance;
699  
700  	struct dml2_plane_mcache_configuration_descriptor mcache_configurations[DML2_MAX_PLANES];
701  	char num_configurations;
702  
703  	/*
704  	* Outputs
705  	*/
706  	// per_plane_pipe_mcache_regs[i][j] refers to the proper programming for the j-th pipe of the
707  	// i-th plane (from mcache_configurations)
708  	struct dml2_hubp_pipe_mcache_regs *per_plane_pipe_mcache_regs[DML2_MAX_PLANES][DML2_MAX_DCN_PIPES];
709  
710  	// It's not a good idea to reference this directly, better to use the pointer structure above instead
711  	struct dml2_hubp_pipe_mcache_regs mcache_regs_set[DML2_MAX_DCN_PIPES];
712  };
713  
714  struct dml2_unit_test_in_out {
715  	/*
716  	* Inputs
717  	*/
718  	struct dml2_instance *dml2_instance;
719  };
720  
721  
722  #endif
723