0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #include "mod_info_packet.h"
0027 #include "core_types.h"
0028 #include "dc_types.h"
0029 #include "mod_shared.h"
0030 #include "mod_freesync.h"
0031 #include "dc.h"
0032
0033 enum vsc_packet_revision {
0034 vsc_packet_undefined = 0,
0035
0036 vsc_packet_rev1 = 1,
0037
0038 vsc_packet_rev2 = 2,
0039
0040 vsc_packet_rev3 = 3,
0041
0042 vsc_packet_rev4 = 4,
0043
0044 vsc_packet_rev5 = 5,
0045 };
0046
0047 #define HDMI_INFOFRAME_TYPE_VENDOR 0x81
0048 #define HF_VSIF_VERSION 1
0049
0050
0051 #define VTEM_PB0 0
0052 #define VTEM_PB1 1
0053 #define VTEM_PB2 2
0054 #define VTEM_PB3 3
0055 #define VTEM_PB4 4
0056 #define VTEM_PB5 5
0057 #define VTEM_PB6 6
0058
0059 #define VTEM_MD0 7
0060 #define VTEM_MD1 8
0061 #define VTEM_MD2 9
0062 #define VTEM_MD3 10
0063
0064
0065
0066
0067 #define MASK_VTEM_PB0__RESERVED0 0x01
0068 #define MASK_VTEM_PB0__SYNC 0x02
0069 #define MASK_VTEM_PB0__VFR 0x04
0070 #define MASK_VTEM_PB0__AFR 0x08
0071 #define MASK_VTEM_PB0__DS_TYPE 0x30
0072
0073
0074
0075
0076 #define MASK_VTEM_PB0__END 0x40
0077 #define MASK_VTEM_PB0__NEW 0x80
0078
0079
0080 #define MASK_VTEM_PB1__RESERVED1 0xFF
0081
0082
0083 #define MASK_VTEM_PB2__ORGANIZATION_ID 0xFF
0084
0085
0086
0087
0088
0089 #define MASK_VTEM_PB3__DATA_SET_TAG_MSB 0xFF
0090
0091 #define MASK_VTEM_PB4__DATA_SET_TAG_LSB 0xFF
0092
0093 #define MASK_VTEM_PB5__DATA_SET_LENGTH_MSB 0xFF
0094
0095 #define MASK_VTEM_PB6__DATA_SET_LENGTH_LSB 0xFF
0096
0097
0098
0099
0100
0101 #define MASK_VTEM_MD0__VRR_EN 0x01
0102 #define MASK_VTEM_MD0__M_CONST 0x02
0103 #define MASK_VTEM_MD0__QMS_EN 0x04
0104 #define MASK_VTEM_MD0__RESERVED2 0x08
0105 #define MASK_VTEM_MD0__FVA_FACTOR_M1 0xF0
0106
0107
0108 #define MASK_VTEM_MD1__BASE_VFRONT 0xFF
0109
0110
0111 #define MASK_VTEM_MD2__BASE_REFRESH_RATE_98 0x03
0112 #define MASK_VTEM_MD2__RB 0x04
0113 #define MASK_VTEM_MD2__NEXT_TFR 0xF8
0114
0115
0116 #define MASK_VTEM_MD3__BASE_REFRESH_RATE_07 0xFF
0117
0118 enum ColorimetryRGBDP {
0119 ColorimetryRGB_DP_sRGB = 0,
0120 ColorimetryRGB_DP_AdobeRGB = 3,
0121 ColorimetryRGB_DP_P3 = 4,
0122 ColorimetryRGB_DP_CustomColorProfile = 5,
0123 ColorimetryRGB_DP_ITU_R_BT2020RGB = 6,
0124 };
0125 enum ColorimetryYCCDP {
0126 ColorimetryYCC_DP_ITU601 = 0,
0127 ColorimetryYCC_DP_ITU709 = 1,
0128 ColorimetryYCC_DP_AdobeYCC = 5,
0129 ColorimetryYCC_DP_ITU2020YCC = 6,
0130 ColorimetryYCC_DP_ITU2020YCbCr = 7,
0131 };
0132
0133 void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
0134 struct dc_info_packet *info_packet,
0135 enum dc_color_space cs)
0136 {
0137 unsigned int vsc_packet_revision = vsc_packet_undefined;
0138 unsigned int i;
0139 unsigned int pixelEncoding = 0;
0140 unsigned int colorimetryFormat = 0;
0141 bool stereo3dSupport = false;
0142
0143 if (stream->timing.timing_3d_format != TIMING_3D_FORMAT_NONE && stream->view_format != VIEW_3D_FORMAT_NONE) {
0144 vsc_packet_revision = vsc_packet_rev1;
0145 stereo3dSupport = true;
0146 }
0147
0148
0149 if (stream->link->psr_settings.psr_version == DC_PSR_VERSION_SU_1)
0150 vsc_packet_revision = vsc_packet_rev4;
0151 else if (stream->link->psr_settings.psr_version == DC_PSR_VERSION_1)
0152 vsc_packet_revision = vsc_packet_rev2;
0153
0154
0155 if (stream->use_vsc_sdp_for_colorimetry)
0156 vsc_packet_revision = vsc_packet_rev5;
0157
0158
0159
0160
0161 if (vsc_packet_revision == vsc_packet_undefined)
0162 return;
0163
0164 if (vsc_packet_revision == vsc_packet_rev4) {
0165
0166 info_packet->hb0 = 0x00;
0167
0168
0169
0170 info_packet->hb1 = 0x07;
0171
0172
0173
0174 info_packet->hb2 = 0x04;
0175
0176
0177
0178
0179 info_packet->hb3 = 0x0E;
0180
0181 for (i = 0; i < 28; i++)
0182 info_packet->sb[i] = 0;
0183
0184 info_packet->valid = true;
0185 }
0186
0187 if (vsc_packet_revision == vsc_packet_rev2) {
0188
0189 info_packet->hb0 = 0x00;
0190
0191
0192
0193 info_packet->hb1 = 0x07;
0194
0195
0196
0197 info_packet->hb2 = 0x02;
0198
0199
0200
0201 info_packet->hb3 = 0x08;
0202
0203 for (i = 0; i < 28; i++)
0204 info_packet->sb[i] = 0;
0205
0206 info_packet->valid = true;
0207 }
0208
0209 if (vsc_packet_revision == vsc_packet_rev1) {
0210
0211 info_packet->hb0 = 0x00;
0212 info_packet->hb1 = 0x07;
0213 info_packet->hb2 = 0x01;
0214 info_packet->hb3 = 0x01;
0215
0216 info_packet->valid = true;
0217 }
0218
0219 if (stereo3dSupport) {
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247 switch (stream->timing.timing_3d_format) {
0248 case TIMING_3D_FORMAT_HW_FRAME_PACKING:
0249 case TIMING_3D_FORMAT_SW_FRAME_PACKING:
0250 case TIMING_3D_FORMAT_TOP_AND_BOTTOM:
0251 case TIMING_3D_FORMAT_TB_SW_PACKED:
0252 info_packet->sb[0] = 0x02;
0253 break;
0254 case TIMING_3D_FORMAT_DP_HDMI_INBAND_FA:
0255 case TIMING_3D_FORMAT_INBAND_FA:
0256 info_packet->sb[0] = 0x01;
0257 break;
0258 case TIMING_3D_FORMAT_SIDE_BY_SIDE:
0259 case TIMING_3D_FORMAT_SBS_SW_PACKED:
0260 info_packet->sb[0] = 0x04;
0261 break;
0262 default:
0263 info_packet->sb[0] = 0x00;
0264 break;
0265 }
0266
0267 }
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280 if (vsc_packet_revision == vsc_packet_rev5) {
0281
0282 info_packet->hb0 = 0x00;
0283
0284 info_packet->hb1 = 0x07;
0285
0286 info_packet->hb2 = 0x05;
0287
0288 info_packet->hb3 = 0x13;
0289
0290 info_packet->valid = true;
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340 switch (stream->timing.pixel_encoding) {
0341 case PIXEL_ENCODING_RGB:
0342 pixelEncoding = 0x0;
0343 break;
0344 case PIXEL_ENCODING_YCBCR444:
0345 pixelEncoding = 0x1;
0346 break;
0347 case PIXEL_ENCODING_YCBCR422:
0348 pixelEncoding = 0x2;
0349 break;
0350 case PIXEL_ENCODING_YCBCR420:
0351 pixelEncoding = 0x3;
0352 break;
0353 default:
0354 pixelEncoding = 0x0;
0355 break;
0356 }
0357
0358
0359 switch (stream->timing.pixel_encoding) {
0360 case PIXEL_ENCODING_RGB:
0361 if ((cs == COLOR_SPACE_SRGB) ||
0362 (cs == COLOR_SPACE_SRGB_LIMITED))
0363 colorimetryFormat = ColorimetryRGB_DP_sRGB;
0364 else if (cs == COLOR_SPACE_ADOBERGB)
0365 colorimetryFormat = ColorimetryRGB_DP_AdobeRGB;
0366 else if ((cs == COLOR_SPACE_2020_RGB_FULLRANGE) ||
0367 (cs == COLOR_SPACE_2020_RGB_LIMITEDRANGE))
0368 colorimetryFormat = ColorimetryRGB_DP_ITU_R_BT2020RGB;
0369 break;
0370
0371 case PIXEL_ENCODING_YCBCR444:
0372 case PIXEL_ENCODING_YCBCR422:
0373 case PIXEL_ENCODING_YCBCR420:
0374
0375
0376
0377 if (cs == COLOR_SPACE_YCBCR601)
0378 colorimetryFormat = ColorimetryYCC_DP_ITU601;
0379 else if (cs == COLOR_SPACE_YCBCR709)
0380 colorimetryFormat = ColorimetryYCC_DP_ITU709;
0381 else if (cs == COLOR_SPACE_ADOBERGB)
0382 colorimetryFormat = ColorimetryYCC_DP_AdobeYCC;
0383 else if (cs == COLOR_SPACE_2020_YCBCR)
0384 colorimetryFormat = ColorimetryYCC_DP_ITU2020YCbCr;
0385 break;
0386
0387 default:
0388 colorimetryFormat = ColorimetryRGB_DP_sRGB;
0389 break;
0390 }
0391
0392 info_packet->sb[16] = (pixelEncoding << 4) | colorimetryFormat;
0393
0394
0395 switch (stream->timing.display_color_depth) {
0396 case COLOR_DEPTH_666:
0397
0398
0399
0400 info_packet->sb[17] = 0;
0401 break;
0402 case COLOR_DEPTH_888:
0403 info_packet->sb[17] = 1;
0404 break;
0405 case COLOR_DEPTH_101010:
0406 info_packet->sb[17] = 2;
0407 break;
0408 case COLOR_DEPTH_121212:
0409 info_packet->sb[17] = 3;
0410 break;
0411
0412 case COLOR_DEPTH_161616:
0413 info_packet->sb[17] = 4;
0414 break;
0415 default:
0416 info_packet->sb[17] = 0;
0417 break;
0418 }
0419
0420
0421 if ((cs == COLOR_SPACE_SRGB_LIMITED) ||
0422 (cs == COLOR_SPACE_2020_RGB_LIMITEDRANGE) ||
0423 (pixelEncoding != 0x0)) {
0424 info_packet->sb[17] |= 0x80;
0425 }
0426
0427
0428
0429
0430
0431
0432
0433
0434 info_packet->sb[18] = 0;
0435 }
0436 }
0437
0438
0439
0440
0441
0442
0443
0444
0445 void mod_build_hf_vsif_infopacket(const struct dc_stream_state *stream,
0446 struct dc_info_packet *info_packet)
0447 {
0448 unsigned int length = 5;
0449 bool hdmi_vic_mode = false;
0450 uint8_t checksum = 0;
0451 uint32_t i = 0;
0452 enum dc_timing_3d_format format;
0453
0454 info_packet->valid = false;
0455 format = stream->timing.timing_3d_format;
0456 if (stream->view_format == VIEW_3D_FORMAT_NONE)
0457 format = TIMING_3D_FORMAT_NONE;
0458
0459 if (stream->timing.hdmi_vic != 0
0460 && stream->timing.h_total >= 3840
0461 && stream->timing.v_total >= 2160
0462 && format == TIMING_3D_FORMAT_NONE)
0463 hdmi_vic_mode = true;
0464
0465 if ((format == TIMING_3D_FORMAT_NONE) && !hdmi_vic_mode)
0466 return;
0467
0468 info_packet->sb[1] = 0x03;
0469 info_packet->sb[2] = 0x0C;
0470 info_packet->sb[3] = 0x00;
0471
0472 if (format != TIMING_3D_FORMAT_NONE)
0473 info_packet->sb[4] = (2 << 5);
0474
0475 else if (hdmi_vic_mode)
0476 info_packet->sb[4] = (1 << 5);
0477
0478 switch (format) {
0479 case TIMING_3D_FORMAT_HW_FRAME_PACKING:
0480 case TIMING_3D_FORMAT_SW_FRAME_PACKING:
0481 info_packet->sb[5] = (0x0 << 4);
0482 break;
0483
0484 case TIMING_3D_FORMAT_SIDE_BY_SIDE:
0485 case TIMING_3D_FORMAT_SBS_SW_PACKED:
0486 info_packet->sb[5] = (0x8 << 4);
0487 length = 6;
0488 break;
0489
0490 case TIMING_3D_FORMAT_TOP_AND_BOTTOM:
0491 case TIMING_3D_FORMAT_TB_SW_PACKED:
0492 info_packet->sb[5] = (0x6 << 4);
0493 break;
0494
0495 default:
0496 break;
0497 }
0498
0499 if (hdmi_vic_mode)
0500 info_packet->sb[5] = stream->timing.hdmi_vic;
0501
0502 info_packet->hb0 = HDMI_INFOFRAME_TYPE_VENDOR;
0503 info_packet->hb1 = 0x01;
0504 info_packet->hb2 = (uint8_t) (length);
0505
0506 checksum += info_packet->hb0;
0507 checksum += info_packet->hb1;
0508 checksum += info_packet->hb2;
0509
0510 for (i = 1; i <= length; i++)
0511 checksum += info_packet->sb[i];
0512
0513 info_packet->sb[0] = (uint8_t) (0x100 - checksum);
0514
0515 info_packet->valid = true;
0516 }
0517