xref: /dragonfly/sys/dev/drm/include/linux/hdmi.h (revision 3f2dd94a)
128ba7809SMichael Neumann /*
228ba7809SMichael Neumann  * Copyright (C) 2012 Avionic Design GmbH
328ba7809SMichael Neumann  *
428ba7809SMichael Neumann  * Permission is hereby granted, free of charge, to any person obtaining a
528ba7809SMichael Neumann  * copy of this software and associated documentation files (the "Software"),
628ba7809SMichael Neumann  * to deal in the Software without restriction, including without limitation
728ba7809SMichael Neumann  * the rights to use, copy, modify, merge, publish, distribute, sub license,
828ba7809SMichael Neumann  * and/or sell copies of the Software, and to permit persons to whom the
928ba7809SMichael Neumann  * Software is furnished to do so, subject to the following conditions:
1028ba7809SMichael Neumann  *
1128ba7809SMichael Neumann  * The above copyright notice and this permission notice (including the
1228ba7809SMichael Neumann  * next paragraph) shall be included in all copies or substantial portions
1328ba7809SMichael Neumann  * of the Software.
1428ba7809SMichael Neumann  *
1528ba7809SMichael Neumann  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1628ba7809SMichael Neumann  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1728ba7809SMichael Neumann  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
1828ba7809SMichael Neumann  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1928ba7809SMichael Neumann  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2028ba7809SMichael Neumann  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2128ba7809SMichael Neumann  * DEALINGS IN THE SOFTWARE.
2228ba7809SMichael Neumann  */
2328ba7809SMichael Neumann 
2428ba7809SMichael Neumann #ifndef __LINUX_HDMI_H_
2528ba7809SMichael Neumann #define __LINUX_HDMI_H_
2628ba7809SMichael Neumann 
2728ba7809SMichael Neumann #include <linux/types.h>
2828ba7809SMichael Neumann #include <linux/device.h>
2928ba7809SMichael Neumann 
3028ba7809SMichael Neumann enum hdmi_infoframe_type {
3128ba7809SMichael Neumann 	HDMI_INFOFRAME_TYPE_VENDOR = 0x81,
3228ba7809SMichael Neumann 	HDMI_INFOFRAME_TYPE_AVI = 0x82,
3328ba7809SMichael Neumann 	HDMI_INFOFRAME_TYPE_SPD = 0x83,
3428ba7809SMichael Neumann 	HDMI_INFOFRAME_TYPE_AUDIO = 0x84,
3528ba7809SMichael Neumann };
3628ba7809SMichael Neumann 
3728ba7809SMichael Neumann #define HDMI_IEEE_OUI 0x000c03
38a85cb24fSFrançois Tigeot #define HDMI_FORUM_IEEE_OUI 0xc45dd8
3928ba7809SMichael Neumann #define HDMI_INFOFRAME_HEADER_SIZE  4
4028ba7809SMichael Neumann #define HDMI_AVI_INFOFRAME_SIZE    13
4128ba7809SMichael Neumann #define HDMI_SPD_INFOFRAME_SIZE    25
4228ba7809SMichael Neumann #define HDMI_AUDIO_INFOFRAME_SIZE  10
4328ba7809SMichael Neumann 
4428ba7809SMichael Neumann #define HDMI_INFOFRAME_SIZE(type)	\
4528ba7809SMichael Neumann 	(HDMI_INFOFRAME_HEADER_SIZE + HDMI_ ## type ## _INFOFRAME_SIZE)
4628ba7809SMichael Neumann 
4728ba7809SMichael Neumann struct hdmi_any_infoframe {
4828ba7809SMichael Neumann 	enum hdmi_infoframe_type type;
4928ba7809SMichael Neumann 	unsigned char version;
5028ba7809SMichael Neumann 	unsigned char length;
5128ba7809SMichael Neumann };
5228ba7809SMichael Neumann 
5328ba7809SMichael Neumann enum hdmi_colorspace {
5428ba7809SMichael Neumann 	HDMI_COLORSPACE_RGB,
5528ba7809SMichael Neumann 	HDMI_COLORSPACE_YUV422,
5628ba7809SMichael Neumann 	HDMI_COLORSPACE_YUV444,
5728ba7809SMichael Neumann 	HDMI_COLORSPACE_YUV420,
5828ba7809SMichael Neumann 	HDMI_COLORSPACE_RESERVED4,
5928ba7809SMichael Neumann 	HDMI_COLORSPACE_RESERVED5,
6028ba7809SMichael Neumann 	HDMI_COLORSPACE_RESERVED6,
6128ba7809SMichael Neumann 	HDMI_COLORSPACE_IDO_DEFINED,
6228ba7809SMichael Neumann };
6328ba7809SMichael Neumann 
6428ba7809SMichael Neumann enum hdmi_scan_mode {
6528ba7809SMichael Neumann 	HDMI_SCAN_MODE_NONE,
6628ba7809SMichael Neumann 	HDMI_SCAN_MODE_OVERSCAN,
6728ba7809SMichael Neumann 	HDMI_SCAN_MODE_UNDERSCAN,
6828ba7809SMichael Neumann 	HDMI_SCAN_MODE_RESERVED,
6928ba7809SMichael Neumann };
7028ba7809SMichael Neumann 
7128ba7809SMichael Neumann enum hdmi_colorimetry {
7228ba7809SMichael Neumann 	HDMI_COLORIMETRY_NONE,
7328ba7809SMichael Neumann 	HDMI_COLORIMETRY_ITU_601,
7428ba7809SMichael Neumann 	HDMI_COLORIMETRY_ITU_709,
7528ba7809SMichael Neumann 	HDMI_COLORIMETRY_EXTENDED,
7628ba7809SMichael Neumann };
7728ba7809SMichael Neumann 
7828ba7809SMichael Neumann enum hdmi_picture_aspect {
7928ba7809SMichael Neumann 	HDMI_PICTURE_ASPECT_NONE,
8028ba7809SMichael Neumann 	HDMI_PICTURE_ASPECT_4_3,
8128ba7809SMichael Neumann 	HDMI_PICTURE_ASPECT_16_9,
82*3f2dd94aSFrançois Tigeot 	HDMI_PICTURE_ASPECT_64_27,
83*3f2dd94aSFrançois Tigeot 	HDMI_PICTURE_ASPECT_256_135,
8428ba7809SMichael Neumann 	HDMI_PICTURE_ASPECT_RESERVED,
8528ba7809SMichael Neumann };
8628ba7809SMichael Neumann 
8728ba7809SMichael Neumann enum hdmi_active_aspect {
8828ba7809SMichael Neumann 	HDMI_ACTIVE_ASPECT_16_9_TOP = 2,
8928ba7809SMichael Neumann 	HDMI_ACTIVE_ASPECT_14_9_TOP = 3,
9028ba7809SMichael Neumann 	HDMI_ACTIVE_ASPECT_16_9_CENTER = 4,
9128ba7809SMichael Neumann 	HDMI_ACTIVE_ASPECT_PICTURE = 8,
9228ba7809SMichael Neumann 	HDMI_ACTIVE_ASPECT_4_3 = 9,
9328ba7809SMichael Neumann 	HDMI_ACTIVE_ASPECT_16_9 = 10,
9428ba7809SMichael Neumann 	HDMI_ACTIVE_ASPECT_14_9 = 11,
9528ba7809SMichael Neumann 	HDMI_ACTIVE_ASPECT_4_3_SP_14_9 = 13,
9628ba7809SMichael Neumann 	HDMI_ACTIVE_ASPECT_16_9_SP_14_9 = 14,
9728ba7809SMichael Neumann 	HDMI_ACTIVE_ASPECT_16_9_SP_4_3 = 15,
9828ba7809SMichael Neumann };
9928ba7809SMichael Neumann 
10028ba7809SMichael Neumann enum hdmi_extended_colorimetry {
10128ba7809SMichael Neumann 	HDMI_EXTENDED_COLORIMETRY_XV_YCC_601,
10228ba7809SMichael Neumann 	HDMI_EXTENDED_COLORIMETRY_XV_YCC_709,
10328ba7809SMichael Neumann 	HDMI_EXTENDED_COLORIMETRY_S_YCC_601,
10428ba7809SMichael Neumann 	HDMI_EXTENDED_COLORIMETRY_ADOBE_YCC_601,
10528ba7809SMichael Neumann 	HDMI_EXTENDED_COLORIMETRY_ADOBE_RGB,
10628ba7809SMichael Neumann 
10728ba7809SMichael Neumann 	/* The following EC values are only defined in CEA-861-F. */
10828ba7809SMichael Neumann 	HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM,
10928ba7809SMichael Neumann 	HDMI_EXTENDED_COLORIMETRY_BT2020,
11028ba7809SMichael Neumann 	HDMI_EXTENDED_COLORIMETRY_RESERVED,
11128ba7809SMichael Neumann };
11228ba7809SMichael Neumann 
11328ba7809SMichael Neumann enum hdmi_quantization_range {
11428ba7809SMichael Neumann 	HDMI_QUANTIZATION_RANGE_DEFAULT,
11528ba7809SMichael Neumann 	HDMI_QUANTIZATION_RANGE_LIMITED,
11628ba7809SMichael Neumann 	HDMI_QUANTIZATION_RANGE_FULL,
11728ba7809SMichael Neumann 	HDMI_QUANTIZATION_RANGE_RESERVED,
11828ba7809SMichael Neumann };
11928ba7809SMichael Neumann 
12028ba7809SMichael Neumann /* non-uniform picture scaling */
12128ba7809SMichael Neumann enum hdmi_nups {
12228ba7809SMichael Neumann 	HDMI_NUPS_UNKNOWN,
12328ba7809SMichael Neumann 	HDMI_NUPS_HORIZONTAL,
12428ba7809SMichael Neumann 	HDMI_NUPS_VERTICAL,
12528ba7809SMichael Neumann 	HDMI_NUPS_BOTH,
12628ba7809SMichael Neumann };
12728ba7809SMichael Neumann 
12828ba7809SMichael Neumann enum hdmi_ycc_quantization_range {
12928ba7809SMichael Neumann 	HDMI_YCC_QUANTIZATION_RANGE_LIMITED,
13028ba7809SMichael Neumann 	HDMI_YCC_QUANTIZATION_RANGE_FULL,
13128ba7809SMichael Neumann };
13228ba7809SMichael Neumann 
13328ba7809SMichael Neumann enum hdmi_content_type {
13428ba7809SMichael Neumann 	HDMI_CONTENT_TYPE_GRAPHICS,
13528ba7809SMichael Neumann 	HDMI_CONTENT_TYPE_PHOTO,
13628ba7809SMichael Neumann 	HDMI_CONTENT_TYPE_CINEMA,
13728ba7809SMichael Neumann 	HDMI_CONTENT_TYPE_GAME,
13828ba7809SMichael Neumann };
13928ba7809SMichael Neumann 
14028ba7809SMichael Neumann struct hdmi_avi_infoframe {
14128ba7809SMichael Neumann 	enum hdmi_infoframe_type type;
14228ba7809SMichael Neumann 	unsigned char version;
14328ba7809SMichael Neumann 	unsigned char length;
14428ba7809SMichael Neumann 	enum hdmi_colorspace colorspace;
14528ba7809SMichael Neumann 	enum hdmi_scan_mode scan_mode;
14628ba7809SMichael Neumann 	enum hdmi_colorimetry colorimetry;
14728ba7809SMichael Neumann 	enum hdmi_picture_aspect picture_aspect;
14828ba7809SMichael Neumann 	enum hdmi_active_aspect active_aspect;
14928ba7809SMichael Neumann 	bool itc;
15028ba7809SMichael Neumann 	enum hdmi_extended_colorimetry extended_colorimetry;
15128ba7809SMichael Neumann 	enum hdmi_quantization_range quantization_range;
15228ba7809SMichael Neumann 	enum hdmi_nups nups;
15328ba7809SMichael Neumann 	unsigned char video_code;
15428ba7809SMichael Neumann 	enum hdmi_ycc_quantization_range ycc_quantization_range;
15528ba7809SMichael Neumann 	enum hdmi_content_type content_type;
15628ba7809SMichael Neumann 	unsigned char pixel_repeat;
15728ba7809SMichael Neumann 	unsigned short top_bar;
15828ba7809SMichael Neumann 	unsigned short bottom_bar;
15928ba7809SMichael Neumann 	unsigned short left_bar;
16028ba7809SMichael Neumann 	unsigned short right_bar;
16128ba7809SMichael Neumann };
16228ba7809SMichael Neumann 
16328ba7809SMichael Neumann int hdmi_avi_infoframe_init(struct hdmi_avi_infoframe *frame);
16428ba7809SMichael Neumann ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe *frame, void *buffer,
16528ba7809SMichael Neumann 				size_t size);
16628ba7809SMichael Neumann 
16728ba7809SMichael Neumann enum hdmi_spd_sdi {
16828ba7809SMichael Neumann 	HDMI_SPD_SDI_UNKNOWN,
16928ba7809SMichael Neumann 	HDMI_SPD_SDI_DSTB,
17028ba7809SMichael Neumann 	HDMI_SPD_SDI_DVDP,
17128ba7809SMichael Neumann 	HDMI_SPD_SDI_DVHS,
17228ba7809SMichael Neumann 	HDMI_SPD_SDI_HDDVR,
17328ba7809SMichael Neumann 	HDMI_SPD_SDI_DVC,
17428ba7809SMichael Neumann 	HDMI_SPD_SDI_DSC,
17528ba7809SMichael Neumann 	HDMI_SPD_SDI_VCD,
17628ba7809SMichael Neumann 	HDMI_SPD_SDI_GAME,
17728ba7809SMichael Neumann 	HDMI_SPD_SDI_PC,
17828ba7809SMichael Neumann 	HDMI_SPD_SDI_BD,
17928ba7809SMichael Neumann 	HDMI_SPD_SDI_SACD,
18028ba7809SMichael Neumann 	HDMI_SPD_SDI_HDDVD,
18128ba7809SMichael Neumann 	HDMI_SPD_SDI_PMP,
18228ba7809SMichael Neumann };
18328ba7809SMichael Neumann 
18428ba7809SMichael Neumann struct hdmi_spd_infoframe {
18528ba7809SMichael Neumann 	enum hdmi_infoframe_type type;
18628ba7809SMichael Neumann 	unsigned char version;
18728ba7809SMichael Neumann 	unsigned char length;
18828ba7809SMichael Neumann 	char vendor[8];
18928ba7809SMichael Neumann 	char product[16];
19028ba7809SMichael Neumann 	enum hdmi_spd_sdi sdi;
19128ba7809SMichael Neumann };
19228ba7809SMichael Neumann 
19328ba7809SMichael Neumann int hdmi_spd_infoframe_init(struct hdmi_spd_infoframe *frame,
19428ba7809SMichael Neumann 			    const char *vendor, const char *product);
19528ba7809SMichael Neumann ssize_t hdmi_spd_infoframe_pack(struct hdmi_spd_infoframe *frame, void *buffer,
19628ba7809SMichael Neumann 				size_t size);
19728ba7809SMichael Neumann 
19828ba7809SMichael Neumann enum hdmi_audio_coding_type {
19928ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_STREAM,
20028ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_PCM,
20128ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_AC3,
20228ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_MPEG1,
20328ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_MP3,
20428ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_MPEG2,
20528ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_AAC_LC,
20628ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_DTS,
20728ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_ATRAC,
20828ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_DSD,
20928ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_EAC3,
21028ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_DTS_HD,
21128ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_MLP,
21228ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_DST,
21328ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_WMA_PRO,
21428ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_CXT,
21528ba7809SMichael Neumann };
21628ba7809SMichael Neumann 
21728ba7809SMichael Neumann enum hdmi_audio_sample_size {
21828ba7809SMichael Neumann 	HDMI_AUDIO_SAMPLE_SIZE_STREAM,
21928ba7809SMichael Neumann 	HDMI_AUDIO_SAMPLE_SIZE_16,
22028ba7809SMichael Neumann 	HDMI_AUDIO_SAMPLE_SIZE_20,
22128ba7809SMichael Neumann 	HDMI_AUDIO_SAMPLE_SIZE_24,
22228ba7809SMichael Neumann };
22328ba7809SMichael Neumann 
22428ba7809SMichael Neumann enum hdmi_audio_sample_frequency {
22528ba7809SMichael Neumann 	HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM,
22628ba7809SMichael Neumann 	HDMI_AUDIO_SAMPLE_FREQUENCY_32000,
22728ba7809SMichael Neumann 	HDMI_AUDIO_SAMPLE_FREQUENCY_44100,
22828ba7809SMichael Neumann 	HDMI_AUDIO_SAMPLE_FREQUENCY_48000,
22928ba7809SMichael Neumann 	HDMI_AUDIO_SAMPLE_FREQUENCY_88200,
23028ba7809SMichael Neumann 	HDMI_AUDIO_SAMPLE_FREQUENCY_96000,
23128ba7809SMichael Neumann 	HDMI_AUDIO_SAMPLE_FREQUENCY_176400,
23228ba7809SMichael Neumann 	HDMI_AUDIO_SAMPLE_FREQUENCY_192000,
23328ba7809SMichael Neumann };
23428ba7809SMichael Neumann 
23528ba7809SMichael Neumann enum hdmi_audio_coding_type_ext {
23628ba7809SMichael Neumann 	/* Refer to Audio Coding Type (CT) field in Data Byte 1 */
23728ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_EXT_CT,
23828ba7809SMichael Neumann 
23928ba7809SMichael Neumann 	/*
24028ba7809SMichael Neumann 	 * The next three CXT values are defined in CEA-861-E only.
24128ba7809SMichael Neumann 	 * They do not exist in older versions, and in CEA-861-F they are
24228ba7809SMichael Neumann 	 * defined as 'Not in use'.
24328ba7809SMichael Neumann 	 */
24428ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC,
24528ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2,
24628ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND,
24728ba7809SMichael Neumann 
24828ba7809SMichael Neumann 	/* The following CXT values are only defined in CEA-861-F. */
24928ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC,
25028ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_V2,
25128ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC,
25228ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_EXT_DRA,
25328ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_SURROUND,
25428ba7809SMichael Neumann 	HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC_SURROUND = 10,
25528ba7809SMichael Neumann };
25628ba7809SMichael Neumann 
25728ba7809SMichael Neumann struct hdmi_audio_infoframe {
25828ba7809SMichael Neumann 	enum hdmi_infoframe_type type;
25928ba7809SMichael Neumann 	unsigned char version;
26028ba7809SMichael Neumann 	unsigned char length;
26128ba7809SMichael Neumann 	unsigned char channels;
26228ba7809SMichael Neumann 	enum hdmi_audio_coding_type coding_type;
26328ba7809SMichael Neumann 	enum hdmi_audio_sample_size sample_size;
26428ba7809SMichael Neumann 	enum hdmi_audio_sample_frequency sample_frequency;
26528ba7809SMichael Neumann 	enum hdmi_audio_coding_type_ext coding_type_ext;
26628ba7809SMichael Neumann 	unsigned char channel_allocation;
26728ba7809SMichael Neumann 	unsigned char level_shift_value;
26828ba7809SMichael Neumann 	bool downmix_inhibit;
26928ba7809SMichael Neumann 
27028ba7809SMichael Neumann };
27128ba7809SMichael Neumann 
27228ba7809SMichael Neumann int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe *frame);
27328ba7809SMichael Neumann ssize_t hdmi_audio_infoframe_pack(struct hdmi_audio_infoframe *frame,
27428ba7809SMichael Neumann 				  void *buffer, size_t size);
27528ba7809SMichael Neumann 
27628ba7809SMichael Neumann enum hdmi_3d_structure {
27728ba7809SMichael Neumann 	HDMI_3D_STRUCTURE_INVALID = -1,
27828ba7809SMichael Neumann 	HDMI_3D_STRUCTURE_FRAME_PACKING = 0,
27928ba7809SMichael Neumann 	HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE,
28028ba7809SMichael Neumann 	HDMI_3D_STRUCTURE_LINE_ALTERNATIVE,
28128ba7809SMichael Neumann 	HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL,
28228ba7809SMichael Neumann 	HDMI_3D_STRUCTURE_L_DEPTH,
28328ba7809SMichael Neumann 	HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH,
28428ba7809SMichael Neumann 	HDMI_3D_STRUCTURE_TOP_AND_BOTTOM,
28528ba7809SMichael Neumann 	HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF = 8,
28628ba7809SMichael Neumann };
28728ba7809SMichael Neumann 
28828ba7809SMichael Neumann 
28928ba7809SMichael Neumann struct hdmi_vendor_infoframe {
29028ba7809SMichael Neumann 	enum hdmi_infoframe_type type;
29128ba7809SMichael Neumann 	unsigned char version;
29228ba7809SMichael Neumann 	unsigned char length;
29328ba7809SMichael Neumann 	unsigned int oui;
29428ba7809SMichael Neumann 	u8 vic;
29528ba7809SMichael Neumann 	enum hdmi_3d_structure s3d_struct;
29628ba7809SMichael Neumann 	unsigned int s3d_ext_data;
29728ba7809SMichael Neumann };
29828ba7809SMichael Neumann 
29928ba7809SMichael Neumann int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *frame);
30028ba7809SMichael Neumann ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
30128ba7809SMichael Neumann 				   void *buffer, size_t size);
30228ba7809SMichael Neumann 
30328ba7809SMichael Neumann union hdmi_vendor_any_infoframe {
30428ba7809SMichael Neumann 	struct {
30528ba7809SMichael Neumann 		enum hdmi_infoframe_type type;
30628ba7809SMichael Neumann 		unsigned char version;
30728ba7809SMichael Neumann 		unsigned char length;
30828ba7809SMichael Neumann 		unsigned int oui;
30928ba7809SMichael Neumann 	} any;
31028ba7809SMichael Neumann 	struct hdmi_vendor_infoframe hdmi;
31128ba7809SMichael Neumann };
31228ba7809SMichael Neumann 
31328ba7809SMichael Neumann /**
31428ba7809SMichael Neumann  * union hdmi_infoframe - overall union of all abstract infoframe representations
31528ba7809SMichael Neumann  * @any: generic infoframe
31628ba7809SMichael Neumann  * @avi: avi infoframe
31728ba7809SMichael Neumann  * @spd: spd infoframe
31828ba7809SMichael Neumann  * @vendor: union of all vendor infoframes
31928ba7809SMichael Neumann  * @audio: audio infoframe
32028ba7809SMichael Neumann  *
32128ba7809SMichael Neumann  * This is used by the generic pack function. This works since all infoframes
32228ba7809SMichael Neumann  * have the same header which also indicates which type of infoframe should be
32328ba7809SMichael Neumann  * packed.
32428ba7809SMichael Neumann  */
32528ba7809SMichael Neumann union hdmi_infoframe {
32628ba7809SMichael Neumann 	struct hdmi_any_infoframe any;
32728ba7809SMichael Neumann 	struct hdmi_avi_infoframe avi;
32828ba7809SMichael Neumann 	struct hdmi_spd_infoframe spd;
32928ba7809SMichael Neumann 	union hdmi_vendor_any_infoframe vendor;
33028ba7809SMichael Neumann 	struct hdmi_audio_infoframe audio;
33128ba7809SMichael Neumann };
33228ba7809SMichael Neumann 
33328ba7809SMichael Neumann ssize_t
33428ba7809SMichael Neumann hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer, size_t size);
33528ba7809SMichael Neumann int hdmi_infoframe_unpack(union hdmi_infoframe *frame, void *buffer);
33628ba7809SMichael Neumann void hdmi_infoframe_log(const char *level, struct device *dev,
33728ba7809SMichael Neumann 			union hdmi_infoframe *frame);
33828ba7809SMichael Neumann 
33928ba7809SMichael Neumann #endif /* _DRM_HDMI_H */
340