xref: /openbmc/linux/drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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   * Bandwidth and Watermark calculations interface.
28   * (Refer to "DCEx_mode_support.xlsm" from Perforce.)
29   */
30  #ifndef __DCN_CALCS_H__
31  #define __DCN_CALCS_H__
32  
33  #include "bw_fixed.h"
34  #include "../dml/display_mode_lib.h"
35  
36  
37  struct dc;
38  struct dc_state;
39  
40  /*******************************************************************************
41   * DCN data structures.
42   ******************************************************************************/
43  
44  #define number_of_planes   6
45  #define number_of_planes_minus_one   5
46  #define number_of_states   4
47  #define number_of_states_plus_one   5
48  
49  #define ddr4_dram_width   64
50  #define ddr4_dram_factor_single_Channel   16
51  enum dcn_bw_defs {
52  	dcn_bw_v_min0p65,
53  	dcn_bw_v_mid0p72,
54  	dcn_bw_v_nom0p8,
55  	dcn_bw_v_max0p9,
56  	dcn_bw_v_max0p91,
57  	dcn_bw_no_support = 5,
58  	dcn_bw_yes,
59  	dcn_bw_hor,
60  	dcn_bw_vert,
61  	dcn_bw_override,
62  	dcn_bw_rgb_sub_64,
63  	dcn_bw_rgb_sub_32,
64  	dcn_bw_rgb_sub_16,
65  	dcn_bw_no,
66  	dcn_bw_sw_linear,
67  	dcn_bw_sw_4_kb_d,
68  	dcn_bw_sw_4_kb_d_x,
69  	dcn_bw_sw_64_kb_d,
70  	dcn_bw_sw_64_kb_d_t,
71  	dcn_bw_sw_64_kb_d_x,
72  	dcn_bw_sw_var_d,
73  	dcn_bw_sw_var_d_x,
74  	dcn_bw_yuv420_sub_8,
75  	dcn_bw_sw_4_kb_s,
76  	dcn_bw_sw_4_kb_s_x,
77  	dcn_bw_sw_64_kb_s,
78  	dcn_bw_sw_64_kb_s_t,
79  	dcn_bw_sw_64_kb_s_x,
80  	dcn_bw_writeback,
81  	dcn_bw_444,
82  	dcn_bw_dp,
83  	dcn_bw_420,
84  	dcn_bw_hdmi,
85  	dcn_bw_sw_var_s,
86  	dcn_bw_sw_var_s_x,
87  	dcn_bw_yuv420_sub_10,
88  	dcn_bw_supported_in_v_active,
89  	dcn_bw_supported_in_v_blank,
90  	dcn_bw_not_supported,
91  	dcn_bw_na,
92  	dcn_bw_encoder_8bpc,
93  	dcn_bw_encoder_10bpc,
94  	dcn_bw_encoder_12bpc,
95  	dcn_bw_encoder_16bpc,
96  };
97  
98  /*bounding box parameters*/
99  /*mode parameters*/
100  /*system configuration*/
101  /* display configuration*/
102  struct dcn_bw_internal_vars {
103  	float voltage[number_of_states_plus_one + 1];
104  	float max_dispclk[number_of_states_plus_one + 1];
105  	float max_dppclk[number_of_states_plus_one + 1];
106  	float dcfclk_per_state[number_of_states_plus_one + 1];
107  	float phyclk_per_state[number_of_states_plus_one + 1];
108  	float fabric_and_dram_bandwidth_per_state[number_of_states_plus_one + 1];
109  	float sr_exit_time;
110  	float sr_enter_plus_exit_time;
111  	float dram_clock_change_latency;
112  	float urgent_latency;
113  	float write_back_latency;
114  	float percent_of_ideal_drambw_received_after_urg_latency;
115  	float dcfclkv_max0p9;
116  	float dcfclkv_nom0p8;
117  	float dcfclkv_mid0p72;
118  	float dcfclkv_min0p65;
119  	float max_dispclk_vmax0p9;
120  	float max_dppclk_vmax0p9;
121  	float max_dispclk_vnom0p8;
122  	float max_dppclk_vnom0p8;
123  	float max_dispclk_vmid0p72;
124  	float max_dppclk_vmid0p72;
125  	float max_dispclk_vmin0p65;
126  	float max_dppclk_vmin0p65;
127  	float socclk;
128  	float fabric_and_dram_bandwidth_vmax0p9;
129  	float fabric_and_dram_bandwidth_vnom0p8;
130  	float fabric_and_dram_bandwidth_vmid0p72;
131  	float fabric_and_dram_bandwidth_vmin0p65;
132  	float round_trip_ping_latency_cycles;
133  	float urgent_out_of_order_return_per_channel;
134  	float number_of_channels;
135  	float vmm_page_size;
136  	float return_bus_width;
137  	float rob_buffer_size_in_kbyte;
138  	float det_buffer_size_in_kbyte;
139  	float dpp_output_buffer_pixels;
140  	float opp_output_buffer_lines;
141  	float pixel_chunk_size_in_kbyte;
142  	float pte_chunk_size;
143  	float meta_chunk_size;
144  	float writeback_chunk_size;
145  	enum dcn_bw_defs odm_capability;
146  	enum dcn_bw_defs dsc_capability;
147  	float line_buffer_size;
148  	enum dcn_bw_defs is_line_buffer_bpp_fixed;
149  	float line_buffer_fixed_bpp;
150  	float max_line_buffer_lines;
151  	float writeback_luma_buffer_size;
152  	float writeback_chroma_buffer_size;
153  	float max_num_dpp;
154  	float max_num_writeback;
155  	float max_dchub_topscl_throughput;
156  	float max_pscl_tolb_throughput;
157  	float max_lb_tovscl_throughput;
158  	float max_vscl_tohscl_throughput;
159  	float max_hscl_ratio;
160  	float max_vscl_ratio;
161  	float max_hscl_taps;
162  	float max_vscl_taps;
163  	float under_scan_factor;
164  	float phyclkv_max0p9;
165  	float phyclkv_nom0p8;
166  	float phyclkv_mid0p72;
167  	float phyclkv_min0p65;
168  	float pte_buffer_size_in_requests;
169  	float dispclk_ramping_margin;
170  	float downspreading;
171  	float max_inter_dcn_tile_repeaters;
172  	enum dcn_bw_defs can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one;
173  	enum dcn_bw_defs bug_forcing_luma_and_chroma_request_to_same_size_fixed;
174  	int mode;
175  	float viewport_width[number_of_planes_minus_one + 1];
176  	float htotal[number_of_planes_minus_one + 1];
177  	float vtotal[number_of_planes_minus_one + 1];
178  	float v_sync_plus_back_porch[number_of_planes_minus_one + 1];
179  	float vactive[number_of_planes_minus_one + 1];
180  	float pixel_clock[number_of_planes_minus_one + 1]; /*MHz*/
181  	float viewport_height[number_of_planes_minus_one + 1];
182  	enum dcn_bw_defs dcc_enable[number_of_planes_minus_one + 1];
183  	float dcc_rate[number_of_planes_minus_one + 1];
184  	enum dcn_bw_defs source_scan[number_of_planes_minus_one + 1];
185  	float lb_bit_per_pixel[number_of_planes_minus_one + 1];
186  	enum dcn_bw_defs source_pixel_format[number_of_planes_minus_one + 1];
187  	enum dcn_bw_defs source_surface_mode[number_of_planes_minus_one + 1];
188  	enum dcn_bw_defs output_format[number_of_planes_minus_one + 1];
189  	enum dcn_bw_defs output_deep_color[number_of_planes_minus_one + 1];
190  	enum dcn_bw_defs output[number_of_planes_minus_one + 1];
191  	float scaler_rec_out_width[number_of_planes_minus_one + 1];
192  	float scaler_recout_height[number_of_planes_minus_one + 1];
193  	float underscan_output[number_of_planes_minus_one + 1];
194  	float interlace_output[number_of_planes_minus_one + 1];
195  	float override_hta_ps[number_of_planes_minus_one + 1];
196  	float override_vta_ps[number_of_planes_minus_one + 1];
197  	float override_hta_pschroma[number_of_planes_minus_one + 1];
198  	float override_vta_pschroma[number_of_planes_minus_one + 1];
199  	float urgent_latency_support_us[number_of_planes_minus_one + 1];
200  	float h_ratio[number_of_planes_minus_one + 1];
201  	float v_ratio[number_of_planes_minus_one + 1];
202  	float htaps[number_of_planes_minus_one + 1];
203  	float vtaps[number_of_planes_minus_one + 1];
204  	float hta_pschroma[number_of_planes_minus_one + 1];
205  	float vta_pschroma[number_of_planes_minus_one + 1];
206  	enum dcn_bw_defs pte_enable;
207  	enum dcn_bw_defs synchronized_vblank;
208  	enum dcn_bw_defs ta_pscalculation;
209  	int voltage_override_level;
210  	int number_of_active_planes;
211  	int voltage_level;
212  	enum dcn_bw_defs immediate_flip_supported;
213  	float dcfclk;
214  	float max_phyclk;
215  	float fabric_and_dram_bandwidth;
216  	float dpp_per_plane_per_ratio[1 + 1][number_of_planes_minus_one + 1];
217  	enum dcn_bw_defs dispclk_dppclk_support_per_ratio[1 + 1];
218  	float required_dispclk_per_ratio[1 + 1];
219  	enum dcn_bw_defs error_message[1 + 1];
220  	int dispclk_dppclk_ratio;
221  	float dpp_per_plane[number_of_planes_minus_one + 1];
222  	float det_buffer_size_y[number_of_planes_minus_one + 1];
223  	float det_buffer_size_c[number_of_planes_minus_one + 1];
224  	float swath_height_y[number_of_planes_minus_one + 1];
225  	float swath_height_c[number_of_planes_minus_one + 1];
226  	enum dcn_bw_defs final_error_message;
227  	float frequency;
228  	float header_line;
229  	float header;
230  	enum dcn_bw_defs voltage_override;
231  	enum dcn_bw_defs allow_different_hratio_vratio;
232  	float acceptable_quality_hta_ps;
233  	float acceptable_quality_vta_ps;
234  	float no_of_dpp[number_of_states_plus_one + 1][1 + 1][number_of_planes_minus_one + 1];
235  	float swath_width_yper_state[number_of_states_plus_one + 1][1 + 1][number_of_planes_minus_one + 1];
236  	float swath_height_yper_state[number_of_states_plus_one + 1][1 + 1][number_of_planes_minus_one + 1];
237  	float swath_height_cper_state[number_of_states_plus_one + 1][1 + 1][number_of_planes_minus_one + 1];
238  	float urgent_latency_support_us_per_state[number_of_states_plus_one + 1][1 + 1][number_of_planes_minus_one + 1];
239  	float v_ratio_pre_ywith_immediate_flip[number_of_states_plus_one + 1][1 + 1][number_of_planes_minus_one + 1];
240  	float v_ratio_pre_cwith_immediate_flip[number_of_states_plus_one + 1][1 + 1][number_of_planes_minus_one + 1];
241  	float required_prefetch_pixel_data_bw_with_immediate_flip[number_of_states_plus_one + 1][1 + 1][number_of_planes_minus_one + 1];
242  	float v_ratio_pre_ywithout_immediate_flip[number_of_states_plus_one + 1][1 + 1][number_of_planes_minus_one + 1];
243  	float v_ratio_pre_cwithout_immediate_flip[number_of_states_plus_one + 1][1 + 1][number_of_planes_minus_one + 1];
244  	float required_prefetch_pixel_data_bw_without_immediate_flip[number_of_states_plus_one + 1][1 + 1][number_of_planes_minus_one + 1];
245  	enum dcn_bw_defs prefetch_supported_with_immediate_flip[number_of_states_plus_one + 1][1 + 1];
246  	enum dcn_bw_defs prefetch_supported_without_immediate_flip[number_of_states_plus_one + 1][1 + 1];
247  	enum dcn_bw_defs v_ratio_in_prefetch_supported_with_immediate_flip[number_of_states_plus_one + 1][1 + 1];
248  	enum dcn_bw_defs v_ratio_in_prefetch_supported_without_immediate_flip[number_of_states_plus_one + 1][1 + 1];
249  	float required_dispclk[number_of_states_plus_one + 1][1 + 1];
250  	enum dcn_bw_defs dispclk_dppclk_support[number_of_states_plus_one + 1][1 + 1];
251  	enum dcn_bw_defs total_available_pipes_support[number_of_states_plus_one + 1][1 + 1];
252  	float total_number_of_active_dpp[number_of_states_plus_one + 1][1 + 1];
253  	float total_number_of_dcc_active_dpp[number_of_states_plus_one + 1][1 + 1];
254  	enum dcn_bw_defs urgent_latency_support[number_of_states_plus_one + 1][1 + 1];
255  	enum dcn_bw_defs mode_support_with_immediate_flip[number_of_states_plus_one + 1][1 + 1];
256  	enum dcn_bw_defs mode_support_without_immediate_flip[number_of_states_plus_one + 1][1 + 1];
257  	float return_bw_per_state[number_of_states_plus_one + 1];
258  	enum dcn_bw_defs dio_support[number_of_states_plus_one + 1];
259  	float urgent_round_trip_and_out_of_order_latency_per_state[number_of_states_plus_one + 1];
260  	enum dcn_bw_defs rob_support[number_of_states_plus_one + 1];
261  	enum dcn_bw_defs bandwidth_support[number_of_states_plus_one + 1];
262  	float prefetch_bw[number_of_planes_minus_one + 1];
263  	float meta_pte_bytes_per_frame[number_of_planes_minus_one + 1];
264  	float meta_row_bytes[number_of_planes_minus_one + 1];
265  	float dpte_bytes_per_row[number_of_planes_minus_one + 1];
266  	float prefetch_lines_y[number_of_planes_minus_one + 1];
267  	float prefetch_lines_c[number_of_planes_minus_one + 1];
268  	float max_num_sw_y[number_of_planes_minus_one + 1];
269  	float max_num_sw_c[number_of_planes_minus_one + 1];
270  	float line_times_for_prefetch[number_of_planes_minus_one + 1];
271  	float lines_for_meta_pte_with_immediate_flip[number_of_planes_minus_one + 1];
272  	float lines_for_meta_pte_without_immediate_flip[number_of_planes_minus_one + 1];
273  	float lines_for_meta_and_dpte_row_with_immediate_flip[number_of_planes_minus_one + 1];
274  	float lines_for_meta_and_dpte_row_without_immediate_flip[number_of_planes_minus_one + 1];
275  	float min_dppclk_using_single_dpp[number_of_planes_minus_one + 1];
276  	float swath_width_ysingle_dpp[number_of_planes_minus_one + 1];
277  	float byte_per_pixel_in_dety[number_of_planes_minus_one + 1];
278  	float byte_per_pixel_in_detc[number_of_planes_minus_one + 1];
279  	float number_of_dpp_required_for_det_and_lb_size[number_of_planes_minus_one + 1];
280  	float required_phyclk[number_of_planes_minus_one + 1];
281  	float read256_block_height_y[number_of_planes_minus_one + 1];
282  	float read256_block_width_y[number_of_planes_minus_one + 1];
283  	float read256_block_height_c[number_of_planes_minus_one + 1];
284  	float read256_block_width_c[number_of_planes_minus_one + 1];
285  	float max_swath_height_y[number_of_planes_minus_one + 1];
286  	float max_swath_height_c[number_of_planes_minus_one + 1];
287  	float min_swath_height_y[number_of_planes_minus_one + 1];
288  	float min_swath_height_c[number_of_planes_minus_one + 1];
289  	float read_bandwidth[number_of_planes_minus_one + 1];
290  	float write_bandwidth[number_of_planes_minus_one + 1];
291  	float pscl_factor[number_of_planes_minus_one + 1];
292  	float pscl_factor_chroma[number_of_planes_minus_one + 1];
293  	enum dcn_bw_defs scale_ratio_support;
294  	enum dcn_bw_defs source_format_pixel_and_scan_support;
295  	float total_read_bandwidth_consumed_gbyte_per_second;
296  	float total_write_bandwidth_consumed_gbyte_per_second;
297  	float total_bandwidth_consumed_gbyte_per_second;
298  	enum dcn_bw_defs dcc_enabled_in_any_plane;
299  	float return_bw_todcn_per_state;
300  	float critical_point;
301  	enum dcn_bw_defs writeback_latency_support;
302  	float required_output_bw;
303  	float total_number_of_active_writeback;
304  	enum dcn_bw_defs total_available_writeback_support;
305  	float maximum_swath_width;
306  	float number_of_dpp_required_for_det_size;
307  	float number_of_dpp_required_for_lb_size;
308  	float min_dispclk_using_single_dpp;
309  	float min_dispclk_using_dual_dpp;
310  	enum dcn_bw_defs viewport_size_support;
311  	float swath_width_granularity_y;
312  	float rounded_up_max_swath_size_bytes_y;
313  	float swath_width_granularity_c;
314  	float rounded_up_max_swath_size_bytes_c;
315  	float lines_in_det_luma;
316  	float lines_in_det_chroma;
317  	float effective_lb_latency_hiding_source_lines_luma;
318  	float effective_lb_latency_hiding_source_lines_chroma;
319  	float effective_detlb_lines_luma;
320  	float effective_detlb_lines_chroma;
321  	float projected_dcfclk_deep_sleep;
322  	float meta_req_height_y;
323  	float meta_req_width_y;
324  	float meta_surface_width_y;
325  	float meta_surface_height_y;
326  	float meta_pte_bytes_per_frame_y;
327  	float meta_row_bytes_y;
328  	float macro_tile_block_size_bytes_y;
329  	float macro_tile_block_height_y;
330  	float data_pte_req_height_y;
331  	float data_pte_req_width_y;
332  	float dpte_bytes_per_row_y;
333  	float meta_req_height_c;
334  	float meta_req_width_c;
335  	float meta_surface_width_c;
336  	float meta_surface_height_c;
337  	float meta_pte_bytes_per_frame_c;
338  	float meta_row_bytes_c;
339  	float macro_tile_block_size_bytes_c;
340  	float macro_tile_block_height_c;
341  	float macro_tile_block_width_c;
342  	float data_pte_req_height_c;
343  	float data_pte_req_width_c;
344  	float dpte_bytes_per_row_c;
345  	float v_init_y;
346  	float max_partial_sw_y;
347  	float v_init_c;
348  	float max_partial_sw_c;
349  	float dst_x_after_scaler;
350  	float dst_y_after_scaler;
351  	float time_calc;
352  	float v_update_offset[number_of_planes_minus_one + 1][2];
353  	float total_repeater_delay;
354  	float v_update_width[number_of_planes_minus_one + 1][2];
355  	float v_ready_offset[number_of_planes_minus_one + 1][2];
356  	float time_setup;
357  	float extra_latency;
358  	float maximum_vstartup;
359  	float bw_available_for_immediate_flip;
360  	float total_immediate_flip_bytes[number_of_planes_minus_one + 1];
361  	float time_for_meta_pte_with_immediate_flip;
362  	float time_for_meta_pte_without_immediate_flip;
363  	float time_for_meta_and_dpte_row_with_immediate_flip;
364  	float time_for_meta_and_dpte_row_without_immediate_flip;
365  	float line_times_to_request_prefetch_pixel_data_with_immediate_flip;
366  	float line_times_to_request_prefetch_pixel_data_without_immediate_flip;
367  	float maximum_read_bandwidth_with_prefetch_with_immediate_flip;
368  	float maximum_read_bandwidth_with_prefetch_without_immediate_flip;
369  	float voltage_level_with_immediate_flip;
370  	float voltage_level_without_immediate_flip;
371  	float total_number_of_active_dpp_per_ratio[1 + 1];
372  	float byte_per_pix_dety;
373  	float byte_per_pix_detc;
374  	float read256_bytes_block_height_y;
375  	float read256_bytes_block_width_y;
376  	float read256_bytes_block_height_c;
377  	float read256_bytes_block_width_c;
378  	float maximum_swath_height_y;
379  	float maximum_swath_height_c;
380  	float minimum_swath_height_y;
381  	float minimum_swath_height_c;
382  	float swath_width;
383  	float prefetch_bandwidth[number_of_planes_minus_one + 1];
384  	float v_init_pre_fill_y[number_of_planes_minus_one + 1];
385  	float v_init_pre_fill_c[number_of_planes_minus_one + 1];
386  	float max_num_swath_y[number_of_planes_minus_one + 1];
387  	float max_num_swath_c[number_of_planes_minus_one + 1];
388  	float prefill_y[number_of_planes_minus_one + 1];
389  	float prefill_c[number_of_planes_minus_one + 1];
390  	float v_startup[number_of_planes_minus_one + 1];
391  	enum dcn_bw_defs allow_dram_clock_change_during_vblank[number_of_planes_minus_one + 1];
392  	float allow_dram_self_refresh_during_vblank[number_of_planes_minus_one + 1];
393  	float v_ratio_prefetch_y[number_of_planes_minus_one + 1];
394  	float v_ratio_prefetch_c[number_of_planes_minus_one + 1];
395  	float destination_lines_for_prefetch[number_of_planes_minus_one + 1];
396  	float destination_lines_to_request_vm_inv_blank[number_of_planes_minus_one + 1];
397  	float destination_lines_to_request_row_in_vblank[number_of_planes_minus_one + 1];
398  	float min_ttuv_blank[number_of_planes_minus_one + 1];
399  	float byte_per_pixel_dety[number_of_planes_minus_one + 1];
400  	float byte_per_pixel_detc[number_of_planes_minus_one + 1];
401  	float swath_width_y[number_of_planes_minus_one + 1];
402  	float lines_in_dety[number_of_planes_minus_one + 1];
403  	float lines_in_dety_rounded_down_to_swath[number_of_planes_minus_one + 1];
404  	float lines_in_detc[number_of_planes_minus_one + 1];
405  	float lines_in_detc_rounded_down_to_swath[number_of_planes_minus_one + 1];
406  	float full_det_buffering_time_y[number_of_planes_minus_one + 1];
407  	float full_det_buffering_time_c[number_of_planes_minus_one + 1];
408  	float active_dram_clock_change_latency_margin[number_of_planes_minus_one + 1];
409  	float v_blank_dram_clock_change_latency_margin[number_of_planes_minus_one + 1];
410  	float dcfclk_deep_sleep_per_plane[number_of_planes_minus_one + 1];
411  	float read_bandwidth_plane_luma[number_of_planes_minus_one + 1];
412  	float read_bandwidth_plane_chroma[number_of_planes_minus_one + 1];
413  	float display_pipe_line_delivery_time_luma[number_of_planes_minus_one + 1];
414  	float display_pipe_line_delivery_time_chroma[number_of_planes_minus_one + 1];
415  	float display_pipe_line_delivery_time_luma_prefetch[number_of_planes_minus_one + 1];
416  	float display_pipe_line_delivery_time_chroma_prefetch[number_of_planes_minus_one + 1];
417  	float pixel_pte_bytes_per_row[number_of_planes_minus_one + 1];
418  	float meta_pte_bytes_frame[number_of_planes_minus_one + 1];
419  	float meta_row_byte[number_of_planes_minus_one + 1];
420  	float prefetch_source_lines_y[number_of_planes_minus_one + 1];
421  	float prefetch_source_lines_c[number_of_planes_minus_one + 1];
422  	float pscl_throughput[number_of_planes_minus_one + 1];
423  	float pscl_throughput_chroma[number_of_planes_minus_one + 1];
424  	float output_bpphdmi[number_of_planes_minus_one + 1];
425  	float output_bppdp4_lane_hbr[number_of_planes_minus_one + 1];
426  	float output_bppdp4_lane_hbr2[number_of_planes_minus_one + 1];
427  	float output_bppdp4_lane_hbr3[number_of_planes_minus_one + 1];
428  	float max_vstartup_lines[number_of_planes_minus_one + 1];
429  	float dispclk_with_ramping;
430  	float dispclk_without_ramping;
431  	float dppclk_using_single_dpp_luma;
432  	float dppclk_using_single_dpp;
433  	float dppclk_using_single_dpp_chroma;
434  	enum dcn_bw_defs odm_capable;
435  	float dispclk;
436  	float dppclk;
437  	float return_bandwidth_to_dcn;
438  	enum dcn_bw_defs dcc_enabled_any_plane;
439  	float return_bw;
440  	float critical_compression;
441  	float total_data_read_bandwidth;
442  	float total_active_dpp;
443  	float total_dcc_active_dpp;
444  	float urgent_round_trip_and_out_of_order_latency;
445  	float last_pixel_of_line_extra_watermark;
446  	float data_fabric_line_delivery_time_luma;
447  	float data_fabric_line_delivery_time_chroma;
448  	float urgent_extra_latency;
449  	float urgent_watermark;
450  	float ptemeta_urgent_watermark;
451  	float dram_clock_change_watermark;
452  	float total_active_writeback;
453  	float writeback_dram_clock_change_watermark;
454  	float min_full_det_buffering_time;
455  	float frame_time_for_min_full_det_buffering_time;
456  	float average_read_bandwidth_gbyte_per_second;
457  	float part_of_burst_that_fits_in_rob;
458  	float stutter_burst_time;
459  	float stutter_efficiency_not_including_vblank;
460  	float smallest_vblank;
461  	float v_blank_time;
462  	float stutter_efficiency;
463  	float dcf_clk_deep_sleep;
464  	float stutter_exit_watermark;
465  	float stutter_enter_plus_exit_watermark;
466  	float effective_det_plus_lb_lines_luma;
467  	float urgent_latency_support_us_luma;
468  	float effective_det_plus_lb_lines_chroma;
469  	float urgent_latency_support_us_chroma;
470  	float min_urgent_latency_support_us;
471  	float non_urgent_latency_tolerance;
472  	float block_height256_bytes_y;
473  	float block_height256_bytes_c;
474  	float meta_request_width_y;
475  	float meta_surf_width_y;
476  	float meta_surf_height_y;
477  	float meta_pte_bytes_frame_y;
478  	float meta_row_byte_y;
479  	float macro_tile_size_byte_y;
480  	float macro_tile_height_y;
481  	float pixel_pte_req_height_y;
482  	float pixel_pte_req_width_y;
483  	float pixel_pte_bytes_per_row_y;
484  	float meta_request_width_c;
485  	float meta_surf_width_c;
486  	float meta_surf_height_c;
487  	float meta_pte_bytes_frame_c;
488  	float meta_row_byte_c;
489  	float macro_tile_size_bytes_c;
490  	float macro_tile_height_c;
491  	float pixel_pte_req_height_c;
492  	float pixel_pte_req_width_c;
493  	float pixel_pte_bytes_per_row_c;
494  	float max_partial_swath_y;
495  	float max_partial_swath_c;
496  	float t_calc;
497  	float next_prefetch_mode;
498  	float v_startup_lines;
499  	enum dcn_bw_defs planes_with_room_to_increase_vstartup_prefetch_bw_less_than_active_bw;
500  	enum dcn_bw_defs planes_with_room_to_increase_vstartup_vratio_prefetch_more_than4;
501  	enum dcn_bw_defs planes_with_room_to_increase_vstartup_destination_line_times_for_prefetch_less_than2;
502  	enum dcn_bw_defs v_ratio_prefetch_more_than4;
503  	enum dcn_bw_defs destination_line_times_for_prefetch_less_than2;
504  	float prefetch_mode;
505  	float dstx_after_scaler;
506  	float dsty_after_scaler;
507  	float v_update_offset_pix[number_of_planes_minus_one + 1];
508  	float total_repeater_delay_time;
509  	float v_update_width_pix[number_of_planes_minus_one + 1];
510  	float v_ready_offset_pix[number_of_planes_minus_one + 1];
511  	float t_setup;
512  	float t_wait;
513  	float bandwidth_available_for_immediate_flip;
514  	float tot_immediate_flip_bytes;
515  	float max_rd_bandwidth;
516  	float time_for_fetching_meta_pte;
517  	float time_for_fetching_row_in_vblank;
518  	float lines_to_request_prefetch_pixel_data;
519  	float required_prefetch_pix_data_bw;
520  	enum dcn_bw_defs prefetch_mode_supported;
521  	float active_dp_ps;
522  	float lb_latency_hiding_source_lines_y;
523  	float lb_latency_hiding_source_lines_c;
524  	float effective_lb_latency_hiding_y;
525  	float effective_lb_latency_hiding_c;
526  	float dpp_output_buffer_lines_y;
527  	float dpp_output_buffer_lines_c;
528  	float dppopp_buffering_y;
529  	float max_det_buffering_time_y;
530  	float active_dram_clock_change_latency_margin_y;
531  	float dppopp_buffering_c;
532  	float max_det_buffering_time_c;
533  	float active_dram_clock_change_latency_margin_c;
534  	float writeback_dram_clock_change_latency_margin;
535  	float min_active_dram_clock_change_margin;
536  	float v_blank_of_min_active_dram_clock_change_margin;
537  	float second_min_active_dram_clock_change_margin;
538  	float min_vblank_dram_clock_change_margin;
539  	float dram_clock_change_margin;
540  	float dram_clock_change_support;
541  	float wr_bandwidth;
542  	float max_used_bw;
543  };
544  
545  struct dcn_soc_bounding_box {
546  	float sr_exit_time; /*us*/
547  	float sr_enter_plus_exit_time; /*us*/
548  	float urgent_latency; /*us*/
549  	float write_back_latency; /*us*/
550  	float percent_of_ideal_drambw_received_after_urg_latency; /*%*/
551  	int max_request_size; /*bytes*/
552  	float dcfclkv_max0p9; /*MHz*/
553  	float dcfclkv_nom0p8; /*MHz*/
554  	float dcfclkv_mid0p72; /*MHz*/
555  	float dcfclkv_min0p65; /*MHz*/
556  	float max_dispclk_vmax0p9; /*MHz*/
557  	float max_dispclk_vmid0p72; /*MHz*/
558  	float max_dispclk_vnom0p8; /*MHz*/
559  	float max_dispclk_vmin0p65; /*MHz*/
560  	float max_dppclk_vmax0p9; /*MHz*/
561  	float max_dppclk_vnom0p8; /*MHz*/
562  	float max_dppclk_vmid0p72; /*MHz*/
563  	float max_dppclk_vmin0p65; /*MHz*/
564  	float socclk; /*MHz*/
565  	float fabric_and_dram_bandwidth_vmax0p9; /*GB/s*/
566  	float fabric_and_dram_bandwidth_vnom0p8; /*GB/s*/
567  	float fabric_and_dram_bandwidth_vmid0p72; /*GB/s*/
568  	float fabric_and_dram_bandwidth_vmin0p65; /*GB/s*/
569  	float phyclkv_max0p9; /*MHz*/
570  	float phyclkv_nom0p8; /*MHz*/
571  	float phyclkv_mid0p72; /*MHz*/
572  	float phyclkv_min0p65; /*MHz*/
573  	float downspreading; /*%*/
574  	int round_trip_ping_latency_cycles; /*DCFCLK Cycles*/
575  	int urgent_out_of_order_return_per_channel; /*bytes*/
576  	int number_of_channels;
577  	int vmm_page_size; /*bytes*/
578  	float dram_clock_change_latency; /*us*/
579  	int return_bus_width; /*bytes*/
580  	float percent_disp_bw_limit; /*%*/
581  };
582  extern const struct dcn_soc_bounding_box dcn10_soc_defaults;
583  
584  struct dcn_ip_params {
585  	float rob_buffer_size_in_kbyte;
586  	float det_buffer_size_in_kbyte;
587  	float dpp_output_buffer_pixels;
588  	float opp_output_buffer_lines;
589  	float pixel_chunk_size_in_kbyte;
590  	enum dcn_bw_defs pte_enable;
591  	int pte_chunk_size; /*kbytes*/
592  	int meta_chunk_size; /*kbytes*/
593  	int writeback_chunk_size; /*kbytes*/
594  	enum dcn_bw_defs odm_capability;
595  	enum dcn_bw_defs dsc_capability;
596  	int line_buffer_size; /*bit*/
597  	int max_line_buffer_lines;
598  	enum dcn_bw_defs is_line_buffer_bpp_fixed;
599  	int line_buffer_fixed_bpp;
600  	int writeback_luma_buffer_size; /*kbytes*/
601  	int writeback_chroma_buffer_size; /*kbytes*/
602  	int max_num_dpp;
603  	int max_num_writeback;
604  	int max_dchub_topscl_throughput; /*pixels/dppclk*/
605  	int max_pscl_tolb_throughput; /*pixels/dppclk*/
606  	int max_lb_tovscl_throughput; /*pixels/dppclk*/
607  	int max_vscl_tohscl_throughput; /*pixels/dppclk*/
608  	float max_hscl_ratio;
609  	float max_vscl_ratio;
610  	int max_hscl_taps;
611  	int max_vscl_taps;
612  	int pte_buffer_size_in_requests;
613  	float dispclk_ramping_margin; /*%*/
614  	float under_scan_factor;
615  	int max_inter_dcn_tile_repeaters;
616  	enum dcn_bw_defs can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one;
617  	enum dcn_bw_defs bug_forcing_luma_and_chroma_request_to_same_size_fixed;
618  	int dcfclk_cstate_latency;
619  };
620  extern const struct dcn_ip_params dcn10_ip_defaults;
621  
622  bool dcn_validate_bandwidth(
623  		struct dc *dc,
624  		struct dc_state *context,
625  		bool fast_validate);
626  
627  unsigned int dcn_find_dcfclk_suits_all(
628  	const struct dc *dc,
629  	struct dc_clocks *clocks);
630  
631  void dcn_get_soc_clks(
632  		struct dc *dc,
633  		int *min_fclk_khz,
634  		int *min_dcfclk_khz,
635  		int *socclk_khz);
636  
637  void dcn_bw_update_from_pplib_fclks(
638  		struct dc *dc,
639  		struct dm_pp_clock_levels_with_voltage *fclks);
640  void dcn_bw_update_from_pplib_dcfclks(
641  		struct dc *dc,
642  		struct dm_pp_clock_levels_with_voltage *dcfclks);
643  void dcn_bw_notify_pplib_of_wm_ranges(
644  		struct dc *dc,
645  		int min_fclk_khz,
646  		int min_dcfclk_khz,
647  		int socclk_khz);
648  void dcn_bw_sync_calcs_and_dml(struct dc *dc);
649  
650  enum source_macro_tile_size swizzle_mode_to_macro_tile_size(enum swizzle_mode_values sw_mode);
651  
652  #endif /* __DCN_CALCS_H__ */
653  
654