1 /* 2 * Copyright 2012-15 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 /** 27 * DOC: overview 28 * 29 * The Output Plane Processor (OPP) block groups have functions that format 30 * pixel streams such that they are suitable for display at the display device. 31 * The key functions contained in the OPP are: 32 * 33 * - Adaptive Backlight Modulation (ABM) 34 * - Formatter (FMT) which provide pixel-by-pixel operations for format the 35 * incoming pixel stream. 36 * - Output Buffer that provide pixel replication, and overlapping. 37 * - Interface between MPC and OPTC. 38 * - Clock and reset generation. 39 * - CRC generation. 40 */ 41 42 #ifndef __DAL_OPP_H__ 43 #define __DAL_OPP_H__ 44 45 #include "hw_shared.h" 46 #include "dc_hw_types.h" 47 #include "transform.h" 48 #include "mpc.h" 49 50 struct fixed31_32; 51 52 /* TODO: Need cleanup */ 53 enum clamping_range { 54 CLAMPING_FULL_RANGE = 0, /* No Clamping */ 55 CLAMPING_LIMITED_RANGE_8BPC, /* 8 bpc: Clamping 1 to FE */ 56 CLAMPING_LIMITED_RANGE_10BPC, /* 10 bpc: Clamping 4 to 3FB */ 57 CLAMPING_LIMITED_RANGE_12BPC, /* 12 bpc: Clamping 10 to FEF */ 58 /* Use programmable clampping value on FMT_CLAMP_COMPONENT_R/G/B. */ 59 CLAMPING_LIMITED_RANGE_PROGRAMMABLE 60 }; 61 62 struct clamping_and_pixel_encoding_params { 63 enum dc_pixel_encoding pixel_encoding; /* Pixel Encoding */ 64 enum clamping_range clamping_level; /* Clamping identifier */ 65 enum dc_color_depth c_depth; /* Deep color use. */ 66 }; 67 68 struct bit_depth_reduction_params { 69 struct { 70 /* truncate/round */ 71 /* trunc/round enabled*/ 72 uint32_t TRUNCATE_ENABLED:1; 73 /* 2 bits: 0=6 bpc, 1=8 bpc, 2 = 10bpc*/ 74 uint32_t TRUNCATE_DEPTH:2; 75 /* truncate or round*/ 76 uint32_t TRUNCATE_MODE:1; 77 78 /* spatial dither */ 79 /* Spatial Bit Depth Reduction enabled*/ 80 uint32_t SPATIAL_DITHER_ENABLED:1; 81 /* 2 bits: 0=6 bpc, 1 = 8 bpc, 2 = 10bpc*/ 82 uint32_t SPATIAL_DITHER_DEPTH:2; 83 /* 0-3 to select patterns*/ 84 uint32_t SPATIAL_DITHER_MODE:2; 85 /* Enable RGB random dithering*/ 86 uint32_t RGB_RANDOM:1; 87 /* Enable Frame random dithering*/ 88 uint32_t FRAME_RANDOM:1; 89 /* Enable HighPass random dithering*/ 90 uint32_t HIGHPASS_RANDOM:1; 91 92 /* temporal dither*/ 93 /* frame modulation enabled*/ 94 uint32_t FRAME_MODULATION_ENABLED:1; 95 /* same as for trunc/spatial*/ 96 uint32_t FRAME_MODULATION_DEPTH:2; 97 /* 2/4 gray levels*/ 98 uint32_t TEMPORAL_LEVEL:1; 99 uint32_t FRC25:2; 100 uint32_t FRC50:2; 101 uint32_t FRC75:2; 102 } flags; 103 104 uint32_t r_seed_value; 105 uint32_t b_seed_value; 106 uint32_t g_seed_value; 107 enum dc_pixel_encoding pixel_encoding; 108 }; 109 110 enum wide_gamut_regamma_mode { 111 /* 0x0 - BITS2:0 Bypass */ 112 WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_BYPASS, 113 /* 0x1 - Fixed curve sRGB 2.4 */ 114 WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_SRGB24, 115 /* 0x2 - Fixed curve xvYCC 2.22 */ 116 WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_XYYCC22, 117 /* 0x3 - Programmable control A */ 118 WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_MATRIX_A, 119 /* 0x4 - Programmable control B */ 120 WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_MATRIX_B, 121 /* 0x0 - BITS6:4 Bypass */ 122 WIDE_GAMUT_REGAMMA_MODE_OVL_BYPASS, 123 /* 0x1 - Fixed curve sRGB 2.4 */ 124 WIDE_GAMUT_REGAMMA_MODE_OVL_SRGB24, 125 /* 0x2 - Fixed curve xvYCC 2.22 */ 126 WIDE_GAMUT_REGAMMA_MODE_OVL_XYYCC22, 127 /* 0x3 - Programmable control A */ 128 WIDE_GAMUT_REGAMMA_MODE_OVL_MATRIX_A, 129 /* 0x4 - Programmable control B */ 130 WIDE_GAMUT_REGAMMA_MODE_OVL_MATRIX_B 131 }; 132 133 struct gamma_pixel { 134 struct fixed31_32 r; 135 struct fixed31_32 g; 136 struct fixed31_32 b; 137 }; 138 139 enum channel_name { 140 CHANNEL_NAME_RED, 141 CHANNEL_NAME_GREEN, 142 CHANNEL_NAME_BLUE 143 }; 144 145 struct custom_float_format { 146 uint32_t mantissa_bits; 147 uint32_t exponenta_bits; 148 bool sign; 149 }; 150 151 struct custom_float_value { 152 uint32_t mantissa; 153 uint32_t exponenta; 154 uint32_t value; 155 bool negative; 156 }; 157 158 struct hw_x_point { 159 uint32_t custom_float_x; 160 struct fixed31_32 x; 161 struct fixed31_32 regamma_y_red; 162 struct fixed31_32 regamma_y_green; 163 struct fixed31_32 regamma_y_blue; 164 165 }; 166 167 struct pwl_float_data_ex { 168 struct fixed31_32 r; 169 struct fixed31_32 g; 170 struct fixed31_32 b; 171 struct fixed31_32 delta_r; 172 struct fixed31_32 delta_g; 173 struct fixed31_32 delta_b; 174 }; 175 176 enum hw_point_position { 177 /* hw point sits between left and right sw points */ 178 HW_POINT_POSITION_MIDDLE, 179 /* hw point lays left from left (smaller) sw point */ 180 HW_POINT_POSITION_LEFT, 181 /* hw point lays stays from right (bigger) sw point */ 182 HW_POINT_POSITION_RIGHT 183 }; 184 185 struct gamma_point { 186 int32_t left_index; 187 int32_t right_index; 188 enum hw_point_position pos; 189 struct fixed31_32 coeff; 190 }; 191 192 struct pixel_gamma_point { 193 struct gamma_point r; 194 struct gamma_point g; 195 struct gamma_point b; 196 }; 197 198 struct gamma_coefficients { 199 struct fixed31_32 a0[3]; 200 struct fixed31_32 a1[3]; 201 struct fixed31_32 a2[3]; 202 struct fixed31_32 a3[3]; 203 struct fixed31_32 user_gamma[3]; 204 struct fixed31_32 user_contrast; 205 struct fixed31_32 user_brightness; 206 }; 207 208 /** 209 * struct pwl_float_data - Fixed point RGB color 210 */ 211 struct pwl_float_data { 212 /** 213 * @r: Component Red. 214 */ 215 struct fixed31_32 r; 216 217 /** 218 * @g: Component Green. 219 */ 220 221 struct fixed31_32 g; 222 223 /** 224 * @b: Component Blue. 225 */ 226 struct fixed31_32 b; 227 }; 228 229 struct mpc_tree_cfg { 230 int num_pipes; 231 int dpp[MAX_PIPES]; 232 int mpcc[MAX_PIPES]; 233 }; 234 235 struct output_pixel_processor { 236 struct dc_context *ctx; 237 uint32_t inst; 238 struct pwl_params regamma_params; 239 struct mpc_tree mpc_tree_params; 240 bool mpcc_disconnect_pending[MAX_PIPES]; 241 const struct opp_funcs *funcs; 242 uint32_t dyn_expansion; 243 }; 244 245 enum fmt_stereo_action { 246 FMT_STEREO_ACTION_ENABLE = 0, 247 FMT_STEREO_ACTION_DISABLE, 248 FMT_STEREO_ACTION_UPDATE_POLARITY 249 }; 250 251 struct opp_grph_csc_adjustment { 252 //enum grph_color_adjust_option color_adjust_option; 253 enum dc_color_space c_space; 254 enum dc_color_depth color_depth; /* clean up to uint32_t */ 255 enum graphics_csc_adjust_type csc_adjust_type; 256 int32_t adjust_divider; 257 int32_t grph_cont; 258 int32_t grph_sat; 259 int32_t grph_bright; 260 int32_t grph_hue; 261 }; 262 263 /* Underlay related types */ 264 265 struct hw_adjustment_range { 266 int32_t hw_default; 267 int32_t min; 268 int32_t max; 269 int32_t step; 270 uint32_t divider; /* (actually HW range is min/divider; divider !=0) */ 271 }; 272 273 enum ovl_csc_adjust_item { 274 OVERLAY_BRIGHTNESS = 0, 275 OVERLAY_GAMMA, 276 OVERLAY_CONTRAST, 277 OVERLAY_SATURATION, 278 OVERLAY_HUE, 279 OVERLAY_ALPHA, 280 OVERLAY_ALPHA_PER_PIX, 281 OVERLAY_COLOR_TEMPERATURE 282 }; 283 284 enum oppbuf_display_segmentation { 285 OPPBUF_DISPLAY_SEGMENTATION_1_SEGMENT = 0, 286 OPPBUF_DISPLAY_SEGMENTATION_2_SEGMENT = 1, 287 OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT = 2, 288 OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT_SPLIT_LEFT = 3, 289 OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT_SPLIT_RIGHT = 4 290 }; 291 292 struct oppbuf_params { 293 uint32_t active_width; 294 enum oppbuf_display_segmentation mso_segmentation; 295 uint32_t mso_overlap_pixel_num; 296 uint32_t pixel_repetition; 297 uint32_t num_segment_padded_pixels; 298 }; 299 300 struct opp_funcs { 301 302 303 /* FORMATTER RELATED */ 304 305 void (*opp_program_fmt)( 306 struct output_pixel_processor *opp, 307 struct bit_depth_reduction_params *fmt_bit_depth, 308 struct clamping_and_pixel_encoding_params *clamping); 309 310 void (*opp_set_dyn_expansion)( 311 struct output_pixel_processor *opp, 312 enum dc_color_space color_sp, 313 enum dc_color_depth color_dpth, 314 enum signal_type signal); 315 316 void (*opp_program_bit_depth_reduction)( 317 struct output_pixel_processor *opp, 318 const struct bit_depth_reduction_params *params); 319 320 /* underlay related */ 321 void (*opp_get_underlay_adjustment_range)( 322 struct output_pixel_processor *opp, 323 enum ovl_csc_adjust_item overlay_adjust_item, 324 struct hw_adjustment_range *range); 325 326 void (*opp_destroy)(struct output_pixel_processor **opp); 327 328 void (*opp_program_stereo)( 329 struct output_pixel_processor *opp, 330 bool enable, 331 const struct dc_crtc_timing *timing); 332 333 void (*opp_pipe_clock_control)( 334 struct output_pixel_processor *opp, 335 bool enable); 336 337 void (*opp_set_disp_pattern_generator)( 338 struct output_pixel_processor *opp, 339 enum controller_dp_test_pattern test_pattern, 340 enum controller_dp_color_space color_space, 341 enum dc_color_depth color_depth, 342 const struct tg_color *solid_color, 343 int width, 344 int height, 345 int offset); 346 347 void (*opp_program_dpg_dimensions)( 348 struct output_pixel_processor *opp, 349 int width, 350 int height); 351 352 bool (*dpg_is_blanked)( 353 struct output_pixel_processor *opp); 354 355 bool (*dpg_is_pending)(struct output_pixel_processor *opp); 356 357 358 void (*opp_dpg_set_blank_color)( 359 struct output_pixel_processor *opp, 360 const struct tg_color *color); 361 362 void (*opp_program_left_edge_extra_pixel)( 363 struct output_pixel_processor *opp, 364 enum dc_pixel_encoding pixel_encoding, 365 bool is_primary); 366 367 uint32_t (*opp_get_left_edge_extra_pixel_count)( 368 struct output_pixel_processor *opp, 369 enum dc_pixel_encoding pixel_encoding, 370 bool is_primary); 371 }; 372 373 #endif 374