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
37struct dc;
38struct 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
51enum 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*/
102struct 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
545struct 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};
582extern const struct dcn_soc_bounding_box dcn10_soc_defaults;
583
584struct 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};
620extern const struct dcn_ip_params dcn10_ip_defaults;
621
622bool dcn_validate_bandwidth(
623		struct dc *dc,
624		struct dc_state *context,
625		bool fast_validate);
626
627unsigned int dcn_find_dcfclk_suits_all(
628	const struct dc *dc,
629	struct dc_clocks *clocks);
630
631void dcn_get_soc_clks(
632		struct dc *dc,
633		int *min_fclk_khz,
634		int *min_dcfclk_khz,
635		int *socclk_khz);
636
637void dcn_bw_update_from_pplib_fclks(
638		struct dc *dc,
639		struct dm_pp_clock_levels_with_voltage *fclks);
640void dcn_bw_update_from_pplib_dcfclks(
641		struct dc *dc,
642		struct dm_pp_clock_levels_with_voltage *dcfclks);
643void 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);
648void dcn_bw_sync_calcs_and_dml(struct dc *dc);
649
650enum source_macro_tile_size swizzle_mode_to_macro_tile_size(enum swizzle_mode_values sw_mode);
651
652#endif /* __DCN_CALCS_H__ */
653
654