Home | History | Annotate | Line # | Download | only in hw
      1 /*	$NetBSD: opp.h,v 1.2 2021/12/18 23:45:05 riastradh Exp $	*/
      2 
      3 /*
      4  * Copyright 2012-15 Advanced Micro Devices, Inc.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included in
     14  * all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     22  * OTHER DEALINGS IN THE SOFTWARE.
     23  *
     24  * Authors: AMD
     25  *
     26  */
     27 
     28 #ifndef __DAL_OPP_H__
     29 #define __DAL_OPP_H__
     30 
     31 #include "hw_shared.h"
     32 #include "dc_hw_types.h"
     33 #include "transform.h"
     34 #include "mpc.h"
     35 
     36 struct fixed31_32;
     37 
     38 /* TODO: Need cleanup */
     39 enum clamping_range {
     40 	CLAMPING_FULL_RANGE = 0,	   /* No Clamping */
     41 	CLAMPING_LIMITED_RANGE_8BPC,   /* 8  bpc: Clamping 1  to FE */
     42 	CLAMPING_LIMITED_RANGE_10BPC, /* 10 bpc: Clamping 4  to 3FB */
     43 	CLAMPING_LIMITED_RANGE_12BPC, /* 12 bpc: Clamping 10 to FEF */
     44 	/* Use programmable clampping value on FMT_CLAMP_COMPONENT_R/G/B. */
     45 	CLAMPING_LIMITED_RANGE_PROGRAMMABLE
     46 };
     47 
     48 struct clamping_and_pixel_encoding_params {
     49 	enum dc_pixel_encoding pixel_encoding; /* Pixel Encoding */
     50 	enum clamping_range clamping_level; /* Clamping identifier */
     51 	enum dc_color_depth c_depth; /* Deep color use. */
     52 };
     53 
     54 struct bit_depth_reduction_params {
     55 	struct {
     56 		/* truncate/round */
     57 		/* trunc/round enabled*/
     58 		uint32_t TRUNCATE_ENABLED:1;
     59 		/* 2 bits: 0=6 bpc, 1=8 bpc, 2 = 10bpc*/
     60 		uint32_t TRUNCATE_DEPTH:2;
     61 		/* truncate or round*/
     62 		uint32_t TRUNCATE_MODE:1;
     63 
     64 		/* spatial dither */
     65 		/* Spatial Bit Depth Reduction enabled*/
     66 		uint32_t SPATIAL_DITHER_ENABLED:1;
     67 		/* 2 bits: 0=6 bpc, 1 = 8 bpc, 2 = 10bpc*/
     68 		uint32_t SPATIAL_DITHER_DEPTH:2;
     69 		/* 0-3 to select patterns*/
     70 		uint32_t SPATIAL_DITHER_MODE:2;
     71 		/* Enable RGB random dithering*/
     72 		uint32_t RGB_RANDOM:1;
     73 		/* Enable Frame random dithering*/
     74 		uint32_t FRAME_RANDOM:1;
     75 		/* Enable HighPass random dithering*/
     76 		uint32_t HIGHPASS_RANDOM:1;
     77 
     78 		/* temporal dither*/
     79 		 /* frame modulation enabled*/
     80 		uint32_t FRAME_MODULATION_ENABLED:1;
     81 		/* same as for trunc/spatial*/
     82 		uint32_t FRAME_MODULATION_DEPTH:2;
     83 		/* 2/4 gray levels*/
     84 		uint32_t TEMPORAL_LEVEL:1;
     85 		uint32_t FRC25:2;
     86 		uint32_t FRC50:2;
     87 		uint32_t FRC75:2;
     88 	} flags;
     89 
     90 	uint32_t r_seed_value;
     91 	uint32_t b_seed_value;
     92 	uint32_t g_seed_value;
     93 	enum dc_pixel_encoding pixel_encoding;
     94 };
     95 
     96 enum wide_gamut_regamma_mode {
     97 	/*  0x0  - BITS2:0 Bypass */
     98 	WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_BYPASS,
     99 	/*  0x1  - Fixed curve sRGB 2.4 */
    100 	WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_SRGB24,
    101 	/*  0x2  - Fixed curve xvYCC 2.22 */
    102 	WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_XYYCC22,
    103 	/*  0x3  - Programmable control A */
    104 	WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_MATRIX_A,
    105 	/*  0x4  - Programmable control B */
    106 	WIDE_GAMUT_REGAMMA_MODE_GRAPHICS_MATRIX_B,
    107 	/*  0x0  - BITS6:4 Bypass */
    108 	WIDE_GAMUT_REGAMMA_MODE_OVL_BYPASS,
    109 	/*  0x1  - Fixed curve sRGB 2.4 */
    110 	WIDE_GAMUT_REGAMMA_MODE_OVL_SRGB24,
    111 	/*  0x2  - Fixed curve xvYCC 2.22 */
    112 	WIDE_GAMUT_REGAMMA_MODE_OVL_XYYCC22,
    113 	/*  0x3  - Programmable control A */
    114 	WIDE_GAMUT_REGAMMA_MODE_OVL_MATRIX_A,
    115 	/*  0x4  - Programmable control B */
    116 	WIDE_GAMUT_REGAMMA_MODE_OVL_MATRIX_B
    117 };
    118 
    119 struct gamma_pixel {
    120 	struct fixed31_32 r;
    121 	struct fixed31_32 g;
    122 	struct fixed31_32 b;
    123 };
    124 
    125 enum channel_name {
    126 	CHANNEL_NAME_RED,
    127 	CHANNEL_NAME_GREEN,
    128 	CHANNEL_NAME_BLUE
    129 };
    130 
    131 struct custom_float_format {
    132 	uint32_t mantissa_bits;
    133 	uint32_t exponenta_bits;
    134 	bool sign;
    135 };
    136 
    137 struct custom_float_value {
    138 	uint32_t mantissa;
    139 	uint32_t exponenta;
    140 	uint32_t value;
    141 	bool negative;
    142 };
    143 
    144 struct hw_x_point {
    145 	uint32_t custom_float_x;
    146 	struct fixed31_32 x;
    147 	struct fixed31_32 regamma_y_red;
    148 	struct fixed31_32 regamma_y_green;
    149 	struct fixed31_32 regamma_y_blue;
    150 
    151 };
    152 
    153 struct pwl_float_data_ex {
    154 	struct fixed31_32 r;
    155 	struct fixed31_32 g;
    156 	struct fixed31_32 b;
    157 	struct fixed31_32 delta_r;
    158 	struct fixed31_32 delta_g;
    159 	struct fixed31_32 delta_b;
    160 };
    161 
    162 enum hw_point_position {
    163 	/* hw point sits between left and right sw points */
    164 	HW_POINT_POSITION_MIDDLE,
    165 	/* hw point lays left from left (smaller) sw point */
    166 	HW_POINT_POSITION_LEFT,
    167 	/* hw point lays stays from right (bigger) sw point */
    168 	HW_POINT_POSITION_RIGHT
    169 };
    170 
    171 struct gamma_point {
    172 	int32_t left_index;
    173 	int32_t right_index;
    174 	enum hw_point_position pos;
    175 	struct fixed31_32 coeff;
    176 };
    177 
    178 struct pixel_gamma_point {
    179 	struct gamma_point r;
    180 	struct gamma_point g;
    181 	struct gamma_point b;
    182 };
    183 
    184 struct gamma_coefficients {
    185 	struct fixed31_32 a0[3];
    186 	struct fixed31_32 a1[3];
    187 	struct fixed31_32 a2[3];
    188 	struct fixed31_32 a3[3];
    189 	struct fixed31_32 user_gamma[3];
    190 	struct fixed31_32 user_contrast;
    191 	struct fixed31_32 user_brightness;
    192 };
    193 
    194 struct pwl_float_data {
    195 	struct fixed31_32 r;
    196 	struct fixed31_32 g;
    197 	struct fixed31_32 b;
    198 };
    199 
    200 struct mpc_tree_cfg {
    201 	int num_pipes;
    202 	int dpp[MAX_PIPES];
    203 	int mpcc[MAX_PIPES];
    204 };
    205 
    206 struct output_pixel_processor {
    207 	struct dc_context *ctx;
    208 	uint32_t inst;
    209 	struct pwl_params regamma_params;
    210 	struct mpc_tree mpc_tree_params;
    211 	bool mpcc_disconnect_pending[MAX_PIPES];
    212 	const struct opp_funcs *funcs;
    213 	uint32_t dyn_expansion;
    214 };
    215 
    216 enum fmt_stereo_action {
    217 	FMT_STEREO_ACTION_ENABLE = 0,
    218 	FMT_STEREO_ACTION_DISABLE,
    219 	FMT_STEREO_ACTION_UPDATE_POLARITY
    220 };
    221 
    222 struct opp_grph_csc_adjustment {
    223 	//enum grph_color_adjust_option color_adjust_option;
    224 	enum dc_color_space c_space;
    225 	enum dc_color_depth color_depth; /* clean up to uint32_t */
    226 	enum graphics_csc_adjust_type   csc_adjust_type;
    227 	int32_t adjust_divider;
    228 	int32_t grph_cont;
    229 	int32_t grph_sat;
    230 	int32_t grph_bright;
    231 	int32_t grph_hue;
    232 };
    233 
    234 /* Underlay related types */
    235 
    236 struct hw_adjustment_range {
    237 	int32_t hw_default;
    238 	int32_t min;
    239 	int32_t max;
    240 	int32_t step;
    241 	uint32_t divider; /* (actually HW range is min/divider; divider !=0) */
    242 };
    243 
    244 enum ovl_csc_adjust_item {
    245 	OVERLAY_BRIGHTNESS = 0,
    246 	OVERLAY_GAMMA,
    247 	OVERLAY_CONTRAST,
    248 	OVERLAY_SATURATION,
    249 	OVERLAY_HUE,
    250 	OVERLAY_ALPHA,
    251 	OVERLAY_ALPHA_PER_PIX,
    252 	OVERLAY_COLOR_TEMPERATURE
    253 };
    254 
    255 enum oppbuf_display_segmentation {
    256 	OPPBUF_DISPLAY_SEGMENTATION_1_SEGMENT = 0,
    257 	OPPBUF_DISPLAY_SEGMENTATION_2_SEGMENT = 1,
    258 	OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT = 2,
    259 	OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT_SPLIT_LEFT = 3,
    260 	OPPBUF_DISPLAY_SEGMENTATION_4_SEGMENT_SPLIT_RIGHT = 4
    261 };
    262 
    263 struct oppbuf_params {
    264 	uint32_t active_width;
    265 	enum oppbuf_display_segmentation mso_segmentation;
    266 	uint32_t mso_overlap_pixel_num;
    267 	uint32_t pixel_repetition;
    268 	uint32_t num_segment_padded_pixels;
    269 };
    270 
    271 struct opp_funcs {
    272 
    273 
    274 	/* FORMATTER RELATED */
    275 
    276 	void (*opp_program_fmt)(
    277 			struct output_pixel_processor *opp,
    278 			struct bit_depth_reduction_params *fmt_bit_depth,
    279 			struct clamping_and_pixel_encoding_params *clamping);
    280 
    281 	void (*opp_set_dyn_expansion)(
    282 		struct output_pixel_processor *opp,
    283 		enum dc_color_space color_sp,
    284 		enum dc_color_depth color_dpth,
    285 		enum signal_type signal);
    286 
    287 	void (*opp_program_bit_depth_reduction)(
    288 		struct output_pixel_processor *opp,
    289 		const struct bit_depth_reduction_params *params);
    290 
    291 	/* underlay related */
    292 	void (*opp_get_underlay_adjustment_range)(
    293 			struct output_pixel_processor *opp,
    294 			enum ovl_csc_adjust_item overlay_adjust_item,
    295 			struct hw_adjustment_range *range);
    296 
    297 	void (*opp_destroy)(struct output_pixel_processor **opp);
    298 
    299 	void (*opp_program_stereo)(
    300 		struct output_pixel_processor *opp,
    301 		bool enable,
    302 		const struct dc_crtc_timing *timing);
    303 
    304 	void (*opp_pipe_clock_control)(
    305 			struct output_pixel_processor *opp,
    306 			bool enable);
    307 
    308 	void (*opp_set_disp_pattern_generator)(
    309 			struct output_pixel_processor *opp,
    310 			enum controller_dp_test_pattern test_pattern,
    311 			enum controller_dp_color_space color_space,
    312 			enum dc_color_depth color_depth,
    313 			const struct tg_color *solid_color,
    314 			int width,
    315 			int height);
    316 
    317 	bool (*dpg_is_blanked)(
    318 			struct output_pixel_processor *opp);
    319 
    320 	void (*opp_dpg_set_blank_color)(
    321 			struct output_pixel_processor *opp,
    322 			const struct tg_color *color);
    323 
    324 	void (*opp_program_left_edge_extra_pixel)(
    325 			struct output_pixel_processor *opp,
    326 			bool count);
    327 
    328 };
    329 
    330 #endif
    331