2 * Copyright 2012-15 Advanced Micro Devices, Inc.
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:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
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.
29 #include "hw_shared.h"
30 #include "dc_hw_types.h"
31 #include "transform.h"
36 /* TODO: Need cleanup */
38 CLAMPING_FULL_RANGE
= 0, /* No Clamping */
39 CLAMPING_LIMITED_RANGE_8BPC
, /* 8 bpc: Clamping 1 to FE */
40 CLAMPING_LIMITED_RANGE_10BPC
, /* 10 bpc: Clamping 4 to 3FB */
41 CLAMPING_LIMITED_RANGE_12BPC
, /* 12 bpc: Clamping 10 to FEF */
42 /* Use programmable clampping value on FMT_CLAMP_COMPONENT_R/G/B. */
43 CLAMPING_LIMITED_RANGE_PROGRAMMABLE
46 struct clamping_and_pixel_encoding_params
{
47 enum dc_pixel_encoding pixel_encoding
; /* Pixel Encoding */
48 enum clamping_range clamping_level
; /* Clamping identifier */
49 enum dc_color_depth c_depth
; /* Deep color use. */
52 struct bit_depth_reduction_params
{
55 /* trunc/round enabled*/
56 uint32_t TRUNCATE_ENABLED
:1;
57 /* 2 bits: 0=6 bpc, 1=8 bpc, 2 = 10bpc*/
58 uint32_t TRUNCATE_DEPTH
:2;
59 /* truncate or round*/
60 uint32_t TRUNCATE_MODE
:1;
63 /* Spatial Bit Depth Reduction enabled*/
64 uint32_t SPATIAL_DITHER_ENABLED
:1;
65 /* 2 bits: 0=6 bpc, 1 = 8 bpc, 2 = 10bpc*/
66 uint32_t SPATIAL_DITHER_DEPTH
:2;
67 /* 0-3 to select patterns*/
68 uint32_t SPATIAL_DITHER_MODE
:2;
69 /* Enable RGB random dithering*/
70 uint32_t RGB_RANDOM
:1;
71 /* Enable Frame random dithering*/
72 uint32_t FRAME_RANDOM
:1;
73 /* Enable HighPass random dithering*/
74 uint32_t HIGHPASS_RANDOM
:1;
77 /* frame modulation enabled*/
78 uint32_t FRAME_MODULATION_ENABLED
:1;
79 /* same as for trunc/spatial*/
80 uint32_t FRAME_MODULATION_DEPTH
:2;
82 uint32_t TEMPORAL_LEVEL
:1;
88 uint32_t r_seed_value
;
89 uint32_t b_seed_value
;
90 uint32_t g_seed_value
;
91 enum dc_pixel_encoding pixel_encoding
;
94 enum wide_gamut_regamma_mode
{
95 /* 0x0 - BITS2:0 Bypass */
96 WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_BYPASS
,
97 /* 0x1 - Fixed curve sRGB 2.4 */
98 WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_SRGB24
,
99 /* 0x2 - Fixed curve xvYCC 2.22 */
100 WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_XYYCC22
,
101 /* 0x3 - Programmable control A */
102 WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_MATRIX_A
,
103 /* 0x4 - Programmable control B */
104 WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_MATRIX_B
,
105 /* 0x0 - BITS6:4 Bypass */
106 WIDE_GAMUT_REGAMMA_MODE_OVL_BYPASS
,
107 /* 0x1 - Fixed curve sRGB 2.4 */
108 WIDE_GAMUT_REGAMMA_MODE_OVL_SRGB24
,
109 /* 0x2 - Fixed curve xvYCC 2.22 */
110 WIDE_GAMUT_REGAMMA_MODE_OVL_XYYCC22
,
111 /* 0x3 - Programmable control A */
112 WIDE_GAMUT_REGAMMA_MODE_OVL_MATRIX_A
,
113 /* 0x4 - Programmable control B */
114 WIDE_GAMUT_REGAMMA_MODE_OVL_MATRIX_B
129 struct custom_float_format
{
130 uint32_t mantissa_bits
;
131 uint32_t exponenta_bits
;
135 struct custom_float_value
{
143 uint32_t custom_float_x
;
145 struct fixed31_32 regamma_y_red
;
146 struct fixed31_32 regamma_y_green
;
147 struct fixed31_32 regamma_y_blue
;
151 struct pwl_float_data_ex
{
155 struct fixed31_32 delta_r
;
156 struct fixed31_32 delta_g
;
157 struct fixed31_32 delta_b
;
160 enum hw_point_position
{
161 /* hw point sits between left and right sw points */
162 HW_POINT_POSITION_MIDDLE
,
163 /* hw point lays left from left (smaller) sw point */
164 HW_POINT_POSITION_LEFT
,
165 /* hw point lays stays from right (bigger) sw point */
166 HW_POINT_POSITION_RIGHT
172 enum hw_point_position pos
;
173 struct fixed31_32 coeff
;
176 struct pixel_gamma_point
{
177 struct gamma_point r
;
178 struct gamma_point g
;
179 struct gamma_point b
;
182 struct gamma_coefficients
{
183 struct fixed31_32 a0
[3];
184 struct fixed31_32 a1
[3];
185 struct fixed31_32 a2
[3];
186 struct fixed31_32 a3
[3];
187 struct fixed31_32 user_gamma
[3];
188 struct fixed31_32 user_contrast
;
189 struct fixed31_32 user_brightness
;
192 struct pwl_float_data
{
198 struct mpc_tree_cfg
{
204 struct output_pixel_processor
{
205 struct dc_context
*ctx
;
207 struct pwl_params regamma_params
;
208 struct mpc_tree mpc_tree_params
;
209 bool mpcc_disconnect_pending
[MAX_PIPES
];
210 const struct opp_funcs
*funcs
;
211 uint32_t dyn_expansion
;
214 enum fmt_stereo_action
{
215 FMT_STEREO_ACTION_ENABLE
= 0,
216 FMT_STEREO_ACTION_DISABLE
,
217 FMT_STEREO_ACTION_UPDATE_POLARITY
220 struct opp_grph_csc_adjustment
{
221 //enum grph_color_adjust_option color_adjust_option;
222 enum dc_color_space c_space
;
223 enum dc_color_depth color_depth
; /* clean up to uint32_t */
224 enum graphics_csc_adjust_type csc_adjust_type
;
225 int32_t adjust_divider
;
232 /* Underlay related types */
234 struct hw_adjustment_range
{
239 uint32_t divider
; /* (actually HW range is min/divider; divider !=0) */
242 enum ovl_csc_adjust_item
{
243 OVERLAY_BRIGHTNESS
= 0,
249 OVERLAY_ALPHA_PER_PIX
,
250 OVERLAY_COLOR_TEMPERATURE
253 enum oppbuf_display_segmentation
{
254 OPPBUF_DISPLAY_SEGMENTATION_1_SEGMENT
= 0,
255 OPPBUF_DISPLAY_SEGMENTATION_2_SEGMENT
= 1,
256 OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT
= 2,
257 OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT_SPLIT_LEFT
= 3,
258 OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT_SPLIT_RIGHT
= 4
261 struct oppbuf_params
{
262 uint32_t active_width
;
263 enum oppbuf_display_segmentation mso_segmentation
;
264 uint32_t mso_overlap_pixel_num
;
265 uint32_t pixel_repetition
;
266 uint32_t num_segment_padded_pixels
;
272 /* FORMATTER RELATED */
274 void (*opp_program_fmt
)(
275 struct output_pixel_processor
*opp
,
276 struct bit_depth_reduction_params
*fmt_bit_depth
,
277 struct clamping_and_pixel_encoding_params
*clamping
);
279 void (*opp_set_dyn_expansion
)(
280 struct output_pixel_processor
*opp
,
281 enum dc_color_space color_sp
,
282 enum dc_color_depth color_dpth
,
283 enum signal_type signal
);
285 void (*opp_program_bit_depth_reduction
)(
286 struct output_pixel_processor
*opp
,
287 const struct bit_depth_reduction_params
*params
);
289 /* underlay related */
290 void (*opp_get_underlay_adjustment_range
)(
291 struct output_pixel_processor
*opp
,
292 enum ovl_csc_adjust_item overlay_adjust_item
,
293 struct hw_adjustment_range
*range
);
295 void (*opp_destroy
)(struct output_pixel_processor
**opp
);
297 void (*opp_program_stereo
)(
298 struct output_pixel_processor
*opp
,
300 const struct dc_crtc_timing
*timing
);
302 void (*opp_pipe_clock_control
)(
303 struct output_pixel_processor
*opp
,
306 void (*opp_set_disp_pattern_generator
)(
307 struct output_pixel_processor
*opp
,
308 enum controller_dp_test_pattern test_pattern
,
309 enum controller_dp_color_space color_space
,
310 enum dc_color_depth color_depth
,
311 const struct tg_color
*solid_color
,
316 void (*opp_program_dpg_dimensions
)(
317 struct output_pixel_processor
*opp
,
321 bool (*dpg_is_blanked
)(
322 struct output_pixel_processor
*opp
);
324 void (*opp_dpg_set_blank_color
)(
325 struct output_pixel_processor
*opp
,
326 const struct tg_color
*color
);
328 void (*opp_program_left_edge_extra_pixel
)(
329 struct output_pixel_processor
*opp
,