| /* |
| * Copyright 2012-15 Advanced Micro Devices, Inc. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in |
| * all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| * OTHER DEALINGS IN THE SOFTWARE. |
| * |
| * Authors: AMD |
| * |
| */ |
| |
| #ifndef __DAL_OPP_H__ |
| #define __DAL_OPP_H__ |
| |
| #include "hw_shared.h" |
| #include "dc_hw_types.h" |
| #include "transform.h" |
| #include "mpc.h" |
| |
| struct fixed31_32; |
| |
| /* TODO: Need cleanup */ |
| enum clamping_range { |
| CLAMPING_FULL_RANGE = 0, /* No Clamping */ |
| CLAMPING_LIMITED_RANGE_8BPC, /* 8 bpc: Clamping 1 to FE */ |
| CLAMPING_LIMITED_RANGE_10BPC, /* 10 bpc: Clamping 4 to 3FB */ |
| CLAMPING_LIMITED_RANGE_12BPC, /* 12 bpc: Clamping 10 to FEF */ |
| /* Use programmable clampping value on FMT_CLAMP_COMPONENT_R/G/B. */ |
| CLAMPING_LIMITED_RANGE_PROGRAMMABLE |
| }; |
| |
| struct clamping_and_pixel_encoding_params { |
| enum dc_pixel_encoding pixel_encoding; /* Pixel Encoding */ |
| enum clamping_range clamping_level; /* Clamping identifier */ |
| enum dc_color_depth c_depth; /* Deep color use. */ |
| }; |
| |
| struct bit_depth_reduction_params { |
| struct { |
| /* truncate/round */ |
| /* trunc/round enabled*/ |
| uint32_t TRUNCATE_ENABLED:1; |
| /* 2 bits: 0=6 bpc, 1=8 bpc, 2 = 10bpc*/ |
| uint32_t TRUNCATE_DEPTH:2; |
| /* truncate or round*/ |
| uint32_t TRUNCATE_MODE:1; |
| |
| /* spatial dither */ |
| /* Spatial Bit Depth Reduction enabled*/ |
| uint32_t SPATIAL_DITHER_ENABLED:1; |
| /* 2 bits: 0=6 bpc, 1 = 8 bpc, 2 = 10bpc*/ |
| uint32_t SPATIAL_DITHER_DEPTH:2; |
| /* 0-3 to select patterns*/ |
| uint32_t SPATIAL_DITHER_MODE:2; |
| /* Enable RGB random dithering*/ |
| uint32_t RGB_RANDOM:1; |
| /* Enable Frame random dithering*/ |
| uint32_t FRAME_RANDOM:1; |
| /* Enable HighPass random dithering*/ |
| uint32_t HIGHPASS_RANDOM:1; |
| |
| /* temporal dither*/ |
| /* frame modulation enabled*/ |
| uint32_t FRAME_MODULATION_ENABLED:1; |
| /* same as for trunc/spatial*/ |
| uint32_t FRAME_MODULATION_DEPTH:2; |
| /* 2/4 gray levels*/ |
| uint32_t TEMPORAL_LEVEL:1; |
| uint32_t FRC25:2; |
| uint32_t FRC50:2; |
| uint32_t FRC75:2; |
| } flags; |
| |
| uint32_t r_seed_value; |
| uint32_t b_seed_value; |
| uint32_t g_seed_value; |
| enum dc_pixel_encoding pixel_encoding; |
| }; |
| |
| enum wide_gamut_regamma_mode { |
| /* 0x0 - BITS2:0 Bypass */ |
| WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_BYPASS, |
| /* 0x1 - Fixed curve sRGB 2.4 */ |
| WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_SRGB24, |
| /* 0x2 - Fixed curve xvYCC 2.22 */ |
| WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_XYYCC22, |
| /* 0x3 - Programmable control A */ |
| WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_MATRIX_A, |
| /* 0x4 - Programmable control B */ |
| WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_MATRIX_B, |
| /* 0x0 - BITS6:4 Bypass */ |
| WIDE_GAMUT_REGAMMA_MODE_OVL_BYPASS, |
| /* 0x1 - Fixed curve sRGB 2.4 */ |
| WIDE_GAMUT_REGAMMA_MODE_OVL_SRGB24, |
| /* 0x2 - Fixed curve xvYCC 2.22 */ |
| WIDE_GAMUT_REGAMMA_MODE_OVL_XYYCC22, |
| /* 0x3 - Programmable control A */ |
| WIDE_GAMUT_REGAMMA_MODE_OVL_MATRIX_A, |
| /* 0x4 - Programmable control B */ |
| WIDE_GAMUT_REGAMMA_MODE_OVL_MATRIX_B |
| }; |
| |
| struct gamma_pixel { |
| struct fixed31_32 r; |
| struct fixed31_32 g; |
| struct fixed31_32 b; |
| }; |
| |
| enum channel_name { |
| CHANNEL_NAME_RED, |
| CHANNEL_NAME_GREEN, |
| CHANNEL_NAME_BLUE |
| }; |
| |
| struct custom_float_format { |
| uint32_t mantissa_bits; |
| uint32_t exponenta_bits; |
| bool sign; |
| }; |
| |
| struct custom_float_value { |
| uint32_t mantissa; |
| uint32_t exponenta; |
| uint32_t value; |
| bool negative; |
| }; |
| |
| struct hw_x_point { |
| uint32_t custom_float_x; |
| struct fixed31_32 x; |
| struct fixed31_32 regamma_y_red; |
| struct fixed31_32 regamma_y_green; |
| struct fixed31_32 regamma_y_blue; |
| |
| }; |
| |
| struct pwl_float_data_ex { |
| struct fixed31_32 r; |
| struct fixed31_32 g; |
| struct fixed31_32 b; |
| struct fixed31_32 delta_r; |
| struct fixed31_32 delta_g; |
| struct fixed31_32 delta_b; |
| }; |
| |
| enum hw_point_position { |
| /* hw point sits between left and right sw points */ |
| HW_POINT_POSITION_MIDDLE, |
| /* hw point lays left from left (smaller) sw point */ |
| HW_POINT_POSITION_LEFT, |
| /* hw point lays stays from right (bigger) sw point */ |
| HW_POINT_POSITION_RIGHT |
| }; |
| |
| struct gamma_point { |
| int32_t left_index; |
| int32_t right_index; |
| enum hw_point_position pos; |
| struct fixed31_32 coeff; |
| }; |
| |
| struct pixel_gamma_point { |
| struct gamma_point r; |
| struct gamma_point g; |
| struct gamma_point b; |
| }; |
| |
| struct gamma_coefficients { |
| struct fixed31_32 a0[3]; |
| struct fixed31_32 a1[3]; |
| struct fixed31_32 a2[3]; |
| struct fixed31_32 a3[3]; |
| struct fixed31_32 user_gamma[3]; |
| struct fixed31_32 user_contrast; |
| struct fixed31_32 user_brightness; |
| }; |
| |
| struct pwl_float_data { |
| struct fixed31_32 r; |
| struct fixed31_32 g; |
| struct fixed31_32 b; |
| }; |
| |
| struct mpc_tree_cfg { |
| int num_pipes; |
| int dpp[MAX_PIPES]; |
| int mpcc[MAX_PIPES]; |
| }; |
| |
| struct output_pixel_processor { |
| struct dc_context *ctx; |
| uint32_t inst; |
| struct pwl_params regamma_params; |
| struct mpc_tree mpc_tree_params; |
| bool mpcc_disconnect_pending[MAX_PIPES]; |
| const struct opp_funcs *funcs; |
| uint32_t dyn_expansion; |
| }; |
| |
| enum fmt_stereo_action { |
| FMT_STEREO_ACTION_ENABLE = 0, |
| FMT_STEREO_ACTION_DISABLE, |
| FMT_STEREO_ACTION_UPDATE_POLARITY |
| }; |
| |
| struct opp_grph_csc_adjustment { |
| //enum grph_color_adjust_option color_adjust_option; |
| enum dc_color_space c_space; |
| enum dc_color_depth color_depth; /* clean up to uint32_t */ |
| enum graphics_csc_adjust_type csc_adjust_type; |
| int32_t adjust_divider; |
| int32_t grph_cont; |
| int32_t grph_sat; |
| int32_t grph_bright; |
| int32_t grph_hue; |
| }; |
| |
| /* Underlay related types */ |
| |
| struct hw_adjustment_range { |
| int32_t hw_default; |
| int32_t min; |
| int32_t max; |
| int32_t step; |
| uint32_t divider; /* (actually HW range is min/divider; divider !=0) */ |
| }; |
| |
| enum ovl_csc_adjust_item { |
| OVERLAY_BRIGHTNESS = 0, |
| OVERLAY_GAMMA, |
| OVERLAY_CONTRAST, |
| OVERLAY_SATURATION, |
| OVERLAY_HUE, |
| OVERLAY_ALPHA, |
| OVERLAY_ALPHA_PER_PIX, |
| OVERLAY_COLOR_TEMPERATURE |
| }; |
| |
| enum oppbuf_display_segmentation { |
| OPPBUF_DISPLAY_SEGMENTATION_1_SEGMENT = 0, |
| OPPBUF_DISPLAY_SEGMENTATION_2_SEGMENT = 1, |
| OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT = 2, |
| OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT_SPLIT_LEFT = 3, |
| OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT_SPLIT_RIGHT = 4 |
| }; |
| |
| struct oppbuf_params { |
| uint32_t active_width; |
| enum oppbuf_display_segmentation mso_segmentation; |
| uint32_t mso_overlap_pixel_num; |
| uint32_t pixel_repetition; |
| uint32_t num_segment_padded_pixels; |
| }; |
| |
| struct opp_funcs { |
| |
| |
| /* FORMATTER RELATED */ |
| |
| void (*opp_program_fmt)( |
| struct output_pixel_processor *opp, |
| struct bit_depth_reduction_params *fmt_bit_depth, |
| struct clamping_and_pixel_encoding_params *clamping); |
| |
| void (*opp_set_dyn_expansion)( |
| struct output_pixel_processor *opp, |
| enum dc_color_space color_sp, |
| enum dc_color_depth color_dpth, |
| enum signal_type signal); |
| |
| void (*opp_program_bit_depth_reduction)( |
| struct output_pixel_processor *opp, |
| const struct bit_depth_reduction_params *params); |
| |
| /* underlay related */ |
| void (*opp_get_underlay_adjustment_range)( |
| struct output_pixel_processor *opp, |
| enum ovl_csc_adjust_item overlay_adjust_item, |
| struct hw_adjustment_range *range); |
| |
| void (*opp_destroy)(struct output_pixel_processor **opp); |
| |
| void (*opp_program_stereo)( |
| struct output_pixel_processor *opp, |
| bool enable, |
| const struct dc_crtc_timing *timing); |
| |
| void (*opp_pipe_clock_control)( |
| struct output_pixel_processor *opp, |
| bool enable); |
| |
| void (*opp_set_disp_pattern_generator)( |
| 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, |
| const struct tg_color *solid_color, |
| int width, |
| int height); |
| |
| bool (*dpg_is_blanked)( |
| struct output_pixel_processor *opp); |
| |
| void (*opp_dpg_set_blank_color)( |
| struct output_pixel_processor *opp, |
| const struct tg_color *color); |
| |
| void (*opp_program_left_edge_extra_pixel)( |
| struct output_pixel_processor *opp, |
| bool count); |
| |
| }; |
| |
| #endif |