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