xref: /linux/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c (revision 3f1c07fc21c68bd3bd2df9d2c9441f6485e934d9)
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 = &current_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 			&params->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 		&params->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 = &params->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 = &params->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 = &params->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