1 /* $NetBSD: hdmi.h,v 1.21 2022/07/09 18:18:36 riastradh Exp $ */ 2 3 /*- 4 * Copyright (c) 2014 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Taylor R. Campbell. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef _LINUX_HDMI_H_ 33 #define _LINUX_HDMI_H_ 34 35 #include <sys/types.h> 36 37 struct device; 38 39 /* namespace */ 40 #define hdmi_audio_infoframe_init linux_hdmi_audio_infoframe_init 41 #define hdmi_audio_infoframe_pack linux_hdmi_audio_infoframe_pack 42 #define hdmi_avi_infoframe_check linux_hdmi_avi_infoframe_check 43 #define hdmi_avi_infoframe_init linux_hdmi_avi_infoframe_init 44 #define hdmi_avi_infoframe_pack linux_hdmi_avi_infoframe_pack 45 #define hdmi_drm_infoframe_check linux_hdmi_drm_infoframe_check 46 #define hdmi_drm_infoframe_init linux_hdmi_drm_infoframe_init 47 #define hdmi_drm_infoframe_pack linux_hdmi_drm_infoframe_pack 48 #define hdmi_drm_infoframe_pack_only linux_hdmi_drm_infoframe_pack_only 49 #define hdmi_infoframe_checksum linux_hdmi_infoframe_checksum 50 #define hdmi_infoframe_log linux_hdmi_infoframe_log 51 #define hdmi_infoframe_pack linux_hdmi_infoframe_pack 52 #define hdmi_infoframe_pack_only linux_hdmi_infoframe_pack_only 53 #define hdmi_infoframe_set_checksum linux_hdmi_infoframe_set_checksum 54 #define hdmi_infoframe_unpack linux_hdmi_infoframe_unpack 55 #define hdmi_spd_infoframe_check linux_hdmi_spd_infoframe_check 56 #define hdmi_spd_infoframe_init linux_hdmi_spd_infoframe_init 57 #define hdmi_spd_infoframe_pack linux_hdmi_spd_infoframe_pack 58 #define hdmi_vendor_infoframe_check linux_hdmi_vendor_infoframe_check 59 #define hdmi_vendor_infoframe_init linux_hdmi_vendor_infoframe_init 60 #define hdmi_vendor_infoframe_length linux_hdmi_vendor_infoframe_length 61 #define hdmi_vendor_infoframe_pack linux_hdmi_vendor_infoframe_pack 62 63 enum hdmi_3d_structure { 64 HDMI_3D_STRUCTURE_INVALID = -1, 65 HDMI_3D_STRUCTURE_FRAME_PACKING = 0, 66 HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE = 1, 67 HDMI_3D_STRUCTURE_LINE_ALTERNATIVE = 2, 68 HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL = 3, 69 HDMI_3D_STRUCTURE_L_DEPTH = 4, 70 HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH = 5, 71 HDMI_3D_STRUCTURE_TOP_AND_BOTTOM = 6, 72 HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF = 8, 73 }; 74 75 enum hdmi_active_aspect { 76 HDMI_ACTIVE_ASPECT_NONE = 0, 77 HDMI_ACTIVE_ASPECT_16_9_TOP = 2, 78 HDMI_ACTIVE_ASPECT_14_9_TOP = 3, 79 HDMI_ACTIVE_ASPECT_16_9_CENTER = 4, 80 HDMI_ACTIVE_ASPECT_PICTURE = 8, 81 HDMI_ACTIVE_ASPECT_4_3 = 9, 82 HDMI_ACTIVE_ASPECT_16_9 = 10, 83 HDMI_ACTIVE_ASPECT_14_9 = 11, 84 HDMI_ACTIVE_ASPECT_4_3_SP_14_9 = 13, 85 HDMI_ACTIVE_ASPECT_16_9_SP_14_9 = 14, 86 HDMI_ACTIVE_ASPECT_16_9_SP_4_3 = 15, 87 }; 88 89 enum hdmi_audio_coding_type { 90 HDMI_AUDIO_CODING_TYPE_STREAM = 0, 91 HDMI_AUDIO_CODING_TYPE_PCM = 1, 92 HDMI_AUDIO_CODING_TYPE_AC3 = 2, 93 HDMI_AUDIO_CODING_TYPE_MPEG1 = 3, 94 HDMI_AUDIO_CODING_TYPE_MP3 = 4, 95 HDMI_AUDIO_CODING_TYPE_MPEG2 = 5, 96 HDMI_AUDIO_CODING_TYPE_AAC_LC = 6, 97 HDMI_AUDIO_CODING_TYPE_DTS = 7, 98 HDMI_AUDIO_CODING_TYPE_ATRAC = 8, 99 HDMI_AUDIO_CODING_TYPE_DSD = 9, 100 HDMI_AUDIO_CODING_TYPE_EAC3 = 10, 101 HDMI_AUDIO_CODING_TYPE_DTS_HD = 11, 102 HDMI_AUDIO_CODING_TYPE_MLP = 12, 103 HDMI_AUDIO_CODING_TYPE_DST = 13, 104 HDMI_AUDIO_CODING_TYPE_WMA_PRO = 14, 105 }; 106 107 enum hdmi_audio_coding_type_ext { 108 HDMI_AUDIO_CODING_TYPE_EXT_STREAM = 0, 109 HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC = 1, 110 HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2 = 2, 111 HDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND = 3, 112 }; 113 114 enum hdmi_audio_sample_frequency { 115 HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM = 0, 116 HDMI_AUDIO_SAMPLE_FREQUENCY_32000 = 1, 117 HDMI_AUDIO_SAMPLE_FREQUENCY_44100 = 2, 118 HDMI_AUDIO_SAMPLE_FREQUENCY_48000 = 3, 119 HDMI_AUDIO_SAMPLE_FREQUENCY_88200 = 4, 120 HDMI_AUDIO_SAMPLE_FREQUENCY_96000 = 5, 121 HDMI_AUDIO_SAMPLE_FREQUENCY_176400 = 6, 122 HDMI_AUDIO_SAMPLE_FREQUENCY_192000 = 7, 123 }; 124 125 enum hdmi_audio_sample_size { 126 HDMI_AUDIO_SAMPLE_SIZE_STREAM = 0, 127 HDMI_AUDIO_SAMPLE_SIZE_16 = 1, 128 HDMI_AUDIO_SAMPLE_SIZE_20 = 2, 129 HDMI_AUDIO_SAMPLE_SIZE_24 = 3, 130 }; 131 132 enum hdmi_colorimetry { 133 HDMI_COLORIMETRY_NONE = 0, 134 HDMI_COLORIMETRY_ITU_601 = 1, 135 HDMI_COLORIMETRY_ITU_709 = 2, 136 HDMI_COLORIMETRY_EXTENDED = 3, 137 }; 138 139 enum hdmi_colorspace { 140 HDMI_COLORSPACE_RGB = 0, 141 HDMI_COLORSPACE_YUV422 = 1, 142 HDMI_COLORSPACE_YUV444 = 2, 143 HDMI_COLORSPACE_YUV420 = 3, 144 HDMI_COLORSPACE_IDO_DEFINED = 7, 145 }; 146 147 enum hdmi_content_type { 148 HDMI_CONTENT_TYPE_GRAPHICS = 0, 149 HDMI_CONTENT_TYPE_PHOTO = 1, 150 HDMI_CONTENT_TYPE_CINEMA = 2, 151 HDMI_CONTENT_TYPE_GAME = 3, 152 }; 153 154 enum hdmi_extended_colorimetry { 155 HDMI_EXTENDED_COLORIMETRY_XV_YCC_601 = 0, 156 HDMI_EXTENDED_COLORIMETRY_XV_YCC_709 = 1, 157 HDMI_EXTENDED_COLORIMETRY_S_YCC_601 = 2, 158 HDMI_EXTENDED_COLORIMETRY_OPYCC_601 = 3, 159 HDMI_EXTENDED_COLORIMETRY_OPRGB = 4, 160 }; 161 162 enum hdmi_nups { 163 HDMI_NUPS_UNKNOWN = 0, 164 HDMI_NUPS_HORIZONTAL = 1, 165 HDMI_NUPS_VERTICAL = 2, 166 HDMI_NUPS_BOTH = 3, 167 }; 168 169 enum hdmi_picture_aspect { 170 HDMI_PICTURE_ASPECT_NONE = 0, 171 HDMI_PICTURE_ASPECT_4_3 = 1, 172 HDMI_PICTURE_ASPECT_16_9 = 2, 173 HDMI_PICTURE_ASPECT_64_27 = 3, 174 HDMI_PICTURE_ASPECT_256_135 = 4, 175 HDMI_PICTURE_ASPECT_RESERVED = 5, 176 }; 177 178 enum hdmi_quantization_range { 179 HDMI_QUANTIZATION_RANGE_DEFAULT = 0, 180 HDMI_QUANTIZATION_RANGE_LIMITED = 1, 181 HDMI_QUANTIZATION_RANGE_FULL = 2, 182 }; 183 184 enum hdmi_scan_mode { 185 HDMI_SCAN_MODE_NONE = 0, 186 HDMI_SCAN_MODE_OVERSCAN = 1, 187 HDMI_SCAN_MODE_UNDERSCAN = 2, 188 }; 189 190 enum hdmi_ycc_quantization_range { 191 HDMI_YCC_QUANTIZATION_RANGE_LIMITED = 0, 192 HDMI_YCC_QUANTIZATION_RANGE_FULL = 1, 193 }; 194 195 enum hdmi_packet_type { 196 HDMI_PACKET_TYPE_NULL = 0x00, 197 HDMI_PACKET_TYPE_AUDIO_CLOCK_REGEN = 0x01, 198 HDMI_PACKET_TYPE_AUDIO_SAMPLE = 0x02, 199 HDMI_PACKET_TYPE_GENERAL_CONTROL = 0x03, 200 HDMI_PACKET_TYPE_ACP = 0x04, 201 HDMI_PACKET_TYPE_ISRC1 = 0x05, 202 HDMI_PACKET_TYPE_ISRC2 = 0x06, 203 HDMI_PACKET_TYPE_ONE_BIT_AUDIO_SAMPLE = 0x07, 204 HDMI_PACKET_TYPE_DST_AUDIO = 0x08, 205 HDMI_PACKET_TYPE_HBR_AUDIO_STREAM = 0x09, 206 HDMI_PACKET_TYPE_GAMUT_METADATA = 0x0a, 207 }; 208 209 enum hdmi_infoframe_type { 210 HDMI_INFOFRAME_TYPE_VENDOR = 0x81, 211 HDMI_INFOFRAME_TYPE_AVI = 0x82, 212 HDMI_INFOFRAME_TYPE_SPD = 0x83, 213 HDMI_INFOFRAME_TYPE_AUDIO = 0x84, 214 HDMI_INFOFRAME_TYPE_DRM = 0x87, 215 }; 216 217 enum hdmi_eotf { 218 HDMI_EOTF_TRADITIONAL_GAMMA_SDR = 0, 219 HDMI_EOTF_TRADITIONAL_GAMMA_HDR = 1, 220 HDMI_EOTF_SMPTE_ST2084 = 2, 221 HDMI_EOTF_BT_2100_HLG = 3, 222 }; 223 224 enum hdmi_metadata_type { 225 HDMI_STATIC_METADATA_TYPE1 = 1, 226 }; 227 228 struct hdmi_type1 { 229 enum hdmi_eotf eotf; 230 enum hdmi_metadata_type metadata_type; 231 uint16_t min_cll; 232 uint16_t max_cll; 233 uint16_t max_fall; 234 }; 235 236 struct hdr_sink_metadata { 237 struct hdmi_type1 hdmi_type1; 238 }; 239 240 #define HDMI_INFOFRAME_SIZE(TYPE) \ 241 (HDMI_INFOFRAME_HEADER_SIZE + HDMI_##TYPE##_INFOFRAME_SIZE) 242 243 #define HDMI_INFOFRAME_HEADER_SIZE 4 244 struct hdmi_infoframe_header { 245 enum hdmi_infoframe_type type; 246 uint8_t version; 247 uint8_t length; 248 /* checksum */ 249 }; 250 251 #define HDMI_AUDIO_INFOFRAME_SIZE 10 252 struct hdmi_audio_infoframe { 253 struct hdmi_infoframe_header header; 254 uint8_t channels; 255 enum hdmi_audio_coding_type coding_type; 256 enum hdmi_audio_sample_size sample_size; 257 enum hdmi_audio_sample_frequency sample_frequency; 258 enum hdmi_audio_coding_type_ext coding_type_ext; 259 uint8_t channel_allocation; 260 uint8_t level_shift_value; 261 bool downmix_inhibit; 262 }; 263 264 #define HDMI_AVI_INFOFRAME_SIZE 13 265 struct hdmi_avi_infoframe { 266 struct hdmi_infoframe_header header; 267 enum hdmi_colorspace colorspace; 268 enum hdmi_scan_mode scan_mode; 269 enum hdmi_colorimetry colorimetry; 270 enum hdmi_picture_aspect picture_aspect; 271 enum hdmi_active_aspect active_aspect; 272 bool itc; 273 enum hdmi_extended_colorimetry extended_colorimetry; 274 enum hdmi_quantization_range quantization_range; 275 enum hdmi_nups nups; 276 uint8_t video_code; 277 enum hdmi_ycc_quantization_range ycc_quantization_range; 278 enum hdmi_content_type content_type; 279 uint8_t pixel_repeat; 280 uint16_t top_bar; 281 uint16_t bottom_bar; 282 uint16_t left_bar; 283 uint16_t right_bar; 284 }; 285 286 #define HDMI_DRM_INFOFRAME_SIZE 26 287 struct hdmi_drm_infoframe { 288 struct hdmi_infoframe_header header; 289 enum hdmi_eotf eotf; 290 enum hdmi_metadata_type metadata_type; 291 struct { 292 uint16_t x, y; 293 } display_primaries[3]; 294 struct { 295 uint16_t x, y; 296 } white_point; 297 uint16_t max_display_mastering_luminance; 298 uint16_t min_display_mastering_luminance; 299 uint16_t max_cll; 300 uint16_t max_fall; 301 }; 302 303 #define HDMI_SPD_INFOFRAME_SIZE 25 304 struct hdmi_spd_infoframe { 305 struct hdmi_infoframe_header header; 306 char vendor[8]; 307 char product[16]; 308 enum hdmi_spd_sdi { 309 HDMI_SPD_SDI_UNKNOWN = 0, 310 HDMI_SPD_SDI_DSTB = 1, 311 HDMI_SPD_SDI_DVDP = 2, 312 HDMI_SPD_SDI_DVHS = 3, 313 HDMI_SPD_SDI_HDDVR = 4, 314 HDMI_SPD_SDI_DVC = 5, 315 HDMI_SPD_SDI_DSC = 6, 316 HDMI_SPD_SDI_VCD = 7, 317 HDMI_SPD_SDI_GAME = 8, 318 HDMI_SPD_SDI_PC = 9, 319 HDMI_SPD_SDI_BD = 10, 320 HDMI_SPD_SDI_SACD = 11, 321 HDMI_SPD_SDI_HDDVD = 12, 322 HDMI_SPD_SDI_PMP = 13, 323 } sdi; 324 }; 325 326 #define HDMI_IEEE_OUI 0x000c03 327 #define HDMI_FORUM_IEEE_OUI 0xc45dd8 328 329 struct hdmi_vendor_infoframe { 330 struct hdmi_infoframe_header header; 331 uint32_t oui; 332 uint8_t vic; 333 enum hdmi_3d_structure s3d_struct; 334 unsigned s3d_ext_data; 335 }; 336 337 union hdmi_vendor_any_infoframe { 338 struct { 339 struct hdmi_infoframe_header header; 340 uint32_t oui; 341 } any; 342 struct hdmi_vendor_infoframe hdmi; 343 }; 344 345 union hdmi_infoframe { 346 struct hdmi_infoframe_header any; 347 struct hdmi_avi_infoframe avi; 348 struct hdmi_spd_infoframe spd; 349 struct hdmi_audio_infoframe audio; 350 struct hdmi_drm_infoframe drm; 351 union hdmi_vendor_any_infoframe vendor; 352 }; 353 354 int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe *); 355 ssize_t hdmi_audio_infoframe_pack(const struct hdmi_audio_infoframe *, void *, 356 size_t); 357 358 int hdmi_avi_infoframe_init(struct hdmi_avi_infoframe *); 359 int hdmi_avi_infoframe_check(const struct hdmi_avi_infoframe *); 360 ssize_t hdmi_avi_infoframe_pack(const struct hdmi_avi_infoframe *, void *, 361 size_t); 362 363 int hdmi_drm_infoframe_init(struct hdmi_drm_infoframe *); 364 int hdmi_drm_infoframe_check(const struct hdmi_drm_infoframe *); 365 ssize_t hdmi_drm_infoframe_pack(const struct hdmi_drm_infoframe *, void *, 366 size_t); 367 int hdmi_drm_infoframe_pack_only(const struct hdmi_drm_infoframe *, void *, 368 size_t); 369 370 int hdmi_spd_infoframe_init(struct hdmi_spd_infoframe *, const char *, 371 const char *); 372 int hdmi_spd_infoframe_check(const struct hdmi_spd_infoframe *); 373 ssize_t hdmi_spd_infoframe_pack(const struct hdmi_spd_infoframe *, void *, 374 size_t); 375 376 int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *); 377 int hdmi_vendor_infoframe_check(const struct hdmi_vendor_infoframe *); 378 ssize_t hdmi_vendor_infoframe_pack(const struct hdmi_vendor_infoframe *, 379 void *, size_t); 380 381 ssize_t hdmi_infoframe_pack(const union hdmi_infoframe *, void *, size_t); 382 ssize_t hdmi_infoframe_pack_only(const union hdmi_infoframe *, void *, size_t); 383 int hdmi_infoframe_unpack(union hdmi_infoframe *, const void *, size_t); 384 void hdmi_infoframe_log(const char *, struct device *, 385 const union hdmi_infoframe *); 386 387 #endif /* _LINUX_HDMI_H_ */ 388