1 /*
2 * Copyright 2015 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 "core_types.h"
28 #include "timing_generator.h"
29 #include "hw_sequencer.h"
30 #include "hw_sequencer_private.h"
31 #include "basics/dc_common.h"
32 #include "resource.h"
33 #include "dc_dmub_srv.h"
34 #include "dc_state_priv.h"
35 #include "opp.h"
36 #include "dsc.h"
37 #include "dchubbub.h"
38 #include "dccg.h"
39 #include "abm.h"
40 #include "dcn10/dcn10_hubbub.h"
41 #include "dce/dmub_hw_lock_mgr.h"
42
43 #define NUM_ELEMENTS(a) (sizeof(a) / sizeof((a)[0]))
44 #define MAX_NUM_MCACHE 8
45
46 /* used as index in array of black_color_format */
47 enum black_color_format {
48 BLACK_COLOR_FORMAT_RGB_FULLRANGE = 0,
49 BLACK_COLOR_FORMAT_RGB_LIMITED,
50 BLACK_COLOR_FORMAT_YUV_TV,
51 BLACK_COLOR_FORMAT_YUV_CV,
52 BLACK_COLOR_FORMAT_YUV_SUPER_AA,
53 BLACK_COLOR_FORMAT_DEBUG,
54 };
55
56 enum dc_color_space_type {
57 COLOR_SPACE_RGB_TYPE,
58 COLOR_SPACE_RGB_LIMITED_TYPE,
59 COLOR_SPACE_YCBCR601_TYPE,
60 COLOR_SPACE_YCBCR709_TYPE,
61 COLOR_SPACE_YCBCR2020_TYPE,
62 COLOR_SPACE_YCBCR601_LIMITED_TYPE,
63 COLOR_SPACE_YCBCR709_LIMITED_TYPE,
64 COLOR_SPACE_YCBCR709_BLACK_TYPE,
65 };
66
67 static const struct tg_color black_color_format[] = {
68 /* BlackColorFormat_RGB_FullRange */
69 {0, 0, 0},
70 /* BlackColorFormat_RGB_Limited */
71 {0x40, 0x40, 0x40},
72 /* BlackColorFormat_YUV_TV */
73 {0x200, 0x40, 0x200},
74 /* BlackColorFormat_YUV_CV */
75 {0x1f4, 0x40, 0x1f4},
76 /* BlackColorFormat_YUV_SuperAA */
77 {0x1a2, 0x20, 0x1a2},
78 /* visual confirm debug */
79 {0xff, 0xff, 0},
80 };
81
82 struct out_csc_color_matrix_type {
83 enum dc_color_space_type color_space_type;
84 uint16_t regval[12];
85 };
86
87 static const struct out_csc_color_matrix_type output_csc_matrix[] = {
88 { COLOR_SPACE_RGB_TYPE,
89 { 0x2000, 0, 0, 0,
90 0, 0x2000, 0, 0,
91 0, 0, 0x2000, 0} },
92 { COLOR_SPACE_RGB_LIMITED_TYPE,
93 { 0x1B67, 0, 0, 0x201,
94 0, 0x1B67, 0, 0x201,
95 0, 0, 0x1B67, 0x201} },
96 { COLOR_SPACE_YCBCR601_TYPE,
97 { 0xE04, 0xF444, 0xFDB9, 0x1004,
98 0x831, 0x1016, 0x320, 0x201,
99 0xFB45, 0xF6B7, 0xE04, 0x1004} },
100 { COLOR_SPACE_YCBCR709_TYPE,
101 { 0xE04, 0xF345, 0xFEB7, 0x1004,
102 0x5D3, 0x1399, 0x1FA, 0x201,
103 0xFCCA, 0xF533, 0xE04, 0x1004} },
104 /* TODO: correct values below */
105 { COLOR_SPACE_YCBCR601_LIMITED_TYPE,
106 { 0xE00, 0xF447, 0xFDB9, 0x1000,
107 0x991, 0x12C9, 0x3A6, 0x200,
108 0xFB47, 0xF6B9, 0xE00, 0x1000} },
109 { COLOR_SPACE_YCBCR709_LIMITED_TYPE,
110 { 0xE00, 0xF349, 0xFEB7, 0x1000,
111 0x6CE, 0x16E3, 0x24F, 0x200,
112 0xFCCB, 0xF535, 0xE00, 0x1000} },
113 { COLOR_SPACE_YCBCR2020_TYPE,
114 { 0x1000, 0xF149, 0xFEB7, 0x1004,
115 0x0868, 0x15B2, 0x01E6, 0x201,
116 0xFB88, 0xF478, 0x1000, 0x1004} },
117 { COLOR_SPACE_YCBCR709_BLACK_TYPE,
118 { 0x0000, 0x0000, 0x0000, 0x1000,
119 0x0000, 0x0000, 0x0000, 0x0200,
120 0x0000, 0x0000, 0x0000, 0x1000} },
121 };
122
is_rgb_type(enum dc_color_space color_space)123 static bool is_rgb_type(
124 enum dc_color_space color_space)
125 {
126 bool ret = false;
127
128 if (color_space == COLOR_SPACE_SRGB ||
129 color_space == COLOR_SPACE_XR_RGB ||
130 color_space == COLOR_SPACE_MSREF_SCRGB ||
131 color_space == COLOR_SPACE_2020_RGB_FULLRANGE ||
132 color_space == COLOR_SPACE_ADOBERGB ||
133 color_space == COLOR_SPACE_DCIP3 ||
134 color_space == COLOR_SPACE_DOLBYVISION)
135 ret = true;
136 return ret;
137 }
138
is_rgb_limited_type(enum dc_color_space color_space)139 static bool is_rgb_limited_type(
140 enum dc_color_space color_space)
141 {
142 bool ret = false;
143
144 if (color_space == COLOR_SPACE_SRGB_LIMITED ||
145 color_space == COLOR_SPACE_2020_RGB_LIMITEDRANGE)
146 ret = true;
147 return ret;
148 }
149
is_ycbcr601_type(enum dc_color_space color_space)150 static bool is_ycbcr601_type(
151 enum dc_color_space color_space)
152 {
153 bool ret = false;
154
155 if (color_space == COLOR_SPACE_YCBCR601 ||
156 color_space == COLOR_SPACE_XV_YCC_601)
157 ret = true;
158 return ret;
159 }
160
is_ycbcr601_limited_type(enum dc_color_space color_space)161 static bool is_ycbcr601_limited_type(
162 enum dc_color_space color_space)
163 {
164 bool ret = false;
165
166 if (color_space == COLOR_SPACE_YCBCR601_LIMITED)
167 ret = true;
168 return ret;
169 }
170
is_ycbcr709_type(enum dc_color_space color_space)171 static bool is_ycbcr709_type(
172 enum dc_color_space color_space)
173 {
174 bool ret = false;
175
176 if (color_space == COLOR_SPACE_YCBCR709 ||
177 color_space == COLOR_SPACE_XV_YCC_709)
178 ret = true;
179 return ret;
180 }
181
is_ycbcr2020_type(enum dc_color_space color_space)182 static bool is_ycbcr2020_type(
183 enum dc_color_space color_space)
184 {
185 bool ret = false;
186
187 if (color_space == COLOR_SPACE_2020_YCBCR_LIMITED || color_space == COLOR_SPACE_2020_YCBCR_FULL)
188 ret = true;
189 return ret;
190 }
191
is_ycbcr709_limited_type(enum dc_color_space color_space)192 static bool is_ycbcr709_limited_type(
193 enum dc_color_space color_space)
194 {
195 bool ret = false;
196
197 if (color_space == COLOR_SPACE_YCBCR709_LIMITED)
198 ret = true;
199 return ret;
200 }
201
get_color_space_type(enum dc_color_space color_space)202 static enum dc_color_space_type get_color_space_type(enum dc_color_space color_space)
203 {
204 enum dc_color_space_type type = COLOR_SPACE_RGB_TYPE;
205
206 if (is_rgb_type(color_space))
207 type = COLOR_SPACE_RGB_TYPE;
208 else if (is_rgb_limited_type(color_space))
209 type = COLOR_SPACE_RGB_LIMITED_TYPE;
210 else if (is_ycbcr601_type(color_space))
211 type = COLOR_SPACE_YCBCR601_TYPE;
212 else if (is_ycbcr709_type(color_space))
213 type = COLOR_SPACE_YCBCR709_TYPE;
214 else if (is_ycbcr601_limited_type(color_space))
215 type = COLOR_SPACE_YCBCR601_LIMITED_TYPE;
216 else if (is_ycbcr709_limited_type(color_space))
217 type = COLOR_SPACE_YCBCR709_LIMITED_TYPE;
218 else if (is_ycbcr2020_type(color_space))
219 type = COLOR_SPACE_YCBCR2020_TYPE;
220 else if (color_space == COLOR_SPACE_YCBCR709)
221 type = COLOR_SPACE_YCBCR709_BLACK_TYPE;
222 else if (color_space == COLOR_SPACE_YCBCR709_BLACK)
223 type = COLOR_SPACE_YCBCR709_BLACK_TYPE;
224 return type;
225 }
226
find_color_matrix(enum dc_color_space color_space,uint32_t * array_size)227 const uint16_t *find_color_matrix(enum dc_color_space color_space,
228 uint32_t *array_size)
229 {
230 int i;
231 enum dc_color_space_type type;
232 const uint16_t *val = NULL;
233 int arr_size = NUM_ELEMENTS(output_csc_matrix);
234
235 type = get_color_space_type(color_space);
236 for (i = 0; i < arr_size; i++)
237 if (output_csc_matrix[i].color_space_type == type) {
238 val = output_csc_matrix[i].regval;
239 *array_size = 12;
240 break;
241 }
242
243 return val;
244 }
245
246
color_space_to_black_color(const struct dc * dc,enum dc_color_space colorspace,struct tg_color * black_color)247 void color_space_to_black_color(
248 const struct dc *dc,
249 enum dc_color_space colorspace,
250 struct tg_color *black_color)
251 {
252 switch (colorspace) {
253 case COLOR_SPACE_YCBCR601:
254 case COLOR_SPACE_YCBCR709:
255 case COLOR_SPACE_YCBCR709_BLACK:
256 case COLOR_SPACE_YCBCR601_LIMITED:
257 case COLOR_SPACE_YCBCR709_LIMITED:
258 case COLOR_SPACE_2020_YCBCR_LIMITED:
259 case COLOR_SPACE_2020_YCBCR_FULL:
260 *black_color = black_color_format[BLACK_COLOR_FORMAT_YUV_CV];
261 break;
262
263 case COLOR_SPACE_SRGB_LIMITED:
264 *black_color =
265 black_color_format[BLACK_COLOR_FORMAT_RGB_LIMITED];
266 break;
267
268 /*
269 * Remove default and add case for all color space
270 * so when we forget to add new color space
271 * compiler will give a warning
272 */
273 case COLOR_SPACE_UNKNOWN:
274 case COLOR_SPACE_SRGB:
275 case COLOR_SPACE_XR_RGB:
276 case COLOR_SPACE_MSREF_SCRGB:
277 case COLOR_SPACE_XV_YCC_709:
278 case COLOR_SPACE_XV_YCC_601:
279 case COLOR_SPACE_2020_RGB_FULLRANGE:
280 case COLOR_SPACE_2020_RGB_LIMITEDRANGE:
281 case COLOR_SPACE_ADOBERGB:
282 case COLOR_SPACE_DCIP3:
283 case COLOR_SPACE_DISPLAYNATIVE:
284 case COLOR_SPACE_DOLBYVISION:
285 case COLOR_SPACE_APPCTRL:
286 case COLOR_SPACE_CUSTOMPOINTS:
287 /* fefault is sRGB black (full range). */
288 *black_color =
289 black_color_format[BLACK_COLOR_FORMAT_RGB_FULLRANGE];
290 /* default is sRGB black 0. */
291 break;
292 }
293 }
294
hwss_wait_for_blank_complete(struct timing_generator * tg)295 bool hwss_wait_for_blank_complete(
296 struct timing_generator *tg)
297 {
298 int counter;
299
300 /* Not applicable if the pipe is not primary, save 300ms of boot time */
301 if (!tg->funcs->is_blanked)
302 return true;
303 for (counter = 0; counter < 100; counter++) {
304 if (tg->funcs->is_blanked(tg))
305 break;
306
307 msleep(1);
308 }
309
310 if (counter == 100) {
311 dm_error("DC: failed to blank crtc!\n");
312 return false;
313 }
314
315 return true;
316 }
317
get_mpctree_visual_confirm_color(struct pipe_ctx * pipe_ctx,struct tg_color * color)318 void get_mpctree_visual_confirm_color(
319 struct pipe_ctx *pipe_ctx,
320 struct tg_color *color)
321 {
322 const struct tg_color pipe_colors[6] = {
323 {MAX_TG_COLOR_VALUE, 0, 0}, /* red */
324 {MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE, 0}, /* yellow */
325 {0, MAX_TG_COLOR_VALUE, 0}, /* green */
326 {0, MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE}, /* cyan */
327 {0, 0, MAX_TG_COLOR_VALUE}, /* blue */
328 {MAX_TG_COLOR_VALUE, 0, MAX_TG_COLOR_VALUE}, /* magenta */
329 };
330
331 struct pipe_ctx *top_pipe = pipe_ctx;
332
333 while (top_pipe->top_pipe)
334 top_pipe = top_pipe->top_pipe;
335
336 *color = pipe_colors[top_pipe->pipe_idx];
337 }
338
get_surface_visual_confirm_color(const struct pipe_ctx * pipe_ctx,struct tg_color * color)339 void get_surface_visual_confirm_color(
340 const struct pipe_ctx *pipe_ctx,
341 struct tg_color *color)
342 {
343 uint32_t color_value = MAX_TG_COLOR_VALUE;
344
345 switch (pipe_ctx->plane_res.scl_data.format) {
346 case PIXEL_FORMAT_ARGB8888:
347 /* set border color to red */
348 color->color_r_cr = color_value;
349 if (pipe_ctx->plane_state->layer_index > 0) {
350 /* set border color to pink */
351 color->color_b_cb = color_value;
352 color->color_g_y = color_value * 0.5;
353 }
354 break;
355
356 case PIXEL_FORMAT_ARGB2101010:
357 /* set border color to blue */
358 color->color_b_cb = color_value;
359 if (pipe_ctx->plane_state->layer_index > 0) {
360 /* set border color to cyan */
361 color->color_g_y = color_value;
362 }
363 break;
364 case PIXEL_FORMAT_420BPP8:
365 /* set border color to green */
366 color->color_g_y = color_value;
367 break;
368 case PIXEL_FORMAT_420BPP10:
369 /* set border color to yellow */
370 color->color_g_y = color_value;
371 color->color_r_cr = color_value;
372 break;
373 case PIXEL_FORMAT_FP16:
374 /* set border color to white */
375 color->color_r_cr = color_value;
376 color->color_b_cb = color_value;
377 color->color_g_y = color_value;
378 if (pipe_ctx->plane_state->layer_index > 0) {
379 /* set border color to orange */
380 color->color_g_y = 0.22 * color_value;
381 color->color_b_cb = 0;
382 }
383 break;
384 default:
385 break;
386 }
387 }
388
get_hdr_visual_confirm_color(struct pipe_ctx * pipe_ctx,struct tg_color * color)389 void get_hdr_visual_confirm_color(
390 struct pipe_ctx *pipe_ctx,
391 struct tg_color *color)
392 {
393 uint32_t color_value = MAX_TG_COLOR_VALUE;
394 bool is_sdr = false;
395
396 /* Determine the overscan color based on the top-most (desktop) plane's context */
397 struct pipe_ctx *top_pipe_ctx = pipe_ctx;
398
399 while (top_pipe_ctx->top_pipe != NULL)
400 top_pipe_ctx = top_pipe_ctx->top_pipe;
401
402 switch (top_pipe_ctx->plane_res.scl_data.format) {
403 case PIXEL_FORMAT_ARGB2101010:
404 if (top_pipe_ctx->stream->out_transfer_func.tf == TRANSFER_FUNCTION_PQ) {
405 /* HDR10, ARGB2101010 - set border color to red */
406 color->color_r_cr = color_value;
407 } else if (top_pipe_ctx->stream->out_transfer_func.tf == TRANSFER_FUNCTION_GAMMA22) {
408 /* FreeSync 2 ARGB2101010 - set border color to pink */
409 color->color_r_cr = color_value;
410 color->color_b_cb = color_value;
411 } else
412 is_sdr = true;
413 break;
414 case PIXEL_FORMAT_FP16:
415 if (top_pipe_ctx->stream->out_transfer_func.tf == TRANSFER_FUNCTION_PQ) {
416 /* HDR10, FP16 - set border color to blue */
417 color->color_b_cb = color_value;
418 } else if (top_pipe_ctx->stream->out_transfer_func.tf == TRANSFER_FUNCTION_GAMMA22) {
419 /* FreeSync 2 HDR - set border color to green */
420 color->color_g_y = color_value;
421 } else
422 is_sdr = true;
423 break;
424 default:
425 is_sdr = true;
426 break;
427 }
428
429 if (is_sdr) {
430 /* SDR - set border color to Gray */
431 color->color_r_cr = color_value/2;
432 color->color_b_cb = color_value/2;
433 color->color_g_y = color_value/2;
434 }
435 }
436
437 /* Visual Confirm color definition for Smart Mux */
get_smartmux_visual_confirm_color(struct dc * dc,struct tg_color * color)438 void get_smartmux_visual_confirm_color(
439 struct dc *dc,
440 struct tg_color *color)
441 {
442 uint32_t color_value = MAX_TG_COLOR_VALUE;
443
444 const struct tg_color sm_ver_colors[5] = {
445 {0, 0, 0}, /* SMUX_MUXCONTROL_UNSUPPORTED - Black */
446 {0, MAX_TG_COLOR_VALUE, 0}, /* SMUX_MUXCONTROL_v10 - Green */
447 {0, MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE}, /* SMUX_MUXCONTROL_v15 - Cyan */
448 {MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE, 0}, /* SMUX_MUXCONTROL_MDM - Yellow */
449 {MAX_TG_COLOR_VALUE, 0, MAX_TG_COLOR_VALUE}, /* SMUX_MUXCONTROL_vUNKNOWN - Magenta*/
450 };
451
452 if (dc->caps.is_apu) {
453 /* APU driving the eDP */
454 *color = sm_ver_colors[dc->config.smart_mux_version];
455 } else {
456 /* dGPU driving the eDP - red */
457 color->color_r_cr = color_value;
458 color->color_g_y = 0;
459 color->color_b_cb = 0;
460 }
461 }
462
463 /* Visual Confirm color definition for VABC */
get_vabc_visual_confirm_color(struct pipe_ctx * pipe_ctx,struct tg_color * color)464 void get_vabc_visual_confirm_color(
465 struct pipe_ctx *pipe_ctx,
466 struct tg_color *color)
467 {
468 uint32_t color_value = MAX_TG_COLOR_VALUE;
469 struct dc_link *edp_link = NULL;
470
471 if (pipe_ctx && pipe_ctx->stream && pipe_ctx->stream->link) {
472 if (pipe_ctx->stream->link->connector_signal == SIGNAL_TYPE_EDP)
473 edp_link = pipe_ctx->stream->link;
474 }
475
476 if (edp_link) {
477 switch (edp_link->backlight_control_type) {
478 case BACKLIGHT_CONTROL_PWM:
479 color->color_r_cr = color_value;
480 color->color_g_y = 0;
481 color->color_b_cb = 0;
482 break;
483 case BACKLIGHT_CONTROL_AMD_AUX:
484 color->color_r_cr = 0;
485 color->color_g_y = color_value;
486 color->color_b_cb = 0;
487 break;
488 case BACKLIGHT_CONTROL_VESA_AUX:
489 color->color_r_cr = 0;
490 color->color_g_y = 0;
491 color->color_b_cb = color_value;
492 break;
493 }
494 } else {
495 color->color_r_cr = 0;
496 color->color_g_y = 0;
497 color->color_b_cb = 0;
498 }
499 }
500
get_subvp_visual_confirm_color(struct pipe_ctx * pipe_ctx,struct tg_color * color)501 void get_subvp_visual_confirm_color(
502 struct pipe_ctx *pipe_ctx,
503 struct tg_color *color)
504 {
505 uint32_t color_value = MAX_TG_COLOR_VALUE;
506 if (pipe_ctx) {
507 switch (pipe_ctx->p_state_type) {
508 case P_STATE_SUB_VP:
509 color->color_r_cr = color_value;
510 color->color_g_y = 0;
511 color->color_b_cb = 0;
512 break;
513 case P_STATE_DRR_SUB_VP:
514 color->color_r_cr = 0;
515 color->color_g_y = color_value;
516 color->color_b_cb = 0;
517 break;
518 case P_STATE_V_BLANK_SUB_VP:
519 color->color_r_cr = 0;
520 color->color_g_y = 0;
521 color->color_b_cb = color_value;
522 break;
523 default:
524 break;
525 }
526 }
527 }
528
get_mclk_switch_visual_confirm_color(struct pipe_ctx * pipe_ctx,struct tg_color * color)529 void get_mclk_switch_visual_confirm_color(
530 struct pipe_ctx *pipe_ctx,
531 struct tg_color *color)
532 {
533 uint32_t color_value = MAX_TG_COLOR_VALUE;
534
535 if (pipe_ctx) {
536 switch (pipe_ctx->p_state_type) {
537 case P_STATE_V_BLANK:
538 color->color_r_cr = color_value;
539 color->color_g_y = color_value;
540 color->color_b_cb = 0;
541 break;
542 case P_STATE_FPO:
543 color->color_r_cr = 0;
544 color->color_g_y = color_value;
545 color->color_b_cb = color_value;
546 break;
547 case P_STATE_V_ACTIVE:
548 color->color_r_cr = color_value;
549 color->color_g_y = 0;
550 color->color_b_cb = color_value;
551 break;
552 case P_STATE_SUB_VP:
553 color->color_r_cr = color_value;
554 color->color_g_y = 0;
555 color->color_b_cb = 0;
556 break;
557 case P_STATE_DRR_SUB_VP:
558 color->color_r_cr = 0;
559 color->color_g_y = color_value;
560 color->color_b_cb = 0;
561 break;
562 case P_STATE_V_BLANK_SUB_VP:
563 color->color_r_cr = 0;
564 color->color_g_y = 0;
565 color->color_b_cb = color_value;
566 break;
567 default:
568 break;
569 }
570 }
571 }
572
get_cursor_visual_confirm_color(struct pipe_ctx * pipe_ctx,struct tg_color * color)573 void get_cursor_visual_confirm_color(
574 struct pipe_ctx *pipe_ctx,
575 struct tg_color *color)
576 {
577 uint32_t color_value = MAX_TG_COLOR_VALUE;
578
579 if (pipe_ctx->stream && pipe_ctx->stream->cursor_position.enable) {
580 color->color_r_cr = color_value;
581 color->color_g_y = 0;
582 color->color_b_cb = 0;
583 } else {
584 color->color_r_cr = 0;
585 color->color_g_y = 0;
586 color->color_b_cb = color_value;
587 }
588 }
589
get_dcc_visual_confirm_color(struct dc * dc,struct pipe_ctx * pipe_ctx,struct tg_color * color)590 void get_dcc_visual_confirm_color(
591 struct dc *dc,
592 struct pipe_ctx *pipe_ctx,
593 struct tg_color *color)
594 {
595 const uint32_t MCACHE_ID_UNASSIGNED = 0xF;
596
597 if (!pipe_ctx->plane_state->dcc.enable) {
598 color->color_r_cr = 0; /* black - DCC disabled */
599 color->color_g_y = 0;
600 color->color_b_cb = 0;
601 return;
602 }
603
604 if (dc->ctx->dce_version < DCN_VERSION_4_01) {
605 color->color_r_cr = MAX_TG_COLOR_VALUE; /* red - DCC enabled */
606 color->color_g_y = 0;
607 color->color_b_cb = 0;
608 return;
609 }
610
611 uint32_t first_id = pipe_ctx->mcache_regs.main.p0.mcache_id_first;
612 uint32_t second_id = pipe_ctx->mcache_regs.main.p0.mcache_id_second;
613
614 if (first_id != MCACHE_ID_UNASSIGNED && second_id != MCACHE_ID_UNASSIGNED && first_id != second_id) {
615 color->color_r_cr = MAX_TG_COLOR_VALUE/2; /* grey - 2 mcache */
616 color->color_g_y = MAX_TG_COLOR_VALUE/2;
617 color->color_b_cb = MAX_TG_COLOR_VALUE/2;
618 }
619
620 else if (first_id != MCACHE_ID_UNASSIGNED || second_id != MCACHE_ID_UNASSIGNED) {
621 const struct tg_color id_colors[MAX_NUM_MCACHE] = {
622 {0, MAX_TG_COLOR_VALUE, 0}, /* green */
623 {0, 0, MAX_TG_COLOR_VALUE}, /* blue */
624 {MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE, 0}, /* yellow */
625 {MAX_TG_COLOR_VALUE, 0, MAX_TG_COLOR_VALUE}, /* magenta */
626 {0, MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE}, /* cyan */
627 {MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE}, /* white */
628 {MAX_TG_COLOR_VALUE/2, 0, 0}, /* dark red */
629 {0, MAX_TG_COLOR_VALUE/2, 0}, /* dark green */
630 };
631
632 uint32_t assigned_id = (first_id != MCACHE_ID_UNASSIGNED) ? first_id : second_id;
633 *color = id_colors[assigned_id];
634 }
635 }
636
set_p_state_switch_method(struct dc * dc,struct dc_state * context,struct pipe_ctx * pipe_ctx)637 void set_p_state_switch_method(
638 struct dc *dc,
639 struct dc_state *context,
640 struct pipe_ctx *pipe_ctx)
641 {
642 struct vba_vars_st *vba = &context->bw_ctx.dml.vba;
643 bool enable_subvp;
644
645 if (!dc->ctx || !dc->ctx->dmub_srv || !pipe_ctx || !vba)
646 return;
647
648 pipe_ctx->p_state_type = P_STATE_UNKNOWN;
649 if (vba->DRAMClockChangeSupport[vba->VoltageLevel][vba->maxMpcComb] !=
650 dm_dram_clock_change_unsupported) {
651 /* MCLK switching is supported */
652 if (!pipe_ctx->has_vactive_margin) {
653 /* In Vblank - yellow */
654 pipe_ctx->p_state_type = P_STATE_V_BLANK;
655
656 if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching) {
657 /* FPO + Vblank - cyan */
658 pipe_ctx->p_state_type = P_STATE_FPO;
659 }
660 } else {
661 /* In Vactive - pink */
662 pipe_ctx->p_state_type = P_STATE_V_ACTIVE;
663 }
664
665 /* SubVP */
666 enable_subvp = false;
667
668 for (int i = 0; i < dc->res_pool->pipe_count; i++) {
669 struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
670
671 if (pipe->stream && dc_state_get_paired_subvp_stream(context, pipe->stream) &&
672 dc_state_get_pipe_subvp_type(context, pipe) == SUBVP_MAIN) {
673 /* SubVP enable - red */
674 pipe_ctx->p_state_type = P_STATE_SUB_VP;
675 enable_subvp = true;
676
677 if (pipe_ctx->stream == pipe->stream)
678 return;
679 break;
680 }
681 }
682
683 if (enable_subvp && dc_state_get_pipe_subvp_type(context, pipe_ctx) == SUBVP_NONE) {
684 if (pipe_ctx->stream->allow_freesync == 1) {
685 /* SubVP enable and DRR on - green */
686 pipe_ctx->p_state_type = P_STATE_DRR_SUB_VP;
687 } else {
688 /* SubVP enable and No DRR - blue */
689 pipe_ctx->p_state_type = P_STATE_V_BLANK_SUB_VP;
690 }
691 }
692 }
693 }
694
set_drr_and_clear_adjust_pending(struct pipe_ctx * pipe_ctx,struct dc_stream_state * stream,struct drr_params * params)695 void set_drr_and_clear_adjust_pending(
696 struct pipe_ctx *pipe_ctx,
697 struct dc_stream_state *stream,
698 struct drr_params *params)
699 {
700 /* params can be null.*/
701 if (pipe_ctx && pipe_ctx->stream_res.tg &&
702 pipe_ctx->stream_res.tg->funcs->set_drr)
703 pipe_ctx->stream_res.tg->funcs->set_drr(
704 pipe_ctx->stream_res.tg, params);
705
706 if (stream)
707 stream->adjust.timing_adjust_pending = false;
708 }
709
get_fams2_visual_confirm_color(struct dc * dc,struct dc_state * context,struct pipe_ctx * pipe_ctx,struct tg_color * color)710 void get_fams2_visual_confirm_color(
711 struct dc *dc,
712 struct dc_state *context,
713 struct pipe_ctx *pipe_ctx,
714 struct tg_color *color)
715 {
716 uint32_t color_value = MAX_TG_COLOR_VALUE;
717
718 if (!dc->ctx || !dc->ctx->dmub_srv || !pipe_ctx || !context || !dc->debug.fams2_config.bits.enable)
719 return;
720
721 /* driver only handles visual confirm when FAMS2 is disabled */
722 if (!dc_state_is_fams2_in_use(dc, context)) {
723 /* when FAMS2 is disabled, all pipes are grey */
724 color->color_g_y = color_value / 2;
725 color->color_b_cb = color_value / 2;
726 color->color_r_cr = color_value / 2;
727 }
728 }
729
hwss_build_fast_sequence(struct dc * dc,struct dc_dmub_cmd * dc_dmub_cmd,unsigned int dmub_cmd_count,struct block_sequence block_sequence[MAX_HWSS_BLOCK_SEQUENCE_SIZE],unsigned int * num_steps,struct pipe_ctx * pipe_ctx,struct dc_stream_status * stream_status,struct dc_state * context)730 void hwss_build_fast_sequence(struct dc *dc,
731 struct dc_dmub_cmd *dc_dmub_cmd,
732 unsigned int dmub_cmd_count,
733 struct block_sequence block_sequence[MAX_HWSS_BLOCK_SEQUENCE_SIZE],
734 unsigned int *num_steps,
735 struct pipe_ctx *pipe_ctx,
736 struct dc_stream_status *stream_status,
737 struct dc_state *context)
738 {
739 struct dc_plane_state *plane = pipe_ctx->plane_state;
740 struct dc_stream_state *stream = pipe_ctx->stream;
741 struct dce_hwseq *hws = dc->hwseq;
742 struct pipe_ctx *current_pipe = NULL;
743 struct pipe_ctx *current_mpc_pipe = NULL;
744 unsigned int i = 0;
745
746 *num_steps = 0; // Initialize to 0
747
748 if (!plane || !stream)
749 return;
750
751 if (dc->hwss.wait_for_dcc_meta_propagation) {
752 block_sequence[*num_steps].params.wait_for_dcc_meta_propagation_params.dc = dc;
753 block_sequence[*num_steps].params.wait_for_dcc_meta_propagation_params.top_pipe_to_program = pipe_ctx;
754 block_sequence[*num_steps].func = HUBP_WAIT_FOR_DCC_META_PROP;
755 (*num_steps)++;
756 }
757 if (dc->hwss.subvp_pipe_control_lock_fast) {
758 block_sequence[*num_steps].params.subvp_pipe_control_lock_fast_params.dc = dc;
759 block_sequence[*num_steps].params.subvp_pipe_control_lock_fast_params.lock = true;
760 block_sequence[*num_steps].params.subvp_pipe_control_lock_fast_params.subvp_immediate_flip =
761 plane->flip_immediate && stream_status->mall_stream_config.type == SUBVP_MAIN;
762 block_sequence[*num_steps].func = DMUB_SUBVP_PIPE_CONTROL_LOCK_FAST;
763 (*num_steps)++;
764 }
765 if (dc->hwss.dmub_hw_control_lock_fast) {
766 block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.dc = dc;
767 block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.lock = true;
768 block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required =
769 dc_state_is_fams2_in_use(dc, context) ||
770 dmub_hw_lock_mgr_does_link_require_lock(dc, stream->link);
771 block_sequence[*num_steps].func = DMUB_HW_CONTROL_LOCK_FAST;
772 (*num_steps)++;
773 }
774 if (dc->hwss.pipe_control_lock) {
775 block_sequence[*num_steps].params.pipe_control_lock_params.dc = dc;
776 block_sequence[*num_steps].params.pipe_control_lock_params.lock = true;
777 block_sequence[*num_steps].params.pipe_control_lock_params.pipe_ctx = pipe_ctx;
778 block_sequence[*num_steps].func = OPTC_PIPE_CONTROL_LOCK;
779 (*num_steps)++;
780 }
781
782 for (i = 0; i < dmub_cmd_count; i++) {
783 block_sequence[*num_steps].params.send_dmcub_cmd_params.ctx = dc->ctx;
784 block_sequence[*num_steps].params.send_dmcub_cmd_params.cmd = &(dc_dmub_cmd[i].dmub_cmd);
785 block_sequence[*num_steps].params.send_dmcub_cmd_params.wait_type = dc_dmub_cmd[i].wait_type;
786 block_sequence[*num_steps].func = DMUB_SEND_DMCUB_CMD;
787 (*num_steps)++;
788 }
789
790 current_pipe = pipe_ctx;
791 while (current_pipe) {
792 current_mpc_pipe = current_pipe;
793 while (current_mpc_pipe) {
794 if (current_mpc_pipe->plane_state) {
795 if (dc->hwss.set_flip_control_gsl && current_mpc_pipe->plane_state->update_flags.raw) {
796 block_sequence[*num_steps].params.set_flip_control_gsl_params.hubp = current_mpc_pipe->plane_res.hubp;
797 block_sequence[*num_steps].params.set_flip_control_gsl_params.flip_immediate = current_mpc_pipe->plane_state->flip_immediate;
798 block_sequence[*num_steps].func = HUBP_SET_FLIP_CONTROL_GSL;
799 (*num_steps)++;
800 }
801 if (dc->hwss.program_triplebuffer && dc->debug.enable_tri_buf && current_mpc_pipe->plane_state->update_flags.raw) {
802 block_sequence[*num_steps].params.program_triplebuffer_params.dc = dc;
803 block_sequence[*num_steps].params.program_triplebuffer_params.pipe_ctx = current_mpc_pipe;
804 block_sequence[*num_steps].params.program_triplebuffer_params.enableTripleBuffer = current_mpc_pipe->plane_state->triplebuffer_flips;
805 block_sequence[*num_steps].func = HUBP_PROGRAM_TRIPLEBUFFER;
806 (*num_steps)++;
807 }
808 if (dc->hwss.update_plane_addr && current_mpc_pipe->plane_state->update_flags.bits.addr_update) {
809 if (resource_is_pipe_type(current_mpc_pipe, OTG_MASTER) &&
810 stream_status->mall_stream_config.type == SUBVP_MAIN) {
811 block_sequence[*num_steps].params.subvp_save_surf_addr.dc_dmub_srv = dc->ctx->dmub_srv;
812 block_sequence[*num_steps].params.subvp_save_surf_addr.addr = ¤t_mpc_pipe->plane_state->address;
813 block_sequence[*num_steps].params.subvp_save_surf_addr.subvp_index = current_mpc_pipe->subvp_index;
814 block_sequence[*num_steps].func = DMUB_SUBVP_SAVE_SURF_ADDR;
815 (*num_steps)++;
816 }
817
818 block_sequence[*num_steps].params.update_plane_addr_params.dc = dc;
819 block_sequence[*num_steps].params.update_plane_addr_params.pipe_ctx = current_mpc_pipe;
820 block_sequence[*num_steps].func = HUBP_UPDATE_PLANE_ADDR;
821 (*num_steps)++;
822 }
823
824 if (hws->funcs.set_input_transfer_func && current_mpc_pipe->plane_state->update_flags.bits.gamma_change) {
825 block_sequence[*num_steps].params.set_input_transfer_func_params.dc = dc;
826 block_sequence[*num_steps].params.set_input_transfer_func_params.pipe_ctx = current_mpc_pipe;
827 block_sequence[*num_steps].params.set_input_transfer_func_params.plane_state = current_mpc_pipe->plane_state;
828 block_sequence[*num_steps].func = DPP_SET_INPUT_TRANSFER_FUNC;
829 (*num_steps)++;
830 }
831
832 if (dc->hwss.program_gamut_remap && current_mpc_pipe->plane_state->update_flags.bits.gamut_remap_change) {
833 block_sequence[*num_steps].params.program_gamut_remap_params.pipe_ctx = current_mpc_pipe;
834 block_sequence[*num_steps].func = DPP_PROGRAM_GAMUT_REMAP;
835 (*num_steps)++;
836 }
837 if (current_mpc_pipe->plane_state->update_flags.bits.input_csc_change) {
838 block_sequence[*num_steps].params.setup_dpp_params.pipe_ctx = current_mpc_pipe;
839 block_sequence[*num_steps].func = DPP_SETUP_DPP;
840 (*num_steps)++;
841 }
842 if (current_mpc_pipe->plane_state->update_flags.bits.coeff_reduction_change) {
843 block_sequence[*num_steps].params.program_bias_and_scale_params.pipe_ctx = current_mpc_pipe;
844 block_sequence[*num_steps].func = DPP_PROGRAM_BIAS_AND_SCALE;
845 (*num_steps)++;
846 }
847 }
848 if (hws->funcs.set_output_transfer_func && current_mpc_pipe->stream->update_flags.bits.out_tf) {
849 block_sequence[*num_steps].params.set_output_transfer_func_params.dc = dc;
850 block_sequence[*num_steps].params.set_output_transfer_func_params.pipe_ctx = current_mpc_pipe;
851 block_sequence[*num_steps].params.set_output_transfer_func_params.stream = current_mpc_pipe->stream;
852 block_sequence[*num_steps].func = DPP_SET_OUTPUT_TRANSFER_FUNC;
853 (*num_steps)++;
854 }
855 if (dc->debug.visual_confirm != VISUAL_CONFIRM_DISABLE &&
856 dc->hwss.update_visual_confirm_color) {
857 block_sequence[*num_steps].params.update_visual_confirm_params.dc = dc;
858 block_sequence[*num_steps].params.update_visual_confirm_params.pipe_ctx = current_mpc_pipe;
859 block_sequence[*num_steps].params.update_visual_confirm_params.mpcc_id = current_mpc_pipe->plane_res.hubp->inst;
860 block_sequence[*num_steps].func = MPC_UPDATE_VISUAL_CONFIRM;
861 (*num_steps)++;
862 }
863 if (current_mpc_pipe->stream->update_flags.bits.out_csc) {
864 block_sequence[*num_steps].params.power_on_mpc_mem_pwr_params.mpc = dc->res_pool->mpc;
865 block_sequence[*num_steps].params.power_on_mpc_mem_pwr_params.mpcc_id = current_mpc_pipe->plane_res.hubp->inst;
866 block_sequence[*num_steps].params.power_on_mpc_mem_pwr_params.power_on = true;
867 block_sequence[*num_steps].func = MPC_POWER_ON_MPC_MEM_PWR;
868 (*num_steps)++;
869
870 if (current_mpc_pipe->stream->csc_color_matrix.enable_adjustment == true) {
871 block_sequence[*num_steps].params.set_output_csc_params.mpc = dc->res_pool->mpc;
872 block_sequence[*num_steps].params.set_output_csc_params.opp_id = current_mpc_pipe->stream_res.opp->inst;
873 block_sequence[*num_steps].params.set_output_csc_params.regval = current_mpc_pipe->stream->csc_color_matrix.matrix;
874 block_sequence[*num_steps].params.set_output_csc_params.ocsc_mode = MPC_OUTPUT_CSC_COEF_A;
875 block_sequence[*num_steps].func = MPC_SET_OUTPUT_CSC;
876 (*num_steps)++;
877 } else {
878 block_sequence[*num_steps].params.set_ocsc_default_params.mpc = dc->res_pool->mpc;
879 block_sequence[*num_steps].params.set_ocsc_default_params.opp_id = current_mpc_pipe->stream_res.opp->inst;
880 block_sequence[*num_steps].params.set_ocsc_default_params.color_space = current_mpc_pipe->stream->output_color_space;
881 block_sequence[*num_steps].params.set_ocsc_default_params.ocsc_mode = MPC_OUTPUT_CSC_COEF_A;
882 block_sequence[*num_steps].func = MPC_SET_OCSC_DEFAULT;
883 (*num_steps)++;
884 }
885 }
886 current_mpc_pipe = current_mpc_pipe->bottom_pipe;
887 }
888 current_pipe = current_pipe->next_odm_pipe;
889 }
890
891 if (dc->hwss.pipe_control_lock) {
892 block_sequence[*num_steps].params.pipe_control_lock_params.dc = dc;
893 block_sequence[*num_steps].params.pipe_control_lock_params.lock = false;
894 block_sequence[*num_steps].params.pipe_control_lock_params.pipe_ctx = pipe_ctx;
895 block_sequence[*num_steps].func = OPTC_PIPE_CONTROL_LOCK;
896 (*num_steps)++;
897 }
898 if (dc->hwss.subvp_pipe_control_lock_fast) {
899 block_sequence[*num_steps].params.subvp_pipe_control_lock_fast_params.dc = dc;
900 block_sequence[*num_steps].params.subvp_pipe_control_lock_fast_params.lock = false;
901 block_sequence[*num_steps].params.subvp_pipe_control_lock_fast_params.subvp_immediate_flip =
902 plane->flip_immediate && stream_status->mall_stream_config.type == SUBVP_MAIN;
903 block_sequence[*num_steps].func = DMUB_SUBVP_PIPE_CONTROL_LOCK_FAST;
904 (*num_steps)++;
905 }
906 if (dc->hwss.dmub_hw_control_lock_fast) {
907 block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.dc = dc;
908 block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.lock = false;
909 block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required = dc_state_is_fams2_in_use(dc, context);
910 block_sequence[*num_steps].func = DMUB_HW_CONTROL_LOCK_FAST;
911 (*num_steps)++;
912 }
913
914 current_pipe = pipe_ctx;
915 while (current_pipe) {
916 current_mpc_pipe = current_pipe;
917
918 while (current_mpc_pipe) {
919 if (!current_mpc_pipe->bottom_pipe && !current_mpc_pipe->next_odm_pipe &&
920 current_mpc_pipe->stream && current_mpc_pipe->plane_state &&
921 current_mpc_pipe->plane_state->update_flags.bits.addr_update &&
922 !current_mpc_pipe->plane_state->skip_manual_trigger) {
923 if (dc->hwss.program_cursor_offload_now) {
924 block_sequence[*num_steps].params.program_cursor_update_now_params.dc = dc;
925 block_sequence[*num_steps].params.program_cursor_update_now_params.pipe_ctx = current_mpc_pipe;
926 block_sequence[*num_steps].func = PROGRAM_CURSOR_UPDATE_NOW;
927 (*num_steps)++;
928 }
929
930 block_sequence[*num_steps].params.program_manual_trigger_params.pipe_ctx = current_mpc_pipe;
931 block_sequence[*num_steps].func = OPTC_PROGRAM_MANUAL_TRIGGER;
932 (*num_steps)++;
933 }
934 current_mpc_pipe = current_mpc_pipe->bottom_pipe;
935 }
936 current_pipe = current_pipe->next_odm_pipe;
937 }
938 }
939
hwss_execute_sequence(struct dc * dc,struct block_sequence block_sequence[MAX_HWSS_BLOCK_SEQUENCE_SIZE],int num_steps)940 void hwss_execute_sequence(struct dc *dc,
941 struct block_sequence block_sequence[MAX_HWSS_BLOCK_SEQUENCE_SIZE],
942 int num_steps)
943 {
944 unsigned int i;
945 union block_sequence_params *params;
946 struct dce_hwseq *hws = dc->hwseq;
947
948 for (i = 0; i < num_steps; i++) {
949 params = &(block_sequence[i].params);
950 switch (block_sequence[i].func) {
951
952 case DMUB_SUBVP_PIPE_CONTROL_LOCK_FAST:
953 dc->hwss.subvp_pipe_control_lock_fast(params);
954 break;
955 case OPTC_PIPE_CONTROL_LOCK:
956 dc->hwss.pipe_control_lock(params->pipe_control_lock_params.dc,
957 params->pipe_control_lock_params.pipe_ctx,
958 params->pipe_control_lock_params.lock);
959 break;
960 case HUBP_SET_FLIP_CONTROL_GSL:
961 params->set_flip_control_gsl_params.hubp->funcs->hubp_set_flip_control_surface_gsl(
962 params->set_flip_control_gsl_params.hubp,
963 params->set_flip_control_gsl_params.flip_immediate);
964 break;
965 case HUBP_PROGRAM_TRIPLEBUFFER:
966 dc->hwss.program_triplebuffer(params->program_triplebuffer_params.dc,
967 params->program_triplebuffer_params.pipe_ctx,
968 params->program_triplebuffer_params.enableTripleBuffer);
969 break;
970 case HUBP_UPDATE_PLANE_ADDR:
971 dc->hwss.update_plane_addr(params->update_plane_addr_params.dc,
972 params->update_plane_addr_params.pipe_ctx);
973 break;
974 case DPP_SET_INPUT_TRANSFER_FUNC:
975 hws->funcs.set_input_transfer_func(params->set_input_transfer_func_params.dc,
976 params->set_input_transfer_func_params.pipe_ctx,
977 params->set_input_transfer_func_params.plane_state);
978 break;
979 case DPP_PROGRAM_GAMUT_REMAP:
980 dc->hwss.program_gamut_remap(params->program_gamut_remap_params.pipe_ctx);
981 break;
982 case DPP_SETUP_DPP:
983 hwss_setup_dpp(params);
984 break;
985 case DPP_PROGRAM_BIAS_AND_SCALE:
986 hwss_program_bias_and_scale(params);
987 break;
988 case OPTC_PROGRAM_MANUAL_TRIGGER:
989 hwss_program_manual_trigger(params);
990 break;
991 case DPP_SET_OUTPUT_TRANSFER_FUNC:
992 hws->funcs.set_output_transfer_func(params->set_output_transfer_func_params.dc,
993 params->set_output_transfer_func_params.pipe_ctx,
994 params->set_output_transfer_func_params.stream);
995 break;
996 case MPC_UPDATE_VISUAL_CONFIRM:
997 dc->hwss.update_visual_confirm_color(params->update_visual_confirm_params.dc,
998 params->update_visual_confirm_params.pipe_ctx,
999 params->update_visual_confirm_params.mpcc_id);
1000 break;
1001 case MPC_POWER_ON_MPC_MEM_PWR:
1002 hwss_power_on_mpc_mem_pwr(params);
1003 break;
1004 case MPC_SET_OUTPUT_CSC:
1005 hwss_set_output_csc(params);
1006 break;
1007 case MPC_SET_OCSC_DEFAULT:
1008 hwss_set_ocsc_default(params);
1009 break;
1010 case DMUB_SEND_DMCUB_CMD:
1011 hwss_send_dmcub_cmd(params);
1012 break;
1013 case DMUB_SUBVP_SAVE_SURF_ADDR:
1014 hwss_subvp_save_surf_addr(params);
1015 break;
1016 case HUBP_WAIT_FOR_DCC_META_PROP:
1017 dc->hwss.wait_for_dcc_meta_propagation(
1018 params->wait_for_dcc_meta_propagation_params.dc,
1019 params->wait_for_dcc_meta_propagation_params.top_pipe_to_program);
1020 break;
1021 case DMUB_HW_CONTROL_LOCK_FAST:
1022 dc->hwss.dmub_hw_control_lock_fast(params);
1023 break;
1024 case HUBP_PROGRAM_SURFACE_CONFIG:
1025 hwss_program_surface_config(params);
1026 break;
1027 case HUBP_PROGRAM_MCACHE_ID:
1028 hwss_program_mcache_id_and_split_coordinate(params);
1029 break;
1030 case PROGRAM_CURSOR_UPDATE_NOW:
1031 dc->hwss.program_cursor_offload_now(
1032 params->program_cursor_update_now_params.dc,
1033 params->program_cursor_update_now_params.pipe_ctx);
1034 break;
1035 case HUBP_WAIT_PIPE_READ_START:
1036 params->hubp_wait_pipe_read_start_params.hubp->funcs->hubp_wait_pipe_read_start(
1037 params->hubp_wait_pipe_read_start_params.hubp);
1038 break;
1039 case HWS_APPLY_UPDATE_FLAGS_FOR_PHANTOM:
1040 dc->hwss.apply_update_flags_for_phantom(params->apply_update_flags_for_phantom_params.pipe_ctx);
1041 break;
1042 case HWS_UPDATE_PHANTOM_VP_POSITION:
1043 dc->hwss.update_phantom_vp_position(params->update_phantom_vp_position_params.dc,
1044 params->update_phantom_vp_position_params.context,
1045 params->update_phantom_vp_position_params.pipe_ctx);
1046 break;
1047 case OPTC_SET_ODM_COMBINE:
1048 hwss_set_odm_combine(params);
1049 break;
1050 case OPTC_SET_ODM_BYPASS:
1051 hwss_set_odm_bypass(params);
1052 break;
1053 case OPP_PIPE_CLOCK_CONTROL:
1054 hwss_opp_pipe_clock_control(params);
1055 break;
1056 case OPP_PROGRAM_LEFT_EDGE_EXTRA_PIXEL:
1057 hwss_opp_program_left_edge_extra_pixel(params);
1058 break;
1059 case DCCG_SET_DTO_DSCCLK:
1060 hwss_dccg_set_dto_dscclk(params);
1061 break;
1062 case DSC_SET_CONFIG:
1063 hwss_dsc_set_config(params);
1064 break;
1065 case DSC_ENABLE:
1066 hwss_dsc_enable(params);
1067 break;
1068 case TG_SET_DSC_CONFIG:
1069 hwss_tg_set_dsc_config(params);
1070 break;
1071 case DSC_DISCONNECT:
1072 hwss_dsc_disconnect(params);
1073 break;
1074 case DSC_READ_STATE:
1075 hwss_dsc_read_state(params);
1076 break;
1077 case DSC_CALCULATE_AND_SET_CONFIG:
1078 hwss_dsc_calculate_and_set_config(params);
1079 break;
1080 case DSC_ENABLE_WITH_OPP:
1081 hwss_dsc_enable_with_opp(params);
1082 break;
1083 case TG_PROGRAM_GLOBAL_SYNC:
1084 hwss_tg_program_global_sync(params);
1085 break;
1086 case TG_WAIT_FOR_STATE:
1087 hwss_tg_wait_for_state(params);
1088 break;
1089 case TG_SET_VTG_PARAMS:
1090 hwss_tg_set_vtg_params(params);
1091 break;
1092 case TG_SETUP_VERTICAL_INTERRUPT2:
1093 hwss_tg_setup_vertical_interrupt2(params);
1094 break;
1095 case DPP_SET_HDR_MULTIPLIER:
1096 hwss_dpp_set_hdr_multiplier(params);
1097 break;
1098 case HUBP_PROGRAM_DET_SIZE:
1099 hwss_program_det_size(params);
1100 break;
1101 case HUBP_PROGRAM_DET_SEGMENTS:
1102 hwss_program_det_segments(params);
1103 break;
1104 case OPP_SET_DYN_EXPANSION:
1105 hwss_opp_set_dyn_expansion(params);
1106 break;
1107 case OPP_PROGRAM_FMT:
1108 hwss_opp_program_fmt(params);
1109 break;
1110 case OPP_PROGRAM_BIT_DEPTH_REDUCTION:
1111 hwss_opp_program_bit_depth_reduction(params);
1112 break;
1113 case OPP_SET_DISP_PATTERN_GENERATOR:
1114 hwss_opp_set_disp_pattern_generator(params);
1115 break;
1116 case ABM_SET_PIPE:
1117 hwss_set_abm_pipe(params);
1118 break;
1119 case ABM_SET_LEVEL:
1120 hwss_set_abm_level(params);
1121 break;
1122 case ABM_SET_IMMEDIATE_DISABLE:
1123 hwss_set_abm_immediate_disable(params);
1124 break;
1125 case MPC_REMOVE_MPCC:
1126 hwss_mpc_remove_mpcc(params);
1127 break;
1128 case OPP_SET_MPCC_DISCONNECT_PENDING:
1129 hwss_opp_set_mpcc_disconnect_pending(params);
1130 break;
1131 case DC_SET_OPTIMIZED_REQUIRED:
1132 hwss_dc_set_optimized_required(params);
1133 break;
1134 case HUBP_DISCONNECT:
1135 hwss_hubp_disconnect(params);
1136 break;
1137 case HUBBUB_FORCE_PSTATE_CHANGE_CONTROL:
1138 hwss_hubbub_force_pstate_change_control(params);
1139 break;
1140 case TG_ENABLE_CRTC:
1141 hwss_tg_enable_crtc(params);
1142 break;
1143 case TG_SET_GSL:
1144 hwss_tg_set_gsl(params);
1145 break;
1146 case TG_SET_GSL_SOURCE_SELECT:
1147 hwss_tg_set_gsl_source_select(params);
1148 break;
1149 case HUBP_WAIT_FLIP_PENDING:
1150 hwss_hubp_wait_flip_pending(params);
1151 break;
1152 case TG_WAIT_DOUBLE_BUFFER_PENDING:
1153 hwss_tg_wait_double_buffer_pending(params);
1154 break;
1155 case UPDATE_FORCE_PSTATE:
1156 hwss_update_force_pstate(params);
1157 break;
1158 case HUBBUB_APPLY_DEDCN21_147_WA:
1159 hwss_hubbub_apply_dedcn21_147_wa(params);
1160 break;
1161 case HUBBUB_ALLOW_SELF_REFRESH_CONTROL:
1162 hwss_hubbub_allow_self_refresh_control(params);
1163 break;
1164 case TG_GET_FRAME_COUNT:
1165 hwss_tg_get_frame_count(params);
1166 break;
1167 case MPC_SET_DWB_MUX:
1168 hwss_mpc_set_dwb_mux(params);
1169 break;
1170 case MPC_DISABLE_DWB_MUX:
1171 hwss_mpc_disable_dwb_mux(params);
1172 break;
1173 case MCIF_WB_CONFIG_BUF:
1174 hwss_mcif_wb_config_buf(params);
1175 break;
1176 case MCIF_WB_CONFIG_ARB:
1177 hwss_mcif_wb_config_arb(params);
1178 break;
1179 case MCIF_WB_ENABLE:
1180 hwss_mcif_wb_enable(params);
1181 break;
1182 case MCIF_WB_DISABLE:
1183 hwss_mcif_wb_disable(params);
1184 break;
1185 case DWBC_ENABLE:
1186 hwss_dwbc_enable(params);
1187 break;
1188 case DWBC_DISABLE:
1189 hwss_dwbc_disable(params);
1190 break;
1191 case DWBC_UPDATE:
1192 hwss_dwbc_update(params);
1193 break;
1194 case HUBP_UPDATE_MALL_SEL:
1195 hwss_hubp_update_mall_sel(params);
1196 break;
1197 case HUBP_PREPARE_SUBVP_BUFFERING:
1198 hwss_hubp_prepare_subvp_buffering(params);
1199 break;
1200 case HUBP_SET_BLANK_EN:
1201 hwss_hubp_set_blank_en(params);
1202 break;
1203 case HUBP_DISABLE_CONTROL:
1204 hwss_hubp_disable_control(params);
1205 break;
1206 case HUBBUB_SOFT_RESET:
1207 hwss_hubbub_soft_reset(params);
1208 break;
1209 case HUBP_CLK_CNTL:
1210 hwss_hubp_clk_cntl(params);
1211 break;
1212 case HUBP_INIT:
1213 hwss_hubp_init(params);
1214 break;
1215 case HUBP_SET_VM_SYSTEM_APERTURE_SETTINGS:
1216 hwss_hubp_set_vm_system_aperture_settings(params);
1217 break;
1218 case HUBP_SET_FLIP_INT:
1219 hwss_hubp_set_flip_int(params);
1220 break;
1221 case DPP_DPPCLK_CONTROL:
1222 hwss_dpp_dppclk_control(params);
1223 break;
1224 case DISABLE_PHANTOM_CRTC:
1225 hwss_disable_phantom_crtc(params);
1226 break;
1227 case DSC_PG_STATUS:
1228 hwss_dsc_pg_status(params);
1229 break;
1230 case DSC_WAIT_DISCONNECT_PENDING_CLEAR:
1231 hwss_dsc_wait_disconnect_pending_clear(params);
1232 break;
1233 case DSC_DISABLE:
1234 hwss_dsc_disable(params);
1235 break;
1236 case DCCG_SET_REF_DSCCLK:
1237 hwss_dccg_set_ref_dscclk(params);
1238 break;
1239 case DPP_PG_CONTROL:
1240 hwss_dpp_pg_control(params);
1241 break;
1242 case HUBP_PG_CONTROL:
1243 hwss_hubp_pg_control(params);
1244 break;
1245 case HUBP_RESET:
1246 hwss_hubp_reset(params);
1247 break;
1248 case DPP_RESET:
1249 hwss_dpp_reset(params);
1250 break;
1251 case DPP_ROOT_CLOCK_CONTROL:
1252 hwss_dpp_root_clock_control(params);
1253 break;
1254 case DC_IP_REQUEST_CNTL:
1255 hwss_dc_ip_request_cntl(params);
1256 break;
1257 case DCCG_UPDATE_DPP_DTO:
1258 hwss_dccg_update_dpp_dto(params);
1259 break;
1260 case HUBP_VTG_SEL:
1261 hwss_hubp_vtg_sel(params);
1262 break;
1263 case HUBP_SETUP2:
1264 hwss_hubp_setup2(params);
1265 break;
1266 case HUBP_SETUP:
1267 hwss_hubp_setup(params);
1268 break;
1269 case HUBP_SET_UNBOUNDED_REQUESTING:
1270 hwss_hubp_set_unbounded_requesting(params);
1271 break;
1272 case HUBP_SETUP_INTERDEPENDENT2:
1273 hwss_hubp_setup_interdependent2(params);
1274 break;
1275 case HUBP_SETUP_INTERDEPENDENT:
1276 hwss_hubp_setup_interdependent(params);
1277 break;
1278 case DPP_SET_CURSOR_MATRIX:
1279 hwss_dpp_set_cursor_matrix(params);
1280 break;
1281 case MPC_UPDATE_BLENDING:
1282 hwss_mpc_update_blending(params);
1283 break;
1284 case MPC_ASSERT_IDLE_MPCC:
1285 hwss_mpc_assert_idle_mpcc(params);
1286 break;
1287 case MPC_INSERT_PLANE:
1288 hwss_mpc_insert_plane(params);
1289 break;
1290 case DPP_SET_SCALER:
1291 hwss_dpp_set_scaler(params);
1292 break;
1293 case HUBP_MEM_PROGRAM_VIEWPORT:
1294 hwss_hubp_mem_program_viewport(params);
1295 break;
1296 case ABORT_CURSOR_OFFLOAD_UPDATE:
1297 hwss_abort_cursor_offload_update(params);
1298 break;
1299 case SET_CURSOR_ATTRIBUTE:
1300 hwss_set_cursor_attribute(params);
1301 break;
1302 case SET_CURSOR_POSITION:
1303 hwss_set_cursor_position(params);
1304 break;
1305 case SET_CURSOR_SDR_WHITE_LEVEL:
1306 hwss_set_cursor_sdr_white_level(params);
1307 break;
1308 case PROGRAM_OUTPUT_CSC:
1309 hwss_program_output_csc(params);
1310 break;
1311 case HUBP_SET_BLANK:
1312 hwss_hubp_set_blank(params);
1313 break;
1314 case PHANTOM_HUBP_POST_ENABLE:
1315 hwss_phantom_hubp_post_enable(params);
1316 break;
1317 default:
1318 ASSERT(false);
1319 break;
1320 }
1321 }
1322 }
1323
1324 /*
1325 * Helper function to add OPTC pipe control lock to block sequence
1326 */
hwss_add_optc_pipe_control_lock(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * pipe_ctx,bool lock)1327 void hwss_add_optc_pipe_control_lock(struct block_sequence_state *seq_state,
1328 struct dc *dc,
1329 struct pipe_ctx *pipe_ctx,
1330 bool lock)
1331 {
1332 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1333 seq_state->steps[*seq_state->num_steps].params.pipe_control_lock_params.dc = dc;
1334 seq_state->steps[*seq_state->num_steps].params.pipe_control_lock_params.pipe_ctx = pipe_ctx;
1335 seq_state->steps[*seq_state->num_steps].params.pipe_control_lock_params.lock = lock;
1336 seq_state->steps[*seq_state->num_steps].func = OPTC_PIPE_CONTROL_LOCK;
1337 (*seq_state->num_steps)++;
1338 }
1339 }
1340
1341 /*
1342 * Helper function to add HUBP set flip control GSL to block sequence
1343 */
hwss_add_hubp_set_flip_control_gsl(struct block_sequence_state * seq_state,struct hubp * hubp,bool flip_immediate)1344 void hwss_add_hubp_set_flip_control_gsl(struct block_sequence_state *seq_state,
1345 struct hubp *hubp,
1346 bool flip_immediate)
1347 {
1348 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1349 seq_state->steps[*seq_state->num_steps].params.set_flip_control_gsl_params.hubp = hubp;
1350 seq_state->steps[*seq_state->num_steps].params.set_flip_control_gsl_params.flip_immediate = flip_immediate;
1351 seq_state->steps[*seq_state->num_steps].func = HUBP_SET_FLIP_CONTROL_GSL;
1352 (*seq_state->num_steps)++;
1353 }
1354 }
1355
1356 /*
1357 * Helper function to add HUBP program triplebuffer to block sequence
1358 */
hwss_add_hubp_program_triplebuffer(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * pipe_ctx,bool enableTripleBuffer)1359 void hwss_add_hubp_program_triplebuffer(struct block_sequence_state *seq_state,
1360 struct dc *dc,
1361 struct pipe_ctx *pipe_ctx,
1362 bool enableTripleBuffer)
1363 {
1364 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1365 seq_state->steps[*seq_state->num_steps].params.program_triplebuffer_params.dc = dc;
1366 seq_state->steps[*seq_state->num_steps].params.program_triplebuffer_params.pipe_ctx = pipe_ctx;
1367 seq_state->steps[*seq_state->num_steps].params.program_triplebuffer_params.enableTripleBuffer = enableTripleBuffer;
1368 seq_state->steps[*seq_state->num_steps].func = HUBP_PROGRAM_TRIPLEBUFFER;
1369 (*seq_state->num_steps)++;
1370 }
1371 }
1372
1373 /*
1374 * Helper function to add HUBP update plane address to block sequence
1375 */
hwss_add_hubp_update_plane_addr(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * pipe_ctx)1376 void hwss_add_hubp_update_plane_addr(struct block_sequence_state *seq_state,
1377 struct dc *dc,
1378 struct pipe_ctx *pipe_ctx)
1379 {
1380 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1381 seq_state->steps[*seq_state->num_steps].params.update_plane_addr_params.dc = dc;
1382 seq_state->steps[*seq_state->num_steps].params.update_plane_addr_params.pipe_ctx = pipe_ctx;
1383 seq_state->steps[*seq_state->num_steps].func = HUBP_UPDATE_PLANE_ADDR;
1384 (*seq_state->num_steps)++;
1385 }
1386 }
1387
1388 /*
1389 * Helper function to add DPP set input transfer function to block sequence
1390 */
hwss_add_dpp_set_input_transfer_func(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * pipe_ctx,struct dc_plane_state * plane_state)1391 void hwss_add_dpp_set_input_transfer_func(struct block_sequence_state *seq_state,
1392 struct dc *dc,
1393 struct pipe_ctx *pipe_ctx,
1394 struct dc_plane_state *plane_state)
1395 {
1396 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1397 seq_state->steps[*seq_state->num_steps].params.set_input_transfer_func_params.dc = dc;
1398 seq_state->steps[*seq_state->num_steps].params.set_input_transfer_func_params.pipe_ctx = pipe_ctx;
1399 seq_state->steps[*seq_state->num_steps].params.set_input_transfer_func_params.plane_state = plane_state;
1400 seq_state->steps[*seq_state->num_steps].func = DPP_SET_INPUT_TRANSFER_FUNC;
1401 (*seq_state->num_steps)++;
1402 }
1403 }
1404
1405 /*
1406 * Helper function to add DPP program gamut remap to block sequence
1407 */
hwss_add_dpp_program_gamut_remap(struct block_sequence_state * seq_state,struct pipe_ctx * pipe_ctx)1408 void hwss_add_dpp_program_gamut_remap(struct block_sequence_state *seq_state,
1409 struct pipe_ctx *pipe_ctx)
1410 {
1411 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1412 seq_state->steps[*seq_state->num_steps].params.program_gamut_remap_params.pipe_ctx = pipe_ctx;
1413 seq_state->steps[*seq_state->num_steps].func = DPP_PROGRAM_GAMUT_REMAP;
1414 (*seq_state->num_steps)++;
1415 }
1416 }
1417
1418 /*
1419 * Helper function to add DPP program bias and scale to block sequence
1420 */
hwss_add_dpp_program_bias_and_scale(struct block_sequence_state * seq_state,struct pipe_ctx * pipe_ctx)1421 void hwss_add_dpp_program_bias_and_scale(struct block_sequence_state *seq_state, struct pipe_ctx *pipe_ctx)
1422 {
1423 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1424 seq_state->steps[*seq_state->num_steps].params.program_bias_and_scale_params.pipe_ctx = pipe_ctx;
1425 seq_state->steps[*seq_state->num_steps].func = DPP_PROGRAM_BIAS_AND_SCALE;
1426 (*seq_state->num_steps)++;
1427 }
1428 }
1429
1430 /*
1431 * Helper function to add OPTC program manual trigger to block sequence
1432 */
hwss_add_optc_program_manual_trigger(struct block_sequence_state * seq_state,struct pipe_ctx * pipe_ctx)1433 void hwss_add_optc_program_manual_trigger(struct block_sequence_state *seq_state,
1434 struct pipe_ctx *pipe_ctx)
1435 {
1436 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1437 seq_state->steps[*seq_state->num_steps].params.program_manual_trigger_params.pipe_ctx = pipe_ctx;
1438 seq_state->steps[*seq_state->num_steps].func = OPTC_PROGRAM_MANUAL_TRIGGER;
1439 (*seq_state->num_steps)++;
1440 }
1441 }
1442
1443 /*
1444 * Helper function to add DPP set output transfer function to block sequence
1445 */
hwss_add_dpp_set_output_transfer_func(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * pipe_ctx,struct dc_stream_state * stream)1446 void hwss_add_dpp_set_output_transfer_func(struct block_sequence_state *seq_state,
1447 struct dc *dc,
1448 struct pipe_ctx *pipe_ctx,
1449 struct dc_stream_state *stream)
1450 {
1451 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1452 seq_state->steps[*seq_state->num_steps].params.set_output_transfer_func_params.dc = dc;
1453 seq_state->steps[*seq_state->num_steps].params.set_output_transfer_func_params.pipe_ctx = pipe_ctx;
1454 seq_state->steps[*seq_state->num_steps].params.set_output_transfer_func_params.stream = stream;
1455 seq_state->steps[*seq_state->num_steps].func = DPP_SET_OUTPUT_TRANSFER_FUNC;
1456 (*seq_state->num_steps)++;
1457 }
1458 }
1459
1460 /*
1461 * Helper function to add MPC update visual confirm to block sequence
1462 */
hwss_add_mpc_update_visual_confirm(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * pipe_ctx,int mpcc_id)1463 void hwss_add_mpc_update_visual_confirm(struct block_sequence_state *seq_state,
1464 struct dc *dc,
1465 struct pipe_ctx *pipe_ctx,
1466 int mpcc_id)
1467 {
1468 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1469 seq_state->steps[*seq_state->num_steps].params.update_visual_confirm_params.dc = dc;
1470 seq_state->steps[*seq_state->num_steps].params.update_visual_confirm_params.pipe_ctx = pipe_ctx;
1471 seq_state->steps[*seq_state->num_steps].params.update_visual_confirm_params.mpcc_id = mpcc_id;
1472 seq_state->steps[*seq_state->num_steps].func = MPC_UPDATE_VISUAL_CONFIRM;
1473 (*seq_state->num_steps)++;
1474 }
1475 }
1476
1477 /*
1478 * Helper function to add MPC power on MPC mem PWR to block sequence
1479 */
hwss_add_mpc_power_on_mpc_mem_pwr(struct block_sequence_state * seq_state,struct mpc * mpc,int mpcc_id,bool power_on)1480 void hwss_add_mpc_power_on_mpc_mem_pwr(struct block_sequence_state *seq_state,
1481 struct mpc *mpc,
1482 int mpcc_id,
1483 bool power_on)
1484 {
1485 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1486 seq_state->steps[*seq_state->num_steps].params.power_on_mpc_mem_pwr_params.mpc = mpc;
1487 seq_state->steps[*seq_state->num_steps].params.power_on_mpc_mem_pwr_params.mpcc_id = mpcc_id;
1488 seq_state->steps[*seq_state->num_steps].params.power_on_mpc_mem_pwr_params.power_on = power_on;
1489 seq_state->steps[*seq_state->num_steps].func = MPC_POWER_ON_MPC_MEM_PWR;
1490 (*seq_state->num_steps)++;
1491 }
1492 }
1493
1494 /*
1495 * Helper function to add MPC set output CSC to block sequence
1496 */
hwss_add_mpc_set_output_csc(struct block_sequence_state * seq_state,struct mpc * mpc,int opp_id,const uint16_t * regval,enum mpc_output_csc_mode ocsc_mode)1497 void hwss_add_mpc_set_output_csc(struct block_sequence_state *seq_state,
1498 struct mpc *mpc,
1499 int opp_id,
1500 const uint16_t *regval,
1501 enum mpc_output_csc_mode ocsc_mode)
1502 {
1503 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1504 seq_state->steps[*seq_state->num_steps].params.set_output_csc_params.mpc = mpc;
1505 seq_state->steps[*seq_state->num_steps].params.set_output_csc_params.opp_id = opp_id;
1506 seq_state->steps[*seq_state->num_steps].params.set_output_csc_params.regval = regval;
1507 seq_state->steps[*seq_state->num_steps].params.set_output_csc_params.ocsc_mode = ocsc_mode;
1508 seq_state->steps[*seq_state->num_steps].func = MPC_SET_OUTPUT_CSC;
1509 (*seq_state->num_steps)++;
1510 }
1511 }
1512
1513 /*
1514 * Helper function to add MPC set OCSC default to block sequence
1515 */
hwss_add_mpc_set_ocsc_default(struct block_sequence_state * seq_state,struct mpc * mpc,int opp_id,enum dc_color_space colorspace,enum mpc_output_csc_mode ocsc_mode)1516 void hwss_add_mpc_set_ocsc_default(struct block_sequence_state *seq_state,
1517 struct mpc *mpc,
1518 int opp_id,
1519 enum dc_color_space colorspace,
1520 enum mpc_output_csc_mode ocsc_mode)
1521 {
1522 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1523 seq_state->steps[*seq_state->num_steps].params.set_ocsc_default_params.mpc = mpc;
1524 seq_state->steps[*seq_state->num_steps].params.set_ocsc_default_params.opp_id = opp_id;
1525 seq_state->steps[*seq_state->num_steps].params.set_ocsc_default_params.color_space = colorspace;
1526 seq_state->steps[*seq_state->num_steps].params.set_ocsc_default_params.ocsc_mode = ocsc_mode;
1527 seq_state->steps[*seq_state->num_steps].func = MPC_SET_OCSC_DEFAULT;
1528 (*seq_state->num_steps)++;
1529 }
1530 }
1531
1532 /*
1533 * Helper function to add DMUB send DMCUB command to block sequence
1534 */
hwss_add_dmub_send_dmcub_cmd(struct block_sequence_state * seq_state,struct dc_context * ctx,union dmub_rb_cmd * cmd,enum dm_dmub_wait_type wait_type)1535 void hwss_add_dmub_send_dmcub_cmd(struct block_sequence_state *seq_state,
1536 struct dc_context *ctx,
1537 union dmub_rb_cmd *cmd,
1538 enum dm_dmub_wait_type wait_type)
1539 {
1540 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1541 seq_state->steps[*seq_state->num_steps].params.send_dmcub_cmd_params.ctx = ctx;
1542 seq_state->steps[*seq_state->num_steps].params.send_dmcub_cmd_params.cmd = cmd;
1543 seq_state->steps[*seq_state->num_steps].params.send_dmcub_cmd_params.wait_type = wait_type;
1544 seq_state->steps[*seq_state->num_steps].func = DMUB_SEND_DMCUB_CMD;
1545 (*seq_state->num_steps)++;
1546 }
1547 }
1548
1549 /*
1550 * Helper function to add DMUB SubVP save surface address to block sequence
1551 */
hwss_add_dmub_subvp_save_surf_addr(struct block_sequence_state * seq_state,struct dc_dmub_srv * dc_dmub_srv,struct dc_plane_address * addr,uint8_t subvp_index)1552 void hwss_add_dmub_subvp_save_surf_addr(struct block_sequence_state *seq_state,
1553 struct dc_dmub_srv *dc_dmub_srv,
1554 struct dc_plane_address *addr,
1555 uint8_t subvp_index)
1556 {
1557 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1558 seq_state->steps[*seq_state->num_steps].params.subvp_save_surf_addr.dc_dmub_srv = dc_dmub_srv;
1559 seq_state->steps[*seq_state->num_steps].params.subvp_save_surf_addr.addr = addr;
1560 seq_state->steps[*seq_state->num_steps].params.subvp_save_surf_addr.subvp_index = subvp_index;
1561 seq_state->steps[*seq_state->num_steps].func = DMUB_SUBVP_SAVE_SURF_ADDR;
1562 (*seq_state->num_steps)++;
1563 }
1564 }
1565
1566 /*
1567 * Helper function to add HUBP wait for DCC meta propagation to block sequence
1568 */
hwss_add_hubp_wait_for_dcc_meta_prop(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * top_pipe_to_program)1569 void hwss_add_hubp_wait_for_dcc_meta_prop(struct block_sequence_state *seq_state,
1570 struct dc *dc,
1571 struct pipe_ctx *top_pipe_to_program)
1572 {
1573 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1574 seq_state->steps[*seq_state->num_steps].params.wait_for_dcc_meta_propagation_params.dc = dc;
1575 seq_state->steps[*seq_state->num_steps].params.wait_for_dcc_meta_propagation_params.top_pipe_to_program = top_pipe_to_program;
1576 seq_state->steps[*seq_state->num_steps].func = HUBP_WAIT_FOR_DCC_META_PROP;
1577 (*seq_state->num_steps)++;
1578 }
1579 }
1580
1581 /*
1582 * Helper function to add HUBP wait pipe read start to block sequence
1583 */
hwss_add_hubp_wait_pipe_read_start(struct block_sequence_state * seq_state,struct hubp * hubp)1584 void hwss_add_hubp_wait_pipe_read_start(struct block_sequence_state *seq_state,
1585 struct hubp *hubp)
1586 {
1587 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1588 seq_state->steps[*seq_state->num_steps].params.hubp_wait_pipe_read_start_params.hubp = hubp;
1589 seq_state->steps[*seq_state->num_steps].func = HUBP_WAIT_PIPE_READ_START;
1590 (*seq_state->num_steps)++;
1591 }
1592 }
1593
1594 /*
1595 * Helper function to add HWS apply update flags for phantom to block sequence
1596 */
hwss_add_hws_apply_update_flags_for_phantom(struct block_sequence_state * seq_state,struct pipe_ctx * pipe_ctx)1597 void hwss_add_hws_apply_update_flags_for_phantom(struct block_sequence_state *seq_state,
1598 struct pipe_ctx *pipe_ctx)
1599 {
1600 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1601 seq_state->steps[*seq_state->num_steps].params.apply_update_flags_for_phantom_params.pipe_ctx = pipe_ctx;
1602 seq_state->steps[*seq_state->num_steps].func = HWS_APPLY_UPDATE_FLAGS_FOR_PHANTOM;
1603 (*seq_state->num_steps)++;
1604 }
1605 }
1606
1607 /*
1608 * Helper function to add HWS update phantom VP position to block sequence
1609 */
hwss_add_hws_update_phantom_vp_position(struct block_sequence_state * seq_state,struct dc * dc,struct dc_state * context,struct pipe_ctx * pipe_ctx)1610 void hwss_add_hws_update_phantom_vp_position(struct block_sequence_state *seq_state,
1611 struct dc *dc,
1612 struct dc_state *context,
1613 struct pipe_ctx *pipe_ctx)
1614 {
1615 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1616 seq_state->steps[*seq_state->num_steps].params.update_phantom_vp_position_params.dc = dc;
1617 seq_state->steps[*seq_state->num_steps].params.update_phantom_vp_position_params.context = context;
1618 seq_state->steps[*seq_state->num_steps].params.update_phantom_vp_position_params.pipe_ctx = pipe_ctx;
1619 seq_state->steps[*seq_state->num_steps].func = HWS_UPDATE_PHANTOM_VP_POSITION;
1620 (*seq_state->num_steps)++;
1621 }
1622 }
1623
1624 /*
1625 * Helper function to add OPTC set ODM combine to block sequence
1626 */
hwss_add_optc_set_odm_combine(struct block_sequence_state * seq_state,struct timing_generator * tg,int opp_inst[MAX_PIPES],int opp_head_count,int odm_slice_width,int last_odm_slice_width)1627 void hwss_add_optc_set_odm_combine(struct block_sequence_state *seq_state,
1628 struct timing_generator *tg, int opp_inst[MAX_PIPES], int opp_head_count,
1629 int odm_slice_width, int last_odm_slice_width)
1630 {
1631 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1632 seq_state->steps[*seq_state->num_steps].params.set_odm_combine_params.tg = tg;
1633 memcpy(seq_state->steps[*seq_state->num_steps].params.set_odm_combine_params.opp_inst, opp_inst, sizeof(int) * MAX_PIPES);
1634 seq_state->steps[*seq_state->num_steps].params.set_odm_combine_params.opp_head_count = opp_head_count;
1635 seq_state->steps[*seq_state->num_steps].params.set_odm_combine_params.odm_slice_width = odm_slice_width;
1636 seq_state->steps[*seq_state->num_steps].params.set_odm_combine_params.last_odm_slice_width = last_odm_slice_width;
1637 seq_state->steps[*seq_state->num_steps].func = OPTC_SET_ODM_COMBINE;
1638 (*seq_state->num_steps)++;
1639 }
1640 }
1641
1642 /*
1643 * Helper function to add OPTC set ODM bypass to block sequence
1644 */
hwss_add_optc_set_odm_bypass(struct block_sequence_state * seq_state,struct timing_generator * tg,struct dc_crtc_timing * timing)1645 void hwss_add_optc_set_odm_bypass(struct block_sequence_state *seq_state,
1646 struct timing_generator *tg, struct dc_crtc_timing *timing)
1647 {
1648 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1649 seq_state->steps[*seq_state->num_steps].params.set_odm_bypass_params.tg = tg;
1650 seq_state->steps[*seq_state->num_steps].params.set_odm_bypass_params.timing = timing;
1651 seq_state->steps[*seq_state->num_steps].func = OPTC_SET_ODM_BYPASS;
1652 (*seq_state->num_steps)++;
1653 }
1654 }
1655
hwss_send_dmcub_cmd(union block_sequence_params * params)1656 void hwss_send_dmcub_cmd(union block_sequence_params *params)
1657 {
1658 struct dc_context *ctx = params->send_dmcub_cmd_params.ctx;
1659 union dmub_rb_cmd *cmd = params->send_dmcub_cmd_params.cmd;
1660 enum dm_dmub_wait_type wait_type = params->send_dmcub_cmd_params.wait_type;
1661
1662 dc_wake_and_execute_dmub_cmd(ctx, cmd, wait_type);
1663 }
1664
1665 /*
1666 * Helper function to add TG program global sync to block sequence
1667 */
hwss_add_tg_program_global_sync(struct block_sequence_state * seq_state,struct timing_generator * tg,int vready_offset,unsigned int vstartup_lines,unsigned int vupdate_offset_pixels,unsigned int vupdate_vupdate_width_pixels,unsigned int pstate_keepout_start_lines)1668 void hwss_add_tg_program_global_sync(struct block_sequence_state *seq_state,
1669 struct timing_generator *tg,
1670 int vready_offset,
1671 unsigned int vstartup_lines,
1672 unsigned int vupdate_offset_pixels,
1673 unsigned int vupdate_vupdate_width_pixels,
1674 unsigned int pstate_keepout_start_lines)
1675 {
1676 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1677 seq_state->steps[*seq_state->num_steps].params.tg_program_global_sync_params.tg = tg;
1678 seq_state->steps[*seq_state->num_steps].params.tg_program_global_sync_params.vready_offset = vready_offset;
1679 seq_state->steps[*seq_state->num_steps].params.tg_program_global_sync_params.vstartup_lines = vstartup_lines;
1680 seq_state->steps[*seq_state->num_steps].params.tg_program_global_sync_params.vupdate_offset_pixels = vupdate_offset_pixels;
1681 seq_state->steps[*seq_state->num_steps].params.tg_program_global_sync_params.vupdate_vupdate_width_pixels = vupdate_vupdate_width_pixels;
1682 seq_state->steps[*seq_state->num_steps].params.tg_program_global_sync_params.pstate_keepout_start_lines = pstate_keepout_start_lines;
1683 seq_state->steps[*seq_state->num_steps].func = TG_PROGRAM_GLOBAL_SYNC;
1684 (*seq_state->num_steps)++;
1685 }
1686 }
1687
1688 /*
1689 * Helper function to add TG wait for state to block sequence
1690 */
hwss_add_tg_wait_for_state(struct block_sequence_state * seq_state,struct timing_generator * tg,enum crtc_state state)1691 void hwss_add_tg_wait_for_state(struct block_sequence_state *seq_state,
1692 struct timing_generator *tg,
1693 enum crtc_state state)
1694 {
1695 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1696 seq_state->steps[*seq_state->num_steps].params.tg_wait_for_state_params.tg = tg;
1697 seq_state->steps[*seq_state->num_steps].params.tg_wait_for_state_params.state = state;
1698 seq_state->steps[*seq_state->num_steps].func = TG_WAIT_FOR_STATE;
1699 (*seq_state->num_steps)++;
1700 }
1701 }
1702
1703 /*
1704 * Helper function to add TG set VTG params to block sequence
1705 */
hwss_add_tg_set_vtg_params(struct block_sequence_state * seq_state,struct timing_generator * tg,struct dc_crtc_timing * dc_crtc_timing,bool program_fp2)1706 void hwss_add_tg_set_vtg_params(struct block_sequence_state *seq_state,
1707 struct timing_generator *tg,
1708 struct dc_crtc_timing *dc_crtc_timing,
1709 bool program_fp2)
1710 {
1711 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1712 seq_state->steps[*seq_state->num_steps].params.tg_set_vtg_params_params.tg = tg;
1713 seq_state->steps[*seq_state->num_steps].params.tg_set_vtg_params_params.timing = dc_crtc_timing;
1714 seq_state->steps[*seq_state->num_steps].params.tg_set_vtg_params_params.program_fp2 = program_fp2;
1715 seq_state->steps[*seq_state->num_steps].func = TG_SET_VTG_PARAMS;
1716 (*seq_state->num_steps)++;
1717 }
1718 }
1719
1720 /*
1721 * Helper function to add TG setup vertical interrupt2 to block sequence
1722 */
hwss_add_tg_setup_vertical_interrupt2(struct block_sequence_state * seq_state,struct timing_generator * tg,int start_line)1723 void hwss_add_tg_setup_vertical_interrupt2(struct block_sequence_state *seq_state,
1724 struct timing_generator *tg, int start_line)
1725 {
1726 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1727 seq_state->steps[*seq_state->num_steps].params.tg_setup_vertical_interrupt2_params.tg = tg;
1728 seq_state->steps[*seq_state->num_steps].params.tg_setup_vertical_interrupt2_params.start_line = start_line;
1729 seq_state->steps[*seq_state->num_steps].func = TG_SETUP_VERTICAL_INTERRUPT2;
1730 (*seq_state->num_steps)++;
1731 }
1732 }
1733
1734 /*
1735 * Helper function to add DPP set HDR multiplier to block sequence
1736 */
hwss_add_dpp_set_hdr_multiplier(struct block_sequence_state * seq_state,struct dpp * dpp,uint32_t hw_mult)1737 void hwss_add_dpp_set_hdr_multiplier(struct block_sequence_state *seq_state,
1738 struct dpp *dpp, uint32_t hw_mult)
1739 {
1740 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1741 seq_state->steps[*seq_state->num_steps].params.dpp_set_hdr_multiplier_params.dpp = dpp;
1742 seq_state->steps[*seq_state->num_steps].params.dpp_set_hdr_multiplier_params.hw_mult = hw_mult;
1743 seq_state->steps[*seq_state->num_steps].func = DPP_SET_HDR_MULTIPLIER;
1744 (*seq_state->num_steps)++;
1745 }
1746 }
1747
1748 /*
1749 * Helper function to add HUBP program DET size to block sequence
1750 */
hwss_add_hubp_program_det_size(struct block_sequence_state * seq_state,struct hubbub * hubbub,unsigned int hubp_inst,unsigned int det_buffer_size_kb)1751 void hwss_add_hubp_program_det_size(struct block_sequence_state *seq_state,
1752 struct hubbub *hubbub,
1753 unsigned int hubp_inst,
1754 unsigned int det_buffer_size_kb)
1755 {
1756 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1757 seq_state->steps[*seq_state->num_steps].params.program_det_size_params.hubbub = hubbub;
1758 seq_state->steps[*seq_state->num_steps].params.program_det_size_params.hubp_inst = hubp_inst;
1759 seq_state->steps[*seq_state->num_steps].params.program_det_size_params.det_buffer_size_kb = det_buffer_size_kb;
1760 seq_state->steps[*seq_state->num_steps].func = HUBP_PROGRAM_DET_SIZE;
1761 (*seq_state->num_steps)++;
1762 }
1763 }
1764
hwss_add_hubp_program_mcache_id(struct block_sequence_state * seq_state,struct hubp * hubp,struct dml2_hubp_pipe_mcache_regs * mcache_regs)1765 void hwss_add_hubp_program_mcache_id(struct block_sequence_state *seq_state,
1766 struct hubp *hubp,
1767 struct dml2_hubp_pipe_mcache_regs *mcache_regs)
1768 {
1769 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1770 seq_state->steps[*seq_state->num_steps].params.program_mcache_id_and_split_coordinate.hubp = hubp;
1771 seq_state->steps[*seq_state->num_steps].params.program_mcache_id_and_split_coordinate.mcache_regs = mcache_regs;
1772 seq_state->steps[*seq_state->num_steps].func = HUBP_PROGRAM_MCACHE_ID;
1773 (*seq_state->num_steps)++;
1774 }
1775 }
1776
hwss_add_hubbub_force_pstate_change_control(struct block_sequence_state * seq_state,struct hubbub * hubbub,bool enable,bool wait)1777 void hwss_add_hubbub_force_pstate_change_control(struct block_sequence_state *seq_state,
1778 struct hubbub *hubbub,
1779 bool enable,
1780 bool wait)
1781 {
1782 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1783 seq_state->steps[*seq_state->num_steps].params.hubbub_force_pstate_change_control_params.hubbub = hubbub;
1784 seq_state->steps[*seq_state->num_steps].params.hubbub_force_pstate_change_control_params.enable = enable;
1785 seq_state->steps[*seq_state->num_steps].params.hubbub_force_pstate_change_control_params.wait = wait;
1786 seq_state->steps[*seq_state->num_steps].func = HUBBUB_FORCE_PSTATE_CHANGE_CONTROL;
1787 (*seq_state->num_steps)++;
1788 }
1789 }
1790
1791 /*
1792 * Helper function to add HUBP program DET segments to block sequence
1793 */
hwss_add_hubp_program_det_segments(struct block_sequence_state * seq_state,struct hubbub * hubbub,unsigned int hubp_inst,unsigned int det_size)1794 void hwss_add_hubp_program_det_segments(struct block_sequence_state *seq_state,
1795 struct hubbub *hubbub,
1796 unsigned int hubp_inst,
1797 unsigned int det_size)
1798 {
1799 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1800 seq_state->steps[*seq_state->num_steps].params.program_det_segments_params.hubbub = hubbub;
1801 seq_state->steps[*seq_state->num_steps].params.program_det_segments_params.hubp_inst = hubp_inst;
1802 seq_state->steps[*seq_state->num_steps].params.program_det_segments_params.det_size = det_size;
1803 seq_state->steps[*seq_state->num_steps].func = HUBP_PROGRAM_DET_SEGMENTS;
1804 (*seq_state->num_steps)++;
1805 }
1806 }
1807
1808 /*
1809 * Helper function to add OPP set dynamic expansion to block sequence
1810 */
hwss_add_opp_set_dyn_expansion(struct block_sequence_state * seq_state,struct output_pixel_processor * opp,enum dc_color_space color_space,enum dc_color_depth color_depth,enum signal_type signal)1811 void hwss_add_opp_set_dyn_expansion(struct block_sequence_state *seq_state,
1812 struct output_pixel_processor *opp,
1813 enum dc_color_space color_space,
1814 enum dc_color_depth color_depth,
1815 enum signal_type signal)
1816 {
1817 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1818 seq_state->steps[*seq_state->num_steps].params.opp_set_dyn_expansion_params.opp = opp;
1819 seq_state->steps[*seq_state->num_steps].params.opp_set_dyn_expansion_params.color_space = color_space;
1820 seq_state->steps[*seq_state->num_steps].params.opp_set_dyn_expansion_params.color_depth = color_depth;
1821 seq_state->steps[*seq_state->num_steps].params.opp_set_dyn_expansion_params.signal = signal;
1822 seq_state->steps[*seq_state->num_steps].func = OPP_SET_DYN_EXPANSION;
1823 (*seq_state->num_steps)++;
1824 }
1825 }
1826
1827 /*
1828 * Helper function to add OPP program FMT to block sequence
1829 */
hwss_add_opp_program_fmt(struct block_sequence_state * seq_state,struct output_pixel_processor * opp,struct bit_depth_reduction_params * fmt_bit_depth,struct clamping_and_pixel_encoding_params * clamping)1830 void hwss_add_opp_program_fmt(struct block_sequence_state *seq_state,
1831 struct output_pixel_processor *opp,
1832 struct bit_depth_reduction_params *fmt_bit_depth,
1833 struct clamping_and_pixel_encoding_params *clamping)
1834 {
1835 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1836 seq_state->steps[*seq_state->num_steps].params.opp_program_fmt_params.opp = opp;
1837 seq_state->steps[*seq_state->num_steps].params.opp_program_fmt_params.fmt_bit_depth = fmt_bit_depth;
1838 seq_state->steps[*seq_state->num_steps].params.opp_program_fmt_params.clamping = clamping;
1839 seq_state->steps[*seq_state->num_steps].func = OPP_PROGRAM_FMT;
1840 (*seq_state->num_steps)++;
1841 }
1842 }
1843
hwss_add_opp_program_left_edge_extra_pixel(struct block_sequence_state * seq_state,struct output_pixel_processor * opp,enum dc_pixel_encoding pixel_encoding,bool is_otg_master)1844 void hwss_add_opp_program_left_edge_extra_pixel(struct block_sequence_state *seq_state,
1845 struct output_pixel_processor *opp,
1846 enum dc_pixel_encoding pixel_encoding,
1847 bool is_otg_master)
1848 {
1849 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1850 seq_state->steps[*seq_state->num_steps].func = OPP_PROGRAM_LEFT_EDGE_EXTRA_PIXEL;
1851 seq_state->steps[*seq_state->num_steps].params.opp_program_left_edge_extra_pixel_params.opp = opp;
1852 seq_state->steps[*seq_state->num_steps].params.opp_program_left_edge_extra_pixel_params.pixel_encoding = pixel_encoding;
1853 seq_state->steps[*seq_state->num_steps].params.opp_program_left_edge_extra_pixel_params.is_otg_master = is_otg_master;
1854 (*seq_state->num_steps)++;
1855 }
1856 }
1857
1858 /*
1859 * Helper function to add ABM set pipe to block sequence
1860 */
hwss_add_abm_set_pipe(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * pipe_ctx)1861 void hwss_add_abm_set_pipe(struct block_sequence_state *seq_state,
1862 struct dc *dc,
1863 struct pipe_ctx *pipe_ctx)
1864 {
1865 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1866 seq_state->steps[*seq_state->num_steps].params.set_abm_pipe_params.dc = dc;
1867 seq_state->steps[*seq_state->num_steps].params.set_abm_pipe_params.pipe_ctx = pipe_ctx;
1868 seq_state->steps[*seq_state->num_steps].func = ABM_SET_PIPE;
1869 (*seq_state->num_steps)++;
1870 }
1871 }
1872
1873 /*
1874 * Helper function to add ABM set level to block sequence
1875 */
hwss_add_abm_set_level(struct block_sequence_state * seq_state,struct abm * abm,uint32_t abm_level)1876 void hwss_add_abm_set_level(struct block_sequence_state *seq_state,
1877 struct abm *abm,
1878 uint32_t abm_level)
1879 {
1880 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1881 seq_state->steps[*seq_state->num_steps].params.set_abm_level_params.abm = abm;
1882 seq_state->steps[*seq_state->num_steps].params.set_abm_level_params.abm_level = abm_level;
1883 seq_state->steps[*seq_state->num_steps].func = ABM_SET_LEVEL;
1884 (*seq_state->num_steps)++;
1885 }
1886 }
1887
1888 /*
1889 * Helper function to add TG enable CRTC to block sequence
1890 */
hwss_add_tg_enable_crtc(struct block_sequence_state * seq_state,struct timing_generator * tg)1891 void hwss_add_tg_enable_crtc(struct block_sequence_state *seq_state,
1892 struct timing_generator *tg)
1893 {
1894 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1895 seq_state->steps[*seq_state->num_steps].params.tg_enable_crtc_params.tg = tg;
1896 seq_state->steps[*seq_state->num_steps].func = TG_ENABLE_CRTC;
1897 (*seq_state->num_steps)++;
1898 }
1899 }
1900
1901 /*
1902 * Helper function to add HUBP wait flip pending to block sequence
1903 */
hwss_add_hubp_wait_flip_pending(struct block_sequence_state * seq_state,struct hubp * hubp,unsigned int timeout_us,unsigned int polling_interval_us)1904 void hwss_add_hubp_wait_flip_pending(struct block_sequence_state *seq_state,
1905 struct hubp *hubp,
1906 unsigned int timeout_us,
1907 unsigned int polling_interval_us)
1908 {
1909 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1910 seq_state->steps[*seq_state->num_steps].params.hubp_wait_flip_pending_params.hubp = hubp;
1911 seq_state->steps[*seq_state->num_steps].params.hubp_wait_flip_pending_params.timeout_us = timeout_us;
1912 seq_state->steps[*seq_state->num_steps].params.hubp_wait_flip_pending_params.polling_interval_us = polling_interval_us;
1913 seq_state->steps[*seq_state->num_steps].func = HUBP_WAIT_FLIP_PENDING;
1914 (*seq_state->num_steps)++;
1915 }
1916 }
1917
1918 /*
1919 * Helper function to add TG wait double buffer pending to block sequence
1920 */
hwss_add_tg_wait_double_buffer_pending(struct block_sequence_state * seq_state,struct timing_generator * tg,unsigned int timeout_us,unsigned int polling_interval_us)1921 void hwss_add_tg_wait_double_buffer_pending(struct block_sequence_state *seq_state,
1922 struct timing_generator *tg,
1923 unsigned int timeout_us,
1924 unsigned int polling_interval_us)
1925 {
1926 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
1927 seq_state->steps[*seq_state->num_steps].params.tg_wait_double_buffer_pending_params.tg = tg;
1928 seq_state->steps[*seq_state->num_steps].params.tg_wait_double_buffer_pending_params.timeout_us = timeout_us;
1929 seq_state->steps[*seq_state->num_steps].params.tg_wait_double_buffer_pending_params.polling_interval_us = polling_interval_us;
1930 seq_state->steps[*seq_state->num_steps].func = TG_WAIT_DOUBLE_BUFFER_PENDING;
1931 (*seq_state->num_steps)++;
1932 }
1933 }
1934
hwss_program_manual_trigger(union block_sequence_params * params)1935 void hwss_program_manual_trigger(union block_sequence_params *params)
1936 {
1937 struct pipe_ctx *pipe_ctx = params->program_manual_trigger_params.pipe_ctx;
1938
1939 if (pipe_ctx->stream_res.tg->funcs->program_manual_trigger)
1940 pipe_ctx->stream_res.tg->funcs->program_manual_trigger(pipe_ctx->stream_res.tg);
1941 }
1942
hwss_setup_dpp(union block_sequence_params * params)1943 void hwss_setup_dpp(union block_sequence_params *params)
1944 {
1945 struct pipe_ctx *pipe_ctx = params->setup_dpp_params.pipe_ctx;
1946 struct dpp *dpp = pipe_ctx->plane_res.dpp;
1947 struct dc_plane_state *plane_state = pipe_ctx->plane_state;
1948
1949 if (!plane_state)
1950 return;
1951
1952 if (dpp && dpp->funcs->dpp_setup) {
1953 // program the input csc
1954 dpp->funcs->dpp_setup(dpp,
1955 plane_state->format,
1956 EXPANSION_MODE_ZERO,
1957 plane_state->input_csc_color_matrix,
1958 plane_state->color_space,
1959 NULL);
1960 }
1961 }
1962
hwss_program_bias_and_scale(union block_sequence_params * params)1963 void hwss_program_bias_and_scale(union block_sequence_params *params)
1964 {
1965 struct pipe_ctx *pipe_ctx = params->program_bias_and_scale_params.pipe_ctx;
1966 struct dpp *dpp = pipe_ctx->plane_res.dpp;
1967 struct dc_plane_state *plane_state = pipe_ctx->plane_state;
1968 struct dc_bias_and_scale bns_params = plane_state->bias_and_scale;
1969
1970 //TODO :for CNVC set scale and bias registers if necessary
1971 if (dpp->funcs->dpp_program_bias_and_scale)
1972 dpp->funcs->dpp_program_bias_and_scale(dpp, &bns_params);
1973 }
1974
hwss_power_on_mpc_mem_pwr(union block_sequence_params * params)1975 void hwss_power_on_mpc_mem_pwr(union block_sequence_params *params)
1976 {
1977 struct mpc *mpc = params->power_on_mpc_mem_pwr_params.mpc;
1978 int mpcc_id = params->power_on_mpc_mem_pwr_params.mpcc_id;
1979 bool power_on = params->power_on_mpc_mem_pwr_params.power_on;
1980
1981 if (mpc->funcs->power_on_mpc_mem_pwr)
1982 mpc->funcs->power_on_mpc_mem_pwr(mpc, mpcc_id, power_on);
1983 }
1984
hwss_set_output_csc(union block_sequence_params * params)1985 void hwss_set_output_csc(union block_sequence_params *params)
1986 {
1987 struct mpc *mpc = params->set_output_csc_params.mpc;
1988 int opp_id = params->set_output_csc_params.opp_id;
1989 const uint16_t *matrix = params->set_output_csc_params.regval;
1990 enum mpc_output_csc_mode ocsc_mode = params->set_output_csc_params.ocsc_mode;
1991
1992 if (mpc->funcs->set_output_csc != NULL)
1993 mpc->funcs->set_output_csc(mpc,
1994 opp_id,
1995 matrix,
1996 ocsc_mode);
1997 }
1998
hwss_set_ocsc_default(union block_sequence_params * params)1999 void hwss_set_ocsc_default(union block_sequence_params *params)
2000 {
2001 struct mpc *mpc = params->set_ocsc_default_params.mpc;
2002 int opp_id = params->set_ocsc_default_params.opp_id;
2003 enum dc_color_space colorspace = params->set_ocsc_default_params.color_space;
2004 enum mpc_output_csc_mode ocsc_mode = params->set_ocsc_default_params.ocsc_mode;
2005
2006 if (mpc->funcs->set_ocsc_default != NULL)
2007 mpc->funcs->set_ocsc_default(mpc,
2008 opp_id,
2009 colorspace,
2010 ocsc_mode);
2011 }
2012
hwss_subvp_save_surf_addr(union block_sequence_params * params)2013 void hwss_subvp_save_surf_addr(union block_sequence_params *params)
2014 {
2015 struct dc_dmub_srv *dc_dmub_srv = params->subvp_save_surf_addr.dc_dmub_srv;
2016 const struct dc_plane_address *addr = params->subvp_save_surf_addr.addr;
2017 uint8_t subvp_index = params->subvp_save_surf_addr.subvp_index;
2018
2019 dc_dmub_srv_subvp_save_surf_addr(dc_dmub_srv, addr, subvp_index);
2020 }
2021
hwss_program_surface_config(union block_sequence_params * params)2022 void hwss_program_surface_config(union block_sequence_params *params)
2023 {
2024 struct hubp *hubp = params->program_surface_config_params.hubp;
2025 enum surface_pixel_format format = params->program_surface_config_params.format;
2026 struct dc_tiling_info *tiling_info = params->program_surface_config_params.tiling_info;
2027 struct plane_size size = params->program_surface_config_params.plane_size;
2028 enum dc_rotation_angle rotation = params->program_surface_config_params.rotation;
2029 struct dc_plane_dcc_param *dcc = params->program_surface_config_params.dcc;
2030 bool horizontal_mirror = params->program_surface_config_params.horizontal_mirror;
2031 int compat_level = params->program_surface_config_params.compat_level;
2032
2033 hubp->funcs->hubp_program_surface_config(
2034 hubp,
2035 format,
2036 tiling_info,
2037 &size,
2038 rotation,
2039 dcc,
2040 horizontal_mirror,
2041 compat_level);
2042
2043 hubp->power_gated = false;
2044 }
2045
hwss_program_mcache_id_and_split_coordinate(union block_sequence_params * params)2046 void hwss_program_mcache_id_and_split_coordinate(union block_sequence_params *params)
2047 {
2048 struct hubp *hubp = params->program_mcache_id_and_split_coordinate.hubp;
2049 struct dml2_hubp_pipe_mcache_regs *mcache_regs = params->program_mcache_id_and_split_coordinate.mcache_regs;
2050
2051 hubp->funcs->hubp_program_mcache_id_and_split_coordinate(hubp, mcache_regs);
2052
2053 }
2054
get_surface_tile_visual_confirm_color(struct pipe_ctx * pipe_ctx,struct tg_color * color)2055 void get_surface_tile_visual_confirm_color(
2056 struct pipe_ctx *pipe_ctx,
2057 struct tg_color *color)
2058 {
2059 uint32_t color_value = MAX_TG_COLOR_VALUE;
2060 /* Determine the overscan color based on the bottom-most plane's context */
2061 struct pipe_ctx *bottom_pipe_ctx = pipe_ctx;
2062
2063 while (bottom_pipe_ctx->bottom_pipe != NULL)
2064 bottom_pipe_ctx = bottom_pipe_ctx->bottom_pipe;
2065
2066 switch (bottom_pipe_ctx->plane_state->tiling_info.gfx9.swizzle) {
2067 case DC_SW_LINEAR:
2068 /* LINEAR Surface - set border color to red */
2069 color->color_r_cr = color_value;
2070 break;
2071 default:
2072 break;
2073 }
2074 }
2075
2076 /**
2077 * hwss_wait_for_all_blank_complete - wait for all active OPPs to finish pending blank
2078 * pattern updates
2079 *
2080 * @dc: [in] dc reference
2081 * @context: [in] hardware context in use
2082 */
hwss_wait_for_all_blank_complete(struct dc * dc,struct dc_state * context)2083 void hwss_wait_for_all_blank_complete(struct dc *dc,
2084 struct dc_state *context)
2085 {
2086 struct pipe_ctx *opp_head;
2087 struct dce_hwseq *hws = dc->hwseq;
2088 int i;
2089
2090 if (!hws->funcs.wait_for_blank_complete)
2091 return;
2092
2093 for (i = 0; i < MAX_PIPES; i++) {
2094 opp_head = &context->res_ctx.pipe_ctx[i];
2095
2096 if (!resource_is_pipe_type(opp_head, OPP_HEAD) ||
2097 dc_state_get_pipe_subvp_type(context, opp_head) == SUBVP_PHANTOM)
2098 continue;
2099
2100 hws->funcs.wait_for_blank_complete(opp_head->stream_res.opp);
2101 }
2102 }
2103
hwss_wait_for_odm_update_pending_complete(struct dc * dc,struct dc_state * context)2104 void hwss_wait_for_odm_update_pending_complete(struct dc *dc, struct dc_state *context)
2105 {
2106 struct pipe_ctx *otg_master;
2107 struct timing_generator *tg;
2108 int i;
2109
2110 for (i = 0; i < MAX_PIPES; i++) {
2111 otg_master = &context->res_ctx.pipe_ctx[i];
2112 if (!resource_is_pipe_type(otg_master, OTG_MASTER) ||
2113 dc_state_get_pipe_subvp_type(context, otg_master) == SUBVP_PHANTOM)
2114 continue;
2115 tg = otg_master->stream_res.tg;
2116 if (tg->funcs->wait_odm_doublebuffer_pending_clear)
2117 tg->funcs->wait_odm_doublebuffer_pending_clear(tg);
2118 if (tg->funcs->wait_otg_disable)
2119 tg->funcs->wait_otg_disable(tg);
2120 }
2121
2122 /* ODM update may require to reprogram blank pattern for each OPP */
2123 hwss_wait_for_all_blank_complete(dc, context);
2124 }
2125
hwss_wait_for_no_pipes_pending(struct dc * dc,struct dc_state * context)2126 void hwss_wait_for_no_pipes_pending(struct dc *dc, struct dc_state *context)
2127 {
2128 int i;
2129
2130 for (i = 0; i < MAX_PIPES; i++) {
2131 int count = 0;
2132 struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
2133
2134 if (!pipe->plane_state || dc_state_get_pipe_subvp_type(context, pipe) == SUBVP_PHANTOM)
2135 continue;
2136
2137 /* Timeout 100 ms */
2138 while (count < 100000) {
2139 /* Must set to false to start with, due to OR in update function */
2140 pipe->plane_state->status.is_flip_pending = false;
2141 dc->hwss.update_pending_status(pipe);
2142 if (!pipe->plane_state->status.is_flip_pending)
2143 break;
2144 udelay(1);
2145 count++;
2146 }
2147 ASSERT(!pipe->plane_state->status.is_flip_pending);
2148 }
2149 }
2150
hwss_wait_for_outstanding_hw_updates(struct dc * dc,struct dc_state * dc_context)2151 void hwss_wait_for_outstanding_hw_updates(struct dc *dc, struct dc_state *dc_context)
2152 {
2153 /*
2154 * This function calls HWSS to wait for any potentially double buffered
2155 * operations to complete. It should be invoked as a pre-amble prior
2156 * to full update programming before asserting any HW locks.
2157 */
2158 int pipe_idx;
2159 int opp_inst;
2160 int opp_count = dc->res_pool->res_cap->num_opp;
2161 struct hubp *hubp;
2162 int mpcc_inst;
2163 const struct pipe_ctx *pipe_ctx;
2164
2165 for (pipe_idx = 0; pipe_idx < dc->res_pool->pipe_count; pipe_idx++) {
2166 pipe_ctx = &dc_context->res_ctx.pipe_ctx[pipe_idx];
2167
2168 if (!pipe_ctx->stream)
2169 continue;
2170
2171 /* For full update we must wait for all double buffer updates, not just DRR updates. This
2172 * is particularly important for minimal transitions. Only check for OTG_MASTER pipes,
2173 * as non-OTG Master pipes share the same OTG as
2174 */
2175 if (resource_is_pipe_type(pipe_ctx, OTG_MASTER) && dc->hwss.wait_for_all_pending_updates) {
2176 dc->hwss.wait_for_all_pending_updates(pipe_ctx);
2177 }
2178
2179 hubp = pipe_ctx->plane_res.hubp;
2180 if (!hubp)
2181 continue;
2182
2183 mpcc_inst = hubp->inst;
2184 // MPCC inst is equal to pipe index in practice
2185 for (opp_inst = 0; opp_inst < opp_count; opp_inst++) {
2186 if ((dc->res_pool->opps[opp_inst] != NULL) &&
2187 (dc->res_pool->opps[opp_inst]->mpcc_disconnect_pending[mpcc_inst])) {
2188 dc->res_pool->mpc->funcs->wait_for_idle(dc->res_pool->mpc, mpcc_inst);
2189 dc->res_pool->opps[opp_inst]->mpcc_disconnect_pending[mpcc_inst] = false;
2190 break;
2191 }
2192 }
2193 }
2194 hwss_wait_for_odm_update_pending_complete(dc, dc_context);
2195 }
2196
hwss_process_outstanding_hw_updates(struct dc * dc,struct dc_state * dc_context)2197 void hwss_process_outstanding_hw_updates(struct dc *dc, struct dc_state *dc_context)
2198 {
2199 /* wait for outstanding updates */
2200 hwss_wait_for_outstanding_hw_updates(dc, dc_context);
2201
2202 /* perform outstanding post update programming */
2203 if (dc->hwss.program_outstanding_updates)
2204 dc->hwss.program_outstanding_updates(dc, dc_context);
2205 }
2206
hwss_set_odm_combine(union block_sequence_params * params)2207 void hwss_set_odm_combine(union block_sequence_params *params)
2208 {
2209 struct timing_generator *tg = params->set_odm_combine_params.tg;
2210 int *opp_inst = params->set_odm_combine_params.opp_inst;
2211 int opp_head_count = params->set_odm_combine_params.opp_head_count;
2212 int odm_slice_width = params->set_odm_combine_params.odm_slice_width;
2213 int last_odm_slice_width = params->set_odm_combine_params.last_odm_slice_width;
2214
2215 if (tg && tg->funcs->set_odm_combine)
2216 tg->funcs->set_odm_combine(tg, opp_inst, opp_head_count,
2217 odm_slice_width, last_odm_slice_width);
2218 }
2219
hwss_set_odm_bypass(union block_sequence_params * params)2220 void hwss_set_odm_bypass(union block_sequence_params *params)
2221 {
2222 struct timing_generator *tg = params->set_odm_bypass_params.tg;
2223 const struct dc_crtc_timing *timing = params->set_odm_bypass_params.timing;
2224
2225 if (tg && tg->funcs->set_odm_bypass)
2226 tg->funcs->set_odm_bypass(tg, timing);
2227 }
2228
hwss_opp_pipe_clock_control(union block_sequence_params * params)2229 void hwss_opp_pipe_clock_control(union block_sequence_params *params)
2230 {
2231 struct output_pixel_processor *opp = params->opp_pipe_clock_control_params.opp;
2232 bool enable = params->opp_pipe_clock_control_params.enable;
2233
2234 if (opp && opp->funcs->opp_pipe_clock_control)
2235 opp->funcs->opp_pipe_clock_control(opp, enable);
2236 }
2237
hwss_opp_program_left_edge_extra_pixel(union block_sequence_params * params)2238 void hwss_opp_program_left_edge_extra_pixel(union block_sequence_params *params)
2239 {
2240 struct output_pixel_processor *opp = params->opp_program_left_edge_extra_pixel_params.opp;
2241 enum dc_pixel_encoding pixel_encoding = params->opp_program_left_edge_extra_pixel_params.pixel_encoding;
2242 bool is_otg_master = params->opp_program_left_edge_extra_pixel_params.is_otg_master;
2243
2244 if (opp && opp->funcs->opp_program_left_edge_extra_pixel)
2245 opp->funcs->opp_program_left_edge_extra_pixel(opp, pixel_encoding, is_otg_master);
2246 }
2247
hwss_dccg_set_dto_dscclk(union block_sequence_params * params)2248 void hwss_dccg_set_dto_dscclk(union block_sequence_params *params)
2249 {
2250 struct dccg *dccg = params->dccg_set_dto_dscclk_params.dccg;
2251 int inst = params->dccg_set_dto_dscclk_params.inst;
2252 int num_slices_h = params->dccg_set_dto_dscclk_params.num_slices_h;
2253
2254 if (dccg && dccg->funcs->set_dto_dscclk)
2255 dccg->funcs->set_dto_dscclk(dccg, inst, num_slices_h);
2256 }
2257
hwss_dsc_set_config(union block_sequence_params * params)2258 void hwss_dsc_set_config(union block_sequence_params *params)
2259 {
2260 struct display_stream_compressor *dsc = params->dsc_set_config_params.dsc;
2261 struct dsc_config *dsc_cfg = params->dsc_set_config_params.dsc_cfg;
2262 struct dsc_optc_config *dsc_optc_cfg = params->dsc_set_config_params.dsc_optc_cfg;
2263
2264 if (dsc && dsc->funcs->dsc_set_config)
2265 dsc->funcs->dsc_set_config(dsc, dsc_cfg, dsc_optc_cfg);
2266 }
2267
hwss_dsc_enable(union block_sequence_params * params)2268 void hwss_dsc_enable(union block_sequence_params *params)
2269 {
2270 struct display_stream_compressor *dsc = params->dsc_enable_params.dsc;
2271 int opp_inst = params->dsc_enable_params.opp_inst;
2272
2273 if (dsc && dsc->funcs->dsc_enable)
2274 dsc->funcs->dsc_enable(dsc, opp_inst);
2275 }
2276
hwss_tg_set_dsc_config(union block_sequence_params * params)2277 void hwss_tg_set_dsc_config(union block_sequence_params *params)
2278 {
2279 struct timing_generator *tg = params->tg_set_dsc_config_params.tg;
2280 enum optc_dsc_mode optc_dsc_mode = OPTC_DSC_DISABLED;
2281 uint32_t bytes_per_pixel = 0;
2282 uint32_t slice_width = 0;
2283
2284 if (params->tg_set_dsc_config_params.enable) {
2285 struct dsc_optc_config *dsc_optc_cfg = params->tg_set_dsc_config_params.dsc_optc_cfg;
2286
2287 if (dsc_optc_cfg) {
2288 bytes_per_pixel = dsc_optc_cfg->bytes_per_pixel;
2289 slice_width = dsc_optc_cfg->slice_width;
2290 optc_dsc_mode = dsc_optc_cfg->is_pixel_format_444 ?
2291 OPTC_DSC_ENABLED_444 : OPTC_DSC_ENABLED_NATIVE_SUBSAMPLED;
2292 }
2293 }
2294
2295 if (tg && tg->funcs->set_dsc_config)
2296 tg->funcs->set_dsc_config(tg, optc_dsc_mode, bytes_per_pixel, slice_width);
2297 }
2298
hwss_dsc_disconnect(union block_sequence_params * params)2299 void hwss_dsc_disconnect(union block_sequence_params *params)
2300 {
2301 struct display_stream_compressor *dsc = params->dsc_disconnect_params.dsc;
2302
2303 if (dsc && dsc->funcs->dsc_disconnect)
2304 dsc->funcs->dsc_disconnect(dsc);
2305 }
2306
hwss_dsc_read_state(union block_sequence_params * params)2307 void hwss_dsc_read_state(union block_sequence_params *params)
2308 {
2309 struct display_stream_compressor *dsc = params->dsc_read_state_params.dsc;
2310 struct dcn_dsc_state *dsc_state = params->dsc_read_state_params.dsc_state;
2311
2312 if (dsc && dsc->funcs->dsc_read_state)
2313 dsc->funcs->dsc_read_state(dsc, dsc_state);
2314 }
2315
hwss_dsc_calculate_and_set_config(union block_sequence_params * params)2316 void hwss_dsc_calculate_and_set_config(union block_sequence_params *params)
2317 {
2318 struct pipe_ctx *pipe_ctx = params->dsc_calculate_and_set_config_params.pipe_ctx;
2319 struct pipe_ctx *top_pipe = pipe_ctx;
2320 bool enable = params->dsc_calculate_and_set_config_params.enable;
2321 int opp_cnt = params->dsc_calculate_and_set_config_params.opp_cnt;
2322
2323 struct display_stream_compressor *dsc = pipe_ctx->stream_res.dsc;
2324 struct dc_stream_state *stream = pipe_ctx->stream;
2325
2326 if (!dsc || !enable)
2327 return;
2328
2329 /* Calculate DSC configuration - extracted from dcn32_update_dsc_on_stream */
2330 struct dsc_config dsc_cfg;
2331
2332 while (top_pipe->prev_odm_pipe)
2333 top_pipe = top_pipe->prev_odm_pipe;
2334
2335 dsc_cfg.pic_width = (stream->timing.h_addressable + top_pipe->dsc_padding_params.dsc_hactive_padding +
2336 stream->timing.h_border_left + stream->timing.h_border_right) / opp_cnt;
2337 dsc_cfg.pic_height = stream->timing.v_addressable + stream->timing.v_border_top + stream->timing.v_border_bottom;
2338 dsc_cfg.pixel_encoding = stream->timing.pixel_encoding;
2339 dsc_cfg.color_depth = stream->timing.display_color_depth;
2340 dsc_cfg.is_odm = top_pipe->next_odm_pipe ? true : false;
2341 dsc_cfg.dc_dsc_cfg = stream->timing.dsc_cfg;
2342 dsc_cfg.dc_dsc_cfg.num_slices_h /= opp_cnt;
2343 dsc_cfg.dsc_padding = top_pipe->dsc_padding_params.dsc_hactive_padding;
2344
2345 /* Set DSC configuration */
2346 if (dsc->funcs->dsc_set_config)
2347 dsc->funcs->dsc_set_config(dsc, &dsc_cfg,
2348 ¶ms->dsc_calculate_and_set_config_params.dsc_optc_cfg);
2349 }
2350
hwss_dsc_enable_with_opp(union block_sequence_params * params)2351 void hwss_dsc_enable_with_opp(union block_sequence_params *params)
2352 {
2353 struct pipe_ctx *pipe_ctx = params->dsc_enable_with_opp_params.pipe_ctx;
2354 struct display_stream_compressor *dsc = pipe_ctx->stream_res.dsc;
2355
2356 if (dsc && dsc->funcs->dsc_enable)
2357 dsc->funcs->dsc_enable(dsc, pipe_ctx->stream_res.opp->inst);
2358 }
2359
hwss_tg_program_global_sync(union block_sequence_params * params)2360 void hwss_tg_program_global_sync(union block_sequence_params *params)
2361 {
2362 struct timing_generator *tg = params->tg_program_global_sync_params.tg;
2363 int vready_offset = params->tg_program_global_sync_params.vready_offset;
2364 unsigned int vstartup_lines = params->tg_program_global_sync_params.vstartup_lines;
2365 unsigned int vupdate_offset_pixels = params->tg_program_global_sync_params.vupdate_offset_pixels;
2366 unsigned int vupdate_vupdate_width_pixels = params->tg_program_global_sync_params.vupdate_vupdate_width_pixels;
2367 unsigned int pstate_keepout_start_lines = params->tg_program_global_sync_params.pstate_keepout_start_lines;
2368
2369 if (tg->funcs->program_global_sync) {
2370 tg->funcs->program_global_sync(tg, vready_offset, vstartup_lines,
2371 vupdate_offset_pixels, vupdate_vupdate_width_pixels, pstate_keepout_start_lines);
2372 }
2373 }
2374
hwss_tg_wait_for_state(union block_sequence_params * params)2375 void hwss_tg_wait_for_state(union block_sequence_params *params)
2376 {
2377 struct timing_generator *tg = params->tg_wait_for_state_params.tg;
2378 enum crtc_state state = params->tg_wait_for_state_params.state;
2379
2380 if (tg->funcs->wait_for_state)
2381 tg->funcs->wait_for_state(tg, state);
2382 }
2383
hwss_tg_set_vtg_params(union block_sequence_params * params)2384 void hwss_tg_set_vtg_params(union block_sequence_params *params)
2385 {
2386 struct timing_generator *tg = params->tg_set_vtg_params_params.tg;
2387 struct dc_crtc_timing *timing = params->tg_set_vtg_params_params.timing;
2388 bool program_fp2 = params->tg_set_vtg_params_params.program_fp2;
2389
2390 if (tg->funcs->set_vtg_params)
2391 tg->funcs->set_vtg_params(tg, timing, program_fp2);
2392 }
2393
hwss_tg_setup_vertical_interrupt2(union block_sequence_params * params)2394 void hwss_tg_setup_vertical_interrupt2(union block_sequence_params *params)
2395 {
2396 struct timing_generator *tg = params->tg_setup_vertical_interrupt2_params.tg;
2397 int start_line = params->tg_setup_vertical_interrupt2_params.start_line;
2398
2399 if (tg->funcs->setup_vertical_interrupt2)
2400 tg->funcs->setup_vertical_interrupt2(tg, start_line);
2401 }
2402
hwss_dpp_set_hdr_multiplier(union block_sequence_params * params)2403 void hwss_dpp_set_hdr_multiplier(union block_sequence_params *params)
2404 {
2405 struct dpp *dpp = params->dpp_set_hdr_multiplier_params.dpp;
2406 uint32_t hw_mult = params->dpp_set_hdr_multiplier_params.hw_mult;
2407
2408 if (dpp->funcs->dpp_set_hdr_multiplier)
2409 dpp->funcs->dpp_set_hdr_multiplier(dpp, hw_mult);
2410 }
2411
hwss_program_det_size(union block_sequence_params * params)2412 void hwss_program_det_size(union block_sequence_params *params)
2413 {
2414 struct hubbub *hubbub = params->program_det_size_params.hubbub;
2415 unsigned int hubp_inst = params->program_det_size_params.hubp_inst;
2416 unsigned int det_buffer_size_kb = params->program_det_size_params.det_buffer_size_kb;
2417
2418 if (hubbub->funcs->program_det_size)
2419 hubbub->funcs->program_det_size(hubbub, hubp_inst, det_buffer_size_kb);
2420 }
2421
hwss_program_det_segments(union block_sequence_params * params)2422 void hwss_program_det_segments(union block_sequence_params *params)
2423 {
2424 struct hubbub *hubbub = params->program_det_segments_params.hubbub;
2425 unsigned int hubp_inst = params->program_det_segments_params.hubp_inst;
2426 unsigned int det_size = params->program_det_segments_params.det_size;
2427
2428 if (hubbub->funcs->program_det_segments)
2429 hubbub->funcs->program_det_segments(hubbub, hubp_inst, det_size);
2430 }
2431
hwss_opp_set_dyn_expansion(union block_sequence_params * params)2432 void hwss_opp_set_dyn_expansion(union block_sequence_params *params)
2433 {
2434 struct output_pixel_processor *opp = params->opp_set_dyn_expansion_params.opp;
2435 enum dc_color_space color_space = params->opp_set_dyn_expansion_params.color_space;
2436 enum dc_color_depth color_depth = params->opp_set_dyn_expansion_params.color_depth;
2437 enum signal_type signal = params->opp_set_dyn_expansion_params.signal;
2438
2439 if (opp->funcs->opp_set_dyn_expansion)
2440 opp->funcs->opp_set_dyn_expansion(opp, color_space, color_depth, signal);
2441 }
2442
hwss_opp_program_fmt(union block_sequence_params * params)2443 void hwss_opp_program_fmt(union block_sequence_params *params)
2444 {
2445 struct output_pixel_processor *opp = params->opp_program_fmt_params.opp;
2446 struct bit_depth_reduction_params *fmt_bit_depth = params->opp_program_fmt_params.fmt_bit_depth;
2447 struct clamping_and_pixel_encoding_params *clamping = params->opp_program_fmt_params.clamping;
2448
2449 if (opp->funcs->opp_program_fmt)
2450 opp->funcs->opp_program_fmt(opp, fmt_bit_depth, clamping);
2451 }
2452
hwss_opp_program_bit_depth_reduction(union block_sequence_params * params)2453 void hwss_opp_program_bit_depth_reduction(union block_sequence_params *params)
2454 {
2455 struct output_pixel_processor *opp = params->opp_program_bit_depth_reduction_params.opp;
2456 bool use_default_params = params->opp_program_bit_depth_reduction_params.use_default_params;
2457 struct pipe_ctx *pipe_ctx = params->opp_program_bit_depth_reduction_params.pipe_ctx;
2458 struct bit_depth_reduction_params bit_depth_params;
2459
2460 if (use_default_params)
2461 memset(&bit_depth_params, 0, sizeof(bit_depth_params));
2462 else
2463 resource_build_bit_depth_reduction_params(pipe_ctx->stream, &bit_depth_params);
2464
2465 if (opp->funcs->opp_program_bit_depth_reduction)
2466 opp->funcs->opp_program_bit_depth_reduction(opp, &bit_depth_params);
2467 }
2468
hwss_opp_set_disp_pattern_generator(union block_sequence_params * params)2469 void hwss_opp_set_disp_pattern_generator(union block_sequence_params *params)
2470 {
2471 struct output_pixel_processor *opp = params->opp_set_disp_pattern_generator_params.opp;
2472 enum controller_dp_test_pattern test_pattern = params->opp_set_disp_pattern_generator_params.test_pattern;
2473 enum controller_dp_color_space color_space = params->opp_set_disp_pattern_generator_params.color_space;
2474 enum dc_color_depth color_depth = params->opp_set_disp_pattern_generator_params.color_depth;
2475 struct tg_color *solid_color = params->opp_set_disp_pattern_generator_params.use_solid_color ?
2476 ¶ms->opp_set_disp_pattern_generator_params.solid_color : NULL;
2477 int width = params->opp_set_disp_pattern_generator_params.width;
2478 int height = params->opp_set_disp_pattern_generator_params.height;
2479 int offset = params->opp_set_disp_pattern_generator_params.offset;
2480
2481 if (opp && opp->funcs->opp_set_disp_pattern_generator) {
2482 opp->funcs->opp_set_disp_pattern_generator(opp, test_pattern, color_space,
2483 color_depth, solid_color, width, height, offset);
2484 }
2485 }
2486
hwss_set_abm_pipe(union block_sequence_params * params)2487 void hwss_set_abm_pipe(union block_sequence_params *params)
2488 {
2489 struct dc *dc = params->set_abm_pipe_params.dc;
2490 struct pipe_ctx *pipe_ctx = params->set_abm_pipe_params.pipe_ctx;
2491
2492 dc->hwss.set_pipe(pipe_ctx);
2493 }
2494
hwss_set_abm_level(union block_sequence_params * params)2495 void hwss_set_abm_level(union block_sequence_params *params)
2496 {
2497 struct abm *abm = params->set_abm_level_params.abm;
2498 unsigned int abm_level = params->set_abm_level_params.abm_level;
2499
2500 if (abm->funcs->set_abm_level)
2501 abm->funcs->set_abm_level(abm, abm_level);
2502 }
2503
hwss_set_abm_immediate_disable(union block_sequence_params * params)2504 void hwss_set_abm_immediate_disable(union block_sequence_params *params)
2505 {
2506 struct dc *dc = params->set_abm_immediate_disable_params.dc;
2507 struct pipe_ctx *pipe_ctx = params->set_abm_immediate_disable_params.pipe_ctx;
2508
2509 if (dc && dc->hwss.set_abm_immediate_disable)
2510 dc->hwss.set_abm_immediate_disable(pipe_ctx);
2511 }
2512
hwss_mpc_remove_mpcc(union block_sequence_params * params)2513 void hwss_mpc_remove_mpcc(union block_sequence_params *params)
2514 {
2515 struct mpc *mpc = params->mpc_remove_mpcc_params.mpc;
2516 struct mpc_tree *mpc_tree_params = params->mpc_remove_mpcc_params.mpc_tree_params;
2517 struct mpcc *mpcc_to_remove = params->mpc_remove_mpcc_params.mpcc_to_remove;
2518
2519 mpc->funcs->remove_mpcc(mpc, mpc_tree_params, mpcc_to_remove);
2520 }
2521
hwss_opp_set_mpcc_disconnect_pending(union block_sequence_params * params)2522 void hwss_opp_set_mpcc_disconnect_pending(union block_sequence_params *params)
2523 {
2524 struct output_pixel_processor *opp = params->opp_set_mpcc_disconnect_pending_params.opp;
2525 int mpcc_inst = params->opp_set_mpcc_disconnect_pending_params.mpcc_inst;
2526 bool pending = params->opp_set_mpcc_disconnect_pending_params.pending;
2527
2528 opp->mpcc_disconnect_pending[mpcc_inst] = pending;
2529 }
2530
hwss_dc_set_optimized_required(union block_sequence_params * params)2531 void hwss_dc_set_optimized_required(union block_sequence_params *params)
2532 {
2533 struct dc *dc = params->dc_set_optimized_required_params.dc;
2534 bool optimized_required = params->dc_set_optimized_required_params.optimized_required;
2535
2536 dc->optimized_required = optimized_required;
2537 }
2538
hwss_hubp_disconnect(union block_sequence_params * params)2539 void hwss_hubp_disconnect(union block_sequence_params *params)
2540 {
2541 struct hubp *hubp = params->hubp_disconnect_params.hubp;
2542
2543 if (hubp->funcs->hubp_disconnect)
2544 hubp->funcs->hubp_disconnect(hubp);
2545 }
2546
hwss_hubbub_force_pstate_change_control(union block_sequence_params * params)2547 void hwss_hubbub_force_pstate_change_control(union block_sequence_params *params)
2548 {
2549 struct hubbub *hubbub = params->hubbub_force_pstate_change_control_params.hubbub;
2550 bool enable = params->hubbub_force_pstate_change_control_params.enable;
2551 bool wait = params->hubbub_force_pstate_change_control_params.wait;
2552
2553 if (hubbub->funcs->force_pstate_change_control) {
2554 hubbub->funcs->force_pstate_change_control(hubbub, enable, wait);
2555 /* Add delay when enabling pstate change control */
2556 if (enable)
2557 udelay(500);
2558 }
2559 }
2560
hwss_tg_enable_crtc(union block_sequence_params * params)2561 void hwss_tg_enable_crtc(union block_sequence_params *params)
2562 {
2563 struct timing_generator *tg = params->tg_enable_crtc_params.tg;
2564
2565 if (tg->funcs->enable_crtc)
2566 tg->funcs->enable_crtc(tg);
2567 }
2568
hwss_tg_set_gsl(union block_sequence_params * params)2569 void hwss_tg_set_gsl(union block_sequence_params *params)
2570 {
2571 struct timing_generator *tg = params->tg_set_gsl_params.tg;
2572 struct gsl_params *gsl = ¶ms->tg_set_gsl_params.gsl;
2573
2574 if (tg->funcs->set_gsl)
2575 tg->funcs->set_gsl(tg, gsl);
2576 }
2577
hwss_tg_set_gsl_source_select(union block_sequence_params * params)2578 void hwss_tg_set_gsl_source_select(union block_sequence_params *params)
2579 {
2580 struct timing_generator *tg = params->tg_set_gsl_source_select_params.tg;
2581 int group_idx = params->tg_set_gsl_source_select_params.group_idx;
2582 uint32_t gsl_ready_signal = params->tg_set_gsl_source_select_params.gsl_ready_signal;
2583
2584 if (tg->funcs->set_gsl_source_select)
2585 tg->funcs->set_gsl_source_select(tg, group_idx, gsl_ready_signal);
2586 }
2587
hwss_hubp_wait_flip_pending(union block_sequence_params * params)2588 void hwss_hubp_wait_flip_pending(union block_sequence_params *params)
2589 {
2590 struct hubp *hubp = params->hubp_wait_flip_pending_params.hubp;
2591 unsigned int timeout_us = params->hubp_wait_flip_pending_params.timeout_us;
2592 unsigned int polling_interval_us = params->hubp_wait_flip_pending_params.polling_interval_us;
2593 int j = 0;
2594
2595 for (j = 0; j < timeout_us / polling_interval_us
2596 && hubp->funcs->hubp_is_flip_pending(hubp); j++)
2597 udelay(polling_interval_us);
2598 }
2599
hwss_tg_wait_double_buffer_pending(union block_sequence_params * params)2600 void hwss_tg_wait_double_buffer_pending(union block_sequence_params *params)
2601 {
2602 struct timing_generator *tg = params->tg_wait_double_buffer_pending_params.tg;
2603 unsigned int timeout_us = params->tg_wait_double_buffer_pending_params.timeout_us;
2604 unsigned int polling_interval_us = params->tg_wait_double_buffer_pending_params.polling_interval_us;
2605 int j = 0;
2606
2607 if (tg->funcs->get_optc_double_buffer_pending) {
2608 for (j = 0; j < timeout_us / polling_interval_us
2609 && tg->funcs->get_optc_double_buffer_pending(tg); j++)
2610 udelay(polling_interval_us);
2611 }
2612 }
2613
hwss_update_force_pstate(union block_sequence_params * params)2614 void hwss_update_force_pstate(union block_sequence_params *params)
2615 {
2616 struct dc *dc = params->update_force_pstate_params.dc;
2617 struct dc_state *context = params->update_force_pstate_params.context;
2618 struct dce_hwseq *hwseq = dc->hwseq;
2619
2620 if (hwseq->funcs.update_force_pstate)
2621 hwseq->funcs.update_force_pstate(dc, context);
2622 }
2623
hwss_hubbub_apply_dedcn21_147_wa(union block_sequence_params * params)2624 void hwss_hubbub_apply_dedcn21_147_wa(union block_sequence_params *params)
2625 {
2626 struct hubbub *hubbub = params->hubbub_apply_dedcn21_147_wa_params.hubbub;
2627
2628 hubbub->funcs->apply_DEDCN21_147_wa(hubbub);
2629 }
2630
hwss_hubbub_allow_self_refresh_control(union block_sequence_params * params)2631 void hwss_hubbub_allow_self_refresh_control(union block_sequence_params *params)
2632 {
2633 struct hubbub *hubbub = params->hubbub_allow_self_refresh_control_params.hubbub;
2634 bool allow = params->hubbub_allow_self_refresh_control_params.allow;
2635
2636 hubbub->funcs->allow_self_refresh_control(hubbub, allow);
2637
2638 if (!allow && params->hubbub_allow_self_refresh_control_params.disallow_self_refresh_applied)
2639 *params->hubbub_allow_self_refresh_control_params.disallow_self_refresh_applied = true;
2640 }
2641
hwss_tg_get_frame_count(union block_sequence_params * params)2642 void hwss_tg_get_frame_count(union block_sequence_params *params)
2643 {
2644 struct timing_generator *tg = params->tg_get_frame_count_params.tg;
2645 unsigned int *frame_count = params->tg_get_frame_count_params.frame_count;
2646
2647 *frame_count = tg->funcs->get_frame_count(tg);
2648 }
2649
hwss_mpc_set_dwb_mux(union block_sequence_params * params)2650 void hwss_mpc_set_dwb_mux(union block_sequence_params *params)
2651 {
2652 struct mpc *mpc = params->mpc_set_dwb_mux_params.mpc;
2653 int dwb_id = params->mpc_set_dwb_mux_params.dwb_id;
2654 int mpcc_id = params->mpc_set_dwb_mux_params.mpcc_id;
2655
2656 if (mpc->funcs->set_dwb_mux)
2657 mpc->funcs->set_dwb_mux(mpc, dwb_id, mpcc_id);
2658 }
2659
hwss_mpc_disable_dwb_mux(union block_sequence_params * params)2660 void hwss_mpc_disable_dwb_mux(union block_sequence_params *params)
2661 {
2662 struct mpc *mpc = params->mpc_disable_dwb_mux_params.mpc;
2663 unsigned int dwb_id = params->mpc_disable_dwb_mux_params.dwb_id;
2664
2665 if (mpc->funcs->disable_dwb_mux)
2666 mpc->funcs->disable_dwb_mux(mpc, dwb_id);
2667 }
2668
hwss_mcif_wb_config_buf(union block_sequence_params * params)2669 void hwss_mcif_wb_config_buf(union block_sequence_params *params)
2670 {
2671 struct mcif_wb *mcif_wb = params->mcif_wb_config_buf_params.mcif_wb;
2672 struct mcif_buf_params *mcif_buf_params = params->mcif_wb_config_buf_params.mcif_buf_params;
2673 unsigned int dest_height = params->mcif_wb_config_buf_params.dest_height;
2674
2675 if (mcif_wb->funcs->config_mcif_buf)
2676 mcif_wb->funcs->config_mcif_buf(mcif_wb, mcif_buf_params, dest_height);
2677 }
2678
hwss_mcif_wb_config_arb(union block_sequence_params * params)2679 void hwss_mcif_wb_config_arb(union block_sequence_params *params)
2680 {
2681 struct mcif_wb *mcif_wb = params->mcif_wb_config_arb_params.mcif_wb;
2682 struct mcif_arb_params *mcif_arb_params = params->mcif_wb_config_arb_params.mcif_arb_params;
2683
2684 if (mcif_wb->funcs->config_mcif_arb)
2685 mcif_wb->funcs->config_mcif_arb(mcif_wb, mcif_arb_params);
2686 }
2687
hwss_mcif_wb_enable(union block_sequence_params * params)2688 void hwss_mcif_wb_enable(union block_sequence_params *params)
2689 {
2690 struct mcif_wb *mcif_wb = params->mcif_wb_enable_params.mcif_wb;
2691
2692 if (mcif_wb->funcs->enable_mcif)
2693 mcif_wb->funcs->enable_mcif(mcif_wb);
2694 }
2695
hwss_mcif_wb_disable(union block_sequence_params * params)2696 void hwss_mcif_wb_disable(union block_sequence_params *params)
2697 {
2698 struct mcif_wb *mcif_wb = params->mcif_wb_disable_params.mcif_wb;
2699
2700 if (mcif_wb->funcs->disable_mcif)
2701 mcif_wb->funcs->disable_mcif(mcif_wb);
2702 }
2703
hwss_dwbc_enable(union block_sequence_params * params)2704 void hwss_dwbc_enable(union block_sequence_params *params)
2705 {
2706 struct dwbc *dwb = params->dwbc_enable_params.dwb;
2707 struct dc_dwb_params *dwb_params = params->dwbc_enable_params.dwb_params;
2708
2709 if (dwb->funcs->enable)
2710 dwb->funcs->enable(dwb, dwb_params);
2711 }
2712
hwss_dwbc_disable(union block_sequence_params * params)2713 void hwss_dwbc_disable(union block_sequence_params *params)
2714 {
2715 struct dwbc *dwb = params->dwbc_disable_params.dwb;
2716
2717 if (dwb->funcs->disable)
2718 dwb->funcs->disable(dwb);
2719 }
2720
hwss_dwbc_update(union block_sequence_params * params)2721 void hwss_dwbc_update(union block_sequence_params *params)
2722 {
2723 struct dwbc *dwb = params->dwbc_update_params.dwb;
2724 struct dc_dwb_params *dwb_params = params->dwbc_update_params.dwb_params;
2725
2726 if (dwb->funcs->update)
2727 dwb->funcs->update(dwb, dwb_params);
2728 }
2729
hwss_hubp_update_mall_sel(union block_sequence_params * params)2730 void hwss_hubp_update_mall_sel(union block_sequence_params *params)
2731 {
2732 struct hubp *hubp = params->hubp_update_mall_sel_params.hubp;
2733 uint32_t mall_sel = params->hubp_update_mall_sel_params.mall_sel;
2734 bool cache_cursor = params->hubp_update_mall_sel_params.cache_cursor;
2735
2736 if (hubp && hubp->funcs->hubp_update_mall_sel)
2737 hubp->funcs->hubp_update_mall_sel(hubp, mall_sel, cache_cursor);
2738 }
2739
hwss_hubp_prepare_subvp_buffering(union block_sequence_params * params)2740 void hwss_hubp_prepare_subvp_buffering(union block_sequence_params *params)
2741 {
2742 struct hubp *hubp = params->hubp_prepare_subvp_buffering_params.hubp;
2743 bool enable = params->hubp_prepare_subvp_buffering_params.enable;
2744
2745 if (hubp && hubp->funcs->hubp_prepare_subvp_buffering)
2746 hubp->funcs->hubp_prepare_subvp_buffering(hubp, enable);
2747 }
2748
hwss_hubp_set_blank_en(union block_sequence_params * params)2749 void hwss_hubp_set_blank_en(union block_sequence_params *params)
2750 {
2751 struct hubp *hubp = params->hubp_set_blank_en_params.hubp;
2752 bool enable = params->hubp_set_blank_en_params.enable;
2753
2754 if (hubp && hubp->funcs->set_hubp_blank_en)
2755 hubp->funcs->set_hubp_blank_en(hubp, enable);
2756 }
2757
hwss_hubp_disable_control(union block_sequence_params * params)2758 void hwss_hubp_disable_control(union block_sequence_params *params)
2759 {
2760 struct hubp *hubp = params->hubp_disable_control_params.hubp;
2761 bool disable = params->hubp_disable_control_params.disable;
2762
2763 if (hubp && hubp->funcs->hubp_disable_control)
2764 hubp->funcs->hubp_disable_control(hubp, disable);
2765 }
2766
hwss_hubbub_soft_reset(union block_sequence_params * params)2767 void hwss_hubbub_soft_reset(union block_sequence_params *params)
2768 {
2769 struct hubbub *hubbub = params->hubbub_soft_reset_params.hubbub;
2770 bool reset = params->hubbub_soft_reset_params.reset;
2771
2772 if (hubbub)
2773 params->hubbub_soft_reset_params.hubbub_soft_reset(hubbub, reset);
2774 }
2775
hwss_hubp_clk_cntl(union block_sequence_params * params)2776 void hwss_hubp_clk_cntl(union block_sequence_params *params)
2777 {
2778 struct hubp *hubp = params->hubp_clk_cntl_params.hubp;
2779 bool enable = params->hubp_clk_cntl_params.enable;
2780
2781 if (hubp && hubp->funcs->hubp_clk_cntl) {
2782 hubp->funcs->hubp_clk_cntl(hubp, enable);
2783 hubp->power_gated = !enable;
2784 }
2785 }
2786
hwss_hubp_init(union block_sequence_params * params)2787 void hwss_hubp_init(union block_sequence_params *params)
2788 {
2789 struct hubp *hubp = params->hubp_init_params.hubp;
2790
2791 if (hubp && hubp->funcs->hubp_init)
2792 hubp->funcs->hubp_init(hubp);
2793 }
2794
hwss_hubp_set_vm_system_aperture_settings(union block_sequence_params * params)2795 void hwss_hubp_set_vm_system_aperture_settings(union block_sequence_params *params)
2796 {
2797 struct hubp *hubp = params->hubp_set_vm_system_aperture_settings_params.hubp;
2798 struct vm_system_aperture_param apt;
2799
2800 apt.sys_default = params->hubp_set_vm_system_aperture_settings_params.sys_default;
2801 apt.sys_high = params->hubp_set_vm_system_aperture_settings_params.sys_high;
2802 apt.sys_low = params->hubp_set_vm_system_aperture_settings_params.sys_low;
2803
2804 if (hubp && hubp->funcs->hubp_set_vm_system_aperture_settings)
2805 hubp->funcs->hubp_set_vm_system_aperture_settings(hubp, &apt);
2806 }
2807
hwss_hubp_set_flip_int(union block_sequence_params * params)2808 void hwss_hubp_set_flip_int(union block_sequence_params *params)
2809 {
2810 struct hubp *hubp = params->hubp_set_flip_int_params.hubp;
2811
2812 if (hubp && hubp->funcs->hubp_set_flip_int)
2813 hubp->funcs->hubp_set_flip_int(hubp);
2814 }
2815
hwss_dpp_dppclk_control(union block_sequence_params * params)2816 void hwss_dpp_dppclk_control(union block_sequence_params *params)
2817 {
2818 struct dpp *dpp = params->dpp_dppclk_control_params.dpp;
2819 bool dppclk_div = params->dpp_dppclk_control_params.dppclk_div;
2820 bool enable = params->dpp_dppclk_control_params.enable;
2821
2822 if (dpp && dpp->funcs->dpp_dppclk_control)
2823 dpp->funcs->dpp_dppclk_control(dpp, dppclk_div, enable);
2824 }
2825
hwss_disable_phantom_crtc(union block_sequence_params * params)2826 void hwss_disable_phantom_crtc(union block_sequence_params *params)
2827 {
2828 struct timing_generator *tg = params->disable_phantom_crtc_params.tg;
2829
2830 if (tg && tg->funcs->disable_phantom_crtc)
2831 tg->funcs->disable_phantom_crtc(tg);
2832 }
2833
hwss_dsc_pg_status(union block_sequence_params * params)2834 void hwss_dsc_pg_status(union block_sequence_params *params)
2835 {
2836 struct dce_hwseq *hws = params->dsc_pg_status_params.hws;
2837 int dsc_inst = params->dsc_pg_status_params.dsc_inst;
2838
2839 if (hws && hws->funcs.dsc_pg_status)
2840 params->dsc_pg_status_params.is_ungated = hws->funcs.dsc_pg_status(hws, dsc_inst);
2841 }
2842
hwss_dsc_wait_disconnect_pending_clear(union block_sequence_params * params)2843 void hwss_dsc_wait_disconnect_pending_clear(union block_sequence_params *params)
2844 {
2845 struct display_stream_compressor *dsc = params->dsc_wait_disconnect_pending_clear_params.dsc;
2846
2847 if (!params->dsc_wait_disconnect_pending_clear_params.is_ungated)
2848 return;
2849 if (*params->dsc_wait_disconnect_pending_clear_params.is_ungated == false)
2850 return;
2851
2852 if (dsc && dsc->funcs->dsc_wait_disconnect_pending_clear)
2853 dsc->funcs->dsc_wait_disconnect_pending_clear(dsc);
2854 }
2855
hwss_dsc_disable(union block_sequence_params * params)2856 void hwss_dsc_disable(union block_sequence_params *params)
2857 {
2858 struct display_stream_compressor *dsc = params->dsc_disable_params.dsc;
2859
2860 if (!params->dsc_disable_params.is_ungated)
2861 return;
2862 if (*params->dsc_disable_params.is_ungated == false)
2863 return;
2864
2865 if (dsc && dsc->funcs->dsc_disable)
2866 dsc->funcs->dsc_disable(dsc);
2867 }
2868
hwss_dccg_set_ref_dscclk(union block_sequence_params * params)2869 void hwss_dccg_set_ref_dscclk(union block_sequence_params *params)
2870 {
2871 struct dccg *dccg = params->dccg_set_ref_dscclk_params.dccg;
2872 int dsc_inst = params->dccg_set_ref_dscclk_params.dsc_inst;
2873
2874 if (!params->dccg_set_ref_dscclk_params.is_ungated)
2875 return;
2876 if (*params->dccg_set_ref_dscclk_params.is_ungated == false)
2877 return;
2878
2879 if (dccg && dccg->funcs->set_ref_dscclk)
2880 dccg->funcs->set_ref_dscclk(dccg, dsc_inst);
2881 }
2882
hwss_dpp_pg_control(union block_sequence_params * params)2883 void hwss_dpp_pg_control(union block_sequence_params *params)
2884 {
2885 struct dce_hwseq *hws = params->dpp_pg_control_params.hws;
2886 unsigned int dpp_inst = params->dpp_pg_control_params.dpp_inst;
2887 bool power_on = params->dpp_pg_control_params.power_on;
2888
2889 if (hws->funcs.dpp_pg_control)
2890 hws->funcs.dpp_pg_control(hws, dpp_inst, power_on);
2891 }
2892
hwss_hubp_pg_control(union block_sequence_params * params)2893 void hwss_hubp_pg_control(union block_sequence_params *params)
2894 {
2895 struct dce_hwseq *hws = params->hubp_pg_control_params.hws;
2896 unsigned int hubp_inst = params->hubp_pg_control_params.hubp_inst;
2897 bool power_on = params->hubp_pg_control_params.power_on;
2898
2899 if (hws->funcs.hubp_pg_control)
2900 hws->funcs.hubp_pg_control(hws, hubp_inst, power_on);
2901 }
2902
hwss_hubp_reset(union block_sequence_params * params)2903 void hwss_hubp_reset(union block_sequence_params *params)
2904 {
2905 struct hubp *hubp = params->hubp_reset_params.hubp;
2906
2907 if (hubp && hubp->funcs->hubp_reset)
2908 hubp->funcs->hubp_reset(hubp);
2909 }
2910
hwss_dpp_reset(union block_sequence_params * params)2911 void hwss_dpp_reset(union block_sequence_params *params)
2912 {
2913 struct dpp *dpp = params->dpp_reset_params.dpp;
2914
2915 if (dpp && dpp->funcs->dpp_reset)
2916 dpp->funcs->dpp_reset(dpp);
2917 }
2918
hwss_dpp_root_clock_control(union block_sequence_params * params)2919 void hwss_dpp_root_clock_control(union block_sequence_params *params)
2920 {
2921 struct dce_hwseq *hws = params->dpp_root_clock_control_params.hws;
2922 unsigned int dpp_inst = params->dpp_root_clock_control_params.dpp_inst;
2923 bool clock_on = params->dpp_root_clock_control_params.clock_on;
2924
2925 if (hws->funcs.dpp_root_clock_control)
2926 hws->funcs.dpp_root_clock_control(hws, dpp_inst, clock_on);
2927 }
2928
hwss_dc_ip_request_cntl(union block_sequence_params * params)2929 void hwss_dc_ip_request_cntl(union block_sequence_params *params)
2930 {
2931 struct dc *dc = params->dc_ip_request_cntl_params.dc;
2932 bool enable = params->dc_ip_request_cntl_params.enable;
2933 struct dce_hwseq *hws = dc->hwseq;
2934
2935 if (hws->funcs.dc_ip_request_cntl)
2936 hws->funcs.dc_ip_request_cntl(dc, enable);
2937 }
2938
hwss_dccg_update_dpp_dto(union block_sequence_params * params)2939 void hwss_dccg_update_dpp_dto(union block_sequence_params *params)
2940 {
2941 struct dccg *dccg = params->dccg_update_dpp_dto_params.dccg;
2942 int dpp_inst = params->dccg_update_dpp_dto_params.dpp_inst;
2943 int dppclk_khz = params->dccg_update_dpp_dto_params.dppclk_khz;
2944
2945 if (dccg && dccg->funcs->update_dpp_dto)
2946 dccg->funcs->update_dpp_dto(dccg, dpp_inst, dppclk_khz);
2947 }
2948
hwss_hubp_vtg_sel(union block_sequence_params * params)2949 void hwss_hubp_vtg_sel(union block_sequence_params *params)
2950 {
2951 struct hubp *hubp = params->hubp_vtg_sel_params.hubp;
2952 uint32_t otg_inst = params->hubp_vtg_sel_params.otg_inst;
2953
2954 if (hubp && hubp->funcs->hubp_vtg_sel)
2955 hubp->funcs->hubp_vtg_sel(hubp, otg_inst);
2956 }
2957
hwss_hubp_setup2(union block_sequence_params * params)2958 void hwss_hubp_setup2(union block_sequence_params *params)
2959 {
2960 struct hubp *hubp = params->hubp_setup2_params.hubp;
2961 struct dml2_dchub_per_pipe_register_set *hubp_regs = params->hubp_setup2_params.hubp_regs;
2962 union dml2_global_sync_programming *global_sync = params->hubp_setup2_params.global_sync;
2963 struct dc_crtc_timing *timing = params->hubp_setup2_params.timing;
2964
2965 if (hubp && hubp->funcs->hubp_setup2)
2966 hubp->funcs->hubp_setup2(hubp, hubp_regs, global_sync, timing);
2967 }
2968
hwss_hubp_setup(union block_sequence_params * params)2969 void hwss_hubp_setup(union block_sequence_params *params)
2970 {
2971 struct hubp *hubp = params->hubp_setup_params.hubp;
2972 struct _vcs_dpi_display_dlg_regs_st *dlg_regs = params->hubp_setup_params.dlg_regs;
2973 struct _vcs_dpi_display_ttu_regs_st *ttu_regs = params->hubp_setup_params.ttu_regs;
2974 struct _vcs_dpi_display_rq_regs_st *rq_regs = params->hubp_setup_params.rq_regs;
2975 struct _vcs_dpi_display_pipe_dest_params_st *pipe_dest = params->hubp_setup_params.pipe_dest;
2976
2977 if (hubp && hubp->funcs->hubp_setup)
2978 hubp->funcs->hubp_setup(hubp, dlg_regs, ttu_regs, rq_regs, pipe_dest);
2979 }
2980
hwss_hubp_set_unbounded_requesting(union block_sequence_params * params)2981 void hwss_hubp_set_unbounded_requesting(union block_sequence_params *params)
2982 {
2983 struct hubp *hubp = params->hubp_set_unbounded_requesting_params.hubp;
2984 bool unbounded_req = params->hubp_set_unbounded_requesting_params.unbounded_req;
2985
2986 if (hubp && hubp->funcs->set_unbounded_requesting)
2987 hubp->funcs->set_unbounded_requesting(hubp, unbounded_req);
2988 }
2989
hwss_hubp_setup_interdependent2(union block_sequence_params * params)2990 void hwss_hubp_setup_interdependent2(union block_sequence_params *params)
2991 {
2992 struct hubp *hubp = params->hubp_setup_interdependent2_params.hubp;
2993 struct dml2_dchub_per_pipe_register_set *hubp_regs = params->hubp_setup_interdependent2_params.hubp_regs;
2994
2995 if (hubp && hubp->funcs->hubp_setup_interdependent2)
2996 hubp->funcs->hubp_setup_interdependent2(hubp, hubp_regs);
2997 }
2998
hwss_hubp_setup_interdependent(union block_sequence_params * params)2999 void hwss_hubp_setup_interdependent(union block_sequence_params *params)
3000 {
3001 struct hubp *hubp = params->hubp_setup_interdependent_params.hubp;
3002 struct _vcs_dpi_display_dlg_regs_st *dlg_regs = params->hubp_setup_interdependent_params.dlg_regs;
3003 struct _vcs_dpi_display_ttu_regs_st *ttu_regs = params->hubp_setup_interdependent_params.ttu_regs;
3004
3005 if (hubp && hubp->funcs->hubp_setup_interdependent)
3006 hubp->funcs->hubp_setup_interdependent(hubp, dlg_regs, ttu_regs);
3007 }
3008
hwss_dpp_set_cursor_matrix(union block_sequence_params * params)3009 void hwss_dpp_set_cursor_matrix(union block_sequence_params *params)
3010 {
3011 struct dpp *dpp = params->dpp_set_cursor_matrix_params.dpp;
3012 enum dc_color_space color_space = params->dpp_set_cursor_matrix_params.color_space;
3013 struct dc_csc_transform *cursor_csc_color_matrix = params->dpp_set_cursor_matrix_params.cursor_csc_color_matrix;
3014
3015 if (dpp && dpp->funcs->set_cursor_matrix)
3016 dpp->funcs->set_cursor_matrix(dpp, color_space, *cursor_csc_color_matrix);
3017 }
3018
hwss_mpc_update_mpcc(union block_sequence_params * params)3019 void hwss_mpc_update_mpcc(union block_sequence_params *params)
3020 {
3021 struct dc *dc = params->mpc_update_mpcc_params.dc;
3022 struct pipe_ctx *pipe_ctx = params->mpc_update_mpcc_params.pipe_ctx;
3023 struct dce_hwseq *hws = dc->hwseq;
3024
3025 if (hws->funcs.update_mpcc)
3026 hws->funcs.update_mpcc(dc, pipe_ctx);
3027 }
3028
hwss_mpc_update_blending(union block_sequence_params * params)3029 void hwss_mpc_update_blending(union block_sequence_params *params)
3030 {
3031 struct mpc *mpc = params->mpc_update_blending_params.mpc;
3032 struct mpcc_blnd_cfg *blnd_cfg = ¶ms->mpc_update_blending_params.blnd_cfg;
3033 int mpcc_id = params->mpc_update_blending_params.mpcc_id;
3034
3035 if (mpc && mpc->funcs->update_blending)
3036 mpc->funcs->update_blending(mpc, blnd_cfg, mpcc_id);
3037 }
3038
hwss_mpc_assert_idle_mpcc(union block_sequence_params * params)3039 void hwss_mpc_assert_idle_mpcc(union block_sequence_params *params)
3040 {
3041 struct mpc *mpc = params->mpc_assert_idle_mpcc_params.mpc;
3042 int mpcc_id = params->mpc_assert_idle_mpcc_params.mpcc_id;
3043
3044 if (mpc && mpc->funcs->wait_for_idle)
3045 mpc->funcs->wait_for_idle(mpc, mpcc_id);
3046 }
3047
hwss_mpc_insert_plane(union block_sequence_params * params)3048 void hwss_mpc_insert_plane(union block_sequence_params *params)
3049 {
3050 struct mpc *mpc = params->mpc_insert_plane_params.mpc;
3051 struct mpc_tree *tree = params->mpc_insert_plane_params.mpc_tree_params;
3052 struct mpcc_blnd_cfg *blnd_cfg = ¶ms->mpc_insert_plane_params.blnd_cfg;
3053 struct mpcc_sm_cfg *sm_cfg = params->mpc_insert_plane_params.sm_cfg;
3054 struct mpcc *insert_above_mpcc = params->mpc_insert_plane_params.insert_above_mpcc;
3055 int mpcc_id = params->mpc_insert_plane_params.mpcc_id;
3056 int dpp_id = params->mpc_insert_plane_params.dpp_id;
3057
3058 if (mpc && mpc->funcs->insert_plane)
3059 mpc->funcs->insert_plane(mpc, tree, blnd_cfg, sm_cfg, insert_above_mpcc,
3060 dpp_id, mpcc_id);
3061 }
3062
hwss_dpp_set_scaler(union block_sequence_params * params)3063 void hwss_dpp_set_scaler(union block_sequence_params *params)
3064 {
3065 struct dpp *dpp = params->dpp_set_scaler_params.dpp;
3066 const struct scaler_data *scl_data = params->dpp_set_scaler_params.scl_data;
3067
3068 if (dpp && dpp->funcs->dpp_set_scaler)
3069 dpp->funcs->dpp_set_scaler(dpp, scl_data);
3070 }
3071
hwss_hubp_mem_program_viewport(union block_sequence_params * params)3072 void hwss_hubp_mem_program_viewport(union block_sequence_params *params)
3073 {
3074 struct hubp *hubp = params->hubp_mem_program_viewport_params.hubp;
3075 const struct rect *viewport = params->hubp_mem_program_viewport_params.viewport;
3076 const struct rect *viewport_c = params->hubp_mem_program_viewport_params.viewport_c;
3077
3078 if (hubp && hubp->funcs->mem_program_viewport)
3079 hubp->funcs->mem_program_viewport(hubp, viewport, viewport_c);
3080 }
3081
hwss_abort_cursor_offload_update(union block_sequence_params * params)3082 void hwss_abort_cursor_offload_update(union block_sequence_params *params)
3083 {
3084 struct dc *dc = params->abort_cursor_offload_update_params.dc;
3085 struct pipe_ctx *pipe_ctx = params->abort_cursor_offload_update_params.pipe_ctx;
3086
3087 if (dc && dc->hwss.abort_cursor_offload_update)
3088 dc->hwss.abort_cursor_offload_update(dc, pipe_ctx);
3089 }
3090
hwss_set_cursor_attribute(union block_sequence_params * params)3091 void hwss_set_cursor_attribute(union block_sequence_params *params)
3092 {
3093 struct dc *dc = params->set_cursor_attribute_params.dc;
3094 struct pipe_ctx *pipe_ctx = params->set_cursor_attribute_params.pipe_ctx;
3095
3096 if (dc && dc->hwss.set_cursor_attribute)
3097 dc->hwss.set_cursor_attribute(pipe_ctx);
3098 }
3099
hwss_set_cursor_position(union block_sequence_params * params)3100 void hwss_set_cursor_position(union block_sequence_params *params)
3101 {
3102 struct dc *dc = params->set_cursor_position_params.dc;
3103 struct pipe_ctx *pipe_ctx = params->set_cursor_position_params.pipe_ctx;
3104
3105 if (dc && dc->hwss.set_cursor_position)
3106 dc->hwss.set_cursor_position(pipe_ctx);
3107 }
3108
hwss_set_cursor_sdr_white_level(union block_sequence_params * params)3109 void hwss_set_cursor_sdr_white_level(union block_sequence_params *params)
3110 {
3111 struct dc *dc = params->set_cursor_sdr_white_level_params.dc;
3112 struct pipe_ctx *pipe_ctx = params->set_cursor_sdr_white_level_params.pipe_ctx;
3113
3114 if (dc && dc->hwss.set_cursor_sdr_white_level)
3115 dc->hwss.set_cursor_sdr_white_level(pipe_ctx);
3116 }
3117
hwss_program_output_csc(union block_sequence_params * params)3118 void hwss_program_output_csc(union block_sequence_params *params)
3119 {
3120 struct dc *dc = params->program_output_csc_params.dc;
3121 struct pipe_ctx *pipe_ctx = params->program_output_csc_params.pipe_ctx;
3122 enum dc_color_space colorspace = params->program_output_csc_params.colorspace;
3123 uint16_t *matrix = params->program_output_csc_params.matrix;
3124 int opp_id = params->program_output_csc_params.opp_id;
3125
3126 if (dc && dc->hwss.program_output_csc)
3127 dc->hwss.program_output_csc(dc, pipe_ctx, colorspace, matrix, opp_id);
3128 }
3129
hwss_hubp_set_blank(union block_sequence_params * params)3130 void hwss_hubp_set_blank(union block_sequence_params *params)
3131 {
3132 struct hubp *hubp = params->hubp_set_blank_params.hubp;
3133 bool blank = params->hubp_set_blank_params.blank;
3134
3135 if (hubp && hubp->funcs->set_blank)
3136 hubp->funcs->set_blank(hubp, blank);
3137 }
3138
hwss_phantom_hubp_post_enable(union block_sequence_params * params)3139 void hwss_phantom_hubp_post_enable(union block_sequence_params *params)
3140 {
3141 struct hubp *hubp = params->phantom_hubp_post_enable_params.hubp;
3142
3143 if (hubp && hubp->funcs->phantom_hubp_post_enable)
3144 hubp->funcs->phantom_hubp_post_enable(hubp);
3145 }
3146
hwss_add_dccg_set_dto_dscclk(struct block_sequence_state * seq_state,struct dccg * dccg,int inst,int num_slices_h)3147 void hwss_add_dccg_set_dto_dscclk(struct block_sequence_state *seq_state,
3148 struct dccg *dccg, int inst, int num_slices_h)
3149 {
3150 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3151 seq_state->steps[*seq_state->num_steps].func = DCCG_SET_DTO_DSCCLK;
3152 seq_state->steps[*seq_state->num_steps].params.dccg_set_dto_dscclk_params.dccg = dccg;
3153 seq_state->steps[*seq_state->num_steps].params.dccg_set_dto_dscclk_params.inst = inst;
3154 seq_state->steps[*seq_state->num_steps].params.dccg_set_dto_dscclk_params.num_slices_h = num_slices_h;
3155 (*seq_state->num_steps)++;
3156 }
3157 }
3158
hwss_add_dsc_calculate_and_set_config(struct block_sequence_state * seq_state,struct pipe_ctx * pipe_ctx,bool enable,int opp_cnt)3159 void hwss_add_dsc_calculate_and_set_config(struct block_sequence_state *seq_state,
3160 struct pipe_ctx *pipe_ctx, bool enable, int opp_cnt)
3161 {
3162 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3163 seq_state->steps[*seq_state->num_steps].func = DSC_CALCULATE_AND_SET_CONFIG;
3164 seq_state->steps[*seq_state->num_steps].params.dsc_calculate_and_set_config_params.pipe_ctx = pipe_ctx;
3165 seq_state->steps[*seq_state->num_steps].params.dsc_calculate_and_set_config_params.enable = enable;
3166 seq_state->steps[*seq_state->num_steps].params.dsc_calculate_and_set_config_params.opp_cnt = opp_cnt;
3167 (*seq_state->num_steps)++;
3168 }
3169 }
3170
hwss_add_mpc_remove_mpcc(struct block_sequence_state * seq_state,struct mpc * mpc,struct mpc_tree * mpc_tree_params,struct mpcc * mpcc_to_remove)3171 void hwss_add_mpc_remove_mpcc(struct block_sequence_state *seq_state,
3172 struct mpc *mpc, struct mpc_tree *mpc_tree_params, struct mpcc *mpcc_to_remove)
3173 {
3174 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3175 seq_state->steps[*seq_state->num_steps].func = MPC_REMOVE_MPCC;
3176 seq_state->steps[*seq_state->num_steps].params.mpc_remove_mpcc_params.mpc = mpc;
3177 seq_state->steps[*seq_state->num_steps].params.mpc_remove_mpcc_params.mpc_tree_params = mpc_tree_params;
3178 seq_state->steps[*seq_state->num_steps].params.mpc_remove_mpcc_params.mpcc_to_remove = mpcc_to_remove;
3179 (*seq_state->num_steps)++;
3180 }
3181 }
3182
hwss_add_opp_set_mpcc_disconnect_pending(struct block_sequence_state * seq_state,struct output_pixel_processor * opp,int mpcc_inst,bool pending)3183 void hwss_add_opp_set_mpcc_disconnect_pending(struct block_sequence_state *seq_state,
3184 struct output_pixel_processor *opp, int mpcc_inst, bool pending)
3185 {
3186 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3187 seq_state->steps[*seq_state->num_steps].func = OPP_SET_MPCC_DISCONNECT_PENDING;
3188 seq_state->steps[*seq_state->num_steps].params.opp_set_mpcc_disconnect_pending_params.opp = opp;
3189 seq_state->steps[*seq_state->num_steps].params.opp_set_mpcc_disconnect_pending_params.mpcc_inst = mpcc_inst;
3190 seq_state->steps[*seq_state->num_steps].params.opp_set_mpcc_disconnect_pending_params.pending = pending;
3191 (*seq_state->num_steps)++;
3192 }
3193 }
3194
hwss_add_hubp_disconnect(struct block_sequence_state * seq_state,struct hubp * hubp)3195 void hwss_add_hubp_disconnect(struct block_sequence_state *seq_state,
3196 struct hubp *hubp)
3197 {
3198 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3199 seq_state->steps[*seq_state->num_steps].func = HUBP_DISCONNECT;
3200 seq_state->steps[*seq_state->num_steps].params.hubp_disconnect_params.hubp = hubp;
3201 (*seq_state->num_steps)++;
3202 }
3203 }
3204
hwss_add_dsc_enable_with_opp(struct block_sequence_state * seq_state,struct pipe_ctx * pipe_ctx)3205 void hwss_add_dsc_enable_with_opp(struct block_sequence_state *seq_state,
3206 struct pipe_ctx *pipe_ctx)
3207 {
3208 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3209 seq_state->steps[*seq_state->num_steps].func = DSC_ENABLE_WITH_OPP;
3210 seq_state->steps[*seq_state->num_steps].params.dsc_enable_with_opp_params.pipe_ctx = pipe_ctx;
3211 (*seq_state->num_steps)++;
3212 }
3213 }
3214
hwss_add_tg_set_dsc_config(struct block_sequence_state * seq_state,struct timing_generator * tg,struct dsc_optc_config * dsc_optc_cfg,bool enable)3215 void hwss_add_tg_set_dsc_config(struct block_sequence_state *seq_state,
3216 struct timing_generator *tg, struct dsc_optc_config *dsc_optc_cfg, bool enable)
3217 {
3218 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3219 seq_state->steps[*seq_state->num_steps].func = TG_SET_DSC_CONFIG;
3220 seq_state->steps[*seq_state->num_steps].params.tg_set_dsc_config_params.tg = tg;
3221 seq_state->steps[*seq_state->num_steps].params.tg_set_dsc_config_params.dsc_optc_cfg = dsc_optc_cfg;
3222 seq_state->steps[*seq_state->num_steps].params.tg_set_dsc_config_params.enable = enable;
3223 (*seq_state->num_steps)++;
3224 }
3225 }
3226
hwss_add_dsc_disconnect(struct block_sequence_state * seq_state,struct display_stream_compressor * dsc)3227 void hwss_add_dsc_disconnect(struct block_sequence_state *seq_state,
3228 struct display_stream_compressor *dsc)
3229 {
3230 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3231 seq_state->steps[*seq_state->num_steps].func = DSC_DISCONNECT;
3232 seq_state->steps[*seq_state->num_steps].params.dsc_disconnect_params.dsc = dsc;
3233 (*seq_state->num_steps)++;
3234 }
3235 }
3236
hwss_add_dc_set_optimized_required(struct block_sequence_state * seq_state,struct dc * dc,bool optimized_required)3237 void hwss_add_dc_set_optimized_required(struct block_sequence_state *seq_state,
3238 struct dc *dc, bool optimized_required)
3239 {
3240 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3241 seq_state->steps[*seq_state->num_steps].func = DC_SET_OPTIMIZED_REQUIRED;
3242 seq_state->steps[*seq_state->num_steps].params.dc_set_optimized_required_params.dc = dc;
3243 seq_state->steps[*seq_state->num_steps].params.dc_set_optimized_required_params.optimized_required = optimized_required;
3244 (*seq_state->num_steps)++;
3245 }
3246 }
3247
hwss_add_abm_set_immediate_disable(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * pipe_ctx)3248 void hwss_add_abm_set_immediate_disable(struct block_sequence_state *seq_state,
3249 struct dc *dc, struct pipe_ctx *pipe_ctx)
3250 {
3251 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3252 seq_state->steps[*seq_state->num_steps].func = ABM_SET_IMMEDIATE_DISABLE;
3253 seq_state->steps[*seq_state->num_steps].params.set_abm_immediate_disable_params.dc = dc;
3254 seq_state->steps[*seq_state->num_steps].params.set_abm_immediate_disable_params.pipe_ctx = pipe_ctx;
3255 (*seq_state->num_steps)++;
3256 }
3257 }
3258
hwss_add_opp_set_disp_pattern_generator(struct block_sequence_state * seq_state,struct output_pixel_processor * opp,enum controller_dp_test_pattern test_pattern,enum controller_dp_color_space color_space,enum dc_color_depth color_depth,struct tg_color solid_color,bool use_solid_color,int width,int height,int offset)3259 void hwss_add_opp_set_disp_pattern_generator(struct block_sequence_state *seq_state,
3260 struct output_pixel_processor *opp,
3261 enum controller_dp_test_pattern test_pattern,
3262 enum controller_dp_color_space color_space,
3263 enum dc_color_depth color_depth,
3264 struct tg_color solid_color,
3265 bool use_solid_color,
3266 int width,
3267 int height,
3268 int offset)
3269 {
3270 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3271 seq_state->steps[*seq_state->num_steps].func = OPP_SET_DISP_PATTERN_GENERATOR;
3272 seq_state->steps[*seq_state->num_steps].params.opp_set_disp_pattern_generator_params.opp = opp;
3273 seq_state->steps[*seq_state->num_steps].params.opp_set_disp_pattern_generator_params.test_pattern = test_pattern;
3274 seq_state->steps[*seq_state->num_steps].params.opp_set_disp_pattern_generator_params.color_space = color_space;
3275 seq_state->steps[*seq_state->num_steps].params.opp_set_disp_pattern_generator_params.color_depth = color_depth;
3276 seq_state->steps[*seq_state->num_steps].params.opp_set_disp_pattern_generator_params.solid_color = solid_color;
3277 seq_state->steps[*seq_state->num_steps].params.opp_set_disp_pattern_generator_params.use_solid_color = use_solid_color;
3278 seq_state->steps[*seq_state->num_steps].params.opp_set_disp_pattern_generator_params.width = width;
3279 seq_state->steps[*seq_state->num_steps].params.opp_set_disp_pattern_generator_params.height = height;
3280 seq_state->steps[*seq_state->num_steps].params.opp_set_disp_pattern_generator_params.offset = offset;
3281 (*seq_state->num_steps)++;
3282 }
3283 }
3284
3285 /*
3286 * Helper function to add MPC update blending to block sequence
3287 */
hwss_add_mpc_update_blending(struct block_sequence_state * seq_state,struct mpc * mpc,struct mpcc_blnd_cfg blnd_cfg,int mpcc_id)3288 void hwss_add_mpc_update_blending(struct block_sequence_state *seq_state,
3289 struct mpc *mpc,
3290 struct mpcc_blnd_cfg blnd_cfg,
3291 int mpcc_id)
3292 {
3293 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3294 seq_state->steps[*seq_state->num_steps].func = MPC_UPDATE_BLENDING;
3295 seq_state->steps[*seq_state->num_steps].params.mpc_update_blending_params.mpc = mpc;
3296 seq_state->steps[*seq_state->num_steps].params.mpc_update_blending_params.blnd_cfg = blnd_cfg;
3297 seq_state->steps[*seq_state->num_steps].params.mpc_update_blending_params.mpcc_id = mpcc_id;
3298 (*seq_state->num_steps)++;
3299 }
3300 }
3301
3302 /*
3303 * Helper function to add MPC insert plane to block sequence
3304 */
hwss_add_mpc_insert_plane(struct block_sequence_state * seq_state,struct mpc * mpc,struct mpc_tree * mpc_tree_params,struct mpcc_blnd_cfg blnd_cfg,struct mpcc_sm_cfg * sm_cfg,struct mpcc * insert_above_mpcc,int dpp_id,int mpcc_id)3305 void hwss_add_mpc_insert_plane(struct block_sequence_state *seq_state,
3306 struct mpc *mpc,
3307 struct mpc_tree *mpc_tree_params,
3308 struct mpcc_blnd_cfg blnd_cfg,
3309 struct mpcc_sm_cfg *sm_cfg,
3310 struct mpcc *insert_above_mpcc,
3311 int dpp_id,
3312 int mpcc_id)
3313 {
3314 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3315 seq_state->steps[*seq_state->num_steps].func = MPC_INSERT_PLANE;
3316 seq_state->steps[*seq_state->num_steps].params.mpc_insert_plane_params.mpc = mpc;
3317 seq_state->steps[*seq_state->num_steps].params.mpc_insert_plane_params.mpc_tree_params = mpc_tree_params;
3318 seq_state->steps[*seq_state->num_steps].params.mpc_insert_plane_params.blnd_cfg = blnd_cfg;
3319 seq_state->steps[*seq_state->num_steps].params.mpc_insert_plane_params.sm_cfg = sm_cfg;
3320 seq_state->steps[*seq_state->num_steps].params.mpc_insert_plane_params.insert_above_mpcc = insert_above_mpcc;
3321 seq_state->steps[*seq_state->num_steps].params.mpc_insert_plane_params.dpp_id = dpp_id;
3322 seq_state->steps[*seq_state->num_steps].params.mpc_insert_plane_params.mpcc_id = mpcc_id;
3323 (*seq_state->num_steps)++;
3324 }
3325 }
3326
3327 /*
3328 * Helper function to add MPC assert idle MPCC to block sequence
3329 */
hwss_add_mpc_assert_idle_mpcc(struct block_sequence_state * seq_state,struct mpc * mpc,int mpcc_id)3330 void hwss_add_mpc_assert_idle_mpcc(struct block_sequence_state *seq_state,
3331 struct mpc *mpc,
3332 int mpcc_id)
3333 {
3334 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3335 seq_state->steps[*seq_state->num_steps].func = MPC_ASSERT_IDLE_MPCC;
3336 seq_state->steps[*seq_state->num_steps].params.mpc_assert_idle_mpcc_params.mpc = mpc;
3337 seq_state->steps[*seq_state->num_steps].params.mpc_assert_idle_mpcc_params.mpcc_id = mpcc_id;
3338 (*seq_state->num_steps)++;
3339 }
3340 }
3341
3342 /*
3343 * Helper function to add HUBP set blank to block sequence
3344 */
hwss_add_hubp_set_blank(struct block_sequence_state * seq_state,struct hubp * hubp,bool blank)3345 void hwss_add_hubp_set_blank(struct block_sequence_state *seq_state,
3346 struct hubp *hubp,
3347 bool blank)
3348 {
3349 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3350 seq_state->steps[*seq_state->num_steps].func = HUBP_SET_BLANK;
3351 seq_state->steps[*seq_state->num_steps].params.hubp_set_blank_params.hubp = hubp;
3352 seq_state->steps[*seq_state->num_steps].params.hubp_set_blank_params.blank = blank;
3353 (*seq_state->num_steps)++;
3354 }
3355 }
3356
hwss_add_opp_program_bit_depth_reduction(struct block_sequence_state * seq_state,struct output_pixel_processor * opp,bool use_default_params,struct pipe_ctx * pipe_ctx)3357 void hwss_add_opp_program_bit_depth_reduction(struct block_sequence_state *seq_state,
3358 struct output_pixel_processor *opp,
3359 bool use_default_params,
3360 struct pipe_ctx *pipe_ctx)
3361 {
3362 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3363 seq_state->steps[*seq_state->num_steps].func = OPP_PROGRAM_BIT_DEPTH_REDUCTION;
3364 seq_state->steps[*seq_state->num_steps].params.opp_program_bit_depth_reduction_params.opp = opp;
3365 seq_state->steps[*seq_state->num_steps].params.opp_program_bit_depth_reduction_params.use_default_params = use_default_params;
3366 seq_state->steps[*seq_state->num_steps].params.opp_program_bit_depth_reduction_params.pipe_ctx = pipe_ctx;
3367 (*seq_state->num_steps)++;
3368 }
3369 }
3370
hwss_add_dc_ip_request_cntl(struct block_sequence_state * seq_state,struct dc * dc,bool enable)3371 void hwss_add_dc_ip_request_cntl(struct block_sequence_state *seq_state,
3372 struct dc *dc,
3373 bool enable)
3374 {
3375 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3376 seq_state->steps[*seq_state->num_steps].func = DC_IP_REQUEST_CNTL;
3377 seq_state->steps[*seq_state->num_steps].params.dc_ip_request_cntl_params.dc = dc;
3378 seq_state->steps[*seq_state->num_steps].params.dc_ip_request_cntl_params.enable = enable;
3379 (*seq_state->num_steps)++;
3380 }
3381 }
3382
hwss_add_dwbc_update(struct block_sequence_state * seq_state,struct dwbc * dwb,struct dc_dwb_params * dwb_params)3383 void hwss_add_dwbc_update(struct block_sequence_state *seq_state,
3384 struct dwbc *dwb,
3385 struct dc_dwb_params *dwb_params)
3386 {
3387 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3388 seq_state->steps[*seq_state->num_steps].func = DWBC_UPDATE;
3389 seq_state->steps[*seq_state->num_steps].params.dwbc_update_params.dwb = dwb;
3390 seq_state->steps[*seq_state->num_steps].params.dwbc_update_params.dwb_params = dwb_params;
3391 (*seq_state->num_steps)++;
3392 }
3393 }
3394
hwss_add_mcif_wb_config_buf(struct block_sequence_state * seq_state,struct mcif_wb * mcif_wb,struct mcif_buf_params * mcif_buf_params,unsigned int dest_height)3395 void hwss_add_mcif_wb_config_buf(struct block_sequence_state *seq_state,
3396 struct mcif_wb *mcif_wb,
3397 struct mcif_buf_params *mcif_buf_params,
3398 unsigned int dest_height)
3399 {
3400 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3401 seq_state->steps[*seq_state->num_steps].func = MCIF_WB_CONFIG_BUF;
3402 seq_state->steps[*seq_state->num_steps].params.mcif_wb_config_buf_params.mcif_wb = mcif_wb;
3403 seq_state->steps[*seq_state->num_steps].params.mcif_wb_config_buf_params.mcif_buf_params = mcif_buf_params;
3404 seq_state->steps[*seq_state->num_steps].params.mcif_wb_config_buf_params.dest_height = dest_height;
3405 (*seq_state->num_steps)++;
3406 }
3407 }
3408
hwss_add_mcif_wb_config_arb(struct block_sequence_state * seq_state,struct mcif_wb * mcif_wb,struct mcif_arb_params * mcif_arb_params)3409 void hwss_add_mcif_wb_config_arb(struct block_sequence_state *seq_state,
3410 struct mcif_wb *mcif_wb,
3411 struct mcif_arb_params *mcif_arb_params)
3412 {
3413 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3414 seq_state->steps[*seq_state->num_steps].func = MCIF_WB_CONFIG_ARB;
3415 seq_state->steps[*seq_state->num_steps].params.mcif_wb_config_arb_params.mcif_wb = mcif_wb;
3416 seq_state->steps[*seq_state->num_steps].params.mcif_wb_config_arb_params.mcif_arb_params = mcif_arb_params;
3417 (*seq_state->num_steps)++;
3418 }
3419 }
3420
hwss_add_mcif_wb_enable(struct block_sequence_state * seq_state,struct mcif_wb * mcif_wb)3421 void hwss_add_mcif_wb_enable(struct block_sequence_state *seq_state,
3422 struct mcif_wb *mcif_wb)
3423 {
3424 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3425 seq_state->steps[*seq_state->num_steps].func = MCIF_WB_ENABLE;
3426 seq_state->steps[*seq_state->num_steps].params.mcif_wb_enable_params.mcif_wb = mcif_wb;
3427 (*seq_state->num_steps)++;
3428 }
3429 }
3430
hwss_add_mcif_wb_disable(struct block_sequence_state * seq_state,struct mcif_wb * mcif_wb)3431 void hwss_add_mcif_wb_disable(struct block_sequence_state *seq_state,
3432 struct mcif_wb *mcif_wb)
3433 {
3434 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3435 seq_state->steps[*seq_state->num_steps].func = MCIF_WB_DISABLE;
3436 seq_state->steps[*seq_state->num_steps].params.mcif_wb_disable_params.mcif_wb = mcif_wb;
3437 (*seq_state->num_steps)++;
3438 }
3439 }
3440
hwss_add_mpc_set_dwb_mux(struct block_sequence_state * seq_state,struct mpc * mpc,int dwb_id,int mpcc_id)3441 void hwss_add_mpc_set_dwb_mux(struct block_sequence_state *seq_state,
3442 struct mpc *mpc,
3443 int dwb_id,
3444 int mpcc_id)
3445 {
3446 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3447 seq_state->steps[*seq_state->num_steps].func = MPC_SET_DWB_MUX;
3448 seq_state->steps[*seq_state->num_steps].params.mpc_set_dwb_mux_params.mpc = mpc;
3449 seq_state->steps[*seq_state->num_steps].params.mpc_set_dwb_mux_params.dwb_id = dwb_id;
3450 seq_state->steps[*seq_state->num_steps].params.mpc_set_dwb_mux_params.mpcc_id = mpcc_id;
3451 (*seq_state->num_steps)++;
3452 }
3453 }
3454
hwss_add_mpc_disable_dwb_mux(struct block_sequence_state * seq_state,struct mpc * mpc,unsigned int dwb_id)3455 void hwss_add_mpc_disable_dwb_mux(struct block_sequence_state *seq_state,
3456 struct mpc *mpc,
3457 unsigned int dwb_id)
3458 {
3459 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3460 seq_state->steps[*seq_state->num_steps].func = MPC_DISABLE_DWB_MUX;
3461 seq_state->steps[*seq_state->num_steps].params.mpc_disable_dwb_mux_params.mpc = mpc;
3462 seq_state->steps[*seq_state->num_steps].params.mpc_disable_dwb_mux_params.dwb_id = dwb_id;
3463 (*seq_state->num_steps)++;
3464 }
3465 }
3466
hwss_add_dwbc_enable(struct block_sequence_state * seq_state,struct dwbc * dwb,struct dc_dwb_params * dwb_params)3467 void hwss_add_dwbc_enable(struct block_sequence_state *seq_state,
3468 struct dwbc *dwb,
3469 struct dc_dwb_params *dwb_params)
3470 {
3471 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3472 seq_state->steps[*seq_state->num_steps].func = DWBC_ENABLE;
3473 seq_state->steps[*seq_state->num_steps].params.dwbc_enable_params.dwb = dwb;
3474 seq_state->steps[*seq_state->num_steps].params.dwbc_enable_params.dwb_params = dwb_params;
3475 (*seq_state->num_steps)++;
3476 }
3477 }
3478
hwss_add_dwbc_disable(struct block_sequence_state * seq_state,struct dwbc * dwb)3479 void hwss_add_dwbc_disable(struct block_sequence_state *seq_state,
3480 struct dwbc *dwb)
3481 {
3482 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3483 seq_state->steps[*seq_state->num_steps].func = DWBC_DISABLE;
3484 seq_state->steps[*seq_state->num_steps].params.dwbc_disable_params.dwb = dwb;
3485 (*seq_state->num_steps)++;
3486 }
3487 }
3488
hwss_add_tg_set_gsl(struct block_sequence_state * seq_state,struct timing_generator * tg,struct gsl_params gsl)3489 void hwss_add_tg_set_gsl(struct block_sequence_state *seq_state,
3490 struct timing_generator *tg,
3491 struct gsl_params gsl)
3492 {
3493 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3494 seq_state->steps[*seq_state->num_steps].func = TG_SET_GSL;
3495 seq_state->steps[*seq_state->num_steps].params.tg_set_gsl_params.tg = tg;
3496 seq_state->steps[*seq_state->num_steps].params.tg_set_gsl_params.gsl = gsl;
3497 (*seq_state->num_steps)++;
3498 }
3499 }
3500
hwss_add_tg_set_gsl_source_select(struct block_sequence_state * seq_state,struct timing_generator * tg,int group_idx,uint32_t gsl_ready_signal)3501 void hwss_add_tg_set_gsl_source_select(struct block_sequence_state *seq_state,
3502 struct timing_generator *tg,
3503 int group_idx,
3504 uint32_t gsl_ready_signal)
3505 {
3506 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3507 seq_state->steps[*seq_state->num_steps].func = TG_SET_GSL_SOURCE_SELECT;
3508 seq_state->steps[*seq_state->num_steps].params.tg_set_gsl_source_select_params.tg = tg;
3509 seq_state->steps[*seq_state->num_steps].params.tg_set_gsl_source_select_params.group_idx = group_idx;
3510 seq_state->steps[*seq_state->num_steps].params.tg_set_gsl_source_select_params.gsl_ready_signal = gsl_ready_signal;
3511 (*seq_state->num_steps)++;
3512 }
3513 }
3514
hwss_add_hubp_update_mall_sel(struct block_sequence_state * seq_state,struct hubp * hubp,uint32_t mall_sel,bool cache_cursor)3515 void hwss_add_hubp_update_mall_sel(struct block_sequence_state *seq_state,
3516 struct hubp *hubp,
3517 uint32_t mall_sel,
3518 bool cache_cursor)
3519 {
3520 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3521 seq_state->steps[*seq_state->num_steps].func = HUBP_UPDATE_MALL_SEL;
3522 seq_state->steps[*seq_state->num_steps].params.hubp_update_mall_sel_params.hubp = hubp;
3523 seq_state->steps[*seq_state->num_steps].params.hubp_update_mall_sel_params.mall_sel = mall_sel;
3524 seq_state->steps[*seq_state->num_steps].params.hubp_update_mall_sel_params.cache_cursor = cache_cursor;
3525 (*seq_state->num_steps)++;
3526 }
3527 }
3528
hwss_add_hubp_prepare_subvp_buffering(struct block_sequence_state * seq_state,struct hubp * hubp,bool enable)3529 void hwss_add_hubp_prepare_subvp_buffering(struct block_sequence_state *seq_state,
3530 struct hubp *hubp,
3531 bool enable)
3532 {
3533 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3534 seq_state->steps[*seq_state->num_steps].func = HUBP_PREPARE_SUBVP_BUFFERING;
3535 seq_state->steps[*seq_state->num_steps].params.hubp_prepare_subvp_buffering_params.hubp = hubp;
3536 seq_state->steps[*seq_state->num_steps].params.hubp_prepare_subvp_buffering_params.enable = enable;
3537 (*seq_state->num_steps)++;
3538 }
3539 }
3540
hwss_add_hubp_set_blank_en(struct block_sequence_state * seq_state,struct hubp * hubp,bool enable)3541 void hwss_add_hubp_set_blank_en(struct block_sequence_state *seq_state,
3542 struct hubp *hubp,
3543 bool enable)
3544 {
3545 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3546 seq_state->steps[*seq_state->num_steps].func = HUBP_SET_BLANK_EN;
3547 seq_state->steps[*seq_state->num_steps].params.hubp_set_blank_en_params.hubp = hubp;
3548 seq_state->steps[*seq_state->num_steps].params.hubp_set_blank_en_params.enable = enable;
3549 (*seq_state->num_steps)++;
3550 }
3551 }
3552
hwss_add_hubp_disable_control(struct block_sequence_state * seq_state,struct hubp * hubp,bool disable)3553 void hwss_add_hubp_disable_control(struct block_sequence_state *seq_state,
3554 struct hubp *hubp,
3555 bool disable)
3556 {
3557 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3558 seq_state->steps[*seq_state->num_steps].func = HUBP_DISABLE_CONTROL;
3559 seq_state->steps[*seq_state->num_steps].params.hubp_disable_control_params.hubp = hubp;
3560 seq_state->steps[*seq_state->num_steps].params.hubp_disable_control_params.disable = disable;
3561 (*seq_state->num_steps)++;
3562 }
3563 }
3564
hwss_add_hubbub_soft_reset(struct block_sequence_state * seq_state,struct hubbub * hubbub,void (* hubbub_soft_reset)(struct hubbub * hubbub,bool reset),bool reset)3565 void hwss_add_hubbub_soft_reset(struct block_sequence_state *seq_state,
3566 struct hubbub *hubbub,
3567 void (*hubbub_soft_reset)(struct hubbub *hubbub, bool reset),
3568 bool reset)
3569 {
3570 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3571 seq_state->steps[*seq_state->num_steps].func = HUBBUB_SOFT_RESET;
3572 seq_state->steps[*seq_state->num_steps].params.hubbub_soft_reset_params.hubbub = hubbub;
3573 seq_state->steps[*seq_state->num_steps].params.hubbub_soft_reset_params.hubbub_soft_reset = hubbub_soft_reset;
3574 seq_state->steps[*seq_state->num_steps].params.hubbub_soft_reset_params.reset = reset;
3575 (*seq_state->num_steps)++;
3576 }
3577 }
3578
hwss_add_hubp_clk_cntl(struct block_sequence_state * seq_state,struct hubp * hubp,bool enable)3579 void hwss_add_hubp_clk_cntl(struct block_sequence_state *seq_state,
3580 struct hubp *hubp,
3581 bool enable)
3582 {
3583 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3584 seq_state->steps[*seq_state->num_steps].func = HUBP_CLK_CNTL;
3585 seq_state->steps[*seq_state->num_steps].params.hubp_clk_cntl_params.hubp = hubp;
3586 seq_state->steps[*seq_state->num_steps].params.hubp_clk_cntl_params.enable = enable;
3587 (*seq_state->num_steps)++;
3588 }
3589 }
3590
hwss_add_dpp_dppclk_control(struct block_sequence_state * seq_state,struct dpp * dpp,bool dppclk_div,bool enable)3591 void hwss_add_dpp_dppclk_control(struct block_sequence_state *seq_state,
3592 struct dpp *dpp,
3593 bool dppclk_div,
3594 bool enable)
3595 {
3596 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3597 seq_state->steps[*seq_state->num_steps].func = DPP_DPPCLK_CONTROL;
3598 seq_state->steps[*seq_state->num_steps].params.dpp_dppclk_control_params.dpp = dpp;
3599 seq_state->steps[*seq_state->num_steps].params.dpp_dppclk_control_params.dppclk_div = dppclk_div;
3600 seq_state->steps[*seq_state->num_steps].params.dpp_dppclk_control_params.enable = enable;
3601 (*seq_state->num_steps)++;
3602 }
3603 }
3604
hwss_add_disable_phantom_crtc(struct block_sequence_state * seq_state,struct timing_generator * tg)3605 void hwss_add_disable_phantom_crtc(struct block_sequence_state *seq_state,
3606 struct timing_generator *tg)
3607 {
3608 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3609 seq_state->steps[*seq_state->num_steps].func = DISABLE_PHANTOM_CRTC;
3610 seq_state->steps[*seq_state->num_steps].params.disable_phantom_crtc_params.tg = tg;
3611 (*seq_state->num_steps)++;
3612 }
3613 }
3614
hwss_add_dsc_pg_status(struct block_sequence_state * seq_state,struct dce_hwseq * hws,int dsc_inst,bool is_ungated)3615 void hwss_add_dsc_pg_status(struct block_sequence_state *seq_state,
3616 struct dce_hwseq *hws,
3617 int dsc_inst,
3618 bool is_ungated)
3619 {
3620 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3621 seq_state->steps[*seq_state->num_steps].func = DSC_PG_STATUS;
3622 seq_state->steps[*seq_state->num_steps].params.dsc_pg_status_params.hws = hws;
3623 seq_state->steps[*seq_state->num_steps].params.dsc_pg_status_params.dsc_inst = dsc_inst;
3624 seq_state->steps[*seq_state->num_steps].params.dsc_pg_status_params.is_ungated = is_ungated;
3625 (*seq_state->num_steps)++;
3626 }
3627 }
3628
hwss_add_dsc_wait_disconnect_pending_clear(struct block_sequence_state * seq_state,struct display_stream_compressor * dsc,bool * is_ungated)3629 void hwss_add_dsc_wait_disconnect_pending_clear(struct block_sequence_state *seq_state,
3630 struct display_stream_compressor *dsc,
3631 bool *is_ungated)
3632 {
3633 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3634 seq_state->steps[*seq_state->num_steps].func = DSC_WAIT_DISCONNECT_PENDING_CLEAR;
3635 seq_state->steps[*seq_state->num_steps].params.dsc_wait_disconnect_pending_clear_params.dsc = dsc;
3636 seq_state->steps[*seq_state->num_steps].params.dsc_wait_disconnect_pending_clear_params.is_ungated = is_ungated;
3637 (*seq_state->num_steps)++;
3638 }
3639 }
3640
hwss_add_dsc_disable(struct block_sequence_state * seq_state,struct display_stream_compressor * dsc,bool * is_ungated)3641 void hwss_add_dsc_disable(struct block_sequence_state *seq_state,
3642 struct display_stream_compressor *dsc,
3643 bool *is_ungated)
3644 {
3645 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3646 seq_state->steps[*seq_state->num_steps].func = DSC_DISABLE;
3647 seq_state->steps[*seq_state->num_steps].params.dsc_disable_params.dsc = dsc;
3648 seq_state->steps[*seq_state->num_steps].params.dsc_disable_params.is_ungated = is_ungated;
3649 (*seq_state->num_steps)++;
3650 }
3651 }
3652
hwss_add_dccg_set_ref_dscclk(struct block_sequence_state * seq_state,struct dccg * dccg,int dsc_inst,bool * is_ungated)3653 void hwss_add_dccg_set_ref_dscclk(struct block_sequence_state *seq_state,
3654 struct dccg *dccg,
3655 int dsc_inst,
3656 bool *is_ungated)
3657 {
3658 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3659 seq_state->steps[*seq_state->num_steps].func = DCCG_SET_REF_DSCCLK;
3660 seq_state->steps[*seq_state->num_steps].params.dccg_set_ref_dscclk_params.dccg = dccg;
3661 seq_state->steps[*seq_state->num_steps].params.dccg_set_ref_dscclk_params.dsc_inst = dsc_inst;
3662 seq_state->steps[*seq_state->num_steps].params.dccg_set_ref_dscclk_params.is_ungated = is_ungated;
3663 (*seq_state->num_steps)++;
3664 }
3665 }
3666
hwss_add_dpp_root_clock_control(struct block_sequence_state * seq_state,struct dce_hwseq * hws,unsigned int dpp_inst,bool clock_on)3667 void hwss_add_dpp_root_clock_control(struct block_sequence_state *seq_state,
3668 struct dce_hwseq *hws,
3669 unsigned int dpp_inst,
3670 bool clock_on)
3671 {
3672 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3673 seq_state->steps[*seq_state->num_steps].func = DPP_ROOT_CLOCK_CONTROL;
3674 seq_state->steps[*seq_state->num_steps].params.dpp_root_clock_control_params.hws = hws;
3675 seq_state->steps[*seq_state->num_steps].params.dpp_root_clock_control_params.dpp_inst = dpp_inst;
3676 seq_state->steps[*seq_state->num_steps].params.dpp_root_clock_control_params.clock_on = clock_on;
3677 (*seq_state->num_steps)++;
3678 }
3679 }
3680
hwss_add_dpp_pg_control(struct block_sequence_state * seq_state,struct dce_hwseq * hws,unsigned int dpp_inst,bool power_on)3681 void hwss_add_dpp_pg_control(struct block_sequence_state *seq_state,
3682 struct dce_hwseq *hws,
3683 unsigned int dpp_inst,
3684 bool power_on)
3685 {
3686 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3687 seq_state->steps[*seq_state->num_steps].func = DPP_PG_CONTROL;
3688 seq_state->steps[*seq_state->num_steps].params.dpp_pg_control_params.hws = hws;
3689 seq_state->steps[*seq_state->num_steps].params.dpp_pg_control_params.dpp_inst = dpp_inst;
3690 seq_state->steps[*seq_state->num_steps].params.dpp_pg_control_params.power_on = power_on;
3691 (*seq_state->num_steps)++;
3692 }
3693 }
3694
hwss_add_hubp_pg_control(struct block_sequence_state * seq_state,struct dce_hwseq * hws,unsigned int hubp_inst,bool power_on)3695 void hwss_add_hubp_pg_control(struct block_sequence_state *seq_state,
3696 struct dce_hwseq *hws,
3697 unsigned int hubp_inst,
3698 bool power_on)
3699 {
3700 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3701 seq_state->steps[*seq_state->num_steps].func = HUBP_PG_CONTROL;
3702 seq_state->steps[*seq_state->num_steps].params.hubp_pg_control_params.hws = hws;
3703 seq_state->steps[*seq_state->num_steps].params.hubp_pg_control_params.hubp_inst = hubp_inst;
3704 seq_state->steps[*seq_state->num_steps].params.hubp_pg_control_params.power_on = power_on;
3705 (*seq_state->num_steps)++;
3706 }
3707 }
3708
hwss_add_hubp_init(struct block_sequence_state * seq_state,struct hubp * hubp)3709 void hwss_add_hubp_init(struct block_sequence_state *seq_state,
3710 struct hubp *hubp)
3711 {
3712 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3713 seq_state->steps[*seq_state->num_steps].func = HUBP_INIT;
3714 seq_state->steps[*seq_state->num_steps].params.hubp_init_params.hubp = hubp;
3715 (*seq_state->num_steps)++;
3716 }
3717 }
3718
hwss_add_hubp_reset(struct block_sequence_state * seq_state,struct hubp * hubp)3719 void hwss_add_hubp_reset(struct block_sequence_state *seq_state,
3720 struct hubp *hubp)
3721 {
3722 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3723 seq_state->steps[*seq_state->num_steps].func = HUBP_RESET;
3724 seq_state->steps[*seq_state->num_steps].params.hubp_reset_params.hubp = hubp;
3725 (*seq_state->num_steps)++;
3726 }
3727 }
3728
hwss_add_dpp_reset(struct block_sequence_state * seq_state,struct dpp * dpp)3729 void hwss_add_dpp_reset(struct block_sequence_state *seq_state,
3730 struct dpp *dpp)
3731 {
3732 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3733 seq_state->steps[*seq_state->num_steps].func = DPP_RESET;
3734 seq_state->steps[*seq_state->num_steps].params.dpp_reset_params.dpp = dpp;
3735 (*seq_state->num_steps)++;
3736 }
3737 }
3738
hwss_add_opp_pipe_clock_control(struct block_sequence_state * seq_state,struct output_pixel_processor * opp,bool enable)3739 void hwss_add_opp_pipe_clock_control(struct block_sequence_state *seq_state,
3740 struct output_pixel_processor *opp,
3741 bool enable)
3742 {
3743 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3744 seq_state->steps[*seq_state->num_steps].func = OPP_PIPE_CLOCK_CONTROL;
3745 seq_state->steps[*seq_state->num_steps].params.opp_pipe_clock_control_params.opp = opp;
3746 seq_state->steps[*seq_state->num_steps].params.opp_pipe_clock_control_params.enable = enable;
3747 (*seq_state->num_steps)++;
3748 }
3749 }
3750
hwss_add_hubp_set_vm_system_aperture_settings(struct block_sequence_state * seq_state,struct hubp * hubp,uint64_t sys_default,uint64_t sys_low,uint64_t sys_high)3751 void hwss_add_hubp_set_vm_system_aperture_settings(struct block_sequence_state *seq_state,
3752 struct hubp *hubp,
3753 uint64_t sys_default,
3754 uint64_t sys_low,
3755 uint64_t sys_high)
3756 {
3757 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3758 seq_state->steps[*seq_state->num_steps].func = HUBP_SET_VM_SYSTEM_APERTURE_SETTINGS;
3759 seq_state->steps[*seq_state->num_steps].params.hubp_set_vm_system_aperture_settings_params.hubp = hubp;
3760 seq_state->steps[*seq_state->num_steps].params.hubp_set_vm_system_aperture_settings_params.sys_default.quad_part = sys_default;
3761 seq_state->steps[*seq_state->num_steps].params.hubp_set_vm_system_aperture_settings_params.sys_low.quad_part = sys_low;
3762 seq_state->steps[*seq_state->num_steps].params.hubp_set_vm_system_aperture_settings_params.sys_high.quad_part = sys_high;
3763 (*seq_state->num_steps)++;
3764 }
3765 }
3766
hwss_add_hubp_set_flip_int(struct block_sequence_state * seq_state,struct hubp * hubp)3767 void hwss_add_hubp_set_flip_int(struct block_sequence_state *seq_state,
3768 struct hubp *hubp)
3769 {
3770 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3771 seq_state->steps[*seq_state->num_steps].func = HUBP_SET_FLIP_INT;
3772 seq_state->steps[*seq_state->num_steps].params.hubp_set_flip_int_params.hubp = hubp;
3773 (*seq_state->num_steps)++;
3774 }
3775 }
3776
hwss_add_dccg_update_dpp_dto(struct block_sequence_state * seq_state,struct dccg * dccg,int dpp_inst,int dppclk_khz)3777 void hwss_add_dccg_update_dpp_dto(struct block_sequence_state *seq_state,
3778 struct dccg *dccg,
3779 int dpp_inst,
3780 int dppclk_khz)
3781 {
3782 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3783 seq_state->steps[*seq_state->num_steps].func = DCCG_UPDATE_DPP_DTO;
3784 seq_state->steps[*seq_state->num_steps].params.dccg_update_dpp_dto_params.dccg = dccg;
3785 seq_state->steps[*seq_state->num_steps].params.dccg_update_dpp_dto_params.dpp_inst = dpp_inst;
3786 seq_state->steps[*seq_state->num_steps].params.dccg_update_dpp_dto_params.dppclk_khz = dppclk_khz;
3787 (*seq_state->num_steps)++;
3788 }
3789 }
3790
hwss_add_hubp_vtg_sel(struct block_sequence_state * seq_state,struct hubp * hubp,uint32_t otg_inst)3791 void hwss_add_hubp_vtg_sel(struct block_sequence_state *seq_state,
3792 struct hubp *hubp,
3793 uint32_t otg_inst)
3794 {
3795 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3796 seq_state->steps[*seq_state->num_steps].func = HUBP_VTG_SEL;
3797 seq_state->steps[*seq_state->num_steps].params.hubp_vtg_sel_params.hubp = hubp;
3798 seq_state->steps[*seq_state->num_steps].params.hubp_vtg_sel_params.otg_inst = otg_inst;
3799 (*seq_state->num_steps)++;
3800 }
3801 }
3802
hwss_add_hubp_setup2(struct block_sequence_state * seq_state,struct hubp * hubp,struct dml2_dchub_per_pipe_register_set * hubp_regs,union dml2_global_sync_programming * global_sync,struct dc_crtc_timing * timing)3803 void hwss_add_hubp_setup2(struct block_sequence_state *seq_state,
3804 struct hubp *hubp,
3805 struct dml2_dchub_per_pipe_register_set *hubp_regs,
3806 union dml2_global_sync_programming *global_sync,
3807 struct dc_crtc_timing *timing)
3808 {
3809 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3810 seq_state->steps[*seq_state->num_steps].func = HUBP_SETUP2;
3811 seq_state->steps[*seq_state->num_steps].params.hubp_setup2_params.hubp = hubp;
3812 seq_state->steps[*seq_state->num_steps].params.hubp_setup2_params.hubp_regs = hubp_regs;
3813 seq_state->steps[*seq_state->num_steps].params.hubp_setup2_params.global_sync = global_sync;
3814 seq_state->steps[*seq_state->num_steps].params.hubp_setup2_params.timing = timing;
3815 (*seq_state->num_steps)++;
3816 }
3817 }
3818
hwss_add_hubp_setup(struct block_sequence_state * seq_state,struct hubp * hubp,struct _vcs_dpi_display_dlg_regs_st * dlg_regs,struct _vcs_dpi_display_ttu_regs_st * ttu_regs,struct _vcs_dpi_display_rq_regs_st * rq_regs,struct _vcs_dpi_display_pipe_dest_params_st * pipe_dest)3819 void hwss_add_hubp_setup(struct block_sequence_state *seq_state,
3820 struct hubp *hubp,
3821 struct _vcs_dpi_display_dlg_regs_st *dlg_regs,
3822 struct _vcs_dpi_display_ttu_regs_st *ttu_regs,
3823 struct _vcs_dpi_display_rq_regs_st *rq_regs,
3824 struct _vcs_dpi_display_pipe_dest_params_st *pipe_dest)
3825 {
3826 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3827 seq_state->steps[*seq_state->num_steps].func = HUBP_SETUP;
3828 seq_state->steps[*seq_state->num_steps].params.hubp_setup_params.hubp = hubp;
3829 seq_state->steps[*seq_state->num_steps].params.hubp_setup_params.dlg_regs = dlg_regs;
3830 seq_state->steps[*seq_state->num_steps].params.hubp_setup_params.ttu_regs = ttu_regs;
3831 seq_state->steps[*seq_state->num_steps].params.hubp_setup_params.rq_regs = rq_regs;
3832 seq_state->steps[*seq_state->num_steps].params.hubp_setup_params.pipe_dest = pipe_dest;
3833 (*seq_state->num_steps)++;
3834 }
3835 }
3836
hwss_add_hubp_set_unbounded_requesting(struct block_sequence_state * seq_state,struct hubp * hubp,bool unbounded_req)3837 void hwss_add_hubp_set_unbounded_requesting(struct block_sequence_state *seq_state,
3838 struct hubp *hubp,
3839 bool unbounded_req)
3840 {
3841 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3842 seq_state->steps[*seq_state->num_steps].func = HUBP_SET_UNBOUNDED_REQUESTING;
3843 seq_state->steps[*seq_state->num_steps].params.hubp_set_unbounded_requesting_params.hubp = hubp;
3844 seq_state->steps[*seq_state->num_steps].params.hubp_set_unbounded_requesting_params.unbounded_req = unbounded_req;
3845 (*seq_state->num_steps)++;
3846 }
3847 }
3848
hwss_add_hubp_setup_interdependent2(struct block_sequence_state * seq_state,struct hubp * hubp,struct dml2_dchub_per_pipe_register_set * hubp_regs)3849 void hwss_add_hubp_setup_interdependent2(struct block_sequence_state *seq_state,
3850 struct hubp *hubp,
3851 struct dml2_dchub_per_pipe_register_set *hubp_regs)
3852 {
3853 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3854 seq_state->steps[*seq_state->num_steps].func = HUBP_SETUP_INTERDEPENDENT2;
3855 seq_state->steps[*seq_state->num_steps].params.hubp_setup_interdependent2_params.hubp = hubp;
3856 seq_state->steps[*seq_state->num_steps].params.hubp_setup_interdependent2_params.hubp_regs = hubp_regs;
3857 (*seq_state->num_steps)++;
3858 }
3859 }
3860
hwss_add_hubp_setup_interdependent(struct block_sequence_state * seq_state,struct hubp * hubp,struct _vcs_dpi_display_dlg_regs_st * dlg_regs,struct _vcs_dpi_display_ttu_regs_st * ttu_regs)3861 void hwss_add_hubp_setup_interdependent(struct block_sequence_state *seq_state,
3862 struct hubp *hubp,
3863 struct _vcs_dpi_display_dlg_regs_st *dlg_regs,
3864 struct _vcs_dpi_display_ttu_regs_st *ttu_regs)
3865 {
3866 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3867 seq_state->steps[*seq_state->num_steps].func = HUBP_SETUP_INTERDEPENDENT;
3868 seq_state->steps[*seq_state->num_steps].params.hubp_setup_interdependent_params.hubp = hubp;
3869 seq_state->steps[*seq_state->num_steps].params.hubp_setup_interdependent_params.dlg_regs = dlg_regs;
3870 seq_state->steps[*seq_state->num_steps].params.hubp_setup_interdependent_params.ttu_regs = ttu_regs;
3871 (*seq_state->num_steps)++;
3872 }
3873 }
3874
hwss_add_hubp_program_surface_config(struct block_sequence_state * seq_state,struct hubp * hubp,enum surface_pixel_format format,struct dc_tiling_info * tiling_info,struct plane_size plane_size,enum dc_rotation_angle rotation,struct dc_plane_dcc_param * dcc,bool horizontal_mirror,int compat_level)3875 void hwss_add_hubp_program_surface_config(struct block_sequence_state *seq_state,
3876 struct hubp *hubp,
3877 enum surface_pixel_format format,
3878 struct dc_tiling_info *tiling_info,
3879 struct plane_size plane_size,
3880 enum dc_rotation_angle rotation,
3881 struct dc_plane_dcc_param *dcc,
3882 bool horizontal_mirror,
3883 int compat_level)
3884 {
3885 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3886 seq_state->steps[*seq_state->num_steps].func = HUBP_PROGRAM_SURFACE_CONFIG;
3887 seq_state->steps[*seq_state->num_steps].params.program_surface_config_params.hubp = hubp;
3888 seq_state->steps[*seq_state->num_steps].params.program_surface_config_params.format = format;
3889 seq_state->steps[*seq_state->num_steps].params.program_surface_config_params.tiling_info = tiling_info;
3890 seq_state->steps[*seq_state->num_steps].params.program_surface_config_params.plane_size = plane_size;
3891 seq_state->steps[*seq_state->num_steps].params.program_surface_config_params.rotation = rotation;
3892 seq_state->steps[*seq_state->num_steps].params.program_surface_config_params.dcc = dcc;
3893 seq_state->steps[*seq_state->num_steps].params.program_surface_config_params.horizontal_mirror = horizontal_mirror;
3894 seq_state->steps[*seq_state->num_steps].params.program_surface_config_params.compat_level = compat_level;
3895 (*seq_state->num_steps)++;
3896 }
3897 }
3898
hwss_add_dpp_setup_dpp(struct block_sequence_state * seq_state,struct pipe_ctx * pipe_ctx)3899 void hwss_add_dpp_setup_dpp(struct block_sequence_state *seq_state,
3900 struct pipe_ctx *pipe_ctx)
3901 {
3902 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3903 seq_state->steps[*seq_state->num_steps].func = DPP_SETUP_DPP;
3904 seq_state->steps[*seq_state->num_steps].params.setup_dpp_params.pipe_ctx = pipe_ctx;
3905 (*seq_state->num_steps)++;
3906 }
3907 }
3908
hwss_add_dpp_set_cursor_matrix(struct block_sequence_state * seq_state,struct dpp * dpp,enum dc_color_space color_space,struct dc_csc_transform * cursor_csc_color_matrix)3909 void hwss_add_dpp_set_cursor_matrix(struct block_sequence_state *seq_state,
3910 struct dpp *dpp,
3911 enum dc_color_space color_space,
3912 struct dc_csc_transform *cursor_csc_color_matrix)
3913 {
3914 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3915 seq_state->steps[*seq_state->num_steps].func = DPP_SET_CURSOR_MATRIX;
3916 seq_state->steps[*seq_state->num_steps].params.dpp_set_cursor_matrix_params.dpp = dpp;
3917 seq_state->steps[*seq_state->num_steps].params.dpp_set_cursor_matrix_params.color_space = color_space;
3918 seq_state->steps[*seq_state->num_steps].params.dpp_set_cursor_matrix_params.cursor_csc_color_matrix = cursor_csc_color_matrix;
3919 (*seq_state->num_steps)++;
3920 }
3921 }
3922
hwss_add_dpp_set_scaler(struct block_sequence_state * seq_state,struct dpp * dpp,const struct scaler_data * scl_data)3923 void hwss_add_dpp_set_scaler(struct block_sequence_state *seq_state,
3924 struct dpp *dpp,
3925 const struct scaler_data *scl_data)
3926 {
3927 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3928 seq_state->steps[*seq_state->num_steps].func = DPP_SET_SCALER;
3929 seq_state->steps[*seq_state->num_steps].params.dpp_set_scaler_params.dpp = dpp;
3930 seq_state->steps[*seq_state->num_steps].params.dpp_set_scaler_params.scl_data = scl_data;
3931 (*seq_state->num_steps)++;
3932 }
3933 }
3934
hwss_add_hubp_mem_program_viewport(struct block_sequence_state * seq_state,struct hubp * hubp,const struct rect * viewport,const struct rect * viewport_c)3935 void hwss_add_hubp_mem_program_viewport(struct block_sequence_state *seq_state,
3936 struct hubp *hubp,
3937 const struct rect *viewport,
3938 const struct rect *viewport_c)
3939 {
3940 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3941 seq_state->steps[*seq_state->num_steps].func = HUBP_MEM_PROGRAM_VIEWPORT;
3942 seq_state->steps[*seq_state->num_steps].params.hubp_mem_program_viewport_params.hubp = hubp;
3943 seq_state->steps[*seq_state->num_steps].params.hubp_mem_program_viewport_params.viewport = viewport;
3944 seq_state->steps[*seq_state->num_steps].params.hubp_mem_program_viewport_params.viewport_c = viewport_c;
3945 (*seq_state->num_steps)++;
3946 }
3947 }
3948
hwss_add_abort_cursor_offload_update(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * pipe_ctx)3949 void hwss_add_abort_cursor_offload_update(struct block_sequence_state *seq_state,
3950 struct dc *dc,
3951 struct pipe_ctx *pipe_ctx)
3952 {
3953 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3954 seq_state->steps[*seq_state->num_steps].func = ABORT_CURSOR_OFFLOAD_UPDATE;
3955 seq_state->steps[*seq_state->num_steps].params.abort_cursor_offload_update_params.dc = dc;
3956 seq_state->steps[*seq_state->num_steps].params.abort_cursor_offload_update_params.pipe_ctx = pipe_ctx;
3957 (*seq_state->num_steps)++;
3958 }
3959 }
3960
hwss_add_set_cursor_attribute(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * pipe_ctx)3961 void hwss_add_set_cursor_attribute(struct block_sequence_state *seq_state,
3962 struct dc *dc,
3963 struct pipe_ctx *pipe_ctx)
3964 {
3965 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3966 seq_state->steps[*seq_state->num_steps].func = SET_CURSOR_ATTRIBUTE;
3967 seq_state->steps[*seq_state->num_steps].params.set_cursor_attribute_params.dc = dc;
3968 seq_state->steps[*seq_state->num_steps].params.set_cursor_attribute_params.pipe_ctx = pipe_ctx;
3969 (*seq_state->num_steps)++;
3970 }
3971 }
3972
hwss_add_set_cursor_position(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * pipe_ctx)3973 void hwss_add_set_cursor_position(struct block_sequence_state *seq_state,
3974 struct dc *dc,
3975 struct pipe_ctx *pipe_ctx)
3976 {
3977 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3978 seq_state->steps[*seq_state->num_steps].func = SET_CURSOR_POSITION;
3979 seq_state->steps[*seq_state->num_steps].params.set_cursor_position_params.dc = dc;
3980 seq_state->steps[*seq_state->num_steps].params.set_cursor_position_params.pipe_ctx = pipe_ctx;
3981 (*seq_state->num_steps)++;
3982 }
3983 }
3984
hwss_add_set_cursor_sdr_white_level(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * pipe_ctx)3985 void hwss_add_set_cursor_sdr_white_level(struct block_sequence_state *seq_state,
3986 struct dc *dc,
3987 struct pipe_ctx *pipe_ctx)
3988 {
3989 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
3990 seq_state->steps[*seq_state->num_steps].func = SET_CURSOR_SDR_WHITE_LEVEL;
3991 seq_state->steps[*seq_state->num_steps].params.set_cursor_sdr_white_level_params.dc = dc;
3992 seq_state->steps[*seq_state->num_steps].params.set_cursor_sdr_white_level_params.pipe_ctx = pipe_ctx;
3993 (*seq_state->num_steps)++;
3994 }
3995 }
3996
hwss_add_program_output_csc(struct block_sequence_state * seq_state,struct dc * dc,struct pipe_ctx * pipe_ctx,enum dc_color_space colorspace,uint16_t * matrix,int opp_id)3997 void hwss_add_program_output_csc(struct block_sequence_state *seq_state,
3998 struct dc *dc,
3999 struct pipe_ctx *pipe_ctx,
4000 enum dc_color_space colorspace,
4001 uint16_t *matrix,
4002 int opp_id)
4003 {
4004 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
4005 seq_state->steps[*seq_state->num_steps].func = PROGRAM_OUTPUT_CSC;
4006 seq_state->steps[*seq_state->num_steps].params.program_output_csc_params.dc = dc;
4007 seq_state->steps[*seq_state->num_steps].params.program_output_csc_params.pipe_ctx = pipe_ctx;
4008 seq_state->steps[*seq_state->num_steps].params.program_output_csc_params.colorspace = colorspace;
4009 seq_state->steps[*seq_state->num_steps].params.program_output_csc_params.matrix = matrix;
4010 seq_state->steps[*seq_state->num_steps].params.program_output_csc_params.opp_id = opp_id;
4011 (*seq_state->num_steps)++;
4012 }
4013 }
4014
hwss_add_phantom_hubp_post_enable(struct block_sequence_state * seq_state,struct hubp * hubp)4015 void hwss_add_phantom_hubp_post_enable(struct block_sequence_state *seq_state,
4016 struct hubp *hubp)
4017 {
4018 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
4019 seq_state->steps[*seq_state->num_steps].func = PHANTOM_HUBP_POST_ENABLE;
4020 seq_state->steps[*seq_state->num_steps].params.phantom_hubp_post_enable_params.hubp = hubp;
4021 (*seq_state->num_steps)++;
4022 }
4023 }
4024
hwss_add_update_force_pstate(struct block_sequence_state * seq_state,struct dc * dc,struct dc_state * context)4025 void hwss_add_update_force_pstate(struct block_sequence_state *seq_state,
4026 struct dc *dc,
4027 struct dc_state *context)
4028 {
4029 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
4030 seq_state->steps[*seq_state->num_steps].func = UPDATE_FORCE_PSTATE;
4031 seq_state->steps[*seq_state->num_steps].params.update_force_pstate_params.dc = dc;
4032 seq_state->steps[*seq_state->num_steps].params.update_force_pstate_params.context = context;
4033 (*seq_state->num_steps)++;
4034 }
4035 }
4036
hwss_add_hubbub_apply_dedcn21_147_wa(struct block_sequence_state * seq_state,struct hubbub * hubbub)4037 void hwss_add_hubbub_apply_dedcn21_147_wa(struct block_sequence_state *seq_state,
4038 struct hubbub *hubbub)
4039 {
4040 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
4041 seq_state->steps[*seq_state->num_steps].func = HUBBUB_APPLY_DEDCN21_147_WA;
4042 seq_state->steps[*seq_state->num_steps].params.hubbub_apply_dedcn21_147_wa_params.hubbub = hubbub;
4043 (*seq_state->num_steps)++;
4044 }
4045 }
4046
hwss_add_hubbub_allow_self_refresh_control(struct block_sequence_state * seq_state,struct hubbub * hubbub,bool allow,bool * disallow_self_refresh_applied)4047 void hwss_add_hubbub_allow_self_refresh_control(struct block_sequence_state *seq_state,
4048 struct hubbub *hubbub,
4049 bool allow,
4050 bool *disallow_self_refresh_applied)
4051 {
4052 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
4053 seq_state->steps[*seq_state->num_steps].func = HUBBUB_ALLOW_SELF_REFRESH_CONTROL;
4054 seq_state->steps[*seq_state->num_steps].params.hubbub_allow_self_refresh_control_params.hubbub = hubbub;
4055 seq_state->steps[*seq_state->num_steps].params.hubbub_allow_self_refresh_control_params.allow = allow;
4056 seq_state->steps[*seq_state->num_steps].params.hubbub_allow_self_refresh_control_params.disallow_self_refresh_applied = disallow_self_refresh_applied;
4057 (*seq_state->num_steps)++;
4058 }
4059 }
4060
hwss_add_tg_get_frame_count(struct block_sequence_state * seq_state,struct timing_generator * tg,unsigned int * frame_count)4061 void hwss_add_tg_get_frame_count(struct block_sequence_state *seq_state,
4062 struct timing_generator *tg,
4063 unsigned int *frame_count)
4064 {
4065 if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
4066 seq_state->steps[*seq_state->num_steps].func = TG_GET_FRAME_COUNT;
4067 seq_state->steps[*seq_state->num_steps].params.tg_get_frame_count_params.tg = tg;
4068 seq_state->steps[*seq_state->num_steps].params.tg_get_frame_count_params.frame_count = frame_count;
4069 (*seq_state->num_steps)++;
4070 }
4071 }
4072