Home | History | Annotate | Line # | Download | only in linux
      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