0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #ifndef __LINUX_HDMI_H_
0025 #define __LINUX_HDMI_H_
0026
0027 #include <linux/types.h>
0028 #include <linux/device.h>
0029
0030 enum hdmi_packet_type {
0031 HDMI_PACKET_TYPE_NULL = 0x00,
0032 HDMI_PACKET_TYPE_AUDIO_CLOCK_REGEN = 0x01,
0033 HDMI_PACKET_TYPE_AUDIO_SAMPLE = 0x02,
0034 HDMI_PACKET_TYPE_GENERAL_CONTROL = 0x03,
0035 HDMI_PACKET_TYPE_ACP = 0x04,
0036 HDMI_PACKET_TYPE_ISRC1 = 0x05,
0037 HDMI_PACKET_TYPE_ISRC2 = 0x06,
0038 HDMI_PACKET_TYPE_ONE_BIT_AUDIO_SAMPLE = 0x07,
0039 HDMI_PACKET_TYPE_DST_AUDIO = 0x08,
0040 HDMI_PACKET_TYPE_HBR_AUDIO_STREAM = 0x09,
0041 HDMI_PACKET_TYPE_GAMUT_METADATA = 0x0a,
0042
0043 };
0044
0045 enum hdmi_infoframe_type {
0046 HDMI_INFOFRAME_TYPE_VENDOR = 0x81,
0047 HDMI_INFOFRAME_TYPE_AVI = 0x82,
0048 HDMI_INFOFRAME_TYPE_SPD = 0x83,
0049 HDMI_INFOFRAME_TYPE_AUDIO = 0x84,
0050 HDMI_INFOFRAME_TYPE_DRM = 0x87,
0051 };
0052
0053 #define HDMI_IEEE_OUI 0x000c03
0054 #define HDMI_FORUM_IEEE_OUI 0xc45dd8
0055 #define HDMI_INFOFRAME_HEADER_SIZE 4
0056 #define HDMI_AVI_INFOFRAME_SIZE 13
0057 #define HDMI_SPD_INFOFRAME_SIZE 25
0058 #define HDMI_AUDIO_INFOFRAME_SIZE 10
0059 #define HDMI_DRM_INFOFRAME_SIZE 26
0060 #define HDMI_VENDOR_INFOFRAME_SIZE 4
0061
0062 #define HDMI_INFOFRAME_SIZE(type) \
0063 (HDMI_INFOFRAME_HEADER_SIZE + HDMI_ ## type ## _INFOFRAME_SIZE)
0064
0065 struct hdmi_any_infoframe {
0066 enum hdmi_infoframe_type type;
0067 unsigned char version;
0068 unsigned char length;
0069 };
0070
0071 enum hdmi_colorspace {
0072 HDMI_COLORSPACE_RGB,
0073 HDMI_COLORSPACE_YUV422,
0074 HDMI_COLORSPACE_YUV444,
0075 HDMI_COLORSPACE_YUV420,
0076 HDMI_COLORSPACE_RESERVED4,
0077 HDMI_COLORSPACE_RESERVED5,
0078 HDMI_COLORSPACE_RESERVED6,
0079 HDMI_COLORSPACE_IDO_DEFINED,
0080 };
0081
0082 enum hdmi_scan_mode {
0083 HDMI_SCAN_MODE_NONE,
0084 HDMI_SCAN_MODE_OVERSCAN,
0085 HDMI_SCAN_MODE_UNDERSCAN,
0086 HDMI_SCAN_MODE_RESERVED,
0087 };
0088
0089 enum hdmi_colorimetry {
0090 HDMI_COLORIMETRY_NONE,
0091 HDMI_COLORIMETRY_ITU_601,
0092 HDMI_COLORIMETRY_ITU_709,
0093 HDMI_COLORIMETRY_EXTENDED,
0094 };
0095
0096 enum hdmi_picture_aspect {
0097 HDMI_PICTURE_ASPECT_NONE,
0098 HDMI_PICTURE_ASPECT_4_3,
0099 HDMI_PICTURE_ASPECT_16_9,
0100 HDMI_PICTURE_ASPECT_64_27,
0101 HDMI_PICTURE_ASPECT_256_135,
0102 HDMI_PICTURE_ASPECT_RESERVED,
0103 };
0104
0105 enum hdmi_active_aspect {
0106 HDMI_ACTIVE_ASPECT_16_9_TOP = 2,
0107 HDMI_ACTIVE_ASPECT_14_9_TOP = 3,
0108 HDMI_ACTIVE_ASPECT_16_9_CENTER = 4,
0109 HDMI_ACTIVE_ASPECT_PICTURE = 8,
0110 HDMI_ACTIVE_ASPECT_4_3 = 9,
0111 HDMI_ACTIVE_ASPECT_16_9 = 10,
0112 HDMI_ACTIVE_ASPECT_14_9 = 11,
0113 HDMI_ACTIVE_ASPECT_4_3_SP_14_9 = 13,
0114 HDMI_ACTIVE_ASPECT_16_9_SP_14_9 = 14,
0115 HDMI_ACTIVE_ASPECT_16_9_SP_4_3 = 15,
0116 };
0117
0118 enum hdmi_extended_colorimetry {
0119 HDMI_EXTENDED_COLORIMETRY_XV_YCC_601,
0120 HDMI_EXTENDED_COLORIMETRY_XV_YCC_709,
0121 HDMI_EXTENDED_COLORIMETRY_S_YCC_601,
0122 HDMI_EXTENDED_COLORIMETRY_OPYCC_601,
0123 HDMI_EXTENDED_COLORIMETRY_OPRGB,
0124
0125
0126 HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM,
0127 HDMI_EXTENDED_COLORIMETRY_BT2020,
0128 HDMI_EXTENDED_COLORIMETRY_RESERVED,
0129 };
0130
0131 enum hdmi_quantization_range {
0132 HDMI_QUANTIZATION_RANGE_DEFAULT,
0133 HDMI_QUANTIZATION_RANGE_LIMITED,
0134 HDMI_QUANTIZATION_RANGE_FULL,
0135 HDMI_QUANTIZATION_RANGE_RESERVED,
0136 };
0137
0138
0139 enum hdmi_nups {
0140 HDMI_NUPS_UNKNOWN,
0141 HDMI_NUPS_HORIZONTAL,
0142 HDMI_NUPS_VERTICAL,
0143 HDMI_NUPS_BOTH,
0144 };
0145
0146 enum hdmi_ycc_quantization_range {
0147 HDMI_YCC_QUANTIZATION_RANGE_LIMITED,
0148 HDMI_YCC_QUANTIZATION_RANGE_FULL,
0149 };
0150
0151 enum hdmi_content_type {
0152 HDMI_CONTENT_TYPE_GRAPHICS,
0153 HDMI_CONTENT_TYPE_PHOTO,
0154 HDMI_CONTENT_TYPE_CINEMA,
0155 HDMI_CONTENT_TYPE_GAME,
0156 };
0157
0158 enum hdmi_metadata_type {
0159 HDMI_STATIC_METADATA_TYPE1 = 0,
0160 };
0161
0162 enum hdmi_eotf {
0163 HDMI_EOTF_TRADITIONAL_GAMMA_SDR,
0164 HDMI_EOTF_TRADITIONAL_GAMMA_HDR,
0165 HDMI_EOTF_SMPTE_ST2084,
0166 HDMI_EOTF_BT_2100_HLG,
0167 };
0168
0169 struct hdmi_avi_infoframe {
0170 enum hdmi_infoframe_type type;
0171 unsigned char version;
0172 unsigned char length;
0173 enum hdmi_colorspace colorspace;
0174 enum hdmi_scan_mode scan_mode;
0175 enum hdmi_colorimetry colorimetry;
0176 enum hdmi_picture_aspect picture_aspect;
0177 enum hdmi_active_aspect active_aspect;
0178 bool itc;
0179 enum hdmi_extended_colorimetry extended_colorimetry;
0180 enum hdmi_quantization_range quantization_range;
0181 enum hdmi_nups nups;
0182 unsigned char video_code;
0183 enum hdmi_ycc_quantization_range ycc_quantization_range;
0184 enum hdmi_content_type content_type;
0185 unsigned char pixel_repeat;
0186 unsigned short top_bar;
0187 unsigned short bottom_bar;
0188 unsigned short left_bar;
0189 unsigned short right_bar;
0190 };
0191
0192
0193 struct hdmi_drm_infoframe {
0194 enum hdmi_infoframe_type type;
0195 unsigned char version;
0196 unsigned char length;
0197 enum hdmi_eotf eotf;
0198 enum hdmi_metadata_type metadata_type;
0199 struct {
0200 u16 x, y;
0201 } display_primaries[3];
0202 struct {
0203 u16 x, y;
0204 } white_point;
0205 u16 max_display_mastering_luminance;
0206 u16 min_display_mastering_luminance;
0207 u16 max_cll;
0208 u16 max_fall;
0209 };
0210
0211 void hdmi_avi_infoframe_init(struct hdmi_avi_infoframe *frame);
0212 ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe *frame, void *buffer,
0213 size_t size);
0214 ssize_t hdmi_avi_infoframe_pack_only(const struct hdmi_avi_infoframe *frame,
0215 void *buffer, size_t size);
0216 int hdmi_avi_infoframe_check(struct hdmi_avi_infoframe *frame);
0217 int hdmi_drm_infoframe_init(struct hdmi_drm_infoframe *frame);
0218 ssize_t hdmi_drm_infoframe_pack(struct hdmi_drm_infoframe *frame, void *buffer,
0219 size_t size);
0220 ssize_t hdmi_drm_infoframe_pack_only(const struct hdmi_drm_infoframe *frame,
0221 void *buffer, size_t size);
0222 int hdmi_drm_infoframe_check(struct hdmi_drm_infoframe *frame);
0223 int hdmi_drm_infoframe_unpack_only(struct hdmi_drm_infoframe *frame,
0224 const void *buffer, size_t size);
0225
0226 enum hdmi_spd_sdi {
0227 HDMI_SPD_SDI_UNKNOWN,
0228 HDMI_SPD_SDI_DSTB,
0229 HDMI_SPD_SDI_DVDP,
0230 HDMI_SPD_SDI_DVHS,
0231 HDMI_SPD_SDI_HDDVR,
0232 HDMI_SPD_SDI_DVC,
0233 HDMI_SPD_SDI_DSC,
0234 HDMI_SPD_SDI_VCD,
0235 HDMI_SPD_SDI_GAME,
0236 HDMI_SPD_SDI_PC,
0237 HDMI_SPD_SDI_BD,
0238 HDMI_SPD_SDI_SACD,
0239 HDMI_SPD_SDI_HDDVD,
0240 HDMI_SPD_SDI_PMP,
0241 };
0242
0243 struct hdmi_spd_infoframe {
0244 enum hdmi_infoframe_type type;
0245 unsigned char version;
0246 unsigned char length;
0247 char vendor[8];
0248 char product[16];
0249 enum hdmi_spd_sdi sdi;
0250 };
0251
0252 int hdmi_spd_infoframe_init(struct hdmi_spd_infoframe *frame,
0253 const char *vendor, const char *product);
0254 ssize_t hdmi_spd_infoframe_pack(struct hdmi_spd_infoframe *frame, void *buffer,
0255 size_t size);
0256 ssize_t hdmi_spd_infoframe_pack_only(const struct hdmi_spd_infoframe *frame,
0257 void *buffer, size_t size);
0258 int hdmi_spd_infoframe_check(struct hdmi_spd_infoframe *frame);
0259
0260 enum hdmi_audio_coding_type {
0261 HDMI_AUDIO_CODING_TYPE_STREAM,
0262 HDMI_AUDIO_CODING_TYPE_PCM,
0263 HDMI_AUDIO_CODING_TYPE_AC3,
0264 HDMI_AUDIO_CODING_TYPE_MPEG1,
0265 HDMI_AUDIO_CODING_TYPE_MP3,
0266 HDMI_AUDIO_CODING_TYPE_MPEG2,
0267 HDMI_AUDIO_CODING_TYPE_AAC_LC,
0268 HDMI_AUDIO_CODING_TYPE_DTS,
0269 HDMI_AUDIO_CODING_TYPE_ATRAC,
0270 HDMI_AUDIO_CODING_TYPE_DSD,
0271 HDMI_AUDIO_CODING_TYPE_EAC3,
0272 HDMI_AUDIO_CODING_TYPE_DTS_HD,
0273 HDMI_AUDIO_CODING_TYPE_MLP,
0274 HDMI_AUDIO_CODING_TYPE_DST,
0275 HDMI_AUDIO_CODING_TYPE_WMA_PRO,
0276 HDMI_AUDIO_CODING_TYPE_CXT,
0277 };
0278
0279 enum hdmi_audio_sample_size {
0280 HDMI_AUDIO_SAMPLE_SIZE_STREAM,
0281 HDMI_AUDIO_SAMPLE_SIZE_16,
0282 HDMI_AUDIO_SAMPLE_SIZE_20,
0283 HDMI_AUDIO_SAMPLE_SIZE_24,
0284 };
0285
0286 enum hdmi_audio_sample_frequency {
0287 HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM,
0288 HDMI_AUDIO_SAMPLE_FREQUENCY_32000,
0289 HDMI_AUDIO_SAMPLE_FREQUENCY_44100,
0290 HDMI_AUDIO_SAMPLE_FREQUENCY_48000,
0291 HDMI_AUDIO_SAMPLE_FREQUENCY_88200,
0292 HDMI_AUDIO_SAMPLE_FREQUENCY_96000,
0293 HDMI_AUDIO_SAMPLE_FREQUENCY_176400,
0294 HDMI_AUDIO_SAMPLE_FREQUENCY_192000,
0295 };
0296
0297 enum hdmi_audio_coding_type_ext {
0298
0299 HDMI_AUDIO_CODING_TYPE_EXT_CT,
0300
0301
0302
0303
0304
0305
0306 HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC,
0307 HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2,
0308 HDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND,
0309
0310
0311 HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC,
0312 HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_V2,
0313 HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC,
0314 HDMI_AUDIO_CODING_TYPE_EXT_DRA,
0315 HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_SURROUND,
0316 HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC_SURROUND = 10,
0317 };
0318
0319 struct hdmi_audio_infoframe {
0320 enum hdmi_infoframe_type type;
0321 unsigned char version;
0322 unsigned char length;
0323 unsigned char channels;
0324 enum hdmi_audio_coding_type coding_type;
0325 enum hdmi_audio_sample_size sample_size;
0326 enum hdmi_audio_sample_frequency sample_frequency;
0327 enum hdmi_audio_coding_type_ext coding_type_ext;
0328 unsigned char channel_allocation;
0329 unsigned char level_shift_value;
0330 bool downmix_inhibit;
0331
0332 };
0333
0334 int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe *frame);
0335 ssize_t hdmi_audio_infoframe_pack(struct hdmi_audio_infoframe *frame,
0336 void *buffer, size_t size);
0337 ssize_t hdmi_audio_infoframe_pack_only(const struct hdmi_audio_infoframe *frame,
0338 void *buffer, size_t size);
0339 int hdmi_audio_infoframe_check(struct hdmi_audio_infoframe *frame);
0340
0341 enum hdmi_3d_structure {
0342 HDMI_3D_STRUCTURE_INVALID = -1,
0343 HDMI_3D_STRUCTURE_FRAME_PACKING = 0,
0344 HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE,
0345 HDMI_3D_STRUCTURE_LINE_ALTERNATIVE,
0346 HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL,
0347 HDMI_3D_STRUCTURE_L_DEPTH,
0348 HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH,
0349 HDMI_3D_STRUCTURE_TOP_AND_BOTTOM,
0350 HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF = 8,
0351 };
0352
0353
0354 struct hdmi_vendor_infoframe {
0355 enum hdmi_infoframe_type type;
0356 unsigned char version;
0357 unsigned char length;
0358 unsigned int oui;
0359 u8 vic;
0360 enum hdmi_3d_structure s3d_struct;
0361 unsigned int s3d_ext_data;
0362 };
0363
0364
0365 struct hdr_static_metadata {
0366 __u8 eotf;
0367 __u8 metadata_type;
0368 __u16 max_cll;
0369 __u16 max_fall;
0370 __u16 min_cll;
0371 };
0372
0373
0374
0375
0376
0377
0378 struct hdr_sink_metadata {
0379
0380
0381
0382 __u32 metadata_type;
0383
0384
0385
0386 union {
0387 struct hdr_static_metadata hdmi_type1;
0388 };
0389 };
0390
0391 int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *frame);
0392 ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
0393 void *buffer, size_t size);
0394 ssize_t hdmi_vendor_infoframe_pack_only(const struct hdmi_vendor_infoframe *frame,
0395 void *buffer, size_t size);
0396 int hdmi_vendor_infoframe_check(struct hdmi_vendor_infoframe *frame);
0397
0398 union hdmi_vendor_any_infoframe {
0399 struct {
0400 enum hdmi_infoframe_type type;
0401 unsigned char version;
0402 unsigned char length;
0403 unsigned int oui;
0404 } any;
0405 struct hdmi_vendor_infoframe hdmi;
0406 };
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421 union hdmi_infoframe {
0422 struct hdmi_any_infoframe any;
0423 struct hdmi_avi_infoframe avi;
0424 struct hdmi_spd_infoframe spd;
0425 union hdmi_vendor_any_infoframe vendor;
0426 struct hdmi_audio_infoframe audio;
0427 struct hdmi_drm_infoframe drm;
0428 };
0429
0430 ssize_t hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer,
0431 size_t size);
0432 ssize_t hdmi_infoframe_pack_only(const union hdmi_infoframe *frame,
0433 void *buffer, size_t size);
0434 int hdmi_infoframe_check(union hdmi_infoframe *frame);
0435 int hdmi_infoframe_unpack(union hdmi_infoframe *frame,
0436 const void *buffer, size_t size);
0437 void hdmi_infoframe_log(const char *level, struct device *dev,
0438 const union hdmi_infoframe *frame);
0439
0440 #endif