2 * Copyright 2017 Advanced Micro Devices, Inc.
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:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
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.
26 #include "dm_services.h"
27 #include "dcn_calc_auto.h"
28 #include "dcn_calc_math.h"
32 * This file is gcc-parseable HW gospel, coming straight from HW engineers.
34 * It doesn't adhere to Linux kernel style and sometimes will do things in odd
35 * ways. Unless there is something clearly wrong with it the code should
36 * remain as-is as it provides us with a guarantee from HW that it is correct.
40 void scaler_settings_calculation(struct dcn_bw_internal_vars
*v
)
43 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
44 if (v
->allow_different_hratio_vratio
== dcn_bw_yes
) {
45 if (v
->source_scan
[k
] == dcn_bw_hor
) {
46 v
->h_ratio
[k
] = v
->viewport_width
[k
] / v
->scaler_rec_out_width
[k
];
47 v
->v_ratio
[k
] = v
->viewport_height
[k
] / v
->scaler_recout_height
[k
];
50 v
->h_ratio
[k
] = v
->viewport_height
[k
] / v
->scaler_rec_out_width
[k
];
51 v
->v_ratio
[k
] = v
->viewport_width
[k
] / v
->scaler_recout_height
[k
];
55 if (v
->source_scan
[k
] == dcn_bw_hor
) {
56 v
->h_ratio
[k
] =dcn_bw_max2(v
->viewport_width
[k
] / v
->scaler_rec_out_width
[k
], v
->viewport_height
[k
] / v
->scaler_recout_height
[k
]);
59 v
->h_ratio
[k
] =dcn_bw_max2(v
->viewport_height
[k
] / v
->scaler_rec_out_width
[k
], v
->viewport_width
[k
] / v
->scaler_recout_height
[k
]);
61 v
->v_ratio
[k
] = v
->h_ratio
[k
];
63 if (v
->interlace_output
[k
] == 1.0) {
64 v
->v_ratio
[k
] = 2.0 * v
->v_ratio
[k
];
66 if (v
->underscan_output
[k
] == 1.0) {
67 v
->h_ratio
[k
] = v
->h_ratio
[k
] * v
->under_scan_factor
;
68 v
->v_ratio
[k
] = v
->v_ratio
[k
] * v
->under_scan_factor
;
71 /*scaler taps calculation*/
73 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
74 if (v
->h_ratio
[k
] > 1.0) {
75 v
->acceptable_quality_hta_ps
=dcn_bw_min2(v
->max_hscl_taps
, 2.0 *dcn_bw_ceil2(v
->h_ratio
[k
], 1.0));
77 else if (v
->h_ratio
[k
] < 1.0) {
78 v
->acceptable_quality_hta_ps
= 4.0;
81 v
->acceptable_quality_hta_ps
= 1.0;
83 if (v
->ta_pscalculation
== dcn_bw_override
) {
84 v
->htaps
[k
] = v
->override_hta_ps
[k
];
87 v
->htaps
[k
] = v
->acceptable_quality_hta_ps
;
89 if (v
->v_ratio
[k
] > 1.0) {
90 v
->acceptable_quality_vta_ps
=dcn_bw_min2(v
->max_vscl_taps
, 2.0 *dcn_bw_ceil2(v
->v_ratio
[k
], 1.0));
92 else if (v
->v_ratio
[k
] < 1.0) {
93 v
->acceptable_quality_vta_ps
= 4.0;
96 v
->acceptable_quality_vta_ps
= 1.0;
98 if (v
->ta_pscalculation
== dcn_bw_override
) {
99 v
->vtaps
[k
] = v
->override_vta_ps
[k
];
102 v
->vtaps
[k
] = v
->acceptable_quality_vta_ps
;
104 if (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
|| v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_32
|| v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_16
) {
105 v
->vta_pschroma
[k
] = 0.0;
106 v
->hta_pschroma
[k
] = 0.0;
109 if (v
->ta_pscalculation
== dcn_bw_override
) {
110 v
->vta_pschroma
[k
] = v
->override_vta_pschroma
[k
];
111 v
->hta_pschroma
[k
] = v
->override_hta_pschroma
[k
];
114 v
->vta_pschroma
[k
] = v
->acceptable_quality_vta_ps
;
115 v
->hta_pschroma
[k
] = v
->acceptable_quality_hta_ps
;
121 void mode_support_and_system_configuration(struct dcn_bw_internal_vars
*v
)
126 /*mode support, voltage state and soc configuration*/
128 /*scale ratio support check*/
130 v
->scale_ratio_support
= dcn_bw_yes
;
131 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
132 if (v
->h_ratio
[k
] > v
->max_hscl_ratio
|| v
->v_ratio
[k
] > v
->max_vscl_ratio
|| v
->h_ratio
[k
] > v
->htaps
[k
] || v
->v_ratio
[k
] > v
->vtaps
[k
] || (v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_64
&& v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_32
&& v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_16
&& (v
->h_ratio
[k
] / 2.0 > v
->hta_pschroma
[k
] || v
->v_ratio
[k
] / 2.0 > v
->vta_pschroma
[k
]))) {
133 v
->scale_ratio_support
= dcn_bw_no
;
136 /*source format, pixel format and scan support check*/
138 v
->source_format_pixel_and_scan_support
= dcn_bw_yes
;
139 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
140 if ((v
->source_surface_mode
[k
] == dcn_bw_sw_linear
&& v
->source_scan
[k
] != dcn_bw_hor
) || ((v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_d
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_d_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d_t
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_var_d
|| v
->source_surface_mode
[k
] == dcn_bw_sw_var_d_x
) && v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_64
)) {
141 v
->source_format_pixel_and_scan_support
= dcn_bw_no
;
144 /*bandwidth support check*/
146 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
147 if (v
->source_scan
[k
] == dcn_bw_hor
) {
148 v
->swath_width_ysingle_dpp
[k
] = v
->viewport_width
[k
];
151 v
->swath_width_ysingle_dpp
[k
] = v
->viewport_height
[k
];
153 if (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
) {
154 v
->byte_per_pixel_in_dety
[k
] = 8.0;
155 v
->byte_per_pixel_in_detc
[k
] = 0.0;
157 else if (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_32
) {
158 v
->byte_per_pixel_in_dety
[k
] = 4.0;
159 v
->byte_per_pixel_in_detc
[k
] = 0.0;
161 else if (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_16
) {
162 v
->byte_per_pixel_in_dety
[k
] = 2.0;
163 v
->byte_per_pixel_in_detc
[k
] = 0.0;
165 else if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_8
) {
166 v
->byte_per_pixel_in_dety
[k
] = 1.0;
167 v
->byte_per_pixel_in_detc
[k
] = 2.0;
170 v
->byte_per_pixel_in_dety
[k
] = 4.0f
/ 3.0f
;
171 v
->byte_per_pixel_in_detc
[k
] = 8.0f
/ 3.0f
;
174 v
->total_read_bandwidth_consumed_gbyte_per_second
= 0.0;
175 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
176 v
->read_bandwidth
[k
] = v
->swath_width_ysingle_dpp
[k
] * (dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) * v
->v_ratio
[k
] +dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / 2.0 * v
->v_ratio
[k
] / 2) / (v
->htotal
[k
] / v
->pixel_clock
[k
]);
177 if (v
->dcc_enable
[k
] == dcn_bw_yes
) {
178 v
->read_bandwidth
[k
] = v
->read_bandwidth
[k
] * (1 + 1 / 256);
180 if (v
->pte_enable
== dcn_bw_yes
&& v
->source_scan
[k
] != dcn_bw_hor
&& (v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_d
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_d_x
)) {
181 v
->read_bandwidth
[k
] = v
->read_bandwidth
[k
] * (1 + 1 / 64);
183 else if (v
->pte_enable
== dcn_bw_yes
&& v
->source_scan
[k
] == dcn_bw_hor
&& (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
|| v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_32
) && (v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_t
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d_t
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d_x
)) {
184 v
->read_bandwidth
[k
] = v
->read_bandwidth
[k
] * (1 + 1 / 256);
186 else if (v
->pte_enable
== dcn_bw_yes
) {
187 v
->read_bandwidth
[k
] = v
->read_bandwidth
[k
] * (1 + 1 / 512);
189 v
->total_read_bandwidth_consumed_gbyte_per_second
= v
->total_read_bandwidth_consumed_gbyte_per_second
+ v
->read_bandwidth
[k
] / 1000.0;
191 v
->total_write_bandwidth_consumed_gbyte_per_second
= 0.0;
192 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
193 if (v
->output
[k
] == dcn_bw_writeback
&& v
->output_format
[k
] == dcn_bw_444
) {
194 v
->write_bandwidth
[k
] = v
->scaler_rec_out_width
[k
] / (v
->htotal
[k
] / v
->pixel_clock
[k
]) * 4.0;
196 else if (v
->output
[k
] == dcn_bw_writeback
) {
197 v
->write_bandwidth
[k
] = v
->scaler_rec_out_width
[k
] / (v
->htotal
[k
] / v
->pixel_clock
[k
]) * 1.5;
200 v
->write_bandwidth
[k
] = 0.0;
202 v
->total_write_bandwidth_consumed_gbyte_per_second
= v
->total_write_bandwidth_consumed_gbyte_per_second
+ v
->write_bandwidth
[k
] / 1000.0;
204 v
->total_bandwidth_consumed_gbyte_per_second
= v
->total_read_bandwidth_consumed_gbyte_per_second
+ v
->total_write_bandwidth_consumed_gbyte_per_second
;
205 v
->dcc_enabled_in_any_plane
= dcn_bw_no
;
206 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
207 if (v
->dcc_enable
[k
] == dcn_bw_yes
) {
208 v
->dcc_enabled_in_any_plane
= dcn_bw_yes
;
211 for (i
= 0; i
<= number_of_states_plus_one
; i
++) {
212 v
->return_bw_todcn_per_state
=dcn_bw_min2(v
->return_bus_width
* v
->dcfclk_per_state
[i
], v
->fabric_and_dram_bandwidth_per_state
[i
] * 1000.0 * v
->percent_of_ideal_drambw_received_after_urg_latency
/ 100.0);
213 v
->return_bw_per_state
[i
] = v
->return_bw_todcn_per_state
;
214 if (v
->dcc_enabled_in_any_plane
== dcn_bw_yes
&& v
->return_bw_todcn_per_state
> v
->dcfclk_per_state
[i
] * v
->return_bus_width
/ 4.0) {
215 v
->return_bw_per_state
[i
] =dcn_bw_min2(v
->return_bw_per_state
[i
], v
->return_bw_todcn_per_state
* 4.0 * (1.0 - v
->urgent_latency
/ ((v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0 / (v
->return_bw_todcn_per_state
- v
->dcfclk_per_state
[i
] * v
->return_bus_width
/ 4.0) + v
->urgent_latency
)));
217 v
->critical_point
= 2.0 * v
->return_bus_width
* v
->dcfclk_per_state
[i
] * v
->urgent_latency
/ (v
->return_bw_todcn_per_state
* v
->urgent_latency
+ (v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0);
218 if (v
->dcc_enabled_in_any_plane
== dcn_bw_yes
&& v
->critical_point
> 1.0 && v
->critical_point
< 4.0) {
219 v
->return_bw_per_state
[i
] =dcn_bw_min2(v
->return_bw_per_state
[i
], dcn_bw_pow(4.0 * v
->return_bw_todcn_per_state
* (v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0 * v
->return_bus_width
* v
->dcfclk_per_state
[i
] * v
->urgent_latency
/ (v
->return_bw_todcn_per_state
* v
->urgent_latency
+ (v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0), 2));
221 v
->return_bw_todcn_per_state
=dcn_bw_min2(v
->return_bus_width
* v
->dcfclk_per_state
[i
], v
->fabric_and_dram_bandwidth_per_state
[i
] * 1000.0);
222 if (v
->dcc_enabled_in_any_plane
== dcn_bw_yes
&& v
->return_bw_todcn_per_state
> v
->dcfclk_per_state
[i
] * v
->return_bus_width
/ 4.0) {
223 v
->return_bw_per_state
[i
] =dcn_bw_min2(v
->return_bw_per_state
[i
], v
->return_bw_todcn_per_state
* 4.0 * (1.0 - v
->urgent_latency
/ ((v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0 / (v
->return_bw_todcn_per_state
- v
->dcfclk_per_state
[i
] * v
->return_bus_width
/ 4.0) + v
->urgent_latency
)));
225 v
->critical_point
= 2.0 * v
->return_bus_width
* v
->dcfclk_per_state
[i
] * v
->urgent_latency
/ (v
->return_bw_todcn_per_state
* v
->urgent_latency
+ (v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0);
226 if (v
->dcc_enabled_in_any_plane
== dcn_bw_yes
&& v
->critical_point
> 1.0 && v
->critical_point
< 4.0) {
227 v
->return_bw_per_state
[i
] =dcn_bw_min2(v
->return_bw_per_state
[i
], dcn_bw_pow(4.0 * v
->return_bw_todcn_per_state
* (v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0 * v
->return_bus_width
* v
->dcfclk_per_state
[i
] * v
->urgent_latency
/ (v
->return_bw_todcn_per_state
* v
->urgent_latency
+ (v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0), 2));
230 for (i
= 0; i
<= number_of_states_plus_one
; i
++) {
231 if ((v
->total_read_bandwidth_consumed_gbyte_per_second
* 1000.0 <= v
->return_bw_per_state
[i
]) && (v
->total_bandwidth_consumed_gbyte_per_second
* 1000.0 <= v
->fabric_and_dram_bandwidth_per_state
[i
] * 1000.0 * v
->percent_of_ideal_drambw_received_after_urg_latency
/ 100.0)) {
232 v
->bandwidth_support
[i
] = dcn_bw_yes
;
235 v
->bandwidth_support
[i
] = dcn_bw_no
;
238 /*writeback latency support check*/
240 v
->writeback_latency_support
= dcn_bw_yes
;
241 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
242 if (v
->output
[k
] == dcn_bw_writeback
&& v
->output_format
[k
] == dcn_bw_444
&& v
->scaler_rec_out_width
[k
] / (v
->htotal
[k
] / v
->pixel_clock
[k
]) * 4.0 > (v
->writeback_luma_buffer_size
+ v
->writeback_chroma_buffer_size
) * 1024.0 / v
->write_back_latency
) {
243 v
->writeback_latency_support
= dcn_bw_no
;
245 else if (v
->output
[k
] == dcn_bw_writeback
&& v
->scaler_rec_out_width
[k
] / (v
->htotal
[k
] / v
->pixel_clock
[k
]) >dcn_bw_min2(v
->writeback_luma_buffer_size
, 2.0 * v
->writeback_chroma_buffer_size
) * 1024.0 / v
->write_back_latency
) {
246 v
->writeback_latency_support
= dcn_bw_no
;
249 /*re-ordering buffer support check*/
251 for (i
= 0; i
<= number_of_states_plus_one
; i
++) {
252 v
->urgent_round_trip_and_out_of_order_latency_per_state
[i
] = (v
->round_trip_ping_latency_cycles
+ 32.0) / v
->dcfclk_per_state
[i
] + v
->urgent_out_of_order_return_per_channel
* v
->number_of_channels
/ v
->return_bw_per_state
[i
];
253 if ((v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0 / v
->return_bw_per_state
[i
] > v
->urgent_round_trip_and_out_of_order_latency_per_state
[i
]) {
254 v
->rob_support
[i
] = dcn_bw_yes
;
257 v
->rob_support
[i
] = dcn_bw_no
;
260 /*display io support check*/
262 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
263 if (v
->output
[k
] == dcn_bw_dp
&& v
->dsc_capability
== dcn_bw_yes
) {
264 if (v
->output_format
[k
] == dcn_bw_420
) {
265 v
->required_output_bw
= v
->pixel_clock
[k
] / 2.0;
268 v
->required_output_bw
= v
->pixel_clock
[k
];
271 else if (v
->output_format
[k
] == dcn_bw_420
) {
272 v
->required_output_bw
= v
->pixel_clock
[k
] * 3.0 / 2.0;
275 v
->required_output_bw
= v
->pixel_clock
[k
] * 3.0;
277 if (v
->output
[k
] == dcn_bw_hdmi
) {
278 v
->required_phyclk
[k
] = v
->required_output_bw
;
279 switch (v
->output_deep_color
[k
]) {
280 case dcn_bw_encoder_10bpc
:
281 v
->required_phyclk
[k
] = v
->required_phyclk
[k
] * 5.0 / 4;
283 case dcn_bw_encoder_12bpc
:
284 v
->required_phyclk
[k
] = v
->required_phyclk
[k
] * 3.0 / 2;
289 v
->required_phyclk
[k
] = v
->required_phyclk
[k
] / 3.0;
291 else if (v
->output
[k
] == dcn_bw_dp
) {
292 v
->required_phyclk
[k
] = v
->required_output_bw
/ 4.0;
295 v
->required_phyclk
[k
] = 0.0;
298 for (i
= 0; i
<= number_of_states_plus_one
; i
++) {
299 v
->dio_support
[i
] = dcn_bw_yes
;
300 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
301 if (v
->required_phyclk
[k
] > v
->phyclk_per_state
[i
] || (v
->output
[k
] == dcn_bw_hdmi
&& v
->required_phyclk
[k
] > 600.0)) {
302 v
->dio_support
[i
] = dcn_bw_no
;
306 /*total available writeback support check*/
308 v
->total_number_of_active_writeback
= 0.0;
309 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
310 if (v
->output
[k
] == dcn_bw_writeback
) {
311 v
->total_number_of_active_writeback
= v
->total_number_of_active_writeback
+ 1.0;
314 if (v
->total_number_of_active_writeback
<= v
->max_num_writeback
) {
315 v
->total_available_writeback_support
= dcn_bw_yes
;
318 v
->total_available_writeback_support
= dcn_bw_no
;
320 /*maximum dispclk/dppclk support check*/
322 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
323 if (v
->h_ratio
[k
] > 1.0) {
324 v
->pscl_factor
[k
] =dcn_bw_min2(v
->max_dchub_topscl_throughput
, v
->max_pscl_tolb_throughput
* v
->h_ratio
[k
] /dcn_bw_ceil2(v
->htaps
[k
] / 6.0, 1.0));
327 v
->pscl_factor
[k
] =dcn_bw_min2(v
->max_dchub_topscl_throughput
, v
->max_pscl_tolb_throughput
);
329 if (v
->byte_per_pixel_in_detc
[k
] == 0.0) {
330 v
->pscl_factor_chroma
[k
] = 0.0;
331 v
->min_dppclk_using_single_dpp
[k
] = v
->pixel_clock
[k
] *dcn_bw_max3(v
->vtaps
[k
] / 6.0 *dcn_bw_min2(1.0, v
->h_ratio
[k
]), v
->h_ratio
[k
] * v
->v_ratio
[k
] / v
->pscl_factor
[k
], 1.0);
334 if (v
->h_ratio
[k
] / 2.0 > 1.0) {
335 v
->pscl_factor_chroma
[k
] =dcn_bw_min2(v
->max_dchub_topscl_throughput
, v
->max_pscl_tolb_throughput
* v
->h_ratio
[k
] / 2.0 /dcn_bw_ceil2(v
->hta_pschroma
[k
] / 6.0, 1.0));
338 v
->pscl_factor_chroma
[k
] =dcn_bw_min2(v
->max_dchub_topscl_throughput
, v
->max_pscl_tolb_throughput
);
340 v
->min_dppclk_using_single_dpp
[k
] = v
->pixel_clock
[k
] *dcn_bw_max5(v
->vtaps
[k
] / 6.0 *dcn_bw_min2(1.0, v
->h_ratio
[k
]), v
->h_ratio
[k
] * v
->v_ratio
[k
] / v
->pscl_factor
[k
], v
->vta_pschroma
[k
] / 6.0 *dcn_bw_min2(1.0, v
->h_ratio
[k
] / 2.0), v
->h_ratio
[k
] * v
->v_ratio
[k
] / 4.0 / v
->pscl_factor_chroma
[k
], 1.0);
343 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
344 if ((v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
|| v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_32
|| v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_16
)) {
345 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
346 v
->read256_block_height_y
[k
] = 1.0;
348 else if (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
) {
349 v
->read256_block_height_y
[k
] = 4.0;
352 v
->read256_block_height_y
[k
] = 8.0;
354 v
->read256_block_width_y
[k
] = 256.0 /dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / v
->read256_block_height_y
[k
];
355 v
->read256_block_height_c
[k
] = 0.0;
356 v
->read256_block_width_c
[k
] = 0.0;
359 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
360 v
->read256_block_height_y
[k
] = 1.0;
361 v
->read256_block_height_c
[k
] = 1.0;
363 else if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_8
) {
364 v
->read256_block_height_y
[k
] = 16.0;
365 v
->read256_block_height_c
[k
] = 8.0;
368 v
->read256_block_height_y
[k
] = 8.0;
369 v
->read256_block_height_c
[k
] = 8.0;
371 v
->read256_block_width_y
[k
] = 256.0 /dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / v
->read256_block_height_y
[k
];
372 v
->read256_block_width_c
[k
] = 256.0 /dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / v
->read256_block_height_c
[k
];
374 if (v
->source_scan
[k
] == dcn_bw_hor
) {
375 v
->max_swath_height_y
[k
] = v
->read256_block_height_y
[k
];
376 v
->max_swath_height_c
[k
] = v
->read256_block_height_c
[k
];
379 v
->max_swath_height_y
[k
] = v
->read256_block_width_y
[k
];
380 v
->max_swath_height_c
[k
] = v
->read256_block_width_c
[k
];
382 if ((v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
|| v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_32
|| v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_16
)) {
383 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
|| (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
&& (v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_t
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_var_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_var_s_x
) && v
->source_scan
[k
] == dcn_bw_hor
)) {
384 v
->min_swath_height_y
[k
] = v
->max_swath_height_y
[k
];
387 v
->min_swath_height_y
[k
] = v
->max_swath_height_y
[k
] / 2.0;
389 v
->min_swath_height_c
[k
] = v
->max_swath_height_c
[k
];
392 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
393 v
->min_swath_height_y
[k
] = v
->max_swath_height_y
[k
];
394 v
->min_swath_height_c
[k
] = v
->max_swath_height_c
[k
];
396 else if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_8
&& v
->source_scan
[k
] == dcn_bw_hor
) {
397 v
->min_swath_height_y
[k
] = v
->max_swath_height_y
[k
] / 2.0;
398 if (v
->bug_forcing_luma_and_chroma_request_to_same_size_fixed
== dcn_bw_yes
) {
399 v
->min_swath_height_c
[k
] = v
->max_swath_height_c
[k
];
402 v
->min_swath_height_c
[k
] = v
->max_swath_height_c
[k
] / 2.0;
405 else if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_10
&& v
->source_scan
[k
] == dcn_bw_hor
) {
406 v
->min_swath_height_c
[k
] = v
->max_swath_height_c
[k
] / 2.0;
407 if (v
->bug_forcing_luma_and_chroma_request_to_same_size_fixed
== dcn_bw_yes
) {
408 v
->min_swath_height_y
[k
] = v
->max_swath_height_y
[k
];
411 v
->min_swath_height_y
[k
] = v
->max_swath_height_y
[k
] / 2.0;
415 v
->min_swath_height_y
[k
] = v
->max_swath_height_y
[k
];
416 v
->min_swath_height_c
[k
] = v
->max_swath_height_c
[k
];
419 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
420 v
->maximum_swath_width
= 8192.0;
423 v
->maximum_swath_width
= 5120.0;
425 v
->number_of_dpp_required_for_det_size
=dcn_bw_ceil2(v
->swath_width_ysingle_dpp
[k
] /dcn_bw_min2(v
->maximum_swath_width
, v
->det_buffer_size_in_kbyte
* 1024.0 / 2.0 / (v
->byte_per_pixel_in_dety
[k
] * v
->min_swath_height_y
[k
] + v
->byte_per_pixel_in_detc
[k
] / 2.0 * v
->min_swath_height_c
[k
])), 1.0);
426 if (v
->byte_per_pixel_in_detc
[k
] == 0.0) {
427 v
->number_of_dpp_required_for_lb_size
=dcn_bw_ceil2((v
->vtaps
[k
] +dcn_bw_max2(dcn_bw_ceil2(v
->v_ratio
[k
], 1.0) - 2, 0.0)) * v
->swath_width_ysingle_dpp
[k
] /dcn_bw_max2(v
->h_ratio
[k
], 1.0) * v
->lb_bit_per_pixel
[k
] / v
->line_buffer_size
, 1.0);
430 v
->number_of_dpp_required_for_lb_size
=dcn_bw_max2(dcn_bw_ceil2((v
->vtaps
[k
] +dcn_bw_max2(dcn_bw_ceil2(v
->v_ratio
[k
], 1.0) - 2, 0.0)) * v
->swath_width_ysingle_dpp
[k
] /dcn_bw_max2(v
->h_ratio
[k
], 1.0) * v
->lb_bit_per_pixel
[k
] / v
->line_buffer_size
, 1.0),dcn_bw_ceil2((v
->vta_pschroma
[k
] +dcn_bw_max2(dcn_bw_ceil2(v
->v_ratio
[k
] / 2.0, 1.0) - 2, 0.0)) * v
->swath_width_ysingle_dpp
[k
] / 2.0 /dcn_bw_max2(v
->h_ratio
[k
] / 2.0, 1.0) * v
->lb_bit_per_pixel
[k
] / v
->line_buffer_size
, 1.0));
432 v
->number_of_dpp_required_for_det_and_lb_size
[k
] =dcn_bw_max2(v
->number_of_dpp_required_for_det_size
, v
->number_of_dpp_required_for_lb_size
);
434 for (i
= 0; i
<= number_of_states_plus_one
; i
++) {
435 for (j
= 0; j
<= 1; j
++) {
436 v
->total_number_of_active_dpp
[i
][j
] = 0.0;
437 v
->required_dispclk
[i
][j
] = 0.0;
438 v
->dispclk_dppclk_support
[i
][j
] = dcn_bw_yes
;
439 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
440 v
->min_dispclk_using_single_dpp
=dcn_bw_max2(v
->pixel_clock
[k
], v
->min_dppclk_using_single_dpp
[k
] * (j
+ 1)) * (1.0 + v
->downspreading
/ 100.0);
441 if (v
->odm_capability
== dcn_bw_yes
) {
442 v
->min_dispclk_using_dual_dpp
=dcn_bw_max2(v
->pixel_clock
[k
] / 2.0, v
->min_dppclk_using_single_dpp
[k
] / 2.0 * (j
+ 1)) * (1.0 + v
->downspreading
/ 100.0);
445 v
->min_dispclk_using_dual_dpp
=dcn_bw_max2(v
->pixel_clock
[k
], v
->min_dppclk_using_single_dpp
[k
] / 2.0 * (j
+ 1)) * (1.0 + v
->downspreading
/ 100.0);
447 if (i
< number_of_states
) {
448 v
->min_dispclk_using_single_dpp
= v
->min_dispclk_using_single_dpp
* (1.0 + v
->dispclk_ramping_margin
/ 100.0);
449 v
->min_dispclk_using_dual_dpp
= v
->min_dispclk_using_dual_dpp
* (1.0 + v
->dispclk_ramping_margin
/ 100.0);
451 if (v
->min_dispclk_using_single_dpp
<=dcn_bw_min2(v
->max_dispclk
[i
], (j
+ 1) * v
->max_dppclk
[i
]) && v
->number_of_dpp_required_for_det_and_lb_size
[k
] <= 1.0) {
452 v
->no_of_dpp
[i
][j
][k
] = 1.0;
453 v
->required_dispclk
[i
][j
] =dcn_bw_max2(v
->required_dispclk
[i
][j
], v
->min_dispclk_using_single_dpp
);
455 else if (v
->min_dispclk_using_dual_dpp
<=dcn_bw_min2(v
->max_dispclk
[i
], (j
+ 1) * v
->max_dppclk
[i
])) {
456 v
->no_of_dpp
[i
][j
][k
] = 2.0;
457 v
->required_dispclk
[i
][j
] =dcn_bw_max2(v
->required_dispclk
[i
][j
], v
->min_dispclk_using_dual_dpp
);
460 v
->no_of_dpp
[i
][j
][k
] = 2.0;
461 v
->required_dispclk
[i
][j
] =dcn_bw_max2(v
->required_dispclk
[i
][j
], v
->min_dispclk_using_dual_dpp
);
462 v
->dispclk_dppclk_support
[i
][j
] = dcn_bw_no
;
464 v
->total_number_of_active_dpp
[i
][j
] = v
->total_number_of_active_dpp
[i
][j
] + v
->no_of_dpp
[i
][j
][k
];
466 if (v
->total_number_of_active_dpp
[i
][j
] > v
->max_num_dpp
) {
467 v
->total_number_of_active_dpp
[i
][j
] = 0.0;
468 v
->required_dispclk
[i
][j
] = 0.0;
469 v
->dispclk_dppclk_support
[i
][j
] = dcn_bw_yes
;
470 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
471 v
->min_dispclk_using_single_dpp
=dcn_bw_max2(v
->pixel_clock
[k
], v
->min_dppclk_using_single_dpp
[k
] * (j
+ 1)) * (1.0 + v
->downspreading
/ 100.0);
472 v
->min_dispclk_using_dual_dpp
=dcn_bw_max2(v
->pixel_clock
[k
], v
->min_dppclk_using_single_dpp
[k
] / 2.0 * (j
+ 1)) * (1.0 + v
->downspreading
/ 100.0);
473 if (i
< number_of_states
) {
474 v
->min_dispclk_using_single_dpp
= v
->min_dispclk_using_single_dpp
* (1.0 + v
->dispclk_ramping_margin
/ 100.0);
475 v
->min_dispclk_using_dual_dpp
= v
->min_dispclk_using_dual_dpp
* (1.0 + v
->dispclk_ramping_margin
/ 100.0);
477 if (v
->number_of_dpp_required_for_det_and_lb_size
[k
] <= 1.0) {
478 v
->no_of_dpp
[i
][j
][k
] = 1.0;
479 v
->required_dispclk
[i
][j
] =dcn_bw_max2(v
->required_dispclk
[i
][j
], v
->min_dispclk_using_single_dpp
);
480 if (v
->min_dispclk_using_single_dpp
>dcn_bw_min2(v
->max_dispclk
[i
], (j
+ 1) * v
->max_dppclk
[i
])) {
481 v
->dispclk_dppclk_support
[i
][j
] = dcn_bw_no
;
485 v
->no_of_dpp
[i
][j
][k
] = 2.0;
486 v
->required_dispclk
[i
][j
] =dcn_bw_max2(v
->required_dispclk
[i
][j
], v
->min_dispclk_using_dual_dpp
);
487 if (v
->min_dispclk_using_dual_dpp
>dcn_bw_min2(v
->max_dispclk
[i
], (j
+ 1) * v
->max_dppclk
[i
])) {
488 v
->dispclk_dppclk_support
[i
][j
] = dcn_bw_no
;
491 v
->total_number_of_active_dpp
[i
][j
] = v
->total_number_of_active_dpp
[i
][j
] + v
->no_of_dpp
[i
][j
][k
];
496 /*viewport size check*/
498 v
->viewport_size_support
= dcn_bw_yes
;
499 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
500 if (v
->number_of_dpp_required_for_det_and_lb_size
[k
] > 2.0) {
501 v
->viewport_size_support
= dcn_bw_no
;
504 /*total available pipes support check*/
506 for (i
= 0; i
<= number_of_states_plus_one
; i
++) {
507 for (j
= 0; j
<= 1; j
++) {
508 if (v
->total_number_of_active_dpp
[i
][j
] <= v
->max_num_dpp
) {
509 v
->total_available_pipes_support
[i
][j
] = dcn_bw_yes
;
512 v
->total_available_pipes_support
[i
][j
] = dcn_bw_no
;
516 /*urgent latency support check*/
518 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
519 for (i
= 0; i
<= number_of_states_plus_one
; i
++) {
520 for (j
= 0; j
<= 1; j
++) {
521 v
->swath_width_yper_state
[i
][j
][k
] = v
->swath_width_ysingle_dpp
[k
] / v
->no_of_dpp
[i
][j
][k
];
522 v
->swath_width_granularity_y
= 256.0 /dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / v
->max_swath_height_y
[k
];
523 v
->rounded_up_max_swath_size_bytes_y
= (dcn_bw_ceil2(v
->swath_width_yper_state
[i
][j
][k
] - 1.0, v
->swath_width_granularity_y
) + v
->swath_width_granularity_y
) * v
->byte_per_pixel_in_dety
[k
] * v
->max_swath_height_y
[k
];
524 if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_10
) {
525 v
->rounded_up_max_swath_size_bytes_y
=dcn_bw_ceil2(v
->rounded_up_max_swath_size_bytes_y
, 256.0) + 256;
527 if (v
->max_swath_height_c
[k
] > 0.0) {
528 v
->swath_width_granularity_c
= 256.0 /dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / v
->max_swath_height_c
[k
];
530 v
->rounded_up_max_swath_size_bytes_c
= (dcn_bw_ceil2(v
->swath_width_yper_state
[i
][j
][k
] / 2.0 - 1.0, v
->swath_width_granularity_c
) + v
->swath_width_granularity_c
) * v
->byte_per_pixel_in_detc
[k
] * v
->max_swath_height_c
[k
];
531 if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_10
) {
532 v
->rounded_up_max_swath_size_bytes_c
=dcn_bw_ceil2(v
->rounded_up_max_swath_size_bytes_c
, 256.0) + 256;
534 if (v
->rounded_up_max_swath_size_bytes_y
+ v
->rounded_up_max_swath_size_bytes_c
<= v
->det_buffer_size_in_kbyte
* 1024.0 / 2.0) {
535 v
->swath_height_yper_state
[i
][j
][k
] = v
->max_swath_height_y
[k
];
536 v
->swath_height_cper_state
[i
][j
][k
] = v
->max_swath_height_c
[k
];
539 v
->swath_height_yper_state
[i
][j
][k
] = v
->min_swath_height_y
[k
];
540 v
->swath_height_cper_state
[i
][j
][k
] = v
->min_swath_height_c
[k
];
542 if (v
->byte_per_pixel_in_detc
[k
] == 0.0) {
543 v
->lines_in_det_luma
= v
->det_buffer_size_in_kbyte
* 1024.0 / v
->byte_per_pixel_in_dety
[k
] / v
->swath_width_yper_state
[i
][j
][k
];
544 v
->lines_in_det_chroma
= 0.0;
546 else if (v
->swath_height_yper_state
[i
][j
][k
] <= v
->swath_height_cper_state
[i
][j
][k
]) {
547 v
->lines_in_det_luma
= v
->det_buffer_size_in_kbyte
* 1024.0 / 2.0 / v
->byte_per_pixel_in_dety
[k
] / v
->swath_width_yper_state
[i
][j
][k
];
548 v
->lines_in_det_chroma
= v
->det_buffer_size_in_kbyte
* 1024.0 / 2.0 / v
->byte_per_pixel_in_detc
[k
] / (v
->swath_width_yper_state
[i
][j
][k
] / 2.0);
551 v
->lines_in_det_luma
= v
->det_buffer_size_in_kbyte
* 1024.0 * 2.0 / 3.0 / v
->byte_per_pixel_in_dety
[k
] / v
->swath_width_yper_state
[i
][j
][k
];
552 v
->lines_in_det_chroma
= v
->det_buffer_size_in_kbyte
* 1024.0 / 3.0 / v
->byte_per_pixel_in_dety
[k
] / (v
->swath_width_yper_state
[i
][j
][k
] / 2.0);
554 v
->effective_lb_latency_hiding_source_lines_luma
=dcn_bw_min2(v
->max_line_buffer_lines
,dcn_bw_floor2(v
->line_buffer_size
/ v
->lb_bit_per_pixel
[k
] / (v
->swath_width_yper_state
[i
][j
][k
] /dcn_bw_max2(v
->h_ratio
[k
], 1.0)), 1.0)) - (v
->vtaps
[k
] - 1.0);
555 v
->effective_lb_latency_hiding_source_lines_chroma
=dcn_bw_min2(v
->max_line_buffer_lines
,dcn_bw_floor2(v
->line_buffer_size
/ v
->lb_bit_per_pixel
[k
] / (v
->swath_width_yper_state
[i
][j
][k
] / 2.0 /dcn_bw_max2(v
->h_ratio
[k
] / 2.0, 1.0)), 1.0)) - (v
->vta_pschroma
[k
] - 1.0);
556 v
->effective_detlb_lines_luma
=dcn_bw_floor2(v
->lines_in_det_luma
+dcn_bw_min2(v
->lines_in_det_luma
* v
->required_dispclk
[i
][j
] * v
->byte_per_pixel_in_dety
[k
] * v
->pscl_factor
[k
] / v
->return_bw_per_state
[i
], v
->effective_lb_latency_hiding_source_lines_luma
), v
->swath_height_yper_state
[i
][j
][k
]);
557 v
->effective_detlb_lines_chroma
=dcn_bw_floor2(v
->lines_in_det_chroma
+dcn_bw_min2(v
->lines_in_det_chroma
* v
->required_dispclk
[i
][j
] * v
->byte_per_pixel_in_detc
[k
] * v
->pscl_factor_chroma
[k
] / v
->return_bw_per_state
[i
], v
->effective_lb_latency_hiding_source_lines_chroma
), v
->swath_height_cper_state
[i
][j
][k
]);
558 if (v
->byte_per_pixel_in_detc
[k
] == 0.0) {
559 v
->urgent_latency_support_us_per_state
[i
][j
][k
] = v
->effective_detlb_lines_luma
* (v
->htotal
[k
] / v
->pixel_clock
[k
]) / v
->v_ratio
[k
] - v
->effective_detlb_lines_luma
* v
->swath_width_yper_state
[i
][j
][k
] *dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / (v
->return_bw_per_state
[i
] / v
->no_of_dpp
[i
][j
][k
]);
562 v
->urgent_latency_support_us_per_state
[i
][j
][k
] =dcn_bw_min2(v
->effective_detlb_lines_luma
* (v
->htotal
[k
] / v
->pixel_clock
[k
]) / v
->v_ratio
[k
] - v
->effective_detlb_lines_luma
* v
->swath_width_yper_state
[i
][j
][k
] *dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / (v
->return_bw_per_state
[i
] / v
->no_of_dpp
[i
][j
][k
]), v
->effective_detlb_lines_chroma
* (v
->htotal
[k
] / v
->pixel_clock
[k
]) / (v
->v_ratio
[k
] / 2.0) - v
->effective_detlb_lines_chroma
* v
->swath_width_yper_state
[i
][j
][k
] / 2.0 *dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / (v
->return_bw_per_state
[i
] / v
->no_of_dpp
[i
][j
][k
]));
567 for (i
= 0; i
<= number_of_states_plus_one
; i
++) {
568 for (j
= 0; j
<= 1; j
++) {
569 v
->urgent_latency_support
[i
][j
] = dcn_bw_yes
;
570 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
571 if (v
->urgent_latency_support_us_per_state
[i
][j
][k
] < v
->urgent_latency
/ 1.0) {
572 v
->urgent_latency_support
[i
][j
] = dcn_bw_no
;
579 for (i
= 0; i
<= number_of_states_plus_one
; i
++) {
580 for (j
= 0; j
<= 1; j
++) {
581 v
->total_number_of_dcc_active_dpp
[i
][j
] = 0.0;
582 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
583 if (v
->dcc_enable
[k
] == dcn_bw_yes
) {
584 v
->total_number_of_dcc_active_dpp
[i
][j
] = v
->total_number_of_dcc_active_dpp
[i
][j
] + v
->no_of_dpp
[i
][j
][k
];
589 for (i
= 0; i
<= number_of_states_plus_one
; i
++) {
590 for (j
= 0; j
<= 1; j
++) {
591 v
->projected_dcfclk_deep_sleep
= 8.0;
592 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
593 v
->projected_dcfclk_deep_sleep
=dcn_bw_max2(v
->projected_dcfclk_deep_sleep
, v
->pixel_clock
[k
] / 16.0);
594 if (v
->byte_per_pixel_in_detc
[k
] == 0.0) {
595 if (v
->v_ratio
[k
] <= 1.0) {
596 v
->projected_dcfclk_deep_sleep
=dcn_bw_max2(v
->projected_dcfclk_deep_sleep
, 1.1 *dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / 64.0 * v
->h_ratio
[k
] * v
->pixel_clock
[k
] / v
->no_of_dpp
[i
][j
][k
]);
599 v
->projected_dcfclk_deep_sleep
=dcn_bw_max2(v
->projected_dcfclk_deep_sleep
, 1.1 *dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / 64.0 * v
->pscl_factor
[k
] * v
->required_dispclk
[i
][j
] / (1 + j
));
603 if (v
->v_ratio
[k
] <= 1.0) {
604 v
->projected_dcfclk_deep_sleep
=dcn_bw_max2(v
->projected_dcfclk_deep_sleep
, 1.1 *dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / 32.0 * v
->h_ratio
[k
] * v
->pixel_clock
[k
] / v
->no_of_dpp
[i
][j
][k
]);
607 v
->projected_dcfclk_deep_sleep
=dcn_bw_max2(v
->projected_dcfclk_deep_sleep
, 1.1 *dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / 32.0 * v
->pscl_factor
[k
] * v
->required_dispclk
[i
][j
] / (1 + j
));
609 if (v
->v_ratio
[k
] / 2.0 <= 1.0) {
610 v
->projected_dcfclk_deep_sleep
=dcn_bw_max2(v
->projected_dcfclk_deep_sleep
, 1.1 *dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / 32.0 * v
->h_ratio
[k
] / 2.0 * v
->pixel_clock
[k
] / v
->no_of_dpp
[i
][j
][k
]);
613 v
->projected_dcfclk_deep_sleep
=dcn_bw_max2(v
->projected_dcfclk_deep_sleep
, 1.1 *dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / 32.0 * v
->pscl_factor_chroma
[k
] * v
->required_dispclk
[i
][j
] / (1 + j
));
617 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
618 if (v
->dcc_enable
[k
] == dcn_bw_yes
) {
619 v
->meta_req_height_y
= 8.0 * v
->read256_block_height_y
[k
];
620 v
->meta_req_width_y
= 64.0 * 256.0 /dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / v
->meta_req_height_y
;
621 v
->meta_surface_width_y
=dcn_bw_ceil2(v
->viewport_width
[k
] / v
->no_of_dpp
[i
][j
][k
] - 1.0, v
->meta_req_width_y
) + v
->meta_req_width_y
;
622 v
->meta_surface_height_y
=dcn_bw_ceil2(v
->viewport_height
[k
] - 1.0, v
->meta_req_height_y
) + v
->meta_req_height_y
;
623 if (v
->pte_enable
== dcn_bw_yes
) {
624 v
->meta_pte_bytes_per_frame_y
= (dcn_bw_ceil2((v
->meta_surface_width_y
* v
->meta_surface_height_y
*dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / 256.0 - 4096.0) / 8.0 / 4096.0, 1.0) + 1) * 64.0;
627 v
->meta_pte_bytes_per_frame_y
= 0.0;
629 if (v
->source_scan
[k
] == dcn_bw_hor
) {
630 v
->meta_row_bytes_y
= v
->meta_surface_width_y
* v
->meta_req_height_y
*dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / 256.0;
633 v
->meta_row_bytes_y
= v
->meta_surface_height_y
* v
->meta_req_width_y
*dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / 256.0;
637 v
->meta_pte_bytes_per_frame_y
= 0.0;
638 v
->meta_row_bytes_y
= 0.0;
640 if (v
->pte_enable
== dcn_bw_yes
) {
641 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
642 v
->macro_tile_block_size_bytes_y
= 256.0;
643 v
->macro_tile_block_height_y
= 1.0;
645 else if (v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_d
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_d_x
) {
646 v
->macro_tile_block_size_bytes_y
= 4096.0;
647 v
->macro_tile_block_height_y
= 4.0 * v
->read256_block_height_y
[k
];
649 else if (v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_t
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d_t
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d_x
) {
650 v
->macro_tile_block_size_bytes_y
= 64.0 * 1024;
651 v
->macro_tile_block_height_y
= 16.0 * v
->read256_block_height_y
[k
];
654 v
->macro_tile_block_size_bytes_y
= 256.0 * 1024;
655 v
->macro_tile_block_height_y
= 32.0 * v
->read256_block_height_y
[k
];
657 if (v
->macro_tile_block_size_bytes_y
<= 65536.0) {
658 v
->data_pte_req_height_y
= v
->macro_tile_block_height_y
;
661 v
->data_pte_req_height_y
= 16.0 * v
->read256_block_height_y
[k
];
663 v
->data_pte_req_width_y
= 4096.0 /dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) / v
->data_pte_req_height_y
* 8;
664 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
665 v
->dpte_bytes_per_row_y
= 64.0 * (dcn_bw_ceil2((v
->viewport_width
[k
] / v
->no_of_dpp
[i
][j
][k
] *dcn_bw_min2(128.0, dcn_bw_pow(2.0,dcn_bw_floor2(dcn_bw_log(v
->pte_buffer_size_in_requests
* v
->data_pte_req_width_y
/ (v
->viewport_width
[k
] / v
->no_of_dpp
[i
][j
][k
]), 2.0), 1.0))) - 1.0) / v
->data_pte_req_width_y
, 1.0) + 1);
667 else if (v
->source_scan
[k
] == dcn_bw_hor
) {
668 v
->dpte_bytes_per_row_y
= 64.0 * (dcn_bw_ceil2((v
->viewport_width
[k
] / v
->no_of_dpp
[i
][j
][k
] - 1.0) / v
->data_pte_req_width_y
, 1.0) + 1);
671 v
->dpte_bytes_per_row_y
= 64.0 * (dcn_bw_ceil2((v
->viewport_height
[k
] - 1.0) / v
->data_pte_req_height_y
, 1.0) + 1);
675 v
->dpte_bytes_per_row_y
= 0.0;
677 if ((v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_64
&& v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_32
&& v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_16
)) {
678 if (v
->dcc_enable
[k
] == dcn_bw_yes
) {
679 v
->meta_req_height_c
= 8.0 * v
->read256_block_height_c
[k
];
680 v
->meta_req_width_c
= 64.0 * 256.0 /dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / v
->meta_req_height_c
;
681 v
->meta_surface_width_c
=dcn_bw_ceil2(v
->viewport_width
[k
] / v
->no_of_dpp
[i
][j
][k
] / 2.0 - 1.0, v
->meta_req_width_c
) + v
->meta_req_width_c
;
682 v
->meta_surface_height_c
=dcn_bw_ceil2(v
->viewport_height
[k
] / 2.0 - 1.0, v
->meta_req_height_c
) + v
->meta_req_height_c
;
683 if (v
->pte_enable
== dcn_bw_yes
) {
684 v
->meta_pte_bytes_per_frame_c
= (dcn_bw_ceil2((v
->meta_surface_width_c
* v
->meta_surface_height_c
*dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / 256.0 - 4096.0) / 8.0 / 4096.0, 1.0) + 1) * 64.0;
687 v
->meta_pte_bytes_per_frame_c
= 0.0;
689 if (v
->source_scan
[k
] == dcn_bw_hor
) {
690 v
->meta_row_bytes_c
= v
->meta_surface_width_c
* v
->meta_req_height_c
*dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / 256.0;
693 v
->meta_row_bytes_c
= v
->meta_surface_height_c
* v
->meta_req_width_c
*dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / 256.0;
697 v
->meta_pte_bytes_per_frame_c
= 0.0;
698 v
->meta_row_bytes_c
= 0.0;
700 if (v
->pte_enable
== dcn_bw_yes
) {
701 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
702 v
->macro_tile_block_size_bytes_c
= 256.0;
703 v
->macro_tile_block_height_c
= 1.0;
705 else if (v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_d
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_d_x
) {
706 v
->macro_tile_block_size_bytes_c
= 4096.0;
707 v
->macro_tile_block_height_c
= 4.0 * v
->read256_block_height_c
[k
];
709 else if (v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_t
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d_t
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d_x
) {
710 v
->macro_tile_block_size_bytes_c
= 64.0 * 1024;
711 v
->macro_tile_block_height_c
= 16.0 * v
->read256_block_height_c
[k
];
714 v
->macro_tile_block_size_bytes_c
= 256.0 * 1024;
715 v
->macro_tile_block_height_c
= 32.0 * v
->read256_block_height_c
[k
];
717 v
->macro_tile_block_width_c
= v
->macro_tile_block_size_bytes_c
/dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / v
->macro_tile_block_height_c
;
718 if (v
->macro_tile_block_size_bytes_c
<= 65536.0) {
719 v
->data_pte_req_height_c
= v
->macro_tile_block_height_c
;
722 v
->data_pte_req_height_c
= 16.0 * v
->read256_block_height_c
[k
];
724 v
->data_pte_req_width_c
= 4096.0 /dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / v
->data_pte_req_height_c
* 8;
725 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
726 v
->dpte_bytes_per_row_c
= 64.0 * (dcn_bw_ceil2((v
->viewport_width
[k
] / v
->no_of_dpp
[i
][j
][k
] / 2.0 * dcn_bw_min2(128.0, dcn_bw_pow(2.0,dcn_bw_floor2(dcn_bw_log(v
->pte_buffer_size_in_requests
* v
->data_pte_req_width_c
/ (v
->viewport_width
[k
] / v
->no_of_dpp
[i
][j
][k
] / 2.0), 2.0), 1.0))) - 1.0) / v
->data_pte_req_width_c
, 1.0) + 1);
728 else if (v
->source_scan
[k
] == dcn_bw_hor
) {
729 v
->dpte_bytes_per_row_c
= 64.0 * (dcn_bw_ceil2((v
->viewport_width
[k
] / v
->no_of_dpp
[i
][j
][k
] / 2.0 - 1.0) / v
->data_pte_req_width_c
, 1.0) + 1);
732 v
->dpte_bytes_per_row_c
= 64.0 * (dcn_bw_ceil2((v
->viewport_height
[k
] / 2.0 - 1.0) / v
->data_pte_req_height_c
, 1.0) + 1);
736 v
->dpte_bytes_per_row_c
= 0.0;
740 v
->dpte_bytes_per_row_c
= 0.0;
741 v
->meta_pte_bytes_per_frame_c
= 0.0;
742 v
->meta_row_bytes_c
= 0.0;
744 v
->dpte_bytes_per_row
[k
] = v
->dpte_bytes_per_row_y
+ v
->dpte_bytes_per_row_c
;
745 v
->meta_pte_bytes_per_frame
[k
] = v
->meta_pte_bytes_per_frame_y
+ v
->meta_pte_bytes_per_frame_c
;
746 v
->meta_row_bytes
[k
] = v
->meta_row_bytes_y
+ v
->meta_row_bytes_c
;
747 v
->v_init_y
= (v
->v_ratio
[k
] + v
->vtaps
[k
] + 1.0 + v
->interlace_output
[k
] * 0.5 * v
->v_ratio
[k
]) / 2.0;
748 v
->prefill_y
[k
] =dcn_bw_floor2(v
->v_init_y
, 1.0);
749 v
->max_num_sw_y
[k
] =dcn_bw_ceil2((v
->prefill_y
[k
] - 1.0) / v
->swath_height_yper_state
[i
][j
][k
], 1.0) + 1;
750 if (v
->prefill_y
[k
] > 1.0) {
751 v
->max_partial_sw_y
=dcn_bw_mod((v
->prefill_y
[k
] - 2.0), v
->swath_height_yper_state
[i
][j
][k
]);
754 v
->max_partial_sw_y
=dcn_bw_mod((v
->prefill_y
[k
] + v
->swath_height_yper_state
[i
][j
][k
] - 2.0), v
->swath_height_yper_state
[i
][j
][k
]);
756 v
->max_partial_sw_y
=dcn_bw_max2(1.0, v
->max_partial_sw_y
);
757 v
->prefetch_lines_y
[k
] = v
->max_num_sw_y
[k
] * v
->swath_height_yper_state
[i
][j
][k
] + v
->max_partial_sw_y
;
758 if ((v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_64
&& v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_32
&& v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_16
)) {
759 v
->v_init_c
= (v
->v_ratio
[k
] / 2.0 + v
->vtaps
[k
] + 1.0 + v
->interlace_output
[k
] * 0.5 * v
->v_ratio
[k
] / 2.0) / 2.0;
760 v
->prefill_c
[k
] =dcn_bw_floor2(v
->v_init_c
, 1.0);
761 v
->max_num_sw_c
[k
] =dcn_bw_ceil2((v
->prefill_c
[k
] - 1.0) / v
->swath_height_cper_state
[i
][j
][k
], 1.0) + 1;
762 if (v
->prefill_c
[k
] > 1.0) {
763 v
->max_partial_sw_c
=dcn_bw_mod((v
->prefill_c
[k
] - 2.0), v
->swath_height_cper_state
[i
][j
][k
]);
766 v
->max_partial_sw_c
=dcn_bw_mod((v
->prefill_c
[k
] + v
->swath_height_cper_state
[i
][j
][k
] - 2.0), v
->swath_height_cper_state
[i
][j
][k
]);
768 v
->max_partial_sw_c
=dcn_bw_max2(1.0, v
->max_partial_sw_c
);
769 v
->prefetch_lines_c
[k
] = v
->max_num_sw_c
[k
] * v
->swath_height_cper_state
[i
][j
][k
] + v
->max_partial_sw_c
;
772 v
->prefetch_lines_c
[k
] = 0.0;
774 v
->dst_x_after_scaler
= 90.0 * v
->pixel_clock
[k
] / (v
->required_dispclk
[i
][j
] / (j
+ 1)) + 42.0 * v
->pixel_clock
[k
] / v
->required_dispclk
[i
][j
];
775 if (v
->no_of_dpp
[i
][j
][k
] > 1.0) {
776 v
->dst_x_after_scaler
= v
->dst_x_after_scaler
+ v
->scaler_rec_out_width
[k
] / 2.0;
778 if (v
->output_format
[k
] == dcn_bw_420
) {
779 v
->dst_y_after_scaler
= 1.0;
782 v
->dst_y_after_scaler
= 0.0;
784 v
->time_calc
= 24.0 / v
->projected_dcfclk_deep_sleep
;
785 v
->v_update_offset
[k
][j
] = dcn_bw_ceil2(v
->htotal
[k
] / 4.0, 1.0);
786 v
->total_repeater_delay
= v
->max_inter_dcn_tile_repeaters
* (2.0 / (v
->required_dispclk
[i
][j
] / (j
+ 1)) + 3.0 / v
->required_dispclk
[i
][j
]);
787 v
->v_update_width
[k
][j
] = (14.0 / v
->projected_dcfclk_deep_sleep
+ 12.0 / (v
->required_dispclk
[i
][j
] / (j
+ 1)) + v
->total_repeater_delay
) * v
->pixel_clock
[k
];
788 v
->v_ready_offset
[k
][j
] = dcn_bw_max2(150.0 / (v
->required_dispclk
[i
][j
] / (j
+ 1)), v
->total_repeater_delay
+ 20.0 / v
->projected_dcfclk_deep_sleep
+ 10.0 / (v
->required_dispclk
[i
][j
] / (j
+ 1))) * v
->pixel_clock
[k
];
789 v
->time_setup
= (v
->v_update_offset
[k
][j
] + v
->v_update_width
[k
][j
] + v
->v_ready_offset
[k
][j
]) / v
->pixel_clock
[k
];
790 v
->extra_latency
= v
->urgent_round_trip_and_out_of_order_latency_per_state
[i
] + (v
->total_number_of_active_dpp
[i
][j
] * v
->pixel_chunk_size_in_kbyte
+ v
->total_number_of_dcc_active_dpp
[i
][j
] * v
->meta_chunk_size
) * 1024.0 / v
->return_bw_per_state
[i
];
791 if (v
->pte_enable
== dcn_bw_yes
) {
792 v
->extra_latency
= v
->extra_latency
+ v
->total_number_of_active_dpp
[i
][j
] * v
->pte_chunk_size
* 1024.0 / v
->return_bw_per_state
[i
];
794 if (v
->can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one
== dcn_bw_yes
) {
795 v
->maximum_vstartup
= v
->vtotal
[k
] - v
->vactive
[k
] - 1.0;
798 v
->maximum_vstartup
= v
->v_sync_plus_back_porch
[k
] - 1.0;
802 v
->line_times_for_prefetch
[k
] = v
->maximum_vstartup
- v
->urgent_latency
/ (v
->htotal
[k
] / v
->pixel_clock
[k
]) - (v
->time_calc
+ v
->time_setup
) / (v
->htotal
[k
] / v
->pixel_clock
[k
]) - (v
->dst_y_after_scaler
+ v
->dst_x_after_scaler
/ v
->htotal
[k
]);
803 v
->line_times_for_prefetch
[k
] =dcn_bw_floor2(4.0 * (v
->line_times_for_prefetch
[k
] + 0.125), 1.0) / 4;
804 v
->prefetch_bw
[k
] = (v
->meta_pte_bytes_per_frame
[k
] + 2.0 * v
->meta_row_bytes
[k
] + 2.0 * v
->dpte_bytes_per_row
[k
] + v
->prefetch_lines_y
[k
] * v
->swath_width_yper_state
[i
][j
][k
] *dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) + v
->prefetch_lines_c
[k
] * v
->swath_width_yper_state
[i
][j
][k
] / 2.0 *dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0)) / (v
->line_times_for_prefetch
[k
] * v
->htotal
[k
] / v
->pixel_clock
[k
]);
806 if (v
->pte_enable
== dcn_bw_yes
&& v
->dcc_enable
[k
] == dcn_bw_yes
) {
807 v
->time_for_meta_pte_without_immediate_flip
= dcn_bw_max3(
808 v
->meta_pte_bytes_frame
[k
] / v
->prefetch_bw
[k
],
810 v
->htotal
[k
] / v
->pixel_clock
[k
] / 4.0);
812 v
->time_for_meta_pte_without_immediate_flip
= v
->htotal
[k
] / v
->pixel_clock
[k
] / 4.0;
815 if (v
->pte_enable
== dcn_bw_yes
|| v
->dcc_enable
[k
] == dcn_bw_yes
) {
816 v
->time_for_meta_and_dpte_row_without_immediate_flip
= dcn_bw_max3((
817 v
->meta_row_bytes
[k
] + v
->dpte_bytes_per_row
[k
]) / v
->prefetch_bw
[k
],
818 v
->htotal
[k
] / v
->pixel_clock
[k
] - v
->time_for_meta_pte_without_immediate_flip
,
821 v
->time_for_meta_and_dpte_row_without_immediate_flip
= dcn_bw_max2(
822 v
->htotal
[k
] / v
->pixel_clock
[k
] - v
->time_for_meta_pte_without_immediate_flip
,
823 v
->extra_latency
- v
->time_for_meta_pte_with_immediate_flip
);
826 v
->lines_for_meta_pte_without_immediate_flip
[k
] =dcn_bw_floor2(4.0 * (v
->time_for_meta_pte_without_immediate_flip
/ (v
->htotal
[k
] / v
->pixel_clock
[k
]) + 0.125), 1.0) / 4;
827 v
->lines_for_meta_and_dpte_row_without_immediate_flip
[k
] =dcn_bw_floor2(4.0 * (v
->time_for_meta_and_dpte_row_without_immediate_flip
/ (v
->htotal
[k
] / v
->pixel_clock
[k
]) + 0.125), 1.0) / 4;
828 v
->maximum_vstartup
= v
->maximum_vstartup
- 1;
830 if (v
->lines_for_meta_pte_without_immediate_flip
[k
] < 32.0 && v
->lines_for_meta_and_dpte_row_without_immediate_flip
[k
] < 16.0)
835 v
->bw_available_for_immediate_flip
= v
->return_bw_per_state
[i
];
836 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
837 v
->bw_available_for_immediate_flip
= v
->bw_available_for_immediate_flip
-dcn_bw_max2(v
->read_bandwidth
[k
], v
->prefetch_bw
[k
]);
839 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
840 v
->total_immediate_flip_bytes
[k
] = 0.0;
841 if ((v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_8
&& v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_10
)) {
842 v
->total_immediate_flip_bytes
[k
] = v
->total_immediate_flip_bytes
[k
] + v
->meta_pte_bytes_per_frame
[k
] + v
->meta_row_bytes
[k
] + v
->dpte_bytes_per_row
[k
];
845 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
846 if (v
->pte_enable
== dcn_bw_yes
&& v
->dcc_enable
[k
] == dcn_bw_yes
) {
847 v
->time_for_meta_pte_with_immediate_flip
=dcn_bw_max5(v
->meta_pte_bytes_per_frame
[k
] / v
->prefetch_bw
[k
], v
->meta_pte_bytes_per_frame
[k
] * v
->total_immediate_flip_bytes
[k
] / (v
->bw_available_for_immediate_flip
* (v
->meta_pte_bytes_per_frame
[k
] + v
->meta_row_bytes
[k
] + v
->dpte_bytes_per_row
[k
])), v
->extra_latency
, v
->urgent_latency
, v
->htotal
[k
] / v
->pixel_clock
[k
] / 4.0);
850 v
->time_for_meta_pte_with_immediate_flip
= v
->htotal
[k
] / v
->pixel_clock
[k
] / 4.0;
852 if (v
->pte_enable
== dcn_bw_yes
|| v
->dcc_enable
[k
] == dcn_bw_yes
) {
853 v
->time_for_meta_and_dpte_row_with_immediate_flip
=dcn_bw_max5((v
->meta_row_bytes
[k
] + v
->dpte_bytes_per_row
[k
]) / v
->prefetch_bw
[k
], (v
->meta_row_bytes
[k
] + v
->dpte_bytes_per_row
[k
]) * v
->total_immediate_flip_bytes
[k
] / (v
->bw_available_for_immediate_flip
* (v
->meta_pte_bytes_per_frame
[k
] + v
->meta_row_bytes
[k
] + v
->dpte_bytes_per_row
[k
])), v
->htotal
[k
] / v
->pixel_clock
[k
] - v
->time_for_meta_pte_with_immediate_flip
, v
->extra_latency
, 2.0 * v
->urgent_latency
);
856 v
->time_for_meta_and_dpte_row_with_immediate_flip
=dcn_bw_max2(v
->htotal
[k
] / v
->pixel_clock
[k
] - v
->time_for_meta_pte_with_immediate_flip
, v
->extra_latency
- v
->time_for_meta_pte_with_immediate_flip
);
858 v
->lines_for_meta_pte_with_immediate_flip
[k
] =dcn_bw_floor2(4.0 * (v
->time_for_meta_pte_with_immediate_flip
/ (v
->htotal
[k
] / v
->pixel_clock
[k
]) + 0.125), 1.0) / 4;
859 v
->lines_for_meta_and_dpte_row_with_immediate_flip
[k
] =dcn_bw_floor2(4.0 * (v
->time_for_meta_and_dpte_row_with_immediate_flip
/ (v
->htotal
[k
] / v
->pixel_clock
[k
]) + 0.125), 1.0) / 4;
860 v
->line_times_to_request_prefetch_pixel_data_with_immediate_flip
= v
->line_times_for_prefetch
[k
] - v
->lines_for_meta_pte_with_immediate_flip
[k
] - v
->lines_for_meta_and_dpte_row_with_immediate_flip
[k
];
861 v
->line_times_to_request_prefetch_pixel_data_without_immediate_flip
= v
->line_times_for_prefetch
[k
] - v
->lines_for_meta_pte_without_immediate_flip
[k
] - v
->lines_for_meta_and_dpte_row_without_immediate_flip
[k
];
862 if (v
->line_times_to_request_prefetch_pixel_data_with_immediate_flip
> 0.0) {
863 v
->v_ratio_pre_ywith_immediate_flip
[i
][j
][k
] = v
->prefetch_lines_y
[k
] / v
->line_times_to_request_prefetch_pixel_data_with_immediate_flip
;
864 if ((v
->swath_height_yper_state
[i
][j
][k
] > 4.0)) {
865 if (v
->line_times_to_request_prefetch_pixel_data_with_immediate_flip
- (v
->prefill_y
[k
] - 3.0) / 2.0 > 0.0) {
866 v
->v_ratio_pre_ywith_immediate_flip
[i
][j
][k
] =dcn_bw_max2(v
->v_ratio_pre_ywith_immediate_flip
[i
][j
][k
], (v
->max_num_sw_y
[k
] * v
->swath_height_yper_state
[i
][j
][k
]) / (v
->line_times_to_request_prefetch_pixel_data_with_immediate_flip
- (v
->prefill_y
[k
] - 3.0) / 2.0));
869 v
->v_ratio_pre_ywith_immediate_flip
[i
][j
][k
] = 999999.0;
872 v
->v_ratio_pre_cwith_immediate_flip
[i
][j
][k
] = v
->prefetch_lines_c
[k
] / v
->line_times_to_request_prefetch_pixel_data_with_immediate_flip
;
873 if ((v
->swath_height_cper_state
[i
][j
][k
] > 4.0)) {
874 if (v
->line_times_to_request_prefetch_pixel_data_with_immediate_flip
- (v
->prefill_c
[k
] - 3.0) / 2.0 > 0.0) {
875 v
->v_ratio_pre_cwith_immediate_flip
[i
][j
][k
] =dcn_bw_max2(v
->v_ratio_pre_cwith_immediate_flip
[i
][j
][k
], (v
->max_num_sw_c
[k
] * v
->swath_height_cper_state
[i
][j
][k
]) / (v
->line_times_to_request_prefetch_pixel_data_with_immediate_flip
- (v
->prefill_c
[k
] - 3.0) / 2.0));
878 v
->v_ratio_pre_cwith_immediate_flip
[i
][j
][k
] = 999999.0;
881 v
->required_prefetch_pixel_data_bw_with_immediate_flip
[i
][j
][k
] = v
->no_of_dpp
[i
][j
][k
] * (v
->prefetch_lines_y
[k
] / v
->line_times_to_request_prefetch_pixel_data_with_immediate_flip
*dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) + v
->prefetch_lines_c
[k
] / v
->line_times_to_request_prefetch_pixel_data_with_immediate_flip
*dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / 2.0) * v
->swath_width_yper_state
[i
][j
][k
] / (v
->htotal
[k
] / v
->pixel_clock
[k
]);
884 v
->v_ratio_pre_ywith_immediate_flip
[i
][j
][k
] = 999999.0;
885 v
->v_ratio_pre_cwith_immediate_flip
[i
][j
][k
] = 999999.0;
886 v
->required_prefetch_pixel_data_bw_with_immediate_flip
[i
][j
][k
] = 999999.0;
888 if (v
->line_times_to_request_prefetch_pixel_data_without_immediate_flip
> 0.0) {
889 v
->v_ratio_pre_ywithout_immediate_flip
[i
][j
][k
] = v
->prefetch_lines_y
[k
] / v
->line_times_to_request_prefetch_pixel_data_without_immediate_flip
;
890 if ((v
->swath_height_yper_state
[i
][j
][k
] > 4.0)) {
891 if (v
->line_times_to_request_prefetch_pixel_data_without_immediate_flip
- (v
->prefill_y
[k
] - 3.0) / 2.0 > 0.0) {
892 v
->v_ratio_pre_ywithout_immediate_flip
[i
][j
][k
] =dcn_bw_max2(v
->v_ratio_pre_ywithout_immediate_flip
[i
][j
][k
], (v
->max_num_sw_y
[k
] * v
->swath_height_yper_state
[i
][j
][k
]) / (v
->line_times_to_request_prefetch_pixel_data_without_immediate_flip
- (v
->prefill_y
[k
] - 3.0) / 2.0));
895 v
->v_ratio_pre_ywithout_immediate_flip
[i
][j
][k
] = 999999.0;
898 v
->v_ratio_pre_cwithout_immediate_flip
[i
][j
][k
] = v
->prefetch_lines_c
[k
] / v
->line_times_to_request_prefetch_pixel_data_without_immediate_flip
;
899 if ((v
->swath_height_cper_state
[i
][j
][k
] > 4.0)) {
900 if (v
->line_times_to_request_prefetch_pixel_data_without_immediate_flip
- (v
->prefill_c
[k
] - 3.0) / 2.0 > 0.0) {
901 v
->v_ratio_pre_cwithout_immediate_flip
[i
][j
][k
] =dcn_bw_max2(v
->v_ratio_pre_cwithout_immediate_flip
[i
][j
][k
], (v
->max_num_sw_c
[k
] * v
->swath_height_cper_state
[i
][j
][k
]) / (v
->line_times_to_request_prefetch_pixel_data_without_immediate_flip
- (v
->prefill_c
[k
] - 3.0) / 2.0));
904 v
->v_ratio_pre_cwithout_immediate_flip
[i
][j
][k
] = 999999.0;
907 v
->required_prefetch_pixel_data_bw_without_immediate_flip
[i
][j
][k
] = v
->no_of_dpp
[i
][j
][k
] * (v
->prefetch_lines_y
[k
] / v
->line_times_to_request_prefetch_pixel_data_without_immediate_flip
*dcn_bw_ceil2(v
->byte_per_pixel_in_dety
[k
], 1.0) + v
->prefetch_lines_c
[k
] / v
->line_times_to_request_prefetch_pixel_data_without_immediate_flip
*dcn_bw_ceil2(v
->byte_per_pixel_in_detc
[k
], 2.0) / 2.0) * v
->swath_width_yper_state
[i
][j
][k
] / (v
->htotal
[k
] / v
->pixel_clock
[k
]);
910 v
->v_ratio_pre_ywithout_immediate_flip
[i
][j
][k
] = 999999.0;
911 v
->v_ratio_pre_cwithout_immediate_flip
[i
][j
][k
] = 999999.0;
912 v
->required_prefetch_pixel_data_bw_without_immediate_flip
[i
][j
][k
] = 999999.0;
915 v
->maximum_read_bandwidth_with_prefetch_with_immediate_flip
= 0.0;
916 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
917 if ((v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_8
&& v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_10
)) {
918 v
->maximum_read_bandwidth_with_prefetch_with_immediate_flip
= v
->maximum_read_bandwidth_with_prefetch_with_immediate_flip
+dcn_bw_max2(v
->read_bandwidth
[k
], v
->required_prefetch_pixel_data_bw_with_immediate_flip
[i
][j
][k
]) +dcn_bw_max2(v
->meta_pte_bytes_per_frame
[k
] / (v
->lines_for_meta_pte_with_immediate_flip
[k
] * v
->htotal
[k
] / v
->pixel_clock
[k
]), (v
->meta_row_bytes
[k
] + v
->dpte_bytes_per_row
[k
]) / (v
->lines_for_meta_and_dpte_row_with_immediate_flip
[k
] * v
->htotal
[k
] / v
->pixel_clock
[k
]));
921 v
->maximum_read_bandwidth_with_prefetch_with_immediate_flip
= v
->maximum_read_bandwidth_with_prefetch_with_immediate_flip
+dcn_bw_max2(v
->read_bandwidth
[k
], v
->required_prefetch_pixel_data_bw_without_immediate_flip
[i
][j
][k
]);
924 v
->maximum_read_bandwidth_with_prefetch_without_immediate_flip
= 0.0;
925 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
926 v
->maximum_read_bandwidth_with_prefetch_without_immediate_flip
= v
->maximum_read_bandwidth_with_prefetch_without_immediate_flip
+dcn_bw_max2(v
->read_bandwidth
[k
], v
->required_prefetch_pixel_data_bw_without_immediate_flip
[i
][j
][k
]);
928 v
->prefetch_supported_with_immediate_flip
[i
][j
] = dcn_bw_yes
;
929 if (v
->maximum_read_bandwidth_with_prefetch_with_immediate_flip
> v
->return_bw_per_state
[i
]) {
930 v
->prefetch_supported_with_immediate_flip
[i
][j
] = dcn_bw_no
;
932 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
933 if (v
->line_times_for_prefetch
[k
] < 2.0 || v
->lines_for_meta_pte_with_immediate_flip
[k
] >= 8.0 || v
->lines_for_meta_and_dpte_row_with_immediate_flip
[k
] >= 16.0) {
934 v
->prefetch_supported_with_immediate_flip
[i
][j
] = dcn_bw_no
;
937 v
->prefetch_supported_without_immediate_flip
[i
][j
] = dcn_bw_yes
;
938 if (v
->maximum_read_bandwidth_with_prefetch_without_immediate_flip
> v
->return_bw_per_state
[i
]) {
939 v
->prefetch_supported_without_immediate_flip
[i
][j
] = dcn_bw_no
;
941 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
942 if (v
->line_times_for_prefetch
[k
] < 2.0 || v
->lines_for_meta_pte_without_immediate_flip
[k
] >= 8.0 || v
->lines_for_meta_and_dpte_row_without_immediate_flip
[k
] >= 16.0) {
943 v
->prefetch_supported_without_immediate_flip
[i
][j
] = dcn_bw_no
;
948 for (i
= 0; i
<= number_of_states_plus_one
; i
++) {
949 for (j
= 0; j
<= 1; j
++) {
950 v
->v_ratio_in_prefetch_supported_with_immediate_flip
[i
][j
] = dcn_bw_yes
;
951 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
952 if ((((v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_8
&& v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_10
) && (v
->v_ratio_pre_ywith_immediate_flip
[i
][j
][k
] > 4.0 || v
->v_ratio_pre_cwith_immediate_flip
[i
][j
][k
] > 4.0)) || ((v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_8
|| v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_10
) && (v
->v_ratio_pre_ywithout_immediate_flip
[i
][j
][k
] > 4.0 || v
->v_ratio_pre_cwithout_immediate_flip
[i
][j
][k
] > 4.0)))) {
953 v
->v_ratio_in_prefetch_supported_with_immediate_flip
[i
][j
] = dcn_bw_no
;
956 v
->v_ratio_in_prefetch_supported_without_immediate_flip
[i
][j
] = dcn_bw_yes
;
957 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
958 if ((v
->v_ratio_pre_ywithout_immediate_flip
[i
][j
][k
] > 4.0 || v
->v_ratio_pre_cwithout_immediate_flip
[i
][j
][k
] > 4.0)) {
959 v
->v_ratio_in_prefetch_supported_without_immediate_flip
[i
][j
] = dcn_bw_no
;
964 /*mode support, voltage state and soc configuration*/
966 for (i
= number_of_states_plus_one
; i
>= 0; i
--) {
967 for (j
= 0; j
<= 1; j
++) {
968 if (v
->scale_ratio_support
== dcn_bw_yes
&& v
->source_format_pixel_and_scan_support
== dcn_bw_yes
&& v
->viewport_size_support
== dcn_bw_yes
&& v
->bandwidth_support
[i
] == dcn_bw_yes
&& v
->dio_support
[i
] == dcn_bw_yes
&& v
->urgent_latency_support
[i
][j
] == dcn_bw_yes
&& v
->rob_support
[i
] == dcn_bw_yes
&& v
->dispclk_dppclk_support
[i
][j
] == dcn_bw_yes
&& v
->total_available_pipes_support
[i
][j
] == dcn_bw_yes
&& v
->total_available_writeback_support
== dcn_bw_yes
&& v
->writeback_latency_support
== dcn_bw_yes
) {
969 if (v
->prefetch_supported_with_immediate_flip
[i
][j
] == dcn_bw_yes
&& v
->v_ratio_in_prefetch_supported_with_immediate_flip
[i
][j
] == dcn_bw_yes
) {
970 v
->mode_support_with_immediate_flip
[i
][j
] = dcn_bw_yes
;
973 v
->mode_support_with_immediate_flip
[i
][j
] = dcn_bw_no
;
975 if (v
->prefetch_supported_without_immediate_flip
[i
][j
] == dcn_bw_yes
&& v
->v_ratio_in_prefetch_supported_without_immediate_flip
[i
][j
] == dcn_bw_yes
) {
976 v
->mode_support_without_immediate_flip
[i
][j
] = dcn_bw_yes
;
979 v
->mode_support_without_immediate_flip
[i
][j
] = dcn_bw_no
;
983 v
->mode_support_with_immediate_flip
[i
][j
] = dcn_bw_no
;
984 v
->mode_support_without_immediate_flip
[i
][j
] = dcn_bw_no
;
988 for (i
= number_of_states_plus_one
; i
>= 0; i
--) {
989 if ((i
== number_of_states_plus_one
|| v
->mode_support_with_immediate_flip
[i
][1] == dcn_bw_yes
|| v
->mode_support_with_immediate_flip
[i
][0] == dcn_bw_yes
) && i
>= v
->voltage_override_level
) {
990 v
->voltage_level_with_immediate_flip
= i
;
993 for (i
= number_of_states_plus_one
; i
>= 0; i
--) {
994 if ((i
== number_of_states_plus_one
|| v
->mode_support_without_immediate_flip
[i
][1] == dcn_bw_yes
|| v
->mode_support_without_immediate_flip
[i
][0] == dcn_bw_yes
) && i
>= v
->voltage_override_level
) {
995 v
->voltage_level_without_immediate_flip
= i
;
998 if (v
->voltage_level_with_immediate_flip
== number_of_states_plus_one
) {
999 v
->immediate_flip_supported
= dcn_bw_no
;
1000 v
->voltage_level
= v
->voltage_level_without_immediate_flip
;
1003 v
->immediate_flip_supported
= dcn_bw_yes
;
1004 v
->voltage_level
= v
->voltage_level_with_immediate_flip
;
1006 v
->dcfclk
= v
->dcfclk_per_state
[v
->voltage_level
];
1007 v
->fabric_and_dram_bandwidth
= v
->fabric_and_dram_bandwidth_per_state
[v
->voltage_level
];
1008 for (j
= 0; j
<= 1; j
++) {
1009 v
->required_dispclk_per_ratio
[j
] = v
->required_dispclk
[v
->voltage_level
][j
];
1010 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1011 v
->dpp_per_plane_per_ratio
[j
][k
] = v
->no_of_dpp
[v
->voltage_level
][j
][k
];
1013 v
->dispclk_dppclk_support_per_ratio
[j
] = v
->dispclk_dppclk_support
[v
->voltage_level
][j
];
1015 v
->max_phyclk
= v
->phyclk_per_state
[v
->voltage_level
];
1017 void display_pipe_configuration(struct dcn_bw_internal_vars
*v
)
1021 /*display pipe configuration*/
1023 for (j
= 0; j
<= 1; j
++) {
1024 v
->total_number_of_active_dpp_per_ratio
[j
] = 0.0;
1025 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1026 v
->total_number_of_active_dpp_per_ratio
[j
] = v
->total_number_of_active_dpp_per_ratio
[j
] + v
->dpp_per_plane_per_ratio
[j
][k
];
1029 if ((v
->dispclk_dppclk_support_per_ratio
[0] == dcn_bw_yes
&& v
->dispclk_dppclk_support_per_ratio
[1] == dcn_bw_no
) || (v
->dispclk_dppclk_support_per_ratio
[0] == v
->dispclk_dppclk_support_per_ratio
[1] && (v
->total_number_of_active_dpp_per_ratio
[0] < v
->total_number_of_active_dpp_per_ratio
[1] || (((v
->total_number_of_active_dpp_per_ratio
[0] == v
->total_number_of_active_dpp_per_ratio
[1]) && v
->required_dispclk_per_ratio
[0] <= 0.5 * v
->required_dispclk_per_ratio
[1]))))) {
1030 v
->dispclk_dppclk_ratio
= 1;
1031 v
->final_error_message
= v
->error_message
[0];
1034 v
->dispclk_dppclk_ratio
= 2;
1035 v
->final_error_message
= v
->error_message
[1];
1037 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1038 v
->dpp_per_plane
[k
] = v
->dpp_per_plane_per_ratio
[v
->dispclk_dppclk_ratio
- 1][k
];
1040 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1041 if (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
) {
1042 v
->byte_per_pix_dety
= 8.0;
1043 v
->byte_per_pix_detc
= 0.0;
1045 else if (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_32
) {
1046 v
->byte_per_pix_dety
= 4.0;
1047 v
->byte_per_pix_detc
= 0.0;
1049 else if (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_16
) {
1050 v
->byte_per_pix_dety
= 2.0;
1051 v
->byte_per_pix_detc
= 0.0;
1053 else if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_8
) {
1054 v
->byte_per_pix_dety
= 1.0;
1055 v
->byte_per_pix_detc
= 2.0;
1058 v
->byte_per_pix_dety
= 4.0f
/ 3.0f
;
1059 v
->byte_per_pix_detc
= 8.0f
/ 3.0f
;
1061 if ((v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
|| v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_32
|| v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_16
)) {
1062 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
1063 v
->read256_bytes_block_height_y
= 1.0;
1065 else if (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
) {
1066 v
->read256_bytes_block_height_y
= 4.0;
1069 v
->read256_bytes_block_height_y
= 8.0;
1071 v
->read256_bytes_block_width_y
= 256.0 /dcn_bw_ceil2(v
->byte_per_pix_dety
, 1.0) / v
->read256_bytes_block_height_y
;
1072 v
->read256_bytes_block_height_c
= 0.0;
1073 v
->read256_bytes_block_width_c
= 0.0;
1076 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
1077 v
->read256_bytes_block_height_y
= 1.0;
1078 v
->read256_bytes_block_height_c
= 1.0;
1080 else if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_8
) {
1081 v
->read256_bytes_block_height_y
= 16.0;
1082 v
->read256_bytes_block_height_c
= 8.0;
1085 v
->read256_bytes_block_height_y
= 8.0;
1086 v
->read256_bytes_block_height_c
= 8.0;
1088 v
->read256_bytes_block_width_y
= 256.0 /dcn_bw_ceil2(v
->byte_per_pix_dety
, 1.0) / v
->read256_bytes_block_height_y
;
1089 v
->read256_bytes_block_width_c
= 256.0 /dcn_bw_ceil2(v
->byte_per_pix_detc
, 2.0) / v
->read256_bytes_block_height_c
;
1091 if (v
->source_scan
[k
] == dcn_bw_hor
) {
1092 v
->maximum_swath_height_y
= v
->read256_bytes_block_height_y
;
1093 v
->maximum_swath_height_c
= v
->read256_bytes_block_height_c
;
1096 v
->maximum_swath_height_y
= v
->read256_bytes_block_width_y
;
1097 v
->maximum_swath_height_c
= v
->read256_bytes_block_width_c
;
1099 if ((v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
|| v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_32
|| v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_16
)) {
1100 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
|| (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
&& (v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_t
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_var_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_var_s_x
) && v
->source_scan
[k
] == dcn_bw_hor
)) {
1101 v
->minimum_swath_height_y
= v
->maximum_swath_height_y
;
1104 v
->minimum_swath_height_y
= v
->maximum_swath_height_y
/ 2.0;
1106 v
->minimum_swath_height_c
= v
->maximum_swath_height_c
;
1109 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
1110 v
->minimum_swath_height_y
= v
->maximum_swath_height_y
;
1111 v
->minimum_swath_height_c
= v
->maximum_swath_height_c
;
1113 else if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_8
&& v
->source_scan
[k
] == dcn_bw_hor
) {
1114 v
->minimum_swath_height_y
= v
->maximum_swath_height_y
/ 2.0;
1115 if (v
->bug_forcing_luma_and_chroma_request_to_same_size_fixed
== dcn_bw_yes
) {
1116 v
->minimum_swath_height_c
= v
->maximum_swath_height_c
;
1119 v
->minimum_swath_height_c
= v
->maximum_swath_height_c
/ 2.0;
1122 else if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_10
&& v
->source_scan
[k
] == dcn_bw_hor
) {
1123 v
->minimum_swath_height_c
= v
->maximum_swath_height_c
/ 2.0;
1124 if (v
->bug_forcing_luma_and_chroma_request_to_same_size_fixed
== dcn_bw_yes
) {
1125 v
->minimum_swath_height_y
= v
->maximum_swath_height_y
;
1128 v
->minimum_swath_height_y
= v
->maximum_swath_height_y
/ 2.0;
1132 v
->minimum_swath_height_y
= v
->maximum_swath_height_y
;
1133 v
->minimum_swath_height_c
= v
->maximum_swath_height_c
;
1136 if (v
->source_scan
[k
] == dcn_bw_hor
) {
1137 v
->swath_width
= v
->viewport_width
[k
] / v
->dpp_per_plane
[k
];
1140 v
->swath_width
= v
->viewport_height
[k
] / v
->dpp_per_plane
[k
];
1142 v
->swath_width_granularity_y
= 256.0 /dcn_bw_ceil2(v
->byte_per_pix_dety
, 1.0) / v
->maximum_swath_height_y
;
1143 v
->rounded_up_max_swath_size_bytes_y
= (dcn_bw_ceil2(v
->swath_width
- 1.0, v
->swath_width_granularity_y
) + v
->swath_width_granularity_y
) * v
->byte_per_pix_dety
* v
->maximum_swath_height_y
;
1144 if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_10
) {
1145 v
->rounded_up_max_swath_size_bytes_y
=dcn_bw_ceil2(v
->rounded_up_max_swath_size_bytes_y
, 256.0) + 256;
1147 if (v
->maximum_swath_height_c
> 0.0) {
1148 v
->swath_width_granularity_c
= 256.0 /dcn_bw_ceil2(v
->byte_per_pix_detc
, 2.0) / v
->maximum_swath_height_c
;
1150 v
->rounded_up_max_swath_size_bytes_c
= (dcn_bw_ceil2(v
->swath_width
/ 2.0 - 1.0, v
->swath_width_granularity_c
) + v
->swath_width_granularity_c
) * v
->byte_per_pix_detc
* v
->maximum_swath_height_c
;
1151 if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_10
) {
1152 v
->rounded_up_max_swath_size_bytes_c
=dcn_bw_ceil2(v
->rounded_up_max_swath_size_bytes_c
, 256.0) + 256;
1154 if (v
->rounded_up_max_swath_size_bytes_y
+ v
->rounded_up_max_swath_size_bytes_c
<= v
->det_buffer_size_in_kbyte
* 1024.0 / 2.0) {
1155 v
->swath_height_y
[k
] = v
->maximum_swath_height_y
;
1156 v
->swath_height_c
[k
] = v
->maximum_swath_height_c
;
1159 v
->swath_height_y
[k
] = v
->minimum_swath_height_y
;
1160 v
->swath_height_c
[k
] = v
->minimum_swath_height_c
;
1162 if (v
->swath_height_c
[k
] == 0.0) {
1163 v
->det_buffer_size_y
[k
] = v
->det_buffer_size_in_kbyte
* 1024.0;
1164 v
->det_buffer_size_c
[k
] = 0.0;
1166 else if (v
->swath_height_y
[k
] <= v
->swath_height_c
[k
]) {
1167 v
->det_buffer_size_y
[k
] = v
->det_buffer_size_in_kbyte
* 1024.0 / 2.0;
1168 v
->det_buffer_size_c
[k
] = v
->det_buffer_size_in_kbyte
* 1024.0 / 2.0;
1171 v
->det_buffer_size_y
[k
] = v
->det_buffer_size_in_kbyte
* 1024.0 * 2.0 / 3.0;
1172 v
->det_buffer_size_c
[k
] = v
->det_buffer_size_in_kbyte
* 1024.0 / 3.0;
1176 void dispclkdppclkdcfclk_deep_sleep_prefetch_parameters_watermarks_and_performance_calculation(struct dcn_bw_internal_vars
*v
)
1179 /*dispclk and dppclk calculation*/
1181 v
->dispclk_with_ramping
= 0.0;
1182 v
->dispclk_without_ramping
= 0.0;
1183 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1184 if (v
->h_ratio
[k
] > 1.0) {
1185 v
->pscl_throughput
[k
] =dcn_bw_min2(v
->max_dchub_topscl_throughput
, v
->max_pscl_tolb_throughput
* v
->h_ratio
[k
] /dcn_bw_ceil2(v
->htaps
[k
] / 6.0, 1.0));
1188 v
->pscl_throughput
[k
] =dcn_bw_min2(v
->max_dchub_topscl_throughput
, v
->max_pscl_tolb_throughput
);
1190 v
->dppclk_using_single_dpp_luma
= v
->pixel_clock
[k
] *dcn_bw_max3(v
->vtaps
[k
] / 6.0 *dcn_bw_min2(1.0, v
->h_ratio
[k
]), v
->h_ratio
[k
] * v
->v_ratio
[k
] / v
->pscl_throughput
[k
], 1.0);
1191 if ((v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_8
&& v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_10
)) {
1192 v
->pscl_throughput_chroma
[k
] = 0.0;
1193 v
->dppclk_using_single_dpp
= v
->dppclk_using_single_dpp_luma
;
1196 if (v
->h_ratio
[k
] > 1.0) {
1197 v
->pscl_throughput_chroma
[k
] =dcn_bw_min2(v
->max_dchub_topscl_throughput
, v
->max_pscl_tolb_throughput
* v
->h_ratio
[k
] / 2.0 /dcn_bw_ceil2(v
->hta_pschroma
[k
] / 6.0, 1.0));
1200 v
->pscl_throughput_chroma
[k
] =dcn_bw_min2(v
->max_dchub_topscl_throughput
, v
->max_pscl_tolb_throughput
);
1202 v
->dppclk_using_single_dpp_chroma
= v
->pixel_clock
[k
] *dcn_bw_max3(v
->vta_pschroma
[k
] / 6.0 *dcn_bw_min2(1.0, v
->h_ratio
[k
] / 2.0), v
->h_ratio
[k
] * v
->v_ratio
[k
] / 4.0 / v
->pscl_throughput_chroma
[k
], 1.0);
1203 v
->dppclk_using_single_dpp
=dcn_bw_max2(v
->dppclk_using_single_dpp_luma
, v
->dppclk_using_single_dpp_chroma
);
1205 if (v
->odm_capable
== dcn_bw_yes
) {
1206 v
->dispclk_with_ramping
=dcn_bw_max2(v
->dispclk_with_ramping
,dcn_bw_max2(v
->dppclk_using_single_dpp
/ v
->dpp_per_plane
[k
] * v
->dispclk_dppclk_ratio
, v
->pixel_clock
[k
] / v
->dpp_per_plane
[k
]) * (1.0 + v
->downspreading
/ 100.0) * (1.0 + v
->dispclk_ramping_margin
/ 100.0));
1207 v
->dispclk_without_ramping
=dcn_bw_max2(v
->dispclk_without_ramping
,dcn_bw_max2(v
->dppclk_using_single_dpp
/ v
->dpp_per_plane
[k
] * v
->dispclk_dppclk_ratio
, v
->pixel_clock
[k
] / v
->dpp_per_plane
[k
]) * (1.0 + v
->downspreading
/ 100.0));
1210 v
->dispclk_with_ramping
=dcn_bw_max2(v
->dispclk_with_ramping
,dcn_bw_max2(v
->dppclk_using_single_dpp
/ v
->dpp_per_plane
[k
] * v
->dispclk_dppclk_ratio
, v
->pixel_clock
[k
]) * (1.0 + v
->downspreading
/ 100.0) * (1.0 + v
->dispclk_ramping_margin
/ 100.0));
1211 v
->dispclk_without_ramping
=dcn_bw_max2(v
->dispclk_without_ramping
,dcn_bw_max2(v
->dppclk_using_single_dpp
/ v
->dpp_per_plane
[k
] * v
->dispclk_dppclk_ratio
, v
->pixel_clock
[k
]) * (1.0 + v
->downspreading
/ 100.0));
1214 if (v
->dispclk_without_ramping
> v
->max_dispclk
[number_of_states
]) {
1215 v
->dispclk
= v
->dispclk_without_ramping
;
1217 else if (v
->dispclk_with_ramping
> v
->max_dispclk
[number_of_states
]) {
1218 v
->dispclk
= v
->max_dispclk
[number_of_states
];
1221 v
->dispclk
= v
->dispclk_with_ramping
;
1223 v
->dppclk
= v
->dispclk
/ v
->dispclk_dppclk_ratio
;
1224 /*urgent watermark*/
1226 v
->return_bandwidth_to_dcn
=dcn_bw_min2(v
->return_bus_width
* v
->dcfclk
, v
->fabric_and_dram_bandwidth
* 1000.0 * v
->percent_of_ideal_drambw_received_after_urg_latency
/ 100.0);
1227 v
->dcc_enabled_any_plane
= dcn_bw_no
;
1228 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1229 if (v
->dcc_enable
[k
] == dcn_bw_yes
) {
1230 v
->dcc_enabled_any_plane
= dcn_bw_yes
;
1233 v
->return_bw
= v
->return_bandwidth_to_dcn
;
1234 if (v
->dcc_enabled_any_plane
== dcn_bw_yes
&& v
->return_bandwidth_to_dcn
> v
->dcfclk
* v
->return_bus_width
/ 4.0) {
1235 v
->return_bw
=dcn_bw_min2(v
->return_bw
, v
->return_bandwidth_to_dcn
* 4.0 * (1.0 - v
->urgent_latency
/ ((v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0 / (v
->return_bandwidth_to_dcn
- v
->dcfclk
* v
->return_bus_width
/ 4.0) + v
->urgent_latency
)));
1237 v
->critical_compression
= 2.0 * v
->return_bus_width
* v
->dcfclk
* v
->urgent_latency
/ (v
->return_bandwidth_to_dcn
* v
->urgent_latency
+ (v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0);
1238 if (v
->dcc_enabled_any_plane
== dcn_bw_yes
&& v
->critical_compression
> 1.0 && v
->critical_compression
< 4.0) {
1239 v
->return_bw
=dcn_bw_min2(v
->return_bw
, dcn_bw_pow(4.0 * v
->return_bandwidth_to_dcn
* (v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0 * v
->return_bus_width
* v
->dcfclk
* v
->urgent_latency
/ (v
->return_bandwidth_to_dcn
* v
->urgent_latency
+ (v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0), 2));
1241 v
->return_bandwidth_to_dcn
=dcn_bw_min2(v
->return_bus_width
* v
->dcfclk
, v
->fabric_and_dram_bandwidth
* 1000.0);
1242 if (v
->dcc_enabled_any_plane
== dcn_bw_yes
&& v
->return_bandwidth_to_dcn
> v
->dcfclk
* v
->return_bus_width
/ 4.0) {
1243 v
->return_bw
=dcn_bw_min2(v
->return_bw
, v
->return_bandwidth_to_dcn
* 4.0 * (1.0 - v
->urgent_latency
/ ((v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0 / (v
->return_bandwidth_to_dcn
- v
->dcfclk
* v
->return_bus_width
/ 4.0) + v
->urgent_latency
)));
1245 v
->critical_compression
= 2.0 * v
->return_bus_width
* v
->dcfclk
* v
->urgent_latency
/ (v
->return_bandwidth_to_dcn
* v
->urgent_latency
+ (v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0);
1246 if (v
->dcc_enabled_any_plane
== dcn_bw_yes
&& v
->critical_compression
> 1.0 && v
->critical_compression
< 4.0) {
1247 v
->return_bw
=dcn_bw_min2(v
->return_bw
, dcn_bw_pow(4.0 * v
->return_bandwidth_to_dcn
* (v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0 * v
->return_bus_width
* v
->dcfclk
* v
->urgent_latency
/ (v
->return_bandwidth_to_dcn
* v
->urgent_latency
+ (v
->rob_buffer_size_in_kbyte
- v
->pixel_chunk_size_in_kbyte
) * 1024.0), 2));
1249 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1250 if (v
->source_scan
[k
] == dcn_bw_hor
) {
1251 v
->swath_width_y
[k
] = v
->viewport_width
[k
] / v
->dpp_per_plane
[k
];
1254 v
->swath_width_y
[k
] = v
->viewport_height
[k
] / v
->dpp_per_plane
[k
];
1257 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1258 if (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
) {
1259 v
->byte_per_pixel_dety
[k
] = 8.0;
1260 v
->byte_per_pixel_detc
[k
] = 0.0;
1262 else if (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_32
) {
1263 v
->byte_per_pixel_dety
[k
] = 4.0;
1264 v
->byte_per_pixel_detc
[k
] = 0.0;
1266 else if (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_16
) {
1267 v
->byte_per_pixel_dety
[k
] = 2.0;
1268 v
->byte_per_pixel_detc
[k
] = 0.0;
1270 else if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_8
) {
1271 v
->byte_per_pixel_dety
[k
] = 1.0;
1272 v
->byte_per_pixel_detc
[k
] = 2.0;
1275 v
->byte_per_pixel_dety
[k
] = 4.0f
/ 3.0f
;
1276 v
->byte_per_pixel_detc
[k
] = 8.0f
/ 3.0f
;
1279 v
->total_data_read_bandwidth
= 0.0;
1280 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1281 v
->read_bandwidth_plane_luma
[k
] = v
->swath_width_y
[k
] * v
->dpp_per_plane
[k
] *dcn_bw_ceil2(v
->byte_per_pixel_dety
[k
], 1.0) / (v
->htotal
[k
] / v
->pixel_clock
[k
]) * v
->v_ratio
[k
];
1282 v
->read_bandwidth_plane_chroma
[k
] = v
->swath_width_y
[k
] / 2.0 * v
->dpp_per_plane
[k
] *dcn_bw_ceil2(v
->byte_per_pixel_detc
[k
], 2.0) / (v
->htotal
[k
] / v
->pixel_clock
[k
]) * v
->v_ratio
[k
] / 2.0;
1283 v
->total_data_read_bandwidth
= v
->total_data_read_bandwidth
+ v
->read_bandwidth_plane_luma
[k
] + v
->read_bandwidth_plane_chroma
[k
];
1285 v
->total_active_dpp
= 0.0;
1286 v
->total_dcc_active_dpp
= 0.0;
1287 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1288 v
->total_active_dpp
= v
->total_active_dpp
+ v
->dpp_per_plane
[k
];
1289 if (v
->dcc_enable
[k
] == dcn_bw_yes
) {
1290 v
->total_dcc_active_dpp
= v
->total_dcc_active_dpp
+ v
->dpp_per_plane
[k
];
1293 v
->urgent_round_trip_and_out_of_order_latency
= (v
->round_trip_ping_latency_cycles
+ 32.0) / v
->dcfclk
+ v
->urgent_out_of_order_return_per_channel
* v
->number_of_channels
/ v
->return_bw
;
1294 v
->last_pixel_of_line_extra_watermark
= 0.0;
1295 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1296 if (v
->v_ratio
[k
] <= 1.0) {
1297 v
->display_pipe_line_delivery_time_luma
[k
] = v
->swath_width_y
[k
] * v
->dpp_per_plane
[k
] / v
->h_ratio
[k
] / v
->pixel_clock
[k
];
1300 v
->display_pipe_line_delivery_time_luma
[k
] = v
->swath_width_y
[k
] / v
->pscl_throughput
[k
] / v
->dppclk
;
1302 v
->data_fabric_line_delivery_time_luma
= v
->swath_width_y
[k
] * v
->swath_height_y
[k
] *dcn_bw_ceil2(v
->byte_per_pixel_dety
[k
], 1.0) / (v
->return_bw
* v
->read_bandwidth_plane_luma
[k
] / v
->dpp_per_plane
[k
] / v
->total_data_read_bandwidth
);
1303 v
->last_pixel_of_line_extra_watermark
=dcn_bw_max2(v
->last_pixel_of_line_extra_watermark
, v
->data_fabric_line_delivery_time_luma
- v
->display_pipe_line_delivery_time_luma
[k
]);
1304 if (v
->byte_per_pixel_detc
[k
] == 0.0) {
1305 v
->display_pipe_line_delivery_time_chroma
[k
] = 0.0;
1308 if (v
->v_ratio
[k
] / 2.0 <= 1.0) {
1309 v
->display_pipe_line_delivery_time_chroma
[k
] = v
->swath_width_y
[k
] / 2.0 * v
->dpp_per_plane
[k
] / (v
->h_ratio
[k
] / 2.0) / v
->pixel_clock
[k
];
1312 v
->display_pipe_line_delivery_time_chroma
[k
] = v
->swath_width_y
[k
] / 2.0 / v
->pscl_throughput_chroma
[k
] / v
->dppclk
;
1314 v
->data_fabric_line_delivery_time_chroma
= v
->swath_width_y
[k
] / 2.0 * v
->swath_height_c
[k
] *dcn_bw_ceil2(v
->byte_per_pixel_detc
[k
], 2.0) / (v
->return_bw
* v
->read_bandwidth_plane_chroma
[k
] / v
->dpp_per_plane
[k
] / v
->total_data_read_bandwidth
);
1315 v
->last_pixel_of_line_extra_watermark
=dcn_bw_max2(v
->last_pixel_of_line_extra_watermark
, v
->data_fabric_line_delivery_time_chroma
- v
->display_pipe_line_delivery_time_chroma
[k
]);
1318 v
->urgent_extra_latency
= v
->urgent_round_trip_and_out_of_order_latency
+ (v
->total_active_dpp
* v
->pixel_chunk_size_in_kbyte
+ v
->total_dcc_active_dpp
* v
->meta_chunk_size
) * 1024.0 / v
->return_bw
;
1319 if (v
->pte_enable
== dcn_bw_yes
) {
1320 v
->urgent_extra_latency
= v
->urgent_extra_latency
+ v
->total_active_dpp
* v
->pte_chunk_size
* 1024.0 / v
->return_bw
;
1322 v
->urgent_watermark
= v
->urgent_latency
+ v
->last_pixel_of_line_extra_watermark
+ v
->urgent_extra_latency
;
1323 v
->ptemeta_urgent_watermark
= v
->urgent_watermark
+ 2.0 * v
->urgent_latency
;
1324 /*nb p-state/dram clock change watermark*/
1326 v
->dram_clock_change_watermark
= v
->dram_clock_change_latency
+ v
->urgent_watermark
;
1327 v
->total_active_writeback
= 0.0;
1328 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1329 if (v
->output
[k
] == dcn_bw_writeback
) {
1330 v
->total_active_writeback
= v
->total_active_writeback
+ 1.0;
1333 if (v
->total_active_writeback
<= 1.0) {
1334 v
->writeback_dram_clock_change_watermark
= v
->dram_clock_change_latency
+ v
->write_back_latency
;
1337 v
->writeback_dram_clock_change_watermark
= v
->dram_clock_change_latency
+ v
->write_back_latency
+ v
->writeback_chunk_size
* 1024.0 / 32.0 / v
->socclk
;
1339 /*stutter efficiency*/
1341 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1342 v
->lines_in_dety
[k
] = v
->det_buffer_size_y
[k
] / v
->byte_per_pixel_dety
[k
] / v
->swath_width_y
[k
];
1343 v
->lines_in_dety_rounded_down_to_swath
[k
] =dcn_bw_floor2(v
->lines_in_dety
[k
], v
->swath_height_y
[k
]);
1344 v
->full_det_buffering_time_y
[k
] = v
->lines_in_dety_rounded_down_to_swath
[k
] * (v
->htotal
[k
] / v
->pixel_clock
[k
]) / v
->v_ratio
[k
];
1345 if (v
->byte_per_pixel_detc
[k
] > 0.0) {
1346 v
->lines_in_detc
[k
] = v
->det_buffer_size_c
[k
] / v
->byte_per_pixel_detc
[k
] / (v
->swath_width_y
[k
] / 2.0);
1347 v
->lines_in_detc_rounded_down_to_swath
[k
] =dcn_bw_floor2(v
->lines_in_detc
[k
], v
->swath_height_c
[k
]);
1348 v
->full_det_buffering_time_c
[k
] = v
->lines_in_detc_rounded_down_to_swath
[k
] * (v
->htotal
[k
] / v
->pixel_clock
[k
]) / (v
->v_ratio
[k
] / 2.0);
1351 v
->lines_in_detc
[k
] = 0.0;
1352 v
->lines_in_detc_rounded_down_to_swath
[k
] = 0.0;
1353 v
->full_det_buffering_time_c
[k
] = 999999.0;
1356 v
->min_full_det_buffering_time
= 999999.0;
1357 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1358 if (v
->full_det_buffering_time_y
[k
] < v
->min_full_det_buffering_time
) {
1359 v
->min_full_det_buffering_time
= v
->full_det_buffering_time_y
[k
];
1360 v
->frame_time_for_min_full_det_buffering_time
= v
->vtotal
[k
] * v
->htotal
[k
] / v
->pixel_clock
[k
];
1362 if (v
->full_det_buffering_time_c
[k
] < v
->min_full_det_buffering_time
) {
1363 v
->min_full_det_buffering_time
= v
->full_det_buffering_time_c
[k
];
1364 v
->frame_time_for_min_full_det_buffering_time
= v
->vtotal
[k
] * v
->htotal
[k
] / v
->pixel_clock
[k
];
1367 v
->average_read_bandwidth_gbyte_per_second
= 0.0;
1368 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1369 if (v
->dcc_enable
[k
] == dcn_bw_yes
) {
1370 v
->average_read_bandwidth_gbyte_per_second
= v
->average_read_bandwidth_gbyte_per_second
+ v
->read_bandwidth_plane_luma
[k
] / v
->dcc_rate
[k
] / 1000.0 + v
->read_bandwidth_plane_chroma
[k
] / v
->dcc_rate
[k
] / 1000.0;
1373 v
->average_read_bandwidth_gbyte_per_second
= v
->average_read_bandwidth_gbyte_per_second
+ v
->read_bandwidth_plane_luma
[k
] / 1000.0 + v
->read_bandwidth_plane_chroma
[k
] / 1000.0;
1375 if (v
->dcc_enable
[k
] == dcn_bw_yes
) {
1376 v
->average_read_bandwidth_gbyte_per_second
= v
->average_read_bandwidth_gbyte_per_second
+ v
->read_bandwidth_plane_luma
[k
] / 1000.0 / 256.0 + v
->read_bandwidth_plane_chroma
[k
] / 1000.0 / 256.0;
1378 if (v
->pte_enable
== dcn_bw_yes
) {
1379 v
->average_read_bandwidth_gbyte_per_second
= v
->average_read_bandwidth_gbyte_per_second
+ v
->read_bandwidth_plane_luma
[k
] / 1000.0 / 512.0 + v
->read_bandwidth_plane_chroma
[k
] / 1000.0 / 512.0;
1382 v
->part_of_burst_that_fits_in_rob
=dcn_bw_min2(v
->min_full_det_buffering_time
* v
->total_data_read_bandwidth
, v
->rob_buffer_size_in_kbyte
* 1024.0 * v
->total_data_read_bandwidth
/ (v
->average_read_bandwidth_gbyte_per_second
* 1000.0));
1383 v
->stutter_burst_time
= v
->part_of_burst_that_fits_in_rob
* (v
->average_read_bandwidth_gbyte_per_second
* 1000.0) / v
->total_data_read_bandwidth
/ v
->return_bw
+ (v
->min_full_det_buffering_time
* v
->total_data_read_bandwidth
- v
->part_of_burst_that_fits_in_rob
) / (v
->dcfclk
* 64.0);
1384 if (v
->total_active_writeback
== 0.0) {
1385 v
->stutter_efficiency_not_including_vblank
= (1.0 - (v
->sr_exit_time
+ v
->stutter_burst_time
) / v
->min_full_det_buffering_time
) * 100.0;
1388 v
->stutter_efficiency_not_including_vblank
= 0.0;
1390 v
->smallest_vblank
= 999999.0;
1391 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1392 if (v
->synchronized_vblank
== dcn_bw_yes
|| v
->number_of_active_planes
== 1) {
1393 v
->v_blank_time
= (v
->vtotal
[k
] - v
->vactive
[k
]) * v
->htotal
[k
] / v
->pixel_clock
[k
];
1396 v
->v_blank_time
= 0.0;
1398 v
->smallest_vblank
=dcn_bw_min2(v
->smallest_vblank
, v
->v_blank_time
);
1400 v
->stutter_efficiency
= (v
->stutter_efficiency_not_including_vblank
/ 100.0 * (v
->frame_time_for_min_full_det_buffering_time
- v
->smallest_vblank
) + v
->smallest_vblank
) / v
->frame_time_for_min_full_det_buffering_time
* 100.0;
1401 /*dcfclk deep sleep*/
1403 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1404 if (v
->byte_per_pixel_detc
[k
] > 0.0) {
1405 v
->dcfclk_deep_sleep_per_plane
[k
] =dcn_bw_max2(1.1 * v
->swath_width_y
[k
] *dcn_bw_ceil2(v
->byte_per_pixel_dety
[k
], 1.0) / 32.0 / v
->display_pipe_line_delivery_time_luma
[k
], 1.1 * v
->swath_width_y
[k
] / 2.0 *dcn_bw_ceil2(v
->byte_per_pixel_detc
[k
], 2.0) / 32.0 / v
->display_pipe_line_delivery_time_chroma
[k
]);
1408 v
->dcfclk_deep_sleep_per_plane
[k
] = 1.1 * v
->swath_width_y
[k
] *dcn_bw_ceil2(v
->byte_per_pixel_dety
[k
], 1.0) / 64.0 / v
->display_pipe_line_delivery_time_luma
[k
];
1410 v
->dcfclk_deep_sleep_per_plane
[k
] =dcn_bw_max2(v
->dcfclk_deep_sleep_per_plane
[k
], v
->pixel_clock
[k
] / 16.0);
1412 v
->dcf_clk_deep_sleep
= 8.0;
1413 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1414 v
->dcf_clk_deep_sleep
=dcn_bw_max2(v
->dcf_clk_deep_sleep
, v
->dcfclk_deep_sleep_per_plane
[k
]);
1416 /*stutter watermark*/
1418 v
->stutter_exit_watermark
= v
->sr_exit_time
+ v
->last_pixel_of_line_extra_watermark
+ v
->urgent_extra_latency
+ 10.0 / v
->dcf_clk_deep_sleep
;
1419 v
->stutter_enter_plus_exit_watermark
= v
->sr_enter_plus_exit_time
+ v
->last_pixel_of_line_extra_watermark
+ v
->urgent_extra_latency
;
1420 /*urgent latency supported*/
1422 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1423 v
->effective_det_plus_lb_lines_luma
=dcn_bw_floor2(v
->lines_in_dety
[k
] +dcn_bw_min2(v
->lines_in_dety
[k
] * v
->dppclk
* v
->byte_per_pixel_dety
[k
] * v
->pscl_throughput
[k
] / (v
->return_bw
/ v
->dpp_per_plane
[k
]), v
->effective_lb_latency_hiding_source_lines_luma
), v
->swath_height_y
[k
]);
1424 v
->urgent_latency_support_us_luma
= v
->effective_det_plus_lb_lines_luma
* (v
->htotal
[k
] / v
->pixel_clock
[k
]) / v
->v_ratio
[k
] - v
->effective_det_plus_lb_lines_luma
* v
->swath_width_y
[k
] * v
->byte_per_pixel_dety
[k
] / (v
->return_bw
/ v
->dpp_per_plane
[k
]);
1425 if (v
->byte_per_pixel_detc
[k
] > 0.0) {
1426 v
->effective_det_plus_lb_lines_chroma
=dcn_bw_floor2(v
->lines_in_detc
[k
] +dcn_bw_min2(v
->lines_in_detc
[k
] * v
->dppclk
* v
->byte_per_pixel_detc
[k
] * v
->pscl_throughput_chroma
[k
] / (v
->return_bw
/ v
->dpp_per_plane
[k
]), v
->effective_lb_latency_hiding_source_lines_chroma
), v
->swath_height_c
[k
]);
1427 v
->urgent_latency_support_us_chroma
= v
->effective_det_plus_lb_lines_chroma
* (v
->htotal
[k
] / v
->pixel_clock
[k
]) / (v
->v_ratio
[k
] / 2.0) - v
->effective_det_plus_lb_lines_chroma
* (v
->swath_width_y
[k
] / 2.0) * v
->byte_per_pixel_detc
[k
] / (v
->return_bw
/ v
->dpp_per_plane
[k
]);
1428 v
->urgent_latency_support_us
[k
] =dcn_bw_min2(v
->urgent_latency_support_us_luma
, v
->urgent_latency_support_us_chroma
);
1431 v
->urgent_latency_support_us
[k
] = v
->urgent_latency_support_us_luma
;
1434 v
->min_urgent_latency_support_us
= 999999.0;
1435 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1436 v
->min_urgent_latency_support_us
=dcn_bw_min2(v
->min_urgent_latency_support_us
, v
->urgent_latency_support_us
[k
]);
1438 /*non-urgent latency tolerance*/
1440 v
->non_urgent_latency_tolerance
= v
->min_urgent_latency_support_us
- v
->urgent_watermark
;
1443 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1444 if ((v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
|| v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_32
|| v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_16
)) {
1445 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
1446 v
->block_height256_bytes_y
= 1.0;
1448 else if (v
->source_pixel_format
[k
] == dcn_bw_rgb_sub_64
) {
1449 v
->block_height256_bytes_y
= 4.0;
1452 v
->block_height256_bytes_y
= 8.0;
1454 v
->block_height256_bytes_c
= 0.0;
1457 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
1458 v
->block_height256_bytes_y
= 1.0;
1459 v
->block_height256_bytes_c
= 1.0;
1461 else if (v
->source_pixel_format
[k
] == dcn_bw_yuv420_sub_8
) {
1462 v
->block_height256_bytes_y
= 16.0;
1463 v
->block_height256_bytes_c
= 8.0;
1466 v
->block_height256_bytes_y
= 8.0;
1467 v
->block_height256_bytes_c
= 8.0;
1470 if (v
->dcc_enable
[k
] == dcn_bw_yes
) {
1471 v
->meta_request_width_y
= 64.0 * 256.0 /dcn_bw_ceil2(v
->byte_per_pixel_dety
[k
], 1.0) / (8.0 * v
->block_height256_bytes_y
);
1472 v
->meta_surf_width_y
=dcn_bw_ceil2(v
->swath_width_y
[k
] - 1.0, v
->meta_request_width_y
) + v
->meta_request_width_y
;
1473 v
->meta_surf_height_y
=dcn_bw_ceil2(v
->viewport_height
[k
] - 1.0, 8.0 * v
->block_height256_bytes_y
) + 8.0 * v
->block_height256_bytes_y
;
1474 if (v
->pte_enable
== dcn_bw_yes
) {
1475 v
->meta_pte_bytes_frame_y
= (dcn_bw_ceil2((v
->meta_surf_width_y
* v
->meta_surf_height_y
*dcn_bw_ceil2(v
->byte_per_pixel_dety
[k
], 1.0) / 256.0 - 4096.0) / 8.0 / 4096.0, 1.0) + 1) * 64.0;
1478 v
->meta_pte_bytes_frame_y
= 0.0;
1480 if (v
->source_scan
[k
] == dcn_bw_hor
) {
1481 v
->meta_row_byte_y
= v
->meta_surf_width_y
* 8.0 * v
->block_height256_bytes_y
*dcn_bw_ceil2(v
->byte_per_pixel_dety
[k
], 1.0) / 256.0;
1484 v
->meta_row_byte_y
= v
->meta_surf_height_y
* v
->meta_request_width_y
*dcn_bw_ceil2(v
->byte_per_pixel_dety
[k
], 1.0) / 256.0;
1488 v
->meta_pte_bytes_frame_y
= 0.0;
1489 v
->meta_row_byte_y
= 0.0;
1491 if (v
->pte_enable
== dcn_bw_yes
) {
1492 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
1493 v
->macro_tile_size_byte_y
= 256.0;
1494 v
->macro_tile_height_y
= 1.0;
1496 else if (v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_d
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_d_x
) {
1497 v
->macro_tile_size_byte_y
= 4096.0;
1498 v
->macro_tile_height_y
= 4.0 * v
->block_height256_bytes_y
;
1500 else if (v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_t
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d_t
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d_x
) {
1501 v
->macro_tile_size_byte_y
= 64.0 * 1024;
1502 v
->macro_tile_height_y
= 16.0 * v
->block_height256_bytes_y
;
1505 v
->macro_tile_size_byte_y
= 256.0 * 1024;
1506 v
->macro_tile_height_y
= 32.0 * v
->block_height256_bytes_y
;
1508 if (v
->macro_tile_size_byte_y
<= 65536.0) {
1509 v
->pixel_pte_req_height_y
= v
->macro_tile_height_y
;
1512 v
->pixel_pte_req_height_y
= 16.0 * v
->block_height256_bytes_y
;
1514 v
->pixel_pte_req_width_y
= 4096.0 /dcn_bw_ceil2(v
->byte_per_pixel_dety
[k
], 1.0) / v
->pixel_pte_req_height_y
* 8;
1515 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
1516 v
->pixel_pte_bytes_per_row_y
= 64.0 * (dcn_bw_ceil2((v
->swath_width_y
[k
] *dcn_bw_min2(128.0, dcn_bw_pow(2.0,dcn_bw_floor2(dcn_bw_log(v
->pte_buffer_size_in_requests
* v
->pixel_pte_req_width_y
/ v
->swath_width_y
[k
], 2.0), 1.0))) - 1.0) / v
->pixel_pte_req_width_y
, 1.0) + 1);
1518 else if (v
->source_scan
[k
] == dcn_bw_hor
) {
1519 v
->pixel_pte_bytes_per_row_y
= 64.0 * (dcn_bw_ceil2((v
->swath_width_y
[k
] - 1.0) / v
->pixel_pte_req_width_y
, 1.0) + 1);
1522 v
->pixel_pte_bytes_per_row_y
= 64.0 * (dcn_bw_ceil2((v
->viewport_height
[k
] - 1.0) / v
->pixel_pte_req_height_y
, 1.0) + 1);
1526 v
->pixel_pte_bytes_per_row_y
= 0.0;
1528 if ((v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_64
&& v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_32
&& v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_16
)) {
1529 if (v
->dcc_enable
[k
] == dcn_bw_yes
) {
1530 v
->meta_request_width_c
= 64.0 * 256.0 /dcn_bw_ceil2(v
->byte_per_pixel_detc
[k
], 2.0) / (8.0 * v
->block_height256_bytes_c
);
1531 v
->meta_surf_width_c
=dcn_bw_ceil2(v
->swath_width_y
[k
] / 2.0 - 1.0, v
->meta_request_width_c
) + v
->meta_request_width_c
;
1532 v
->meta_surf_height_c
=dcn_bw_ceil2(v
->viewport_height
[k
] / 2.0 - 1.0, 8.0 * v
->block_height256_bytes_c
) + 8.0 * v
->block_height256_bytes_c
;
1533 if (v
->pte_enable
== dcn_bw_yes
) {
1534 v
->meta_pte_bytes_frame_c
= (dcn_bw_ceil2((v
->meta_surf_width_c
* v
->meta_surf_height_c
*dcn_bw_ceil2(v
->byte_per_pixel_detc
[k
], 2.0) / 256.0 - 4096.0) / 8.0 / 4096.0, 1.0) + 1) * 64.0;
1537 v
->meta_pte_bytes_frame_c
= 0.0;
1539 if (v
->source_scan
[k
] == dcn_bw_hor
) {
1540 v
->meta_row_byte_c
= v
->meta_surf_width_c
* 8.0 * v
->block_height256_bytes_c
*dcn_bw_ceil2(v
->byte_per_pixel_detc
[k
], 2.0) / 256.0;
1543 v
->meta_row_byte_c
= v
->meta_surf_height_c
* v
->meta_request_width_c
*dcn_bw_ceil2(v
->byte_per_pixel_detc
[k
], 2.0) / 256.0;
1547 v
->meta_pte_bytes_frame_c
= 0.0;
1548 v
->meta_row_byte_c
= 0.0;
1550 if (v
->pte_enable
== dcn_bw_yes
) {
1551 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
1552 v
->macro_tile_size_bytes_c
= 256.0;
1553 v
->macro_tile_height_c
= 1.0;
1555 else if (v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_d
|| v
->source_surface_mode
[k
] == dcn_bw_sw_4_kb_d_x
) {
1556 v
->macro_tile_size_bytes_c
= 4096.0;
1557 v
->macro_tile_height_c
= 4.0 * v
->block_height256_bytes_c
;
1559 else if (v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_t
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_s_x
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d_t
|| v
->source_surface_mode
[k
] == dcn_bw_sw_64_kb_d_x
) {
1560 v
->macro_tile_size_bytes_c
= 64.0 * 1024;
1561 v
->macro_tile_height_c
= 16.0 * v
->block_height256_bytes_c
;
1564 v
->macro_tile_size_bytes_c
= 256.0 * 1024;
1565 v
->macro_tile_height_c
= 32.0 * v
->block_height256_bytes_c
;
1567 if (v
->macro_tile_size_bytes_c
<= 65536.0) {
1568 v
->pixel_pte_req_height_c
= v
->macro_tile_height_c
;
1571 v
->pixel_pte_req_height_c
= 16.0 * v
->block_height256_bytes_c
;
1573 v
->pixel_pte_req_width_c
= 4096.0 /dcn_bw_ceil2(v
->byte_per_pixel_detc
[k
], 2.0) / v
->pixel_pte_req_height_c
* 8;
1574 if (v
->source_surface_mode
[k
] == dcn_bw_sw_linear
) {
1575 v
->pixel_pte_bytes_per_row_c
= 64.0 * (dcn_bw_ceil2((v
->swath_width_y
[k
] / 2.0 * dcn_bw_min2(128.0, dcn_bw_pow(2.0,dcn_bw_floor2(dcn_bw_log(v
->pte_buffer_size_in_requests
* v
->pixel_pte_req_width_c
/ (v
->swath_width_y
[k
] / 2.0), 2.0), 1.0))) - 1.0) / v
->pixel_pte_req_width_c
, 1.0) + 1);
1577 else if (v
->source_scan
[k
] == dcn_bw_hor
) {
1578 v
->pixel_pte_bytes_per_row_c
= 64.0 * (dcn_bw_ceil2((v
->swath_width_y
[k
] / 2.0 - 1.0) / v
->pixel_pte_req_width_c
, 1.0) + 1);
1581 v
->pixel_pte_bytes_per_row_c
= 64.0 * (dcn_bw_ceil2((v
->viewport_height
[k
] / 2.0 - 1.0) / v
->pixel_pte_req_height_c
, 1.0) + 1);
1585 v
->pixel_pte_bytes_per_row_c
= 0.0;
1589 v
->pixel_pte_bytes_per_row_c
= 0.0;
1590 v
->meta_pte_bytes_frame_c
= 0.0;
1591 v
->meta_row_byte_c
= 0.0;
1593 v
->pixel_pte_bytes_per_row
[k
] = v
->pixel_pte_bytes_per_row_y
+ v
->pixel_pte_bytes_per_row_c
;
1594 v
->meta_pte_bytes_frame
[k
] = v
->meta_pte_bytes_frame_y
+ v
->meta_pte_bytes_frame_c
;
1595 v
->meta_row_byte
[k
] = v
->meta_row_byte_y
+ v
->meta_row_byte_c
;
1596 v
->v_init_pre_fill_y
[k
] =dcn_bw_floor2((v
->v_ratio
[k
] + v
->vtaps
[k
] + 1.0 + v
->interlace_output
[k
] * 0.5 * v
->v_ratio
[k
]) / 2.0, 1.0);
1597 v
->max_num_swath_y
[k
] =dcn_bw_ceil2((v
->v_init_pre_fill_y
[k
] - 1.0) / v
->swath_height_y
[k
], 1.0) + 1;
1598 if (v
->v_init_pre_fill_y
[k
] > 1.0) {
1599 v
->max_partial_swath_y
=dcn_bw_mod((v
->v_init_pre_fill_y
[k
] - 2.0), v
->swath_height_y
[k
]);
1602 v
->max_partial_swath_y
=dcn_bw_mod((v
->v_init_pre_fill_y
[k
] + v
->swath_height_y
[k
] - 2.0), v
->swath_height_y
[k
]);
1604 v
->max_partial_swath_y
=dcn_bw_max2(1.0, v
->max_partial_swath_y
);
1605 v
->prefetch_source_lines_y
[k
] = v
->max_num_swath_y
[k
] * v
->swath_height_y
[k
] + v
->max_partial_swath_y
;
1606 if ((v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_64
&& v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_32
&& v
->source_pixel_format
[k
] != dcn_bw_rgb_sub_16
)) {
1607 v
->v_init_pre_fill_c
[k
] =dcn_bw_floor2((v
->v_ratio
[k
] / 2.0 + v
->vtaps
[k
] + 1.0 + v
->interlace_output
[k
] * 0.5 * v
->v_ratio
[k
] / 2.0) / 2.0, 1.0);
1608 v
->max_num_swath_c
[k
] =dcn_bw_ceil2((v
->v_init_pre_fill_c
[k
] - 1.0) / v
->swath_height_c
[k
], 1.0) + 1;
1609 if (v
->v_init_pre_fill_c
[k
] > 1.0) {
1610 v
->max_partial_swath_c
=dcn_bw_mod((v
->v_init_pre_fill_c
[k
] - 2.0), v
->swath_height_c
[k
]);
1613 v
->max_partial_swath_c
=dcn_bw_mod((v
->v_init_pre_fill_c
[k
] + v
->swath_height_c
[k
] - 2.0), v
->swath_height_c
[k
]);
1615 v
->max_partial_swath_c
=dcn_bw_max2(1.0, v
->max_partial_swath_c
);
1618 v
->max_num_swath_c
[k
] = 0.0;
1619 v
->max_partial_swath_c
= 0.0;
1621 v
->prefetch_source_lines_c
[k
] = v
->max_num_swath_c
[k
] * v
->swath_height_c
[k
] + v
->max_partial_swath_c
;
1623 v
->t_calc
= 24.0 / v
->dcf_clk_deep_sleep
;
1624 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1625 if (v
->can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one
== dcn_bw_yes
) {
1626 v
->max_vstartup_lines
[k
] = v
->vtotal
[k
] - v
->vactive
[k
] - 1.0;
1629 v
->max_vstartup_lines
[k
] = v
->v_sync_plus_back_porch
[k
] - 1.0;
1632 v
->next_prefetch_mode
= 0.0;
1634 v
->v_startup_lines
= 13.0;
1636 v
->planes_with_room_to_increase_vstartup_prefetch_bw_less_than_active_bw
= dcn_bw_yes
;
1637 v
->planes_with_room_to_increase_vstartup_vratio_prefetch_more_than4
= dcn_bw_no
;
1638 v
->planes_with_room_to_increase_vstartup_destination_line_times_for_prefetch_less_than2
= dcn_bw_no
;
1639 v
->v_ratio_prefetch_more_than4
= dcn_bw_no
;
1640 v
->destination_line_times_for_prefetch_less_than2
= dcn_bw_no
;
1641 v
->prefetch_mode
= v
->next_prefetch_mode
;
1642 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1643 v
->dstx_after_scaler
= 90.0 * v
->pixel_clock
[k
] / v
->dppclk
+ 42.0 * v
->pixel_clock
[k
] / v
->dispclk
;
1644 if (v
->dpp_per_plane
[k
] > 1.0) {
1645 v
->dstx_after_scaler
= v
->dstx_after_scaler
+ v
->scaler_rec_out_width
[k
] / 2.0;
1647 if (v
->output_format
[k
] == dcn_bw_420
) {
1648 v
->dsty_after_scaler
= 1.0;
1651 v
->dsty_after_scaler
= 0.0;
1653 v
->v_update_offset_pix
[k
] = dcn_bw_ceil2(v
->htotal
[k
] / 4.0, 1.0);
1654 v
->total_repeater_delay_time
= v
->max_inter_dcn_tile_repeaters
* (2.0 / v
->dppclk
+ 3.0 / v
->dispclk
);
1655 v
->v_update_width_pix
[k
] = (14.0 / v
->dcf_clk_deep_sleep
+ 12.0 / v
->dppclk
+ v
->total_repeater_delay_time
) * v
->pixel_clock
[k
];
1656 v
->v_ready_offset_pix
[k
] = dcn_bw_max2(150.0 / v
->dppclk
, v
->total_repeater_delay_time
+ 20.0 / v
->dcf_clk_deep_sleep
+ 10.0 / v
->dppclk
) * v
->pixel_clock
[k
];
1657 v
->t_setup
= (v
->v_update_offset_pix
[k
] + v
->v_update_width_pix
[k
] + v
->v_ready_offset_pix
[k
]) / v
->pixel_clock
[k
];
1658 v
->v_startup
[k
] =dcn_bw_min2(v
->v_startup_lines
, v
->max_vstartup_lines
[k
]);
1659 if (v
->prefetch_mode
== 0.0) {
1660 v
->t_wait
=dcn_bw_max3(v
->dram_clock_change_latency
+ v
->urgent_latency
, v
->sr_enter_plus_exit_time
, v
->urgent_latency
);
1662 else if (v
->prefetch_mode
== 1.0) {
1663 v
->t_wait
=dcn_bw_max2(v
->sr_enter_plus_exit_time
, v
->urgent_latency
);
1666 v
->t_wait
= v
->urgent_latency
;
1668 v
->destination_lines_for_prefetch
[k
] =dcn_bw_floor2(4.0 * (v
->v_startup
[k
] - v
->t_wait
/ (v
->htotal
[k
] / v
->pixel_clock
[k
]) - (v
->t_calc
+ v
->t_setup
) / (v
->htotal
[k
] / v
->pixel_clock
[k
]) - (v
->dsty_after_scaler
+ v
->dstx_after_scaler
/ v
->htotal
[k
]) + 0.125), 1.0) / 4;
1669 if (v
->destination_lines_for_prefetch
[k
] > 0.0) {
1670 v
->prefetch_bandwidth
[k
] = (v
->meta_pte_bytes_frame
[k
] + 2.0 * v
->meta_row_byte
[k
] + 2.0 * v
->pixel_pte_bytes_per_row
[k
] + v
->prefetch_source_lines_y
[k
] * v
->swath_width_y
[k
] *dcn_bw_ceil2(v
->byte_per_pixel_dety
[k
], 1.0) + v
->prefetch_source_lines_c
[k
] * v
->swath_width_y
[k
] / 2.0 *dcn_bw_ceil2(v
->byte_per_pixel_detc
[k
], 2.0)) / (v
->destination_lines_for_prefetch
[k
] * v
->htotal
[k
] / v
->pixel_clock
[k
]);
1673 v
->prefetch_bandwidth
[k
] = 999999.0;
1676 v
->bandwidth_available_for_immediate_flip
= v
->return_bw
;
1677 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1678 v
->bandwidth_available_for_immediate_flip
= v
->bandwidth_available_for_immediate_flip
-dcn_bw_max2(v
->read_bandwidth_plane_luma
[k
] + v
->read_bandwidth_plane_chroma
[k
], v
->prefetch_bandwidth
[k
]);
1680 v
->tot_immediate_flip_bytes
= 0.0;
1681 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1682 if (v
->immediate_flip_supported
== dcn_bw_yes
&& (v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_8
&& v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_10
)) {
1683 v
->tot_immediate_flip_bytes
= v
->tot_immediate_flip_bytes
+ v
->meta_pte_bytes_frame
[k
] + v
->meta_row_byte
[k
] + v
->pixel_pte_bytes_per_row
[k
];
1686 v
->max_rd_bandwidth
= 0.0;
1687 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1688 if (v
->pte_enable
== dcn_bw_yes
&& v
->dcc_enable
[k
] == dcn_bw_yes
) {
1689 if (v
->immediate_flip_supported
== dcn_bw_yes
&& (v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_8
&& v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_10
)) {
1690 v
->time_for_fetching_meta_pte
=dcn_bw_max5(v
->meta_pte_bytes_frame
[k
] / v
->prefetch_bandwidth
[k
], v
->meta_pte_bytes_frame
[k
] * v
->tot_immediate_flip_bytes
/ (v
->bandwidth_available_for_immediate_flip
* (v
->meta_pte_bytes_frame
[k
] + v
->meta_row_byte
[k
] + v
->pixel_pte_bytes_per_row
[k
])), v
->urgent_extra_latency
, v
->urgent_latency
, v
->htotal
[k
] / v
->pixel_clock
[k
] / 4.0);
1693 v
->time_for_fetching_meta_pte
=dcn_bw_max3(v
->meta_pte_bytes_frame
[k
] / v
->prefetch_bandwidth
[k
], v
->urgent_extra_latency
, v
->htotal
[k
] / v
->pixel_clock
[k
] / 4.0);
1697 v
->time_for_fetching_meta_pte
= v
->htotal
[k
] / v
->pixel_clock
[k
] / 4.0;
1699 v
->destination_lines_to_request_vm_inv_blank
[k
] =dcn_bw_floor2(4.0 * (v
->time_for_fetching_meta_pte
/ (v
->htotal
[k
] / v
->pixel_clock
[k
]) + 0.125), 1.0) / 4;
1700 if ((v
->pte_enable
== dcn_bw_yes
|| v
->dcc_enable
[k
] == dcn_bw_yes
)) {
1701 if (v
->immediate_flip_supported
== dcn_bw_yes
&& (v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_8
&& v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_10
)) {
1702 v
->time_for_fetching_row_in_vblank
=dcn_bw_max5((v
->meta_row_byte
[k
] + v
->pixel_pte_bytes_per_row
[k
]) / v
->prefetch_bandwidth
[k
], (v
->meta_row_byte
[k
] + v
->pixel_pte_bytes_per_row
[k
]) * v
->tot_immediate_flip_bytes
/ (v
->bandwidth_available_for_immediate_flip
* (v
->meta_pte_bytes_frame
[k
] + v
->meta_row_byte
[k
] + v
->pixel_pte_bytes_per_row
[k
])), v
->urgent_extra_latency
, 2.0 * v
->urgent_latency
, v
->htotal
[k
] / v
->pixel_clock
[k
] - v
->time_for_fetching_meta_pte
);
1705 v
->time_for_fetching_row_in_vblank
=dcn_bw_max3((v
->meta_row_byte
[k
] + v
->pixel_pte_bytes_per_row
[k
]) / v
->prefetch_bandwidth
[k
], v
->urgent_extra_latency
, v
->htotal
[k
] / v
->pixel_clock
[k
] - v
->time_for_fetching_meta_pte
);
1709 v
->time_for_fetching_row_in_vblank
=dcn_bw_max2(v
->urgent_extra_latency
- v
->time_for_fetching_meta_pte
, v
->htotal
[k
] / v
->pixel_clock
[k
] - v
->time_for_fetching_meta_pte
);
1711 v
->destination_lines_to_request_row_in_vblank
[k
] =dcn_bw_floor2(4.0 * (v
->time_for_fetching_row_in_vblank
/ (v
->htotal
[k
] / v
->pixel_clock
[k
]) + 0.125), 1.0) / 4;
1712 v
->lines_to_request_prefetch_pixel_data
= v
->destination_lines_for_prefetch
[k
] - v
->destination_lines_to_request_vm_inv_blank
[k
] - v
->destination_lines_to_request_row_in_vblank
[k
];
1713 if (v
->lines_to_request_prefetch_pixel_data
> 0.0) {
1714 v
->v_ratio_prefetch_y
[k
] = v
->prefetch_source_lines_y
[k
] / v
->lines_to_request_prefetch_pixel_data
;
1715 if ((v
->swath_height_y
[k
] > 4.0)) {
1716 if (v
->lines_to_request_prefetch_pixel_data
> (v
->v_init_pre_fill_y
[k
] - 3.0) / 2.0) {
1717 v
->v_ratio_prefetch_y
[k
] =dcn_bw_max2(v
->v_ratio_prefetch_y
[k
], v
->max_num_swath_y
[k
] * v
->swath_height_y
[k
] / (v
->lines_to_request_prefetch_pixel_data
- (v
->v_init_pre_fill_y
[k
] - 3.0) / 2.0));
1720 v
->v_ratio_prefetch_y
[k
] = 999999.0;
1725 v
->v_ratio_prefetch_y
[k
] = 999999.0;
1727 v
->v_ratio_prefetch_y
[k
] =dcn_bw_max2(v
->v_ratio_prefetch_y
[k
], 1.0);
1728 if (v
->lines_to_request_prefetch_pixel_data
> 0.0) {
1729 v
->v_ratio_prefetch_c
[k
] = v
->prefetch_source_lines_c
[k
] / v
->lines_to_request_prefetch_pixel_data
;
1730 if ((v
->swath_height_c
[k
] > 4.0)) {
1731 if (v
->lines_to_request_prefetch_pixel_data
> (v
->v_init_pre_fill_c
[k
] - 3.0) / 2.0) {
1732 v
->v_ratio_prefetch_c
[k
] =dcn_bw_max2(v
->v_ratio_prefetch_c
[k
], v
->max_num_swath_c
[k
] * v
->swath_height_c
[k
] / (v
->lines_to_request_prefetch_pixel_data
- (v
->v_init_pre_fill_c
[k
] - 3.0) / 2.0));
1735 v
->v_ratio_prefetch_c
[k
] = 999999.0;
1740 v
->v_ratio_prefetch_c
[k
] = 999999.0;
1742 v
->v_ratio_prefetch_c
[k
] =dcn_bw_max2(v
->v_ratio_prefetch_c
[k
], 1.0);
1743 if (v
->lines_to_request_prefetch_pixel_data
> 0.0) {
1744 v
->required_prefetch_pix_data_bw
= v
->dpp_per_plane
[k
] * (v
->prefetch_source_lines_y
[k
] / v
->lines_to_request_prefetch_pixel_data
*dcn_bw_ceil2(v
->byte_per_pixel_dety
[k
], 1.0) + v
->prefetch_source_lines_c
[k
] / v
->lines_to_request_prefetch_pixel_data
*dcn_bw_ceil2(v
->byte_per_pixel_detc
[k
], 2.0) / 2.0) * v
->swath_width_y
[k
] / (v
->htotal
[k
] / v
->pixel_clock
[k
]);
1747 v
->required_prefetch_pix_data_bw
= 999999.0;
1749 v
->max_rd_bandwidth
= v
->max_rd_bandwidth
+dcn_bw_max2(v
->read_bandwidth_plane_luma
[k
] + v
->read_bandwidth_plane_chroma
[k
], v
->required_prefetch_pix_data_bw
);
1750 if (v
->immediate_flip_supported
== dcn_bw_yes
&& (v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_8
&& v
->source_pixel_format
[k
] != dcn_bw_yuv420_sub_10
)) {
1751 v
->max_rd_bandwidth
= v
->max_rd_bandwidth
+dcn_bw_max2(v
->meta_pte_bytes_frame
[k
] / (v
->destination_lines_to_request_vm_inv_blank
[k
] * v
->htotal
[k
] / v
->pixel_clock
[k
]), (v
->meta_row_byte
[k
] + v
->pixel_pte_bytes_per_row
[k
]) / (v
->destination_lines_to_request_row_in_vblank
[k
] * v
->htotal
[k
] / v
->pixel_clock
[k
]));
1753 if (v
->v_ratio_prefetch_y
[k
] > 4.0 || v
->v_ratio_prefetch_c
[k
] > 4.0) {
1754 v
->v_ratio_prefetch_more_than4
= dcn_bw_yes
;
1756 if (v
->destination_lines_for_prefetch
[k
] < 2.0) {
1757 v
->destination_line_times_for_prefetch_less_than2
= dcn_bw_yes
;
1759 if (v
->max_vstartup_lines
[k
] > v
->v_startup_lines
) {
1760 if (v
->required_prefetch_pix_data_bw
> (v
->read_bandwidth_plane_luma
[k
] + v
->read_bandwidth_plane_chroma
[k
])) {
1761 v
->planes_with_room_to_increase_vstartup_prefetch_bw_less_than_active_bw
= dcn_bw_no
;
1763 if (v
->v_ratio_prefetch_y
[k
] > 4.0 || v
->v_ratio_prefetch_c
[k
] > 4.0) {
1764 v
->planes_with_room_to_increase_vstartup_vratio_prefetch_more_than4
= dcn_bw_yes
;
1766 if (v
->destination_lines_for_prefetch
[k
] < 2.0) {
1767 v
->planes_with_room_to_increase_vstartup_destination_line_times_for_prefetch_less_than2
= dcn_bw_yes
;
1771 if (v
->max_rd_bandwidth
<= v
->return_bw
&& v
->v_ratio_prefetch_more_than4
== dcn_bw_no
&& v
->destination_line_times_for_prefetch_less_than2
== dcn_bw_no
) {
1772 v
->prefetch_mode_supported
= dcn_bw_yes
;
1775 v
->prefetch_mode_supported
= dcn_bw_no
;
1777 v
->v_startup_lines
= v
->v_startup_lines
+ 1.0;
1778 } while (!(v
->prefetch_mode_supported
== dcn_bw_yes
|| (v
->planes_with_room_to_increase_vstartup_prefetch_bw_less_than_active_bw
== dcn_bw_yes
&& v
->planes_with_room_to_increase_vstartup_vratio_prefetch_more_than4
== dcn_bw_no
&& v
->planes_with_room_to_increase_vstartup_destination_line_times_for_prefetch_less_than2
== dcn_bw_no
)));
1779 v
->next_prefetch_mode
= v
->next_prefetch_mode
+ 1.0;
1780 } while (!(v
->prefetch_mode_supported
== dcn_bw_yes
|| v
->prefetch_mode
== 2.0));
1781 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1782 if (v
->v_ratio_prefetch_y
[k
] <= 1.0) {
1783 v
->display_pipe_line_delivery_time_luma_prefetch
[k
] = v
->swath_width_y
[k
] * v
->dpp_per_plane
[k
] / v
->h_ratio
[k
] / v
->pixel_clock
[k
];
1786 v
->display_pipe_line_delivery_time_luma_prefetch
[k
] = v
->swath_width_y
[k
] / v
->pscl_throughput
[k
] / v
->dppclk
;
1788 if (v
->byte_per_pixel_detc
[k
] == 0.0) {
1789 v
->display_pipe_line_delivery_time_chroma_prefetch
[k
] = 0.0;
1792 if (v
->v_ratio_prefetch_c
[k
] <= 1.0) {
1793 v
->display_pipe_line_delivery_time_chroma_prefetch
[k
] = v
->swath_width_y
[k
] * v
->dpp_per_plane
[k
] / v
->h_ratio
[k
] / v
->pixel_clock
[k
];
1796 v
->display_pipe_line_delivery_time_chroma_prefetch
[k
] = v
->swath_width_y
[k
] / v
->pscl_throughput
[k
] / v
->dppclk
;
1802 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1803 if (v
->prefetch_mode
== 0.0) {
1804 v
->allow_dram_clock_change_during_vblank
[k
] = dcn_bw_yes
;
1805 v
->allow_dram_self_refresh_during_vblank
[k
] = dcn_bw_yes
;
1806 v
->min_ttuv_blank
[k
] = v
->t_calc
+dcn_bw_max3(v
->dram_clock_change_watermark
, v
->stutter_enter_plus_exit_watermark
, v
->urgent_watermark
);
1808 else if (v
->prefetch_mode
== 1.0) {
1809 v
->allow_dram_clock_change_during_vblank
[k
] = dcn_bw_no
;
1810 v
->allow_dram_self_refresh_during_vblank
[k
] = dcn_bw_yes
;
1811 v
->min_ttuv_blank
[k
] = v
->t_calc
+dcn_bw_max2(v
->stutter_enter_plus_exit_watermark
, v
->urgent_watermark
);
1814 v
->allow_dram_clock_change_during_vblank
[k
] = dcn_bw_no
;
1815 v
->allow_dram_self_refresh_during_vblank
[k
] = dcn_bw_no
;
1816 v
->min_ttuv_blank
[k
] = v
->t_calc
+ v
->urgent_watermark
;
1819 /*nb p-state/dram clock change support*/
1821 v
->active_dp_ps
= 0.0;
1822 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1823 v
->active_dp_ps
= v
->active_dp_ps
+ v
->dpp_per_plane
[k
];
1825 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1826 v
->lb_latency_hiding_source_lines_y
=dcn_bw_min2(v
->max_line_buffer_lines
,dcn_bw_floor2(v
->line_buffer_size
/ v
->lb_bit_per_pixel
[k
] / (v
->swath_width_y
[k
] /dcn_bw_max2(v
->h_ratio
[k
], 1.0)), 1.0)) - (v
->vtaps
[k
] - 1.0);
1827 v
->lb_latency_hiding_source_lines_c
=dcn_bw_min2(v
->max_line_buffer_lines
,dcn_bw_floor2(v
->line_buffer_size
/ v
->lb_bit_per_pixel
[k
] / (v
->swath_width_y
[k
] / 2.0 /dcn_bw_max2(v
->h_ratio
[k
] / 2.0, 1.0)), 1.0)) - (v
->vta_pschroma
[k
] - 1.0);
1828 v
->effective_lb_latency_hiding_y
= v
->lb_latency_hiding_source_lines_y
/ v
->v_ratio
[k
] * (v
->htotal
[k
] / v
->pixel_clock
[k
]);
1829 v
->effective_lb_latency_hiding_c
= v
->lb_latency_hiding_source_lines_c
/ (v
->v_ratio
[k
] / 2.0) * (v
->htotal
[k
] / v
->pixel_clock
[k
]);
1830 if (v
->swath_width_y
[k
] > 2.0 * v
->dpp_output_buffer_pixels
) {
1831 v
->dpp_output_buffer_lines_y
= v
->dpp_output_buffer_pixels
/ v
->swath_width_y
[k
];
1833 else if (v
->swath_width_y
[k
] > v
->dpp_output_buffer_pixels
) {
1834 v
->dpp_output_buffer_lines_y
= 0.5;
1837 v
->dpp_output_buffer_lines_y
= 1.0;
1839 if (v
->swath_width_y
[k
] / 2.0 > 2.0 * v
->dpp_output_buffer_pixels
) {
1840 v
->dpp_output_buffer_lines_c
= v
->dpp_output_buffer_pixels
/ (v
->swath_width_y
[k
] / 2.0);
1842 else if (v
->swath_width_y
[k
] / 2.0 > v
->dpp_output_buffer_pixels
) {
1843 v
->dpp_output_buffer_lines_c
= 0.5;
1846 v
->dpp_output_buffer_lines_c
= 1.0;
1848 v
->dppopp_buffering_y
= (v
->htotal
[k
] / v
->pixel_clock
[k
]) * (v
->dpp_output_buffer_lines_y
+ v
->opp_output_buffer_lines
);
1849 v
->max_det_buffering_time_y
= v
->full_det_buffering_time_y
[k
] + (v
->lines_in_dety
[k
] - v
->lines_in_dety_rounded_down_to_swath
[k
]) / v
->swath_height_y
[k
] * (v
->htotal
[k
] / v
->pixel_clock
[k
]);
1850 v
->active_dram_clock_change_latency_margin_y
= v
->dppopp_buffering_y
+ v
->effective_lb_latency_hiding_y
+ v
->max_det_buffering_time_y
- v
->dram_clock_change_watermark
;
1851 if (v
->active_dp_ps
> 1.0) {
1852 v
->active_dram_clock_change_latency_margin_y
= v
->active_dram_clock_change_latency_margin_y
- (1.0 - 1.0 / (v
->active_dp_ps
- 1.0)) * v
->swath_height_y
[k
] * (v
->htotal
[k
] / v
->pixel_clock
[k
]);
1854 if (v
->byte_per_pixel_detc
[k
] > 0.0) {
1855 v
->dppopp_buffering_c
= (v
->htotal
[k
] / v
->pixel_clock
[k
]) * (v
->dpp_output_buffer_lines_c
+ v
->opp_output_buffer_lines
);
1856 v
->max_det_buffering_time_c
= v
->full_det_buffering_time_c
[k
] + (v
->lines_in_detc
[k
] - v
->lines_in_detc_rounded_down_to_swath
[k
]) / v
->swath_height_c
[k
] * (v
->htotal
[k
] / v
->pixel_clock
[k
]);
1857 v
->active_dram_clock_change_latency_margin_c
= v
->dppopp_buffering_c
+ v
->effective_lb_latency_hiding_c
+ v
->max_det_buffering_time_c
- v
->dram_clock_change_watermark
;
1858 if (v
->active_dp_ps
> 1.0) {
1859 v
->active_dram_clock_change_latency_margin_c
= v
->active_dram_clock_change_latency_margin_c
- (1.0 - 1.0 / (v
->active_dp_ps
- 1.0)) * v
->swath_height_c
[k
] * (v
->htotal
[k
] / v
->pixel_clock
[k
]);
1861 v
->active_dram_clock_change_latency_margin
[k
] =dcn_bw_min2(v
->active_dram_clock_change_latency_margin_y
, v
->active_dram_clock_change_latency_margin_c
);
1864 v
->active_dram_clock_change_latency_margin
[k
] = v
->active_dram_clock_change_latency_margin_y
;
1866 if (v
->output_format
[k
] == dcn_bw_444
) {
1867 v
->writeback_dram_clock_change_latency_margin
= (v
->writeback_luma_buffer_size
+ v
->writeback_chroma_buffer_size
) * 1024.0 / (v
->scaler_rec_out_width
[k
] / (v
->htotal
[k
] / v
->pixel_clock
[k
]) * 4.0) - v
->writeback_dram_clock_change_watermark
;
1870 v
->writeback_dram_clock_change_latency_margin
=dcn_bw_min2(v
->writeback_luma_buffer_size
, 2.0 * v
->writeback_chroma_buffer_size
) * 1024.0 / (v
->scaler_rec_out_width
[k
] / (v
->htotal
[k
] / v
->pixel_clock
[k
])) - v
->writeback_dram_clock_change_watermark
;
1872 if (v
->output
[k
] == dcn_bw_writeback
) {
1873 v
->active_dram_clock_change_latency_margin
[k
] =dcn_bw_min2(v
->active_dram_clock_change_latency_margin
[k
], v
->writeback_dram_clock_change_latency_margin
);
1876 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1877 if (v
->allow_dram_clock_change_during_vblank
[k
] == dcn_bw_yes
) {
1878 v
->v_blank_dram_clock_change_latency_margin
[k
] = (v
->vtotal
[k
] - v
->scaler_recout_height
[k
]) * (v
->htotal
[k
] / v
->pixel_clock
[k
]) -dcn_bw_max2(v
->dram_clock_change_watermark
, v
->writeback_dram_clock_change_watermark
);
1881 v
->v_blank_dram_clock_change_latency_margin
[k
] = 0.0;
1884 v
->min_active_dram_clock_change_margin
= 999999.0;
1885 v
->v_blank_of_min_active_dram_clock_change_margin
= 999999.0;
1886 v
->second_min_active_dram_clock_change_margin
= 999999.0;
1887 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1888 if (v
->active_dram_clock_change_latency_margin
[k
] < v
->min_active_dram_clock_change_margin
) {
1889 v
->second_min_active_dram_clock_change_margin
= v
->min_active_dram_clock_change_margin
;
1890 v
->min_active_dram_clock_change_margin
= v
->active_dram_clock_change_latency_margin
[k
];
1891 v
->v_blank_of_min_active_dram_clock_change_margin
= v
->v_blank_dram_clock_change_latency_margin
[k
];
1893 else if (v
->active_dram_clock_change_latency_margin
[k
] < v
->second_min_active_dram_clock_change_margin
) {
1894 v
->second_min_active_dram_clock_change_margin
= v
->active_dram_clock_change_latency_margin
[k
];
1897 v
->min_vblank_dram_clock_change_margin
= 999999.0;
1898 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1899 if (v
->min_vblank_dram_clock_change_margin
> v
->v_blank_dram_clock_change_latency_margin
[k
]) {
1900 v
->min_vblank_dram_clock_change_margin
= v
->v_blank_dram_clock_change_latency_margin
[k
];
1903 if (v
->synchronized_vblank
== dcn_bw_yes
|| v
->number_of_active_planes
== 1) {
1904 v
->dram_clock_change_margin
=dcn_bw_max2(v
->min_active_dram_clock_change_margin
, v
->min_vblank_dram_clock_change_margin
);
1906 else if (v
->v_blank_of_min_active_dram_clock_change_margin
> v
->min_active_dram_clock_change_margin
) {
1907 v
->dram_clock_change_margin
=dcn_bw_min2(v
->second_min_active_dram_clock_change_margin
, v
->v_blank_of_min_active_dram_clock_change_margin
);
1910 v
->dram_clock_change_margin
= v
->min_active_dram_clock_change_margin
;
1912 if (v
->min_active_dram_clock_change_margin
> 0.0) {
1913 v
->dram_clock_change_support
= dcn_bw_supported_in_v_active
;
1915 else if (v
->dram_clock_change_margin
> 0.0) {
1916 v
->dram_clock_change_support
= dcn_bw_supported_in_v_blank
;
1919 v
->dram_clock_change_support
= dcn_bw_not_supported
;
1921 /*maximum bandwidth used*/
1923 v
->wr_bandwidth
= 0.0;
1924 for (k
= 0; k
<= v
->number_of_active_planes
- 1; k
++) {
1925 if (v
->output
[k
] == dcn_bw_writeback
&& v
->output_format
[k
] == dcn_bw_444
) {
1926 v
->wr_bandwidth
= v
->wr_bandwidth
+ v
->scaler_rec_out_width
[k
] / (v
->htotal
[k
] / v
->pixel_clock
[k
]) * 4.0;
1928 else if (v
->output
[k
] == dcn_bw_writeback
) {
1929 v
->wr_bandwidth
= v
->wr_bandwidth
+ v
->scaler_rec_out_width
[k
] / (v
->htotal
[k
] / v
->pixel_clock
[k
]) * 1.5;
1932 v
->max_used_bw
= v
->max_rd_bandwidth
+ v
->wr_bandwidth
;