hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c
....@@ -91,18 +91,13 @@
9191 DSCL_MODE_DSCL_BYPASS = 6
9292 };
9393
94
-enum gamut_remap_select {
95
- GAMUT_REMAP_BYPASS = 0,
96
- GAMUT_REMAP_COEFF,
97
- GAMUT_REMAP_COMA_COEFF,
98
- GAMUT_REMAP_COMB_COEFF
99
-};
100
-
10194 void dpp_read_state(struct dpp *dpp_base,
10295 struct dcn_dpp_state *s)
10396 {
10497 struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
10598
99
+ REG_GET(DPP_CONTROL,
100
+ DPP_CLOCK_ENABLE, &s->is_enabled);
106101 REG_GET(CM_IGAM_CONTROL,
107102 CM_IGAM_LUT_MODE, &s->igam_lut_mode);
108103 REG_GET(CM_IGAM_CONTROL,
....@@ -114,12 +109,14 @@
114109 REG_GET(CM_GAMUT_REMAP_CONTROL,
115110 CM_GAMUT_REMAP_MODE, &s->gamut_remap_mode);
116111
117
- s->gamut_remap_c11_c12 = REG_READ(CM_GAMUT_REMAP_C11_C12);
118
- s->gamut_remap_c13_c14 = REG_READ(CM_GAMUT_REMAP_C13_C14);
119
- s->gamut_remap_c21_c22 = REG_READ(CM_GAMUT_REMAP_C21_C22);
120
- s->gamut_remap_c23_c24 = REG_READ(CM_GAMUT_REMAP_C23_C24);
121
- s->gamut_remap_c31_c32 = REG_READ(CM_GAMUT_REMAP_C31_C32);
122
- s->gamut_remap_c33_c34 = REG_READ(CM_GAMUT_REMAP_C33_C34);
112
+ if (s->gamut_remap_mode) {
113
+ s->gamut_remap_c11_c12 = REG_READ(CM_GAMUT_REMAP_C11_C12);
114
+ s->gamut_remap_c13_c14 = REG_READ(CM_GAMUT_REMAP_C13_C14);
115
+ s->gamut_remap_c21_c22 = REG_READ(CM_GAMUT_REMAP_C21_C22);
116
+ s->gamut_remap_c23_c24 = REG_READ(CM_GAMUT_REMAP_C23_C24);
117
+ s->gamut_remap_c31_c32 = REG_READ(CM_GAMUT_REMAP_C31_C32);
118
+ s->gamut_remap_c33_c34 = REG_READ(CM_GAMUT_REMAP_C33_C34);
119
+ }
123120 }
124121
125122 /* Program gamut remap in bypass mode */
....@@ -132,18 +129,11 @@
132129
133130 #define IDENTITY_RATIO(ratio) (dc_fixpt_u2d19(ratio) == (1 << 19))
134131
135
-static bool dpp_get_optimal_number_of_taps(
132
+bool dpp1_get_optimal_number_of_taps(
136133 struct dpp *dpp,
137134 struct scaler_data *scl_data,
138135 const struct scaling_taps *in_taps)
139136 {
140
- uint32_t pixel_width;
141
-
142
- if (scl_data->viewport.width > scl_data->recout.width)
143
- pixel_width = scl_data->recout.width;
144
- else
145
- pixel_width = scl_data->viewport.width;
146
-
147137 /* Some ASICs does not support FP16 scaling, so we reject modes require this*/
148138 if (scl_data->format == PIXEL_FORMAT_FP16 &&
149139 dpp->caps->dscl_data_proc_format == DSCL_DATA_PRCESSING_FIXED_FORMAT &&
....@@ -293,7 +283,8 @@
293283 enum surface_pixel_format format,
294284 enum expansion_mode mode,
295285 struct dc_csc_transform input_csc_color_matrix,
296
- enum dc_color_space input_color_space)
286
+ enum dc_color_space input_color_space,
287
+ struct cnv_alpha_2bit_lut *alpha_2bit_lut)
297288 {
298289 uint32_t pixel_format;
299290 uint32_t alpha_en;
....@@ -424,8 +415,9 @@
424415
425416 void dpp1_set_cursor_attributes(
426417 struct dpp *dpp_base,
427
- enum dc_cursor_color_format color_format)
418
+ struct dc_cursor_attributes *cursor_attributes)
428419 {
420
+ enum dc_cursor_color_format color_format = cursor_attributes->color_format;
429421 struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
430422
431423 REG_UPDATE_2(CURSOR0_CONTROL,
....@@ -446,17 +438,38 @@
446438 struct dpp *dpp_base,
447439 const struct dc_cursor_position *pos,
448440 const struct dc_cursor_mi_param *param,
449
- uint32_t width)
441
+ uint32_t width,
442
+ uint32_t height)
450443 {
451444 struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
452445 int src_x_offset = pos->x - pos->x_hotspot - param->viewport.x;
446
+ int src_y_offset = pos->y - pos->y_hotspot - param->viewport.y;
453447 uint32_t cur_en = pos->enable ? 1 : 0;
448
+
449
+ // Cursor width/height and hotspots need to be rotated for offset calculation
450
+ if (param->rotation == ROTATION_ANGLE_90 || param->rotation == ROTATION_ANGLE_270) {
451
+ swap(width, height);
452
+ if (param->rotation == ROTATION_ANGLE_90) {
453
+ src_x_offset = pos->x - pos->y_hotspot - param->viewport.x;
454
+ src_y_offset = pos->y - pos->x_hotspot - param->viewport.y;
455
+ }
456
+ } else if (param->rotation == ROTATION_ANGLE_180) {
457
+ src_x_offset = pos->x - param->viewport.x;
458
+ src_y_offset = pos->y - param->viewport.y;
459
+ }
460
+
454461
455462 if (src_x_offset >= (int)param->viewport.width)
456463 cur_en = 0; /* not visible beyond right edge*/
457464
458465 if (src_x_offset + (int)width <= 0)
459466 cur_en = 0; /* not visible beyond left edge*/
467
+
468
+ if (src_y_offset >= (int)param->viewport.height)
469
+ cur_en = 0; /* not visible beyond bottom edge*/
470
+
471
+ if (src_y_offset + (int)height <= 0)
472
+ cur_en = 0; /* not visible beyond top edge*/
460473
461474 REG_UPDATE(CURSOR0_CONTROL,
462475 CUR0_ENABLE, cur_en);
....@@ -497,7 +510,7 @@
497510 .dpp_read_state = dpp_read_state,
498511 .dpp_reset = dpp_reset,
499512 .dpp_set_scaler = dpp1_dscl_set_scaler_manual_scale,
500
- .dpp_get_optimal_number_of_taps = dpp_get_optimal_number_of_taps,
513
+ .dpp_get_optimal_number_of_taps = dpp1_get_optimal_number_of_taps,
501514 .dpp_set_gamut_remap = dpp1_cm_set_gamut_remap,
502515 .dpp_set_csc_adjustment = dpp1_cm_set_output_csc_adjustment,
503516 .dpp_set_csc_default = dpp1_cm_set_output_csc_default,
....@@ -518,6 +531,9 @@
518531 .set_optional_cursor_attributes = dpp1_cnv_set_optional_cursor_attributes,
519532 .dpp_dppclk_control = dpp1_dppclk_control,
520533 .dpp_set_hdr_multiplier = dpp1_set_hdr_multiplier,
534
+ .dpp_program_blnd_lut = NULL,
535
+ .dpp_program_shaper_lut = NULL,
536
+ .dpp_program_3dlut = NULL
521537 };
522538
523539 static struct dpp_caps dcn10_dpp_cap = {