Home | History | Annotate | Line # | Download | only in linux
hdmi.h revision 1.17
      1 /*	$NetBSD: hdmi.h,v 1.17 2022/07/09 17:59:27 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_audio_infoframe_unpack	linux_hdmi_audio_infoframe_unpack
     43 #define	hdmi_avi_infoframe_check	linux_hdmi_avi_infoframe_check
     44 #define	hdmi_avi_infoframe_pack		linux_hdmi_avi_infoframe_pack
     45 #define	hdmi_avi_infoframe_unpack	linux_hdmi_avi_infoframe_unpack
     46 #define	hdmi_drm_infoframe_check	linux_hdmi_drm_infoframe_check
     47 #define	hdmi_drm_infoframe_init		linux_hdmi_drm_infoframe_init
     48 #define	hdmi_drm_infoframe_pack		linux_hdmi_drm_infoframe_pack
     49 #define	hdmi_drm_infoframe_pack_only	linux_hdmi_drm_infoframe_pack_only
     50 #define	hdmi_drm_infoframe_unpack	linux_hdmi_drm_infoframe_unpack
     51 #define	hdmi_infoframe_checksum		linux_hdmi_infoframe_checksum
     52 #define	hdmi_infoframe_log		linux_hdmi_infoframe_log
     53 #define	hdmi_infoframe_pack		linux_hdmi_infoframe_pack
     54 #define	hdmi_infoframe_pack_only	linux_hdmi_infoframe_pack_only
     55 #define	hdmi_infoframe_set_checksum	linux_hdmi_infoframe_set_checksum
     56 #define	hdmi_infoframe_unpack		linux_hdmi_infoframe_unpack
     57 #define	hdmi_spd_infoframe_check	linux_hdmi_spd_infoframe_check
     58 #define	hdmi_spd_infoframe_init		linux_hdmi_spd_infoframe_init
     59 #define	hdmi_spd_infoframe_pack		linux_hdmi_spd_infoframe_pack
     60 #define	hdmi_spd_infoframe_unpack	linux_hdmi_spd_infoframe_unpack
     61 #define	hdmi_vendor_infoframe_check	linux_hdmi_vendor_infoframe_check
     62 #define	hdmi_vendor_infoframe_init	linux_hdmi_vendor_infoframe_init
     63 #define	hdmi_vendor_infoframe_length	linux_hdmi_vendor_infoframe_length
     64 #define	hdmi_vendor_infoframe_pack	linux_hdmi_vendor_infoframe_pack
     65 #define	hdmi_vendor_infoframe_unpack	linux_hdmi_vendor_infoframe_unpack
     66 
     67 enum hdmi_3d_structure {
     68 	HDMI_3D_STRUCTURE_INVALID		= -1,
     69 	HDMI_3D_STRUCTURE_FRAME_PACKING		= 0,
     70 	HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE	= 1,
     71 	HDMI_3D_STRUCTURE_LINE_ALTERNATIVE	= 2,
     72 	HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL	= 3,
     73 	HDMI_3D_STRUCTURE_L_DEPTH		= 4,
     74 	HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH	= 5,
     75 	HDMI_3D_STRUCTURE_TOP_AND_BOTTOM	= 6,
     76 	HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF	= 8,
     77 };
     78 
     79 enum hdmi_active_aspect {
     80 	HDMI_ACTIVE_ASPECT_NONE			= 0,
     81 	HDMI_ACTIVE_ASPECT_16_9_TOP		= 2,
     82 	HDMI_ACTIVE_ASPECT_14_9_TOP		= 3,
     83 	HDMI_ACTIVE_ASPECT_16_9_CENTER		= 4,
     84 	HDMI_ACTIVE_ASPECT_PICTURE		= 8,
     85 	HDMI_ACTIVE_ASPECT_4_3			= 9,
     86 	HDMI_ACTIVE_ASPECT_16_9			= 10,
     87 	HDMI_ACTIVE_ASPECT_14_9			= 11,
     88 	HDMI_ACTIVE_ASPECT_4_3_SP_14_9		= 13,
     89 	HDMI_ACTIVE_ASPECT_16_9_SP_14_9		= 14,
     90 	HDMI_ACTIVE_ASPECT_16_9_SP_4_3		= 15,
     91 };
     92 
     93 enum hdmi_audio_coding_type {
     94 	HDMI_AUDIO_CODING_TYPE_STREAM		= 0,
     95 	HDMI_AUDIO_CODING_TYPE_PCM		= 1,
     96 	HDMI_AUDIO_CODING_TYPE_AC3		= 2,
     97 	HDMI_AUDIO_CODING_TYPE_MPEG1		= 3,
     98 	HDMI_AUDIO_CODING_TYPE_MP3		= 4,
     99 	HDMI_AUDIO_CODING_TYPE_MPEG2		= 5,
    100 	HDMI_AUDIO_CODING_TYPE_AAC_LC		= 6,
    101 	HDMI_AUDIO_CODING_TYPE_DTS		= 7,
    102 	HDMI_AUDIO_CODING_TYPE_ATRAC		= 8,
    103 	HDMI_AUDIO_CODING_TYPE_DSD		= 9,
    104 	HDMI_AUDIO_CODING_TYPE_EAC3		= 10,
    105 	HDMI_AUDIO_CODING_TYPE_DTS_HD		= 11,
    106 	HDMI_AUDIO_CODING_TYPE_MLP		= 12,
    107 	HDMI_AUDIO_CODING_TYPE_DST		= 13,
    108 	HDMI_AUDIO_CODING_TYPE_WMA_PRO		= 14,
    109 };
    110 
    111 enum hdmi_audio_coding_type_ext {
    112 	HDMI_AUDIO_CODING_TYPE_EXT_STREAM	= 0,
    113 	HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC	= 1,
    114 	HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2	= 2,
    115 	HDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND = 3,
    116 };
    117 
    118 enum hdmi_audio_sample_frequency {
    119 	HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM	= 0,
    120 	HDMI_AUDIO_SAMPLE_FREQUENCY_32000	= 1,
    121 	HDMI_AUDIO_SAMPLE_FREQUENCY_44100	= 2,
    122 	HDMI_AUDIO_SAMPLE_FREQUENCY_48000	= 3,
    123 	HDMI_AUDIO_SAMPLE_FREQUENCY_88200	= 4,
    124 	HDMI_AUDIO_SAMPLE_FREQUENCY_96000	= 5,
    125 	HDMI_AUDIO_SAMPLE_FREQUENCY_176400	= 6,
    126 	HDMI_AUDIO_SAMPLE_FREQUENCY_192000	= 7,
    127 };
    128 
    129 enum hdmi_audio_sample_size {
    130 	HDMI_AUDIO_SAMPLE_SIZE_STREAM		= 0,
    131 	HDMI_AUDIO_SAMPLE_SIZE_16		= 1,
    132 	HDMI_AUDIO_SAMPLE_SIZE_20		= 2,
    133 	HDMI_AUDIO_SAMPLE_SIZE_24		= 3,
    134 };
    135 
    136 enum hdmi_colorimetry {
    137 	HDMI_COLORIMETRY_NONE			= 0,
    138 	HDMI_COLORIMETRY_ITU_601		= 1,
    139 	HDMI_COLORIMETRY_ITU_709		= 2,
    140 	HDMI_COLORIMETRY_EXTENDED		= 3,
    141 };
    142 
    143 enum hdmi_colorspace {
    144 	HDMI_COLORSPACE_RGB			= 0,
    145 	HDMI_COLORSPACE_YUV422			= 1,
    146 	HDMI_COLORSPACE_YUV444			= 2,
    147 	HDMI_COLORSPACE_YUV420			= 3,
    148 	HDMI_COLORSPACE_IDO_DEFINED		= 7,
    149 };
    150 
    151 enum hdmi_content_type {
    152 	HDMI_CONTENT_TYPE_GRAPHICS		= 0,
    153 	HDMI_CONTENT_TYPE_PHOTO			= 1,
    154 	HDMI_CONTENT_TYPE_CINEMA		= 2,
    155 	HDMI_CONTENT_TYPE_GAME			= 3,
    156 };
    157 
    158 enum hdmi_extended_colorimetry {
    159 	HDMI_EXTENDED_COLORIMETRY_XV_YCC_601	= 0,
    160 	HDMI_EXTENDED_COLORIMETRY_XV_YCC_709	= 1,
    161 	HDMI_EXTENDED_COLORIMETRY_S_YCC_601	= 2,
    162 	HDMI_EXTENDED_COLORIMETRY_OPYCC_601	= 3,
    163 	HDMI_EXTENDED_COLORIMETRY_OPRGB		= 4,
    164 };
    165 
    166 enum hdmi_nups {
    167 	HDMI_NUPS_UNKNOWN			= 0,
    168 	HDMI_NUPS_HORIZONTAL			= 1,
    169 	HDMI_NUPS_VERTICAL			= 2,
    170 	HDMI_NUPS_BOTH				= 3,
    171 };
    172 
    173 enum hdmi_picture_aspect {
    174 	HDMI_PICTURE_ASPECT_NONE		= 0,
    175 	HDMI_PICTURE_ASPECT_4_3			= 1,
    176 	HDMI_PICTURE_ASPECT_16_9		= 2,
    177 	HDMI_PICTURE_ASPECT_64_27		= 3,
    178 	HDMI_PICTURE_ASPECT_256_135		= 4,
    179 	HDMI_PICTURE_ASPECT_RESERVED		= 5,
    180 };
    181 
    182 enum hdmi_quantization_range {
    183 	HDMI_QUANTIZATION_RANGE_DEFAULT		= 0,
    184 	HDMI_QUANTIZATION_RANGE_LIMITED		= 1,
    185 	HDMI_QUANTIZATION_RANGE_FULL		= 2,
    186 };
    187 
    188 enum hdmi_scan_mode {
    189 	HDMI_SCAN_MODE_NONE			= 0,
    190 	HDMI_SCAN_MODE_OVERSCAN			= 1,
    191 	HDMI_SCAN_MODE_UNDERSCAN		= 2,
    192 };
    193 
    194 enum hdmi_ycc_quantization_range {
    195 	HDMI_YCC_QUANTIZATION_RANGE_LIMITED	= 0,
    196 	HDMI_YCC_QUANTIZATION_RANGE_FULL	= 1,
    197 };
    198 
    199 enum hdmi_packet_type {
    200         HDMI_PACKET_TYPE_NULL = 0x00,
    201         HDMI_PACKET_TYPE_AUDIO_CLOCK_REGEN	= 0x01,
    202         HDMI_PACKET_TYPE_AUDIO_SAMPLE		= 0x02,
    203         HDMI_PACKET_TYPE_GENERAL_CONTROL	= 0x03,
    204         HDMI_PACKET_TYPE_ACP			= 0x04,
    205         HDMI_PACKET_TYPE_ISRC1			= 0x05,
    206         HDMI_PACKET_TYPE_ISRC2			= 0x06,
    207         HDMI_PACKET_TYPE_ONE_BIT_AUDIO_SAMPLE	= 0x07,
    208         HDMI_PACKET_TYPE_DST_AUDIO		= 0x08,
    209         HDMI_PACKET_TYPE_HBR_AUDIO_STREAM	= 0x09,
    210         HDMI_PACKET_TYPE_GAMUT_METADATA		= 0x0a,
    211 };
    212 
    213 enum hdmi_infoframe_type {
    214 	HDMI_INFOFRAME_TYPE_VENDOR		= 0x81,
    215 	HDMI_INFOFRAME_TYPE_AVI			= 0x82,
    216 	HDMI_INFOFRAME_TYPE_SPD			= 0x83,
    217 	HDMI_INFOFRAME_TYPE_AUDIO		= 0x84,
    218 	HDMI_INFOFRAME_TYPE_DRM			= 0x87,
    219 };
    220 
    221 enum hdmi_eotf {
    222 	HDMI_EOTF_TRADITIONAL_GAMMA_SDR		= 0,
    223 	HDMI_EOTF_TRADITIONAL_GAMMA_HDR		= 1,
    224 	HDMI_EOTF_SMPTE_ST2084			= 2,
    225 	HDMI_EOTF_BT_2100_HLG			= 3,
    226 };
    227 
    228 enum hdmi_metadata_type {
    229 	HDMI_STATIC_METADATA_TYPE1		= 1,
    230 };
    231 
    232 struct hdmi_type1 {
    233 	enum hdmi_eotf			eotf;
    234 	enum hdmi_metadata_type		metadata_type;
    235 	uint16_t			min_cll;
    236 	uint16_t			max_cll;
    237 	uint16_t			max_fall;
    238 };
    239 
    240 struct hdr_sink_metadata {
    241 	struct hdmi_type1		hdmi_type1;
    242 };
    243 
    244 #define	HDMI_INFOFRAME_SIZE(TYPE)					      \
    245 	(HDMI_INFOFRAME_HEADER_SIZE + HDMI_##TYPE##_INFOFRAME_SIZE)
    246 
    247 #define	HDMI_INFOFRAME_HEADER_SIZE	4
    248 struct hdmi_infoframe_header {
    249 	enum hdmi_infoframe_type	type;
    250 	uint8_t				version;
    251 	uint8_t				length;
    252 	/* checksum */
    253 };
    254 
    255 #define	HDMI_AUDIO_INFOFRAME_SIZE	10
    256 struct hdmi_audio_infoframe {
    257 	struct hdmi_infoframe_header	header;
    258 	uint8_t				channels;
    259 	enum hdmi_audio_coding_type	coding_type;
    260 	enum hdmi_audio_sample_size	sample_size;
    261 	enum hdmi_audio_sample_frequency sample_frequency;
    262 	enum hdmi_audio_coding_type_ext	coding_type_ext;
    263 	uint8_t				channel_allocation;
    264 	uint8_t				level_shift_value;
    265 	bool				downmix_inhibit;
    266 };
    267 
    268 #define	HDMI_AVI_INFOFRAME_SIZE		13
    269 struct hdmi_avi_infoframe {
    270 	struct hdmi_infoframe_header	header;
    271 	enum hdmi_colorspace		colorspace;
    272 	enum hdmi_scan_mode		scan_mode;
    273 	enum hdmi_colorimetry		colorimetry;
    274 	enum hdmi_picture_aspect	picture_aspect;
    275 	enum hdmi_active_aspect		active_aspect;
    276 	bool				itc;
    277 	enum hdmi_extended_colorimetry	extended_colorimetry;
    278 	enum hdmi_quantization_range	quantization_range;
    279 	enum hdmi_nups			nups;
    280 	uint8_t				video_code;
    281 	enum hdmi_ycc_quantization_range ycc_quantization_range;
    282 	enum hdmi_content_type		content_type;
    283 	uint8_t				pixel_repeat;
    284 	uint16_t			top_bar;
    285 	uint16_t			bottom_bar;
    286 	uint16_t			left_bar;
    287 	uint16_t			right_bar;
    288 };
    289 
    290 #define	HDMI_DRM_INFOFRAME_SIZE		26
    291 struct hdmi_drm_infoframe {
    292 	struct hdmi_infoframe_header	header;
    293 	enum hdmi_eotf			eotf;
    294 	enum hdmi_metadata_type		metadata_type;
    295 	struct {
    296 		uint16_t	x, y;
    297 	}				display_primaries[3];
    298 	struct {
    299 		uint16_t	x, y;
    300 	}				white_point;
    301 	uint16_t			max_display_mastering_luminance;
    302 	uint16_t			min_display_mastering_luminance;
    303 	uint16_t			max_cll;
    304 	uint16_t			max_fall;
    305 };
    306 
    307 #define	HDMI_SPD_INFOFRAME_SIZE		25
    308 struct hdmi_spd_infoframe {
    309 	struct hdmi_infoframe_header	header;
    310 	char				vendor[8];
    311 	char				product[16];
    312 	enum hdmi_spd_sdi {
    313 	        HDMI_SPD_SDI_UNKNOWN	= 0,
    314 		HDMI_SPD_SDI_DSTB	= 1,
    315 		HDMI_SPD_SDI_DVDP	= 2,
    316 		HDMI_SPD_SDI_DVHS	= 3,
    317 		HDMI_SPD_SDI_HDDVR	= 4,
    318 		HDMI_SPD_SDI_DVC	= 5,
    319 		HDMI_SPD_SDI_DSC	= 6,
    320 		HDMI_SPD_SDI_VCD	= 7,
    321 		HDMI_SPD_SDI_GAME	= 8,
    322 		HDMI_SPD_SDI_PC		= 9,
    323 		HDMI_SPD_SDI_BD		= 10,
    324 		HDMI_SPD_SDI_SACD	= 11,
    325 		HDMI_SPD_SDI_HDDVD	= 12,
    326 		HDMI_SPD_SDI_PMP	= 13,
    327 	}				sdi;
    328 };
    329 
    330 #define	HDMI_IEEE_OUI		0x000c03
    331 #define	HDMI_FORUM_IEEE_OUI	0xc45dd8
    332 
    333 struct hdmi_vendor_infoframe {
    334 	struct hdmi_infoframe_header	header;
    335 	uint32_t			oui;
    336 	uint8_t				vic;
    337 	enum hdmi_3d_structure		s3d_struct;
    338 	unsigned			s3d_ext_data;
    339 };
    340 
    341 union hdmi_vendor_any_infoframe {
    342 	struct {
    343 		struct hdmi_infoframe_header	header;
    344 		uint32_t			oui;
    345 	}				any;
    346 	struct hdmi_vendor_infoframe	hdmi;
    347 };
    348 
    349 union hdmi_infoframe {
    350 	struct hdmi_infoframe_header	any;
    351 	struct hdmi_avi_infoframe	avi;
    352 	struct hdmi_drm_infoframe	drm;
    353 	struct hdmi_spd_infoframe	spd;
    354 	union hdmi_vendor_any_infoframe	vendor;
    355 };
    356 
    357 int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe *);
    358 ssize_t hdmi_audio_infoframe_pack(const struct hdmi_audio_infoframe *, void *,
    359     size_t);
    360 int hdmi_audio_infoframe_unpack(struct hdmi_audio_infoframe *, const void *,
    361     size_t);
    362 
    363 int hdmi_avi_infoframe_init(struct hdmi_avi_infoframe *);
    364 int hdmi_avi_infoframe_check(const struct hdmi_avi_infoframe *);
    365 ssize_t hdmi_avi_infoframe_pack(const struct hdmi_avi_infoframe *, void *,
    366     size_t);
    367 int hdmi_avi_infoframe_unpack(struct hdmi_avi_infoframe *, const void *,
    368     size_t);
    369 
    370 int hdmi_drm_infoframe_init(struct hdmi_drm_infoframe *);
    371 int hdmi_drm_infoframe_check(const struct hdmi_drm_infoframe *);
    372 int hdmi_drm_infoframe_pack(const struct hdmi_drm_infoframe *, void *, size_t);
    373 int hdmi_drm_infoframe_pack_only(const struct hdmi_drm_infoframe *, void *,
    374     size_t);
    375 int hdmi_drm_infoframe_unpack(struct hdmi_drm_infoframe *, const void *,
    376     size_t);
    377 
    378 int hdmi_spd_infoframe_init(struct hdmi_spd_infoframe *, const char *,
    379     const char *);
    380 int hdmi_spd_infoframe_check(const struct hdmi_spd_infoframe *);
    381 ssize_t hdmi_spd_infoframe_pack(const struct hdmi_spd_infoframe *, void *,
    382     size_t);
    383 int hdmi_spd_infoframe_unpack(struct hdmi_spd_infoframe *, const void *,
    384     size_t);
    385 
    386 int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *);
    387 size_t hdmi_vendor_infoframe_length(const struct hdmi_vendor_infoframe *);
    388 int hdmi_vendor_infoframe_check(const struct hdmi_vendor_infoframe *);
    389 int hdmi_vendor_infoframe_pack(const struct hdmi_vendor_infoframe *, void *,
    390     size_t);
    391 int hdmi_vendor_infoframe_unpack(struct hdmi_vendor_infoframe *, const void *,
    392     size_t);
    393 
    394 ssize_t hdmi_infoframe_pack(const union hdmi_infoframe *, void *, size_t);
    395 ssize_t hdmi_infoframe_pack_only(const union hdmi_infoframe *, void *, size_t);
    396 int hdmi_infoframe_unpack(union hdmi_infoframe *, const void *, size_t);
    397 void hdmi_infoframe_log(const char *, struct device *,
    398     const union hdmi_infoframe *);
    399 
    400 #endif	/* _LINUX_HDMI_H_ */
    401