hc
2024-05-10 cde9070d9970eef1f7ec2360586c802a16230ad8
kernel/drivers/gpu/drm/amd/display/dc/calcs/dce_calcs.c
....@@ -23,6 +23,9 @@
2323 *
2424 */
2525
26
+#include <linux/slab.h>
27
+
28
+#include "resource.h"
2629 #include "dm_services.h"
2730 #include "dce_calcs.h"
2831 #include "dc.h"
....@@ -151,14 +154,14 @@
151154
152155
153156
154
- if (data->d0_underlay_mode == bw_def_none) { d0_underlay_enable = 0; }
155
- else {
156
- d0_underlay_enable = 1;
157
- }
158
- if (data->d1_underlay_mode == bw_def_none) { d1_underlay_enable = 0; }
159
- else {
160
- d1_underlay_enable = 1;
161
- }
157
+ if (data->d0_underlay_mode == bw_def_none)
158
+ d0_underlay_enable = false;
159
+ else
160
+ d0_underlay_enable = true;
161
+ if (data->d1_underlay_mode == bw_def_none)
162
+ d1_underlay_enable = false;
163
+ else
164
+ d1_underlay_enable = true;
162165 data->number_of_underlay_surfaces = d0_underlay_enable + d1_underlay_enable;
163166 switch (data->underlay_surface_type) {
164167 case bw_def_420:
....@@ -283,8 +286,8 @@
283286 data->cursor_width_pixels[2] = bw_int_to_fixed(0);
284287 data->cursor_width_pixels[3] = bw_int_to_fixed(0);
285288 /* graphics surface parameters from spreadsheet*/
286
- fbc_enabled = 0;
287
- lpt_enabled = 0;
289
+ fbc_enabled = false;
290
+ lpt_enabled = false;
288291 for (i = 4; i <= maximum_number_of_surfaces - 3; i++) {
289292 if (i < data->number_of_displays + 4) {
290293 if (i == 4 && data->d0_underlay_mode == bw_def_underlay_only) {
....@@ -335,9 +338,9 @@
335338 data->access_one_channel_only[i] = 0;
336339 }
337340 if (data->fbc_en[i] == 1) {
338
- fbc_enabled = 1;
341
+ fbc_enabled = true;
339342 if (data->lpt_en[i] == 1) {
340
- lpt_enabled = 1;
343
+ lpt_enabled = true;
341344 }
342345 }
343346 data->cursor_width_pixels[i] = bw_int_to_fixed(vbios->cursor_width);
....@@ -2792,7 +2795,7 @@
27922795 data->lpt_en[num_displays + 4] = false;
27932796 data->h_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.h_total);
27942797 data->v_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.v_total);
2795
- data->pixel_rate[num_displays + 4] = bw_frc_to_fixed(pipe[i].stream->timing.pix_clk_khz, 1000);
2798
+ data->pixel_rate[num_displays + 4] = bw_frc_to_fixed(pipe[i].stream->timing.pix_clk_100hz, 10000);
27962799 data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.width);
27972800 data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4];
27982801 data->src_height[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.height);
....@@ -2850,7 +2853,7 @@
28502853 data->src_height[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.viewport.height);
28512854 data->src_width[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.viewport.width);
28522855 data->pitch_in_pixels[num_displays * 2 + j] = bw_int_to_fixed(
2853
- pipe[i].bottom_pipe->plane_state->plane_size.grph.surface_pitch);
2856
+ pipe[i].bottom_pipe->plane_state->plane_size.surface_pitch);
28542857 data->h_taps[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.taps.h_taps);
28552858 data->v_taps[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.taps.v_taps);
28562859 data->h_scale_ratio[num_displays * 2 + j] = fixed31_32_to_bw_fixed(
....@@ -2881,6 +2884,7 @@
28812884
28822885 /* Pipes without underlay after */
28832886 for (i = 0; i < pipe_count; i++) {
2887
+ unsigned int pixel_clock_100hz;
28842888 if (!pipe[i].stream || pipe[i].bottom_pipe)
28852889 continue;
28862890
....@@ -2889,7 +2893,10 @@
28892893 data->lpt_en[num_displays + 4] = false;
28902894 data->h_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.h_total);
28912895 data->v_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.v_total);
2892
- data->pixel_rate[num_displays + 4] = bw_frc_to_fixed(pipe[i].stream->timing.pix_clk_khz, 1000);
2896
+ pixel_clock_100hz = pipe[i].stream->timing.pix_clk_100hz;
2897
+ if (pipe[i].stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
2898
+ pixel_clock_100hz *= 2;
2899
+ data->pixel_rate[num_displays + 4] = bw_frc_to_fixed(pixel_clock_100hz, 10000);
28932900 if (pipe[i].plane_state) {
28942901 data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.width);
28952902 data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4];
....@@ -2971,6 +2978,32 @@
29712978 data->number_of_displays = num_displays;
29722979 }
29732980
2981
+static bool all_displays_in_sync(const struct pipe_ctx pipe[],
2982
+ int pipe_count)
2983
+{
2984
+ const struct pipe_ctx *active_pipes[MAX_PIPES];
2985
+ int i, num_active_pipes = 0;
2986
+
2987
+ for (i = 0; i < pipe_count; i++) {
2988
+ if (!pipe[i].stream || pipe[i].top_pipe)
2989
+ continue;
2990
+
2991
+ active_pipes[num_active_pipes++] = &pipe[i];
2992
+ }
2993
+
2994
+ if (!num_active_pipes)
2995
+ return false;
2996
+
2997
+ for (i = 1; i < num_active_pipes; ++i) {
2998
+ if (!resource_are_streams_timing_synchronizable(
2999
+ active_pipes[0]->stream, active_pipes[i]->stream)) {
3000
+ return false;
3001
+ }
3002
+ }
3003
+
3004
+ return true;
3005
+}
3006
+
29743007 /**
29753008 * Return:
29763009 * true - Display(s) configuration supported.
....@@ -2992,8 +3025,10 @@
29923025
29933026 populate_initial_data(pipe, pipe_count, data);
29943027
2995
- /*TODO: this should be taken out calcs output and assigned during timing sync for pplib use*/
2996
- calcs_output->all_displays_in_sync = false;
3028
+ if (ctx->dc->config.multi_mon_pp_mclk_switch)
3029
+ calcs_output->all_displays_in_sync = all_displays_in_sync(pipe, pipe_count);
3030
+ else
3031
+ calcs_output->all_displays_in_sync = false;
29973032
29983033 if (data->number_of_displays != 0) {
29993034 uint8_t yclk_lvl, sclk_lvl;
....@@ -3230,33 +3265,33 @@
32303265 bw_fixed_to_int(bw_mul(data->
32313266 stutter_exit_watermark[9], bw_int_to_fixed(1000)));
32323267
3233
- calcs_output->stutter_entry_wm_ns[0].b_mark =
3234
- bw_fixed_to_int(bw_mul(data->
3235
- stutter_entry_watermark[4], bw_int_to_fixed(1000)));
3236
- calcs_output->stutter_entry_wm_ns[1].b_mark =
3237
- bw_fixed_to_int(bw_mul(data->
3238
- stutter_entry_watermark[5], bw_int_to_fixed(1000)));
3239
- calcs_output->stutter_entry_wm_ns[2].b_mark =
3240
- bw_fixed_to_int(bw_mul(data->
3241
- stutter_entry_watermark[6], bw_int_to_fixed(1000)));
3242
- if (ctx->dc->caps.max_slave_planes) {
3243
- calcs_output->stutter_entry_wm_ns[3].b_mark =
3268
+ calcs_output->stutter_entry_wm_ns[0].b_mark =
32443269 bw_fixed_to_int(bw_mul(data->
3245
- stutter_entry_watermark[0], bw_int_to_fixed(1000)));
3246
- calcs_output->stutter_entry_wm_ns[4].b_mark =
3270
+ stutter_entry_watermark[4], bw_int_to_fixed(1000)));
3271
+ calcs_output->stutter_entry_wm_ns[1].b_mark =
32473272 bw_fixed_to_int(bw_mul(data->
3248
- stutter_entry_watermark[1], bw_int_to_fixed(1000)));
3249
- } else {
3250
- calcs_output->stutter_entry_wm_ns[3].b_mark =
3273
+ stutter_entry_watermark[5], bw_int_to_fixed(1000)));
3274
+ calcs_output->stutter_entry_wm_ns[2].b_mark =
32513275 bw_fixed_to_int(bw_mul(data->
3252
- stutter_entry_watermark[7], bw_int_to_fixed(1000)));
3253
- calcs_output->stutter_entry_wm_ns[4].b_mark =
3276
+ stutter_entry_watermark[6], bw_int_to_fixed(1000)));
3277
+ if (ctx->dc->caps.max_slave_planes) {
3278
+ calcs_output->stutter_entry_wm_ns[3].b_mark =
3279
+ bw_fixed_to_int(bw_mul(data->
3280
+ stutter_entry_watermark[0], bw_int_to_fixed(1000)));
3281
+ calcs_output->stutter_entry_wm_ns[4].b_mark =
3282
+ bw_fixed_to_int(bw_mul(data->
3283
+ stutter_entry_watermark[1], bw_int_to_fixed(1000)));
3284
+ } else {
3285
+ calcs_output->stutter_entry_wm_ns[3].b_mark =
3286
+ bw_fixed_to_int(bw_mul(data->
3287
+ stutter_entry_watermark[7], bw_int_to_fixed(1000)));
3288
+ calcs_output->stutter_entry_wm_ns[4].b_mark =
3289
+ bw_fixed_to_int(bw_mul(data->
3290
+ stutter_entry_watermark[8], bw_int_to_fixed(1000)));
3291
+ }
3292
+ calcs_output->stutter_entry_wm_ns[5].b_mark =
32543293 bw_fixed_to_int(bw_mul(data->
3255
- stutter_entry_watermark[8], bw_int_to_fixed(1000)));
3256
- }
3257
- calcs_output->stutter_entry_wm_ns[5].b_mark =
3258
- bw_fixed_to_int(bw_mul(data->
3259
- stutter_entry_watermark[9], bw_int_to_fixed(1000)));
3294
+ stutter_entry_watermark[9], bw_int_to_fixed(1000)));
32603295
32613296 calcs_output->urgent_wm_ns[0].b_mark =
32623297 bw_fixed_to_int(bw_mul(data->