1 | /* |
2 | * Copyright 2017 Advanced Micro Devices, Inc. |
3 | * |
4 | * Permission is hereby granted, free of charge, to any person obtaining a |
5 | * copy of this software and associated documentation files (the "Software"), |
6 | * to deal in the Software without restriction, including without limitation |
7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
8 | * and/or sell copies of the Software, and to permit persons to whom the |
9 | * Software is furnished to do so, subject to the following conditions: |
10 | * |
11 | * The above copyright notice and this permission notice shall be included in |
12 | * all copies or substantial portions of the Software. |
13 | * |
14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
17 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR |
18 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
19 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
20 | * OTHER DEALINGS IN THE SOFTWARE. |
21 | * |
22 | * Authors: AMD |
23 | * |
24 | */ |
25 | |
26 | #include "dm_services.h" |
27 | #include "dcn_calc_auto.h" |
28 | #include "dcn_calc_math.h" |
29 | |
30 | /* |
31 | * NOTE: |
32 | * This file is gcc-parseable HW gospel, coming straight from HW engineers. |
33 | * |
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. |
37 | */ |
38 | |
39 | /*REVISION#250*/ |
40 | void scaler_settings_calculation(struct dcn_bw_internal_vars *v) |
41 | { |
42 | int k; |
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]; |
48 | } |
49 | else { |
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]; |
52 | } |
53 | } |
54 | else { |
55 | if (v->source_scan[k] == dcn_bw_hor) { |
56 | v->h_ratio[k] =dcn_bw_max2(arg1: v->viewport_width[k] / v->scaler_rec_out_width[k], arg2: v->viewport_height[k] / v->scaler_recout_height[k]); |
57 | } |
58 | else { |
59 | v->h_ratio[k] =dcn_bw_max2(arg1: v->viewport_height[k] / v->scaler_rec_out_width[k], arg2: v->viewport_width[k] / v->scaler_recout_height[k]); |
60 | } |
61 | v->v_ratio[k] = v->h_ratio[k]; |
62 | } |
63 | if (v->interlace_output[k] == 1.0) { |
64 | v->v_ratio[k] = 2.0 * v->v_ratio[k]; |
65 | } |
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; |
69 | } |
70 | } |
71 | /*scaler taps calculation*/ |
72 | |
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(arg1: v->max_hscl_taps, arg2: 2.0 *dcn_bw_ceil2(arg: v->h_ratio[k], significance: 1.0)); |
76 | } |
77 | else if (v->h_ratio[k] < 1.0) { |
78 | v->acceptable_quality_hta_ps = 4.0; |
79 | } |
80 | else { |
81 | v->acceptable_quality_hta_ps = 1.0; |
82 | } |
83 | if (v->ta_pscalculation == dcn_bw_override) { |
84 | v->htaps[k] = v->override_hta_ps[k]; |
85 | } |
86 | else { |
87 | v->htaps[k] = v->acceptable_quality_hta_ps; |
88 | } |
89 | if (v->v_ratio[k] > 1.0) { |
90 | v->acceptable_quality_vta_ps =dcn_bw_min2(arg1: v->max_vscl_taps, arg2: 2.0 *dcn_bw_ceil2(arg: v->v_ratio[k], significance: 1.0)); |
91 | } |
92 | else if (v->v_ratio[k] < 1.0) { |
93 | v->acceptable_quality_vta_ps = 4.0; |
94 | } |
95 | else { |
96 | v->acceptable_quality_vta_ps = 1.0; |
97 | } |
98 | if (v->ta_pscalculation == dcn_bw_override) { |
99 | v->vtaps[k] = v->override_vta_ps[k]; |
100 | } |
101 | else { |
102 | v->vtaps[k] = v->acceptable_quality_vta_ps; |
103 | } |
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; |
107 | } |
108 | else { |
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]; |
112 | } |
113 | else { |
114 | v->vta_pschroma[k] = v->acceptable_quality_vta_ps; |
115 | v->hta_pschroma[k] = v->acceptable_quality_hta_ps; |
116 | } |
117 | } |
118 | } |
119 | } |
120 | |
121 | void mode_support_and_system_configuration(struct dcn_bw_internal_vars *v) |
122 | { |
123 | int i; |
124 | int j; |
125 | int k; |
126 | /*mode support, voltage state and soc configuration*/ |
127 | |
128 | /*scale ratio support check*/ |
129 | |
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; |
134 | } |
135 | } |
136 | /*source format, pixel format and scan support check*/ |
137 | |
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; |
142 | } |
143 | } |
144 | /*bandwidth support check*/ |
145 | |
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]; |
149 | } |
150 | else { |
151 | v->swath_width_ysingle_dpp[k] = v->viewport_height[k]; |
152 | } |
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; |
156 | } |
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; |
160 | } |
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; |
164 | } |
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; |
168 | } |
169 | else { |
170 | v->byte_per_pixel_in_dety[k] = 4.0f / 3.0f; |
171 | v->byte_per_pixel_in_detc[k] = 8.0f / 3.0f; |
172 | } |
173 | } |
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(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) * v->v_ratio[k] +dcn_bw_ceil2(arg: v->byte_per_pixel_in_detc[k], significance: 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); |
179 | } |
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); |
182 | } |
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); |
185 | } |
186 | else if (v->pte_enable == dcn_bw_yes) { |
187 | v->read_bandwidth[k] = v->read_bandwidth[k] * (1 + 1 / 512); |
188 | } |
189 | v->total_read_bandwidth_consumed_gbyte_per_second = v->total_read_bandwidth_consumed_gbyte_per_second + v->read_bandwidth[k] / 1000.0; |
190 | } |
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; |
195 | } |
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; |
198 | } |
199 | else { |
200 | v->write_bandwidth[k] = 0.0; |
201 | } |
202 | v->total_write_bandwidth_consumed_gbyte_per_second = v->total_write_bandwidth_consumed_gbyte_per_second + v->write_bandwidth[k] / 1000.0; |
203 | } |
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; |
209 | } |
210 | } |
211 | for (i = 0; i <= number_of_states_plus_one; i++) { |
212 | v->return_bw_todcn_per_state =dcn_bw_min2(arg1: v->return_bus_width * v->dcfclk_per_state[i], arg2: 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(arg1: v->return_bw_per_state[i], arg2: 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))); |
216 | } |
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(arg1: v->return_bw_per_state[i], arg2: dcn_bw_pow(a: 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), exp: 2)); |
220 | } |
221 | v->return_bw_todcn_per_state =dcn_bw_min2(arg1: v->return_bus_width * v->dcfclk_per_state[i], arg2: 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(arg1: v->return_bw_per_state[i], arg2: 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))); |
224 | } |
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(arg1: v->return_bw_per_state[i], arg2: dcn_bw_pow(a: 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), exp: 2)); |
228 | } |
229 | } |
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; |
233 | } |
234 | else { |
235 | v->bandwidth_support[i] = dcn_bw_no; |
236 | } |
237 | } |
238 | /*writeback latency support check*/ |
239 | |
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; |
244 | } |
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(arg1: v->writeback_luma_buffer_size, arg2: 2.0 * v->writeback_chroma_buffer_size) * 1024.0 / v->write_back_latency) { |
246 | v->writeback_latency_support = dcn_bw_no; |
247 | } |
248 | } |
249 | /*re-ordering buffer support check*/ |
250 | |
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; |
255 | } |
256 | else { |
257 | v->rob_support[i] = dcn_bw_no; |
258 | } |
259 | } |
260 | /*display io support check*/ |
261 | |
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; |
266 | } |
267 | else { |
268 | v->required_output_bw = v->pixel_clock[k]; |
269 | } |
270 | } |
271 | else if (v->output_format[k] == dcn_bw_420) { |
272 | v->required_output_bw = v->pixel_clock[k] * 3.0 / 2.0; |
273 | } |
274 | else { |
275 | v->required_output_bw = v->pixel_clock[k] * 3.0; |
276 | } |
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; |
282 | break; |
283 | case dcn_bw_encoder_12bpc: |
284 | v->required_phyclk[k] = v->required_phyclk[k] * 3.0 / 2; |
285 | break; |
286 | default: |
287 | break; |
288 | } |
289 | v->required_phyclk[k] = v->required_phyclk[k] / 3.0; |
290 | } |
291 | else if (v->output[k] == dcn_bw_dp) { |
292 | v->required_phyclk[k] = v->required_output_bw / 4.0; |
293 | } |
294 | else { |
295 | v->required_phyclk[k] = 0.0; |
296 | } |
297 | } |
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; |
303 | } |
304 | } |
305 | } |
306 | /*total available writeback support check*/ |
307 | |
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; |
312 | } |
313 | } |
314 | if (v->total_number_of_active_writeback <= v->max_num_writeback) { |
315 | v->total_available_writeback_support = dcn_bw_yes; |
316 | } |
317 | else { |
318 | v->total_available_writeback_support = dcn_bw_no; |
319 | } |
320 | /*maximum dispclk/dppclk support check*/ |
321 | |
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(arg1: v->max_dchub_topscl_throughput, arg2: v->max_pscl_tolb_throughput * v->h_ratio[k] /dcn_bw_ceil2(arg: v->htaps[k] / 6.0, significance: 1.0)); |
325 | } |
326 | else { |
327 | v->pscl_factor[k] =dcn_bw_min2(arg1: v->max_dchub_topscl_throughput, arg2: v->max_pscl_tolb_throughput); |
328 | } |
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(v1: v->vtaps[k] / 6.0 *dcn_bw_min2(arg1: 1.0, arg2: v->h_ratio[k]), v2: v->h_ratio[k] * v->v_ratio[k] / v->pscl_factor[k], v3: 1.0); |
332 | } |
333 | else { |
334 | if (v->h_ratio[k] / 2.0 > 1.0) { |
335 | v->pscl_factor_chroma[k] =dcn_bw_min2(arg1: v->max_dchub_topscl_throughput, arg2: v->max_pscl_tolb_throughput * v->h_ratio[k] / 2.0 /dcn_bw_ceil2(arg: v->hta_pschroma[k] / 6.0, significance: 1.0)); |
336 | } |
337 | else { |
338 | v->pscl_factor_chroma[k] =dcn_bw_min2(arg1: v->max_dchub_topscl_throughput, arg2: v->max_pscl_tolb_throughput); |
339 | } |
340 | v->min_dppclk_using_single_dpp[k] = v->pixel_clock[k] *dcn_bw_max5(v1: v->vtaps[k] / 6.0 *dcn_bw_min2(arg1: 1.0, arg2: v->h_ratio[k]), v2: v->h_ratio[k] * v->v_ratio[k] / v->pscl_factor[k], v3: v->vta_pschroma[k] / 6.0 *dcn_bw_min2(arg1: 1.0, arg2: v->h_ratio[k] / 2.0), v4: v->h_ratio[k] * v->v_ratio[k] / 4.0 / v->pscl_factor_chroma[k], v5: 1.0); |
341 | } |
342 | } |
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; |
347 | } |
348 | else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) { |
349 | v->read256_block_height_y[k] = 4.0; |
350 | } |
351 | else { |
352 | v->read256_block_height_y[k] = 8.0; |
353 | } |
354 | v->read256_block_width_y[k] = 256.0 /dcn_bw_ceil2(arg: v->byte_per_pixel_in_dety[k], significance: 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; |
357 | } |
358 | else { |
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; |
362 | } |
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; |
366 | } |
367 | else { |
368 | v->read256_block_height_y[k] = 8.0; |
369 | v->read256_block_height_c[k] = 8.0; |
370 | } |
371 | v->read256_block_width_y[k] = 256.0 /dcn_bw_ceil2(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) / v->read256_block_height_y[k]; |
372 | v->read256_block_width_c[k] = 256.0 /dcn_bw_ceil2(arg: v->byte_per_pixel_in_detc[k], significance: 2.0) / v->read256_block_height_c[k]; |
373 | } |
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]; |
377 | } |
378 | else { |
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]; |
381 | } |
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]; |
385 | } |
386 | else { |
387 | v->min_swath_height_y[k] = v->max_swath_height_y[k] / 2.0; |
388 | } |
389 | v->min_swath_height_c[k] = v->max_swath_height_c[k]; |
390 | } |
391 | else { |
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]; |
395 | } |
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]; |
400 | } |
401 | else { |
402 | v->min_swath_height_c[k] = v->max_swath_height_c[k] / 2.0; |
403 | } |
404 | } |
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]; |
409 | } |
410 | else { |
411 | v->min_swath_height_y[k] = v->max_swath_height_y[k] / 2.0; |
412 | } |
413 | } |
414 | else { |
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]; |
417 | } |
418 | } |
419 | if (v->source_surface_mode[k] == dcn_bw_sw_linear) { |
420 | v->maximum_swath_width = 8192.0; |
421 | } |
422 | else { |
423 | v->maximum_swath_width = 5120.0; |
424 | } |
425 | v->number_of_dpp_required_for_det_size =dcn_bw_ceil2(arg: v->swath_width_ysingle_dpp[k] /dcn_bw_min2(arg1: v->maximum_swath_width, arg2: 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])), significance: 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(arg: (v->vtaps[k] +dcn_bw_max2(arg1: dcn_bw_ceil2(arg: v->v_ratio[k], significance: 1.0) - 2, arg2: 0.0)) * v->swath_width_ysingle_dpp[k] /dcn_bw_max2(arg1: v->h_ratio[k], arg2: 1.0) * v->lb_bit_per_pixel[k] / v->line_buffer_size, significance: 1.0); |
428 | } |
429 | else { |
430 | v->number_of_dpp_required_for_lb_size =dcn_bw_max2(arg1: dcn_bw_ceil2(arg: (v->vtaps[k] +dcn_bw_max2(arg1: dcn_bw_ceil2(arg: v->v_ratio[k], significance: 1.0) - 2, arg2: 0.0)) * v->swath_width_ysingle_dpp[k] /dcn_bw_max2(arg1: v->h_ratio[k], arg2: 1.0) * v->lb_bit_per_pixel[k] / v->line_buffer_size, significance: 1.0),arg2: dcn_bw_ceil2(arg: (v->vta_pschroma[k] +dcn_bw_max2(arg1: dcn_bw_ceil2(arg: v->v_ratio[k] / 2.0, significance: 1.0) - 2, arg2: 0.0)) * v->swath_width_ysingle_dpp[k] / 2.0 /dcn_bw_max2(arg1: v->h_ratio[k] / 2.0, arg2: 1.0) * v->lb_bit_per_pixel[k] / v->line_buffer_size, significance: 1.0)); |
431 | } |
432 | v->number_of_dpp_required_for_det_and_lb_size[k] =dcn_bw_max2(arg1: v->number_of_dpp_required_for_det_size, arg2: v->number_of_dpp_required_for_lb_size); |
433 | } |
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(arg1: v->pixel_clock[k], arg2: 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(arg1: v->pixel_clock[k] / 2.0, arg2: v->min_dppclk_using_single_dpp[k] / 2.0 * (j + 1)) * (1.0 + v->downspreading / 100.0); |
443 | } |
444 | else { |
445 | v->min_dispclk_using_dual_dpp =dcn_bw_max2(arg1: v->pixel_clock[k], arg2: v->min_dppclk_using_single_dpp[k] / 2.0 * (j + 1)) * (1.0 + v->downspreading / 100.0); |
446 | } |
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); |
450 | } |
451 | if (v->min_dispclk_using_single_dpp <=dcn_bw_min2(arg1: v->max_dispclk[i], arg2: (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(arg1: v->required_dispclk[i][j], arg2: v->min_dispclk_using_single_dpp); |
454 | } |
455 | else if (v->min_dispclk_using_dual_dpp <=dcn_bw_min2(arg1: v->max_dispclk[i], arg2: (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(arg1: v->required_dispclk[i][j], arg2: v->min_dispclk_using_dual_dpp); |
458 | } |
459 | else { |
460 | v->no_of_dpp[i][j][k] = 2.0; |
461 | v->required_dispclk[i][j] =dcn_bw_max2(arg1: v->required_dispclk[i][j], arg2: v->min_dispclk_using_dual_dpp); |
462 | v->dispclk_dppclk_support[i][j] = dcn_bw_no; |
463 | } |
464 | v->total_number_of_active_dpp[i][j] = v->total_number_of_active_dpp[i][j] + v->no_of_dpp[i][j][k]; |
465 | } |
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(arg1: v->pixel_clock[k], arg2: 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(arg1: v->pixel_clock[k], arg2: 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); |
476 | } |
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(arg1: v->required_dispclk[i][j], arg2: v->min_dispclk_using_single_dpp); |
480 | if (v->min_dispclk_using_single_dpp >dcn_bw_min2(arg1: v->max_dispclk[i], arg2: (j + 1) * v->max_dppclk[i])) { |
481 | v->dispclk_dppclk_support[i][j] = dcn_bw_no; |
482 | } |
483 | } |
484 | else { |
485 | v->no_of_dpp[i][j][k] = 2.0; |
486 | v->required_dispclk[i][j] =dcn_bw_max2(arg1: v->required_dispclk[i][j], arg2: v->min_dispclk_using_dual_dpp); |
487 | if (v->min_dispclk_using_dual_dpp >dcn_bw_min2(arg1: v->max_dispclk[i], arg2: (j + 1) * v->max_dppclk[i])) { |
488 | v->dispclk_dppclk_support[i][j] = dcn_bw_no; |
489 | } |
490 | } |
491 | v->total_number_of_active_dpp[i][j] = v->total_number_of_active_dpp[i][j] + v->no_of_dpp[i][j][k]; |
492 | } |
493 | } |
494 | } |
495 | } |
496 | /*viewport size check*/ |
497 | |
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; |
502 | } |
503 | } |
504 | /*total available pipes support check*/ |
505 | |
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; |
510 | } |
511 | else { |
512 | v->total_available_pipes_support[i][j] = dcn_bw_no; |
513 | } |
514 | } |
515 | } |
516 | /*urgent latency support check*/ |
517 | |
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(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) / v->max_swath_height_y[k]; |
523 | v->rounded_up_max_swath_size_bytes_y = (dcn_bw_ceil2(arg: v->swath_width_yper_state[i][j][k] - 1.0, significance: 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(arg: v->rounded_up_max_swath_size_bytes_y, significance: 256.0) + 256; |
526 | } |
527 | if (v->max_swath_height_c[k] > 0.0) { |
528 | v->swath_width_granularity_c = 256.0 /dcn_bw_ceil2(arg: v->byte_per_pixel_in_detc[k], significance: 2.0) / v->max_swath_height_c[k]; |
529 | v->rounded_up_max_swath_size_bytes_c = (dcn_bw_ceil2(arg: v->swath_width_yper_state[i][j][k] / 2.0 - 1.0, significance: v->swath_width_granularity_c) + v->swath_width_granularity_c) * v->byte_per_pixel_in_detc[k] * v->max_swath_height_c[k]; |
530 | if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10) { |
531 | v->rounded_up_max_swath_size_bytes_c = dcn_bw_ceil2(arg: v->rounded_up_max_swath_size_bytes_c, significance: 256.0) + 256; |
532 | } |
533 | } |
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]; |
537 | } |
538 | else { |
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]; |
541 | } |
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; |
545 | } |
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); |
549 | } |
550 | else { |
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); |
553 | } |
554 | v->effective_lb_latency_hiding_source_lines_luma =dcn_bw_min2(arg1: v->max_line_buffer_lines,arg2: dcn_bw_floor2(arg: v->line_buffer_size / v->lb_bit_per_pixel[k] / (v->swath_width_yper_state[i][j][k] /dcn_bw_max2(arg1: v->h_ratio[k], arg2: 1.0)), significance: 1.0)) - (v->vtaps[k] - 1.0); |
555 | v->effective_detlb_lines_luma =dcn_bw_floor2(arg: v->lines_in_det_luma +dcn_bw_min2(arg1: 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], arg2: v->effective_lb_latency_hiding_source_lines_luma), significance: v->swath_height_yper_state[i][j][k]); |
556 | if (v->byte_per_pixel_in_detc[k] == 0.0) { |
557 | 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(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) / (v->return_bw_per_state[i] / v->no_of_dpp[i][j][k]); |
558 | } |
559 | else { |
560 | v->effective_lb_latency_hiding_source_lines_chroma = dcn_bw_min2(arg1: v->max_line_buffer_lines, arg2: dcn_bw_floor2(arg: v->line_buffer_size / v->lb_bit_per_pixel[k] / (v->swath_width_yper_state[i][j][k] / 2.0 / dcn_bw_max2(arg1: v->h_ratio[k] / 2.0, arg2: 1.0)), significance: 1.0)) - (v->vta_pschroma[k] - 1.0); |
561 | v->effective_detlb_lines_chroma = dcn_bw_floor2(arg: v->lines_in_det_chroma + dcn_bw_min2(arg1: 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], arg2: v->effective_lb_latency_hiding_source_lines_chroma), significance: v->swath_height_cper_state[i][j][k]); |
562 | v->urgent_latency_support_us_per_state[i][j][k] = dcn_bw_min2(arg1: 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(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) / (v->return_bw_per_state[i] / v->no_of_dpp[i][j][k]), arg2: 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(arg: v->byte_per_pixel_in_detc[k], significance: 2.0) / (v->return_bw_per_state[i] / v->no_of_dpp[i][j][k])); |
563 | } |
564 | } |
565 | } |
566 | } |
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; |
573 | } |
574 | } |
575 | } |
576 | } |
577 | /*prefetch check*/ |
578 | |
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]; |
585 | } |
586 | } |
587 | } |
588 | } |
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(arg1: v->projected_dcfclk_deep_sleep, arg2: 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(arg1: v->projected_dcfclk_deep_sleep, arg2: 1.1 *dcn_bw_ceil2(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) / 64.0 * v->h_ratio[k] * v->pixel_clock[k] / v->no_of_dpp[i][j][k]); |
597 | } |
598 | else { |
599 | v->projected_dcfclk_deep_sleep =dcn_bw_max2(arg1: v->projected_dcfclk_deep_sleep, arg2: 1.1 *dcn_bw_ceil2(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) / 64.0 * v->pscl_factor[k] * v->required_dispclk[i][j] / (1 + j)); |
600 | } |
601 | } |
602 | else { |
603 | if (v->v_ratio[k] <= 1.0) { |
604 | v->projected_dcfclk_deep_sleep =dcn_bw_max2(arg1: v->projected_dcfclk_deep_sleep, arg2: 1.1 *dcn_bw_ceil2(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) / 32.0 * v->h_ratio[k] * v->pixel_clock[k] / v->no_of_dpp[i][j][k]); |
605 | } |
606 | else { |
607 | v->projected_dcfclk_deep_sleep =dcn_bw_max2(arg1: v->projected_dcfclk_deep_sleep, arg2: 1.1 *dcn_bw_ceil2(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) / 32.0 * v->pscl_factor[k] * v->required_dispclk[i][j] / (1 + j)); |
608 | } |
609 | if (v->v_ratio[k] / 2.0 <= 1.0) { |
610 | v->projected_dcfclk_deep_sleep =dcn_bw_max2(arg1: v->projected_dcfclk_deep_sleep, arg2: 1.1 *dcn_bw_ceil2(arg: v->byte_per_pixel_in_detc[k], significance: 2.0) / 32.0 * v->h_ratio[k] / 2.0 * v->pixel_clock[k] / v->no_of_dpp[i][j][k]); |
611 | } |
612 | else { |
613 | v->projected_dcfclk_deep_sleep =dcn_bw_max2(arg1: v->projected_dcfclk_deep_sleep, arg2: 1.1 *dcn_bw_ceil2(arg: v->byte_per_pixel_in_detc[k], significance: 2.0) / 32.0 * v->pscl_factor_chroma[k] * v->required_dispclk[i][j] / (1 + j)); |
614 | } |
615 | } |
616 | } |
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(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) / v->meta_req_height_y; |
621 | v->meta_surface_width_y =dcn_bw_ceil2(arg: v->viewport_width[k] / v->no_of_dpp[i][j][k] - 1.0, significance: v->meta_req_width_y) + v->meta_req_width_y; |
622 | v->meta_surface_height_y =dcn_bw_ceil2(arg: v->viewport_height[k] - 1.0, significance: 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(arg: (v->meta_surface_width_y * v->meta_surface_height_y *dcn_bw_ceil2(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) / 256.0 - 4096.0) / 8.0 / 4096.0, significance: 1.0) + 1) * 64.0; |
625 | } |
626 | else { |
627 | v->meta_pte_bytes_per_frame_y = 0.0; |
628 | } |
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(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) / 256.0; |
631 | } |
632 | else { |
633 | v->meta_row_bytes_y = v->meta_surface_height_y * v->meta_req_width_y *dcn_bw_ceil2(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) / 256.0; |
634 | } |
635 | } |
636 | else { |
637 | v->meta_pte_bytes_per_frame_y = 0.0; |
638 | v->meta_row_bytes_y = 0.0; |
639 | } |
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; |
644 | } |
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]; |
648 | } |
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]; |
652 | } |
653 | else { |
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]; |
656 | } |
657 | if (v->macro_tile_block_size_bytes_y <= 65536.0) { |
658 | v->data_pte_req_height_y = v->macro_tile_block_height_y; |
659 | } |
660 | else { |
661 | v->data_pte_req_height_y = 16.0 * v->read256_block_height_y[k]; |
662 | } |
663 | v->data_pte_req_width_y = 4096.0 /dcn_bw_ceil2(arg: v->byte_per_pixel_in_dety[k], significance: 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(arg: (v->viewport_width[k] / v->no_of_dpp[i][j][k] *dcn_bw_min2(arg1: 128.0, arg2: dcn_bw_pow(a: 2.0,exp: dcn_bw_floor2(arg: dcn_bw_log(a: v->pte_buffer_size_in_requests * v->data_pte_req_width_y / (v->viewport_width[k] / v->no_of_dpp[i][j][k]), b: 2.0), significance: 1.0))) - 1.0) / v->data_pte_req_width_y, significance: 1.0) + 1); |
666 | } |
667 | else if (v->source_scan[k] == dcn_bw_hor) { |
668 | v->dpte_bytes_per_row_y = 64.0 * (dcn_bw_ceil2(arg: (v->viewport_width[k] / v->no_of_dpp[i][j][k] - 1.0) / v->data_pte_req_width_y, significance: 1.0) + 1); |
669 | } |
670 | else { |
671 | v->dpte_bytes_per_row_y = 64.0 * (dcn_bw_ceil2(arg: (v->viewport_height[k] - 1.0) / v->data_pte_req_height_y, significance: 1.0) + 1); |
672 | } |
673 | } |
674 | else { |
675 | v->dpte_bytes_per_row_y = 0.0; |
676 | } |
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(arg: v->byte_per_pixel_in_detc[k], significance: 2.0) / v->meta_req_height_c; |
681 | v->meta_surface_width_c =dcn_bw_ceil2(arg: v->viewport_width[k] / v->no_of_dpp[i][j][k] / 2.0 - 1.0, significance: v->meta_req_width_c) + v->meta_req_width_c; |
682 | v->meta_surface_height_c =dcn_bw_ceil2(arg: v->viewport_height[k] / 2.0 - 1.0, significance: 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(arg: (v->meta_surface_width_c * v->meta_surface_height_c *dcn_bw_ceil2(arg: v->byte_per_pixel_in_detc[k], significance: 2.0) / 256.0 - 4096.0) / 8.0 / 4096.0, significance: 1.0) + 1) * 64.0; |
685 | } |
686 | else { |
687 | v->meta_pte_bytes_per_frame_c = 0.0; |
688 | } |
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(arg: v->byte_per_pixel_in_detc[k], significance: 2.0) / 256.0; |
691 | } |
692 | else { |
693 | v->meta_row_bytes_c = v->meta_surface_height_c * v->meta_req_width_c *dcn_bw_ceil2(arg: v->byte_per_pixel_in_detc[k], significance: 2.0) / 256.0; |
694 | } |
695 | } |
696 | else { |
697 | v->meta_pte_bytes_per_frame_c = 0.0; |
698 | v->meta_row_bytes_c = 0.0; |
699 | } |
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; |
704 | } |
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]; |
708 | } |
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]; |
712 | } |
713 | else { |
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]; |
716 | } |
717 | v->macro_tile_block_width_c = v->macro_tile_block_size_bytes_c /dcn_bw_ceil2(arg: v->byte_per_pixel_in_detc[k], significance: 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; |
720 | } |
721 | else { |
722 | v->data_pte_req_height_c = 16.0 * v->read256_block_height_c[k]; |
723 | } |
724 | v->data_pte_req_width_c = 4096.0 /dcn_bw_ceil2(arg: v->byte_per_pixel_in_detc[k], significance: 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(arg: (v->viewport_width[k] / v->no_of_dpp[i][j][k] / 2.0 * dcn_bw_min2(arg1: 128.0, arg2: dcn_bw_pow(a: 2.0,exp: dcn_bw_floor2(arg: dcn_bw_log(a: 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), b: 2.0), significance: 1.0))) - 1.0) / v->data_pte_req_width_c, significance: 1.0) + 1); |
727 | } |
728 | else if (v->source_scan[k] == dcn_bw_hor) { |
729 | v->dpte_bytes_per_row_c = 64.0 * (dcn_bw_ceil2(arg: (v->viewport_width[k] / v->no_of_dpp[i][j][k] / 2.0 - 1.0) / v->data_pte_req_width_c, significance: 1.0) + 1); |
730 | } |
731 | else { |
732 | v->dpte_bytes_per_row_c = 64.0 * (dcn_bw_ceil2(arg: (v->viewport_height[k] / 2.0 - 1.0) / v->data_pte_req_height_c, significance: 1.0) + 1); |
733 | } |
734 | } |
735 | else { |
736 | v->dpte_bytes_per_row_c = 0.0; |
737 | } |
738 | } |
739 | else { |
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; |
743 | } |
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(arg: v->v_init_y, significance: 1.0); |
749 | v->max_num_sw_y[k] =dcn_bw_ceil2(arg: (v->prefill_y[k] - 1.0) / v->swath_height_yper_state[i][j][k], significance: 1.0) + 1; |
750 | if (v->prefill_y[k] > 1.0) { |
751 | v->max_partial_sw_y =dcn_bw_mod(arg1: (v->prefill_y[k] - 2.0), arg2: v->swath_height_yper_state[i][j][k]); |
752 | } |
753 | else { |
754 | v->max_partial_sw_y =dcn_bw_mod(arg1: (v->prefill_y[k] + v->swath_height_yper_state[i][j][k] - 2.0), arg2: v->swath_height_yper_state[i][j][k]); |
755 | } |
756 | v->max_partial_sw_y =dcn_bw_max2(arg1: 1.0, arg2: 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(arg: v->v_init_c, significance: 1.0); |
761 | v->max_num_sw_c[k] =dcn_bw_ceil2(arg: (v->prefill_c[k] - 1.0) / v->swath_height_cper_state[i][j][k], significance: 1.0) + 1; |
762 | if (v->prefill_c[k] > 1.0) { |
763 | v->max_partial_sw_c =dcn_bw_mod(arg1: (v->prefill_c[k] - 2.0), arg2: v->swath_height_cper_state[i][j][k]); |
764 | } |
765 | else { |
766 | v->max_partial_sw_c =dcn_bw_mod(arg1: (v->prefill_c[k] + v->swath_height_cper_state[i][j][k] - 2.0), arg2: v->swath_height_cper_state[i][j][k]); |
767 | } |
768 | v->max_partial_sw_c =dcn_bw_max2(arg1: 1.0, arg2: 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; |
770 | } |
771 | else { |
772 | v->prefetch_lines_c[k] = 0.0; |
773 | } |
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; |
777 | } |
778 | if (v->output_format[k] == dcn_bw_420) { |
779 | v->dst_y_after_scaler = 1.0; |
780 | } |
781 | else { |
782 | v->dst_y_after_scaler = 0.0; |
783 | } |
784 | v->time_calc = 24.0 / v->projected_dcfclk_deep_sleep; |
785 | v->v_update_offset[k][j] = dcn_bw_ceil2(arg: v->htotal[k] / 4.0, significance: 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(arg1: 150.0 / (v->required_dispclk[i][j] / (j + 1)), arg2: 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]; |
793 | } |
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; |
796 | } |
797 | else { |
798 | v->maximum_vstartup = v->v_sync_plus_back_porch[k] - 1.0; |
799 | } |
800 | |
801 | do { |
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(arg: 4.0 * (v->line_times_for_prefetch[k] + 0.125), significance: 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(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) + v->prefetch_lines_c[k] * v->swath_width_yper_state[i][j][k] / 2.0 *dcn_bw_ceil2(arg: v->byte_per_pixel_in_detc[k], significance: 2.0)) / (v->line_times_for_prefetch[k] * v->htotal[k] / v->pixel_clock[k]); |
805 | |
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 | v1: v->meta_pte_bytes_frame[k] / v->prefetch_bw[k], |
809 | v2: v->extra_latency, |
810 | v3: v->htotal[k] / v->pixel_clock[k] / 4.0); |
811 | } else { |
812 | v->time_for_meta_pte_without_immediate_flip = v->htotal[k] / v->pixel_clock[k] / 4.0; |
813 | } |
814 | |
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(v1: ( |
817 | v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) / v->prefetch_bw[k], |
818 | v2: v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_without_immediate_flip, |
819 | v3: v->extra_latency); |
820 | } else { |
821 | v->time_for_meta_and_dpte_row_without_immediate_flip = dcn_bw_max2( |
822 | arg1: v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_without_immediate_flip, |
823 | arg2: v->extra_latency - v->time_for_meta_pte_with_immediate_flip); |
824 | } |
825 | |
826 | v->lines_for_meta_pte_without_immediate_flip[k] =dcn_bw_floor2(arg: 4.0 * (v->time_for_meta_pte_without_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), significance: 1.0) / 4; |
827 | v->lines_for_meta_and_dpte_row_without_immediate_flip[k] =dcn_bw_floor2(arg: 4.0 * (v->time_for_meta_and_dpte_row_without_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), significance: 1.0) / 4; |
828 | v->maximum_vstartup = v->maximum_vstartup - 1; |
829 | |
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) |
831 | break; |
832 | |
833 | } while(1); |
834 | } |
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(arg1: v->read_bandwidth[k], arg2: v->prefetch_bw[k]); |
838 | } |
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]; |
843 | } |
844 | } |
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(v1: v->meta_pte_bytes_per_frame[k] / v->prefetch_bw[k], v2: 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])), v3: v->extra_latency, v4: v->urgent_latency, v5: v->htotal[k] / v->pixel_clock[k] / 4.0); |
848 | } |
849 | else { |
850 | v->time_for_meta_pte_with_immediate_flip = v->htotal[k] / v->pixel_clock[k] / 4.0; |
851 | } |
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(v1: (v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) / v->prefetch_bw[k], v2: (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])), v3: v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_with_immediate_flip, v4: v->extra_latency, v5: 2.0 * v->urgent_latency); |
854 | } |
855 | else { |
856 | v->time_for_meta_and_dpte_row_with_immediate_flip =dcn_bw_max2(arg1: v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_with_immediate_flip, arg2: v->extra_latency - v->time_for_meta_pte_with_immediate_flip); |
857 | } |
858 | v->lines_for_meta_pte_with_immediate_flip[k] =dcn_bw_floor2(arg: 4.0 * (v->time_for_meta_pte_with_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), significance: 1.0) / 4; |
859 | v->lines_for_meta_and_dpte_row_with_immediate_flip[k] =dcn_bw_floor2(arg: 4.0 * (v->time_for_meta_and_dpte_row_with_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), significance: 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(arg1: v->v_ratio_pre_ywith_immediate_flip[i][j][k], arg2: (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)); |
867 | } |
868 | else { |
869 | v->v_ratio_pre_ywith_immediate_flip[i][j][k] = 999999.0; |
870 | } |
871 | } |
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(arg1: v->v_ratio_pre_cwith_immediate_flip[i][j][k], arg2: (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)); |
876 | } |
877 | else { |
878 | v->v_ratio_pre_cwith_immediate_flip[i][j][k] = 999999.0; |
879 | } |
880 | } |
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(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) + v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_with_immediate_flip *dcn_bw_ceil2(arg: v->byte_per_pixel_in_detc[k], significance: 2.0) / 2.0) * v->swath_width_yper_state[i][j][k] / (v->htotal[k] / v->pixel_clock[k]); |
882 | } |
883 | else { |
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; |
887 | } |
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(arg1: v->v_ratio_pre_ywithout_immediate_flip[i][j][k], arg2: (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)); |
893 | } |
894 | else { |
895 | v->v_ratio_pre_ywithout_immediate_flip[i][j][k] = 999999.0; |
896 | } |
897 | } |
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(arg1: v->v_ratio_pre_cwithout_immediate_flip[i][j][k], arg2: (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)); |
902 | } |
903 | else { |
904 | v->v_ratio_pre_cwithout_immediate_flip[i][j][k] = 999999.0; |
905 | } |
906 | } |
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(arg: v->byte_per_pixel_in_dety[k], significance: 1.0) + v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_without_immediate_flip *dcn_bw_ceil2(arg: v->byte_per_pixel_in_detc[k], significance: 2.0) / 2.0) * v->swath_width_yper_state[i][j][k] / (v->htotal[k] / v->pixel_clock[k]); |
908 | } |
909 | else { |
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; |
913 | } |
914 | } |
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(arg1: v->read_bandwidth[k], arg2: v->required_prefetch_pixel_data_bw_with_immediate_flip[i][j][k]) +dcn_bw_max2(arg1: v->meta_pte_bytes_per_frame[k] / (v->lines_for_meta_pte_with_immediate_flip[k] * v->htotal[k] / v->pixel_clock[k]), arg2: (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])); |
919 | } |
920 | else { |
921 | v->maximum_read_bandwidth_with_prefetch_with_immediate_flip = v->maximum_read_bandwidth_with_prefetch_with_immediate_flip +dcn_bw_max2(arg1: v->read_bandwidth[k], arg2: v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k]); |
922 | } |
923 | } |
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(arg1: v->read_bandwidth[k], arg2: v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k]); |
927 | } |
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; |
931 | } |
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; |
935 | } |
936 | } |
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; |
940 | } |
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; |
944 | } |
945 | } |
946 | } |
947 | } |
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; |
954 | } |
955 | } |
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; |
960 | } |
961 | } |
962 | } |
963 | } |
964 | /*mode support, voltage state and soc configuration*/ |
965 | |
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; |
971 | } |
972 | else { |
973 | v->mode_support_with_immediate_flip[i][j] = dcn_bw_no; |
974 | } |
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; |
977 | } |
978 | else { |
979 | v->mode_support_without_immediate_flip[i][j] = dcn_bw_no; |
980 | } |
981 | } |
982 | else { |
983 | v->mode_support_with_immediate_flip[i][j] = dcn_bw_no; |
984 | v->mode_support_without_immediate_flip[i][j] = dcn_bw_no; |
985 | } |
986 | } |
987 | } |
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; |
991 | } |
992 | } |
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; |
996 | } |
997 | } |
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; |
1001 | } |
1002 | else { |
1003 | v->immediate_flip_supported = dcn_bw_yes; |
1004 | v->voltage_level = v->voltage_level_with_immediate_flip; |
1005 | } |
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]; |
1012 | } |
1013 | v->dispclk_dppclk_support_per_ratio[j] = v->dispclk_dppclk_support[v->voltage_level][j]; |
1014 | } |
1015 | v->max_phyclk = v->phyclk_per_state[v->voltage_level]; |
1016 | } |
1017 | void display_pipe_configuration(struct dcn_bw_internal_vars *v) |
1018 | { |
1019 | int j; |
1020 | int k; |
1021 | /*display pipe configuration*/ |
1022 | |
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]; |
1027 | } |
1028 | } |
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]; |
1032 | } |
1033 | else { |
1034 | v->dispclk_dppclk_ratio = 2; |
1035 | v->final_error_message = v->error_message[1]; |
1036 | } |
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]; |
1039 | } |
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; |
1044 | } |
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; |
1048 | } |
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; |
1052 | } |
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; |
1056 | } |
1057 | else { |
1058 | v->byte_per_pix_dety = 4.0f / 3.0f; |
1059 | v->byte_per_pix_detc = 8.0f / 3.0f; |
1060 | } |
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; |
1064 | } |
1065 | else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) { |
1066 | v->read256_bytes_block_height_y = 4.0; |
1067 | } |
1068 | else { |
1069 | v->read256_bytes_block_height_y = 8.0; |
1070 | } |
1071 | v->read256_bytes_block_width_y = 256.0 /dcn_bw_ceil2(arg: v->byte_per_pix_dety, significance: 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; |
1074 | } |
1075 | else { |
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; |
1079 | } |
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; |
1083 | } |
1084 | else { |
1085 | v->read256_bytes_block_height_y = 8.0; |
1086 | v->read256_bytes_block_height_c = 8.0; |
1087 | } |
1088 | v->read256_bytes_block_width_y = 256.0 /dcn_bw_ceil2(arg: v->byte_per_pix_dety, significance: 1.0) / v->read256_bytes_block_height_y; |
1089 | v->read256_bytes_block_width_c = 256.0 /dcn_bw_ceil2(arg: v->byte_per_pix_detc, significance: 2.0) / v->read256_bytes_block_height_c; |
1090 | } |
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; |
1094 | } |
1095 | else { |
1096 | v->maximum_swath_height_y = v->read256_bytes_block_width_y; |
1097 | v->maximum_swath_height_c = v->read256_bytes_block_width_c; |
1098 | } |
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; |
1102 | } |
1103 | else { |
1104 | v->minimum_swath_height_y = v->maximum_swath_height_y / 2.0; |
1105 | } |
1106 | v->minimum_swath_height_c = v->maximum_swath_height_c; |
1107 | } |
1108 | else { |
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; |
1112 | } |
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; |
1117 | } |
1118 | else { |
1119 | v->minimum_swath_height_c = v->maximum_swath_height_c / 2.0; |
1120 | } |
1121 | } |
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; |
1126 | } |
1127 | else { |
1128 | v->minimum_swath_height_y = v->maximum_swath_height_y / 2.0; |
1129 | } |
1130 | } |
1131 | else { |
1132 | v->minimum_swath_height_y = v->maximum_swath_height_y; |
1133 | v->minimum_swath_height_c = v->maximum_swath_height_c; |
1134 | } |
1135 | } |
1136 | if (v->source_scan[k] == dcn_bw_hor) { |
1137 | v->swath_width = v->viewport_width[k] / v->dpp_per_plane[k]; |
1138 | } |
1139 | else { |
1140 | v->swath_width = v->viewport_height[k] / v->dpp_per_plane[k]; |
1141 | } |
1142 | v->swath_width_granularity_y = 256.0 /dcn_bw_ceil2(arg: v->byte_per_pix_dety, significance: 1.0) / v->maximum_swath_height_y; |
1143 | v->rounded_up_max_swath_size_bytes_y = (dcn_bw_ceil2(arg: v->swath_width - 1.0, significance: 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(arg: v->rounded_up_max_swath_size_bytes_y, significance: 256.0) + 256; |
1146 | } |
1147 | if (v->maximum_swath_height_c > 0.0) { |
1148 | v->swath_width_granularity_c = 256.0 /dcn_bw_ceil2(arg: v->byte_per_pix_detc, significance: 2.0) / v->maximum_swath_height_c; |
1149 | v->rounded_up_max_swath_size_bytes_c = (dcn_bw_ceil2(arg: v->swath_width / 2.0 - 1.0, significance: v->swath_width_granularity_c) + v->swath_width_granularity_c) * v->byte_per_pix_detc * v->maximum_swath_height_c; |
1150 | if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10) { |
1151 | v->rounded_up_max_swath_size_bytes_c = dcn_bw_ceil2(arg: v->rounded_up_max_swath_size_bytes_c, significance: 256.0) + 256; |
1152 | } |
1153 | } |
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; |
1157 | } |
1158 | else { |
1159 | v->swath_height_y[k] = v->minimum_swath_height_y; |
1160 | v->swath_height_c[k] = v->minimum_swath_height_c; |
1161 | } |
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; |
1165 | } |
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; |
1169 | } |
1170 | else { |
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; |
1173 | } |
1174 | } |
1175 | } |
1176 | void dispclkdppclkdcfclk_deep_sleep_prefetch_parameters_watermarks_and_performance_calculation(struct dcn_bw_internal_vars *v) |
1177 | { |
1178 | int k; |
1179 | /*dispclk and dppclk calculation*/ |
1180 | |
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(arg1: v->max_dchub_topscl_throughput, arg2: v->max_pscl_tolb_throughput * v->h_ratio[k] /dcn_bw_ceil2(arg: v->htaps[k] / 6.0, significance: 1.0)); |
1186 | } |
1187 | else { |
1188 | v->pscl_throughput[k] =dcn_bw_min2(arg1: v->max_dchub_topscl_throughput, arg2: v->max_pscl_tolb_throughput); |
1189 | } |
1190 | v->dppclk_using_single_dpp_luma = v->pixel_clock[k] *dcn_bw_max3(v1: v->vtaps[k] / 6.0 *dcn_bw_min2(arg1: 1.0, arg2: v->h_ratio[k]), v2: v->h_ratio[k] * v->v_ratio[k] / v->pscl_throughput[k], v3: 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; |
1194 | } |
1195 | else { |
1196 | if (v->h_ratio[k] > 1.0) { |
1197 | v->pscl_throughput_chroma[k] =dcn_bw_min2(arg1: v->max_dchub_topscl_throughput, arg2: v->max_pscl_tolb_throughput * v->h_ratio[k] / 2.0 /dcn_bw_ceil2(arg: v->hta_pschroma[k] / 6.0, significance: 1.0)); |
1198 | } |
1199 | else { |
1200 | v->pscl_throughput_chroma[k] =dcn_bw_min2(arg1: v->max_dchub_topscl_throughput, arg2: v->max_pscl_tolb_throughput); |
1201 | } |
1202 | v->dppclk_using_single_dpp_chroma = v->pixel_clock[k] *dcn_bw_max3(v1: v->vta_pschroma[k] / 6.0 *dcn_bw_min2(arg1: 1.0, arg2: v->h_ratio[k] / 2.0), v2: v->h_ratio[k] * v->v_ratio[k] / 4.0 / v->pscl_throughput_chroma[k], v3: 1.0); |
1203 | v->dppclk_using_single_dpp =dcn_bw_max2(arg1: v->dppclk_using_single_dpp_luma, arg2: v->dppclk_using_single_dpp_chroma); |
1204 | } |
1205 | if (v->odm_capable == dcn_bw_yes) { |
1206 | v->dispclk_with_ramping =dcn_bw_max2(arg1: v->dispclk_with_ramping,arg2: dcn_bw_max2(arg1: v->dppclk_using_single_dpp / v->dpp_per_plane[k] * v->dispclk_dppclk_ratio, arg2: 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(arg1: v->dispclk_without_ramping,arg2: dcn_bw_max2(arg1: v->dppclk_using_single_dpp / v->dpp_per_plane[k] * v->dispclk_dppclk_ratio, arg2: v->pixel_clock[k] / v->dpp_per_plane[k]) * (1.0 + v->downspreading / 100.0)); |
1208 | } |
1209 | else { |
1210 | v->dispclk_with_ramping =dcn_bw_max2(arg1: v->dispclk_with_ramping,arg2: dcn_bw_max2(arg1: v->dppclk_using_single_dpp / v->dpp_per_plane[k] * v->dispclk_dppclk_ratio, arg2: 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(arg1: v->dispclk_without_ramping,arg2: dcn_bw_max2(arg1: v->dppclk_using_single_dpp / v->dpp_per_plane[k] * v->dispclk_dppclk_ratio, arg2: v->pixel_clock[k]) * (1.0 + v->downspreading / 100.0)); |
1212 | } |
1213 | } |
1214 | if (v->dispclk_without_ramping > v->max_dispclk[number_of_states]) { |
1215 | v->dispclk = v->dispclk_without_ramping; |
1216 | } |
1217 | else if (v->dispclk_with_ramping > v->max_dispclk[number_of_states]) { |
1218 | v->dispclk = v->max_dispclk[number_of_states]; |
1219 | } |
1220 | else { |
1221 | v->dispclk = v->dispclk_with_ramping; |
1222 | } |
1223 | v->dppclk = v->dispclk / v->dispclk_dppclk_ratio; |
1224 | /*urgent watermark*/ |
1225 | |
1226 | v->return_bandwidth_to_dcn =dcn_bw_min2(arg1: v->return_bus_width * v->dcfclk, arg2: 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; |
1231 | } |
1232 | } |
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(arg1: v->return_bw, arg2: 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))); |
1236 | } |
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(arg1: v->return_bw, arg2: dcn_bw_pow(a: 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), exp: 2)); |
1240 | } |
1241 | v->return_bandwidth_to_dcn =dcn_bw_min2(arg1: v->return_bus_width * v->dcfclk, arg2: 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(arg1: v->return_bw, arg2: 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))); |
1244 | } |
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(arg1: v->return_bw, arg2: dcn_bw_pow(a: 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), exp: 2)); |
1248 | } |
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]; |
1252 | } |
1253 | else { |
1254 | v->swath_width_y[k] = v->viewport_height[k] / v->dpp_per_plane[k]; |
1255 | } |
1256 | } |
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; |
1261 | } |
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; |
1265 | } |
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; |
1269 | } |
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; |
1273 | } |
1274 | else { |
1275 | v->byte_per_pixel_dety[k] = 4.0f / 3.0f; |
1276 | v->byte_per_pixel_detc[k] = 8.0f / 3.0f; |
1277 | } |
1278 | } |
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(arg: v->byte_per_pixel_dety[k], significance: 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(arg: v->byte_per_pixel_detc[k], significance: 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]; |
1284 | } |
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]; |
1291 | } |
1292 | } |
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]; |
1298 | } |
1299 | else { |
1300 | v->display_pipe_line_delivery_time_luma[k] = v->swath_width_y[k] / v->pscl_throughput[k] / v->dppclk; |
1301 | } |
1302 | v->data_fabric_line_delivery_time_luma = v->swath_width_y[k] * v->swath_height_y[k] *dcn_bw_ceil2(arg: v->byte_per_pixel_dety[k], significance: 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(arg1: v->last_pixel_of_line_extra_watermark, arg2: 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; |
1306 | } |
1307 | else { |
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]; |
1310 | } |
1311 | else { |
1312 | v->display_pipe_line_delivery_time_chroma[k] = v->swath_width_y[k] / 2.0 / v->pscl_throughput_chroma[k] / v->dppclk; |
1313 | } |
1314 | v->data_fabric_line_delivery_time_chroma = v->swath_width_y[k] / 2.0 * v->swath_height_c[k] *dcn_bw_ceil2(arg: v->byte_per_pixel_detc[k], significance: 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(arg1: v->last_pixel_of_line_extra_watermark, arg2: v->data_fabric_line_delivery_time_chroma - v->display_pipe_line_delivery_time_chroma[k]); |
1316 | } |
1317 | } |
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; |
1321 | } |
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*/ |
1325 | |
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; |
1331 | } |
1332 | } |
1333 | if (v->total_active_writeback <= 1.0) { |
1334 | v->writeback_dram_clock_change_watermark = v->dram_clock_change_latency + v->write_back_latency; |
1335 | } |
1336 | else { |
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; |
1338 | } |
1339 | /*stutter efficiency*/ |
1340 | |
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(arg: v->lines_in_dety[k], significance: 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(arg: v->lines_in_detc[k], significance: 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); |
1349 | } |
1350 | else { |
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; |
1354 | } |
1355 | } |
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]; |
1361 | } |
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]; |
1365 | } |
1366 | } |
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; |
1371 | } |
1372 | else { |
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; |
1374 | } |
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; |
1377 | } |
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; |
1380 | } |
1381 | } |
1382 | v->part_of_burst_that_fits_in_rob =dcn_bw_min2(arg1: v->min_full_det_buffering_time * v->total_data_read_bandwidth, arg2: 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; |
1386 | } |
1387 | else { |
1388 | v->stutter_efficiency_not_including_vblank = 0.0; |
1389 | } |
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]; |
1394 | } |
1395 | else { |
1396 | v->v_blank_time = 0.0; |
1397 | } |
1398 | v->smallest_vblank =dcn_bw_min2(arg1: v->smallest_vblank, arg2: v->v_blank_time); |
1399 | } |
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*/ |
1402 | |
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(arg1: 1.1 * v->swath_width_y[k] *dcn_bw_ceil2(arg: v->byte_per_pixel_dety[k], significance: 1.0) / 32.0 / v->display_pipe_line_delivery_time_luma[k], arg2: 1.1 * v->swath_width_y[k] / 2.0 *dcn_bw_ceil2(arg: v->byte_per_pixel_detc[k], significance: 2.0) / 32.0 / v->display_pipe_line_delivery_time_chroma[k]); |
1406 | } |
1407 | else { |
1408 | v->dcfclk_deep_sleep_per_plane[k] = 1.1 * v->swath_width_y[k] *dcn_bw_ceil2(arg: v->byte_per_pixel_dety[k], significance: 1.0) / 64.0 / v->display_pipe_line_delivery_time_luma[k]; |
1409 | } |
1410 | v->dcfclk_deep_sleep_per_plane[k] =dcn_bw_max2(arg1: v->dcfclk_deep_sleep_per_plane[k], arg2: v->pixel_clock[k] / 16.0); |
1411 | } |
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(arg1: v->dcf_clk_deep_sleep, arg2: v->dcfclk_deep_sleep_per_plane[k]); |
1415 | } |
1416 | /*stutter watermark*/ |
1417 | |
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*/ |
1421 | |
1422 | for (k = 0; k <= v->number_of_active_planes - 1; k++) { |
1423 | v->effective_det_plus_lb_lines_luma =dcn_bw_floor2(arg: v->lines_in_dety[k] +dcn_bw_min2(arg1: 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]), arg2: v->effective_lb_latency_hiding_source_lines_luma), significance: 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(arg: v->lines_in_detc[k] +dcn_bw_min2(arg1: 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]), arg2: v->effective_lb_latency_hiding_source_lines_chroma), significance: 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(arg1: v->urgent_latency_support_us_luma, arg2: v->urgent_latency_support_us_chroma); |
1429 | } |
1430 | else { |
1431 | v->urgent_latency_support_us[k] = v->urgent_latency_support_us_luma; |
1432 | } |
1433 | } |
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(arg1: v->min_urgent_latency_support_us, arg2: v->urgent_latency_support_us[k]); |
1437 | } |
1438 | /*non-urgent latency tolerance*/ |
1439 | |
1440 | v->non_urgent_latency_tolerance = v->min_urgent_latency_support_us - v->urgent_watermark; |
1441 | /*prefetch*/ |
1442 | |
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; |
1447 | } |
1448 | else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) { |
1449 | v->block_height256_bytes_y = 4.0; |
1450 | } |
1451 | else { |
1452 | v->block_height256_bytes_y = 8.0; |
1453 | } |
1454 | v->block_height256_bytes_c = 0.0; |
1455 | } |
1456 | else { |
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; |
1460 | } |
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; |
1464 | } |
1465 | else { |
1466 | v->block_height256_bytes_y = 8.0; |
1467 | v->block_height256_bytes_c = 8.0; |
1468 | } |
1469 | } |
1470 | if (v->dcc_enable[k] == dcn_bw_yes) { |
1471 | v->meta_request_width_y = 64.0 * 256.0 /dcn_bw_ceil2(arg: v->byte_per_pixel_dety[k], significance: 1.0) / (8.0 * v->block_height256_bytes_y); |
1472 | v->meta_surf_width_y =dcn_bw_ceil2(arg: v->swath_width_y[k] - 1.0, significance: v->meta_request_width_y) + v->meta_request_width_y; |
1473 | v->meta_surf_height_y =dcn_bw_ceil2(arg: v->viewport_height[k] - 1.0, significance: 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(arg: (v->meta_surf_width_y * v->meta_surf_height_y *dcn_bw_ceil2(arg: v->byte_per_pixel_dety[k], significance: 1.0) / 256.0 - 4096.0) / 8.0 / 4096.0, significance: 1.0) + 1) * 64.0; |
1476 | } |
1477 | else { |
1478 | v->meta_pte_bytes_frame_y = 0.0; |
1479 | } |
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(arg: v->byte_per_pixel_dety[k], significance: 1.0) / 256.0; |
1482 | } |
1483 | else { |
1484 | v->meta_row_byte_y = v->meta_surf_height_y * v->meta_request_width_y *dcn_bw_ceil2(arg: v->byte_per_pixel_dety[k], significance: 1.0) / 256.0; |
1485 | } |
1486 | } |
1487 | else { |
1488 | v->meta_pte_bytes_frame_y = 0.0; |
1489 | v->meta_row_byte_y = 0.0; |
1490 | } |
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; |
1495 | } |
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; |
1499 | } |
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; |
1503 | } |
1504 | else { |
1505 | v->macro_tile_size_byte_y = 256.0 * 1024; |
1506 | v->macro_tile_height_y = 32.0 * v->block_height256_bytes_y; |
1507 | } |
1508 | if (v->macro_tile_size_byte_y <= 65536.0) { |
1509 | v->pixel_pte_req_height_y = v->macro_tile_height_y; |
1510 | } |
1511 | else { |
1512 | v->pixel_pte_req_height_y = 16.0 * v->block_height256_bytes_y; |
1513 | } |
1514 | v->pixel_pte_req_width_y = 4096.0 /dcn_bw_ceil2(arg: v->byte_per_pixel_dety[k], significance: 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(arg: (v->swath_width_y[k] *dcn_bw_min2(arg1: 128.0, arg2: dcn_bw_pow(a: 2.0,exp: dcn_bw_floor2(arg: dcn_bw_log(a: v->pte_buffer_size_in_requests * v->pixel_pte_req_width_y / v->swath_width_y[k], b: 2.0), significance: 1.0))) - 1.0) / v->pixel_pte_req_width_y, significance: 1.0) + 1); |
1517 | } |
1518 | else if (v->source_scan[k] == dcn_bw_hor) { |
1519 | v->pixel_pte_bytes_per_row_y = 64.0 * (dcn_bw_ceil2(arg: (v->swath_width_y[k] - 1.0) / v->pixel_pte_req_width_y, significance: 1.0) + 1); |
1520 | } |
1521 | else { |
1522 | v->pixel_pte_bytes_per_row_y = 64.0 * (dcn_bw_ceil2(arg: (v->viewport_height[k] - 1.0) / v->pixel_pte_req_height_y, significance: 1.0) + 1); |
1523 | } |
1524 | } |
1525 | else { |
1526 | v->pixel_pte_bytes_per_row_y = 0.0; |
1527 | } |
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(arg: v->byte_per_pixel_detc[k], significance: 2.0) / (8.0 * v->block_height256_bytes_c); |
1531 | v->meta_surf_width_c =dcn_bw_ceil2(arg: v->swath_width_y[k] / 2.0 - 1.0, significance: v->meta_request_width_c) + v->meta_request_width_c; |
1532 | v->meta_surf_height_c =dcn_bw_ceil2(arg: v->viewport_height[k] / 2.0 - 1.0, significance: 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(arg: (v->meta_surf_width_c * v->meta_surf_height_c *dcn_bw_ceil2(arg: v->byte_per_pixel_detc[k], significance: 2.0) / 256.0 - 4096.0) / 8.0 / 4096.0, significance: 1.0) + 1) * 64.0; |
1535 | } |
1536 | else { |
1537 | v->meta_pte_bytes_frame_c = 0.0; |
1538 | } |
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(arg: v->byte_per_pixel_detc[k], significance: 2.0) / 256.0; |
1541 | } |
1542 | else { |
1543 | v->meta_row_byte_c = v->meta_surf_height_c * v->meta_request_width_c *dcn_bw_ceil2(arg: v->byte_per_pixel_detc[k], significance: 2.0) / 256.0; |
1544 | } |
1545 | } |
1546 | else { |
1547 | v->meta_pte_bytes_frame_c = 0.0; |
1548 | v->meta_row_byte_c = 0.0; |
1549 | } |
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; |
1554 | } |
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; |
1558 | } |
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; |
1562 | } |
1563 | else { |
1564 | v->macro_tile_size_bytes_c = 256.0 * 1024; |
1565 | v->macro_tile_height_c = 32.0 * v->block_height256_bytes_c; |
1566 | } |
1567 | if (v->macro_tile_size_bytes_c <= 65536.0) { |
1568 | v->pixel_pte_req_height_c = v->macro_tile_height_c; |
1569 | } |
1570 | else { |
1571 | v->pixel_pte_req_height_c = 16.0 * v->block_height256_bytes_c; |
1572 | } |
1573 | v->pixel_pte_req_width_c = 4096.0 /dcn_bw_ceil2(arg: v->byte_per_pixel_detc[k], significance: 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(arg: (v->swath_width_y[k] / 2.0 * dcn_bw_min2(arg1: 128.0, arg2: dcn_bw_pow(a: 2.0,exp: dcn_bw_floor2(arg: dcn_bw_log(a: v->pte_buffer_size_in_requests * v->pixel_pte_req_width_c / (v->swath_width_y[k] / 2.0), b: 2.0), significance: 1.0))) - 1.0) / v->pixel_pte_req_width_c, significance: 1.0) + 1); |
1576 | } |
1577 | else if (v->source_scan[k] == dcn_bw_hor) { |
1578 | v->pixel_pte_bytes_per_row_c = 64.0 * (dcn_bw_ceil2(arg: (v->swath_width_y[k] / 2.0 - 1.0) / v->pixel_pte_req_width_c, significance: 1.0) + 1); |
1579 | } |
1580 | else { |
1581 | v->pixel_pte_bytes_per_row_c = 64.0 * (dcn_bw_ceil2(arg: (v->viewport_height[k] / 2.0 - 1.0) / v->pixel_pte_req_height_c, significance: 1.0) + 1); |
1582 | } |
1583 | } |
1584 | else { |
1585 | v->pixel_pte_bytes_per_row_c = 0.0; |
1586 | } |
1587 | } |
1588 | else { |
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; |
1592 | } |
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(arg: (v->v_ratio[k] + v->vtaps[k] + 1.0 + v->interlace_output[k] * 0.5 * v->v_ratio[k]) / 2.0, significance: 1.0); |
1597 | v->max_num_swath_y[k] =dcn_bw_ceil2(arg: (v->v_init_pre_fill_y[k] - 1.0) / v->swath_height_y[k], significance: 1.0) + 1; |
1598 | if (v->v_init_pre_fill_y[k] > 1.0) { |
1599 | v->max_partial_swath_y =dcn_bw_mod(arg1: (v->v_init_pre_fill_y[k] - 2.0), arg2: v->swath_height_y[k]); |
1600 | } |
1601 | else { |
1602 | v->max_partial_swath_y =dcn_bw_mod(arg1: (v->v_init_pre_fill_y[k] + v->swath_height_y[k] - 2.0), arg2: v->swath_height_y[k]); |
1603 | } |
1604 | v->max_partial_swath_y =dcn_bw_max2(arg1: 1.0, arg2: 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(arg: (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, significance: 1.0); |
1608 | v->max_num_swath_c[k] =dcn_bw_ceil2(arg: (v->v_init_pre_fill_c[k] - 1.0) / v->swath_height_c[k], significance: 1.0) + 1; |
1609 | if (v->v_init_pre_fill_c[k] > 1.0) { |
1610 | v->max_partial_swath_c =dcn_bw_mod(arg1: (v->v_init_pre_fill_c[k] - 2.0), arg2: v->swath_height_c[k]); |
1611 | } |
1612 | else { |
1613 | v->max_partial_swath_c =dcn_bw_mod(arg1: (v->v_init_pre_fill_c[k] + v->swath_height_c[k] - 2.0), arg2: v->swath_height_c[k]); |
1614 | } |
1615 | v->max_partial_swath_c =dcn_bw_max2(arg1: 1.0, arg2: v->max_partial_swath_c); |
1616 | } |
1617 | else { |
1618 | v->max_num_swath_c[k] = 0.0; |
1619 | v->max_partial_swath_c = 0.0; |
1620 | } |
1621 | v->prefetch_source_lines_c[k] = v->max_num_swath_c[k] * v->swath_height_c[k] + v->max_partial_swath_c; |
1622 | } |
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; |
1627 | } |
1628 | else { |
1629 | v->max_vstartup_lines[k] = v->v_sync_plus_back_porch[k] - 1.0; |
1630 | } |
1631 | } |
1632 | v->next_prefetch_mode = 0.0; |
1633 | do { |
1634 | v->v_startup_lines = 13.0; |
1635 | do { |
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; |
1646 | } |
1647 | if (v->output_format[k] == dcn_bw_420) { |
1648 | v->dsty_after_scaler = 1.0; |
1649 | } |
1650 | else { |
1651 | v->dsty_after_scaler = 0.0; |
1652 | } |
1653 | v->v_update_offset_pix[k] = dcn_bw_ceil2(arg: v->htotal[k] / 4.0, significance: 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(arg1: 150.0 / v->dppclk, arg2: 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(arg1: v->v_startup_lines, arg2: v->max_vstartup_lines[k]); |
1659 | if (v->prefetch_mode == 0.0) { |
1660 | v->t_wait =dcn_bw_max3(v1: v->dram_clock_change_latency + v->urgent_latency, v2: v->sr_enter_plus_exit_time, v3: v->urgent_latency); |
1661 | } |
1662 | else if (v->prefetch_mode == 1.0) { |
1663 | v->t_wait =dcn_bw_max2(arg1: v->sr_enter_plus_exit_time, arg2: v->urgent_latency); |
1664 | } |
1665 | else { |
1666 | v->t_wait = v->urgent_latency; |
1667 | } |
1668 | v->destination_lines_for_prefetch[k] =dcn_bw_floor2(arg: 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), significance: 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(arg: v->byte_per_pixel_dety[k], significance: 1.0) + v->prefetch_source_lines_c[k] * v->swath_width_y[k] / 2.0 *dcn_bw_ceil2(arg: v->byte_per_pixel_detc[k], significance: 2.0)) / (v->destination_lines_for_prefetch[k] * v->htotal[k] / v->pixel_clock[k]); |
1671 | } |
1672 | else { |
1673 | v->prefetch_bandwidth[k] = 999999.0; |
1674 | } |
1675 | } |
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(arg1: v->read_bandwidth_plane_luma[k] + v->read_bandwidth_plane_chroma[k], arg2: v->prefetch_bandwidth[k]); |
1679 | } |
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]; |
1684 | } |
1685 | } |
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(v1: v->meta_pte_bytes_frame[k] / v->prefetch_bandwidth[k], v2: 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])), v3: v->urgent_extra_latency, v4: v->urgent_latency, v5: v->htotal[k] / v->pixel_clock[k] / 4.0); |
1691 | } |
1692 | else { |
1693 | v->time_for_fetching_meta_pte =dcn_bw_max3(v1: v->meta_pte_bytes_frame[k] / v->prefetch_bandwidth[k], v2: v->urgent_extra_latency, v3: v->htotal[k] / v->pixel_clock[k] / 4.0); |
1694 | } |
1695 | } |
1696 | else { |
1697 | v->time_for_fetching_meta_pte = v->htotal[k] / v->pixel_clock[k] / 4.0; |
1698 | } |
1699 | v->destination_lines_to_request_vm_inv_blank[k] =dcn_bw_floor2(arg: 4.0 * (v->time_for_fetching_meta_pte / (v->htotal[k] / v->pixel_clock[k]) + 0.125), significance: 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(v1: (v->meta_row_byte[k] + v->pixel_pte_bytes_per_row[k]) / v->prefetch_bandwidth[k], v2: (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])), v3: v->urgent_extra_latency, v4: 2.0 * v->urgent_latency, v5: v->htotal[k] / v->pixel_clock[k] - v->time_for_fetching_meta_pte); |
1703 | } |
1704 | else { |
1705 | v->time_for_fetching_row_in_vblank =dcn_bw_max3(v1: (v->meta_row_byte[k] + v->pixel_pte_bytes_per_row[k]) / v->prefetch_bandwidth[k], v2: v->urgent_extra_latency, v3: v->htotal[k] / v->pixel_clock[k] - v->time_for_fetching_meta_pte); |
1706 | } |
1707 | } |
1708 | else { |
1709 | v->time_for_fetching_row_in_vblank =dcn_bw_max2(arg1: v->urgent_extra_latency - v->time_for_fetching_meta_pte, arg2: v->htotal[k] / v->pixel_clock[k] - v->time_for_fetching_meta_pte); |
1710 | } |
1711 | v->destination_lines_to_request_row_in_vblank[k] =dcn_bw_floor2(arg: 4.0 * (v->time_for_fetching_row_in_vblank / (v->htotal[k] / v->pixel_clock[k]) + 0.125), significance: 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(arg1: v->v_ratio_prefetch_y[k], arg2: 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)); |
1718 | } |
1719 | else { |
1720 | v->v_ratio_prefetch_y[k] = 999999.0; |
1721 | } |
1722 | } |
1723 | } |
1724 | else { |
1725 | v->v_ratio_prefetch_y[k] = 999999.0; |
1726 | } |
1727 | v->v_ratio_prefetch_y[k] =dcn_bw_max2(arg1: v->v_ratio_prefetch_y[k], arg2: 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(arg1: v->v_ratio_prefetch_c[k], arg2: 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)); |
1733 | } |
1734 | else { |
1735 | v->v_ratio_prefetch_c[k] = 999999.0; |
1736 | } |
1737 | } |
1738 | } |
1739 | else { |
1740 | v->v_ratio_prefetch_c[k] = 999999.0; |
1741 | } |
1742 | v->v_ratio_prefetch_c[k] =dcn_bw_max2(arg1: v->v_ratio_prefetch_c[k], arg2: 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(arg: v->byte_per_pixel_dety[k], significance: 1.0) + v->prefetch_source_lines_c[k] / v->lines_to_request_prefetch_pixel_data *dcn_bw_ceil2(arg: v->byte_per_pixel_detc[k], significance: 2.0) / 2.0) * v->swath_width_y[k] / (v->htotal[k] / v->pixel_clock[k]); |
1745 | } |
1746 | else { |
1747 | v->required_prefetch_pix_data_bw = 999999.0; |
1748 | } |
1749 | v->max_rd_bandwidth = v->max_rd_bandwidth +dcn_bw_max2(arg1: v->read_bandwidth_plane_luma[k] + v->read_bandwidth_plane_chroma[k], arg2: 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(arg1: v->meta_pte_bytes_frame[k] / (v->destination_lines_to_request_vm_inv_blank[k] * v->htotal[k] / v->pixel_clock[k]), arg2: (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])); |
1752 | } |
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; |
1755 | } |
1756 | if (v->destination_lines_for_prefetch[k] < 2.0) { |
1757 | v->destination_line_times_for_prefetch_less_than2 = dcn_bw_yes; |
1758 | } |
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; |
1762 | } |
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; |
1765 | } |
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; |
1768 | } |
1769 | } |
1770 | } |
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; |
1773 | } |
1774 | else { |
1775 | v->prefetch_mode_supported = dcn_bw_no; |
1776 | } |
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]; |
1784 | } |
1785 | else { |
1786 | v->display_pipe_line_delivery_time_luma_prefetch[k] = v->swath_width_y[k] / v->pscl_throughput[k] / v->dppclk; |
1787 | } |
1788 | if (v->byte_per_pixel_detc[k] == 0.0) { |
1789 | v->display_pipe_line_delivery_time_chroma_prefetch[k] = 0.0; |
1790 | } |
1791 | else { |
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]; |
1794 | } |
1795 | else { |
1796 | v->display_pipe_line_delivery_time_chroma_prefetch[k] = v->swath_width_y[k] / v->pscl_throughput[k] / v->dppclk; |
1797 | } |
1798 | } |
1799 | } |
1800 | /*min ttuv_blank*/ |
1801 | |
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(v1: v->dram_clock_change_watermark, v2: v->stutter_enter_plus_exit_watermark, v3: v->urgent_watermark); |
1807 | } |
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(arg1: v->stutter_enter_plus_exit_watermark, arg2: v->urgent_watermark); |
1812 | } |
1813 | else { |
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; |
1817 | } |
1818 | } |
1819 | /*nb p-state/dram clock change support*/ |
1820 | |
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]; |
1824 | } |
1825 | for (k = 0; k <= v->number_of_active_planes - 1; k++) { |
1826 | v->lb_latency_hiding_source_lines_y =dcn_bw_min2(arg1: v->max_line_buffer_lines,arg2: dcn_bw_floor2(arg: v->line_buffer_size / v->lb_bit_per_pixel[k] / (v->swath_width_y[k] /dcn_bw_max2(arg1: v->h_ratio[k], arg2: 1.0)), significance: 1.0)) - (v->vtaps[k] - 1.0); |
1827 | v->lb_latency_hiding_source_lines_c =dcn_bw_min2(arg1: v->max_line_buffer_lines,arg2: dcn_bw_floor2(arg: v->line_buffer_size / v->lb_bit_per_pixel[k] / (v->swath_width_y[k] / 2.0 /dcn_bw_max2(arg1: v->h_ratio[k] / 2.0, arg2: 1.0)), significance: 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]; |
1832 | } |
1833 | else if (v->swath_width_y[k] > v->dpp_output_buffer_pixels) { |
1834 | v->dpp_output_buffer_lines_y = 0.5; |
1835 | } |
1836 | else { |
1837 | v->dpp_output_buffer_lines_y = 1.0; |
1838 | } |
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); |
1841 | } |
1842 | else if (v->swath_width_y[k] / 2.0 > v->dpp_output_buffer_pixels) { |
1843 | v->dpp_output_buffer_lines_c = 0.5; |
1844 | } |
1845 | else { |
1846 | v->dpp_output_buffer_lines_c = 1.0; |
1847 | } |
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]); |
1853 | } |
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]); |
1860 | } |
1861 | v->active_dram_clock_change_latency_margin[k] =dcn_bw_min2(arg1: v->active_dram_clock_change_latency_margin_y, arg2: v->active_dram_clock_change_latency_margin_c); |
1862 | } |
1863 | else { |
1864 | v->active_dram_clock_change_latency_margin[k] = v->active_dram_clock_change_latency_margin_y; |
1865 | } |
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; |
1868 | } |
1869 | else { |
1870 | v->writeback_dram_clock_change_latency_margin =dcn_bw_min2(arg1: v->writeback_luma_buffer_size, arg2: 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; |
1871 | } |
1872 | if (v->output[k] == dcn_bw_writeback) { |
1873 | v->active_dram_clock_change_latency_margin[k] =dcn_bw_min2(arg1: v->active_dram_clock_change_latency_margin[k], arg2: v->writeback_dram_clock_change_latency_margin); |
1874 | } |
1875 | } |
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(arg1: v->dram_clock_change_watermark, arg2: v->writeback_dram_clock_change_watermark); |
1879 | } |
1880 | else { |
1881 | v->v_blank_dram_clock_change_latency_margin[k] = 0.0; |
1882 | } |
1883 | } |
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]; |
1892 | } |
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]; |
1895 | } |
1896 | } |
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]; |
1901 | } |
1902 | } |
1903 | if (v->synchronized_vblank == dcn_bw_yes || v->number_of_active_planes == 1) { |
1904 | v->dram_clock_change_margin =dcn_bw_max2(arg1: v->min_active_dram_clock_change_margin, arg2: v->min_vblank_dram_clock_change_margin); |
1905 | } |
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(arg1: v->second_min_active_dram_clock_change_margin, arg2: v->v_blank_of_min_active_dram_clock_change_margin); |
1908 | } |
1909 | else { |
1910 | v->dram_clock_change_margin = v->min_active_dram_clock_change_margin; |
1911 | } |
1912 | if (v->min_active_dram_clock_change_margin > 0.0) { |
1913 | v->dram_clock_change_support = dcn_bw_supported_in_v_active; |
1914 | } |
1915 | else if (v->dram_clock_change_margin > 0.0) { |
1916 | v->dram_clock_change_support = dcn_bw_supported_in_v_blank; |
1917 | } |
1918 | else { |
1919 | v->dram_clock_change_support = dcn_bw_not_supported; |
1920 | } |
1921 | /*maximum bandwidth used*/ |
1922 | |
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; |
1927 | } |
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; |
1930 | } |
1931 | } |
1932 | v->max_used_bw = v->max_rd_bandwidth + v->wr_bandwidth; |
1933 | } |
1934 | |