Home | History | Annotate | Line # | Download | only in dc
      1 /*	$NetBSD: dc_dp_types.h,v 1.2 2021/12/18 23:45:00 riastradh Exp $	*/
      2 
      3 /*
      4  * Copyright 2016 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 DC_DP_TYPES_H
     29 #define DC_DP_TYPES_H
     30 
     31 #include "os_types.h"
     32 
     33 enum dc_lane_count {
     34 	LANE_COUNT_UNKNOWN = 0,
     35 	LANE_COUNT_ONE = 1,
     36 	LANE_COUNT_TWO = 2,
     37 	LANE_COUNT_FOUR = 4,
     38 	LANE_COUNT_EIGHT = 8,
     39 	LANE_COUNT_DP_MAX = LANE_COUNT_FOUR
     40 };
     41 
     42 /* This is actually a reference clock (27MHz) multiplier
     43  * 162MBps bandwidth for 1.62GHz like rate,
     44  * 270MBps for 2.70GHz,
     45  * 324MBps for 3.24Ghz,
     46  * 540MBps for 5.40GHz
     47  * 810MBps for 8.10GHz
     48  */
     49 enum dc_link_rate {
     50 	LINK_RATE_UNKNOWN = 0,
     51 	LINK_RATE_LOW = 0x06,		// Rate_1 (RBR)	- 1.62 Gbps/Lane
     52 	LINK_RATE_RATE_2 = 0x08,	// Rate_2		- 2.16 Gbps/Lane
     53 	LINK_RATE_RATE_3 = 0x09,	// Rate_3		- 2.43 Gbps/Lane
     54 	LINK_RATE_HIGH = 0x0A,		// Rate_4 (HBR)	- 2.70 Gbps/Lane
     55 	LINK_RATE_RBR2 = 0x0C,		// Rate_5 (RBR2)- 3.24 Gbps/Lane
     56 	LINK_RATE_RATE_6 = 0x10,	// Rate_6		- 4.32 Gbps/Lane
     57 	LINK_RATE_HIGH2 = 0x14,		// Rate_7 (HBR2)- 5.40 Gbps/Lane
     58 	LINK_RATE_HIGH3 = 0x1E		// Rate_8 (HBR3)- 8.10 Gbps/Lane
     59 };
     60 
     61 enum dc_link_spread {
     62 	LINK_SPREAD_DISABLED = 0x00,
     63 	/* 0.5 % downspread 30 kHz */
     64 	LINK_SPREAD_05_DOWNSPREAD_30KHZ = 0x10,
     65 	/* 0.5 % downspread 33 kHz */
     66 	LINK_SPREAD_05_DOWNSPREAD_33KHZ = 0x11
     67 };
     68 
     69 enum dc_voltage_swing {
     70 	VOLTAGE_SWING_LEVEL0 = 0,	/* direct HW translation! */
     71 	VOLTAGE_SWING_LEVEL1,
     72 	VOLTAGE_SWING_LEVEL2,
     73 	VOLTAGE_SWING_LEVEL3,
     74 	VOLTAGE_SWING_MAX_LEVEL = VOLTAGE_SWING_LEVEL3
     75 };
     76 
     77 enum dc_pre_emphasis {
     78 	PRE_EMPHASIS_DISABLED = 0,	/* direct HW translation! */
     79 	PRE_EMPHASIS_LEVEL1,
     80 	PRE_EMPHASIS_LEVEL2,
     81 	PRE_EMPHASIS_LEVEL3,
     82 	PRE_EMPHASIS_MAX_LEVEL = PRE_EMPHASIS_LEVEL3
     83 };
     84 /* Post Cursor 2 is optional for transmitter
     85  * and it applies only to the main link operating at HBR2
     86  */
     87 enum dc_post_cursor2 {
     88 	POST_CURSOR2_DISABLED = 0,	/* direct HW translation! */
     89 	POST_CURSOR2_LEVEL1,
     90 	POST_CURSOR2_LEVEL2,
     91 	POST_CURSOR2_LEVEL3,
     92 	POST_CURSOR2_MAX_LEVEL = POST_CURSOR2_LEVEL3,
     93 };
     94 
     95 enum dc_dp_training_pattern {
     96 	DP_TRAINING_PATTERN_SEQUENCE_1 = 0,
     97 	DP_TRAINING_PATTERN_SEQUENCE_2,
     98 	DP_TRAINING_PATTERN_SEQUENCE_3,
     99 	DP_TRAINING_PATTERN_SEQUENCE_4,
    100 };
    101 
    102 struct dc_link_settings {
    103 	enum dc_lane_count lane_count;
    104 	enum dc_link_rate link_rate;
    105 	enum dc_link_spread link_spread;
    106 	bool use_link_rate_set;
    107 	uint8_t link_rate_set;
    108 };
    109 
    110 struct dc_lane_settings {
    111 	enum dc_voltage_swing VOLTAGE_SWING;
    112 	enum dc_pre_emphasis PRE_EMPHASIS;
    113 	enum dc_post_cursor2 POST_CURSOR2;
    114 };
    115 
    116 struct dc_link_training_settings {
    117 	struct dc_link_settings link;
    118 	struct dc_lane_settings lane_settings[LANE_COUNT_DP_MAX];
    119 };
    120 
    121 struct dc_link_training_overrides {
    122 	enum dc_voltage_swing *voltage_swing;
    123 	enum dc_pre_emphasis *pre_emphasis;
    124 	enum dc_post_cursor2 *post_cursor2;
    125 
    126 	uint16_t *cr_pattern_time;
    127 	uint16_t *eq_pattern_time;
    128 	enum dc_dp_training_pattern *pattern_for_eq;
    129 
    130 	enum dc_link_spread *downspread;
    131 	bool *alternate_scrambler_reset;
    132 	bool *enhanced_framing;
    133 	bool *mst_enable;
    134 	bool *fec_enable;
    135 };
    136 
    137 union dpcd_rev {
    138 	struct {
    139 		uint8_t MINOR:4;
    140 		uint8_t MAJOR:4;
    141 	} bits;
    142 	uint8_t raw;
    143 };
    144 
    145 union max_lane_count {
    146 	struct {
    147 		uint8_t MAX_LANE_COUNT:5;
    148 		uint8_t POST_LT_ADJ_REQ_SUPPORTED:1;
    149 		uint8_t TPS3_SUPPORTED:1;
    150 		uint8_t ENHANCED_FRAME_CAP:1;
    151 	} bits;
    152 	uint8_t raw;
    153 };
    154 
    155 union max_down_spread {
    156 	struct {
    157 		uint8_t MAX_DOWN_SPREAD:1;
    158 		uint8_t RESERVED:5;
    159 		uint8_t NO_AUX_HANDSHAKE_LINK_TRAINING:1;
    160 		uint8_t TPS4_SUPPORTED:1;
    161 	} bits;
    162 	uint8_t raw;
    163 };
    164 
    165 union mstm_cap {
    166 	struct {
    167 		uint8_t MST_CAP:1;
    168 		uint8_t RESERVED:7;
    169 	} bits;
    170 	uint8_t raw;
    171 };
    172 
    173 union lane_count_set {
    174 	struct {
    175 		uint8_t LANE_COUNT_SET:5;
    176 		uint8_t POST_LT_ADJ_REQ_GRANTED:1;
    177 		uint8_t RESERVED:1;
    178 		uint8_t ENHANCED_FRAMING:1;
    179 	} bits;
    180 	uint8_t raw;
    181 };
    182 
    183 union lane_status {
    184 	struct {
    185 		uint8_t CR_DONE_0:1;
    186 		uint8_t CHANNEL_EQ_DONE_0:1;
    187 		uint8_t SYMBOL_LOCKED_0:1;
    188 		uint8_t RESERVED0:1;
    189 		uint8_t CR_DONE_1:1;
    190 		uint8_t CHANNEL_EQ_DONE_1:1;
    191 		uint8_t SYMBOL_LOCKED_1:1;
    192 		uint8_t RESERVED_1:1;
    193 	} bits;
    194 	uint8_t raw;
    195 };
    196 
    197 union device_service_irq {
    198 	struct {
    199 		uint8_t REMOTE_CONTROL_CMD_PENDING:1;
    200 		uint8_t AUTOMATED_TEST:1;
    201 		uint8_t CP_IRQ:1;
    202 		uint8_t MCCS_IRQ:1;
    203 		uint8_t DOWN_REP_MSG_RDY:1;
    204 		uint8_t UP_REQ_MSG_RDY:1;
    205 		uint8_t SINK_SPECIFIC:1;
    206 		uint8_t reserved:1;
    207 	} bits;
    208 	uint8_t raw;
    209 };
    210 
    211 union sink_count {
    212 	struct {
    213 		uint8_t SINK_COUNT:6;
    214 		uint8_t CPREADY:1;
    215 		uint8_t RESERVED:1;
    216 	} bits;
    217 	uint8_t raw;
    218 };
    219 
    220 union lane_align_status_updated {
    221 	struct {
    222 		uint8_t INTERLANE_ALIGN_DONE:1;
    223 		uint8_t POST_LT_ADJ_REQ_IN_PROGRESS:1;
    224 		uint8_t RESERVED:4;
    225 		uint8_t DOWNSTREAM_PORT_STATUS_CHANGED:1;
    226 		uint8_t LINK_STATUS_UPDATED:1;
    227 	} bits;
    228 	uint8_t raw;
    229 };
    230 
    231 union lane_adjust {
    232 	struct {
    233 		uint8_t VOLTAGE_SWING_LANE:2;
    234 		uint8_t PRE_EMPHASIS_LANE:2;
    235 		uint8_t RESERVED:4;
    236 	} bits;
    237 	uint8_t raw;
    238 };
    239 
    240 union dpcd_training_pattern {
    241 	struct {
    242 		uint8_t TRAINING_PATTERN_SET:4;
    243 		uint8_t RECOVERED_CLOCK_OUT_EN:1;
    244 		uint8_t SCRAMBLING_DISABLE:1;
    245 		uint8_t SYMBOL_ERROR_COUNT_SEL:2;
    246 	} v1_4;
    247 	struct {
    248 		uint8_t TRAINING_PATTERN_SET:2;
    249 		uint8_t LINK_QUAL_PATTERN_SET:2;
    250 		uint8_t RESERVED:4;
    251 	} v1_3;
    252 	uint8_t raw;
    253 };
    254 
    255 /* Training Lane is used to configure downstream DP device's voltage swing
    256 and pre-emphasis levels*/
    257 /* The DPCD addresses are from 0x103 to 0x106*/
    258 union dpcd_training_lane {
    259 	struct {
    260 		uint8_t VOLTAGE_SWING_SET:2;
    261 		uint8_t MAX_SWING_REACHED:1;
    262 		uint8_t PRE_EMPHASIS_SET:2;
    263 		uint8_t MAX_PRE_EMPHASIS_REACHED:1;
    264 		uint8_t RESERVED:2;
    265 	} bits;
    266 	uint8_t raw;
    267 };
    268 
    269 /* TMDS-converter related */
    270 union dwnstream_port_caps_byte0 {
    271 	struct {
    272 		uint8_t DWN_STRM_PORTX_TYPE:3;
    273 		uint8_t DWN_STRM_PORTX_HPD:1;
    274 		uint8_t RESERVERD:4;
    275 	} bits;
    276 	uint8_t raw;
    277 };
    278 
    279 /* these are the detailed types stored at DWN_STRM_PORTX_CAP (00080h)*/
    280 enum dpcd_downstream_port_detailed_type {
    281 	DOWN_STREAM_DETAILED_DP = 0,
    282 	DOWN_STREAM_DETAILED_VGA,
    283 	DOWN_STREAM_DETAILED_DVI,
    284 	DOWN_STREAM_DETAILED_HDMI,
    285 	DOWN_STREAM_DETAILED_NONDDC,/* has no EDID (TV,CV)*/
    286 	DOWN_STREAM_DETAILED_DP_PLUS_PLUS
    287 };
    288 
    289 union dwnstream_port_caps_byte2 {
    290 	struct {
    291 		uint8_t MAX_BITS_PER_COLOR_COMPONENT:2;
    292 		uint8_t RESERVED:6;
    293 	} bits;
    294 	uint8_t raw;
    295 };
    296 
    297 union dp_downstream_port_present {
    298 	uint8_t byte;
    299 	struct {
    300 		uint8_t PORT_PRESENT:1;
    301 		uint8_t PORT_TYPE:2;
    302 		uint8_t FMT_CONVERSION:1;
    303 		uint8_t DETAILED_CAPS:1;
    304 		uint8_t RESERVED:3;
    305 	} fields;
    306 };
    307 
    308 union dwnstream_port_caps_byte3_dvi {
    309 	struct {
    310 		uint8_t RESERVED1:1;
    311 		uint8_t DUAL_LINK:1;
    312 		uint8_t HIGH_COLOR_DEPTH:1;
    313 		uint8_t RESERVED2:5;
    314 	} bits;
    315 	uint8_t raw;
    316 };
    317 
    318 union dwnstream_port_caps_byte3_hdmi {
    319 	struct {
    320 		uint8_t FRAME_SEQ_TO_FRAME_PACK:1;
    321 		uint8_t YCrCr422_PASS_THROUGH:1;
    322 		uint8_t YCrCr420_PASS_THROUGH:1;
    323 		uint8_t YCrCr422_CONVERSION:1;
    324 		uint8_t YCrCr420_CONVERSION:1;
    325 		uint8_t RESERVED:3;
    326 	} bits;
    327 	uint8_t raw;
    328 };
    329 
    330 /*4-byte structure for detailed capabilities of a down-stream port
    331 (DP-to-TMDS converter).*/
    332 union dwnstream_portxcaps {
    333 	struct {
    334 		union dwnstream_port_caps_byte0 byte0;
    335 		unsigned char max_TMDS_clock;   //byte1
    336 		union dwnstream_port_caps_byte2 byte2;
    337 
    338 		union {
    339 			union dwnstream_port_caps_byte3_dvi byteDVI;
    340 			union dwnstream_port_caps_byte3_hdmi byteHDMI;
    341 		} byte3;
    342 	} bytes;
    343 
    344 	unsigned char raw[4];
    345 };
    346 
    347 union downstream_port {
    348 	struct {
    349 		unsigned char   present:1;
    350 		unsigned char   type:2;
    351 		unsigned char   format_conv:1;
    352 		unsigned char   detailed_caps:1;
    353 		unsigned char   reserved:3;
    354 	} bits;
    355 	unsigned char raw;
    356 };
    357 
    358 
    359 union sink_status {
    360 	struct {
    361 		uint8_t RX_PORT0_STATUS:1;
    362 		uint8_t RX_PORT1_STATUS:1;
    363 		uint8_t RESERVED:6;
    364 	} bits;
    365 	uint8_t raw;
    366 };
    367 
    368 /*6-byte structure corresponding to 6 registers (200h-205h)
    369 read during handling of HPD-IRQ*/
    370 union hpd_irq_data {
    371 	struct {
    372 		union sink_count sink_cnt;/* 200h */
    373 		union device_service_irq device_service_irq;/* 201h */
    374 		union lane_status lane01_status;/* 202h */
    375 		union lane_status lane23_status;/* 203h */
    376 		union lane_align_status_updated lane_status_updated;/* 204h */
    377 		union sink_status sink_status;
    378 	} bytes;
    379 	uint8_t raw[6];
    380 };
    381 
    382 union down_stream_port_count {
    383 	struct {
    384 		uint8_t DOWN_STR_PORT_COUNT:4;
    385 		uint8_t RESERVED:2; /*Bits 5:4 = RESERVED. Read all 0s.*/
    386 		/*Bit 6 = MSA_TIMING_PAR_IGNORED
    387 		0 = Sink device requires the MSA timing parameters
    388 		1 = Sink device is capable of rendering incoming video
    389 		 stream without MSA timing parameters*/
    390 		uint8_t IGNORE_MSA_TIMING_PARAM:1;
    391 		/*Bit 7 = OUI Support
    392 		0 = OUI not supported
    393 		1 = OUI supported
    394 		(OUI and Device Identification mandatory for DP 1.2)*/
    395 		uint8_t OUI_SUPPORT:1;
    396 	} bits;
    397 	uint8_t raw;
    398 };
    399 
    400 union down_spread_ctrl {
    401 	struct {
    402 		uint8_t RESERVED1:4;/* Bit 3:0 = RESERVED. Read all 0s*/
    403 	/* Bits 4 = SPREAD_AMP. Spreading amplitude
    404 	0 = Main link signal is not downspread
    405 	1 = Main link signal is downspread <= 0.5%
    406 	with frequency in the range of 30kHz ~ 33kHz*/
    407 		uint8_t SPREAD_AMP:1;
    408 		uint8_t RESERVED2:2;/*Bit 6:5 = RESERVED. Read all 0s*/
    409 	/*Bit 7 = MSA_TIMING_PAR_IGNORE_EN
    410 	0 = Source device will send valid data for the MSA Timing Params
    411 	1 = Source device may send invalid data for these MSA Timing Params*/
    412 		uint8_t IGNORE_MSA_TIMING_PARAM:1;
    413 	} bits;
    414 	uint8_t raw;
    415 };
    416 
    417 union dpcd_edp_config {
    418 	struct {
    419 		uint8_t PANEL_MODE_EDP:1;
    420 		uint8_t FRAMING_CHANGE_ENABLE:1;
    421 		uint8_t RESERVED:5;
    422 		uint8_t PANEL_SELF_TEST_ENABLE:1;
    423 	} bits;
    424 	uint8_t raw;
    425 };
    426 
    427 struct dp_device_vendor_id {
    428 	uint8_t ieee_oui[3];/*24-bit IEEE OUI*/
    429 	uint8_t ieee_device_id[6];/*usually 6-byte ASCII name*/
    430 };
    431 
    432 struct dp_sink_hw_fw_revision {
    433 	uint8_t ieee_hw_rev;
    434 	uint8_t ieee_fw_rev[2];
    435 };
    436 
    437 /*DPCD register of DP receiver capability field bits-*/
    438 union edp_configuration_cap {
    439 	struct {
    440 		uint8_t ALT_SCRAMBLER_RESET:1;
    441 		uint8_t FRAMING_CHANGE:1;
    442 		uint8_t RESERVED:1;
    443 		uint8_t DPCD_DISPLAY_CONTROL_CAPABLE:1;
    444 		uint8_t RESERVED2:4;
    445 	} bits;
    446 	uint8_t raw;
    447 };
    448 
    449 union dprx_feature {
    450 	struct {
    451 		uint8_t GTC_CAP:1;                             // bit 0: DP 1.3+
    452 		uint8_t SST_SPLIT_SDP_CAP:1;                   // bit 1: DP 1.4
    453 		uint8_t AV_SYNC_CAP:1;                         // bit 2: DP 1.3+
    454 		uint8_t VSC_SDP_COLORIMETRY_SUPPORTED:1;       // bit 3: DP 1.3+
    455 		uint8_t VSC_EXT_VESA_SDP_SUPPORTED:1;          // bit 4: DP 1.4
    456 		uint8_t VSC_EXT_VESA_SDP_CHAINING_SUPPORTED:1; // bit 5: DP 1.4
    457 		uint8_t VSC_EXT_CEA_SDP_SUPPORTED:1;           // bit 6: DP 1.4
    458 		uint8_t VSC_EXT_CEA_SDP_CHAINING_SUPPORTED:1;  // bit 7: DP 1.4
    459 	} bits;
    460 	uint8_t raw;
    461 };
    462 
    463 union training_aux_rd_interval {
    464 	struct {
    465 		uint8_t TRAINIG_AUX_RD_INTERVAL:7;
    466 		uint8_t EXT_RECEIVER_CAP_FIELD_PRESENT:1;
    467 	} bits;
    468 	uint8_t raw;
    469 };
    470 
    471 /* Automated test structures */
    472 union test_request {
    473 	struct {
    474 	uint8_t LINK_TRAINING                :1;
    475 	uint8_t LINK_TEST_PATTRN             :1;
    476 	uint8_t EDID_READ                    :1;
    477 	uint8_t PHY_TEST_PATTERN             :1;
    478 	uint8_t RESERVED                     :1;
    479 	uint8_t AUDIO_TEST_PATTERN           :1;
    480 	uint8_t TEST_AUDIO_DISABLED_VIDEO    :1;
    481 	} bits;
    482 	uint8_t raw;
    483 };
    484 
    485 union test_response {
    486 	struct {
    487 		uint8_t ACK         :1;
    488 		uint8_t NO_ACK      :1;
    489 		uint8_t EDID_CHECKSUM_WRITE:1;
    490 		uint8_t RESERVED    :5;
    491 	} bits;
    492 	uint8_t raw;
    493 };
    494 
    495 union phy_test_pattern {
    496 	struct {
    497 		/* DpcdPhyTestPatterns. This field is 2 bits for DP1.1
    498 		 * and 3 bits for DP1.2.
    499 		 */
    500 		uint8_t PATTERN     :3;
    501 		/* BY speci, bit7:2 is 0 for DP1.1. */
    502 		uint8_t RESERVED    :5;
    503 	} bits;
    504 	uint8_t raw;
    505 };
    506 
    507 /* States of Compliance Test Specification (CTS DP1.2). */
    508 union compliance_test_state {
    509 	struct {
    510 		unsigned char STEREO_3D_RUNNING        : 1;
    511 		unsigned char RESERVED                 : 7;
    512 	} bits;
    513 	unsigned char raw;
    514 };
    515 
    516 union link_test_pattern {
    517 	struct {
    518 		/* dpcd_link_test_patterns */
    519 		unsigned char PATTERN :2;
    520 		unsigned char RESERVED:6;
    521 	} bits;
    522 	unsigned char raw;
    523 };
    524 
    525 union test_misc {
    526 	struct dpcd_test_misc_bits {
    527 		unsigned char SYNC_CLOCK  :1;
    528 		/* dpcd_test_color_format */
    529 		unsigned char CLR_FORMAT  :2;
    530 		/* dpcd_test_dyn_range */
    531 		unsigned char DYN_RANGE   :1;
    532 		unsigned char YCBCR_COEFS :1;
    533 		/* dpcd_test_bit_depth */
    534 		unsigned char BPC         :3;
    535 	} bits;
    536 	unsigned char raw;
    537 };
    538 
    539 union audio_test_mode {
    540 	struct {
    541 		unsigned char sampling_rate   :4;
    542 		unsigned char channel_count   :4;
    543 	} bits;
    544 	unsigned char raw;
    545 };
    546 
    547 union audio_test_pattern_period {
    548 	struct {
    549 		unsigned char pattern_period   :4;
    550 		unsigned char reserved         :4;
    551 	} bits;
    552 	unsigned char raw;
    553 };
    554 
    555 struct audio_test_pattern_type {
    556 	unsigned char value;
    557 };
    558 
    559 struct dp_audio_test_data_flags {
    560 	uint8_t test_requested  :1;
    561 	uint8_t disable_video   :1;
    562 };
    563 
    564 struct dp_audio_test_data {
    565 
    566 	struct dp_audio_test_data_flags flags;
    567 	uint8_t sampling_rate;
    568 	uint8_t channel_count;
    569 	uint8_t pattern_type;
    570 	uint8_t pattern_period[8];
    571 };
    572 
    573 /* FEC capability DPCD register field bits-*/
    574 union dpcd_fec_capability {
    575 	struct {
    576 		uint8_t FEC_CAPABLE:1;
    577 		uint8_t UNCORRECTED_BLOCK_ERROR_COUNT_CAPABLE:1;
    578 		uint8_t CORRECTED_BLOCK_ERROR_COUNT_CAPABLE:1;
    579 		uint8_t BIT_ERROR_COUNT_CAPABLE:1;
    580 		uint8_t RESERVED:4;
    581 	} bits;
    582 	uint8_t raw;
    583 };
    584 
    585 /* DSC capability DPCD register field bits-*/
    586 struct dpcd_dsc_support {
    587 	uint8_t DSC_SUPPORT		:1;
    588 	uint8_t DSC_PASSTHROUGH_SUPPORT	:1;
    589 	uint8_t RESERVED		:6;
    590 };
    591 
    592 struct dpcd_dsc_algorithm_revision {
    593 	uint8_t DSC_VERSION_MAJOR	:4;
    594 	uint8_t DSC_VERSION_MINOR	:4;
    595 };
    596 
    597 struct dpcd_dsc_rc_buffer_block_size {
    598 	uint8_t RC_BLOCK_BUFFER_SIZE	:2;
    599 	uint8_t RESERVED		:6;
    600 };
    601 
    602 struct dpcd_dsc_slice_capability1 {
    603 	uint8_t ONE_SLICE_PER_DP_DSC_SINK_DEVICE	:1;
    604 	uint8_t TWO_SLICES_PER_DP_DSC_SINK_DEVICE	:1;
    605 	uint8_t RESERVED				:1;
    606 	uint8_t FOUR_SLICES_PER_DP_DSC_SINK_DEVICE	:1;
    607 	uint8_t SIX_SLICES_PER_DP_DSC_SINK_DEVICE	:1;
    608 	uint8_t EIGHT_SLICES_PER_DP_DSC_SINK_DEVICE	:1;
    609 	uint8_t TEN_SLICES_PER_DP_DSC_SINK_DEVICE	:1;
    610 	uint8_t TWELVE_SLICES_PER_DP_DSC_SINK_DEVICE	:1;
    611 };
    612 
    613 struct dpcd_dsc_line_buffer_bit_depth {
    614 	uint8_t LINE_BUFFER_BIT_DEPTH	:4;
    615 	uint8_t RESERVED		:4;
    616 };
    617 
    618 struct dpcd_dsc_block_prediction_support {
    619 	uint8_t BLOCK_PREDICTION_SUPPORT:1;
    620 	uint8_t RESERVED		:7;
    621 };
    622 
    623 struct dpcd_maximum_bits_per_pixel_supported_by_the_decompressor {
    624 	uint8_t MAXIMUM_BITS_PER_PIXEL_SUPPORTED_BY_THE_DECOMPRESSOR_LOW	:7;
    625 	uint8_t MAXIMUM_BITS_PER_PIXEL_SUPPORTED_BY_THE_DECOMPRESSOR_HIGH	:7;
    626 	uint8_t RESERVED							:2;
    627 };
    628 
    629 struct dpcd_dsc_decoder_color_format_capabilities {
    630 	uint8_t RGB_SUPPORT			:1;
    631 	uint8_t Y_CB_CR_444_SUPPORT		:1;
    632 	uint8_t Y_CB_CR_SIMPLE_422_SUPPORT	:1;
    633 	uint8_t Y_CB_CR_NATIVE_422_SUPPORT	:1;
    634 	uint8_t Y_CB_CR_NATIVE_420_SUPPORT	:1;
    635 	uint8_t RESERVED			:3;
    636 };
    637 
    638 struct dpcd_dsc_decoder_color_depth_capabilities {
    639 	uint8_t RESERVED0			:1;
    640 	uint8_t EIGHT_BITS_PER_COLOR_SUPPORT	:1;
    641 	uint8_t TEN_BITS_PER_COLOR_SUPPORT	:1;
    642 	uint8_t TWELVE_BITS_PER_COLOR_SUPPORT	:1;
    643 	uint8_t RESERVED1			:4;
    644 };
    645 
    646 struct dpcd_peak_dsc_throughput_dsc_sink {
    647 	uint8_t THROUGHPUT_MODE_0:4;
    648 	uint8_t THROUGHPUT_MODE_1:4;
    649 };
    650 
    651 struct dpcd_dsc_slice_capabilities_2 {
    652 	uint8_t SIXTEEN_SLICES_PER_DSC_SINK_DEVICE	:1;
    653 	uint8_t TWENTY_SLICES_PER_DSC_SINK_DEVICE	:1;
    654 	uint8_t TWENTYFOUR_SLICES_PER_DSC_SINK_DEVICE	:1;
    655 	uint8_t RESERVED				:5;
    656 };
    657 
    658 struct dpcd_bits_per_pixel_increment{
    659 	uint8_t INCREMENT_OF_BITS_PER_PIXEL_SUPPORTED	:3;
    660 	uint8_t RESERVED				:5;
    661 };
    662 union dpcd_dsc_basic_capabilities {
    663 	struct {
    664 		struct dpcd_dsc_support dsc_support;
    665 		struct dpcd_dsc_algorithm_revision dsc_algorithm_revision;
    666 		struct dpcd_dsc_rc_buffer_block_size dsc_rc_buffer_block_size;
    667 		uint8_t dsc_rc_buffer_size;
    668 		struct dpcd_dsc_slice_capability1 dsc_slice_capabilities_1;
    669 		struct dpcd_dsc_line_buffer_bit_depth dsc_line_buffer_bit_depth;
    670 		struct dpcd_dsc_block_prediction_support dsc_block_prediction_support;
    671 		struct dpcd_maximum_bits_per_pixel_supported_by_the_decompressor maximum_bits_per_pixel_supported_by_the_decompressor;
    672 		struct dpcd_dsc_decoder_color_format_capabilities dsc_decoder_color_format_capabilities;
    673 		struct dpcd_dsc_decoder_color_depth_capabilities dsc_decoder_color_depth_capabilities;
    674 		struct dpcd_peak_dsc_throughput_dsc_sink peak_dsc_throughput_dsc_sink;
    675 		uint8_t dsc_maximum_slice_width;
    676 		struct dpcd_dsc_slice_capabilities_2 dsc_slice_capabilities_2;
    677 		uint8_t reserved;
    678 		struct dpcd_bits_per_pixel_increment bits_per_pixel_increment;
    679 	} fields;
    680 	uint8_t raw[16];
    681 };
    682 
    683 union dpcd_dsc_ext_capabilities {
    684 	struct {
    685 		uint8_t BRANCH_OVERALL_THROUGHPUT_0;
    686 		uint8_t BRANCH_OVERALL_THROUGHPUT_1;
    687 		uint8_t BRANCH_MAX_LINE_WIDTH;
    688 	} fields;
    689 	uint8_t raw[3];
    690 };
    691 
    692 struct dpcd_dsc_capabilities {
    693 	union dpcd_dsc_basic_capabilities dsc_basic_caps;
    694 	union dpcd_dsc_ext_capabilities dsc_ext_caps;
    695 };
    696 
    697 
    698 #endif /* DC_DP_TYPES_H */
    699