xref: /linux/drivers/gpu/drm/amd/display/dc/inc/hw/mpc.h (revision 4b911a9690d72641879ea6d13cce1de31d346d79)
1 /* Copyright 2012-15 Advanced Micro Devices, Inc.
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining a
4  * copy of this software and associated documentation files (the "Software"),
5  * to deal in the Software without restriction, including without limitation
6  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
7  * and/or sell copies of the Software, and to permit persons to whom the
8  * Software is furnished to do so, subject to the following conditions:
9  *
10  * The above copyright notice and this permission notice shall be included in
11  * all copies or substantial portions of the Software.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
16  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
17  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
18  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
19  * OTHER DEALINGS IN THE SOFTWARE.
20  *
21  * Authors: AMD
22  *
23  */
24 
25 /**
26  * DOC: overview
27  *
28  * Multiple Pipe/Plane Combiner (MPC) is a component in the hardware pipeline
29  * that performs blending of multiple planes, using global and per-pixel alpha.
30  * It also performs post-blending color correction operations according to the
31  * hardware capabilities, such as color transformation matrix and gamma 1D and
32  * 3D LUT.
33  *
34  * MPC receives output from all DPP pipes and combines them to multiple outputs
35  * supporting "M MPC inputs -> N MPC outputs" flexible composition
36  * architecture. It features:
37  *
38  * - Programmable blending structure to allow software controlled blending and
39  *   cascading;
40  * - Programmable window location of each DPP in active region of display;
41  * - Combining multiple DPP pipes in one active region when a single DPP pipe
42  *   cannot process very large surface;
43  * - Combining multiple DPP from different SLS with blending;
44  * - Stereo formats from single DPP in top-bottom or side-by-side modes;
45  * - Stereo formats from 2 DPPs;
46  * - Alpha blending of multiple layers from different DPP pipes;
47  * - Programmable background color;
48  */
49 
50 #ifndef __DC_MPCC_H__
51 #define __DC_MPCC_H__
52 
53 #include "dc_hw_types.h"
54 #include "hw_shared.h"
55 #include "transform.h"
56 
57 #define MAX_MPCC 6
58 #define MAX_OPP 6
59 
60 #define MAX_DWB		2
61 
62 enum mpc_output_csc_mode {
63 	MPC_OUTPUT_CSC_DISABLE = 0,
64 	MPC_OUTPUT_CSC_COEF_A,
65 	MPC_OUTPUT_CSC_COEF_B
66 };
67 
68 
69 enum mpcc_blend_mode {
70 	MPCC_BLEND_MODE_BYPASS,
71 	MPCC_BLEND_MODE_TOP_LAYER_PASSTHROUGH,
72 	MPCC_BLEND_MODE_TOP_LAYER_ONLY,
73 	MPCC_BLEND_MODE_TOP_BOT_BLENDING
74 };
75 
76 /**
77  * enum mpcc_alpha_blend_mode - define the alpha blend mode regarding pixel
78  * alpha and plane alpha values
79  */
80 enum mpcc_alpha_blend_mode {
81 	/**
82 	 * @MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA: per pixel alpha using DPP
83 	 * alpha value
84 	 */
85 	MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA,
86 	/**
87 	 * @MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN: per
88 	 * pixel alpha using DPP alpha value multiplied by a global gain (plane
89 	 * alpha)
90 	 */
91 	MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN,
92 	/**
93 	 * @MPCC_ALPHA_BLEND_MODE_GLOBAL_ALPHA: global alpha value, ignores
94 	 * pixel alpha and consider only plane alpha
95 	 */
96 	MPCC_ALPHA_BLEND_MODE_GLOBAL_ALPHA
97 };
98 
99 /**
100  * struct mpcc_blnd_cfg - MPCC blending configuration
101  */
102 struct mpcc_blnd_cfg {
103 	/**
104 	 * @black_color: background color.
105 	 */
106 	struct tg_color black_color;
107 
108 	/**
109 	 * @alpha_mode: alpha blend mode (MPCC_ALPHA_BLND_MODE).
110 	 */
111 	enum mpcc_alpha_blend_mode alpha_mode;
112 
113 	/**
114 	 * @pre_multiplied_alpha:
115 	 * Whether pixel color values were pre-multiplied by the alpha channel
116 	 * (MPCC_ALPHA_MULTIPLIED_MODE).
117 	 */
118 	bool pre_multiplied_alpha;
119 
120 	/**
121 	 * @global_gain: Used when blend mode considers both pixel alpha and plane.
122 	 */
123 	int global_gain;
124 
125 	/**
126 	 * @global_alpha: Plane alpha value.
127 	 */
128 	int global_alpha;
129 
130 	/**
131 	 * @overlap_only: Whether overlapping of different planes is allowed.
132 	 */
133 	bool overlap_only;
134 
135 	/* MPCC top/bottom gain settings */
136 
137 	/**
138 	 * @bottom_gain_mode: Blend mode for bottom gain setting.
139 	 */
140 	int bottom_gain_mode;
141 
142 	/**
143 	 * @background_color_bpc: Background color for bpc.
144 	 */
145 	int background_color_bpc;
146 
147 	/**
148 	 * @top_gain: Top gain setting.
149 	 */
150 	int top_gain;
151 
152 	/**
153 	 * @bottom_inside_gain: Blend mode for bottom inside.
154 	 */
155 	int bottom_inside_gain;
156 
157 	/**
158 	 * @bottom_outside_gain: Blend mode for bottom outside.
159 	 */
160 	int bottom_outside_gain;
161 };
162 
163 struct mpc_grph_gamut_adjustment {
164 	struct fixed31_32 temperature_matrix[CSC_TEMPERATURE_MATRIX_SIZE];
165 	enum graphics_gamut_adjust_type gamut_adjust_type;
166 };
167 
168 struct mpcc_sm_cfg {
169 	bool enable;
170 	/* 0-single plane,2-row subsampling,4-column subsampling,6-checkboard subsampling */
171 	int sm_mode;
172 	/* 0- disable frame alternate, 1- enable frame alternate */
173 	bool frame_alt;
174 	/* 0- disable field alternate, 1- enable field alternate */
175 	bool field_alt;
176 	/* 0-no force,2-force frame polarity from top,3-force frame polarity from bottom */
177 	int force_next_frame_porlarity;
178 	/* 0-no force,2-force field polarity from top,3-force field polarity from bottom */
179 	int force_next_field_polarity;
180 };
181 
182 struct mpc_denorm_clamp {
183 	int clamp_max_r_cr;
184 	int clamp_min_r_cr;
185 	int clamp_max_g_y;
186 	int clamp_min_g_y;
187 	int clamp_max_b_cb;
188 	int clamp_min_b_cb;
189 };
190 
191 struct mpc_dwb_flow_control {
192 	int flow_ctrl_mode;
193 	int flow_ctrl_cnt0;
194 	int flow_ctrl_cnt1;
195 };
196 
197 /**
198  * struct mpcc - MPCC connection and blending configuration for a single MPCC instance.
199  *
200  * This struct is used as a node in an MPC tree.
201  */
202 struct mpcc {
203 	/**
204 	 * @mpcc_id: MPCC physical instance.
205 	 */
206 	int mpcc_id;
207 
208 	/**
209 	 * @dpp_id: DPP input to this MPCC
210 	 */
211 	int dpp_id;
212 
213 	/**
214 	 * @mpcc_bot: Pointer to bottom layer MPCC. NULL when not connected.
215 	 */
216 	struct mpcc *mpcc_bot;
217 
218 	/**
219 	 * @blnd_cfg: The blending configuration for this MPCC.
220 	 */
221 	struct mpcc_blnd_cfg blnd_cfg;
222 
223 	/**
224 	 * @sm_cfg: stereo mix setting for this MPCC
225 	 */
226 	struct mpcc_sm_cfg sm_cfg;
227 
228 	/**
229 	 * @shared_bottom:
230 	 *
231 	 * If MPCC output to both OPP and DWB endpoints, true. Otherwise, false.
232 	 */
233 	bool shared_bottom;
234 };
235 
236 /**
237  * struct mpc_tree - MPC tree represents all MPCC connections for a pipe.
238  *
239  *
240  */
241 struct mpc_tree {
242 	/**
243 	 * @opp_id: The OPP instance that owns this MPC tree.
244 	 */
245 	int opp_id;
246 
247 	/**
248 	 * @opp_list: the top MPCC layer of the MPC tree that outputs to OPP endpoint
249 	 */
250 	struct mpcc *opp_list;
251 };
252 
253 struct mpc {
254 	const struct mpc_funcs *funcs;
255 	struct dc_context *ctx;
256 
257 	struct mpcc mpcc_array[MAX_MPCC];
258 	struct pwl_params blender_params;
259 	bool cm_bypass_mode;
260 };
261 
262 struct mpcc_state {
263 	uint32_t opp_id;
264 	uint32_t dpp_id;
265 	uint32_t bot_mpcc_id;
266 	uint32_t mode;
267 	uint32_t alpha_mode;
268 	uint32_t pre_multiplied_alpha;
269 	uint32_t overlap_only;
270 	uint32_t idle;
271 	uint32_t busy;
272 	uint32_t shaper_lut_mode;
273 	uint32_t lut3d_mode;
274 	uint32_t lut3d_bit_depth;
275 	uint32_t lut3d_size;
276 	uint32_t rgam_mode;
277 	uint32_t rgam_lut;
278 	struct mpc_grph_gamut_adjustment gamut_remap;
279 };
280 
281 /**
282  * struct mpc_funcs - funcs
283  */
284 struct mpc_funcs {
285 	void (*read_mpcc_state)(
286 			struct mpc *mpc,
287 			int mpcc_inst,
288 			struct mpcc_state *s);
289 
290 	/**
291 	 * @insert_plane:
292 	 *
293 	 * Insert DPP into MPC tree based on specified blending position.
294 	 * Only used for planes that are part of blending chain for OPP output
295 	 *
296 	 * Parameters:
297 	 *
298 	 * - [in/out] mpc  - MPC context.
299 	 * - [in/out] tree - MPC tree structure that plane will be added to.
300 	 * - [in] blnd_cfg - MPCC blending configuration for the new blending layer.
301 	 * - [in] sm_cfg   - MPCC stereo mix configuration for the new blending layer.
302 	 *                   stereo mix must disable for the very bottom layer of the tree config.
303 	 * - [in] insert_above_mpcc - Insert new plane above this MPCC.
304 	 *                          If NULL, insert as bottom plane.
305 	 * - [in] dpp_id  - DPP instance for the plane to be added.
306 	 * - [in] mpcc_id - The MPCC physical instance to use for blending.
307 	 *
308 	 * Return:
309 	 *
310 	 * struct mpcc* - MPCC that was added.
311 	 */
312 	struct mpcc* (*insert_plane)(
313 			struct mpc *mpc,
314 			struct mpc_tree *tree,
315 			struct mpcc_blnd_cfg *blnd_cfg,
316 			struct mpcc_sm_cfg *sm_cfg,
317 			struct mpcc *insert_above_mpcc,
318 			int dpp_id,
319 			int mpcc_id);
320 
321 	/**
322 	 * @remove_mpcc:
323 	 *
324 	 * Remove a specified MPCC from the MPC tree.
325 	 *
326 	 * Parameters:
327 	 *
328 	 * - [in/out] mpc   - MPC context.
329 	 * - [in/out] tree  - MPC tree structure that plane will be removed from.
330 	 * - [in/out] mpcc  - MPCC to be removed from tree.
331 	 *
332 	 * Return:
333 	 *
334 	 * void
335 	 */
336 	void (*remove_mpcc)(
337 			struct mpc *mpc,
338 			struct mpc_tree *tree,
339 			struct mpcc *mpcc);
340 
341 	/**
342 	 * @mpc_init:
343 	 *
344 	 * Reset the MPCC HW status by disconnecting all muxes.
345 	 *
346 	 * Parameters:
347 	 *
348 	 * - [in/out] mpc - MPC context.
349 	 *
350 	 * Return:
351 	 *
352 	 * void
353 	 */
354 	void (*mpc_init)(struct mpc *mpc);
355 	void (*mpc_init_single_inst)(
356 			struct mpc *mpc,
357 			unsigned int mpcc_id);
358 
359 	/**
360 	 * @update_blending:
361 	 *
362 	 * Update the blending configuration for a specified MPCC.
363 	 *
364 	 * Parameters:
365 	 *
366 	 * - [in/out] mpc - MPC context.
367 	 * - [in] blnd_cfg - MPCC blending configuration.
368 	 * - [in] mpcc_id  - The MPCC physical instance.
369 	 *
370 	 * Return:
371 	 *
372 	 * void
373 	 */
374 	void (*update_blending)(
375 		struct mpc *mpc,
376 		struct mpcc_blnd_cfg *blnd_cfg,
377 		int mpcc_id);
378 
379 	/**
380 	 * @cursor_lock:
381 	 *
382 	 * Lock cursor updates for the specified OPP. OPP defines the set of
383 	 * MPCC that are locked together for cursor.
384 	 *
385 	 * Parameters:
386 	 *
387 	 * - [in] mpc - MPC context.
388 	 * - [in] opp_id  - The OPP to lock cursor updates on
389 	 * - [in] lock - lock/unlock the OPP
390 	 *
391 	 * Return:
392 	 *
393 	 * void
394 	 */
395 	void (*cursor_lock)(
396 			struct mpc *mpc,
397 			int opp_id,
398 			bool lock);
399 
400 	/**
401 	 * @insert_plane_to_secondary:
402 	 *
403 	 * Add DPP into secondary MPC tree based on specified blending
404 	 * position.  Only used for planes that are part of blending chain for
405 	 * DWB output
406 	 *
407 	 * Parameters:
408 	 *
409 	 * - [in/out] mpc  - MPC context.
410 	 * - [in/out] tree - MPC tree structure that plane will be added to.
411 	 * - [in] blnd_cfg - MPCC blending configuration for the new blending layer.
412 	 * - [in] sm_cfg   - MPCC stereo mix configuration for the new blending layer.
413 	 *	    stereo mix must disable for the very bottom layer of the tree config.
414 	 * - [in] insert_above_mpcc - Insert new plane above this MPCC.  If
415 	 *          NULL, insert as bottom plane.
416 	 * - [in] dpp_id - DPP instance for the plane to be added.
417 	 * - [in] mpcc_id - The MPCC physical instance to use for blending.
418 	 *
419 	 * Return:
420 	 *
421 	 * struct mpcc* - MPCC that was added.
422 	 */
423 	struct mpcc* (*insert_plane_to_secondary)(
424 			struct mpc *mpc,
425 			struct mpc_tree *tree,
426 			struct mpcc_blnd_cfg *blnd_cfg,
427 			struct mpcc_sm_cfg *sm_cfg,
428 			struct mpcc *insert_above_mpcc,
429 			int dpp_id,
430 			int mpcc_id);
431 
432 	/**
433 	 * @remove_mpcc_from_secondary:
434 	 *
435 	 * Remove a specified DPP from the 'secondary' MPC tree.
436 	 *
437 	 * Parameters:
438 	 *
439 	 * - [in/out] mpc  - MPC context.
440 	 * - [in/out] tree - MPC tree structure that plane will be removed from.
441 	 * - [in]     mpcc - MPCC to be removed from tree.
442 	 *
443 	 * Return:
444 	 *
445 	 * void
446 	 */
447 	void (*remove_mpcc_from_secondary)(
448 			struct mpc *mpc,
449 			struct mpc_tree *tree,
450 			struct mpcc *mpcc);
451 
452 	struct mpcc* (*get_mpcc_for_dpp_from_secondary)(
453 			struct mpc_tree *tree,
454 			int dpp_id);
455 
456 	struct mpcc* (*get_mpcc_for_dpp)(
457 			struct mpc_tree *tree,
458 			int dpp_id);
459 
460 	void (*wait_for_idle)(struct mpc *mpc, int id);
461 
462 	void (*assert_mpcc_idle_before_connect)(struct mpc *mpc, int mpcc_id);
463 
464 	void (*init_mpcc_list_from_hw)(
465 		struct mpc *mpc,
466 		struct mpc_tree *tree);
467 
468 	void (*set_denorm)(struct mpc *mpc,
469 			int opp_id,
470 			enum dc_color_depth output_depth);
471 
472 	void (*set_denorm_clamp)(
473 			struct mpc *mpc,
474 			int opp_id,
475 			struct mpc_denorm_clamp denorm_clamp);
476 
477 	void (*set_output_csc)(struct mpc *mpc,
478 			int opp_id,
479 			const uint16_t *regval,
480 			enum mpc_output_csc_mode ocsc_mode);
481 
482 	void (*set_ocsc_default)(struct mpc *mpc,
483 			int opp_id,
484 			enum dc_color_space color_space,
485 			enum mpc_output_csc_mode ocsc_mode);
486 
487 	void (*set_output_gamma)(
488 			struct mpc *mpc,
489 			int mpcc_id,
490 			const struct pwl_params *params);
491 	void (*power_on_mpc_mem_pwr)(
492 			struct mpc *mpc,
493 			int mpcc_id,
494 			bool power_on);
495 	void (*set_dwb_mux)(
496 			struct mpc *mpc,
497 			int dwb_id,
498 			int mpcc_id);
499 
500 	void (*disable_dwb_mux)(
501 		struct mpc *mpc,
502 		int dwb_id);
503 
504 	bool (*is_dwb_idle)(
505 		struct mpc *mpc,
506 		int dwb_id);
507 
508 	void (*set_out_rate_control)(
509 		struct mpc *mpc,
510 		int opp_id,
511 		bool enable,
512 		bool rate_2x_mode,
513 		struct mpc_dwb_flow_control *flow_control);
514 
515 	void (*set_gamut_remap)(
516 			struct mpc *mpc,
517 			int mpcc_id,
518 			const struct mpc_grph_gamut_adjustment *adjust);
519 
520 	bool (*program_1dlut)(
521 			struct mpc *mpc,
522 			const struct pwl_params *params,
523 			uint32_t rmu_idx);
524 
525 	bool (*program_shaper)(
526 			struct mpc *mpc,
527 			const struct pwl_params *params,
528 			uint32_t rmu_idx);
529 
530 	uint32_t (*acquire_rmu)(struct mpc *mpc, int mpcc_id, int rmu_idx);
531 
532 	bool (*program_3dlut)(
533 			struct mpc *mpc,
534 			const struct tetrahedral_params *params,
535 			int rmu_idx);
536 
537 	int (*release_rmu)(struct mpc *mpc, int mpcc_id);
538 
539 	unsigned int (*get_mpc_out_mux)(
540 			struct mpc *mpc,
541 			int opp_id);
542 
543 	void (*set_bg_color)(struct mpc *mpc,
544 			struct tg_color *bg_color,
545 			int mpcc_id);
546 	void (*set_mpc_mem_lp_mode)(struct mpc *mpc);
547 };
548 
549 #endif
550