xref: /netbsd-src/sys/external/bsd/drm2/include/linux/hdmi.h (revision c75208569149990bf32fcaec644c7d5c51b44795)
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